# Copyright (C) 2023 Apple, Inc. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # The 22.1.1 tarball contains an empty sources/freetype directory, which confuses the default CurlDownloadStrategy. # A custom strategy also allows us to restrict extraction to just the wine subdirectory. class TarballDownloadStrategy < CurlDownloadStrategy def stage(&block) ohai "Staging #{cached_location} in #{pwd}" system "tar", "-xf", cached_location, "--include=sources/wine/*", "--strip-components=1" yield if block_given? end end class GamePortingToolkit < Formula version "1.1" desc "Apple Game Porting Toolkit" homepage "https://developer.apple.com/" url "https://media.codeweavers.com/pub/crossover/source/crossover-sources-22.1.1.tar.gz", using: TarballDownloadStrategy sha256 "cdfe282ce33788bd4f969c8bfb1d3e2de060eb6c296fa1c3cdf4e4690b8b1831" patch :p0, :DATA depends_on arch: :x86_64 depends_on "game-porting-toolkit-compiler" depends_on "bison" => :build uses_from_macos "flex" => :build depends_on "mingw-w64" => :build depends_on "gstreamer" depends_on "pkg-config" # to find the rest of the runtime dependencies @@named_deps = ["zlib", # must be explicitly added to PKG_CONFIG_PATH "freetype", "sdl2", "libgphoto2", "faudio", "jpeg", "libpng", "mpg123", "libtiff", "libgsm", "glib", "gnutls", "libusb", "gettext", "openssl@1.1", "sane-backends"] @@named_deps.each do |dep| depends_on dep end def install # Bypass the Homebrew shims to build native binaries with the dedicated compiler. # (PE binaries will be built with mingw32-gcc.) compiler = Formula["game-porting-toolkit-compiler"] compiler_options = ["CC=#{compiler.bin}/clang", "CXX=#{compiler.bin}/clang++"] # Becuase we are bypassing the Homebrew shims, we need to make the dependencies’ headers visible. # (mingw32-gcc will automatically make the mingw-w64 headers visible.) @@named_deps.each do |dep| formula = Formula[dep] ENV.append_to_cflags "-I#{formula.include}" ENV.append "LDFLAGS", "-L#{formula.lib}" end # Glib & GStreamer have also has a non-standard include path ENV.append "GSTREAMER_CFLAGS", "-I#{Formula['gstreamer'].include}/gstreamer-1.0" ENV.append "GSTREAMER_LIBS", "-L#{Formula['gstreamer'].lib}" ENV.append "GSTREAMER_CFLAGS", "-I#{Formula['glib'].include}/glib-2.0" ENV.append "GSTREAMER_CFLAGS", "-I#{Formula['glib'].lib}/glib-2.0/include" ENV.append "GSTREAMER_LIBS", "-lglib-2.0 -lgmodule-2.0 -lgstreamer-1.0 -lgstaudio-1.0 -lgstvideo-1.0 -lgstgl-1.0 -lgobject-2.0" # We also need to tell the linker to add Homebrew to the rpath stack. ENV.append "LDFLAGS", "-lSystem -L#{HOMEBREW_PREFIX}/lib -Wl,-rpath,#{HOMEBREW_PREFIX}/lib -Wl,-rpath,@executable_path/../lib/external" # Common compiler flags for both Mach-O and PE binaries. ENV.append_to_cflags "-O3 -Wno-implicit-function-declaration -Wno-format -Wno-deprecated-declarations -Wno-incompatible-pointer-types" # Use an older deployment target to avoid new dyld behaviors. # The custom compiler is too old to accept "13.0", so we use "10.14". ENV["MACOSX_DEPLOYMENT_TARGET"] = "10.14" wine_configure_options = ["--prefix=#{prefix}", "--disable-win16", "--disable-tests", "--without-x", "--without-pulse", "--without-dbus", "--without-inotify", "--without-alsa", "--without-capi", "--without-oss", "--without-udev", "--without-krb5"] wine64_configure_options = ["--enable-win64", "--with-gnutls", "--with-freetype", "--with-gstreamer"] wine32_configure_options = ["--enable-win32on64", "--with-wine64=../wine64-build", "--without-gstreamer", "--without-gphoto", "--without-sane", "--without-krb5", "--disable-winedbg", "--without-vulkan", "--disable-vulkan_1", "--disable-winevulkan", "--without-openal", "--without-unwind", "--without-usb"] # Build 64-bit Wine first. mkdir buildpath/"wine64-build" do system buildpath/"wine/configure", *wine_configure_options, *wine64_configure_options, *compiler_options system "make" end # Now build 32-on-64 Wine. mkdir buildpath/"wine32-build" do system buildpath/"wine/configure", *wine_configure_options, *wine32_configure_options, *compiler_options system "make" end # Install both builds. cd "wine64-build" do system "make", "install" end cd "wine32-build" do system "make", "install" end end def post_install #Homebrew replaces wine's rpath names with absolute paths, we need to change them back to @rpath relative paths. #Wine relies on @rpath names to cause dlopen to always return the first dylib with that name loaded into the process rather than the actual dylib found using rpath lookup. Dir["#{lib}/wine/{x86_64-unix,x86_32on64-unix}/*.so"].each do |dylib| chmod 0664, dylib MachO::Tools.change_dylib_id(dylib, "@rpath/#{File.basename(dylib)}") MachO.codesign!(dylib) chmod 0444, dylib end end def caveats return unless latest_version_installed? "Please follow the instructions in the Game Porting Toolkit README to complete installation." end test do system bin/"wine64", "--version" end end __END__ diff --git a/include/distversion.h b/include/distversion.h new file mode 100644 index 00000000000..b8a3724b76b --- /dev/null +++ wine/include/distversion.h @@ -0,0 +1,12 @@ +/* --------------------------------------------------------------- +* distversion.c +* +* Copyright 2013, CodeWeavers, Inc. +* +* Information from DISTVERSION which needs to find +* its way into the wine tree. +* --------------------------------------------------------------- */ + +#define WINDEBUG_WHAT_HAPPENED_MESSAGE "This can be caused by a problem in the program or a deficiency in Wine. You may want to check http://www.codeweavers.com/compatibility/ for tips about running this application." + +#define WINDEBUG_USER_SUGGESTION_MESSAGE "If this problem is not present under Windows and has not been reported yet, you can save the detailed information to a file using the \"Save As\" button, then file a bug report and attach that file to the report." \ No newline at end of file -- 2.39.2 (Apple Git-144) diff --git a/configure b/configure index 2d57c7e085d..b9b57c0d509 100755 --- wine/configure +++ wine/configure @@ -950,6 +950,7 @@ enable_amstream enable_apisetschema enable_apphelp enable_appwiz_cpl +enable_api_ms_win_power_base_l1_1_0 enable_atl enable_atl100 enable_atl110 @@ -21776,6 +21777,7 @@ wine_fn_config_makefile dlls/apisetschema enable_apisetschema wine_fn_config_makefile dlls/apphelp enable_apphelp wine_fn_config_makefile dlls/apphelp/tests enable_tests wine_fn_config_makefile dlls/appwiz.cpl enable_appwiz_cpl +wine_fn_config_makefile dlls/api-ms-win-power-base-l1-1-0 enable_api_ms_win_power_base_l1_1_0 wine_fn_config_makefile dlls/atl enable_atl wine_fn_config_makefile dlls/atl/tests enable_tests wine_fn_config_makefile dlls/atl100 enable_atl100 diff --git a/configure.ac b/configure.ac diff --git a/configure.ac b/configure.ac index 50c50d15eda..58063421cce 100644 --- wine/configure.ac +++ wine/configure.ac @@ -2424,6 +2424,7 @@ WINE_CONFIG_MAKEFILE(dlls/apisetschema) WINE_CONFIG_MAKEFILE(dlls/apphelp) WINE_CONFIG_MAKEFILE(dlls/apphelp/tests) WINE_CONFIG_MAKEFILE(dlls/appwiz.cpl) +WINE_CONFIG_MAKEFILE(dlls/api-ms-win-power-base-l1-1-0) WINE_CONFIG_MAKEFILE(dlls/atl) WINE_CONFIG_MAKEFILE(dlls/atl/tests) WINE_CONFIG_MAKEFILE(dlls/atl100) diff --git a/dlls/api-ms-win-power-base-l1-1-0/Makefile.in b/dlls/api-ms-win-power-base-l1-1-0/Makefile.in new file mode 100644 index 00000000000..8b26d4be82f --- /dev/null +++ wine/dlls/api-ms-win-power-base-l1-1-0/Makefile.in @@ -0,0 +1 @@ +MODULE = api-ms-win-power-base-l1-1-0.dll diff --git a/dlls/api-ms-win-power-base-l1-1-0/api-ms-win-power-base-l1-1-0.spec b/dlls/api-ms-win-power-base-l1-1-0/api-ms-win-power-base-l1-1-0.spec new file mode 100644 index 00000000000..dd056946ac6 --- /dev/null +++ wine/dlls/api-ms-win-power-base-l1-1-0/api-ms-win-power-base-l1-1-0.spec @@ -0,0 +1,5 @@ +@ stdcall CallNtPowerInformation(long ptr long ptr long) powrprof.CallNtPowerInformation +@ stdcall GetPwrCapabilities(ptr) powrprof.GetPwrCapabilities +@ stdcall PowerDeterminePlatformRoleEx(long) powrprof.PowerDeterminePlatformRoleEx +@ stdcall PowerRegisterSuspendResumeNotification(long ptr ptr) powrprof.PowerRegisterSuspendResumeNotification +@ stub PowerUnregisterSuspendResumeNotification diff --git a/tools/make_specfiles b/tools/make_specfiles index 3c4c40544b8..cdaf0ccf209 100755 --- wine/tools/make_specfiles +++ wine/tools/make_specfiles @@ -139,6 +139,11 @@ my @dll_groups = "sppc", "slc", ], + [ + "ntdll", + "powrprof", + "api-ms-win-power-base-l1-1-0", + ] ); my $update_flags = 0; -- 2.39.2 (Apple Git-144) diff --git a/configure b/configure index b9b57c0d509..24f958073a0 100755 --- wine/configure +++ wine/configure @@ -950,6 +950,7 @@ enable_amstream enable_apisetschema enable_apphelp enable_appwiz_cpl +enable_api_ms_win_core_psm_appnotify_l1_1_0 enable_api_ms_win_power_base_l1_1_0 enable_atl enable_atl100 @@ -21777,6 +21778,7 @@ wine_fn_config_makefile dlls/apisetschema enable_apisetschema wine_fn_config_makefile dlls/apphelp enable_apphelp wine_fn_config_makefile dlls/apphelp/tests enable_tests wine_fn_config_makefile dlls/appwiz.cpl enable_appwiz_cpl +wine_fn_config_makefile dlls/api-ms-win-core-psm-appnotify-l1-1-0 enable_api_ms_win_core_psm_appnotify_l1_1_0 wine_fn_config_makefile dlls/api-ms-win-power-base-l1-1-0 enable_api_ms_win_power_base_l1_1_0 wine_fn_config_makefile dlls/atl enable_atl wine_fn_config_makefile dlls/atl/tests enable_tests diff --git a/dlls/api-ms-win-core-psm-appnotify-l1-1-0/Makefile.in b/dlls/api-ms-win-core-psm-appnotify-l1-1-0/Makefile.in new file mode 100644 index 00000000000..8a3d2ad98cb --- /dev/null +++ wine/dlls/api-ms-win-core-psm-appnotify-l1-1-0/Makefile.in @@ -0,0 +1 @@ +MODULE = api-ms-win-core-psm-appnotify-l1-1-0.dll diff --git a/dlls/api-ms-win-core-psm-appnotify-l1-1-0/api-ms-win-core-psm-appnotify-l1-1-0.spec b/dlls/api-ms-win-core-psm-appnotify-l1-1-0/api-ms-win-core-psm-appnotify-l1-1-0.spec new file mode 100644 index 00000000000..8b069d66e62 --- /dev/null +++ wine/dlls/api-ms-win-core-psm-appnotify-l1-1-0/api-ms-win-core-psm-appnotify-l1-1-0.spec @@ -0,0 +1,2 @@ +@ stub RegisterAppStateChangeNotification +@ stub UnregisterAppStateChangeNotification -- 2.39.2 (Apple Git-144) diff --git a/dlls/crypt32/base64.c b/dlls/crypt32/base64.c index 11fb137ed91..b61ed7ff8cc 100644 --- wine/dlls/crypt32/base64.c +++ wine/dlls/crypt32/base64.c @@ -241,6 +241,63 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, return ret; } +static BOOL BinaryToHexRawA(const BYTE *bin, DWORD nbin, DWORD flags, char *str, DWORD *nstr) +{ + static const char hex[] = "0123456789abcdef"; + DWORD needed; + + if (flags & CRYPT_STRING_NOCRLF) + needed = 0; + else if (flags & CRYPT_STRING_NOCR) + needed = 1; + else + needed = 2; + + needed += nbin * 2 + 1; + + if (!str) + { + *nstr = needed; + return TRUE; + } + + if (needed > *nstr && *nstr < 3) + { + SetLastError(ERROR_MORE_DATA); + return FALSE; + } + + nbin = min(nbin, (*nstr - 1) / 2); + + while (nbin--) + { + *str++ = hex[(*bin >> 4) & 0xf]; + *str++ = hex[*bin & 0xf]; + bin++; + } + + if (needed > *nstr) + { + *str = 0; + SetLastError(ERROR_MORE_DATA); + return FALSE; + } + + if (flags & CRYPT_STRING_NOCR) + { + *str++ = '\n'; + } + else if (!(flags & CRYPT_STRING_NOCRLF)) + { + *str++ = '\r'; + *str++ = '\n'; + } + + *str = 0; + *nstr = needed - 1; + return TRUE; +} + BOOL WINAPI CryptBinaryToStringA(const BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPSTR pszString, DWORD *pcchString) { @@ -271,6 +328,9 @@ BOOL WINAPI CryptBinaryToStringA(const BYTE *pbBinary, case CRYPT_STRING_BASE64X509CRLHEADER: encoder = BinaryToBase64A; break; + case CRYPT_STRING_HEXRAW: + encoder = BinaryToHexRawA; + break; case CRYPT_STRING_HEX: case CRYPT_STRING_HEXASCII: case CRYPT_STRING_HEXADDR: @@ -883,6 +943,120 @@ static LONG DecodeAnyA(LPCSTR pszString, DWORD cchString, return ret; } +static BOOL is_hex_string_special_char(WCHAR c) +{ + switch (c) + { + case '-': + case ',': + case ' ': + case '\t': + case '\r': + case '\n': + return TRUE; + + default: + return FALSE; + } +} + +static WCHAR wchar_from_str(BOOL wide, const void **str, DWORD *len) +{ + WCHAR c; + + if (!*len) + return 0; + + --*len; + if (wide) + c = *(*(const WCHAR **)str)++; + else + c = *(*(const char **)str)++; + + return c ? c : 0xffff; +} + +static BYTE digit_from_char(WCHAR c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + c = towlower(c); + if (c >= 'a' && c <= 'f') + return c - 'a' + 0xa; + return 0xff; +} + +static LONG string_to_hex(const void* str, BOOL wide, DWORD len, BYTE *hex, DWORD *hex_len, + DWORD *skipped, DWORD *ret_flags) +{ + unsigned int byte_idx = 0; + BYTE d1, d2; + WCHAR c; + + if (!str || !hex_len) + return ERROR_INVALID_PARAMETER; + + if (!len) + len = wide ? wcslen(str) : strlen(str); + + if (wide && !len) + return ERROR_INVALID_PARAMETER; + + if (skipped) + *skipped = 0; + if (ret_flags) + *ret_flags = 0; + + while ((c = wchar_from_str(wide, &str, &len)) && is_hex_string_special_char(c)) + ; + + while ((d1 = digit_from_char(c)) != 0xff) + { + if ((d2 = digit_from_char(wchar_from_str(wide, &str, &len))) == 0xff) + { + if (!hex) + *hex_len = 0; + return ERROR_INVALID_DATA; + } + + if (hex && byte_idx < *hex_len) + hex[byte_idx] = (d1 << 4) | d2; + + ++byte_idx; + + do + { + c = wchar_from_str(wide, &str, &len); + } while (c == '-' || c == ','); + } + + while (c) + { + if (!is_hex_string_special_char(c)) + { + if (!hex) + *hex_len = 0; + return ERROR_INVALID_DATA; + } + c = wchar_from_str(wide, &str, &len); + } + + if (hex && byte_idx > *hex_len) + return ERROR_MORE_DATA; + + if (ret_flags) + *ret_flags = CRYPT_STRING_HEX; + + *hex_len = byte_idx; + + return ERROR_SUCCESS; +} + +static LONG string_to_hexA(const char *str, DWORD len, BYTE *hex, DWORD *hex_len, DWORD *skipped, DWORD *ret_flags) +{ + return string_to_hex(str, FALSE, len, hex, hex_len, skipped, ret_flags); +} + BOOL WINAPI CryptStringToBinaryA(LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags) @@ -928,6 +1102,8 @@ BOOL WINAPI CryptStringToBinaryA(LPCSTR pszString, decoder = DecodeAnyA; break; case CRYPT_STRING_HEX: + decoder = string_to_hexA; + break; case CRYPT_STRING_HEXASCII: case CRYPT_STRING_HEXADDR: case CRYPT_STRING_HEXASCIIADDR: @@ -1094,6 +1270,11 @@ static LONG DecodeAnyW(LPCWSTR pszString, DWORD cchString, return ret; } +static LONG string_to_hexW(const WCHAR *str, DWORD len, BYTE *hex, DWORD *hex_len, DWORD *skipped, DWORD *ret_flags) +{ + return string_to_hex(str, TRUE, len, hex, hex_len, skipped, ret_flags); +} + BOOL WINAPI CryptStringToBinaryW(LPCWSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags) @@ -1139,6 +1320,8 @@ BOOL WINAPI CryptStringToBinaryW(LPCWSTR pszString, decoder = DecodeAnyW; break; case CRYPT_STRING_HEX: + decoder = string_to_hexW; + break; case CRYPT_STRING_HEXASCII: case CRYPT_STRING_HEXADDR: case CRYPT_STRING_HEXASCIIADDR: diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index ad39b7d18c7..b57cc685212 100644 --- wine/dlls/crypt32/cert.c +++ wine/dlls/crypt32/cert.c @@ -1006,6 +1006,7 @@ BOOL WINAPI CryptAcquireCertificatePrivateKey(PCCERT_CONTEXT pCert, CryptMemFree(info); if (cert_in_store) CertFreeCertificateContext(cert_in_store); + if (ret) SetLastError(0); return ret; } diff --git a/dlls/crypt32/chain.c b/dlls/crypt32/chain.c index cf244f2ac6c..4a60e9a60ff 100644 --- wine/dlls/crypt32/chain.c +++ wine/dlls/crypt32/chain.c @@ -3696,6 +3696,44 @@ static BYTE msPubKey4[] = { 0xa6,0xc6,0x48,0x4c,0xc3,0x37,0x51,0x23,0xd3,0x27,0xd7,0xb8,0x4e,0x70,0x96, 0xf0,0xa1,0x44,0x76,0xaf,0x78,0xcf,0x9a,0xe1,0x66,0x13,0x02,0x03,0x01,0x00, 0x01 }; +/* from Microsoft Root Certificate Authority 2011 */ +static BYTE msPubKey5[] = { +0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xb2,0x80,0x41,0xaa,0x35,0x38, +0x4d,0x13,0x72,0x32,0x68,0x22,0x4d,0xb8,0xb2,0xf1,0xff,0xd5,0x52,0xbc,0x6c, +0xc7,0xf5,0xd2,0x4a,0x8c,0x36,0xee,0xd1,0xc2,0x5c,0x7e,0x8c,0x8a,0xae,0xaf, +0x13,0x28,0x6f,0xc0,0x73,0xe3,0x3a,0xce,0xd0,0x25,0xa8,0x5a,0x3a,0x6d,0xef, +0xa8,0xb8,0x59,0xab,0x13,0x23,0x68,0xcd,0x0c,0x29,0x87,0xd1,0x6f,0x80,0x5c, +0x8f,0x44,0x7f,0x5d,0x90,0x01,0x52,0x58,0xac,0x51,0xc5,0x5f,0x2a,0x87,0xdc, +0xdc,0xd8,0x0a,0x1d,0xc1,0x03,0xb9,0x7b,0xb0,0x56,0xe8,0xa3,0xde,0x64,0x61, +0xc2,0x9e,0xf8,0xf3,0x7c,0xb9,0xec,0x0d,0xb5,0x54,0xfe,0x4c,0xb6,0x65,0x4f, +0x88,0xf0,0x9c,0x48,0x99,0x0c,0x42,0x0b,0x09,0x7c,0x31,0x59,0x17,0x79,0x06, +0x78,0x28,0x8d,0x89,0x3a,0x4c,0x03,0x25,0xbe,0x71,0x6a,0x5c,0x0b,0xe7,0x84, +0x60,0xa4,0x99,0x22,0xe3,0xd2,0xaf,0x84,0xa4,0xa7,0xfb,0xd1,0x98,0xed,0x0c, +0xa9,0xde,0x94,0x89,0xe1,0x0e,0xa0,0xdc,0xc0,0xce,0x99,0x3d,0xea,0x08,0x52, +0xbb,0x56,0x79,0xe4,0x1f,0x84,0xba,0x1e,0xb8,0xb4,0xc4,0x49,0x5c,0x4f,0x31, +0x4b,0x87,0xdd,0xdd,0x05,0x67,0x26,0x99,0x80,0xe0,0x71,0x11,0xa3,0xb8,0xa5, +0x41,0xe2,0xa4,0x53,0xb9,0xf7,0x32,0x29,0x83,0x0c,0x13,0xbf,0x36,0x5e,0x04, +0xb3,0x4b,0x43,0x47,0x2f,0x6b,0xe2,0x91,0x1e,0xd3,0x98,0x4f,0xdd,0x42,0x07, +0xc8,0xe8,0x1d,0x12,0xfc,0x99,0xa9,0x6b,0x3e,0x92,0x7e,0xc8,0xd6,0x69,0x3a, +0xfc,0x64,0xbd,0xb6,0x09,0x9d,0xca,0xfd,0x0c,0x0b,0xa2,0x9b,0x77,0x60,0x4b, +0x03,0x94,0xa4,0x30,0x69,0x12,0xd6,0x42,0x2d,0xc1,0x41,0x4c,0xca,0xdc,0xaa, +0xfd,0x8f,0x5b,0x83,0x46,0x9a,0xd9,0xfc,0xb1,0xd1,0xe3,0xb3,0xc9,0x7f,0x48, +0x7a,0xcd,0x24,0xf0,0x41,0x8f,0x5c,0x74,0xd0,0xac,0xb0,0x10,0x20,0x06,0x49, +0xb7,0xc7,0x2d,0x21,0xc8,0x57,0xe3,0xd0,0x86,0xf3,0x03,0x68,0xfb,0xd0,0xce, +0x71,0xc1,0x89,0x99,0x4a,0x64,0x01,0x6c,0xfd,0xec,0x30,0x91,0xcf,0x41,0x3c, +0x92,0xc7,0xe5,0xba,0x86,0x1d,0x61,0x84,0xc7,0x5f,0x83,0x39,0x62,0xae,0xb4, +0x92,0x2f,0x47,0xf3,0x0b,0xf8,0x55,0xeb,0xa0,0x1f,0x59,0xd0,0xbb,0x74,0x9b, +0x1e,0xd0,0x76,0xe6,0xf2,0xe9,0x06,0xd7,0x10,0xe8,0xfa,0x64,0xde,0x69,0xc6, +0x35,0x96,0x88,0x02,0xf0,0x46,0xb8,0x3f,0x27,0x99,0x6f,0xcb,0x71,0x89,0x29, +0x35,0xf7,0x48,0x16,0x02,0x35,0x8f,0xd5,0x79,0x7c,0x4d,0x02,0xcf,0x5f,0xeb, +0x8a,0x83,0x4f,0x45,0x71,0x88,0xf9,0xa9,0x0d,0x4e,0x72,0xe9,0xc2,0x9c,0x07, +0xcf,0x49,0x1b,0x4e,0x04,0x0e,0x63,0x51,0x8c,0x5e,0xd8,0x00,0xc1,0x55,0x2c, +0xb6,0xc6,0xe0,0xc2,0x65,0x4e,0xc9,0x34,0x39,0xf5,0x9c,0xb3,0xc4,0x7e,0xe8, +0x61,0x6e,0x13,0x5f,0x15,0xc4,0x5f,0xd9,0x7e,0xed,0x1d,0xce,0xee,0x44,0xec, +0xcb,0x2e,0x86,0xb1,0xec,0x38,0xf6,0x70,0xed,0xab,0x5c,0x13,0xc1,0xd9,0x0f, +0x0d,0xc7,0x80,0xb2,0x55,0xed,0x34,0xf7,0xac,0x9b,0xe4,0xc3,0xda,0xe7,0x47, +0x3c,0xa6,0xb5,0x8f,0x31,0xdf,0xc5,0x4b,0xaf,0xeb,0xf1,0x02,0x03,0x01,0x00, +0x01 }; static BOOL WINAPI verify_ms_root_policy(LPCSTR szPolicyOID, PCCERT_CHAIN_CONTEXT pChainContext, PCERT_CHAIN_POLICY_PARA pPolicyPara, @@ -3705,21 +3743,38 @@ static BOOL WINAPI verify_ms_root_policy(LPCSTR szPolicyOID, CERT_PUBLIC_KEY_INFO msPubKey = { { 0 } }; DWORD i; - CRYPT_DATA_BLOB keyBlobs[] = { + static const CRYPT_DATA_BLOB keyBlobs[] = { { sizeof(msPubKey1), msPubKey1 }, { sizeof(msPubKey2), msPubKey2 }, { sizeof(msPubKey3), msPubKey3 }, { sizeof(msPubKey4), msPubKey4 }, }; + static const CRYPT_DATA_BLOB keyBlobs_approot[] = { + { sizeof(msPubKey5), msPubKey5 }, + }; PCERT_SIMPLE_CHAIN rootChain = pChainContext->rgpChain[pChainContext->cChain - 1]; PCCERT_CONTEXT root = rootChain->rgpElement[rootChain->cElement - 1]->pCertContext; - for (i = 0; !isMSRoot && i < ARRAY_SIZE(keyBlobs); i++) + const CRYPT_DATA_BLOB *keys; + unsigned int key_count; + + if (pPolicyPara && pPolicyPara->dwFlags & MICROSOFT_ROOT_CERT_CHAIN_POLICY_CHECK_APPLICATION_ROOT_FLAG) + { + keys = keyBlobs_approot; + key_count = ARRAY_SIZE(keyBlobs_approot); + } + else + { + keys = keyBlobs; + key_count = ARRAY_SIZE(keyBlobs); + } + + for (i = 0; !isMSRoot && i < key_count; i++) { - msPubKey.PublicKey.cbData = keyBlobs[i].cbData; - msPubKey.PublicKey.pbData = keyBlobs[i].pbData; + msPubKey.PublicKey.cbData = keys[i].cbData; + msPubKey.PublicKey.pbData = keys[i].pbData; if (CertComparePublicKeyInfo(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &root->pCertInfo->SubjectPublicKeyInfo, &msPubKey)) isMSRoot = TRUE; } diff --git a/dlls/crypt32/decode.c b/dlls/crypt32/decode.c index 762d1b54661..19643194b49 100644 --- wine/dlls/crypt32/decode.c +++ wine/dlls/crypt32/decode.c @@ -3874,7 +3874,7 @@ static BOOL WINAPI CRYPT_AsnDecodeCertPolicyConstraints( struct DECODED_RSA_PUB_KEY { - DWORD pubexp; + CRYPT_INTEGER_BLOB pubexp; CRYPT_INTEGER_BLOB modulus; }; @@ -3893,12 +3893,23 @@ static BOOL CRYPT_raw_decode_rsa_pub_key(struct DECODED_RSA_PUB_KEY **decodedKey FALSE, TRUE, offsetof(struct DECODED_RSA_PUB_KEY, modulus.pbData), 0 }, { ASN_INTEGER, offsetof(struct DECODED_RSA_PUB_KEY, pubexp), - CRYPT_AsnDecodeIntInternal, sizeof(DWORD), FALSE, FALSE, 0, 0 }, + CRYPT_AsnDecodeUnsignedIntegerInternal, sizeof(CRYPT_INTEGER_BLOB), + FALSE, TRUE, offsetof(struct DECODED_RSA_PUB_KEY, pubexp.pbData), + 0 }, }; ret = CRYPT_AsnDecodeSequence(items, ARRAY_SIZE(items), pbEncoded, cbEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL, decodedKey, size, NULL, NULL); + + if (ret && (*decodedKey)->pubexp.cbData > sizeof(DWORD)) + { + WARN("Unexpected exponent length %lu.\n", (*decodedKey)->pubexp.cbData); + LocalFree(*decodedKey); + SetLastError(CRYPT_E_ASN1_LARGE); + ret = FALSE; + } + return ret; } @@ -3920,7 +3931,7 @@ static BOOL WINAPI CRYPT_AsnDecodeRsaPubKey_Bcrypt(DWORD dwCertEncodingType, if (ret) { /* Header, exponent, and modulus */ - DWORD bytesNeeded = sizeof(BCRYPT_RSAKEY_BLOB) + sizeof(DWORD) + + DWORD bytesNeeded = sizeof(BCRYPT_RSAKEY_BLOB) + decodedKey->pubexp.cbData + decodedKey->modulus.cbData; if (!pvStructInfo) @@ -3939,7 +3950,7 @@ static BOOL WINAPI CRYPT_AsnDecodeRsaPubKey_Bcrypt(DWORD dwCertEncodingType, hdr = pvStructInfo; hdr->Magic = BCRYPT_RSAPUBLIC_MAGIC; hdr->BitLength = decodedKey->modulus.cbData * 8; - hdr->cbPublicExp = sizeof(DWORD); + hdr->cbPublicExp = decodedKey->pubexp.cbData; hdr->cbModulus = decodedKey->modulus.cbData; hdr->cbPrime1 = 0; hdr->cbPrime2 = 0; @@ -3947,9 +3958,9 @@ static BOOL WINAPI CRYPT_AsnDecodeRsaPubKey_Bcrypt(DWORD dwCertEncodingType, * in big-endian format, so we need to convert from little-endian */ CRYPT_CopyReversed((BYTE *)pvStructInfo + sizeof(BCRYPT_RSAKEY_BLOB), - (BYTE *)&decodedKey->pubexp, sizeof(DWORD)); + decodedKey->pubexp.pbData, hdr->cbPublicExp); CRYPT_CopyReversed((BYTE *)pvStructInfo + sizeof(BCRYPT_RSAKEY_BLOB) + - sizeof(DWORD), decodedKey->modulus.pbData, + hdr->cbPublicExp, decodedKey->modulus.pbData, decodedKey->modulus.cbData); } LocalFree(decodedKey); @@ -3984,13 +3995,13 @@ static BOOL WINAPI CRYPT_AsnDecodeRsaPubKey(DWORD dwCertEncodingType, if (!pvStructInfo) { *pcbStructInfo = bytesNeeded; - ret = TRUE; } else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, bytesNeeded))) { BLOBHEADER *hdr; RSAPUBKEY *rsaPubKey; + unsigned int i; if (dwFlags & CRYPT_DECODE_ALLOC_FLAG) pvStructInfo = *(BYTE **)pvStructInfo; @@ -4002,7 +4013,11 @@ static BOOL WINAPI CRYPT_AsnDecodeRsaPubKey(DWORD dwCertEncodingType, rsaPubKey = (RSAPUBKEY *)((BYTE *)pvStructInfo + sizeof(BLOBHEADER)); rsaPubKey->magic = RSA1_MAGIC; - rsaPubKey->pubexp = decodedKey->pubexp; + rsaPubKey->pubexp = 0; + assert(decodedKey->pubexp.cbData <= sizeof(rsaPubKey->pubexp)); + for (i = 0; i < decodedKey->pubexp.cbData; ++i) + rsaPubKey->pubexp |= decodedKey->pubexp.pbData[i] << (i * 8); + rsaPubKey->bitlen = decodedKey->modulus.cbData * 8; memcpy((BYTE *)pvStructInfo + sizeof(BLOBHEADER) + sizeof(RSAPUBKEY), decodedKey->modulus.pbData, @@ -6351,6 +6366,112 @@ static BOOL CRYPT_AsnDecodeOCSPNextUpdate(const BYTE *pbEncoded, return ret; } +static BOOL CRYPT_AsnDecodeCertStatus(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + BOOL ret = TRUE; + BYTE tag = pbEncoded[0] & ~3, status = pbEncoded[0] & 3; + DWORD bytesNeeded = FIELD_OFFSET(OCSP_BASIC_RESPONSE_ENTRY, ThisUpdate) - + FIELD_OFFSET(OCSP_BASIC_RESPONSE_ENTRY, dwCertStatus); + + if (!cbEncoded) + { + SetLastError(CRYPT_E_ASN1_EOD); + return FALSE; + } + + switch (status) + { + case 0: + if (tag != ASN_CONTEXT) + { + WARN("Unexpected tag %02x\n", tag); + SetLastError(CRYPT_E_ASN1_BADTAG); + return FALSE; + } + if (cbEncoded < 2 || pbEncoded[1]) + { + SetLastError(CRYPT_E_ASN1_CORRUPT); + return FALSE; + } + if (!pvStructInfo) + *pcbStructInfo = bytesNeeded; + else if (*pcbStructInfo < bytesNeeded) + { + *pcbStructInfo = bytesNeeded; + SetLastError(ERROR_MORE_DATA); + return FALSE; + } + if (pvStructInfo) + { + *(DWORD *)pvStructInfo = 0; + *(OCSP_BASIC_REVOKED_INFO **)((char *)pvStructInfo + + FIELD_OFFSET(OCSP_BASIC_RESPONSE_ENTRY, u.pRevokedInfo) + - FIELD_OFFSET(OCSP_BASIC_RESPONSE_ENTRY, dwCertStatus)) = NULL; + } + *pcbStructInfo = bytesNeeded; + *pcbDecoded = 2; + break; + + case 1: + { + DWORD dataLen; + + if (tag != (ASN_CONTEXT | ASN_CONSTRUCTOR)) + { + WARN("Unexpected tag %02x\n", tag); + SetLastError(CRYPT_E_ASN1_BADTAG); + return FALSE; + } + if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen))) + { + BYTE lenBytes = GET_LEN_BYTES(pbEncoded[1]); + DWORD bytesDecoded, size; + FILETIME date; + + if (dataLen) + { + size = sizeof(date); + ret = CRYPT_AsnDecodeGeneralizedTime(pbEncoded + 1 + lenBytes, cbEncoded - 1 - lenBytes, + dwFlags, &date, &size, &bytesDecoded); + if (ret) + { + OCSP_BASIC_REVOKED_INFO *info; + + bytesNeeded += sizeof(*info); + if (!pvStructInfo) + *pcbStructInfo = bytesNeeded; + else if (*pcbStructInfo < bytesNeeded) + { + *pcbStructInfo = bytesNeeded; + SetLastError(ERROR_MORE_DATA); + return FALSE; + } + if (pvStructInfo) + { + *(DWORD *)pvStructInfo = 1; + info = *(OCSP_BASIC_REVOKED_INFO **)((char *)pvStructInfo + + FIELD_OFFSET(OCSP_BASIC_RESPONSE_ENTRY, u.pRevokedInfo) + - FIELD_OFFSET(OCSP_BASIC_RESPONSE_ENTRY, dwCertStatus)); + info->RevocationDate = date; + } + *pcbStructInfo = bytesNeeded; + *pcbDecoded = 1 + lenBytes + bytesDecoded; + } + } + } + break; + } + default: + FIXME("Unhandled status %u\n", status); + SetLastError(CRYPT_E_ASN1_BADTAG); + return FALSE; + } + + return ret; +} + static BOOL CRYPT_AsnDecodeOCSPBasicResponseEntry(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) { @@ -6367,10 +6488,9 @@ static BOOL CRYPT_AsnDecodeOCSPBasicResponseEntry(const BYTE *pbEncoded, DWORD c { ASN_INTEGER, offsetof(OCSP_BASIC_RESPONSE_ENTRY, CertId.SerialNumber), CRYPT_AsnDecodeIntegerInternal, sizeof(CRYPT_INTEGER_BLOB), FALSE, TRUE, offsetof(OCSP_BASIC_RESPONSE_ENTRY, CertId.SerialNumber.pbData), 0 }, - { ASN_CONTEXT, offsetof(OCSP_BASIC_RESPONSE_ENTRY, dwCertStatus), - CRYPT_AsnDecodeIntInternal, sizeof(DWORD), FALSE, FALSE, - 0, 0 }, - /* FIXME: pRevokedInfo */ + { 0, offsetof(OCSP_BASIC_RESPONSE_ENTRY, dwCertStatus), + CRYPT_AsnDecodeCertStatus, sizeof(DWORD), FALSE, TRUE, + offsetof(OCSP_BASIC_RESPONSE_ENTRY, u.pRevokedInfo), 0 }, { ASN_GENERALTIME, offsetof(OCSP_BASIC_RESPONSE_ENTRY, ThisUpdate), CRYPT_AsnDecodeGeneralizedTime, sizeof(FILETIME), FALSE, FALSE, 0, 0 }, @@ -6401,13 +6521,13 @@ static BOOL CRYPT_AsnDecodeOCSPBasicResponseEntriesArray(const BYTE *pbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo, pcbDecoded); } -static BOOL CRYPT_AsnDecodeResponderID(const BYTE *pbEncoded, +static BOOL CRYPT_AsnDecodeResponderIDByName(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) { OCSP_BASIC_RESPONSE_INFO *info = pvStructInfo; - BYTE tag = pbEncoded[0] & ~3, choice = pbEncoded[0] & 3; - DWORD decodedLen, dataLen, lenBytes, bytesNeeded = sizeof(*info), len; + DWORD dataLen, decodedLen, lenBytes, bytesNeeded = sizeof(*info); + BYTE tag = pbEncoded[0] & ~3; CERT_NAME_BLOB *blob; if (tag != (ASN_CONTEXT | ASN_CONSTRUCTOR)) @@ -6416,15 +6536,78 @@ static BOOL CRYPT_AsnDecodeResponderID(const BYTE *pbEncoded, SetLastError(CRYPT_E_ASN1_BADTAG); return FALSE; } - if (choice > 2) + + if (!CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)) + return FALSE; + lenBytes = GET_LEN_BYTES(pbEncoded[1]); + cbEncoded -= 1 + lenBytes; + + if (dataLen > cbEncoded) { - WARN("Unexpected choice %02x\n", choice); - SetLastError(CRYPT_E_ASN1_CORRUPT); + SetLastError(CRYPT_E_ASN1_EOD); + return FALSE; + } + pbEncoded += 1 + lenBytes; + decodedLen = 1 + lenBytes + dataLen; + + if (pbEncoded[0] != ASN_SEQUENCE) + { + WARN("Unexpected tag %02x %02x\n", pbEncoded[0], pbEncoded[1]); + SetLastError(CRYPT_E_ASN1_BADTAG); return FALSE; } + if (!(dwFlags & CRYPT_DECODE_NOCOPY_FLAG)) bytesNeeded += dataLen; if (pvStructInfo && *pcbStructInfo >= bytesNeeded) - info->dwResponderIdChoice = choice; + { + info->dwResponderIdChoice = 1; + + blob = &info->u.ByNameResponderId; + blob->cbData = dataLen; + if (dwFlags & CRYPT_DECODE_NOCOPY_FLAG) + blob->pbData = (BYTE *)pbEncoded; + else if (blob->cbData) + { + blob->pbData = (BYTE *)(info + 1); + memcpy(blob->pbData, pbEncoded, blob->cbData); + } + } + + if (pcbDecoded) + *pcbDecoded = decodedLen; + + if (!pvStructInfo) + { + *pcbStructInfo = bytesNeeded; + return TRUE; + } + + if (*pcbStructInfo < bytesNeeded) + { + SetLastError(ERROR_MORE_DATA); + *pcbStructInfo = bytesNeeded; + return FALSE; + } + + *pcbStructInfo = bytesNeeded; + return TRUE; +} + +static BOOL CRYPT_AsnDecodeResponderIDByKey(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + OCSP_BASIC_RESPONSE_INFO *info = pvStructInfo; + DWORD dataLen, decodedLen, lenBytes, bytesNeeded = sizeof(*info), len; + BYTE tag = pbEncoded[0] & ~3; + CRYPT_HASH_BLOB *blob; + + if (tag != (ASN_CONTEXT | ASN_CONSTRUCTOR)) + { + WARN("Unexpected tag %02x\n", tag); + SetLastError(CRYPT_E_ASN1_BADTAG); + return FALSE; + } if (!CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)) return FALSE; @@ -6461,7 +6644,8 @@ static BOOL CRYPT_AsnDecodeResponderID(const BYTE *pbEncoded, if (!(dwFlags & CRYPT_DECODE_NOCOPY_FLAG)) bytesNeeded += len; if (pvStructInfo && *pcbStructInfo >= bytesNeeded) { - blob = &info->u.ByNameResponderId; + info->dwResponderIdChoice = 2; + blob = &info->u.ByKeyResponderId; blob->cbData = len; if (dwFlags & CRYPT_DECODE_NOCOPY_FLAG) blob->pbData = (BYTE *)pbEncoded; @@ -6492,6 +6676,28 @@ static BOOL CRYPT_AsnDecodeResponderID(const BYTE *pbEncoded, return TRUE; } +static BOOL CRYPT_AsnDecodeResponderID(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + BYTE choice = pbEncoded[0] & 3; + + TRACE("choice %02x\n", choice); + switch (choice) + { + case 1: + return CRYPT_AsnDecodeResponderIDByName(pbEncoded, cbEncoded, dwFlags, + pvStructInfo, pcbStructInfo, pcbDecoded); + case 2: + return CRYPT_AsnDecodeResponderIDByKey(pbEncoded, cbEncoded, dwFlags, + pvStructInfo, pcbStructInfo, pcbDecoded); + default: + WARN("Unexpected choice %02x\n", choice); + SetLastError(CRYPT_E_ASN1_CORRUPT); + return FALSE; + } +} + static BOOL WINAPI CRYPT_AsnDecodeOCSPBasicResponse(DWORD dwCertEncodingType, LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, CRYPT_DECODE_PARA *pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo) diff --git a/dlls/crypt32/encode.c b/dlls/crypt32/encode.c index 8086ad2fc0a..8968eb9f15a 100644 --- wine/dlls/crypt32/encode.c +++ wine/dlls/crypt32/encode.c @@ -4500,7 +4500,7 @@ static BOOL WINAPI CRYPT_AsnEncodeCertId(DWORD dwCertEncodingType, return ret; } -static BOOL WINAPI CRYPT_AsnEncodeOCSPRequestEntry(DWORD dwCertEncodingType, +static BOOL CRYPT_AsnEncodeOCSPRequestEntry(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { diff --git a/dlls/crypt32/object.c b/dlls/crypt32/object.c index 8123ed73351..4440c9e0498 100644 --- wine/dlls/crypt32/object.c +++ wine/dlls/crypt32/object.c @@ -643,7 +643,7 @@ static BOOL CRYPT_QueryEmbeddedMessageObject(DWORD dwObjectType, } file = CreateFileW(temp_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL); - if (file == INVALID_HANDLE_VALUE) + if (!file) { ERR("Could not create temp file.\n"); SetLastError(ERROR_OUTOFMEMORY); diff --git a/dlls/crypt32/str.c b/dlls/crypt32/str.c index 277aeb70d4a..d74df308e4a 100644 --- wine/dlls/crypt32/str.c +++ wine/dlls/crypt32/str.c @@ -29,77 +29,45 @@ WINE_DEFAULT_DEBUG_CHANNEL(crypt); -DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, - LPSTR psz, DWORD csz) +DWORD WINAPI CertRDNValueToStrA(DWORD type, PCERT_RDN_VALUE_BLOB value_blob, + LPSTR value, DWORD value_len) { - DWORD ret = 0, len; + DWORD len, len_mb, ret; + LPWSTR valueW; - TRACE("(%ld, %p, %p, %ld)\n", dwValueType, pValue, psz, csz); + TRACE("(%ld, %p, %p, %ld)\n", type, value_blob, value, value_len); - switch (dwValueType) - { - case CERT_RDN_ANY_TYPE: - break; - case CERT_RDN_NUMERIC_STRING: - case CERT_RDN_PRINTABLE_STRING: - case CERT_RDN_TELETEX_STRING: - case CERT_RDN_VIDEOTEX_STRING: - case CERT_RDN_IA5_STRING: - case CERT_RDN_GRAPHIC_STRING: - case CERT_RDN_VISIBLE_STRING: - case CERT_RDN_GENERAL_STRING: - len = pValue->cbData; - if (!psz || !csz) - ret = len; - else - { - DWORD chars = min(len, csz - 1); + len = CertRDNValueToStrW(type, value_blob, NULL, 0); - if (chars) - { - memcpy(psz, pValue->pbData, chars); - ret += chars; - csz -= chars; - } - } - break; - case CERT_RDN_BMP_STRING: - case CERT_RDN_UTF8_STRING: - len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData, - pValue->cbData / sizeof(WCHAR), NULL, 0, NULL, NULL); - if (!psz || !csz) - ret = len; - else - { - DWORD chars = min(pValue->cbData / sizeof(WCHAR), csz - 1); + if (!(valueW = CryptMemAlloc(len * sizeof(*valueW)))) + { + ERR("No memory.\n"); + if (value && value_len) *value = 0; + return 1; + } - if (chars) - { - ret = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData, - chars, psz, csz - 1, NULL, NULL); - csz -= ret; - } - } - break; - default: - FIXME("string type %ld unimplemented\n", dwValueType); + len = CertRDNValueToStrW(type, value_blob, valueW, len); + len_mb = WideCharToMultiByte(CP_ACP, 0, valueW, len, NULL, 0, NULL, NULL); + if (!value || !value_len) + { + CryptMemFree(valueW); + return len_mb; } - if (psz && csz) + + ret = WideCharToMultiByte(CP_ACP, 0, valueW, len, value, value_len, NULL, NULL); + if (ret < len_mb) { - *(psz + ret) = '\0'; - csz--; - ret++; + value[0] = 0; + ret = 1; } - else - ret++; - TRACE("returning %ld (%s)\n", ret, debugstr_a(psz)); + CryptMemFree(valueW); return ret; } -DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, - LPWSTR psz, DWORD csz) +static DWORD rdn_value_to_strW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, + LPWSTR psz, DWORD csz, BOOL partial_copy) { - DWORD ret = 0, len, i, strLen; + DWORD ret = 0, len, i; TRACE("(%ld, %p, %p, %ld)\n", dwValueType, pValue, psz, csz); @@ -116,44 +84,42 @@ DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, case CERT_RDN_VISIBLE_STRING: case CERT_RDN_GENERAL_STRING: len = pValue->cbData; - if (!psz || !csz) - ret = len; - else + if (!psz || !csz) ret = len; + else if (len < csz || partial_copy) { - WCHAR *ptr = psz; - - for (i = 0; i < pValue->cbData && ptr - psz < csz; ptr++, i++) - *ptr = pValue->pbData[i]; - ret = ptr - psz; + len = min(len, csz - 1); + for (i = 0; i < len; ++i) + psz[i] = pValue->pbData[i]; + ret = len; } break; case CERT_RDN_BMP_STRING: case CERT_RDN_UTF8_STRING: - strLen = len = pValue->cbData / sizeof(WCHAR); + len = pValue->cbData / sizeof(WCHAR); if (!psz || !csz) ret = len; - else + else if (len < csz || partial_copy) { WCHAR *ptr = psz; - for (i = 0; i < strLen && ptr - psz < csz; ptr++, i++) - *ptr = ((LPCWSTR)pValue->pbData)[i]; - ret = ptr - psz; + len = min(len, csz - 1); + for (i = 0; i < len; ++i) + ptr[i] = ((LPCWSTR)pValue->pbData)[i]; + ret = len; } break; default: FIXME("string type %ld unimplemented\n", dwValueType); } - if (psz && csz) - { - *(psz + ret) = '\0'; - csz--; - ret++; - } - else - ret++; - TRACE("returning %ld (%s)\n", ret, debugstr_w(psz)); - return ret; + if (psz && csz) psz[ret] = 0; + TRACE("returning %ld (%s)\n", ret + 1, debugstr_w(psz)); + return ret + 1; +} + +DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, + LPWSTR psz, DWORD csz) +{ + return rdn_value_to_strW(dwValueType, pValue, psz, csz, FALSE); } static inline BOOL is_quotable_char(WCHAR c) @@ -175,115 +141,6 @@ static inline BOOL is_quotable_char(WCHAR c) } } -static DWORD quote_rdn_value_to_str_a(DWORD dwValueType, - PCERT_RDN_VALUE_BLOB pValue, LPSTR psz, DWORD csz) -{ - DWORD ret = 0, len, i; - BOOL needsQuotes = FALSE; - - TRACE("(%ld, %p, %p, %ld)\n", dwValueType, pValue, psz, csz); - - switch (dwValueType) - { - case CERT_RDN_ANY_TYPE: - break; - case CERT_RDN_NUMERIC_STRING: - case CERT_RDN_PRINTABLE_STRING: - case CERT_RDN_TELETEX_STRING: - case CERT_RDN_VIDEOTEX_STRING: - case CERT_RDN_IA5_STRING: - case CERT_RDN_GRAPHIC_STRING: - case CERT_RDN_VISIBLE_STRING: - case CERT_RDN_GENERAL_STRING: - len = pValue->cbData; - if (pValue->cbData && isspace(pValue->pbData[0])) - needsQuotes = TRUE; - if (pValue->cbData && isspace(pValue->pbData[pValue->cbData - 1])) - needsQuotes = TRUE; - for (i = 0; i < pValue->cbData; i++) - { - if (is_quotable_char(pValue->pbData[i])) - needsQuotes = TRUE; - if (pValue->pbData[i] == '"') - len += 1; - } - if (needsQuotes) - len += 2; - if (!psz || !csz) - ret = len; - else - { - char *ptr = psz; - - if (needsQuotes) - *ptr++ = '"'; - for (i = 0; i < pValue->cbData && ptr - psz < csz; ptr++, i++) - { - *ptr = pValue->pbData[i]; - if (pValue->pbData[i] == '"' && ptr - psz < csz - 1) - *(++ptr) = '"'; - } - if (needsQuotes && ptr - psz < csz) - *ptr++ = '"'; - ret = ptr - psz; - } - break; - case CERT_RDN_BMP_STRING: - case CERT_RDN_UTF8_STRING: - len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData, - pValue->cbData / sizeof(WCHAR), NULL, 0, NULL, NULL); - if (pValue->cbData && iswspace(((LPCWSTR)pValue->pbData)[0])) - needsQuotes = TRUE; - if (pValue->cbData && - iswspace(((LPCWSTR)pValue->pbData)[pValue->cbData / sizeof(WCHAR)-1])) - needsQuotes = TRUE; - for (i = 0; i < pValue->cbData / sizeof(WCHAR); i++) - { - if (is_quotable_char(((LPCWSTR)pValue->pbData)[i])) - needsQuotes = TRUE; - if (((LPCWSTR)pValue->pbData)[i] == '"') - len += 1; - } - if (needsQuotes) - len += 2; - if (!psz || !csz) - ret = len; - else - { - char *dst = psz; - - if (needsQuotes) - *dst++ = '"'; - for (i = 0; i < pValue->cbData / sizeof(WCHAR) && - dst - psz < csz; dst++, i++) - { - LPCWSTR src = (LPCWSTR)pValue->pbData + i; - - WideCharToMultiByte(CP_ACP, 0, src, 1, dst, - csz - (dst - psz) - 1, NULL, NULL); - if (*src == '"' && dst - psz < csz - 1) - *(++dst) = '"'; - } - if (needsQuotes && dst - psz < csz) - *dst++ = '"'; - ret = dst - psz; - } - break; - default: - FIXME("string type %ld unimplemented\n", dwValueType); - } - if (psz && csz) - { - *(psz + ret) = '\0'; - csz--; - ret++; - } - else - ret++; - TRACE("returning %ld (%s)\n", ret, debugstr_a(psz)); - return ret; -} - static DWORD quote_rdn_value_to_str_w(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, LPWSTR psz, DWORD csz) { @@ -375,148 +232,41 @@ static DWORD quote_rdn_value_to_str_w(DWORD dwValueType, default: FIXME("string type %ld unimplemented\n", dwValueType); } - if (psz && csz) - { - *(psz + ret) = '\0'; - csz--; - ret++; - } - else - ret++; TRACE("returning %ld (%s)\n", ret, debugstr_w(psz)); return ret; } -/* Adds the prefix prefix to the string pointed to by psz, followed by the - * character '='. Copies no more than csz characters. Returns the number of - * characters copied. If psz is NULL, returns the number of characters that - * would be copied. - */ -static DWORD CRYPT_AddPrefixA(LPCSTR prefix, LPSTR psz, DWORD csz) +DWORD WINAPI CertNameToStrA(DWORD encoding_type, PCERT_NAME_BLOB name_blob, DWORD str_type, LPSTR str, DWORD str_len) { - DWORD chars; + DWORD len, len_mb, ret; + LPWSTR strW; - TRACE("(%s, %p, %ld)\n", debugstr_a(prefix), psz, csz); + TRACE("(%ld, %p, %08lx, %p, %ld)\n", encoding_type, name_blob, str_type, str, str_len); - if (psz) + len = CertNameToStrW(encoding_type, name_blob, str_type, NULL, 0); + + if (!(strW = CryptMemAlloc(len * sizeof(*strW)))) { - chars = min(strlen(prefix), csz); - memcpy(psz, prefix, chars); - *(psz + chars) = '='; - chars++; + ERR("No memory.\n"); + if (str && str_len) *str = 0; + return 1; } - else - chars = lstrlenA(prefix) + 1; - return chars; -} -DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, - DWORD dwStrType, LPSTR psz, DWORD csz) -{ - static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG | - CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG; - static const char commaSep[] = ", "; - static const char semiSep[] = "; "; - static const char crlfSep[] = "\r\n"; - static const char plusSep[] = " + "; - static const char spaceSep[] = " "; - DWORD ret = 0, bytes = 0; - BOOL bRet; - CERT_NAME_INFO *info; - - TRACE("(%ld, %p, %08lx, %p, %ld)\n", dwCertEncodingType, pName, dwStrType, - psz, csz); - if (dwStrType & unsupportedFlags) - FIXME("unsupported flags: %08lx\n", dwStrType & unsupportedFlags); - - bRet = CryptDecodeObjectEx(dwCertEncodingType, X509_NAME, pName->pbData, - pName->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &bytes); - if (bRet) + len = CertNameToStrW(encoding_type, name_blob, str_type, strW, len); + len_mb = WideCharToMultiByte(CP_ACP, 0, strW, len, NULL, 0, NULL, NULL); + if (!str || !str_len) { - DWORD i, j, sepLen, rdnSepLen; - LPCSTR sep, rdnSep; - BOOL reverse = dwStrType & CERT_NAME_STR_REVERSE_FLAG; - const CERT_RDN *rdn = info->rgRDN; - - if(reverse && info->cRDN > 1) rdn += (info->cRDN - 1); - - if (dwStrType & CERT_NAME_STR_SEMICOLON_FLAG) - sep = semiSep; - else if (dwStrType & CERT_NAME_STR_CRLF_FLAG) - sep = crlfSep; - else - sep = commaSep; - sepLen = strlen(sep); - if (dwStrType & CERT_NAME_STR_NO_PLUS_FLAG) - rdnSep = spaceSep; - else - rdnSep = plusSep; - rdnSepLen = strlen(rdnSep); - for (i = 0; (!psz || ret < csz) && i < info->cRDN; i++) - { - for (j = 0; (!psz || ret < csz) && j < rdn->cRDNAttr; j++) - { - DWORD chars; - char prefixBuf[13]; /* big enough for SERIALNUMBER */ - LPCSTR prefix = NULL; - - if ((dwStrType & 0x000000ff) == CERT_OID_NAME_STR) - prefix = rdn->rgRDNAttr[j].pszObjId; - else if ((dwStrType & 0x000000ff) == CERT_X500_NAME_STR) - { - PCCRYPT_OID_INFO oidInfo = CryptFindOIDInfo( - CRYPT_OID_INFO_OID_KEY, - rdn->rgRDNAttr[j].pszObjId, - CRYPT_RDN_ATTR_OID_GROUP_ID); - - if (oidInfo) - { - WideCharToMultiByte(CP_ACP, 0, oidInfo->pwszName, -1, - prefixBuf, sizeof(prefixBuf), NULL, NULL); - prefix = prefixBuf; - } - else - prefix = rdn->rgRDNAttr[j].pszObjId; - } - if (prefix) - { - /* - 1 is needed to account for the NULL terminator. */ - chars = CRYPT_AddPrefixA(prefix, - psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0); - ret += chars; - } - chars = quote_rdn_value_to_str_a( - rdn->rgRDNAttr[j].dwValueType, - &rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL, - psz ? csz - ret : 0); - if (chars) - ret += chars - 1; - if (j < rdn->cRDNAttr - 1) - { - if (psz && ret < csz - rdnSepLen - 1) - memcpy(psz + ret, rdnSep, rdnSepLen); - ret += rdnSepLen; - } - } - if (i < info->cRDN - 1) - { - if (psz && ret < csz - sepLen - 1) - memcpy(psz + ret, sep, sepLen); - ret += sepLen; - } - if(reverse) rdn--; - else rdn++; - } - LocalFree(info); + CryptMemFree(strW); + return len_mb; } - if (psz && csz) + + ret = WideCharToMultiByte(CP_ACP, 0, strW, len, str, str_len, NULL, NULL); + if (ret < len_mb) { - *(psz + ret) = '\0'; - ret++; + str[0] = 0; + ret = 1; } - else - ret++; - TRACE("Returning %s\n", debugstr_a(psz)); + CryptMemFree(strW); return ret; } @@ -580,6 +330,7 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel, DWORD ret = 0, bytes = 0; BOOL bRet; CERT_NAME_INFO *info; + DWORD chars; if (dwStrType & unsupportedFlags) FIXME("unsupported flags: %08lx\n", dwStrType & unsupportedFlags); @@ -607,14 +358,17 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel, else rdnSep = L" + "; rdnSepLen = lstrlenW(rdnSep); - for (i = 0; (!psz || ret < csz) && i < info->cRDN; i++) + if (!csz) psz = NULL; + for (i = 0; i < info->cRDN; i++) { - for (j = 0; (!psz || ret < csz) && j < rdn->cRDNAttr; j++) + if (psz && ret + 1 == csz) break; + for (j = 0; j < rdn->cRDNAttr; j++) { - DWORD chars; LPCSTR prefixA = NULL; LPCWSTR prefixW = NULL; + if (psz && ret + 1 == csz) break; + if ((dwStrType & 0x000000ff) == CERT_OID_NAME_STR) prefixA = rdn->rgRDNAttr[j].pszObjId; else if ((dwStrType & 0x000000ff) == CERT_X500_NAME_STR) @@ -644,6 +398,7 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel, chars = lstrlenW(indent); ret += chars; } + if (psz && ret + 1 == csz) break; } if (prefixW) { @@ -659,38 +414,40 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel, psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0); ret += chars; } - chars = quote_rdn_value_to_str_w( - rdn->rgRDNAttr[j].dwValueType, - &rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL, - psz ? csz - ret : 0); - if (chars) - ret += chars - 1; + if (psz && ret + 1 == csz) break; + + chars = quote_rdn_value_to_str_w(rdn->rgRDNAttr[j].dwValueType, &rdn->rgRDNAttr[j].Value, + psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0); + ret += chars; if (j < rdn->cRDNAttr - 1) { - if (psz && ret < csz - rdnSepLen - 1) - memcpy(psz + ret, rdnSep, rdnSepLen * sizeof(WCHAR)); - ret += rdnSepLen; + if (psz) + { + chars = min(rdnSepLen, csz - ret - 1); + memcpy(psz + ret, rdnSep, chars * sizeof(WCHAR)); + ret += chars; + } + else ret += rdnSepLen; } } + if (psz && ret + 1 == csz) break; if (i < info->cRDN - 1) { - if (psz && ret < csz - sepLen - 1) - memcpy(psz + ret, sep, sepLen * sizeof(WCHAR)); - ret += sepLen; + if (psz) + { + chars = min(sepLen, csz - ret - 1); + memcpy(psz + ret, sep, chars * sizeof(WCHAR)); + ret += chars; + } + else ret += sepLen; } if(reverse) rdn--; else rdn++; } LocalFree(info); } - if (psz && csz) - { - *(psz + ret) = '\0'; - ret++; - } - else - ret++; - return ret; + if (psz && csz) psz[ret] = 0; + return ret + 1; } DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, @@ -1113,49 +870,74 @@ BOOL WINAPI CertStrToNameW(DWORD dwCertEncodingType, LPCWSTR pszX500, return ret; } -DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType, - DWORD dwFlags, void *pvTypePara, LPSTR pszNameString, DWORD cchNameString) +DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT cert, DWORD type, + DWORD flags, void *type_para, LPSTR name, DWORD name_len) { - DWORD ret; + DWORD len, len_mb, ret; + LPWSTR nameW; + + TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", cert, type, flags, type_para, name, name_len); - TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", pCertContext, dwType, dwFlags, - pvTypePara, pszNameString, cchNameString); + len = CertGetNameStringW(cert, type, flags, type_para, NULL, 0); - if (pszNameString) + if (!(nameW = CryptMemAlloc(len * sizeof(*nameW)))) { - LPWSTR wideName; - DWORD nameLen; + ERR("No memory.\n"); + if (name && name_len) *name = 0; + return 1; + } - nameLen = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara, - NULL, 0); - wideName = CryptMemAlloc(nameLen * sizeof(WCHAR)); - if (wideName) - { - CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara, - wideName, nameLen); - nameLen = WideCharToMultiByte(CP_ACP, 0, wideName, nameLen, - pszNameString, cchNameString, NULL, NULL); - if (nameLen <= cchNameString) - ret = nameLen; - else - { - pszNameString[cchNameString - 1] = '\0'; - ret = cchNameString; - } - CryptMemFree(wideName); - } - else - { - *pszNameString = '\0'; - ret = 1; - } + len = CertGetNameStringW(cert, type, flags, type_para, nameW, len); + len_mb = WideCharToMultiByte(CP_ACP, 0, nameW, len, NULL, 0, NULL, NULL); + if (!name || !name_len) + { + CryptMemFree(nameW); + return len_mb; } - else - ret = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara, - NULL, 0); + + ret = WideCharToMultiByte(CP_ACP, 0, nameW, len, name, name_len, NULL, NULL); + if (ret < len_mb) + { + name[0] = 0; + ret = 1; + } + CryptMemFree(nameW); return ret; } +static BOOL cert_get_alt_name_info(PCCERT_CONTEXT cert, BOOL alt_name_issuer, PCERT_ALT_NAME_INFO *info) +{ + static const char *oids[][2] = + { + { szOID_SUBJECT_ALT_NAME2, szOID_SUBJECT_ALT_NAME }, + { szOID_ISSUER_ALT_NAME2, szOID_ISSUER_ALT_NAME }, + }; + PCERT_EXTENSION ext; + DWORD bytes = 0; + + ext = CertFindExtension(oids[!!alt_name_issuer][0], cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension); + if (!ext) + ext = CertFindExtension(oids[!!alt_name_issuer][1], cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension); + if (!ext) return FALSE; + + return CryptDecodeObjectEx(cert->dwCertEncodingType, X509_ALTERNATE_NAME, ext->Value.pbData, ext->Value.cbData, + CRYPT_DECODE_ALLOC_FLAG, NULL, info, &bytes); +} + +static PCERT_ALT_NAME_ENTRY cert_find_next_alt_name_entry(PCERT_ALT_NAME_INFO info, DWORD entry_type, + unsigned int *index) +{ + unsigned int i; + + for (i = *index; i < info->cAltEntry; ++i) + if (info->rgAltEntry[i].dwAltNameChoice == entry_type) + { + *index = i + 1; + return &info->rgAltEntry[i]; + } + return NULL; +} + /* Searches cert's extensions for the alternate name extension with OID * altNameOID, and if found, searches it for the alternate name type entryType. * If found, returns a pointer to the entry, otherwise returns NULL. @@ -1165,31 +947,13 @@ DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType, * The return value is a pointer within *info, so don't free *info before * you're done with the return value. */ -static PCERT_ALT_NAME_ENTRY cert_find_alt_name_entry(PCCERT_CONTEXT cert, - LPCSTR altNameOID, DWORD entryType, PCERT_ALT_NAME_INFO *info) +static PCERT_ALT_NAME_ENTRY cert_find_alt_name_entry(PCCERT_CONTEXT cert, BOOL alt_name_issuer, + DWORD entry_type, PCERT_ALT_NAME_INFO *info) { - PCERT_ALT_NAME_ENTRY entry = NULL; - PCERT_EXTENSION ext = CertFindExtension(altNameOID, - cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension); - - if (ext) - { - DWORD bytes = 0; + unsigned int index = 0; - if (CryptDecodeObjectEx(cert->dwCertEncodingType, X509_ALTERNATE_NAME, - ext->Value.pbData, ext->Value.cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, - info, &bytes)) - { - DWORD i; - - for (i = 0; !entry && i < (*info)->cAltEntry; i++) - if ((*info)->rgAltEntry[i].dwAltNameChoice == entryType) - entry = &(*info)->rgAltEntry[i]; - } - } - else - *info = NULL; - return entry; + if (!cert_get_alt_name_info(cert, alt_name_issuer, info)) return NULL; + return cert_find_next_alt_name_entry(*info, entry_type, &index); } static DWORD cert_get_name_from_rdn_attr(DWORD encodingType, @@ -1207,222 +971,195 @@ static DWORD cert_get_name_from_rdn_attr(DWORD encodingType, oid = szOID_RSA_emailAddr; nameAttr = CertFindRDNAttr(oid, nameInfo); if (nameAttr) - ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value, - pszNameString, cchNameString); + ret = rdn_value_to_strW(nameAttr->dwValueType, &nameAttr->Value, + pszNameString, cchNameString, TRUE); LocalFree(nameInfo); } return ret; } -DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, - DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString) +static DWORD copy_output_str(WCHAR *dst, const WCHAR *src, DWORD dst_size) { - DWORD ret = 0; + DWORD len = wcslen(src); + + if (!dst || !dst_size) return len + 1; + len = min(len, dst_size - 1); + memcpy(dst, src, len * sizeof(*dst)); + dst[len] = 0; + return len + 1; +} + +DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT cert, DWORD type, DWORD flags, void *type_para, + LPWSTR name_string, DWORD name_len) +{ + static const DWORD supported_flags = CERT_NAME_ISSUER_FLAG | CERT_NAME_SEARCH_ALL_NAMES_FLAG; + BOOL alt_name_issuer, search_all_names; + CERT_ALT_NAME_INFO *info = NULL; + PCERT_ALT_NAME_ENTRY entry; PCERT_NAME_BLOB name; - LPCSTR altNameOID; + DWORD ret = 0; - TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", pCertContext, dwType, - dwFlags, pvTypePara, pszNameString, cchNameString); + TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", cert, type, flags, type_para, name_string, name_len); - if (!pCertContext) + if (!cert) goto done; - if (dwFlags & CERT_NAME_ISSUER_FLAG) - { - name = &pCertContext->pCertInfo->Issuer; - altNameOID = szOID_ISSUER_ALT_NAME; - } - else + if (flags & ~supported_flags) + FIXME("Unsupported flags %#lx.\n", flags); + + search_all_names = flags & CERT_NAME_SEARCH_ALL_NAMES_FLAG; + if (search_all_names && type != CERT_NAME_DNS_TYPE) { - name = &pCertContext->pCertInfo->Subject; - altNameOID = szOID_SUBJECT_ALT_NAME; + WARN("CERT_NAME_SEARCH_ALL_NAMES_FLAG used with type %lu.\n", type); + goto done; } - switch (dwType) + alt_name_issuer = flags & CERT_NAME_ISSUER_FLAG; + name = alt_name_issuer ? &cert->pCertInfo->Issuer : &cert->pCertInfo->Subject; + + switch (type) { case CERT_NAME_EMAIL_TYPE: { - CERT_ALT_NAME_INFO *info; - PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext, - altNameOID, CERT_ALT_NAME_RFC822_NAME, &info); + entry = cert_find_alt_name_entry(cert, alt_name_issuer, CERT_ALT_NAME_RFC822_NAME, &info); if (entry) { - if (!pszNameString) - ret = lstrlenW(entry->u.pwszRfc822Name) + 1; - else if (cchNameString) - { - ret = min(lstrlenW(entry->u.pwszRfc822Name), cchNameString - 1); - memcpy(pszNameString, entry->u.pwszRfc822Name, - ret * sizeof(WCHAR)); - pszNameString[ret++] = 0; - } + ret = copy_output_str(name_string, entry->u.pwszRfc822Name, name_len); + break; } - if (info) - LocalFree(info); - if (!ret) - ret = cert_get_name_from_rdn_attr(pCertContext->dwCertEncodingType, - name, szOID_RSA_emailAddr, pszNameString, cchNameString); + ret = cert_get_name_from_rdn_attr(cert->dwCertEncodingType, name, szOID_RSA_emailAddr, + name_string, name_len); break; } case CERT_NAME_RDN_TYPE: { - DWORD type = pvTypePara ? *(DWORD *)pvTypePara : 0; + DWORD param = type_para ? *(DWORD *)type_para : 0; if (name->cbData) - ret = CertNameToStrW(pCertContext->dwCertEncodingType, name, - type, pszNameString, cchNameString); + { + ret = CertNameToStrW(cert->dwCertEncodingType, name, param, name_string, name_len); + } else { - CERT_ALT_NAME_INFO *info; - PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext, - altNameOID, CERT_ALT_NAME_DIRECTORY_NAME, &info); + entry = cert_find_alt_name_entry(cert, alt_name_issuer, CERT_ALT_NAME_DIRECTORY_NAME, &info); if (entry) - ret = CertNameToStrW(pCertContext->dwCertEncodingType, - &entry->u.DirectoryName, type, pszNameString, cchNameString); - if (info) - LocalFree(info); + ret = CertNameToStrW(cert->dwCertEncodingType, &entry->u.DirectoryName, + param, name_string, name_len); } break; } case CERT_NAME_ATTR_TYPE: - ret = cert_get_name_from_rdn_attr(pCertContext->dwCertEncodingType, - name, pvTypePara, pszNameString, cchNameString); - if (!ret) - { - CERT_ALT_NAME_INFO *altInfo; - PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext, - altNameOID, CERT_ALT_NAME_DIRECTORY_NAME, &altInfo); + ret = cert_get_name_from_rdn_attr(cert->dwCertEncodingType, name, type_para, + name_string, name_len); + if (ret) break; - if (entry) - ret = cert_name_to_str_with_indent(X509_ASN_ENCODING, 0, - &entry->u.DirectoryName, 0, pszNameString, cchNameString); - if (altInfo) - LocalFree(altInfo); - } + entry = cert_find_alt_name_entry(cert, alt_name_issuer, CERT_ALT_NAME_DIRECTORY_NAME, &info); + + if (entry) + ret = cert_name_to_str_with_indent(X509_ASN_ENCODING, 0, &entry->u.DirectoryName, + 0, name_string, name_len); break; case CERT_NAME_SIMPLE_DISPLAY_TYPE: { - static const LPCSTR simpleAttributeOIDs[] = { szOID_COMMON_NAME, - szOID_ORGANIZATIONAL_UNIT_NAME, szOID_ORGANIZATION_NAME, - szOID_RSA_emailAddr }; + static const LPCSTR simpleAttributeOIDs[] = + { + szOID_COMMON_NAME, szOID_ORGANIZATIONAL_UNIT_NAME, szOID_ORGANIZATION_NAME, szOID_RSA_emailAddr + }; CERT_NAME_INFO *nameInfo = NULL; DWORD bytes = 0, i; - if (CryptDecodeObjectEx(pCertContext->dwCertEncodingType, X509_NAME, - name->pbData, name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &nameInfo, - &bytes)) + if (CryptDecodeObjectEx(cert->dwCertEncodingType, X509_NAME, name->pbData, name->cbData, + CRYPT_DECODE_ALLOC_FLAG, NULL, &nameInfo, &bytes)) { PCERT_RDN_ATTR nameAttr = NULL; for (i = 0; !nameAttr && i < ARRAY_SIZE(simpleAttributeOIDs); i++) nameAttr = CertFindRDNAttr(simpleAttributeOIDs[i], nameInfo); if (nameAttr) - ret = CertRDNValueToStrW(nameAttr->dwValueType, - &nameAttr->Value, pszNameString, cchNameString); + ret = rdn_value_to_strW(nameAttr->dwValueType, &nameAttr->Value, name_string, name_len, TRUE); LocalFree(nameInfo); } - if (!ret) - { - CERT_ALT_NAME_INFO *altInfo; - PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext, - altNameOID, CERT_ALT_NAME_RFC822_NAME, &altInfo); - - if (altInfo) - { - if (!entry && altInfo->cAltEntry) - entry = &altInfo->rgAltEntry[0]; - if (entry) - { - if (!pszNameString) - ret = lstrlenW(entry->u.pwszRfc822Name) + 1; - else if (cchNameString) - { - ret = min(lstrlenW(entry->u.pwszRfc822Name), - cchNameString - 1); - memcpy(pszNameString, entry->u.pwszRfc822Name, - ret * sizeof(WCHAR)); - pszNameString[ret++] = 0; - } - } - LocalFree(altInfo); - } - } + if (ret) break; + entry = cert_find_alt_name_entry(cert, alt_name_issuer, CERT_ALT_NAME_RFC822_NAME, &info); + if (!info) break; + if (!entry && info->cAltEntry) + entry = &info->rgAltEntry[0]; + if (entry) ret = copy_output_str(name_string, entry->u.pwszRfc822Name, name_len); break; } case CERT_NAME_FRIENDLY_DISPLAY_TYPE: { - DWORD cch = cchNameString; + DWORD len = name_len; - if (CertGetCertificateContextProperty(pCertContext, - CERT_FRIENDLY_NAME_PROP_ID, pszNameString, &cch)) - ret = cch; + if (CertGetCertificateContextProperty(cert, CERT_FRIENDLY_NAME_PROP_ID, name_string, &len)) + ret = len; else - ret = CertGetNameStringW(pCertContext, - CERT_NAME_SIMPLE_DISPLAY_TYPE, dwFlags, pvTypePara, pszNameString, - cchNameString); + ret = CertGetNameStringW(cert, CERT_NAME_SIMPLE_DISPLAY_TYPE, flags, + type_para, name_string, name_len); break; } case CERT_NAME_DNS_TYPE: { - CERT_ALT_NAME_INFO *info; - PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext, - altNameOID, CERT_ALT_NAME_DNS_NAME, &info); + unsigned int index = 0, len; - if (entry) + if (cert_get_alt_name_info(cert, alt_name_issuer, &info) + && (entry = cert_find_next_alt_name_entry(info, CERT_ALT_NAME_DNS_NAME, &index))) { - if (!pszNameString) - ret = lstrlenW(entry->u.pwszDNSName) + 1; - else if (cchNameString) + if (search_all_names) { - ret = min(lstrlenW(entry->u.pwszDNSName), cchNameString - 1); - memcpy(pszNameString, entry->u.pwszDNSName, ret * sizeof(WCHAR)); - pszNameString[ret++] = 0; + do + { + if (name_string && name_len == 1) break; + ret += len = copy_output_str(name_string, entry->u.pwszDNSName, name_len ? name_len - 1 : 0); + if (name_string && name_len) + { + name_string += len; + name_len -= len; + } + } + while ((entry = cert_find_next_alt_name_entry(info, CERT_ALT_NAME_DNS_NAME, &index))); } + else ret = copy_output_str(name_string, entry->u.pwszDNSName, name_len); } - if (info) - LocalFree(info); - if (!ret) - ret = cert_get_name_from_rdn_attr(pCertContext->dwCertEncodingType, - name, szOID_COMMON_NAME, pszNameString, cchNameString); - break; - } - case CERT_NAME_URL_TYPE: - { - CERT_ALT_NAME_INFO *info; - PCERT_ALT_NAME_ENTRY entry = cert_find_alt_name_entry(pCertContext, - altNameOID, CERT_ALT_NAME_URL, &info); - - if (entry) + else { - if (!pszNameString) - ret = lstrlenW(entry->u.pwszURL) + 1; - else if (cchNameString) + if (!search_all_names || name_len != 1) { - ret = min(lstrlenW(entry->u.pwszURL), cchNameString - 1); - memcpy(pszNameString, entry->u.pwszURL, ret * sizeof(WCHAR)); - pszNameString[ret++] = 0; + len = search_all_names && name_len ? name_len - 1 : name_len; + ret = cert_get_name_from_rdn_attr(cert->dwCertEncodingType, name, szOID_COMMON_NAME, + name_string, len); + if (name_string) name_string += ret; } } - if (info) - LocalFree(info); + + if (search_all_names) + { + if (name_string && name_len) *name_string = 0; + ++ret; + } + break; + } + case CERT_NAME_URL_TYPE: + { + if ((entry = cert_find_alt_name_entry(cert, alt_name_issuer, CERT_ALT_NAME_URL, &info))) + ret = copy_output_str(name_string, entry->u.pwszURL, name_len); break; } default: - FIXME("unimplemented for type %ld\n", dwType); + FIXME("unimplemented for type %lu.\n", type); ret = 0; + break; } done: + if (info) + LocalFree(info); + if (!ret) { - if (!pszNameString) - ret = 1; - else if (cchNameString) - { - pszNameString[0] = 0; - ret = 1; - } + ret = 1; + if (name_string && name_len) name_string[0] = 0; } return ret; } diff --git a/dlls/crypt32/tests/base64.c b/dlls/crypt32/tests/base64.c index a1517b294ad..e81a57c576d 100644 --- wine/dlls/crypt32/tests/base64.c +++ wine/dlls/crypt32/tests/base64.c @@ -23,7 +23,6 @@ #include #include -#include "wine/heap.h" #include "wine/test.h" #define CERT_HEADER "-----BEGIN CERTIFICATE-----\r\n" @@ -93,7 +92,7 @@ static WCHAR *strdupAtoW(const char *str) if (!str) return ret; len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); - ret = heap_alloc(len * sizeof(WCHAR)); + ret = malloc(len * sizeof(WCHAR)); if (ret) MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); return ret; @@ -128,7 +127,7 @@ static void encodeAndCompareBase64_A(const BYTE *toEncode, DWORD toEncodeLen, ok(ret, "CryptBinaryToStringA failed: %ld\n", GetLastError()); ok(strLen == strLen2, "Unexpected required length %lu, expected %lu.\n", strLen2, strLen); - str = heap_alloc(strLen); + str = malloc(strLen); /* Partially filled output buffer. */ strLen2 = strLen - 1; @@ -157,7 +156,7 @@ static void encodeAndCompareBase64_A(const BYTE *toEncode, DWORD toEncodeLen, if (trailer) ok(!strncmp(trailer, ptr, strlen(trailer)), "Expected trailer %s, got %s\n", trailer, ptr); - heap_free(str); + free(str); } static void encode_compare_base64_W(const BYTE *toEncode, DWORD toEncodeLen, DWORD format, @@ -196,7 +195,7 @@ static void encode_compare_base64_W(const BYTE *toEncode, DWORD toEncodeLen, DWO ok(ret, "CryptBinaryToStringW failed: %ld\n", GetLastError()); ok(strLen == strLen2, "Unexpected required length.\n"); - strW = heap_alloc(strLen * sizeof(WCHAR)); + strW = malloc(strLen * sizeof(WCHAR)); headerW = strdupAtoW(header); trailerW = strdupAtoW(trailer); @@ -231,9 +230,9 @@ static void encode_compare_base64_W(const BYTE *toEncode, DWORD toEncodeLen, DWO ok(!memcmp(trailerW, ptr, lstrlenW(trailerW)), "Expected trailer %s, got %s.\n", wine_dbgstr_w(trailerW), wine_dbgstr_w(ptr)); - heap_free(strW); - heap_free(headerW); - heap_free(trailerW); + free(strW); + free(headerW); + free(trailerW); } static DWORD binary_to_hex_len(DWORD binary_len, DWORD flags) @@ -267,6 +266,7 @@ static void test_CryptBinaryToString(void) BYTE input[256 * sizeof(WCHAR)]; DWORD strLen, strLen2, i, j, k; WCHAR *hex, *cmp, *ptr; + char *hex_a, *cmp_a; BOOL ret; ret = CryptBinaryToStringA(NULL, 0, 0, NULL, NULL); @@ -299,12 +299,12 @@ static void test_CryptBinaryToString(void) ok(strLen == tests[i].toEncodeLen, "Unexpected required length %lu.\n", strLen); strLen2 = strLen; - str = heap_alloc(strLen); + str = malloc(strLen); ret = CryptBinaryToStringA(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, str, &strLen2); ok(ret, "CryptBinaryToStringA failed: %ld\n", GetLastError()); ok(strLen == strLen2, "Expected length %lu, got %lu\n", strLen, strLen2); ok(!memcmp(str, tests[i].toEncode, tests[i].toEncodeLen), "Unexpected value\n"); - heap_free(str); + free(str); strLen = 0; ret = CryptBinaryToStringW(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, NULL, &strLen); @@ -312,12 +312,12 @@ static void test_CryptBinaryToString(void) ok(strLen == tests[i].toEncodeLen, "Unexpected required length %lu.\n", strLen); strLen2 = strLen; - strW = heap_alloc(strLen); + strW = malloc(strLen); ret = CryptBinaryToStringW(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, strW, &strLen2); ok(ret, "CryptBinaryToStringW failed: %ld\n", GetLastError()); ok(strLen == strLen2, "Expected length %lu, got %lu\n", strLen, strLen2); ok(!memcmp(strW, tests[i].toEncode, tests[i].toEncodeLen), "Unexpected value\n"); - heap_free(strW); + free(strW); encodeAndCompareBase64_A(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64, tests[i].base64, NULL, NULL); @@ -338,7 +338,7 @@ static void test_CryptBinaryToString(void) encode_compare_base64_W(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BASE64X509CRLHEADER, encodedW, X509_HEADER, X509_TRAILER); - heap_free(encodedW); + free(encodedW); } for (i = 0; i < ARRAY_SIZE(testsNoCR); i++) @@ -352,13 +352,13 @@ static void test_CryptBinaryToString(void) ok(ret, "CryptBinaryToStringA failed: %ld\n", GetLastError()); strLen2 = strLen; - str = heap_alloc(strLen); + str = malloc(strLen); ret = CryptBinaryToStringA(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen, CRYPT_STRING_BINARY | CRYPT_STRING_NOCR, str, &strLen2); ok(ret, "CryptBinaryToStringA failed: %ld\n", GetLastError()); ok(strLen == strLen2, "Expected length %ld, got %ld\n", strLen, strLen2); ok(!memcmp(str, testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen), "Unexpected value\n"); - heap_free(str); + free(str); encodeAndCompareBase64_A(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCR, testsNoCR[i].base64, NULL, NULL); @@ -383,7 +383,7 @@ static void test_CryptBinaryToString(void) CRYPT_STRING_BASE64X509CRLHEADER | CRYPT_STRING_NOCR, encodedW, X509_HEADER_NOCR, X509_TRAILER_NOCR); - heap_free(encodedW); + free(encodedW); } /* Systems that don't support HEXRAW format convert to BASE64 instead - 3 bytes in -> 4 chars + crlf + 1 null out. */ @@ -402,11 +402,17 @@ static void test_CryptBinaryToString(void) for (i = 0; i < ARRAY_SIZE(flags); i++) { + winetest_push_context("i %lu", i); strLen = 0; ret = CryptBinaryToStringW(input, sizeof(input), CRYPT_STRING_HEXRAW|flags[i], NULL, &strLen); ok(ret, "CryptBinaryToStringW failed: %ld\n", GetLastError()); ok(strLen > 0, "Unexpected string length.\n"); + strLen = 0; + ret = CryptBinaryToStringA(input, sizeof(input), CRYPT_STRING_HEXRAW|flags[i], NULL, &strLen); + ok(ret, "failed, error %ld.\n", GetLastError()); + ok(strLen > 0, "Unexpected string length.\n"); + strLen = ~0; ret = CryptBinaryToStringW(input, sizeof(input), CRYPT_STRING_HEXRAW|flags[i], NULL, &strLen); @@ -420,9 +426,12 @@ static void test_CryptBinaryToString(void) strLen2 += sizeof(input) * 2 + 1; ok(strLen == strLen2, "Expected length %ld, got %ld\n", strLen2, strLen); - hex = heap_alloc(strLen * sizeof(WCHAR)); + hex = malloc(strLen * sizeof(WCHAR)); + hex_a = malloc(strLen); + memset(hex, 0xcc, strLen * sizeof(WCHAR)); - ptr = cmp = heap_alloc(strLen * sizeof(WCHAR)); + ptr = cmp = malloc(strLen * sizeof(WCHAR)); + cmp_a = malloc(strLen); for (j = 0; j < ARRAY_SIZE(input); j++) { *ptr++ = hexdig[(input[j] >> 4) & 0xf]; @@ -438,6 +447,11 @@ static void test_CryptBinaryToString(void) *ptr++ = '\n'; } *ptr++ = 0; + + for (j = 0; cmp[j]; ++j) + cmp_a[j] = cmp[j]; + cmp_a[j] = 0; + ret = CryptBinaryToStringW(input, sizeof(input), CRYPT_STRING_HEXRAW|flags[i], hex, &strLen); ok(ret, "CryptBinaryToStringW failed: %ld\n", GetLastError()); @@ -445,6 +459,13 @@ static void test_CryptBinaryToString(void) ok(strLen == strLen2, "Expected length %ld, got %ld\n", strLen, strLen2); ok(!memcmp(hex, cmp, strLen * sizeof(WCHAR)), "Unexpected value\n"); + ++strLen; + ret = CryptBinaryToStringA(input, sizeof(input), CRYPT_STRING_HEXRAW | flags[i], + hex_a, &strLen); + ok(ret, "failed, error %ld.\n", GetLastError()); + ok(strLen == strLen2, "Expected length %ld, got %ld.\n", strLen, strLen2); + ok(!memcmp(hex_a, cmp_a, strLen), "Unexpected value.\n"); + /* adjusts size if buffer too big */ strLen *= 2; ret = CryptBinaryToStringW(input, sizeof(input), CRYPT_STRING_HEXRAW|flags[i], @@ -452,6 +473,12 @@ static void test_CryptBinaryToString(void) ok(ret, "CryptBinaryToStringW failed: %ld\n", GetLastError()); ok(strLen == strLen2, "Expected length %ld, got %ld\n", strLen, strLen2); + strLen *= 2; + ret = CryptBinaryToStringA(input, sizeof(input), CRYPT_STRING_HEXRAW|flags[i], + hex_a, &strLen); + ok(ret, "failed, error %ld.\n", GetLastError()); + ok(strLen == strLen2, "Expected length %ld, got %ld.\n", strLen, strLen2); + /* no writes if buffer too small */ strLen /= 2; strLen2 /= 2; @@ -465,8 +492,49 @@ static void test_CryptBinaryToString(void) ok(strLen == strLen2, "Expected length %ld, got %ld\n", strLen, strLen2); ok(!memcmp(hex, cmp, strLen * sizeof(WCHAR)), "Unexpected value\n"); - heap_free(hex); - heap_free(cmp); + SetLastError(0xdeadbeef); + memset(hex_a, 0xcc, strLen + 3); + ret = CryptBinaryToStringA(input, sizeof(input), CRYPT_STRING_HEXRAW | flags[i], + hex_a, &strLen); + ok(!ret && GetLastError() == ERROR_MORE_DATA,"got ret %d, error %lu.\n", ret, GetLastError()); + ok(strLen == strLen2, "Expected length %ld, got %ld.\n", strLen2, strLen); + /* Output consists of the number of full bytes which fit in plus terminating 0. */ + strLen = (strLen - 1) & ~1; + ok(!memcmp(hex_a, cmp_a, strLen), "Unexpected value\n"); + ok(!hex_a[strLen], "got %#x.\n", (unsigned char)hex_a[strLen]); + ok((unsigned char)hex_a[strLen + 1] == 0xcc, "got %#x.\n", (unsigned char)hex_a[strLen + 1]); + + /* Output is not filled if string length is less than 3. */ + strLen = 1; + memset(hex_a, 0xcc, strLen2); + ret = CryptBinaryToStringA(input, sizeof(input), CRYPT_STRING_HEXRAW | flags[i], + hex_a, &strLen); + ok(strLen == 1, "got %ld.\n", strLen); + ok((unsigned char)hex_a[0] == 0xcc, "got %#x.\n", (unsigned char)hex_a[strLen - 1]); + + strLen = 2; + memset(hex_a, 0xcc, strLen2); + ret = CryptBinaryToStringA(input, sizeof(input), CRYPT_STRING_HEXRAW | flags[i], + hex_a, &strLen); + ok(strLen == 2, "got %ld.\n", strLen); + ok((unsigned char)hex_a[0] == 0xcc, "got %#x.\n", (unsigned char)hex_a[0]); + ok((unsigned char)hex_a[1] == 0xcc, "got %#x.\n", (unsigned char)hex_a[1]); + + strLen = 3; + memset(hex_a, 0xcc, strLen2); + ret = CryptBinaryToStringA(input, sizeof(input), CRYPT_STRING_HEXRAW | flags[i], + hex_a, &strLen); + ok(strLen == 3, "got %ld.\n", strLen); + ok(hex_a[0] == 0x30, "got %#x.\n", (unsigned char)hex_a[0]); + ok(hex_a[1] == 0x30, "got %#x.\n", (unsigned char)hex_a[1]); + ok(!hex_a[2], "got %#x.\n", (unsigned char)hex_a[2]); + + free(hex); + free(hex_a); + free(cmp); + free(cmp_a); + + winetest_pop_context(); } for (k = 0; k < ARRAY_SIZE(sizes); k++) @@ -483,10 +551,10 @@ static void test_CryptBinaryToString(void) strLen2 = binary_to_hex_len(sizes[k], CRYPT_STRING_HEX | flags[i]); ok(strLen == strLen2, "%lu: Expected length %ld, got %ld\n", i, strLen2, strLen); - hex = heap_alloc(strLen * sizeof(WCHAR) + 256); + hex = malloc(strLen * sizeof(WCHAR) + 256); memset(hex, 0xcc, strLen * sizeof(WCHAR)); - ptr = cmp = heap_alloc(strLen * sizeof(WCHAR) + 256); + ptr = cmp = malloc(strLen * sizeof(WCHAR) + 256); for (j = 0; j < sizes[k]; j++) { *ptr++ = hexdig[(input[j] >> 4) & 0xf]; @@ -552,8 +620,8 @@ static void test_CryptBinaryToString(void) ok(strLen == strLen2, "%lu: Expected length %ld, got %ld\n", i, strLen, strLen2); ok(!memcmp(hex, cmp, strLen * sizeof(WCHAR)), "%lu: got %s\n", i, wine_dbgstr_wn(hex, strLen)); - heap_free(hex); - heap_free(cmp); + free(hex); + free(cmp); } } @@ -569,7 +637,7 @@ static void decodeAndCompareBase64_A(LPCSTR toDecode, LPCSTR header, len += strlen(header); if (trailer) len += strlen(trailer); - str = HeapAlloc(GetProcessHeap(), 0, len); + str = malloc(len); if (str) { LPBYTE buf; @@ -586,7 +654,7 @@ static void decodeAndCompareBase64_A(LPCSTR toDecode, LPCSTR header, ret = CryptStringToBinaryA(str, 0, useFormat, NULL, &bufLen, NULL, NULL); ok(ret, "CryptStringToBinaryA failed: %ld\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, bufLen); + buf = malloc(bufLen); if (buf) { DWORD skipped, usedFormat; @@ -605,7 +673,7 @@ static void decodeAndCompareBase64_A(LPCSTR toDecode, LPCSTR header, ok(skipped == 0, "Expected skipped 0, got %ld\n", skipped); ok(usedFormat == expectedFormat, "Expected format %ld, got %ld\n", expectedFormat, usedFormat); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } /* Check again, but with garbage up front */ @@ -625,7 +693,7 @@ static void decodeAndCompareBase64_A(LPCSTR toDecode, LPCSTR header, "Expected !ret and last error ERROR_INVALID_DATA, got ret=%d, error=%ld\n", ret, GetLastError()); if (ret) { - buf = HeapAlloc(GetProcessHeap(), 0, bufLen); + buf = malloc(bufLen); if (buf) { DWORD skipped, usedFormat; @@ -636,10 +704,10 @@ static void decodeAndCompareBase64_A(LPCSTR toDecode, LPCSTR header, ok(skipped == strlen(garbage), "Expected %d characters of \"%s\" skipped when trying format %08lx, got %ld (used format is %08lx)\n", lstrlenA(garbage), str, useFormat, skipped, usedFormat); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } - HeapFree(GetProcessHeap(), 0, str); + free(str); } } @@ -707,11 +775,145 @@ static const struct BadString badStrings[] = { { "-----BEGIN X509 CRL-----\r\nAA==\r\n", CRYPT_STRING_BASE64X509CRLHEADER }, }; -static void testStringToBinaryA(void) +static BOOL is_hex_string_special_char(WCHAR c) { - BOOL ret; + switch (c) + { + case '-': + case ',': + case ' ': + case '\t': + case '\r': + case '\n': + return TRUE; + + default: + return FALSE; + } +} + +static WCHAR wchar_from_str(BOOL wide, const void **str, DWORD *len) +{ + WCHAR c; + + if (!*len) + return 0; + + --*len; + if (wide) + c = *(*(const WCHAR **)str)++; + else + c = *(*(const char **)str)++; + + return c ? c : 0xffff; +} + +static BYTE digit_from_char(WCHAR c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + c = towlower(c); + if (c >= 'a' && c <= 'f') + return c - 'a' + 0xa; + return 0xff; +} + +static LONG string_to_hex(const void* str, BOOL wide, DWORD len, BYTE *hex, DWORD *hex_len, + DWORD *skipped, DWORD *ret_flags) +{ + unsigned int byte_idx = 0; + BYTE d1, d2; + WCHAR c; + + if (!str || !hex_len) + return ERROR_INVALID_PARAMETER; + + if (!len) + len = wide ? wcslen(str) : strlen(str); + + if (wide && !len) + return ERROR_INVALID_PARAMETER; + + if (skipped) + *skipped = 0; + if (ret_flags) + *ret_flags = 0; + + while ((c = wchar_from_str(wide, &str, &len)) && is_hex_string_special_char(c)) + ; + + while ((d1 = digit_from_char(c)) != 0xff) + { + if ((d2 = digit_from_char(wchar_from_str(wide, &str, &len))) == 0xff) + { + if (!hex) + *hex_len = 0; + return ERROR_INVALID_DATA; + } + + if (hex && byte_idx < *hex_len) + hex[byte_idx] = (d1 << 4) | d2; + + ++byte_idx; + + do + { + c = wchar_from_str(wide, &str, &len); + } while (c == '-' || c == ','); + } + + while (c) + { + if (!is_hex_string_special_char(c)) + { + if (!hex) + *hex_len = 0; + return ERROR_INVALID_DATA; + } + c = wchar_from_str(wide, &str, &len); + } + + if (hex && byte_idx > *hex_len) + return ERROR_MORE_DATA; + + if (ret_flags) + *ret_flags = CRYPT_STRING_HEX; + + *hex_len = byte_idx; + + return ERROR_SUCCESS; +} + +static void test_CryptStringToBinary(void) +{ + static const char *string_hex_tests[] = + { + "", + "-", + ",-", + "0", + "00", + "000", + "11220", + "1122q", + "q1122", + " aE\t\n\r\n", + "01-02", + "-,01-02", + "01-02-", + "aa,BB-ff,-,", + "1-2", + "010-02", + "aa,BBff,-,", + "aa,,-BB---ff,-,", + "010203040506070809q", + }; + + DWORD skipped, flags, expected_err, expected_len, expected_skipped, expected_flags; + BYTE buf[8], expected[8]; DWORD bufLen = 0, i; - BYTE buf[8]; + WCHAR str_w[64]; + BOOL ret, wide; ret = CryptStringToBinaryA(NULL, 0, 0, NULL, NULL, NULL, NULL); ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, @@ -891,10 +1093,254 @@ static void testStringToBinaryA(void) CRYPT_STRING_ANY, CRYPT_STRING_BASE64HEADER, testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen); } + + /* CRYPT_STRING_HEX */ + + ret = CryptStringToBinaryW(L"01", 2, CRYPT_STRING_HEX, NULL, NULL, NULL, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got ret %d, error %lu.\n", ret, GetLastError()); + if (0) + { + /* access violation on Windows. */ + CryptStringToBinaryA("01", 2, CRYPT_STRING_HEX, NULL, NULL, NULL, NULL); + } + + bufLen = 8; + ret = CryptStringToBinaryW(L"0102", 2, CRYPT_STRING_HEX, NULL, &bufLen, NULL, NULL); + ok(ret, "got error %lu.\n", GetLastError()); + ok(bufLen == 1, "got length %lu.\n", bufLen); + + bufLen = 8; + ret = CryptStringToBinaryW(NULL, 0, CRYPT_STRING_HEX, NULL, &bufLen, NULL, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 8, "got length %lu.\n", bufLen); + + bufLen = 8; + ret = CryptStringToBinaryA(NULL, 0, CRYPT_STRING_HEX, NULL, &bufLen, NULL, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 8, "got length %lu.\n", bufLen); + + bufLen = 8; + ret = CryptStringToBinaryW(L"0102", 3, CRYPT_STRING_HEX, NULL, &bufLen, NULL, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(!bufLen, "got length %lu.\n", bufLen); + + bufLen = 8; + buf[0] = 0xcc; + ret = CryptStringToBinaryW(L"0102", 3, CRYPT_STRING_HEX, buf, &bufLen, NULL, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 8, "got length %lu.\n", bufLen); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + + bufLen = 8; + buf[0] = 0xcc; + ret = CryptStringToBinaryW(L"0102", 2, CRYPT_STRING_HEX, buf, &bufLen, NULL, NULL); + ok(ret, "got error %lu.\n", GetLastError()); + ok(bufLen == 1, "got length %lu.\n", bufLen); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + + bufLen = 8; + buf[0] = buf[1] = 0xcc; + ret = CryptStringToBinaryA("01\0 02", 4, CRYPT_STRING_HEX, buf, &bufLen, NULL, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 8, "got length %lu.\n", bufLen); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[1] %#x.\n", buf[1]); + + bufLen = 8; + buf[0] = buf[1] = 0xcc; + ret = CryptStringToBinaryW(L"01\0 02", 4, CRYPT_STRING_HEX, buf, &bufLen, NULL, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 8, "got length %lu.\n", bufLen); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[1] %#x.\n", buf[1]); + + bufLen = 1; + buf[0] = 0xcc; + skipped = 0xdeadbeef; + flags = 0xdeadbeef; + ret = CryptStringToBinaryW(L"0102", 4, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + ok(!ret && GetLastError() == ERROR_MORE_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 1, "got length %lu.\n", bufLen); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + ok(!flags, "got flags %lu.\n", flags); + ok(!skipped, "got skipped %lu.\n", skipped); + + for (i = 0; i < ARRAY_SIZE(string_hex_tests); ++i) + { + for (wide = 0; wide < 2; ++wide) + { + if (wide) + { + unsigned int j = 0; + + while ((str_w[j] = string_hex_tests[i][j])) + ++j; + } + winetest_push_context("test %lu, %s", i, wide ? debugstr_w(str_w) + : debugstr_a(string_hex_tests[i])); + + expected_len = 0xdeadbeef; + expected_skipped = 0xdeadbeef; + expected_flags = 0xdeadbeef; + expected_err = string_to_hex(wide ? (void *)str_w : (void *)string_hex_tests[i], wide, 0, NULL, + &expected_len, &expected_skipped, &expected_flags); + + bufLen = 0xdeadbeef; + skipped = 0xdeadbeef; + flags = 0xdeadbeef; + SetLastError(0xdeadbeef); + if (wide) + ret = CryptStringToBinaryW(str_w, 0, CRYPT_STRING_HEX, NULL, &bufLen, &skipped, &flags); + else + ret = CryptStringToBinaryA(string_hex_tests[i], 0, CRYPT_STRING_HEX, NULL, &bufLen, &skipped, &flags); + + ok(bufLen == expected_len, "got length %lu.\n", bufLen); + ok(skipped == expected_skipped, "got skipped %lu.\n", skipped); + ok(flags == expected_flags, "got flags %lu.\n", flags); + + if (expected_err) + ok(!ret && GetLastError() == expected_err, "got ret %d, error %lu.\n", ret, GetLastError()); + else + ok(ret, "got error %lu.\n", GetLastError()); + + memset(expected, 0xcc, sizeof(expected)); + expected_len = 8; + expected_skipped = 0xdeadbeef; + expected_flags = 0xdeadbeef; + expected_err = string_to_hex(wide ? (void *)str_w : (void *)string_hex_tests[i], wide, 0, expected, + &expected_len, &expected_skipped, &expected_flags); + + memset(buf, 0xcc, sizeof(buf)); + bufLen = 8; + skipped = 0xdeadbeef; + flags = 0xdeadbeef; + SetLastError(0xdeadbeef); + if (wide) + ret = CryptStringToBinaryW(str_w, 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + else + ret = CryptStringToBinaryA(string_hex_tests[i], 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + + ok(!memcmp(buf, expected, sizeof(buf)), "data does not match, buf[0] %#x, buf[1] %#x.\n", buf[0], buf[1]); + ok(bufLen == expected_len, "got length %lu.\n", bufLen); + if (expected_err) + ok(!ret && GetLastError() == expected_err, "got ret %d, error %lu.\n", ret, GetLastError()); + else + ok(ret, "got error %lu.\n", GetLastError()); + + ok(bufLen == expected_len, "got length %lu.\n", bufLen); + ok(skipped == expected_skipped, "got skipped %lu.\n", skipped); + ok(flags == expected_flags, "got flags %lu.\n", flags); + + winetest_pop_context(); + } + } + + bufLen = 1; + SetLastError(0xdeadbeef); + skipped = 0xdeadbeef; + flags = 0xdeadbeef; + memset(buf, 0xcc, sizeof(buf)); + ret = CryptStringToBinaryA("0102", 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + ok(!ret && GetLastError() == ERROR_MORE_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 1, "got length %lu.\n", bufLen); + ok(!skipped, "got skipped %lu.\n", skipped); + ok(!flags, "got flags %lu.\n", flags); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[1] %#x.\n", buf[1]); + + bufLen = 1; + SetLastError(0xdeadbeef); + skipped = 0xdeadbeef; + flags = 0xdeadbeef; + memset(buf, 0xcc, sizeof(buf)); + ret = CryptStringToBinaryA("0102q", 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + ok(!ret && GetLastError() == ERROR_INVALID_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 1, "got length %lu.\n", bufLen); + ok(!skipped, "got skipped %lu.\n", skipped); + ok(!flags, "got flags %lu.\n", flags); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[1] %#x.\n", buf[1]); + + bufLen = 1; + SetLastError(0xdeadbeef); + skipped = 0xdeadbeef; + flags = 0xdeadbeef; + memset(buf, 0xcc, sizeof(buf)); + ret = CryptStringToBinaryW(L"0102q", 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + ok(!ret && GetLastError() == ERROR_INVALID_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(bufLen == 1, "got length %lu.\n", bufLen); + ok(!skipped, "got skipped %lu.\n", skipped); + ok(!flags, "got flags %lu.\n", flags); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[1] %#x.\n", buf[1]); + + bufLen = 1; + SetLastError(0xdeadbeef); + skipped = 0xdeadbeef; + flags = 0xdeadbeef; + memset(buf, 0xcc, sizeof(buf)); + ret = CryptStringToBinaryW(L"0102", 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + ok(bufLen == 1, "got length %lu.\n", bufLen); + ok(!ret && GetLastError() == ERROR_MORE_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + ok(buf[0] == 1, "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[1] %#x.\n", buf[1]); + + /* It looks like Windows is normalizing Unicode strings in some way which depending on locale may result in + * some invalid characters in 128-255 range being converted into sequences starting with valid hex numbers. + * Just avoiding characters in the 128-255 range in test. */ + for (i = 1; i < 128; ++i) + { + char str_a[16]; + + for (wide = 0; wide < 2; ++wide) + { + if (wide) + { + str_w[0] = i; + wcscpy(str_w + 1, L"00"); + } + else + { + str_a[0] = i; + strcpy(str_a + 1, "00"); + } + + winetest_push_context("char %#lx, %s", i, wide ? debugstr_w(str_w) : debugstr_a(str_a)); + + bufLen = 1; + buf[0] = buf[1] = 0xcc; + SetLastError(0xdeadbeef); + if (wide) + ret = CryptStringToBinaryW(str_w, 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + else + ret = CryptStringToBinaryA(str_a, 0, CRYPT_STRING_HEX, buf, &bufLen, &skipped, &flags); + ok(bufLen == 1, "got length %lu.\n", bufLen); + if (is_hex_string_special_char(i)) + { + ok(ret, "got error %lu.\n", GetLastError()); + ok(!buf[0], "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[1] %#x.\n", buf[1]); + } + else + { + ok(!ret && GetLastError() == ERROR_INVALID_DATA, "got ret %d, error %lu.\n", ret, GetLastError()); + if (isdigit(i) || (tolower(i) >= 'a' && tolower(i) <= 'f')) + { + ok(buf[0] == (digit_from_char(i) << 4), "got buf[0] %#x.\n", buf[0]); + ok(buf[1] == 0xcc, "got buf[0] %#x.\n", buf[1]); + } + else + { + ok(buf[0] == 0xcc, "got buf[0] %#x.\n", buf[0]); + } + } + winetest_pop_context(); + } + } } START_TEST(base64) { test_CryptBinaryToString(); - testStringToBinaryA(); + test_CryptStringToBinary(); } diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c index 3cdb5e5ceea..882bb4a0723 100644 --- wine/dlls/crypt32/tests/cert.c +++ wine/dlls/crypt32/tests/cert.c @@ -554,7 +554,7 @@ static void testCertProperties(void) ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", GetLastError()); if (ret) { - LPBYTE buf = HeapAlloc(GetProcessHeap(), 0, size); + LPBYTE buf = malloc(size); if (buf) { @@ -563,7 +563,7 @@ static void testCertProperties(void) ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", GetLastError()); ok(!memcmp(buf, subjectKeyId, size), "Unexpected subject key id\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } CertFreeCertificateContext(context); @@ -1640,7 +1640,7 @@ static void testGetIssuerCert(void) size = 0; ok(CertStrToNameW(X509_ASN_ENCODING, L"CN=dummy, T=Test", CERT_X500_NAME_STR, NULL, NULL, &size, NULL), "CertStrToName should have worked\n"); - certencoded = HeapAlloc(GetProcessHeap(), 0, size); + certencoded = malloc(size); ok(CertStrToNameW(X509_ASN_ENCODING, L"CN=dummy, T=Test", CERT_X500_NAME_STR, NULL, certencoded, &size, NULL), "CertStrToName should have worked\n"); certsubject.pbData = certencoded; @@ -1663,7 +1663,7 @@ static void testGetIssuerCert(void) CertFreeCertificateContext(cert2); CertFreeCertificateContext(cert3); CertCloseStore(store, 0); - HeapFree(GetProcessHeap(), 0, certencoded); + free(certencoded); /* Test root storage self-signed certificate */ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"ROOT"); @@ -1913,7 +1913,7 @@ static void testVerifyCertSig(HCRYPTPROV csp, const CRYPT_DATA_BLOB *toBeSigned, } CryptExportPublicKeyInfoEx(csp, AT_SIGNATURE, X509_ASN_ENCODING, (LPSTR)sigOID, 0, NULL, NULL, &pubKeySize); - pubKeyInfo = HeapAlloc(GetProcessHeap(), 0, pubKeySize); + pubKeyInfo = malloc(pubKeySize); if (pubKeyInfo) { ret = CryptExportPublicKeyInfoEx(csp, AT_SIGNATURE, @@ -1927,7 +1927,7 @@ static void testVerifyCertSig(HCRYPTPROV csp, const CRYPT_DATA_BLOB *toBeSigned, ok(ret, "CryptVerifyCertificateSignature failed: %08lx\n", GetLastError()); } - HeapFree(GetProcessHeap(), 0, pubKeyInfo); + free(pubKeyInfo); } LocalFree(cert); } @@ -2000,7 +2000,7 @@ static void testVerifyCertSigEx(HCRYPTPROV csp, const CRYPT_DATA_BLOB *toBeSigne */ CryptExportPublicKeyInfoEx(csp, AT_SIGNATURE, X509_ASN_ENCODING, (LPSTR)sigOID, 0, NULL, NULL, &size); - pubKeyInfo = HeapAlloc(GetProcessHeap(), 0, size); + pubKeyInfo = malloc(size); if (pubKeyInfo) { ret = CryptExportPublicKeyInfoEx(csp, AT_SIGNATURE, @@ -2014,7 +2014,7 @@ static void testVerifyCertSigEx(HCRYPTPROV csp, const CRYPT_DATA_BLOB *toBeSigne ok(ret, "CryptVerifyCertificateSignatureEx failed: %08lx\n", GetLastError()); } - HeapFree(GetProcessHeap(), 0, pubKeyInfo); + free(pubKeyInfo); } LocalFree(cert); } @@ -2114,7 +2114,7 @@ static void testSignAndEncodeCert(void) /* oid_rsa_md5 not present in some win2k */ if (ret) { - LPBYTE buf = HeapAlloc(GetProcessHeap(), 0, size); + LPBYTE buf = malloc(size); if (buf) { @@ -2135,7 +2135,7 @@ static void testSignAndEncodeCert(void) else if (size == sizeof(md5SignedEmptyCertNoNull)) ok(!memcmp(buf, md5SignedEmptyCertNoNull, size), "Unexpected value\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } } @@ -2188,7 +2188,7 @@ static void testCreateSelfSignCert(void) ok(ret && size, "Expected non-zero key provider info\n"); if (size) { - PCRYPT_KEY_PROV_INFO pInfo = HeapAlloc(GetProcessHeap(), 0, size); + PCRYPT_KEY_PROV_INFO pInfo = malloc(size); if (pInfo) { @@ -2206,7 +2206,7 @@ static void testCreateSelfSignCert(void) ok(pInfo->dwKeySpec == AT_SIGNATURE, "Expected AT_SIGNATURE, got %ld\n", pInfo->dwKeySpec); } - HeapFree(GetProcessHeap(), 0, pInfo); + free(pInfo); } } @@ -2262,7 +2262,7 @@ static void testCreateSelfSignCert(void) ok(ret && size, "Expected non-zero key provider info\n"); if (size) { - PCRYPT_KEY_PROV_INFO pInfo = HeapAlloc(GetProcessHeap(), 0, size); + PCRYPT_KEY_PROV_INFO pInfo = malloc(size); if (pInfo) { @@ -2280,7 +2280,7 @@ static void testCreateSelfSignCert(void) ok(pInfo->dwKeySpec == AT_SIGNATURE, "Expected AT_SIGNATURE, got %ld\n", pInfo->dwKeySpec); } - HeapFree(GetProcessHeap(), 0, pInfo); + free(pInfo); } } @@ -2309,7 +2309,7 @@ static void testCreateSelfSignCert(void) ok(ret && size, "Expected non-zero key provider info\n"); if (size) { - PCRYPT_KEY_PROV_INFO pInfo = HeapAlloc(GetProcessHeap(), 0, size); + PCRYPT_KEY_PROV_INFO pInfo = malloc(size); if (pInfo) { @@ -2327,7 +2327,7 @@ static void testCreateSelfSignCert(void) ok(pInfo->dwKeySpec == AT_KEYEXCHANGE, "Expected AT_KEYEXCHANGE, got %ld\n", pInfo->dwKeySpec); } - HeapFree(GetProcessHeap(), 0, pInfo); + free(pInfo); } } @@ -2386,7 +2386,7 @@ static void testCreateSelfSignCert(void) ok(ret && size, "Expected non-zero key provider info\n"); if (size) { - PCRYPT_KEY_PROV_INFO pInfo = HeapAlloc(GetProcessHeap(), 0, size); + PCRYPT_KEY_PROV_INFO pInfo = malloc(size); if (pInfo) { @@ -2404,7 +2404,7 @@ static void testCreateSelfSignCert(void) ok(pInfo->dwKeySpec == AT_KEYEXCHANGE, "Expected AT_KEYEXCHANGE, got %ld\n", pInfo->dwKeySpec); } - HeapFree(GetProcessHeap(), 0, pInfo); + free(pInfo); } } @@ -2627,7 +2627,7 @@ static void testKeyUsage(void) ret = CertGetEnhancedKeyUsage(context, CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG, NULL, &bufSize); ok(ret, "CertGetEnhancedKeyUsage failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, bufSize); + buf = malloc(bufSize); if (buf) { PCERT_ENHKEY_USAGE pUsage = (PCERT_ENHKEY_USAGE)buf; @@ -2644,11 +2644,11 @@ static void testKeyUsage(void) ok(!strcmp(pUsage->rgpszUsageIdentifier[i], keyUsages[i]), "Expected %s, got %s\n", keyUsages[i], pUsage->rgpszUsageIdentifier[i]); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } ret = CertGetEnhancedKeyUsage(context, 0, NULL, &bufSize); ok(ret, "CertGetEnhancedKeyUsage failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, bufSize); + buf = malloc(bufSize); if (buf) { PCERT_ENHKEY_USAGE pUsage = (PCERT_ENHKEY_USAGE)buf; @@ -2668,7 +2668,7 @@ static void testKeyUsage(void) ok(!strcmp(pUsage->rgpszUsageIdentifier[i], keyUsages[i]), "Expected %s, got %s\n", keyUsages[i], pUsage->rgpszUsageIdentifier[i]); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } /* Shouldn't find it as an extended property */ ret = CertGetEnhancedKeyUsage(context, @@ -2681,7 +2681,7 @@ static void testKeyUsage(void) GetLastError()); ret = CertGetEnhancedKeyUsage(context, 0, NULL, &bufSize); ok(ret, "CertGetEnhancedKeyUsage failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, bufSize); + buf = malloc(bufSize); if (buf) { PCERT_ENHKEY_USAGE pUsage = (PCERT_ENHKEY_USAGE)buf; @@ -2696,13 +2696,13 @@ static void testKeyUsage(void) ok(!strcmp(pUsage->rgpszUsageIdentifier[0], szOID_RSA_RSA), "Expected %s, got %s\n", szOID_RSA_RSA, pUsage->rgpszUsageIdentifier[0]); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } /* But querying the cert directly returns its usage */ ret = CertGetEnhancedKeyUsage(context, CERT_FIND_EXT_ONLY_ENHKEY_USAGE_FLAG, NULL, &bufSize); ok(ret, "CertGetEnhancedKeyUsage failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, bufSize); + buf = malloc(bufSize); if (buf) { PCERT_ENHKEY_USAGE pUsage = (PCERT_ENHKEY_USAGE)buf; @@ -2718,7 +2718,7 @@ static void testKeyUsage(void) ok(!strcmp(pUsage->rgpszUsageIdentifier[i], keyUsages[i]), "Expected %s, got %s\n", keyUsages[i], pUsage->rgpszUsageIdentifier[i]); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } /* And removing the only usage identifier in the extended property * results in the cert's key usage being found. @@ -2727,7 +2727,7 @@ static void testKeyUsage(void) ok(ret, "CertRemoveEnhancedKeyUsage failed: %08lx\n", GetLastError()); ret = CertGetEnhancedKeyUsage(context, 0, NULL, &bufSize); ok(ret, "CertGetEnhancedKeyUsage failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, bufSize); + buf = malloc(bufSize); if (buf) { PCERT_ENHKEY_USAGE pUsage = (PCERT_ENHKEY_USAGE)buf; @@ -2743,7 +2743,7 @@ static void testKeyUsage(void) ok(!strcmp(pUsage->rgpszUsageIdentifier[i], keyUsages[i]), "Expected %s, got %s\n", keyUsages[i], pUsage->rgpszUsageIdentifier[i]); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } CertFreeCertificateContext(context); @@ -2810,7 +2810,7 @@ static void testGetValidUsages(void) ok(ret, "CertGetValidUsages failed: %08lx\n", GetLastError()); ok(numOIDs == 3, "Expected 3, got %d\n", numOIDs); ok(size, "Expected non-zero size\n"); - oids = HeapAlloc(GetProcessHeap(), 0, size); + oids = malloc(size); if (oids) { int i; @@ -2825,7 +2825,7 @@ static void testGetValidUsages(void) for (i = 0; i < numOIDs; i++) ok(!lstrcmpA(oids[i], expectedOIDs[i]), "unexpected OID %s\n", oids[i]); - HeapFree(GetProcessHeap(), 0, oids); + free(oids); } numOIDs = 0xdeadbeef; /* Oddly enough, this crashes when the number of contexts is not 1: @@ -2837,7 +2837,7 @@ static void testGetValidUsages(void) ok(ret, "CertGetValidUsages failed: %08lx\n", GetLastError()); ok(numOIDs == 3, "Expected 3, got %d\n", numOIDs); ok(size, "Expected non-zero size\n"); - oids = HeapAlloc(GetProcessHeap(), 0, size); + oids = malloc(size); if (oids) { int i; @@ -2847,7 +2847,7 @@ static void testGetValidUsages(void) for (i = 0; i < numOIDs; i++) ok(!lstrcmpA(oids[i], expectedOIDs[i]), "unexpected OID %s\n", oids[i]); - HeapFree(GetProcessHeap(), 0, oids); + free(oids); } numOIDs = 0xdeadbeef; size = 0; @@ -2855,7 +2855,7 @@ static void testGetValidUsages(void) ok(ret, "CertGetValidUsages failed: %08lx\n", GetLastError()); ok(numOIDs == 2, "Expected 2, got %d\n", numOIDs); ok(size, "Expected non-zero size\n"); - oids = HeapAlloc(GetProcessHeap(), 0, size); + oids = malloc(size); if (oids) { int i; @@ -2865,7 +2865,7 @@ static void testGetValidUsages(void) for (i = 0; i < numOIDs; i++) ok(!lstrcmpA(oids[i], expectedOIDs2[i]), "unexpected OID %s\n", oids[i]); - HeapFree(GetProcessHeap(), 0, oids); + free(oids); } numOIDs = 0xdeadbeef; size = 0; @@ -2873,7 +2873,7 @@ static void testGetValidUsages(void) ok(ret, "CertGetValidUsages failed: %08lx\n", GetLastError()); ok(numOIDs == 2, "Expected 2, got %d\n", numOIDs); ok(size, "Expected non-zero size\n"); - oids = HeapAlloc(GetProcessHeap(), 0, size); + oids = malloc(size); if (oids) { int i; @@ -2883,7 +2883,7 @@ static void testGetValidUsages(void) for (i = 0; i < numOIDs; i++) ok(!lstrcmpA(oids[i], expectedOIDs2[i]), "unexpected OID %s\n", oids[i]); - HeapFree(GetProcessHeap(), 0, oids); + free(oids); } CertFreeCertificateContext(contexts[0]); CertFreeCertificateContext(contexts[1]); @@ -3537,6 +3537,520 @@ static const BYTE rootSignedCRL[] = { 0xd5,0xbc,0xb0,0xd5,0xa5,0x9c,0x1b,0x72,0xc3,0x0f,0xa3,0xe3,0x3c,0xf0,0xc3, 0x91,0xe8,0x93,0x4f,0xd4,0x2f }; +static const BYTE ocsp_cert[] = { + 0x30, 0x82, 0x06, 0xcd, 0x30, 0x82, 0x05, 0xb5, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x08, 0x49, 0x8f, 0x6d, 0xd9, 0xef, 0xfb, 0x40, 0x55, + 0x1e, 0xac, 0x54, 0x54, 0x87, 0xc1, 0xb1, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x4f, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x44, + 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x4c, 0x53, 0x20, + 0x52, 0x53, 0x41, 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, + 0x30, 0x32, 0x30, 0x20, 0x43, 0x41, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x32, + 0x31, 0x30, 0x34, 0x32, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, + 0x17, 0x0d, 0x32, 0x32, 0x30, 0x35, 0x32, 0x39, 0x32, 0x33, 0x35, 0x39, + 0x35, 0x39, 0x5a, 0x30, 0x6b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x13, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, + 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, + 0x13, 0x08, 0x42, 0x65, 0x6c, 0x6c, 0x65, 0x76, 0x75, 0x65, 0x31, 0x14, + 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x56, 0x61, 0x6c, + 0x76, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x2e, 0x31, 0x1e, 0x30, 0x1c, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x15, 0x2a, 0x2e, 0x63, 0x6d, 0x2e, + 0x73, 0x74, 0x65, 0x61, 0x6d, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x65, 0x64, + 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xcd, 0x98, 0x0c, 0x13, 0xb2, 0xb9, 0xf2, 0xa5, 0xc6, 0x52, 0xad, + 0xf9, 0x4d, 0xcf, 0x1e, 0x2b, 0x74, 0x05, 0xd1, 0x2e, 0x95, 0xc3, 0x9d, + 0x9b, 0x03, 0x2a, 0xc6, 0x65, 0x1e, 0xda, 0x5d, 0x57, 0x3c, 0x61, 0xa1, + 0x3d, 0xa3, 0xe7, 0x0c, 0xdd, 0xb1, 0x6b, 0x30, 0x97, 0x99, 0xc7, 0x77, + 0xab, 0xc2, 0xb0, 0x0a, 0x5b, 0x1c, 0x86, 0x55, 0x42, 0x25, 0xa8, 0x4e, + 0xe2, 0x61, 0xfe, 0x88, 0x10, 0x25, 0xf5, 0x8e, 0x9c, 0x0f, 0xc7, 0xa5, + 0xef, 0x9d, 0xd5, 0xf0, 0x2a, 0xf2, 0x31, 0x59, 0x59, 0xfc, 0xe0, 0x1f, + 0x8f, 0xb4, 0xa1, 0x06, 0x32, 0x04, 0x37, 0x3d, 0x9d, 0xad, 0xc1, 0xe0, + 0x00, 0x3d, 0x8d, 0x60, 0x4c, 0x9e, 0x6a, 0x1f, 0xd2, 0xf6, 0xf8, 0x86, + 0x0b, 0x11, 0x7b, 0xfd, 0x75, 0xae, 0x20, 0x9b, 0xca, 0x52, 0x5f, 0x4e, + 0xad, 0x2e, 0xa2, 0xce, 0xed, 0x35, 0x08, 0x23, 0xa8, 0x6e, 0x61, 0x7e, + 0x18, 0x1a, 0x6a, 0xd9, 0xe0, 0x3b, 0x52, 0x64, 0xe9, 0x2c, 0x81, 0x8f, + 0xbc, 0x4b, 0x48, 0xd1, 0x7a, 0x3e, 0x02, 0x9c, 0xad, 0x87, 0x73, 0xae, + 0xaa, 0xea, 0x32, 0xfb, 0x07, 0x4e, 0xcb, 0xe9, 0xac, 0xac, 0x50, 0x0f, + 0x49, 0xb7, 0x23, 0x3b, 0x1f, 0xb2, 0x24, 0x46, 0x78, 0x32, 0x11, 0x9e, + 0xa2, 0xeb, 0xd8, 0x8b, 0x7e, 0x56, 0x92, 0xaa, 0x29, 0xbd, 0x55, 0xc8, + 0x3e, 0x69, 0xe2, 0x56, 0xf4, 0x24, 0x58, 0x7b, 0xf8, 0xb0, 0xbb, 0x72, + 0xb7, 0x38, 0x34, 0xe3, 0x0f, 0x30, 0xf4, 0xfd, 0x44, 0xf1, 0x53, 0x0f, + 0xc5, 0x31, 0xd6, 0xad, 0x45, 0xbf, 0x57, 0x2c, 0x4c, 0xe5, 0x1a, 0xc0, + 0x08, 0x25, 0x88, 0x2f, 0xca, 0x07, 0x2e, 0x35, 0x31, 0xa7, 0x40, 0x3a, + 0x71, 0x1d, 0xba, 0x09, 0xf8, 0x76, 0x6c, 0x69, 0xb2, 0x89, 0xd7, 0xbe, + 0xca, 0x9d, 0xf5, 0xd4, 0x7d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, + 0x03, 0x87, 0x30, 0x82, 0x03, 0x83, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, + 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xb7, 0x6b, 0xa2, 0xea, 0xa8, + 0xaa, 0x84, 0x8c, 0x79, 0xea, 0xb4, 0xda, 0x0f, 0x98, 0xb2, 0xc5, 0x95, + 0x76, 0xb9, 0xf4, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x22, 0x68, 0x57, 0xb9, 0xc0, 0x1f, 0xce, 0xa6, 0xbf, 0xb6, + 0x55, 0xcb, 0x2a, 0x1b, 0xe6, 0xe0, 0x76, 0x94, 0x07, 0x06, 0x30, 0x35, + 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x2e, 0x30, 0x2c, 0x82, 0x15, 0x2a, + 0x2e, 0x63, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x70, 0x6f, 0x77, + 0x65, 0x72, 0x65, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x82, 0x13, 0x63, 0x6d, + 0x2e, 0x73, 0x74, 0x65, 0x61, 0x6d, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x65, + 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x05, 0xa0, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, + 0x05, 0x07, 0x03, 0x02, 0x30, 0x81, 0x8b, 0x06, 0x03, 0x55, 0x1d, 0x1f, + 0x04, 0x81, 0x83, 0x30, 0x81, 0x80, 0x30, 0x3e, 0xa0, 0x3c, 0xa0, 0x3a, + 0x86, 0x38, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, + 0x33, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x54, + 0x4c, 0x53, 0x52, 0x53, 0x41, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, + 0x30, 0x32, 0x30, 0x43, 0x41, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x3e, + 0xa0, 0x3c, 0xa0, 0x3a, 0x86, 0x38, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x63, 0x72, 0x6c, 0x34, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x54, 0x4c, 0x53, 0x52, 0x53, 0x41, 0x53, 0x48, 0x41, + 0x32, 0x35, 0x36, 0x32, 0x30, 0x32, 0x30, 0x43, 0x41, 0x31, 0x2e, 0x63, + 0x72, 0x6c, 0x30, 0x3e, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x37, 0x30, + 0x35, 0x30, 0x33, 0x06, 0x06, 0x67, 0x81, 0x0c, 0x01, 0x02, 0x02, 0x30, + 0x29, 0x30, 0x27, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, + 0x01, 0x16, 0x1b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x43, 0x50, 0x53, 0x30, 0x7d, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x71, 0x30, 0x6f, 0x30, 0x24, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, + 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x30, 0x47, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, + 0x86, 0x3b, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x61, 0x63, + 0x65, 0x72, 0x74, 0x73, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, + 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, + 0x72, 0x74, 0x54, 0x4c, 0x53, 0x52, 0x53, 0x41, 0x53, 0x48, 0x41, 0x32, + 0x35, 0x36, 0x32, 0x30, 0x32, 0x30, 0x43, 0x41, 0x31, 0x2e, 0x63, 0x72, + 0x74, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x02, 0x30, 0x00, 0x30, 0x82, 0x01, 0x7e, 0x06, 0x0a, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0xd6, 0x79, 0x02, 0x04, 0x02, 0x04, 0x82, 0x01, 0x6e, 0x04, + 0x82, 0x01, 0x6a, 0x01, 0x68, 0x00, 0x76, 0x00, 0x29, 0x79, 0xbe, 0xf0, + 0x9e, 0x39, 0x39, 0x21, 0xf0, 0x56, 0x73, 0x9f, 0x63, 0xa5, 0x77, 0xe5, + 0xbe, 0x57, 0x7d, 0x9c, 0x60, 0x0a, 0xf8, 0xf9, 0x4d, 0x5d, 0x26, 0x5c, + 0x25, 0x5d, 0xc7, 0x84, 0x00, 0x00, 0x01, 0x79, 0x19, 0x43, 0x10, 0x65, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x47, 0x30, 0x45, 0x02, 0x21, 0x00, 0x93, + 0x5f, 0x66, 0xe4, 0xfe, 0x76, 0x25, 0xe6, 0x07, 0x74, 0xa1, 0x8b, 0x7f, + 0x37, 0xad, 0xb1, 0x40, 0x8f, 0x20, 0x66, 0x71, 0x57, 0x14, 0x2c, 0x2e, + 0x28, 0xe0, 0xb2, 0x95, 0xd5, 0x19, 0xd0, 0x02, 0x20, 0x32, 0xd1, 0xa8, + 0x59, 0xfd, 0x69, 0x24, 0x8a, 0x27, 0x7e, 0x56, 0x06, 0xce, 0x6d, 0xeb, + 0xa1, 0xc6, 0x2a, 0xce, 0x4b, 0x37, 0xb1, 0x25, 0xca, 0x6d, 0xd3, 0x43, + 0xf3, 0xdb, 0xb8, 0xa5, 0x5e, 0x00, 0x76, 0x00, 0x22, 0x45, 0x45, 0x07, + 0x59, 0x55, 0x24, 0x56, 0x96, 0x3f, 0xa1, 0x2f, 0xf1, 0xf7, 0x6d, 0x86, + 0xe0, 0x23, 0x26, 0x63, 0xad, 0xc0, 0x4b, 0x7f, 0x5d, 0xc6, 0x83, 0x5c, + 0x6e, 0xe2, 0x0f, 0x02, 0x00, 0x00, 0x01, 0x79, 0x19, 0x43, 0x10, 0xa4, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x47, 0x30, 0x45, 0x02, 0x20, 0x3a, 0x73, + 0x53, 0xfb, 0xbb, 0x42, 0xdf, 0x2e, 0xa2, 0xc0, 0xc5, 0x29, 0x57, 0xda, + 0xb9, 0x0b, 0x76, 0x58, 0xb6, 0xeb, 0xd3, 0x4d, 0x10, 0x95, 0x1b, 0x58, + 0x3e, 0x58, 0x86, 0xea, 0xec, 0xe5, 0x02, 0x21, 0x00, 0xeb, 0xb2, 0xfe, + 0x83, 0x74, 0xdf, 0xb5, 0xfd, 0x8f, 0x74, 0x82, 0xd3, 0x8f, 0x6b, 0xce, + 0x63, 0x8b, 0x93, 0x94, 0x08, 0x7b, 0x1c, 0x6b, 0x48, 0xae, 0x59, 0xa1, + 0x7e, 0xec, 0x59, 0xdf, 0x56, 0x00, 0x76, 0x00, 0x51, 0xa3, 0xb0, 0xf5, + 0xfd, 0x01, 0x79, 0x9c, 0x56, 0x6d, 0xb8, 0x37, 0x78, 0x8f, 0x0c, 0xa4, + 0x7a, 0xcc, 0x1b, 0x27, 0xcb, 0xf7, 0x9e, 0x88, 0x42, 0x9a, 0x0d, 0xfe, + 0xd4, 0x8b, 0x05, 0xe5, 0x00, 0x00, 0x01, 0x79, 0x19, 0x43, 0x10, 0xea, + 0x00, 0x00, 0x04, 0x03, 0x00, 0x47, 0x30, 0x45, 0x02, 0x20, 0x68, 0x89, + 0x8b, 0xab, 0x98, 0xd3, 0x4f, 0x41, 0x4f, 0x7d, 0x1c, 0x52, 0xbe, 0x1b, + 0xf1, 0xbe, 0xb3, 0x68, 0x49, 0x5a, 0x91, 0x93, 0xdc, 0xac, 0xba, 0x6e, + 0x58, 0x8d, 0xcd, 0x3c, 0x5a, 0x26, 0x02, 0x21, 0x00, 0x85, 0x09, 0xf7, + 0x21, 0x4a, 0x66, 0x45, 0x77, 0xfe, 0xd5, 0x77, 0x25, 0xd5, 0xc5, 0x1a, + 0xb3, 0x33, 0xd8, 0x86, 0x52, 0xcc, 0xe1, 0x26, 0x21, 0x03, 0xcf, 0x1b, + 0x34, 0x24, 0xab, 0xc0, 0x1f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, + 0x00, 0xbd, 0x22, 0x40, 0xf1, 0x6d, 0xe7, 0x68, 0x89, 0x82, 0x53, 0xcd, + 0x64, 0xed, 0x21, 0x17, 0x90, 0x3a, 0xd0, 0xa3, 0x21, 0x42, 0x40, 0x60, + 0xf2, 0x2c, 0xf7, 0x40, 0xef, 0xc3, 0xf0, 0x22, 0x24, 0xc2, 0x51, 0x17, + 0x9d, 0x4b, 0x10, 0x9f, 0x86, 0x1a, 0x05, 0x4c, 0x6a, 0xe0, 0x13, 0xbb, + 0x29, 0xad, 0xf7, 0x18, 0x5f, 0x76, 0x01, 0x10, 0x8b, 0x1c, 0x29, 0x79, + 0x23, 0x94, 0x58, 0x1a, 0xa6, 0xf8, 0xac, 0x9b, 0x2e, 0xe0, 0x70, 0x1d, + 0x06, 0x1a, 0xe9, 0x5d, 0x24, 0x9f, 0x03, 0xff, 0x40, 0xe5, 0xc1, 0xb0, + 0xb9, 0xa7, 0x7e, 0x19, 0x3d, 0x0c, 0x99, 0x89, 0x81, 0xe4, 0x53, 0x9b, + 0xbd, 0x66, 0x1b, 0xba, 0x2e, 0xcd, 0xff, 0x24, 0x16, 0xd2, 0x89, 0xc9, + 0x75, 0xdd, 0xc9, 0x78, 0x25, 0x1e, 0x11, 0x43, 0x25, 0x06, 0x15, 0xe5, + 0xe3, 0x6b, 0xf9, 0x33, 0xee, 0x06, 0x16, 0x92, 0x8e, 0xe1, 0x8a, 0x93, + 0x41, 0x15, 0x8b, 0xf1, 0x06, 0xf7, 0x52, 0x07, 0x25, 0xb8, 0x6a, 0xae, + 0x46, 0x70, 0xa6, 0x81, 0x74, 0x70, 0x3c, 0x50, 0x42, 0x85, 0x65, 0x41, + 0xdb, 0x25, 0xb3, 0x4f, 0xce, 0x25, 0xb5, 0x2b, 0x62, 0xb7, 0x2b, 0xbf, + 0x66, 0xc4, 0xb4, 0x8a, 0x10, 0xb0, 0x50, 0x8e, 0x84, 0xf8, 0xe5, 0x28, + 0x86, 0xda, 0x7d, 0xe6, 0x65, 0xbf, 0xb1, 0xd5, 0x7d, 0x09, 0x28, 0x61, + 0xa3, 0x14, 0x89, 0x23, 0x35, 0x6e, 0x9c, 0x70, 0x06, 0x8b, 0xcb, 0x84, + 0xe8, 0x70, 0x8d, 0xb9, 0xfb, 0x74, 0xcf, 0x77, 0x63, 0x00, 0x5d, 0x8c, + 0xbb, 0x62, 0x4a, 0x2b, 0xc2, 0x8b, 0x2c, 0xd9, 0x9a, 0xa8, 0x83, 0x6f, + 0x06, 0x2a, 0x2a, 0x30, 0x4c, 0x39, 0xb4, 0xf8, 0x7d, 0x8c, 0x5e, 0xa7, + 0xcb, 0xce, 0x64, 0xe0, 0x27, 0xfa, 0x24, 0x42, 0xdd, 0xd1, 0x1d, 0xf8, + 0xa9, 0xd7, 0xc4, 0x0c, 0x92 +}; + +static const BYTE ocsp_cert_issuer[] = { + 0x30, 0x82, 0x04, 0xbe, 0x30, 0x82, 0x03, 0xa6, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x06, 0xd8, 0xd9, 0x04, 0xd5, 0x58, 0x43, 0x46, 0xf6, + 0x8a, 0x2f, 0xa7, 0x54, 0x22, 0x7e, 0xc4, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x61, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, + 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x31, 0x30, 0x34, 0x31, 0x34, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x31, 0x30, 0x34, + 0x31, 0x33, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x4f, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, + 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, + 0x29, 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x44, 0x69, + 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x54, 0x4c, 0x53, 0x20, 0x52, + 0x53, 0x41, 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, 0x30, + 0x32, 0x30, 0x20, 0x43, 0x41, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, + 0x01, 0x01, 0x00, 0xc1, 0x4b, 0xb3, 0x65, 0x47, 0x70, 0xbc, 0xdd, 0x4f, + 0x58, 0xdb, 0xec, 0x9c, 0xed, 0xc3, 0x66, 0xe5, 0x1f, 0x31, 0x13, 0x54, + 0xad, 0x4a, 0x66, 0x46, 0x1f, 0x2c, 0x0a, 0xec, 0x64, 0x07, 0xe5, 0x2e, + 0xdc, 0xdc, 0xb9, 0x0a, 0x20, 0xed, 0xdf, 0xe3, 0xc4, 0xd0, 0x9e, 0x9a, + 0xa9, 0x7a, 0x1d, 0x82, 0x88, 0xe5, 0x11, 0x56, 0xdb, 0x1e, 0x9f, 0x58, + 0xc2, 0x51, 0xe7, 0x2c, 0x34, 0x0d, 0x2e, 0xd2, 0x92, 0xe1, 0x56, 0xcb, + 0xf1, 0x79, 0x5f, 0xb3, 0xbb, 0x87, 0xca, 0x25, 0x03, 0x7b, 0x9a, 0x52, + 0x41, 0x66, 0x10, 0x60, 0x4f, 0x57, 0x13, 0x49, 0xf0, 0xe8, 0x37, 0x67, + 0x83, 0xdf, 0xe7, 0xd3, 0x4b, 0x67, 0x4c, 0x22, 0x51, 0xa6, 0xdf, 0x0e, + 0x99, 0x10, 0xed, 0x57, 0x51, 0x74, 0x26, 0xe2, 0x7d, 0xc7, 0xca, 0x62, + 0x2e, 0x13, 0x1b, 0x7f, 0x23, 0x88, 0x25, 0x53, 0x6f, 0xc1, 0x34, 0x58, + 0x00, 0x8b, 0x84, 0xff, 0xf8, 0xbe, 0xa7, 0x58, 0x49, 0x22, 0x7b, 0x96, + 0xad, 0xa2, 0x88, 0x9b, 0x15, 0xbc, 0xa0, 0x7c, 0xdf, 0xe9, 0x51, 0xa8, + 0xd5, 0xb0, 0xed, 0x37, 0xe2, 0x36, 0xb4, 0x82, 0x4b, 0x62, 0xb5, 0x49, + 0x9a, 0xec, 0xc7, 0x67, 0xd6, 0xe3, 0x3e, 0xf5, 0xe3, 0xd6, 0x12, 0x5e, + 0x44, 0xf1, 0xbf, 0x71, 0x42, 0x7d, 0x58, 0x84, 0x03, 0x80, 0xb1, 0x81, + 0x01, 0xfa, 0xf9, 0xca, 0x32, 0xbb, 0xb4, 0x8e, 0x27, 0x87, 0x27, 0xc5, + 0x2b, 0x74, 0xd4, 0xa8, 0xd6, 0x97, 0xde, 0xc3, 0x64, 0xf9, 0xca, 0xce, + 0x53, 0xa2, 0x56, 0xbc, 0x78, 0x17, 0x8e, 0x49, 0x03, 0x29, 0xae, 0xfb, + 0x49, 0x4f, 0xa4, 0x15, 0xb9, 0xce, 0xf2, 0x5c, 0x19, 0x57, 0x6d, 0x6b, + 0x79, 0xa7, 0x2b, 0xa2, 0x27, 0x20, 0x13, 0xb5, 0xd0, 0x3d, 0x40, 0xd3, + 0x21, 0x30, 0x07, 0x93, 0xea, 0x99, 0xf5, 0x02, 0x03, 0x01, 0x00, 0x01, + 0xa3, 0x82, 0x01, 0x82, 0x30, 0x82, 0x01, 0x7e, 0x30, 0x12, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, + 0xff, 0x02, 0x01, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, + 0x16, 0x04, 0x14, 0xb7, 0x6b, 0xa2, 0xea, 0xa8, 0xaa, 0x84, 0x8c, 0x79, + 0xea, 0xb4, 0xda, 0x0f, 0x98, 0xb2, 0xc5, 0x95, 0x76, 0xb9, 0xf4, 0x30, + 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, + 0x03, 0xde, 0x50, 0x35, 0x56, 0xd1, 0x4c, 0xbb, 0x66, 0xf0, 0xa3, 0xe2, + 0x1b, 0x1b, 0xc3, 0x97, 0xb2, 0x3d, 0xd1, 0x55, 0x30, 0x0e, 0x06, 0x03, + 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x76, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x6a, 0x30, 0x68, 0x30, + 0x24, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, + 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, + 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, + 0x6d, 0x30, 0x40, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, + 0x02, 0x86, 0x34, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x61, + 0x63, 0x65, 0x72, 0x74, 0x73, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, + 0x74, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x42, 0x06, 0x03, 0x55, + 0x1d, 0x1f, 0x04, 0x3b, 0x30, 0x39, 0x30, 0x37, 0xa0, 0x35, 0xa0, 0x33, + 0x86, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, + 0x33, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x2e, + 0x63, 0x72, 0x6c, 0x30, 0x3d, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x36, + 0x30, 0x34, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd, + 0x6c, 0x02, 0x01, 0x30, 0x07, 0x06, 0x05, 0x67, 0x81, 0x0c, 0x01, 0x01, + 0x30, 0x08, 0x06, 0x06, 0x67, 0x81, 0x0c, 0x01, 0x02, 0x01, 0x30, 0x08, + 0x06, 0x06, 0x67, 0x81, 0x0c, 0x01, 0x02, 0x02, 0x30, 0x08, 0x06, 0x06, + 0x67, 0x81, 0x0c, 0x01, 0x02, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x80, 0x32, 0xce, 0x5e, 0x0b, 0xdd, 0x6e, 0x5a, 0x0d, 0x0a, + 0xaf, 0xe1, 0xd6, 0x84, 0xcb, 0xc0, 0x8e, 0xfa, 0x85, 0x70, 0xed, 0xda, + 0x5d, 0xb3, 0x0c, 0xf7, 0x2b, 0x75, 0x40, 0xfe, 0x85, 0x0a, 0xfa, 0xf3, + 0x31, 0x78, 0xb7, 0x70, 0x4b, 0x1a, 0x89, 0x58, 0xba, 0x80, 0xbd, 0xf3, + 0x6b, 0x1d, 0xe9, 0x7e, 0xcf, 0x0b, 0xba, 0x58, 0x9c, 0x59, 0xd4, 0x90, + 0xd3, 0xfd, 0x6c, 0xfd, 0xd0, 0x98, 0x6d, 0xb7, 0x71, 0x82, 0x5b, 0xcf, + 0x6d, 0x0b, 0x5a, 0x09, 0xd0, 0x7b, 0xde, 0xc4, 0x43, 0xd8, 0x2a, 0xa4, + 0xde, 0x9e, 0x41, 0x26, 0x5f, 0xbb, 0x8f, 0x99, 0xcb, 0xdd, 0xae, 0xe1, + 0xa8, 0x6f, 0x9f, 0x87, 0xfe, 0x74, 0xb7, 0x1f, 0x1b, 0x20, 0xab, 0xb1, + 0x4f, 0xc6, 0xf5, 0x67, 0x5d, 0x5d, 0x9b, 0x3c, 0xe9, 0xff, 0x69, 0xf7, + 0x61, 0x6c, 0xd6, 0xd9, 0xf3, 0xfd, 0x36, 0xc6, 0xab, 0x03, 0x88, 0x76, + 0xd2, 0x4b, 0x2e, 0x75, 0x86, 0xe3, 0xfc, 0xd8, 0x55, 0x7d, 0x26, 0xc2, + 0x11, 0x77, 0xdf, 0x3e, 0x02, 0xb6, 0x7c, 0xf3, 0xab, 0x7b, 0x7a, 0x86, + 0x36, 0x6f, 0xb8, 0xf7, 0xd8, 0x93, 0x71, 0xcf, 0x86, 0xdf, 0x73, 0x30, + 0xfa, 0x7b, 0xab, 0xed, 0x2a, 0x59, 0xc8, 0x42, 0x84, 0x3b, 0x11, 0x17, + 0x1a, 0x52, 0xf3, 0xc9, 0x0e, 0x14, 0x7d, 0xa2, 0x5b, 0x72, 0x67, 0xba, + 0x71, 0xed, 0x57, 0x47, 0x66, 0xc5, 0xb8, 0x02, 0x4a, 0x65, 0x34, 0x5e, + 0x8b, 0xd0, 0x2a, 0x3c, 0x20, 0x9c, 0x51, 0x99, 0x4c, 0xe7, 0x52, 0x9e, + 0xf7, 0x6b, 0x11, 0x2b, 0x0d, 0x92, 0x7e, 0x1d, 0xe8, 0x8a, 0xeb, 0x36, + 0x16, 0x43, 0x87, 0xea, 0x2a, 0x63, 0xbf, 0x75, 0x3f, 0xeb, 0xde, 0xc4, + 0x03, 0xbb, 0x0a, 0x3c, 0xf7, 0x30, 0xef, 0xeb, 0xaf, 0x4c, 0xfc, 0x8b, + 0x36, 0x10, 0x73, 0x3e, 0xf3, 0xa4 +}; + +static const BYTE ocsp_cert_revoked[] = { + 0x30, 0x82, 0x06, 0x86, 0x30, 0x82, 0x05, 0x6e, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x0d, 0x2e, 0x67, 0xa2, 0x98, 0x85, 0x3b, 0x9a, 0x54, + 0x52, 0xe3, 0xa2, 0x85, 0xa4, 0x57, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x59, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x52, + 0x61, 0x70, 0x69, 0x64, 0x53, 0x53, 0x4c, 0x20, 0x54, 0x4c, 0x53, 0x20, + 0x44, 0x56, 0x20, 0x52, 0x53, 0x41, 0x20, 0x4d, 0x69, 0x78, 0x65, 0x64, + 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, 0x30, 0x32, 0x30, + 0x20, 0x43, 0x41, 0x2d, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x31, 0x31, + 0x30, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, + 0x32, 0x32, 0x31, 0x30, 0x32, 0x37, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, + 0x5a, 0x30, 0x1d, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x12, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x2e, 0x62, 0x61, + 0x64, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x76, 0x2d, 0x55, 0x66, 0xdc, 0x72, + 0x8a, 0xa0, 0x9e, 0x85, 0x92, 0x38, 0x7f, 0x5b, 0xe1, 0x93, 0x8d, 0xad, + 0x06, 0xc8, 0xad, 0xe9, 0x89, 0xb4, 0xef, 0x1e, 0x77, 0x5b, 0x33, 0x45, + 0x16, 0x60, 0x7d, 0x33, 0x38, 0x68, 0x04, 0xd7, 0xc9, 0x83, 0x42, 0x83, + 0xd9, 0x30, 0x4b, 0x54, 0x49, 0x14, 0xca, 0xed, 0xbe, 0x0c, 0x76, 0xba, + 0x5f, 0xa6, 0x5c, 0x33, 0x78, 0x3f, 0x39, 0xf2, 0x49, 0xa8, 0x88, 0x32, + 0xee, 0x53, 0x21, 0x14, 0xd3, 0xaa, 0x5c, 0x58, 0x3c, 0x39, 0xcc, 0xf7, + 0x80, 0xb1, 0x27, 0x1f, 0x54, 0x79, 0x7b, 0x6c, 0x8b, 0xff, 0x41, 0xaa, + 0x39, 0x24, 0x95, 0x5f, 0x71, 0xbc, 0x49, 0xbf, 0x39, 0x3b, 0xa5, 0xd5, + 0xe1, 0xa5, 0xde, 0x1d, 0x40, 0x81, 0x25, 0xdc, 0x8a, 0x47, 0x82, 0xfe, + 0xcd, 0x7c, 0x4b, 0x2c, 0x04, 0xbb, 0xd3, 0x27, 0x56, 0x51, 0xa0, 0x61, + 0xf2, 0xd2, 0xcb, 0x55, 0x08, 0x25, 0x2a, 0x85, 0xdb, 0x2c, 0x06, 0x8d, + 0x0d, 0x61, 0xc2, 0x5b, 0x3e, 0x9b, 0x46, 0xdc, 0x58, 0xff, 0x13, 0x27, + 0xbe, 0x0a, 0x44, 0x1e, 0x68, 0xfe, 0xe1, 0xf6, 0xb7, 0xde, 0x9f, 0x8e, + 0x6c, 0xc4, 0xb5, 0x19, 0xfa, 0xd7, 0xd3, 0x4f, 0x55, 0xa8, 0x61, 0x79, + 0xdb, 0x61, 0x2f, 0x6a, 0x9c, 0x2c, 0xf1, 0xc4, 0x81, 0xbb, 0x9e, 0xd2, + 0x02, 0x05, 0xba, 0x9c, 0x14, 0xa0, 0xf9, 0xf3, 0x54, 0x79, 0x7d, 0x69, + 0xd9, 0xba, 0x66, 0x1c, 0x87, 0x95, 0x41, 0x50, 0x0e, 0xf9, 0x5e, 0xe1, + 0xb7, 0xbd, 0xf5, 0x31, 0x24, 0xc5, 0x21, 0x21, 0x03, 0x8a, 0xcf, 0x6d, + 0x78, 0x58, 0xde, 0xd9, 0x30, 0x7d, 0x03, 0x42, 0x52, 0xd6, 0xb0, 0x1b, + 0xb9, 0xc9, 0x54, 0x1b, 0x5a, 0xe8, 0xc8, 0x53, 0xf0, 0xac, 0x2b, 0x82, + 0x10, 0x27, 0xa6, 0xa9, 0x70, 0x25, 0xae, 0xf8, 0xa7, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x82, 0x03, 0x84, 0x30, 0x82, 0x03, 0x80, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa4, + 0x8d, 0xe5, 0xbe, 0x7c, 0x79, 0xe4, 0x70, 0x23, 0x6d, 0x2e, 0x29, 0x34, + 0xad, 0x23, 0x58, 0xdc, 0xf5, 0x31, 0x7f, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xb0, 0xc8, 0xce, 0x20, 0xb2, 0x78, + 0xcc, 0x1d, 0x23, 0xef, 0xf0, 0xfe, 0xd6, 0x0e, 0x29, 0x4b, 0xac, 0x15, + 0x72, 0x3c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x16, 0x30, + 0x14, 0x82, 0x12, 0x72, 0x65, 0x76, 0x6f, 0x6b, 0x65, 0x64, 0x2e, 0x62, + 0x61, 0x64, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x05, + 0xa0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16, 0x30, 0x14, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, + 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x81, 0x9b, 0x06, + 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x81, 0x93, 0x30, 0x81, 0x90, 0x30, 0x46, + 0xa0, 0x44, 0xa0, 0x42, 0x86, 0x40, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x63, 0x72, 0x6c, 0x33, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x70, 0x69, 0x64, + 0x53, 0x53, 0x4c, 0x54, 0x4c, 0x53, 0x44, 0x56, 0x52, 0x53, 0x41, 0x4d, + 0x69, 0x78, 0x65, 0x64, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, 0x30, + 0x32, 0x30, 0x43, 0x41, 0x2d, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x46, + 0xa0, 0x44, 0xa0, 0x42, 0x86, 0x40, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x63, 0x72, 0x6c, 0x34, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x70, 0x69, 0x64, + 0x53, 0x53, 0x4c, 0x54, 0x4c, 0x53, 0x44, 0x56, 0x52, 0x53, 0x41, 0x4d, + 0x69, 0x78, 0x65, 0x64, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, 0x30, + 0x32, 0x30, 0x43, 0x41, 0x2d, 0x31, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x3e, + 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x37, 0x30, 0x35, 0x30, 0x33, 0x06, + 0x06, 0x67, 0x81, 0x0c, 0x01, 0x02, 0x01, 0x30, 0x29, 0x30, 0x27, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1b, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, + 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, + 0x50, 0x53, 0x30, 0x81, 0x85, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x01, 0x01, 0x04, 0x79, 0x30, 0x77, 0x30, 0x24, 0x06, 0x08, 0x2b, + 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x64, 0x69, 0x67, + 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x4f, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x43, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x61, 0x63, 0x65, 0x72, 0x74, + 0x73, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x70, 0x69, 0x64, 0x53, 0x53, 0x4c, 0x54, + 0x4c, 0x53, 0x44, 0x56, 0x52, 0x53, 0x41, 0x4d, 0x69, 0x78, 0x65, 0x64, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x32, 0x30, 0x32, 0x30, 0x43, 0x41, + 0x2d, 0x31, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x82, 0x01, 0x7d, 0x06, 0x0a, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0xd6, 0x79, 0x02, 0x04, 0x02, 0x04, 0x82, 0x01, + 0x6d, 0x04, 0x82, 0x01, 0x69, 0x01, 0x67, 0x00, 0x76, 0x00, 0x29, 0x79, + 0xbe, 0xf0, 0x9e, 0x39, 0x39, 0x21, 0xf0, 0x56, 0x73, 0x9f, 0x63, 0xa5, + 0x77, 0xe5, 0xbe, 0x57, 0x7d, 0x9c, 0x60, 0x0a, 0xf8, 0xf9, 0x4d, 0x5d, + 0x26, 0x5c, 0x25, 0x5d, 0xc7, 0x84, 0x00, 0x00, 0x01, 0x7c, 0xc3, 0xa4, + 0xf7, 0x37, 0x00, 0x00, 0x04, 0x03, 0x00, 0x47, 0x30, 0x45, 0x02, 0x20, + 0x77, 0xb0, 0x79, 0x18, 0xf3, 0xde, 0x34, 0x70, 0xfa, 0xf2, 0x1b, 0xc2, + 0x32, 0x39, 0xc8, 0xc8, 0x95, 0xb0, 0xc8, 0x7a, 0x8f, 0x62, 0x23, 0x58, + 0xdd, 0xad, 0xf9, 0x1b, 0xbe, 0x84, 0x95, 0xed, 0x02, 0x21, 0x00, 0xdd, + 0x25, 0x68, 0x47, 0xa3, 0x84, 0x5f, 0x95, 0xb1, 0xea, 0xe7, 0xbc, 0x0a, + 0x09, 0x92, 0xf9, 0x5a, 0x56, 0x72, 0x31, 0xec, 0x07, 0xd6, 0xc6, 0x97, + 0x4d, 0x4c, 0x7b, 0x90, 0x75, 0x64, 0xae, 0x00, 0x76, 0x00, 0x51, 0xa3, + 0xb0, 0xf5, 0xfd, 0x01, 0x79, 0x9c, 0x56, 0x6d, 0xb8, 0x37, 0x78, 0x8f, + 0x0c, 0xa4, 0x7a, 0xcc, 0x1b, 0x27, 0xcb, 0xf7, 0x9e, 0x88, 0x42, 0x9a, + 0x0d, 0xfe, 0xd4, 0x8b, 0x05, 0xe5, 0x00, 0x00, 0x01, 0x7c, 0xc3, 0xa4, + 0xf7, 0x64, 0x00, 0x00, 0x04, 0x03, 0x00, 0x47, 0x30, 0x45, 0x02, 0x20, + 0x4c, 0x22, 0xff, 0x65, 0x39, 0x6b, 0x7e, 0x7b, 0x15, 0x21, 0x79, 0x44, + 0xc2, 0xeb, 0xb8, 0x4c, 0x2a, 0xc9, 0xa5, 0xc7, 0xac, 0xce, 0x5f, 0x6a, + 0x5d, 0xe8, 0xb7, 0x24, 0xc5, 0x76, 0xec, 0x19, 0x02, 0x21, 0x00, 0x94, + 0x5e, 0x02, 0xee, 0x14, 0x60, 0x80, 0x96, 0xbc, 0x0e, 0x39, 0x16, 0x01, + 0xa8, 0x37, 0x9f, 0x15, 0xb9, 0xb9, 0xba, 0x0f, 0xa2, 0x0c, 0x5a, 0x17, + 0x90, 0xa5, 0xe1, 0x33, 0x36, 0x45, 0xf2, 0x00, 0x75, 0x00, 0x41, 0xc8, + 0xca, 0xb1, 0xdf, 0x22, 0x46, 0x4a, 0x10, 0xc6, 0xa1, 0x3a, 0x09, 0x42, + 0x87, 0x5e, 0x4e, 0x31, 0x8b, 0x1b, 0x03, 0xeb, 0xeb, 0x4b, 0xc7, 0x68, + 0xf0, 0x90, 0x62, 0x96, 0x06, 0xf6, 0x00, 0x00, 0x01, 0x7c, 0xc3, 0xa4, + 0xf6, 0xdf, 0x00, 0x00, 0x04, 0x03, 0x00, 0x46, 0x30, 0x44, 0x02, 0x20, + 0x68, 0x8a, 0x5f, 0x50, 0xb7, 0x76, 0xda, 0x7e, 0x34, 0x32, 0xa5, 0x77, + 0x02, 0xa6, 0xfa, 0xa7, 0x87, 0xbb, 0xdb, 0x41, 0x5c, 0x80, 0x40, 0x2c, + 0x05, 0xe5, 0x09, 0xdd, 0x3f, 0xcc, 0x6d, 0x9f, 0x02, 0x20, 0x7b, 0x1d, + 0x64, 0x48, 0x61, 0x19, 0x75, 0xb6, 0x37, 0xd1, 0x3c, 0x1e, 0x38, 0x78, + 0x86, 0x7a, 0xf2, 0x79, 0x14, 0x08, 0x42, 0xe8, 0xdd, 0x0f, 0xff, 0x38, + 0x3a, 0x3c, 0x36, 0xd9, 0xbf, 0xd9, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0xd5, 0x8c, 0xbd, 0xbe, 0xe4, 0xdc, 0x94, 0xa4, 0xb7, 0xf3, + 0x49, 0xaf, 0xc4, 0x99, 0x26, 0xda, 0x27, 0x68, 0xda, 0xe8, 0xb8, 0xc1, + 0xba, 0xc6, 0x30, 0xb6, 0x16, 0xaa, 0x50, 0xfe, 0xf4, 0x77, 0x07, 0xeb, + 0x99, 0xf2, 0xda, 0xdd, 0x77, 0x1d, 0x19, 0x82, 0xf7, 0x24, 0x2a, 0x3b, + 0xa0, 0x63, 0xe0, 0xdb, 0x09, 0xbe, 0x10, 0x7f, 0xc5, 0x1f, 0x81, 0xba, + 0xaf, 0x9e, 0x49, 0xce, 0x32, 0x30, 0x49, 0x17, 0x8f, 0x74, 0xc6, 0xd6, + 0xcd, 0x6a, 0xd8, 0x3b, 0x47, 0x7b, 0xf0, 0xe0, 0x0c, 0xbb, 0xc0, 0x8e, + 0x3a, 0x1d, 0xa3, 0x7f, 0x92, 0xac, 0x7e, 0x8d, 0xdc, 0xa4, 0xb5, 0x30, + 0x2a, 0x57, 0x13, 0x23, 0xa7, 0xee, 0x25, 0xc6, 0x37, 0xed, 0x48, 0xb2, + 0x4a, 0xd0, 0x01, 0xfc, 0x85, 0xe5, 0xc1, 0xe2, 0xe0, 0xdc, 0x8c, 0x61, + 0x74, 0xaa, 0xaf, 0x68, 0x28, 0x26, 0x45, 0x94, 0xa3, 0xb1, 0x4c, 0xc9, + 0x5c, 0xc7, 0x92, 0xa2, 0x6c, 0x4a, 0x80, 0x6f, 0xdd, 0x48, 0xfa, 0x4f, + 0x04, 0xb2, 0x4a, 0x73, 0x17, 0xf2, 0xf9, 0x1e, 0x8e, 0x5c, 0xe9, 0x23, + 0xec, 0x53, 0xff, 0x3e, 0xc7, 0x8a, 0xb6, 0x18, 0x89, 0xbc, 0x77, 0x45, + 0x67, 0x4b, 0x9a, 0x73, 0x75, 0x6b, 0x57, 0xc8, 0xc0, 0x6a, 0xcb, 0x84, + 0x1d, 0xf4, 0xed, 0xef, 0x70, 0x16, 0x77, 0x8e, 0xf3, 0x1a, 0x8e, 0xbb, + 0x95, 0xf3, 0xeb, 0xf8, 0x5a, 0xe4, 0xa9, 0xb1, 0xdf, 0x1d, 0x36, 0xab, + 0x0a, 0xdd, 0x91, 0xaf, 0x2d, 0x71, 0x3c, 0xab, 0x97, 0x18, 0x03, 0xdc, + 0x5c, 0x1a, 0xa9, 0xb1, 0xdb, 0xb6, 0x48, 0x40, 0xc7, 0x19, 0xa7, 0x81, + 0x14, 0x0b, 0x0d, 0xce, 0x38, 0x6f, 0xda, 0xcf, 0xce, 0x0f, 0x64, 0x13, + 0x28, 0xf3, 0x4d, 0x67, 0x1b, 0x2c, 0xd1, 0x16, 0x54, 0x19, 0x6f, 0xaa, + 0x08, 0x54, 0xa3, 0x4d, 0x67, 0x64 +}; + +static const BYTE ocsp_cert_revoked_issuer[] = { + 0x30, 0x82, 0x05, 0x51, 0x30, 0x82, 0x04, 0x39, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x10, 0x07, 0x98, 0x36, 0x03, 0xad, 0xe3, 0x99, 0x08, 0x21, + 0x9c, 0xa0, 0x0c, 0x27, 0xbc, 0x8a, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x61, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, + 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x10, 0x77, + 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x17, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, + 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x30, 0x30, 0x37, 0x31, 0x36, 0x31, + 0x32, 0x32, 0x35, 0x32, 0x37, 0x5a, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x35, + 0x33, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x59, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0c, 0x44, + 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, 0x20, 0x49, 0x6e, 0x63, 0x31, + 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2a, 0x52, 0x61, + 0x70, 0x69, 0x64, 0x53, 0x53, 0x4c, 0x20, 0x54, 0x4c, 0x53, 0x20, 0x44, + 0x56, 0x20, 0x52, 0x53, 0x41, 0x20, 0x4d, 0x69, 0x78, 0x65, 0x64, 0x20, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x32, 0x30, 0x32, 0x30, 0x20, + 0x43, 0x41, 0x2d, 0x31, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xda, 0x6e, 0x43, 0x55, 0x55, 0x99, 0x7b, 0xd9, 0x95, 0xa2, 0x66, + 0xc4, 0x65, 0x58, 0xa2, 0xd0, 0x0c, 0x17, 0x3a, 0x00, 0xa6, 0x88, 0x5b, + 0x24, 0x07, 0x8d, 0xa7, 0x33, 0x7e, 0xe3, 0xd2, 0xdb, 0x82, 0x4a, 0xcc, + 0x2e, 0xfd, 0xad, 0x6e, 0x52, 0x08, 0xf0, 0x7e, 0x37, 0xbc, 0xde, 0xd4, + 0x16, 0xe9, 0xb1, 0x57, 0xb9, 0x49, 0x74, 0xfc, 0x0b, 0x3f, 0x6d, 0xaa, + 0x6b, 0x4b, 0x15, 0xf5, 0xcc, 0x02, 0xaf, 0xa4, 0x19, 0xa0, 0x61, 0x28, + 0x6d, 0xd6, 0xbe, 0xe2, 0x9b, 0x9f, 0x1b, 0x46, 0x92, 0x7c, 0x74, 0x02, + 0x42, 0x1b, 0xa5, 0x6a, 0xa2, 0xa9, 0x3d, 0xc6, 0x18, 0x38, 0xf8, 0xd3, + 0xc2, 0x0a, 0x89, 0x03, 0xce, 0x00, 0x15, 0x88, 0xfc, 0x97, 0xf2, 0x1e, + 0x43, 0xc9, 0xf4, 0xd5, 0x5c, 0x82, 0xba, 0xb3, 0x08, 0x1c, 0x0e, 0x3b, + 0xf2, 0xdb, 0x36, 0x1b, 0xa1, 0x86, 0xb4, 0x4c, 0x74, 0xb9, 0xc9, 0xc4, + 0x7d, 0x5d, 0x90, 0x1d, 0x42, 0xfa, 0xe0, 0x40, 0xb6, 0xca, 0x1e, 0xf2, + 0x6d, 0xba, 0x28, 0xe6, 0xff, 0x27, 0x15, 0x65, 0x78, 0x97, 0x1f, 0xf1, + 0x71, 0xfc, 0x68, 0xc6, 0x41, 0x53, 0x56, 0x70, 0x08, 0x46, 0x01, 0xeb, + 0x1f, 0x6b, 0xd4, 0x74, 0xe8, 0x95, 0xf6, 0xc9, 0x4e, 0x8b, 0x1d, 0xf3, + 0xe4, 0xa3, 0xec, 0xda, 0xb2, 0xb6, 0x6d, 0xb6, 0x9c, 0x87, 0xc4, 0xa1, + 0xe4, 0x64, 0xa4, 0x82, 0x9d, 0x87, 0x46, 0x84, 0xbf, 0x9b, 0x2d, 0x2d, + 0x0a, 0xad, 0x6f, 0x8f, 0x22, 0xc9, 0x78, 0xfd, 0x1a, 0x37, 0x03, 0xdd, + 0xde, 0xb9, 0x39, 0x3b, 0xc2, 0xe2, 0x7d, 0xf2, 0xde, 0xbf, 0xd8, 0xfe, + 0x50, 0xa6, 0x68, 0xd2, 0xdb, 0x74, 0x56, 0xf4, 0xcb, 0x91, 0xd1, 0xa6, + 0x48, 0xde, 0x21, 0xd6, 0x65, 0x58, 0xe8, 0x39, 0xc6, 0x7c, 0xec, 0x29, + 0xd4, 0x2e, 0x52, 0x2b, 0x43, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, + 0x02, 0x0b, 0x30, 0x82, 0x02, 0x07, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa4, 0x8d, 0xe5, 0xbe, 0x7c, 0x79, 0xe4, + 0x70, 0x23, 0x6d, 0x2e, 0x29, 0x34, 0xad, 0x23, 0x58, 0xdc, 0xf5, 0x31, + 0x7f, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0x03, 0xde, 0x50, 0x35, 0x56, 0xd1, 0x4c, 0xbb, 0x66, 0xf0, + 0xa3, 0xe2, 0x1b, 0x1b, 0xc3, 0x97, 0xb2, 0x3d, 0xd1, 0x55, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x86, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16, 0x30, + 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x12, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, + 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x34, 0x06, 0x08, 0x2b, 0x06, 0x01, + 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x28, 0x30, 0x26, 0x30, 0x24, 0x06, + 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x18, 0x68, + 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x64, + 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x30, + 0x7b, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x74, 0x30, 0x72, 0x30, 0x37, + 0xa0, 0x35, 0xa0, 0x33, 0x86, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x63, 0x72, 0x6c, 0x33, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, + 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x69, 0x67, 0x69, 0x43, + 0x65, 0x72, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, + 0x74, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x37, 0xa0, 0x35, 0xa0, + 0x33, 0x86, 0x31, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, + 0x6c, 0x34, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x69, 0x67, 0x69, 0x43, 0x65, 0x72, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, + 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x81, 0xce, 0x06, 0x03, 0x55, 0x1d, 0x20, + 0x04, 0x81, 0xc6, 0x30, 0x81, 0xc3, 0x30, 0x81, 0xc0, 0x06, 0x04, 0x55, + 0x1d, 0x20, 0x00, 0x30, 0x81, 0xb7, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1c, 0x68, 0x74, 0x74, 0x70, + 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, + 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x50, 0x53, + 0x30, 0x81, 0x8a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, + 0x02, 0x30, 0x7e, 0x0c, 0x7c, 0x41, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x73, 0x20, 0x61, 0x63, 0x63, + 0x65, 0x70, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x52, 0x65, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x20, 0x41, 0x67, 0x72, 0x65, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, + 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, + 0x77, 0x2e, 0x64, 0x69, 0x67, 0x69, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x72, 0x70, 0x61, 0x2d, 0x75, 0x61, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x22, 0xe3, 0xdc, 0x6d, 0x48, 0xeb, 0x8e, + 0xca, 0x00, 0x72, 0x73, 0x2e, 0x74, 0xaa, 0xe0, 0x93, 0x84, 0x6e, 0x39, + 0xc4, 0x87, 0x54, 0x02, 0xc4, 0x02, 0x69, 0x71, 0x55, 0x45, 0xaf, 0x5a, + 0xb0, 0xf6, 0x81, 0xfe, 0x32, 0xc8, 0x35, 0x72, 0x4b, 0xde, 0xa5, 0x7d, + 0x27, 0x41, 0xa1, 0xd9, 0xb6, 0x4c, 0xd2, 0x4e, 0x32, 0x38, 0xc7, 0x80, + 0x31, 0x9e, 0x7b, 0xb2, 0x63, 0xfa, 0x26, 0x47, 0x09, 0x8a, 0x18, 0x4e, + 0x16, 0x57, 0xd0, 0x6b, 0x5f, 0x1a, 0x96, 0x37, 0x7e, 0xc4, 0xd7, 0x3a, + 0x6f, 0xe1, 0x97, 0xea, 0x81, 0x5c, 0x08, 0x71, 0xab, 0xfa, 0x0b, 0x04, + 0xc8, 0xf3, 0x3c, 0xaa, 0xf9, 0x4a, 0x1b, 0x17, 0x39, 0x4f, 0x97, 0x87, + 0x57, 0x35, 0x7a, 0x8e, 0x98, 0xe9, 0xcb, 0x39, 0x7a, 0x54, 0x42, 0xa9, + 0x6b, 0x11, 0xfa, 0x81, 0xd1, 0x95, 0xa5, 0x05, 0x60, 0x8e, 0x43, 0x91, + 0xf7, 0x26, 0x3d, 0x5c, 0x05, 0x25, 0x16, 0x7c, 0xe5, 0x38, 0x2a, 0x6a, + 0xb2, 0x6e, 0xeb, 0xd9, 0x95, 0x0a, 0xa4, 0x37, 0xeb, 0x85, 0x49, 0xd5, + 0xcd, 0x7d, 0xa7, 0x48, 0xcd, 0x79, 0x5d, 0x28, 0xf8, 0xf2, 0xb5, 0x41, + 0x04, 0x09, 0xc6, 0x25, 0x69, 0x0b, 0x3e, 0x28, 0xe5, 0x00, 0x27, 0x77, + 0xb1, 0x61, 0x4c, 0x55, 0x48, 0x8a, 0x47, 0x3d, 0x42, 0xe4, 0xf6, 0x72, + 0x7a, 0x5d, 0xa5, 0xec, 0x9f, 0xd6, 0xe1, 0xdf, 0x7d, 0x28, 0x52, 0xd2, + 0x62, 0x0a, 0x32, 0xe4, 0x60, 0xe6, 0x01, 0x1a, 0x70, 0x2d, 0xcf, 0xff, + 0x7d, 0x77, 0xe4, 0xaf, 0x8d, 0x27, 0x31, 0x8f, 0x22, 0x6c, 0x29, 0xb1, + 0x0a, 0xc8, 0xd7, 0x41, 0x37, 0xb4, 0x7c, 0x96, 0xed, 0xae, 0xb2, 0xcb, + 0xc9, 0x64, 0x25, 0x93, 0xd5, 0x43, 0x57, 0x6f, 0x7a, 0x10, 0x8f, 0xe4, + 0x40, 0xe2, 0x4d, 0x2d, 0x51, 0x24, 0x27, 0x9e, 0x0f +}; + static void testVerifyRevocation(void) { BOOL ret; @@ -3643,6 +4157,44 @@ static void testVerifyRevocation(void) CertCloseStore(revPara.hCrlStore, 0); CertFreeCertificateContext(certs[1]); CertFreeCertificateContext(certs[0]); + + /* OCSP */ + certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING, ocsp_cert, sizeof(ocsp_cert)); + memset(&revPara, 0, sizeof(revPara)); + revPara.cbSize = sizeof(revPara); + memset(&status, 0x55, sizeof(status)); + status.cbSize = sizeof(status); + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, 1, (void **)&certs[0], + 0, &revPara, &status); + ok(!ret, "success\n"); + ok(GetLastError() == CRYPT_E_REVOCATION_OFFLINE, "got %08lx\n", GetLastError()); + + revPara.pIssuerCert = CertCreateCertificateContext(X509_ASN_ENCODING, ocsp_cert_issuer, + sizeof(ocsp_cert_issuer)); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, 1, (void **)&certs[0], + 0, &revPara, &status); + ok(ret, "got %08lx\n", GetLastError()); + ok(!status.dwError, "got %08lx\n", status.dwError); + ok(!status.dwIndex, "got %ld\n", status.dwIndex); + CertFreeCertificateContext(revPara.pIssuerCert); + CertFreeCertificateContext(certs[0]); + + certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING, ocsp_cert_revoked, sizeof(ocsp_cert_revoked)); + revPara.pIssuerCert = CertCreateCertificateContext(X509_ASN_ENCODING, ocsp_cert_revoked_issuer, + sizeof(ocsp_cert_revoked_issuer)); + memset(&status, 0x55, sizeof(status)); + status.cbSize = sizeof(status); + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, 1, (void **)&certs[0], + 0, &revPara, &status); + ok(!ret, "success\n"); + ok(GetLastError() == CRYPT_E_REVOKED, "got %08lx\n", GetLastError()); + ok(status.dwError == CRYPT_E_REVOKED, "got %08lx\n", status.dwError); + ok(!status.dwIndex, "got %ld\n", status.dwIndex); + ok(!status.dwReason, "got %lu\n", status.dwReason); + CertFreeCertificateContext(revPara.pIssuerCert); + CertFreeCertificateContext(certs[0]); } static BYTE privKey[] = { @@ -3753,45 +4305,42 @@ static void testAcquireCertPrivateKey(void) CERT_KEY_CONTEXT keyContext; /* Don't cache provider */ + SetLastError(0xdeadbeef); ret = CryptAcquireCertificatePrivateKey(cert, 0, NULL, &certCSP, &keySpec, &callerFree); - ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", - GetLastError()); - if (ret) - { - ok(callerFree, "Expected callerFree to be TRUE\n"); - CryptReleaseContext(certCSP, 0); - } + ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", GetLastError()); + ok(GetLastError() == ERROR_SUCCESS, "got %08lx\n", GetLastError()); + ok(callerFree, "Expected callerFree to be TRUE\n"); + CryptReleaseContext(certCSP, 0); + SetLastError(0xdeadbeef); ret = CryptAcquireCertificatePrivateKey(cert, 0, NULL, &certCSP, NULL, NULL); - ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", - GetLastError()); + ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", GetLastError()); + ok(GetLastError() == ERROR_SUCCESS, "got %08lx\n", GetLastError()); CryptReleaseContext(certCSP, 0); /* Use the key prov info's caching (there shouldn't be any) */ + SetLastError(0xdeadbeef); ret = CryptAcquireCertificatePrivateKey(cert, CRYPT_ACQUIRE_USE_PROV_INFO_FLAG, NULL, &certCSP, &keySpec, &callerFree); - ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", - GetLastError()); - if (ret) - { - ok(callerFree, "Expected callerFree to be TRUE\n"); - CryptReleaseContext(certCSP, 0); - } + ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", GetLastError()); + ok(GetLastError() == ERROR_SUCCESS, "got %08lx\n", GetLastError()); + ok(callerFree, "Expected callerFree to be TRUE\n"); + CryptReleaseContext(certCSP, 0); /* Cache it (and check that it's cached) */ + SetLastError(0xdeadbeef); ret = CryptAcquireCertificatePrivateKey(cert, CRYPT_ACQUIRE_CACHE_FLAG, NULL, &certCSP, &keySpec, &callerFree); - ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", - GetLastError()); + ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", GetLastError()); + ok(GetLastError() == ERROR_SUCCESS, "got %08lx\n", GetLastError()); ok(!callerFree, "Expected callerFree to be FALSE\n"); size = sizeof(keyContext); ret = CertGetCertificateContextProperty(cert, CERT_KEY_CONTEXT_PROP_ID, &keyContext, &size); - ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", - GetLastError()); + ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", GetLastError()); /* Remove the cached provider */ CryptReleaseContext(keyContext.hCryptProv, 0); @@ -3802,17 +4351,17 @@ static void testAcquireCertPrivateKey(void) CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &keyProvInfo); /* Now use the key prov info's caching */ + SetLastError(0xdeadbeef); ret = CryptAcquireCertificatePrivateKey(cert, CRYPT_ACQUIRE_USE_PROV_INFO_FLAG, NULL, &certCSP, &keySpec, &callerFree); - ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", - GetLastError()); + ok(ret, "CryptAcquireCertificatePrivateKey failed: %08lx\n", GetLastError()); + ok(GetLastError() == ERROR_SUCCESS, "got %08lx\n", GetLastError()); ok(!callerFree, "Expected callerFree to be FALSE\n"); size = sizeof(keyContext); ret = CertGetCertificateContextProperty(cert, CERT_KEY_CONTEXT_PROP_ID, &keyContext, &size); - ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", - GetLastError()); + ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", GetLastError()); CryptReleaseContext(certCSP, 0); CryptDestroyKey(key); @@ -3828,7 +4377,7 @@ static void testAcquireCertPrivateKey(void) ok(ret, "CryptExportKey failed: %08lx\n", GetLastError()); if (ret) { - LPBYTE buf = HeapAlloc(GetProcessHeap(), 0, size), encodedKey; + LPBYTE buf = malloc(size), encodedKey; ret = CryptExportKey(key, 0, PUBLICKEYBLOB, 0, buf, &size); ok(ret, "CryptExportKey failed: %08lx\n", GetLastError()); @@ -3846,7 +4395,7 @@ static void testAcquireCertPrivateKey(void) "Unexpected value\n"); LocalFree(encodedKey); } - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } CryptDestroyKey(key); } @@ -3855,7 +4404,7 @@ static void testAcquireCertPrivateKey(void) ok(ret, "CryptExportPublicKeyInfoEx failed: %08lx\n", GetLastError()); if (ret) { - PCERT_PUBLIC_KEY_INFO info = HeapAlloc(GetProcessHeap(), 0, size); + PCERT_PUBLIC_KEY_INFO info = malloc(size); ret = CryptExportPublicKeyInfoEx(csp, AT_SIGNATURE, X509_ASN_ENCODING, NULL, 0, NULL, info, &size); @@ -3867,7 +4416,7 @@ static void testAcquireCertPrivateKey(void) ok(!memcmp(info->PublicKey.pbData, asnEncodedPublicKey, info->PublicKey.cbData), "Unexpected value\n"); } - HeapFree(GetProcessHeap(), 0, info); + free(info); } CryptReleaseContext(csp, 0); @@ -3992,7 +4541,7 @@ static void testKeyProvInfo(void) ret = CertGetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, NULL, &size); ok(ret, "CertGetCertificateContextProperty error %#lx\n", GetLastError()); - info = HeapAlloc(GetProcessHeap(), 0, size); + info = malloc(size); ret = CertGetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, info, &size); ok(ret, "CertGetCertificateContextProperty error %#lx\n", GetLastError()); ok(!lstrcmpW(info->pwszContainerName, containerW), "got %s\n", wine_dbgstr_w(info->pwszContainerName)); @@ -4010,7 +4559,7 @@ static void testKeyProvInfo(void) ok(info->rgProvParam[1].cbData == param[1].cbData, "got %#lx\n", info->rgProvParam[1].cbData); ok(!memcmp(info->rgProvParam[1].pbData, param[1].pbData, param[1].cbData), "param2 mismatch\n"); ok(info->rgProvParam[1].dwFlags == param[1].dwFlags, "got %#lx\n", info->rgProvParam[1].dwFlags); - HeapFree(GetProcessHeap(), 0, info); + free(info); ret = CertAddCertificateContextToStore(store, cert, CERT_STORE_ADD_NEW, NULL); ok(ret, "CertAddCertificateContextToStore error %#lx\n", GetLastError()); @@ -4029,7 +4578,7 @@ static void testKeyProvInfo(void) ret = CertGetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, NULL, &size); ok(ret, "CertGetCertificateContextProperty error %#lx\n", GetLastError()); - info = HeapAlloc(GetProcessHeap(), 0, size); + info = malloc(size); ret = CertGetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, info, &size); ok(ret, "CertGetCertificateContextProperty error %#lx\n", GetLastError()); ok(!lstrcmpW(info->pwszContainerName, containerW), "got %s\n", wine_dbgstr_w(info->pwszContainerName)); @@ -4047,7 +4596,7 @@ static void testKeyProvInfo(void) ok(info->rgProvParam[1].cbData == param[1].cbData, "got %#lx\n", info->rgProvParam[1].cbData); ok(!memcmp(info->rgProvParam[1].pbData, param[1].pbData, param[1].cbData), "param2 mismatch\n"); ok(info->rgProvParam[1].dwFlags == param[1].dwFlags, "got %#lx\n", info->rgProvParam[1].dwFlags); - HeapFree(GetProcessHeap(), 0, info); + free(info); ret = CertDeleteCertificateFromStore(cert); ok(ret, "CertDeleteCertificateFromStore error %#lx\n", GetLastError()); @@ -4126,7 +4675,7 @@ static void test_VerifySignature(void) ok(!status, "got %#lx\n", status); ok(hash_len == sizeof(hash_value), "got %lu\n", hash_len); - sig_value = HeapAlloc(GetProcessHeap(), 0, info->Signature.cbData); + sig_value = malloc(info->Signature.cbData); for (i = 0; i < info->Signature.cbData; i++) sig_value[i] = info->Signature.pbData[info->Signature.cbData - i - 1]; @@ -4134,7 +4683,7 @@ static void test_VerifySignature(void) status = BCryptVerifySignature(bkey, &pad, hash_value, sizeof(hash_value), sig_value, info->Signature.cbData, BCRYPT_PAD_PKCS1); ok(!status, "got %#lx\n", status); - HeapFree(GetProcessHeap(), 0, sig_value); + free(sig_value); BCryptDestroyHash(bhash); BCryptCloseAlgorithmProvider(alg, 0); BCryptDestroyKey(bkey); diff --git a/dlls/crypt32/tests/chain.c b/dlls/crypt32/tests/chain.c index 9ed1b28bf70..32f00801799 100644 --- wine/dlls/crypt32/tests/chain.c +++ wine/dlls/crypt32/tests/chain.c @@ -4958,6 +4958,13 @@ static const ChainPolicyCheck msRootPolicyCheck[] = { { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 }, }; +static const ChainPolicyCheck msRootPolicyCheck_approot[] = { + { { ARRAY_SIZE(chain32), chain32 }, + { 0, CERT_E_UNTRUSTEDROOT, 0, 2, NULL }, NULL, TODO_ELEMENTS }, + { { ARRAY_SIZE(chain33), chain33 }, + { 0, 0, 0, 0, NULL }, NULL, 0 }, +}; + static const char *num_to_str(WORD num) { static char buf[6]; @@ -5295,8 +5302,16 @@ static void check_ssl_policy(void) static void check_msroot_policy(void) { + CERT_CHAIN_POLICY_PARA para; + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_MICROSOFT_ROOT, NULL, msRootPolicyCheck, &may2020, NULL); + + para.cbSize = sizeof(para); + para.pvExtraPolicyPara = NULL; + para.dwFlags = MICROSOFT_ROOT_CERT_CHAIN_POLICY_CHECK_APPLICATION_ROOT_FLAG; + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_MICROSOFT_ROOT, NULL, + msRootPolicyCheck_approot, &may2020, ¶); } static void testVerifyCertChainPolicy(void) diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index 9dabe58efba..527e663860a 100644 --- wine/dlls/crypt32/tests/encode.c +++ wine/dlls/crypt32/tests/encode.c @@ -2315,10 +2315,10 @@ static const BYTE modulus1[] = { 0,0,0,1,1,1,1,1 }; static const BYTE modulus2[] = { 1,1,1,1,1,0,0,0 }; static const BYTE modulus3[] = { 0x80,1,1,1,1,0,0,0 }; static const BYTE modulus4[] = { 1,1,1,1,1,0,0,0x80 }; -static const BYTE mod1_encoded[] = { 0x30,0x0f,0x02,0x08,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x02,0x03,0x01,0x00,0x01 }; -static const BYTE mod2_encoded[] = { 0x30,0x0c,0x02,0x05,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x01,0x00,0x01 }; -static const BYTE mod3_encoded[] = { 0x30,0x0c,0x02,0x05,0x01,0x01,0x01,0x01,0x80,0x02,0x03,0x01,0x00,0x01 }; -static const BYTE mod4_encoded[] = { 0x30,0x10,0x02,0x09,0x00,0x80,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x01,0x00,0x01 }; +static const BYTE mod1_encoded[] = { 0x30,0x0f,0x02,0x08,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x01 }; +static const BYTE mod2_encoded[] = { 0x30,0x0c,0x02,0x05,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x02,0x00,0x01 }; +static const BYTE mod3_encoded[] = { 0x30,0x0c,0x02,0x05,0x01,0x01,0x01,0x01,0x80,0x02,0x03,0x02,0x00,0x01 }; +static const BYTE mod4_encoded[] = { 0x30,0x10,0x02,0x09,0x00,0x80,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x02,0x00,0x01 }; struct EncodedRSAPubKey { @@ -2351,7 +2351,7 @@ static void test_encodeRsaPublicKey(DWORD dwEncoding) hdr->aiKeyAlg = CALG_RSA_KEYX; rsaPubKey->magic = 0x31415352; rsaPubKey->bitlen = sizeof(modulus1) * 8; - rsaPubKey->pubexp = 65537; + rsaPubKey->pubexp = 131073; memcpy(toEncode + sizeof(BLOBHEADER) + sizeof(RSAPUBKEY), modulus1, sizeof(modulus1)); @@ -2480,7 +2480,7 @@ static void test_decodeRsaPublicKey(DWORD dwEncoding) "Expected magic RSA1, got %08lx\n", rsaPubKey->magic); ok(rsaPubKey->bitlen == rsaPubKeys[i].decodedModulusLen * 8, "Wrong bit len %ld\n", rsaPubKey->bitlen); - ok(rsaPubKey->pubexp == 65537, "Expected pubexp 65537, got %ld\n", + ok(rsaPubKey->pubexp == 131073, "Expected pubexp 131073, got %ld\n", rsaPubKey->pubexp); ok(!memcmp(buf + sizeof(BLOBHEADER) + sizeof(RSAPUBKEY), rsaPubKeys[i].modulus, rsaPubKeys[i].decodedModulusLen), @@ -2497,7 +2497,7 @@ static void test_encodeRsaPublicKey_Bcrypt(DWORD dwEncoding) BOOL ret; BYTE *buf = NULL; DWORD bufSize = 0, i; - BYTE pubexp[] = {0x01,0x00,0x01,0x00}; /* 65537 */ + BYTE pubexp[] = {0x01,0x00,0x02,0x00}; /* 131073 */ /* Verify that the Magic value doesn't matter */ hdr->Magic = 1; @@ -2568,7 +2568,7 @@ static void test_decodeRsaPublicKey_Bcrypt(DWORD dwEncoding) if (ret) { BCRYPT_RSAKEY_BLOB *hdr = (BCRYPT_RSAKEY_BLOB *)buf; - BYTE pubexp[] = {0xff,0xff,0xff,0xff}, pubexp_expected[] = {0x01,0x00,0x01}; + BYTE pubexp[] = {0xff,0xff,0xff,0xcc}, pubexp_expected[] = {0x01,0x00,0x02}; /* CNG_RSA_PUBLIC_KEY_BLOB stores the exponent * in big-endian format, so we need to convert it to little-endian */ @@ -2584,15 +2584,15 @@ static void test_decodeRsaPublicKey_Bcrypt(DWORD dwEncoding) /* Windows decodes the exponent to 3 bytes, since it will fit. * Our implementation currently unconditionally decodes to a DWORD (4 bytes) */ - todo_wine ok(hdr->cbPublicExp == 3, "Expected cbPublicExp 3, got %ld\n", hdr->cbPublicExp); + ok(hdr->cbPublicExp == 3, "Expected cbPublicExp 3, got %ld\n", hdr->cbPublicExp); ok(hdr->cbModulus == rsaPubKeys[i].decodedModulusLen, "Wrong modulus len %ld\n", hdr->cbModulus); ok(hdr->cbPrime1 == 0,"Wrong cbPrime1 %ld\n", hdr->cbPrime1); ok(hdr->cbPrime2 == 0,"Wrong cbPrime2 %ld\n", hdr->cbPrime2); ok(!memcmp(pubexp, pubexp_expected, sizeof(pubexp_expected)), "Wrong exponent\n"); - todo_wine ok(pubexp[3] == 0xff, "Got %02x\n", pubexp[3]); + ok(pubexp[3] == 0xcc, "Got %02x\n", pubexp[3]); - leModulus = HeapAlloc(GetProcessHeap(), 0, hdr->cbModulus); + leModulus = malloc(hdr->cbModulus); /* * CNG_RSA_PUBLIC_KEY_BLOB stores the modulus in big-endian format, * so we need to convert it to little-endian @@ -2603,7 +2603,7 @@ static void test_decodeRsaPublicKey_Bcrypt(DWORD dwEncoding) rsaPubKeys[i].modulus, rsaPubKeys[i].decodedModulusLen), "Unexpected modulus\n"); LocalFree(buf); - LocalFree(leModulus); + free(leModulus); } } } @@ -2799,13 +2799,13 @@ static void test_decodeExtensions(DWORD dwEncoding) ret = CryptDecodeObjectEx(dwEncoding, X509_EXTENSIONS, exts[i].encoded, exts[i].encoded[1] + 2, 0, NULL, NULL, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufSize); + buf = calloc(1, bufSize); if (buf) { ret = CryptDecodeObjectEx(dwEncoding, X509_EXTENSIONS, exts[i].encoded, exts[i].encoded[1] + 2, 0, NULL, buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } } @@ -3770,14 +3770,14 @@ static void test_decodeCRLDistPoints(DWORD dwEncoding) distPointWithUrlAndIssuer, distPointWithUrlAndIssuer[1] + 2, 0, NULL, NULL, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + buf = calloc(1, size); if (buf) { ret = CryptDecodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, distPointWithUrlAndIssuer, distPointWithUrlAndIssuer[1] + 2, 0, NULL, buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } @@ -4906,13 +4906,13 @@ static void test_decodeEnhancedKeyUsage(DWORD dwEncoding) ret = CryptDecodeObjectEx(dwEncoding, X509_ENHANCED_KEY_USAGE, encodedUsage, sizeof(encodedUsage), 0, NULL, NULL, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + buf = calloc(1, size); if (buf) { ret = CryptDecodeObjectEx(dwEncoding, X509_ENHANCED_KEY_USAGE, encodedUsage, sizeof(encodedUsage), 0, NULL, buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } @@ -5391,14 +5391,14 @@ static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) authorityInfoAccessWithUrlAndIPAddr, sizeof(authorityInfoAccessWithUrlAndIPAddr), 0, NULL, NULL, &size); ok(ret, "CryptDecodeObjectEx failed: %lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + buf = calloc(1, size); if (buf) { ret = CryptDecodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, authorityInfoAccessWithUrlAndIPAddr, sizeof(authorityInfoAccessWithUrlAndIPAddr), 0, NULL, buf, &size); ok(ret, "CryptDecodeObjectEx failed: %lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } @@ -6354,13 +6354,13 @@ static void test_decodePKCSAttributes(DWORD dwEncoding) ret = CryptDecodeObjectEx(dwEncoding, PKCS_ATTRIBUTES, doublePKCSAttributes, sizeof(doublePKCSAttributes), 0, NULL, NULL, &size); ok(ret, "CryptDecodeObjectEx failed: %lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + buf = calloc(1, size); if (buf) { ret = CryptDecodeObjectEx(dwEncoding, PKCS_ATTRIBUTES, doublePKCSAttributes, sizeof(doublePKCSAttributes), 0, NULL, buf, &size); ok(ret, "CryptDecodeObjectEx failed: %lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } @@ -6522,14 +6522,14 @@ static void test_decodePKCSSMimeCapabilities(DWORD dwEncoding) ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, twoCapabilities, sizeof(twoCapabilities), 0, NULL, NULL, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + ptr = calloc(1, size); if (ptr) { SetLastError(0xdeadbeef); ret = CryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, twoCapabilities, sizeof(twoCapabilities), 0, NULL, ptr, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, ptr); + free(ptr); } } @@ -7645,13 +7645,13 @@ static void test_decodeCertPolicies(DWORD dwEncoding) ret = CryptDecodeObjectEx(dwEncoding, X509_CERT_POLICIES, twoPolicies, sizeof(twoPolicies), 0, NULL, NULL, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + info = calloc(1, size); if (info) { ret = CryptDecodeObjectEx(dwEncoding, X509_CERT_POLICIES, twoPolicies, sizeof(twoPolicies), 0, NULL, info, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, info); + free(info); } } @@ -7788,14 +7788,14 @@ static void test_decodeCertPolicyMappings(DWORD dwEncoding) policyMappingWithTwoMappings, sizeof(policyMappingWithTwoMappings), 0, NULL, NULL, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + info = calloc(1, size); if (info) { ret = CryptDecodeObjectEx(dwEncoding, mappingOids[i], policyMappingWithTwoMappings, sizeof(policyMappingWithTwoMappings), 0, NULL, info, &size); ok(ret, "CryptDecodeObjectEx failed: %08lx\n", GetLastError()); - HeapFree(GetProcessHeap(), 0, info); + free(info); } } } @@ -8225,7 +8225,6 @@ static void test_decodeRsaPrivateKey(DWORD dwEncoding) } } -/* Free *pInfo with HeapFree */ static void testExportPublicKey(HCRYPTPROV csp, PCERT_PUBLIC_KEY_INFO *pInfo) { BOOL ret; @@ -8262,7 +8261,7 @@ static void testExportPublicKey(HCRYPTPROV csp, PCERT_PUBLIC_KEY_INFO *pInfo) ret = CryptExportPublicKeyInfoEx(csp, AT_SIGNATURE, X509_ASN_ENCODING, NULL, 0, NULL, NULL, &size); ok(ret, "CryptExportPublicKeyInfoEx failed: %08lx\n", GetLastError()); - *pInfo = HeapAlloc(GetProcessHeap(), 0, size); + *pInfo = malloc(size); if (*pInfo) { ret = CryptExportPublicKeyInfoEx(csp, AT_SIGNATURE, @@ -8411,7 +8410,7 @@ static void testPortPublicKeyInfo(void) testExportPublicKey(csp, &info); testImportPublicKey(csp, info); - HeapFree(GetProcessHeap(), 0, info); + free(info); CryptReleaseContext(csp, 0); ret = CryptAcquireContextA(&csp, cspName, MS_DEF_PROV_A, PROV_RSA_FULL, CRYPT_DELETEKEYSET); @@ -8674,6 +8673,26 @@ static const BYTE ocsp_basic_response[] = { 0x33, 0x36, 0x30, 0x31, 0x5a }; +static const BYTE ocsp_basic_response2[] = { + 0x30, 0x81, 0xbe, 0xa1, 0x34, 0x30, 0x32, 0x31, 0x0b, 0x30, 0x09, 0x06, + 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x4c, 0x65, 0x74, 0x27, 0x73, + 0x20, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x02, 0x52, 0x33, 0x18, 0x0f, 0x32, + 0x30, 0x32, 0x32, 0x31, 0x30, 0x32, 0x30, 0x30, 0x36, 0x30, 0x31, 0x30, + 0x30, 0x5a, 0x30, 0x75, 0x30, 0x73, 0x30, 0x4b, 0x30, 0x09, 0x06, 0x05, + 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x48, 0xda, 0xc9, + 0xa0, 0xfb, 0x2b, 0xd3, 0x2d, 0x4f, 0xf0, 0xde, 0x68, 0xd2, 0xf5, 0x67, + 0xb7, 0x35, 0xf9, 0xb3, 0xc4, 0x04, 0x14, 0x14, 0x2e, 0xb3, 0x17, 0xb7, + 0x58, 0x56, 0xcb, 0xae, 0x50, 0x09, 0x40, 0xe6, 0x1f, 0xaf, 0x9d, 0x8b, + 0x14, 0xc2, 0xc6, 0x02, 0x12, 0x03, 0x26, 0x1c, 0x82, 0x80, 0xf3, 0x8c, + 0x13, 0xef, 0xae, 0x83, 0x9d, 0x89, 0xb9, 0xcd, 0x59, 0x83, 0x5b, 0x80, + 0x00, 0x18, 0x0f, 0x32, 0x30, 0x32, 0x32, 0x31, 0x30, 0x32, 0x30, 0x30, + 0x36, 0x30, 0x30, 0x30, 0x30, 0x5a, 0xa0, 0x11, 0x18, 0x0f, 0x32, 0x30, + 0x32, 0x32, 0x31, 0x30, 0x32, 0x37, 0x30, 0x35, 0x35, 0x39, 0x35, 0x38, + 0x5a +}; + static const BYTE ocsp_basic_response_revoked[] = { 0x30, 0x81, 0xb1, 0xa2, 0x16, 0x04, 0x14, 0xa4, 0x8d, 0xe5, 0xbe, 0x7c, 0x79, 0xe4, 0x70, 0x23, 0x6d, 0x2e, 0x29, 0x34, 0xad, 0x23, 0x58, 0xdc, @@ -8759,22 +8778,36 @@ static void test_decodeOCSPBasicResponseInfo(DWORD dwEncoding) static const BYTE resp_id2[] = { 0xa4, 0x8d, 0xe5, 0xbe, 0x7c, 0x79, 0xe4, 0x70, 0x23, 0x6d, 0x2e, 0x29, 0x34, 0xad, 0x23, 0x58, 0xdc, 0xf5, 0x31, 0x7f}; + static const BYTE resp_id3[] = { + 0x30, 0x32, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x4c, 0x65, 0x74, 0x27, 0x73, 0x20, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x13, 0x02, 0x52, 0x33}; static const BYTE name_hash[] = { 0xe4, 0xe3, 0x95, 0xa2, 0x29, 0xd3, 0xd4, 0xc1, 0xc3, 0x1f, 0xf0, 0x98, 0x0c, 0x0b, 0x4e, 0xc0, 0x09, 0x8a, 0xab, 0xd8}; static const BYTE name_hash2[] = { 0x74, 0xb4, 0xe7, 0x23, 0x19, 0xc7, 0x65, 0x92, 0x15, 0x40, 0x44, 0x7b, 0xc7, 0xce, 0x3e, 0x90, 0xc2, 0x18, 0x76, 0xeb}; + static const BYTE name_hash3[] = { + 0x48, 0xda, 0xc9, 0xa0, 0xfb, 0x2b, 0xd3, 0x2d, 0x4f, 0xf0, 0xde, 0x68, 0xd2, 0xf5, 0x67, 0xb7, + 0x35, 0xf9, 0xb3, 0xc4}; static const BYTE key_hash[] = { 0xb7, 0x6b, 0xa2, 0xea, 0xa8, 0xaa, 0x84, 0x8c, 0x79, 0xea, 0xb4, 0xda, 0x0f, 0x98, 0xb2, 0xc5, 0x95, 0x76, 0xb9, 0xf4}; static const BYTE key_hash2[] = { 0xa4, 0x8d, 0xe5, 0xbe, 0x7c, 0x79, 0xe4, 0x70, 0x23, 0x6d, 0x2e, 0x29, 0x34, 0xad, 0x23, 0x58, 0xdc, 0xf5, 0x31, 0x7f}; + static const BYTE key_hash3[] = { + 0x14, 0x2e, 0xb3, 0x17, 0xb7, 0x58, 0x56, 0xcb, 0xae, 0x50, 0x09, 0x40, 0xe6, 0x1f, 0xaf, 0x9d, + 0x8b, 0x14, 0xc2, 0xc6}; static const BYTE serial[] = { 0xb1, 0xc1, 0x87, 0x54, 0x54, 0xac, 0x1e, 0x55, 0x40, 0xfb, 0xef, 0xd9, 0x6d, 0x8f, 0x49, 0x08}; static const BYTE serial2[] = { 0x2f, 0x57, 0xa4, 0x85, 0xa2, 0xe3, 0x52, 0x54, 0x9a, 0x3b, 0x85, 0x98, 0xa2, 0x67, 0x2e, 0x0d}; + static const BYTE serial3[] = { + 0x5b, 0x83, 0x59, 0xcd, 0xb9, 0x89, 0x9d, 0x83, 0xae, 0xef, 0x13, 0x8c, 0xf3, 0x80, 0x82, 0x1c, + 0x26, 0x03}; OCSP_BASIC_RESPONSE_INFO *info; OCSP_BASIC_RESPONSE_ENTRY *entry; OCSP_BASIC_REVOKED_INFO *revoked; @@ -8801,11 +8834,11 @@ static void test_decodeOCSPBasicResponseInfo(DWORD dwEncoding) ok(entry->CertId.HashAlgorithm.Parameters.cbData == 2, "got %lu\n", entry->CertId.HashAlgorithm.Parameters.cbData); ok(entry->CertId.HashAlgorithm.Parameters.pbData[0] == 5, "got 0x%02x\n", entry->CertId.HashAlgorithm.Parameters.pbData[0]); ok(!entry->CertId.HashAlgorithm.Parameters.pbData[1], "got 0x%02x\n", entry->CertId.HashAlgorithm.Parameters.pbData[1]); - ok(entry->CertId.IssuerNameHash.cbData == 20, "got %lu\n", entry->CertId.IssuerNameHash.cbData); + ok(entry->CertId.IssuerNameHash.cbData == sizeof(name_hash), "got %lu\n", entry->CertId.IssuerNameHash.cbData); ok(!memcmp(entry->CertId.IssuerNameHash.pbData, name_hash, sizeof(name_hash)), "wrong data\n"); - ok(entry->CertId.IssuerKeyHash.cbData == 20, "got %lu\n", entry->CertId.IssuerKeyHash.cbData); + ok(entry->CertId.IssuerKeyHash.cbData == sizeof(key_hash), "got %lu\n", entry->CertId.IssuerKeyHash.cbData); ok(!memcmp(entry->CertId.IssuerKeyHash.pbData, key_hash, sizeof(key_hash)), "wrong data\n"); - ok(entry->CertId.SerialNumber.cbData == 16, "got %lu\n", entry->CertId.SerialNumber.cbData); + ok(entry->CertId.SerialNumber.cbData == sizeof(serial), "got %lu\n", entry->CertId.SerialNumber.cbData); ok(!memcmp(entry->CertId.SerialNumber.pbData, serial, sizeof(serial)), "wrong data\n"); ok(entry->dwCertStatus == 0, "got %lu\n", entry->dwCertStatus); ok(entry->pRevokedInfo == NULL, "got %p\n", entry->pRevokedInfo); @@ -8824,9 +8857,8 @@ static void test_decodeOCSPBasicResponseInfo(DWORD dwEncoding) size = 0; ret = CryptDecodeObjectEx(dwEncoding, OCSP_BASIC_RESPONSE, ocsp_basic_response_revoked, sizeof(ocsp_basic_response_revoked), CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size); - todo_wine ok(ret, "got %08lx\n", GetLastError()); + ok(ret, "got %08lx\n", GetLastError()); - if (ret) { ok(!info->dwVersion, "got %lu\n", info->dwVersion); ok(info->dwResponderIdChoice == 2, "got %lu\n", info->dwResponderIdChoice); ok(info->ByKeyResponderId.cbData == sizeof(resp_id), "got %lu\n", info->ByKeyResponderId.cbData); @@ -8841,11 +8873,11 @@ static void test_decodeOCSPBasicResponseInfo(DWORD dwEncoding) ok(entry->CertId.HashAlgorithm.Parameters.cbData == 2, "got %lu\n", entry->CertId.HashAlgorithm.Parameters.cbData); ok(entry->CertId.HashAlgorithm.Parameters.pbData[0] == 5, "got 0x%02x\n", entry->CertId.HashAlgorithm.Parameters.pbData[0]); ok(!entry->CertId.HashAlgorithm.Parameters.pbData[1], "got 0x%02x\n", entry->CertId.HashAlgorithm.Parameters.pbData[1]); - ok(entry->CertId.IssuerNameHash.cbData == 20, "got %lu\n", entry->CertId.IssuerNameHash.cbData); + ok(entry->CertId.IssuerNameHash.cbData == sizeof(name_hash2), "got %lu\n", entry->CertId.IssuerNameHash.cbData); ok(!memcmp(entry->CertId.IssuerNameHash.pbData, name_hash2, sizeof(name_hash2)), "wrong data\n"); - ok(entry->CertId.IssuerKeyHash.cbData == 20, "got %lu\n", entry->CertId.IssuerKeyHash.cbData); + ok(entry->CertId.IssuerKeyHash.cbData == sizeof(key_hash2), "got %lu\n", entry->CertId.IssuerKeyHash.cbData); ok(!memcmp(entry->CertId.IssuerKeyHash.pbData, key_hash2, sizeof(key_hash2)), "wrong data\n"); - ok(entry->CertId.SerialNumber.cbData == 16, "got %lu\n", entry->CertId.SerialNumber.cbData); + ok(entry->CertId.SerialNumber.cbData == sizeof(serial2), "got %lu\n", entry->CertId.SerialNumber.cbData); ok(!memcmp(entry->CertId.SerialNumber.pbData, serial2, sizeof(serial2)), "wrong data\n"); ok(entry->dwCertStatus == 1, "got %lu\n", entry->dwCertStatus); ok(entry->pRevokedInfo != NULL, "got NULL\n"); @@ -8864,7 +8896,46 @@ static void test_decodeOCSPBasicResponseInfo(DWORD dwEncoding) ok(!info->cExtension, "got %lu\n", info->cExtension); ok(info->rgExtension == NULL, "got %p\n", info->rgExtension); - } + LocalFree(info); + + size = 0; + ret = CryptDecodeObjectEx(dwEncoding, OCSP_BASIC_RESPONSE, ocsp_basic_response2, + sizeof(ocsp_basic_response2), CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size); + ok(ret, "got %08lx\n", GetLastError()); + + ok(!info->dwVersion, "got %lu\n", info->dwVersion); + ok(info->dwResponderIdChoice == 1, "got %lu\n", info->dwResponderIdChoice); + ok(info->ByNameResponderId.cbData == sizeof(resp_id3), "got %lu\n", info->ByNameResponderId.cbData); + ok(!memcmp(info->ByNameResponderId.pbData, resp_id3, sizeof(resp_id3)), "wrong data\n"); + + ok(info->ProducedAt.dwLowDateTime == 1408824832, "got %lu\n", info->ProducedAt.dwLowDateTime); + ok(info->ProducedAt.dwHighDateTime == 30991433, "got %lu\n", info->ProducedAt.dwHighDateTime); + ok(info->cResponseEntry == 1, "got %lu\n", info->cResponseEntry); + ok(info->rgResponseEntry != NULL, "got %p\n", info->rgResponseEntry); + + entry = info->rgResponseEntry; + ok(!strcmp(entry->CertId.HashAlgorithm.pszObjId, szOID_OIWSEC_sha1), "got '%s'\n", entry->CertId.HashAlgorithm.pszObjId); + ok(entry->CertId.HashAlgorithm.Parameters.cbData == 2, "got %lu\n", entry->CertId.HashAlgorithm.Parameters.cbData); + ok(entry->CertId.HashAlgorithm.Parameters.pbData[0] == 5, "got 0x%02x\n", entry->CertId.HashAlgorithm.Parameters.pbData[0]); + ok(!entry->CertId.HashAlgorithm.Parameters.pbData[1], "got 0x%02x\n", entry->CertId.HashAlgorithm.Parameters.pbData[1]); + ok(entry->CertId.IssuerNameHash.cbData == sizeof(name_hash3), "got %lu\n", entry->CertId.IssuerNameHash.cbData); + ok(!memcmp(entry->CertId.IssuerNameHash.pbData, name_hash3, sizeof(name_hash3)), "wrong data\n"); + + ok(entry->CertId.IssuerKeyHash.cbData == sizeof(key_hash3), "got %lu\n", entry->CertId.IssuerKeyHash.cbData); + ok(!memcmp(entry->CertId.IssuerKeyHash.pbData, key_hash3, sizeof(key_hash3)), "wrong data\n"); + ok(entry->CertId.SerialNumber.cbData == sizeof(serial3), "got %lu\n", entry->CertId.SerialNumber.cbData); + ok(!memcmp(entry->CertId.SerialNumber.pbData, serial3, sizeof(serial3)), "wrong data\n"); + ok(entry->dwCertStatus == 0, "got %lu\n", entry->dwCertStatus); + ok(entry->pRevokedInfo == NULL, "got %p\n", entry->pRevokedInfo); + ok(entry->ThisUpdate.dwLowDateTime == 808824832, "got %lu\n", entry->ThisUpdate.dwLowDateTime); + ok(entry->ThisUpdate.dwHighDateTime == 30991433, "got %lu\n", entry->ThisUpdate.dwHighDateTime); + ok(entry->NextUpdate.dwLowDateTime == 1474872064, "got %lu\n", entry->NextUpdate.dwLowDateTime); + ok(entry->NextUpdate.dwHighDateTime == 30992841, "got %lu\n", entry->NextUpdate.dwHighDateTime); + ok(!entry->cExtension, "got %lu\n", entry->cExtension); + ok(entry->rgExtension == NULL, "got %p\n", entry->rgExtension); + + ok(!info->cExtension, "got %lu\n", info->cExtension); + ok(info->rgExtension == NULL, "got %p\n", info->rgExtension); LocalFree(info); } diff --git a/dlls/crypt32/tests/main.c b/dlls/crypt32/tests/main.c index 19dde3fb28f..1b125e89d50 100644 --- wine/dlls/crypt32/tests/main.c +++ wine/dlls/crypt32/tests/main.c @@ -349,7 +349,7 @@ static void test_getDefaultCryptProv(void) prov = pI_CryptGetDefaultCryptProv(test_prov[i].algid); if (!prov) { - todo_wine_if(test_prov[i].algid == CALG_DSS_SIGN || test_prov[i].algid == CALG_NO_SIGN) +todo_wine_if(test_prov[i].algid == CALG_DSS_SIGN || test_prov[i].algid == CALG_NO_SIGN) ok(test_prov[i].optional, "%lu: I_CryptGetDefaultCryptProv(%#x) failed\n", i, test_prov[i].algid); continue; } diff --git a/dlls/crypt32/tests/message.c b/dlls/crypt32/tests/message.c index fa4790a2a6b..e6339553e52 100644 --- wine/dlls/crypt32/tests/message.c +++ wine/dlls/crypt32/tests/message.c @@ -688,14 +688,14 @@ static void test_hash_message(void) /* Actually attempting to get the hashed data fails, perhaps because * detached is FALSE. */ - hashedBlob = HeapAlloc(GetProcessHeap(), 0, hashedBlobSize); + hashedBlob = malloc(hashedBlobSize); SetLastError(0xdeadbeef); ret = CryptHashMessage(¶, FALSE, 2, toHash, hashSize, hashedBlob, &hashedBlobSize, NULL, NULL); ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, "expected CRYPT_E_MSG_ERROR, got 0x%08lx (%ld)\n", GetLastError(), GetLastError()); - HeapFree(GetProcessHeap(), 0, hashedBlob); + free(hashedBlob); } /* Repeating tests with fDetached = TRUE results in success */ SetLastError(0xdeadbeef); @@ -704,7 +704,7 @@ static void test_hash_message(void) ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError()); if (ret) { - hashedBlob = HeapAlloc(GetProcessHeap(), 0, hashedBlobSize); + hashedBlob = malloc(hashedBlobSize); SetLastError(0xdeadbeef); ret = CryptHashMessage(¶, TRUE, 2, toHash, hashSize, hashedBlob, &hashedBlobSize, NULL, NULL); @@ -713,7 +713,7 @@ static void test_hash_message(void) "unexpected size of detached blob %ld\n", hashedBlobSize); ok(!memcmp(hashedBlob, detachedHashBlob, hashedBlobSize), "unexpected detached blob value\n"); - HeapFree(GetProcessHeap(), 0, hashedBlob); + free(hashedBlob); } /* Hashing a single item with fDetached = FALSE also succeeds */ SetLastError(0xdeadbeef); @@ -722,7 +722,7 @@ static void test_hash_message(void) ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError()); if (ret) { - hashedBlob = HeapAlloc(GetProcessHeap(), 0, hashedBlobSize); + hashedBlob = malloc(hashedBlobSize); ret = CryptHashMessage(¶, FALSE, 1, toHash, hashSize, hashedBlob, &hashedBlobSize, NULL, NULL); ok(ret, "CryptHashMessage failed: 0x%08lx\n", GetLastError()); @@ -730,7 +730,7 @@ static void test_hash_message(void) "unexpected size of detached blob %ld\n", hashedBlobSize); ok(!memcmp(hashedBlob, hashBlob, hashedBlobSize), "unexpected detached blob value\n"); - HeapFree(GetProcessHeap(), 0, hashedBlob); + free(hashedBlob); } /* Check the computed hash value too. You don't need to get the encoded * blob to get it. @@ -743,7 +743,7 @@ static void test_hash_message(void) computedHashSize); if (ret) { - computedHash = HeapAlloc(GetProcessHeap(), 0, computedHashSize); + computedHash = malloc(computedHashSize); SetLastError(0xdeadbeef); ret = CryptHashMessage(¶, TRUE, 2, toHash, hashSize, NULL, &hashedBlobSize, computedHash, &computedHashSize); @@ -752,7 +752,7 @@ static void test_hash_message(void) "unexpected size of hash value %ld\n", computedHashSize); ok(!memcmp(computedHash, hashVal, computedHashSize), "unexpected value\n"); - HeapFree(GetProcessHeap(), 0, computedHash); + free(computedHash); } } diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c index f779d70695e..16f7402c613 100644 --- wine/dlls/crypt32/tests/msg.c +++ wine/dlls/crypt32/tests/msg.c @@ -274,14 +274,14 @@ static void check_param(LPCSTR test, HCRYPTMSG msg, DWORD param, ret = CryptMsgGetParam(msg, param, 0, NULL, &size); ok(ret, "%s: CryptMsgGetParam failed: %08lx\n", test, GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); ret = CryptMsgGetParam(msg, param, 0, buf, &size); ok(ret, "%s: CryptMsgGetParam failed: %08lx\n", test, GetLastError()); ok(size == expectedSize, "%s: expected size %ld, got %ld\n", test, expectedSize, size); if (size == expectedSize && size) ok(!memcmp(buf, expected, size), "%s: unexpected data\n", test); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } static void test_data_msg_open(void) diff --git a/dlls/crypt32/tests/object.c b/dlls/crypt32/tests/object.c index 22936d3738d..a3c7c8c0743 100644 --- wine/dlls/crypt32/tests/object.c +++ wine/dlls/crypt32/tests/object.c @@ -95,130 +95,10 @@ L"MIIBiQYJKoZIhvcNAQcCoIIBejCCAXYCAQExDjAMBggqhkiG9w0CBQUAMBMGCSqG" "s+9Z0WbRm8CatppebW9tDVmpqm7pLKAe7sJgvFm+P2MGjckRHSNkku8u/FcppK/g" "7pMZOVHkRLgLKPSoDQ=="; -/* Self-signed .exe, built with tcc, signed with signtool - * (and a certificate generated on a self-signed CA). - * - * small.c: - * int _start() - * { - * return 0; - * } - * - * tcc -nostdlib small.c - * signtool sign /v /f codesign.pfx small.exe - */ -static const BYTE signed_pe_blob[] = -{ - 0x4D,0x5A,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xB8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0E,0x1F,0xBA,0x0E,0x00,0xB4,0x09,0xCD, - 0x21,0xB8,0x01,0x4C,0xCD,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6F,0x67,0x72,0x61,0x6D,0x20,0x63,0x61,0x6E,0x6E,0x6F, - 0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6E,0x20,0x69,0x6E,0x20,0x44,0x4F,0x53,0x20,0x6D,0x6F,0x64,0x65,0x2E,0x0D,0x0D,0x0A, - 0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x4C,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0xE0,0x00,0x0F,0x03,0x0B,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x00, - 0xE7,0x0C,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00, - 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x68,0x05,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2E,0x74,0x65,0x78,0x74,0x00,0x00,0x00, - 0x18,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x89,0xE5,0x81,0xEC,0x00,0x00,0x00,0x00,0x90,0xB8,0x00,0x00,0x00,0x00,0xE9, - 0x00,0x00,0x00,0x00,0xC9,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0x05,0x00,0x00,0x00,0x02,0x02,0x00, - /* Start of the signature overlay */ - 0x30,0x82,0x05,0x5A,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x07,0x02,0xA0,0x82,0x05,0x4B,0x30,0x82,0x05,0x47,0x02, - 0x01,0x01,0x31,0x0B,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x30,0x4C,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01, - 0x82,0x37,0x02,0x01,0x04,0xA0,0x3E,0x30,0x3C,0x30,0x17,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0F,0x30, - 0x09,0x03,0x01,0x00,0xA0,0x04,0xA2,0x02,0x80,0x00,0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04, - 0x14,0xA0,0x95,0xDE,0xBD,0x1A,0xB7,0x86,0xAF,0x50,0x63,0xD8,0x8F,0x90,0xD5,0x49,0x96,0x4E,0x44,0xF0,0x71,0xA0,0x82,0x03, - 0x1D,0x30,0x82,0x03,0x19,0x30,0x82,0x02,0x01,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x96,0x53,0x2C,0xC9,0x23,0x56,0x8A,0x87, - 0x42,0x30,0x3E,0xD5,0x8D,0x72,0xD5,0x25,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30, - 0x17,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74, - 0x30,0x1E,0x17,0x0D,0x31,0x36,0x30,0x33,0x30,0x33,0x32,0x30,0x32,0x37,0x30,0x37,0x5A,0x17,0x0D,0x34,0x39,0x31,0x32,0x33, - 0x31,0x32,0x33,0x30,0x30,0x30,0x30,0x5A,0x30,0x17,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x43,0x6F,0x64, - 0x65,0x53,0x69,0x67,0x6E,0x54,0x65,0x73,0x74,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, - 0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xB2,0xC9,0x91,0x98,0x8C,0xDC, - 0x80,0xBC,0x16,0xBF,0xC1,0x04,0x77,0x90,0xC0,0xFD,0x8C,0xBA,0x68,0x26,0xAC,0xB7,0x20,0x68,0x41,0xED,0xC3,0x9C,0x47,0x7C, - 0x36,0xC2,0x7B,0xE1,0x5E,0xFD,0xA9,0x99,0xF4,0x29,0x36,0x86,0x93,0x40,0x55,0x53,0x65,0x79,0xBC,0x9F,0x8F,0x6E,0x2B,0x05, - 0x84,0xE1,0xFD,0xD2,0xEF,0xEA,0x89,0x8C,0xEC,0xF9,0x55,0xF0,0x2C,0xE5,0xA7,0x29,0xF9,0x7E,0x50,0xDC,0x9C,0xA1,0x23,0xA5, - 0xD9,0x78,0xA1,0xE7,0x7C,0xD7,0x04,0x4F,0x11,0xAC,0x9F,0x4A,0x47,0xA1,0x1E,0xD5,0x9E,0xE7,0x5B,0xB5,0x8C,0x9C,0x67,0x7A, - 0xD0,0xF8,0x54,0xD1,0x64,0x7F,0x39,0x48,0xB6,0xCF,0x2F,0x26,0x7D,0x7B,0x13,0x2B,0xC2,0x8F,0xA6,0x3F,0x42,0x71,0x95,0x3E, - 0x59,0x0F,0x12,0xFA,0xC2,0x70,0x89,0xB7,0xB6,0x10,0x49,0xE0,0x7D,0x4D,0xFC,0x80,0x61,0x53,0x50,0x72,0xFD,0x46,0x35,0x51, - 0x36,0xE6,0x06,0xA9,0x4C,0x0D,0x82,0x15,0xF6,0x5D,0xDE,0xD4,0xDB,0xE7,0x82,0x10,0x40,0xA1,0x47,0x68,0x88,0x0C,0x0A,0x80, - 0xD1,0xE5,0x9A,0x35,0x28,0x82,0x1F,0x0F,0x80,0x5A,0x6E,0x1D,0x22,0x22,0xB3,0xA7,0xA2,0x9E,0x82,0x2D,0xC0,0x7F,0x5A,0xD0, - 0xBA,0xB2,0xCA,0x20,0xE2,0x97,0xE9,0x72,0x41,0xB7,0xD6,0x1A,0x93,0x23,0x97,0xF0,0xA9,0x61,0xD2,0x91,0xBD,0xB6,0x6B,0x95, - 0x12,0x67,0x16,0xAC,0x0A,0xB7,0x55,0x02,0x0D,0xA5,0xAD,0x17,0x95,0x77,0xF9,0x96,0x03,0x41,0xD3,0xE1,0x61,0x68,0xBB,0x0A, - 0xB5,0xC4,0xEE,0x70,0x40,0x08,0x05,0xC4,0xF1,0x5D,0x02,0x03,0x01,0x00,0x01,0xA3,0x61,0x30,0x5F,0x30,0x13,0x06,0x03,0x55, - 0x1D,0x25,0x04,0x0C,0x30,0x0A,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x30,0x48,0x06,0x03,0x55,0x1D,0x01,0x04, - 0x41,0x30,0x3F,0x80,0x10,0x35,0x40,0x67,0x8F,0x7D,0x03,0x1B,0x76,0x52,0x62,0x2D,0xF5,0x21,0xF6,0x7C,0xBC,0xA1,0x19,0x30, - 0x17,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74, - 0x82,0x10,0xA0,0x4B,0xEB,0xAC,0xFA,0x08,0xF2,0x8B,0x47,0xD2,0xB3,0x54,0x60,0x6C,0xE6,0x29,0x30,0x0D,0x06,0x09,0x2A,0x86, - 0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x5F,0x8C,0x7F,0xDA,0x1D,0x21,0x7A,0x15,0xD8,0x20, - 0x04,0x53,0x7F,0x44,0x6D,0x7B,0x57,0xBE,0x7F,0x86,0x77,0x58,0xC4,0xD4,0x80,0xC7,0x2E,0x64,0x9B,0x44,0xC5,0x2D,0x6D,0xDB, - 0x35,0x5A,0xFE,0xA4,0xD8,0x66,0x9B,0xF7,0x6E,0xFC,0xEF,0x52,0x7B,0xC5,0x16,0xE6,0xA3,0x7D,0x59,0xB7,0x31,0x28,0xEB,0xB5, - 0x45,0xC9,0xB1,0xD1,0x08,0x67,0xC6,0x37,0xE7,0xD7,0x2A,0xE6,0x1F,0xD9,0x6A,0xE5,0x04,0xDF,0x6A,0x9D,0x91,0xFA,0x41,0xBD, - 0x2A,0x50,0xEA,0x99,0x24,0xA9,0x0F,0x2B,0x50,0x51,0x5F,0xD9,0x0B,0x89,0x1B,0xCB,0xDB,0x88,0xE8,0xEC,0x87,0xB0,0x16,0xCC, - 0x43,0xEE,0x5A,0xBD,0x57,0xE2,0x46,0xA7,0x56,0x54,0x23,0x32,0x8A,0xFB,0x25,0x51,0x39,0x38,0xE6,0x87,0xF5,0x73,0x63,0xD0, - 0x5B,0xC7,0x3F,0xFD,0x04,0x75,0x74,0x4C,0x3D,0xB5,0x31,0x22,0x7D,0xF1,0x8D,0xB4,0xE0,0xAA,0xE1,0xFF,0x8F,0xDD,0xB8,0x04, - 0x6A,0x31,0xEE,0x30,0x2D,0x6E,0x74,0x0F,0x37,0x71,0x77,0x2B,0xB8,0x9E,0x62,0x47,0x00,0x9C,0xA5,0x82,0x2B,0x9F,0x24,0x67, - 0x50,0x86,0x8B,0xC9,0x36,0x81,0xEB,0x44,0xC2,0xF1,0x91,0xA6,0x84,0x75,0x15,0x8F,0x22,0xDE,0xAC,0xB5,0x16,0xE3,0x96,0x74, - 0x72,0x2F,0x15,0xD5,0xFB,0x01,0x22,0xC4,0x24,0xEE,0x3D,0xDF,0x9E,0xA9,0x0A,0x5B,0x16,0x21,0xE8,0x4A,0x8C,0x7E,0x3A,0x9C, - 0x22,0xA0,0x49,0x60,0x97,0x1B,0x3E,0x2D,0x80,0x91,0xDB,0xF7,0x78,0x38,0x76,0x78,0x0C,0xE3,0xD4,0x27,0x77,0x69,0x96,0xE6, - 0x41,0xC7,0x2E,0xE9,0x61,0xD6,0x31,0x82,0x01,0xC4,0x30,0x82,0x01,0xC0,0x02,0x01,0x01,0x30,0x2B,0x30,0x17,0x31,0x15,0x30, - 0x13,0x06,0x03,0x55,0x04,0x03,0x13,0x0C,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,0x02,0x10,0x96,0x53, - 0x2C,0xC9,0x23,0x56,0x8A,0x87,0x42,0x30,0x3E,0xD5,0x8D,0x72,0xD5,0x25,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05, - 0x00,0xA0,0x70,0x30,0x10,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0C,0x31,0x02,0x30,0x00,0x30,0x19,0x06, - 0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x03,0x31,0x0C,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04, - 0x30,0x1C,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0B,0x31,0x0E,0x30,0x0C,0x06,0x0A,0x2B,0x06,0x01,0x04, - 0x01,0x82,0x37,0x02,0x01,0x15,0x30,0x23,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x09,0x04,0x31,0x16,0x04,0x14,0x3D, - 0x08,0xC8,0xA3,0xEE,0x05,0x1A,0x61,0xD9,0xFE,0x1A,0x63,0xC0,0x8A,0x6E,0x9D,0xF9,0xC3,0x13,0x98,0x30,0x0D,0x06,0x09,0x2A, - 0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x01,0x00,0x90,0xF9,0xC0,0x7F,0x1D,0x70,0x8C,0x04,0x22,0x82, - 0xB6,0x2D,0x48,0xBF,0x30,0x51,0x29,0xF8,0xE3,0x11,0x39,0xE0,0x64,0x23,0x72,0xE2,0x4C,0x09,0x9F,0x39,0xF2,0x6F,0xDD,0xB9, - 0x5A,0x3D,0xEF,0xEB,0xBE,0xEC,0x3B,0xE6,0x58,0x4C,0xC9,0x4F,0xED,0xCB,0x6E,0x9D,0x67,0x8E,0x89,0x92,0x40,0x39,0xA2,0x5F, - 0xF9,0xEF,0xD3,0xF5,0x24,0x27,0x8D,0xF7,0x3C,0x92,0x66,0x56,0xC8,0x2B,0xEA,0x04,0xA1,0x0E,0xDA,0x89,0x30,0xA7,0x01,0xD8, - 0x0B,0xF8,0xFD,0x99,0xB6,0xC0,0x38,0xB0,0x21,0x50,0x3A,0x86,0x01,0xD0,0xF3,0x86,0x72,0xE3,0x5A,0xBB,0x2A,0x6E,0xBD,0xFB, - 0x22,0xF9,0x42,0xD3,0x04,0xFE,0x8D,0xD8,0x79,0xD1,0xEE,0x61,0xC6,0x48,0x04,0x99,0x9A,0xA2,0x73,0xE5,0xFB,0x24,0x10,0xD5, - 0x6B,0x71,0x80,0x0E,0x09,0xEA,0x85,0x9A,0xBD,0xBB,0xDE,0x99,0x5D,0xA3,0x18,0x4D,0xED,0x20,0x73,0x3E,0x32,0xEF,0x2C,0xAC, - 0x5A,0x83,0x87,0x1F,0x7F,0x19,0x61,0x35,0x53,0xC1,0xAA,0x89,0x97,0xB3,0xDD,0x8D,0xA8,0x67,0x5B,0xC2,0xE2,0x09,0xB7,0xDD, - 0x6A,0xCB,0xD5,0xBF,0xD6,0x08,0xE2,0x23,0x1A,0x41,0x9D,0xD5,0x6A,0x6B,0x8D,0x3C,0x29,0x1B,0xF1,0x3F,0x4E,0x4A,0x8F,0x29, - 0x33,0xF9,0x1C,0x60,0xA0,0x92,0x7E,0x4F,0x35,0xB8,0xDD,0xEB,0xD1,0x68,0x1A,0x9D,0xA2,0xA6,0x97,0x1F,0x5F,0xC6,0x2C,0xFB, - 0xCA,0xDF,0xF7,0x95,0x33,0x95,0xD4,0x79,0x5C,0x73,0x87,0x49,0x1F,0x8C,0x6E,0xCE,0x3E,0x6D,0x3D,0x2B,0x6B,0xD7,0x66,0xE9, - 0x88,0x6F,0xF2,0x83,0xB9,0x9B,0x00,0x00 -}; - static void test_query_object(void) { - WCHAR tmp_path[MAX_PATH]; BOOL ret; CRYPT_DATA_BLOB blob; - DWORD content_type; /* Test the usual invalid arguments */ SetLastError(0xdeadbeef); @@ -308,26 +188,6 @@ static void test_query_object(void) CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED, 0, NULL, NULL, NULL, NULL, NULL, NULL); ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError()); - - GetEnvironmentVariableW( L"TMP", tmp_path, MAX_PATH ); - SetEnvironmentVariableW(L"TMP", L"C:\\nonexistent"); - blob.pbData = (BYTE *)signed_pe_blob; - blob.cbData = sizeof(signed_pe_blob); - ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, - CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, &content_type, - NULL, NULL, NULL, NULL); - ok(!ret, "CryptQueryObject succeeded\n"); - ok(GetLastError() == CRYPT_E_NO_MATCH, "Unexpected error %lu.\n", GetLastError()); - SetEnvironmentVariableW(L"TMP", tmp_path); - - blob.pbData = (BYTE *)signed_pe_blob; - blob.cbData = sizeof(signed_pe_blob); - ret = CryptQueryObject(CERT_QUERY_OBJECT_BLOB, &blob, - CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, &content_type, - NULL, NULL, NULL, NULL); - ok(ret, "CryptQueryObject failed: %08lx\n", GetLastError()); - ok(content_type == CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED, - "Got unexpected content_type %#lx.\n", content_type); } START_TEST(object) diff --git a/dlls/crypt32/tests/oid.c b/dlls/crypt32/tests/oid.c index 9520e8c5a4a..715d76b9c31 100644 --- wine/dlls/crypt32/tests/oid.c +++ wine/dlls/crypt32/tests/oid.c @@ -152,14 +152,14 @@ static void test_oidFunctionSet(void) ok(ret, "CryptGetDefaultOIDDllList failed: %08lx\n", GetLastError()); if (ret) { - buf = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + buf = malloc(size * sizeof(WCHAR)); if (buf) { ret = CryptGetDefaultOIDDllList(set1, 0, buf, &size); ok(ret, "CryptGetDefaultOIDDllList failed: %08lx\n", GetLastError()); ok(!*buf, "Expected empty DLL list\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } } } diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c index 00c2cae19e0..20d10a110f9 100644 --- wine/dlls/crypt32/tests/store.c +++ wine/dlls/crypt32/tests/store.c @@ -216,7 +216,7 @@ static void testMemStore(void) ret = CertSerializeCertificateStoreElement(context, 1, NULL, &size); ok(ret, "CertSerializeCertificateStoreElement failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); if (buf) { ret = CertSerializeCertificateStoreElement(context, 0, buf, &size); @@ -224,7 +224,7 @@ static void testMemStore(void) ok(size == sizeof(serializedCert), "Wrong size %ld\n", size); ok(!memcmp(serializedCert, buf, size), "Unexpected serialized cert\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } ret = CertFreeCertificateContext(context); @@ -311,7 +311,7 @@ static void compareStore(HCERTSTORE store, LPCSTR name, const BYTE *pb, todo_wine_if (todo) ok(blob.cbData == cb, "%s: expected size %ld, got %ld\n", name, cb, blob.cbData); - blob.pbData = HeapAlloc(GetProcessHeap(), 0, blob.cbData); + blob.pbData = malloc(blob.cbData); if (blob.pbData) { ret = CertSaveStore(store, X509_ASN_ENCODING, CERT_STORE_SAVE_AS_STORE, @@ -319,7 +319,7 @@ static void compareStore(HCERTSTORE store, LPCSTR name, const BYTE *pb, ok(ret, "CertSaveStore failed: %08lx\n", GetLastError()); todo_wine_if (todo) ok(!memcmp(pb, blob.pbData, cb), "%s: unexpected value\n", name); - HeapFree(GetProcessHeap(), 0, blob.pbData); + free(blob.pbData); } } @@ -1063,7 +1063,7 @@ static void testRegStore(void) size = 0; RegQueryValueExA(subKey, "Blob", NULL, NULL, NULL, &size); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); if (buf) { rc = RegQueryValueExA(subKey, "Blob", NULL, NULL, buf, &size); @@ -1092,7 +1092,7 @@ static void testRegStore(void) hdr->cb), "Unexpected hash in cert property\n"); } } - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } RegCloseKey(subKey); } @@ -2465,7 +2465,7 @@ static void testAddCertificateLink(void) ret = CertSerializeCertificateStoreElement(linked, 0, NULL, &size); ok(ret, "CertSerializeCertificateStoreElement failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); if (buf) { ret = CertSerializeCertificateStoreElement(linked, 0, buf, &size); @@ -2477,7 +2477,7 @@ static void testAddCertificateLink(void) ok(size == sizeof(serializedCert), "Wrong size %ld\n", size); ok(!memcmp(serializedCert, buf, size), "Unexpected serialized cert\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } /* Set a friendly name on the source certificate... */ blob.pbData = (LPBYTE)L"WineTest"; @@ -2491,7 +2491,7 @@ static void testAddCertificateLink(void) CERT_FRIENDLY_NAME_PROP_ID, NULL, &size); ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); if (buf) { ret = CertGetCertificateContextProperty(linked, @@ -2500,7 +2500,7 @@ static void testAddCertificateLink(void) GetLastError()); ok(!lstrcmpW((LPCWSTR)buf, L"WineTest"), "unexpected friendly name\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } CertFreeCertificateContext(linked); } @@ -2541,7 +2541,7 @@ static void testAddCertificateLink(void) ret = CertSerializeCertificateStoreElement(linked, 0, NULL, &size); ok(ret, "CertSerializeCertificateStoreElement failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); if (buf) { ret = CertSerializeCertificateStoreElement(linked, 0, buf, &size); @@ -2552,7 +2552,7 @@ static void testAddCertificateLink(void) ok(size == sizeof(serializedCert), "Wrong size %ld\n", size); ok(!memcmp(serializedCert, buf, size), "Unexpected serialized cert\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } /* Set a friendly name on the source certificate... */ blob.pbData = (LPBYTE)L"WineTest"; @@ -2566,7 +2566,7 @@ static void testAddCertificateLink(void) CERT_FRIENDLY_NAME_PROP_ID, NULL, &size); ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); if (buf) { ret = CertGetCertificateContextProperty(linked, @@ -2574,7 +2574,7 @@ static void testAddCertificateLink(void) ok(ret, "CertGetCertificateContextProperty failed: %08lx\n", GetLastError()); ok(!lstrcmpW((LPCWSTR)buf, L"WineTest"), "unexpected friendly name\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } CertFreeCertificateContext(linked); } @@ -2603,7 +2603,7 @@ static void testAddCertificateLink(void) ret = CertSerializeCertificateStoreElement(linked, 0, NULL, &size); ok(ret, "CertSerializeCertificateStoreElement failed: %08lx\n", GetLastError()); - buf = HeapAlloc(GetProcessHeap(), 0, size); + buf = malloc(size); if (buf) { ret = CertSerializeCertificateStoreElement(linked, 0, buf, &size); @@ -2616,7 +2616,7 @@ static void testAddCertificateLink(void) "Wrong size %ld\n", size); ok(!memcmp(serializedCertWithFriendlyName, buf, size), "Unexpected serialized cert\n"); - HeapFree(GetProcessHeap(), 0, buf); + free(buf); } CertFreeCertificateContext(linked); compareStore(store2, "file store -> file store", diff --git a/dlls/crypt32/tests/str.c b/dlls/crypt32/tests/str.c index a94381591c0..5fb05bdb836 100644 --- wine/dlls/crypt32/tests/str.c +++ wine/dlls/crypt32/tests/str.c @@ -31,7 +31,6 @@ typedef struct _CertRDNAttrEncoding { DWORD dwValueType; CERT_RDN_VALUE_BLOB Value; LPCSTR str; - BOOL todo; } CertRDNAttrEncoding, *PCertRDNAttrEncoding; typedef struct _CertRDNAttrEncodingW { @@ -39,7 +38,6 @@ typedef struct _CertRDNAttrEncodingW { DWORD dwValueType; CERT_RDN_VALUE_BLOB Value; LPCWSTR str; - BOOL todo; } CertRDNAttrEncodingW, *PCertRDNAttrEncodingW; static BYTE bin1[] = { 0x55, 0x53 }; @@ -115,6 +113,103 @@ static const BYTE cert[] = 0x65,0xd3,0xce,0xae,0x26,0x19,0x3,0x2e,0x4f,0x78,0xa5,0xa,0x97,0x7e,0x4f,0xc4, 0x91,0x8a,0xf8,0x5,0xef,0x5b,0x3b,0x49,0xbf,0x5f,0x2b}; +/* +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 5d:79:35:fd:d3:8f:6b:e2:28:3e:94:f4:14:bf:d4:b5:c2:3a:ac:38 + Signature Algorithm: md5WithRSAEncryption + Issuer: C = US, ST = Minnesota, L = Minneapolis, O = CodeWeavers, CN = server_cn.org, emailAddress = test@codeweavers.com + Validity + Not Before: Apr 14 18:56:22 2022 GMT + Not After : Apr 11 18:56:22 2032 GMT + Subject: C = US, ST = Minnesota, L = Minneapolis, O = CodeWeavers, CN = server_cn.org, emailAddress = test@codeweavers.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (1024 bit) + Modulus: +... + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Alternative Name: + DNS:ex1.org, DNS:*.ex2.org + X509v3 Issuer Alternative Name: + DNS:ex3.org, DNS:*.ex4.org + Signature Algorithm: md5WithRSAEncryption +... +*/ +static BYTE cert_v3[] = { + 0x30, 0x82, 0x02, 0xdf, 0x30, 0x82, 0x02, 0x48, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x5d, 0x79, 0x35, 0xfd, 0xd3, 0x8f, 0x6b, 0xe2, 0x28, + 0x3e, 0x94, 0xf4, 0x14, 0xbf, 0xd4, 0xb5, 0xc2, 0x3a, 0xac, 0x38, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x04, + 0x05, 0x00, 0x30, 0x81, 0x8a, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, + 0x55, 0x04, 0x08, 0x0c, 0x09, 0x4d, 0x69, 0x6e, 0x6e, 0x65, 0x73, 0x6f, + 0x74, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, + 0x0b, 0x4d, 0x69, 0x6e, 0x6e, 0x65, 0x61, 0x70, 0x6f, 0x6c, 0x69, 0x73, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0b, 0x43, + 0x6f, 0x64, 0x65, 0x57, 0x65, 0x61, 0x76, 0x65, 0x72, 0x73, 0x31, 0x16, + 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0d, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6e, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x23, + 0x30, 0x21, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x01, 0x16, 0x14, 0x74, 0x65, 0x73, 0x74, 0x40, 0x63, 0x6f, 0x64, 0x65, + 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x30, + 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x34, 0x31, 0x34, 0x31, 0x38, 0x35, + 0x36, 0x32, 0x32, 0x5a, 0x17, 0x0d, 0x33, 0x32, 0x30, 0x34, 0x31, 0x31, + 0x31, 0x38, 0x35, 0x36, 0x32, 0x32, 0x5a, 0x30, 0x81, 0x8a, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x09, 0x4d, 0x69, + 0x6e, 0x6e, 0x65, 0x73, 0x6f, 0x74, 0x61, 0x31, 0x14, 0x30, 0x12, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x0c, 0x0b, 0x4d, 0x69, 0x6e, 0x6e, 0x65, 0x61, + 0x70, 0x6f, 0x6c, 0x69, 0x73, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x0b, 0x43, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x61, 0x76, + 0x65, 0x72, 0x73, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6e, 0x2e, + 0x6f, 0x72, 0x67, 0x31, 0x23, 0x30, 0x21, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x14, 0x74, 0x65, 0x73, 0x74, + 0x40, 0x63, 0x6f, 0x64, 0x65, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x73, + 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, + 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xcd, 0x7c, 0x05, + 0xba, 0xad, 0xd0, 0xb0, 0x43, 0xcc, 0x47, 0x7d, 0x87, 0xaa, 0xb5, 0x89, + 0x9f, 0x43, 0x94, 0xa0, 0x84, 0xc0, 0xc0, 0x5e, 0x05, 0x6d, 0x2f, 0x05, + 0x21, 0x6b, 0x20, 0x39, 0x88, 0x06, 0x4e, 0xce, 0x76, 0xa7, 0x24, 0x77, + 0x13, 0x71, 0x9b, 0x2a, 0x53, 0x04, 0x4f, 0x0f, 0xfc, 0x3f, 0x4f, 0xb1, + 0x4e, 0xdc, 0xed, 0x96, 0xd4, 0x55, 0xbd, 0xcf, 0x25, 0xa6, 0x7c, 0xe3, + 0x35, 0xbf, 0xeb, 0x30, 0xec, 0xef, 0x7f, 0x8e, 0xa1, 0xc6, 0xd3, 0xb2, + 0x03, 0x62, 0x0a, 0x92, 0x87, 0x17, 0x52, 0x2d, 0x45, 0x2a, 0xdc, 0xdb, + 0x87, 0xa5, 0x32, 0x4a, 0x78, 0x28, 0x4a, 0x51, 0xff, 0xdb, 0xd5, 0x20, + 0x47, 0x7e, 0xc5, 0xbe, 0x1d, 0x01, 0x55, 0x13, 0x9f, 0xfb, 0x8e, 0x39, + 0xd9, 0x1b, 0xe0, 0x34, 0x93, 0x43, 0x9c, 0x02, 0xa3, 0x0f, 0xb5, 0xdc, + 0x9d, 0x86, 0x45, 0xc5, 0x4d, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x40, + 0x30, 0x3e, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x11, /* Subject Alternative Name OID */ + 0x04, 0x16, 0x30, 0x14, 0x82, 0x07, 0x65, 0x78, 0x31, 0x2e, 0x6f, 0x72, + 0x67, 0x82, 0x09, 0x2a, 0x2e, 0x65, 0x78, 0x32, 0x2e, 0x6f, 0x72, 0x67, + 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x12, /* Issuer Alternative Name OID */ + 0x04, 0x16, 0x30, 0x14, 0x82, 0x07, 0x65, 0x78, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x82, 0x09, 0x2a, 0x2e, 0x65, 0x78, 0x34, 0x2e, 0x6f, 0x72, 0x67, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x04, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0xcc, 0xa3, 0x75, 0x67, 0x61, + 0x63, 0x1d, 0x99, 0x16, 0xc6, 0x93, 0x35, 0xa4, 0x31, 0xb6, 0x05, 0x05, + 0x77, 0x12, 0x15, 0x16, 0x78, 0xb3, 0xba, 0x6e, 0xde, 0xfc, 0x73, 0x7c, + 0x5c, 0xdd, 0xdf, 0x92, 0xde, 0xa0, 0x86, 0xff, 0x77, 0x60, 0x99, 0x8f, + 0x4a, 0x40, 0xa8, 0x6a, 0xdb, 0x6f, 0x30, 0xe5, 0xce, 0x82, 0x2f, 0xf7, + 0x09, 0x17, 0xb2, 0xd3, 0x3a, 0x29, 0x9a, 0xd0, 0x73, 0x9c, 0x44, 0xa2, + 0x19, 0xf3, 0x1d, 0x16, 0x1a, 0x45, 0x2c, 0x4b, 0x94, 0xf1, 0xb8, 0xb6, + 0xc9, 0x82, 0x6c, 0x1f, 0xae, 0xbc, 0xd1, 0xbe, 0x78, 0xc9, 0x23, 0xf5, + 0x51, 0x6c, 0x90, 0xbf, 0xa3, 0x5c, 0xa1, 0x3a, 0xd8, 0xe3, 0xcf, 0x82, + 0x31, 0x78, 0x2b, 0xda, 0x99, 0xff, 0x23, 0x5b, 0xea, 0x59, 0xe0, 0x6d, + 0xd1, 0x30, 0xfd, 0x96, 0x6a, 0x4d, 0x36, 0x72, 0x96, 0xd7, 0x4f, 0x01, + 0xa9, 0x4d, 0x8f +}; + +#define CERT_V3_SAN_OID_OFFSET 534 +#define CERT_V3_IAN_OID_OFFSET 565 + static char issuerStr[] = "US, Minnesota, Minneapolis, CodeWeavers, Wine Development, localhost, aric@codeweavers.com"; static char issuerStrSemicolon[] = @@ -134,33 +229,34 @@ static void test_CertRDNValueToStrA(void) { CertRDNAttrEncoding attrs[] = { { "2.5.4.6", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin1), bin1 }, "US", FALSE }, + { sizeof(bin1), bin1 }, "US" }, { "2.5.4.8", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin2), bin2 }, "Minnesota", FALSE }, + { sizeof(bin2), bin2 }, "Minnesota" }, { "2.5.4.7", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin3), bin3 }, "Minneapolis", FALSE }, + { sizeof(bin3), bin3 }, "Minneapolis" }, { "2.5.4.10", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin4), bin4 }, "CodeWeavers", FALSE }, + { sizeof(bin4), bin4 }, "CodeWeavers" }, { "2.5.4.11", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin5), bin5 }, "Wine Development", FALSE }, + { sizeof(bin5), bin5 }, "Wine Development" }, { "2.5.4.3", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin6), bin6 }, "localhost", FALSE }, + { sizeof(bin6), bin6 }, "localhost" }, { "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING, - { sizeof(bin7), bin7 }, "aric@codeweavers.com", FALSE }, + { sizeof(bin7), bin7 }, "aric@codeweavers.com" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin9), bin9 }, "abc\"def", FALSE }, + { sizeof(bin9), bin9 }, "abc\"def" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin10), bin10 }, "abc'def", FALSE }, + { sizeof(bin10), bin10 }, "abc'def" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin11), bin11 }, "abc, def", FALSE }, + { sizeof(bin11), bin11 }, "abc, def" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin12), bin12 }, " abc ", FALSE }, + { sizeof(bin12), bin12 }, " abc " }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin13), bin13 }, "\"def\"", FALSE }, + { sizeof(bin13), bin13 }, "\"def\"" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin14), bin14 }, "1;3", FALSE }, + { sizeof(bin14), bin14 }, "1;3" }, }; - DWORD i, ret; + unsigned int i; + DWORD ret, len; char buffer[2000]; CERT_RDN_VALUE_BLOB blob = { 0, NULL }; static const char ePKI[] = "ePKI Root Certification Authority"; @@ -178,15 +274,21 @@ static void test_CertRDNValueToStrA(void) for (i = 0; i < ARRAY_SIZE(attrs); i++) { - ret = CertRDNValueToStrA(attrs[i].dwValueType, &attrs[i].Value, + len = CertRDNValueToStrA(attrs[i].dwValueType, &attrs[i].Value, buffer, sizeof(buffer)); - todo_wine_if (attrs[i].todo) - { - ok(ret == strlen(attrs[i].str) + 1, "Expected length %d, got %ld\n", - lstrlenA(attrs[i].str) + 1, ret); - ok(!strcmp(buffer, attrs[i].str), "Expected %s, got %s\n", - attrs[i].str, buffer); - } + ok(len == strlen(attrs[i].str) + 1, "Expected length %d, got %ld\n", + lstrlenA(attrs[i].str) + 1, ret); + ok(!strcmp(buffer, attrs[i].str), "Expected %s, got %s\n", + attrs[i].str, buffer); + memset(buffer, 0xcc, sizeof(buffer)); + ret = CertRDNValueToStrA(attrs[i].dwValueType, &attrs[i].Value, buffer, len - 1); + ok(ret == 1, "Unexpected ret %lu, expected 1, test %u.\n", ret, i); + ok(!buffer[0], "Unexpected value %#x, test %u.\n", buffer[0], i); + ok(!strncmp(buffer + 1, attrs[i].str + 1, len - 2), "Strings do not match, test %u.\n", i); + memset(buffer, 0xcc, sizeof(buffer)); + ret = CertRDNValueToStrA(attrs[i].dwValueType, &attrs[i].Value, buffer, 0); + ok(ret == len, "Unexpected ret %lu, expected %lu, test %u.\n", ret, len, i); + ok((unsigned char)buffer[0] == 0xcc, "Unexpected value %#x, test %u.\n", buffer[0], i); } blob.pbData = bin8; blob.cbData = sizeof(bin8); @@ -202,33 +304,34 @@ static void test_CertRDNValueToStrW(void) static const WCHAR ePKIW[] = L"ePKI Root Certification Authority"; CertRDNAttrEncodingW attrs[] = { { "2.5.4.6", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin1), bin1 }, L"US", FALSE }, + { sizeof(bin1), bin1 }, L"US" }, { "2.5.4.8", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin2), bin2 }, L"Minnesota", FALSE }, + { sizeof(bin2), bin2 }, L"Minnesota" }, { "2.5.4.7", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin3), bin3 }, L"Minneapolis", FALSE }, + { sizeof(bin3), bin3 }, L"Minneapolis" }, { "2.5.4.10", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin4), bin4 }, L"CodeWeavers", FALSE }, + { sizeof(bin4), bin4 }, L"CodeWeavers" }, { "2.5.4.11", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin5), bin5 }, L"Wine Development", FALSE }, + { sizeof(bin5), bin5 }, L"Wine Development" }, { "2.5.4.3", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin6), bin6 }, L"localhost", FALSE }, + { sizeof(bin6), bin6 }, L"localhost" }, { "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING, - { sizeof(bin7), bin7 }, L"aric@codeweavers.com", FALSE }, + { sizeof(bin7), bin7 }, L"aric@codeweavers.com" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin9), bin9 }, L"abc\"def", FALSE }, + { sizeof(bin9), bin9 }, L"abc\"def" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin10), bin10 }, L"abc'def", FALSE }, + { sizeof(bin10), bin10 }, L"abc'def" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin11), bin11 }, L"abc, def", FALSE }, + { sizeof(bin11), bin11 }, L"abc, def" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin12), bin12 }, L" abc ", FALSE }, + { sizeof(bin12), bin12 }, L" abc " }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin13), bin13 }, L"\"def\"", FALSE }, + { sizeof(bin13), bin13 }, L"\"def\"" }, { "0", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin14), bin14 }, L"1;3", FALSE }, + { sizeof(bin14), bin14 }, L"1;3" }, }; - DWORD i, ret; + unsigned int i; + DWORD ret, len; WCHAR buffer[2000]; CERT_RDN_VALUE_BLOB blob = { 0, NULL }; @@ -245,14 +348,20 @@ static void test_CertRDNValueToStrW(void) for (i = 0; i < ARRAY_SIZE(attrs); i++) { - ret = CertRDNValueToStrW(attrs[i].dwValueType, &attrs[i].Value, buffer, ARRAY_SIZE(buffer)); - todo_wine_if (attrs[i].todo) - { - ok(ret == lstrlenW(attrs[i].str) + 1, - "Expected length %d, got %ld\n", lstrlenW(attrs[i].str) + 1, ret); - ok(!lstrcmpW(buffer, attrs[i].str), "Expected %s, got %s\n", - wine_dbgstr_w(attrs[i].str), wine_dbgstr_w(buffer)); - } + len = CertRDNValueToStrW(attrs[i].dwValueType, &attrs[i].Value, buffer, ARRAY_SIZE(buffer)); + ok(len == lstrlenW(attrs[i].str) + 1, + "Expected length %d, got %ld\n", lstrlenW(attrs[i].str) + 1, ret); + ok(!lstrcmpW(buffer, attrs[i].str), "Expected %s, got %s\n", + wine_dbgstr_w(attrs[i].str), wine_dbgstr_w(buffer)); + memset(buffer, 0xcc, sizeof(buffer)); + ret = CertRDNValueToStrW(attrs[i].dwValueType, &attrs[i].Value, buffer, len - 1); + ok(ret == 1, "Unexpected ret %lu, expected 1, test %u.\n", ret, i); + ok(!buffer[0], "Unexpected value %#x, test %u.\n", buffer[0], i); + ok(buffer[1] == 0xcccc, "Unexpected value %#x, test %u.\n", buffer[1], i); + memset(buffer, 0xcc, sizeof(buffer)); + ret = CertRDNValueToStrW(attrs[i].dwValueType, &attrs[i].Value, buffer, 0); + ok(ret == len, "Unexpected ret %lu, expected %lu, test %u.\n", ret, len, i); + ok(buffer[0] == 0xcccc, "Unexpected value %#x, test %u.\n", buffer[0], i); } blob.pbData = bin8; blob.cbData = sizeof(bin8); @@ -264,24 +373,27 @@ static void test_CertRDNValueToStrW(void) wine_dbgstr_w(ePKIW), wine_dbgstr_w(buffer)); } -static void test_NameToStrConversionA(PCERT_NAME_BLOB pName, DWORD dwStrType, - LPCSTR expected, BOOL todo) +#define test_NameToStrConversionA(a, b, c) test_NameToStrConversionA_(__LINE__, a, b, c) +static void test_NameToStrConversionA_(unsigned int line, PCERT_NAME_BLOB pName, DWORD dwStrType, LPCSTR expected) { - char buffer[2000] = { 0 }; - DWORD i; - - i = CertNameToStrA(X509_ASN_ENCODING, pName, dwStrType, NULL, 0); - todo_wine_if (todo) - ok(i == strlen(expected) + 1, "Expected %d chars, got %ld\n", - lstrlenA(expected) + 1, i); - i = CertNameToStrA(X509_ASN_ENCODING,pName, dwStrType, buffer, - sizeof(buffer)); - todo_wine_if (todo) - ok(i == strlen(expected) + 1, "Expected %d chars, got %ld\n", - lstrlenA(expected) + 1, i); - todo_wine_if (todo) - ok(!strcmp(buffer, expected), "Expected %s, got %s\n", expected, - buffer); + char buffer[2000]; + DWORD len, retlen; + + len = CertNameToStrA(X509_ASN_ENCODING, pName, dwStrType, NULL, 0); + ok(len == strlen(expected) + 1, "line %u: Expected %d chars, got %ld.\n", line, lstrlenA(expected) + 1, len); + len = CertNameToStrA(X509_ASN_ENCODING,pName, dwStrType, buffer, sizeof(buffer)); + ok(len == strlen(expected) + 1, "line %u: Expected %d chars, got %ld.\n", line, lstrlenA(expected) + 1, len); + ok(!strcmp(buffer, expected), "line %u: Expected %s, got %s.\n", line, expected, buffer); + + memset(buffer, 0xcc, sizeof(buffer)); + retlen = CertNameToStrA(X509_ASN_ENCODING, pName, dwStrType, buffer, len - 1); + ok(retlen == 1, "line %u: expected 1, got %lu\n", line, retlen); + ok(!buffer[0], "line %u: string is not zero terminated.\n", line); + + memset(buffer, 0xcc, sizeof(buffer)); + retlen = CertNameToStrA(X509_ASN_ENCODING, pName, dwStrType, buffer, 0); + ok(retlen == len, "line %u: expected %lu chars, got %lu\n", line, len - 1, retlen); + ok((unsigned char)buffer[0] == 0xcc, "line %u: got %s\n", line, wine_dbgstr_a(buffer)); } static BYTE encodedSimpleCN[] = { @@ -354,98 +466,98 @@ static void test_CertNameToStrA(void) "Expected positive return and ERROR_SUCCESS, got %ld - %08lx\n", ret, GetLastError()); + test_NameToStrConversionA(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, issuerStr); test_NameToStrConversionA(&context->pCertInfo->Issuer, - CERT_SIMPLE_NAME_STR, issuerStr, FALSE); - test_NameToStrConversionA(&context->pCertInfo->Issuer, - CERT_SIMPLE_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - issuerStrSemicolon, FALSE); + CERT_SIMPLE_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, issuerStrSemicolon); test_NameToStrConversionA(&context->pCertInfo->Issuer, - CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - issuerStrCRLF, FALSE); - test_NameToStrConversionA(&context->pCertInfo->Subject, - CERT_OID_NAME_STR, subjectStr, FALSE); + CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG, issuerStrCRLF); + test_NameToStrConversionA(&context->pCertInfo->Subject, CERT_OID_NAME_STR, subjectStr); test_NameToStrConversionA(&context->pCertInfo->Subject, - CERT_OID_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - subjectStrSemicolon, FALSE); + CERT_OID_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, subjectStrSemicolon); test_NameToStrConversionA(&context->pCertInfo->Subject, - CERT_OID_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - subjectStrCRLF, FALSE); + CERT_OID_NAME_STR | CERT_NAME_STR_CRLF_FLAG, subjectStrCRLF); test_NameToStrConversionA(&context->pCertInfo->Subject, - CERT_X500_NAME_STR, x500SubjectStr, FALSE); + CERT_X500_NAME_STR, x500SubjectStr); test_NameToStrConversionA(&context->pCertInfo->Subject, CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, - x500SubjectStrSemicolonReverse, FALSE); + x500SubjectStrSemicolonReverse); CertFreeCertificateContext(context); } blob.pbData = encodedSimpleCN; blob.cbData = sizeof(encodedSimpleCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=1", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=1"); blob.pbData = encodedSingleQuotedCN; blob.cbData = sizeof(encodedSingleQuotedCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN='1'", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "'1'", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN='1'"); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "'1'"); blob.pbData = encodedSpacedCN; blob.cbData = sizeof(encodedSpacedCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\" 1 \"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\" 1 \"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\" 1 \""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\" 1 \""); blob.pbData = encodedQuotedCN; blob.cbData = sizeof(encodedQuotedCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"\"\"1\"\"\"", - FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"\"\"1\"\"\"", - FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"\"\"1\"\"\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"\"\"1\"\"\""); blob.pbData = encodedMultipleAttrCN; blob.cbData = sizeof(encodedMultipleAttrCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"1+2\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"1+2\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"1+2\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"1+2\""); blob.pbData = encodedCommaCN; blob.cbData = sizeof(encodedCommaCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a,b\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a,b\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a,b\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a,b\""); blob.pbData = encodedEqualCN; blob.cbData = sizeof(encodedEqualCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a=b\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a=b\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a=b\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a=b\""); blob.pbData = encodedLessThanCN; blob.cbData = sizeof(encodedLessThanCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"<\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"<\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"<\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"<\""); blob.pbData = encodedGreaterThanCN; blob.cbData = sizeof(encodedGreaterThanCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\">\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\">\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\">\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\">\""); blob.pbData = encodedHashCN; blob.cbData = sizeof(encodedHashCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"#\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"#\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"#\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"#\""); blob.pbData = encodedSemiCN; blob.cbData = sizeof(encodedSemiCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\";\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\";\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\";\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\";\""); blob.pbData = encodedNewlineCN; blob.cbData = sizeof(encodedNewlineCN); - test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a\nb\"", FALSE); - test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a\nb\"", FALSE); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a\nb\""); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a\nb\""); } -static void test_NameToStrConversionW(PCERT_NAME_BLOB pName, DWORD dwStrType, - LPCWSTR expected, BOOL todo) +#define test_NameToStrConversionW(a, b, c) test_NameToStrConversionW_(__LINE__, a, b, c) +static void test_NameToStrConversionW_(unsigned int line, PCERT_NAME_BLOB pName, DWORD dwStrType, LPCWSTR expected) { - WCHAR buffer[2000] = { 0 }; - DWORD i; - - i = CertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, NULL, 0); - todo_wine_if (todo) - ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %ld\n", - lstrlenW(expected) + 1, i); - i = CertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, buffer, ARRAY_SIZE(buffer)); - todo_wine_if (todo) - ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %ld\n", - lstrlenW(expected) + 1, i); - todo_wine_if (todo) - ok(!lstrcmpW(buffer, expected), "Expected %s, got %s\n", - wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); + DWORD len, retlen, expected_len; + WCHAR buffer[2000]; + + expected_len = wcslen(expected) + 1; + memset(buffer, 0xcc, sizeof(buffer)); + len = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, NULL, 0); + ok(len == expected_len, "line %u: expected %lu chars, got %lu\n", line, expected_len, len); + retlen = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, buffer, ARRAY_SIZE(buffer)); + ok(retlen == len, "line %u: expected %lu chars, got %lu.\n", line, len, retlen); + ok(!wcscmp(buffer, expected), "Expected %s, got %s\n", wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); + + memset(buffer, 0xcc, sizeof(buffer)); + retlen = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, buffer, len - 1); + ok(retlen == len - 1, "line %u: expected %lu chars, got %lu\n", line, len - 1, retlen); + ok(!wcsncmp(buffer, expected, retlen - 1), "line %u: expected %s, got %s\n", + line, wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); + ok(!buffer[retlen - 1], "line %u: string is not zero terminated.\n", line); + + memset(buffer, 0xcc, sizeof(buffer)); + retlen = CertNameToStrW(X509_ASN_ENCODING, pName, dwStrType, buffer, 0); + ok(retlen == len, "line %u: expected %lu chars, got %lu\n", line, len - 1, retlen); + ok(buffer[0] == 0xcccc, "line %u: got %s\n", line, wine_dbgstr_w(buffer)); } static void test_CertNameToStrW(void) @@ -479,95 +591,79 @@ static void test_CertNameToStrW(void) test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR, - L"US, Minnesota, Minneapolis, CodeWeavers, Wine Development, localhost, aric@codeweavers.com", FALSE); + L"US, Minnesota, Minneapolis, CodeWeavers, Wine Development, localhost, aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - L"US; Minnesota; Minneapolis; CodeWeavers; Wine Development; localhost; aric@codeweavers.com", FALSE); + L"US; Minnesota; Minneapolis; CodeWeavers; Wine Development; localhost; aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - L"US\r\nMinnesota\r\nMinneapolis\r\nCodeWeavers\r\nWine Development\r\nlocalhost\r\naric@codeweavers.com", - FALSE); + L"US\r\nMinnesota\r\nMinneapolis\r\nCodeWeavers\r\nWine Development\r\nlocalhost\r\naric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR, L"2.5.4.6=US, 2.5.4.8=Minnesota, 2.5.4.7=Minneapolis, 2.5.4.10=CodeWeavers, 2.5.4.11=Wine Development," - " 2.5.4.3=localhost, 1.2.840.113549.1.9.1=aric@codeweavers.com", FALSE); + " 2.5.4.3=localhost, 1.2.840.113549.1.9.1=aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, L"2.5.4.6=US; 2.5.4.8=Minnesota; 2.5.4.7=Minneapolis; 2.5.4.10=CodeWeavers; 2.5.4.11=Wine Development;" - " 2.5.4.3=localhost; 1.2.840.113549.1.9.1=aric@codeweavers.com", FALSE); + " 2.5.4.3=localhost; 1.2.840.113549.1.9.1=aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_CRLF_FLAG, L"2.5.4.6=US\r\n2.5.4.8=Minnesota\r\n2.5.4.7=Minneapolis\r\n2.5.4.10=CodeWeavers\r\n2.5.4.11=Wine " - "Development\r\n2.5.4.3=localhost\r\n1.2.840.113549.1.9.1=aric@codeweavers.com", FALSE); + "Development\r\n2.5.4.3=localhost\r\n1.2.840.113549.1.9.1=aric@codeweavers.com"); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, L"E=aric@codeweavers.com; CN=localhost; OU=Wine Development; O=CodeWeavers; L=Minneapolis; S=Minnesota; " - "C=US", FALSE); + "C=US"); CertFreeCertificateContext(context); } blob.pbData = encodedSimpleCN; blob.cbData = sizeof(encodedSimpleCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=1", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=1"); blob.pbData = encodedSingleQuotedCN; blob.cbData = sizeof(encodedSingleQuotedCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN='1'", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, - L"'1'", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN='1'"); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"'1'"); blob.pbData = encodedSpacedCN; blob.cbData = sizeof(encodedSpacedCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\" 1 \"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\" 1 \"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\" 1 \""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\" 1 \""); blob.pbData = encodedQuotedCN; blob.cbData = sizeof(encodedQuotedCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"\"\"1\"\"\"", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"\"\"1\"\"\"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"\"\"1\"\"\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"\"\"1\"\"\""); blob.pbData = encodedMultipleAttrCN; blob.cbData = sizeof(encodedMultipleAttrCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"1+2\"", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, - L"\"1+2\"", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"1+2\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"1+2\""); blob.pbData = encodedCommaCN; blob.cbData = sizeof(encodedCommaCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"a,b\"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"a,b\"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"a,b\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"a,b\""); blob.pbData = encodedEqualCN; blob.cbData = sizeof(encodedEqualCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"a=b\"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"a=b\"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"a=b\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"a=b\""); blob.pbData = encodedLessThanCN; blob.cbData = sizeof(encodedLessThanCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"<\"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"<\"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"<\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"<\""); blob.pbData = encodedGreaterThanCN; blob.cbData = sizeof(encodedGreaterThanCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\">\"", - FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, - L"\">\"", FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\">\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\">\""); blob.pbData = encodedHashCN; blob.cbData = sizeof(encodedHashCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"#\"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"#\"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"#\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"#\""); blob.pbData = encodedSemiCN; blob.cbData = sizeof(encodedSemiCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\";\"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\";\"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\";\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\";\""); blob.pbData = encodedNewlineCN; blob.cbData = sizeof(encodedNewlineCN); - test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"a\nb\"", FALSE); - test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"a\nb\"", - FALSE); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, L"CN=\"a\nb\""); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, L"\"a\nb\""); } struct StrToNameA @@ -747,153 +843,140 @@ static void test_CertStrToNameW(void) } } -static void test_CertGetNameStringA(void) +#define test_CertGetNameString_value(a, b, c, d, e) test_CertGetNameString_value_(__LINE__, a, b, c, d, e) +static void test_CertGetNameString_value_(unsigned int line, PCCERT_CONTEXT context, DWORD type, DWORD flags, + void *type_para, const char *expected) { + DWORD len, retlen, expected_len; + WCHAR expectedW[512]; + WCHAR strW[512]; + char str[512]; + + expected_len = 0; + while(expected[expected_len]) + { + while((expectedW[expected_len] = expected[expected_len])) + ++expected_len; + if (!(flags & CERT_NAME_SEARCH_ALL_NAMES_FLAG)) + break; + expectedW[expected_len++] = 0; + } + expectedW[expected_len++] = 0; + + len = CertGetNameStringA(context, type, flags, type_para, NULL, 0); + ok(len == expected_len, "line %u: unexpected length %ld, expected %ld.\n", line, len, expected_len); + memset(str, 0xcc, len); + retlen = CertGetNameStringA(context, type, flags, type_para, str, len); + ok(retlen == len, "line %u: unexpected len %lu, expected %lu.\n", line, retlen, len); + ok(!memcmp(str, expected, expected_len), "line %u: unexpected value %s.\n", line, debugstr_an(str, expected_len)); + str[0] = str[1] = 0xcc; + retlen = CertGetNameStringA(context, type, flags, type_para, str, len - 1); + ok(retlen == 1, "line %u: Unexpected len %lu, expected 1.\n", line, retlen); + if (len == 1) return; + ok(!str[0], "line %u: unexpected str[0] %#x.\n", line, str[0]); + ok(str[1] == expected[1], "line %u: unexpected str[1] %#x.\n", line, str[1]); + ok(!memcmp(str + 1, expected + 1, len - 2), + "line %u: str %s, string data mismatch.\n", line, debugstr_a(str + 1)); + retlen = CertGetNameStringA(context, type, flags, type_para, str, 0); + ok(retlen == len, "line %u: Unexpected len %lu, expected 1.\n", line, retlen); + + memset(strW, 0xcc, len * sizeof(*strW)); + retlen = CertGetNameStringW(context, type, flags, type_para, strW, len); + ok(retlen == expected_len, "line %u: unexpected len %lu, expected %lu.\n", line, retlen, expected_len); + ok(!memcmp(strW, expectedW, len * sizeof(*strW)), "line %u: unexpected value %s.\n", line, debugstr_wn(strW, len)); + strW[0] = strW[1] = 0xcccc; + retlen = CertGetNameStringW(context, type, flags, type_para, strW, len - 1); + ok(retlen == len - 1, "line %u: unexpected len %lu, expected %lu.\n", line, retlen, len - 1); + if (flags & CERT_NAME_SEARCH_ALL_NAMES_FLAG) + { + ok(!memcmp(strW, expectedW, (retlen - 2) * sizeof(*strW)), + "line %u: str %s, string data mismatch.\n", line, debugstr_wn(strW, retlen - 2)); + ok(!strW[retlen - 2], "line %u: string is not zero terminated.\n", line); + ok(!strW[retlen - 1], "line %u: string sequence is not zero terminated.\n", line); + + retlen = CertGetNameStringW(context, type, flags, type_para, strW, 1); + ok(retlen == 1, "line %u: unexpected len %lu, expected %lu.\n", line, retlen, len - 1); + ok(!strW[retlen - 1], "line %u: string sequence is not zero terminated.\n", line); + } + else + { + ok(!memcmp(strW, expectedW, (retlen - 1) * sizeof(*strW)), + "line %u: str %s, string data mismatch.\n", line, debugstr_wn(strW, retlen - 1)); + ok(!strW[retlen - 1], "line %u: string is not zero terminated.\n", line); + } + retlen = CertGetNameStringA(context, type, flags, type_para, NULL, len - 1); + ok(retlen == len, "line %u: unexpected len %lu, expected %lu\n", line, retlen, len); + retlen = CertGetNameStringW(context, type, flags, type_para, NULL, len - 1); + ok(retlen == len, "line %u: unexpected len %lu, expected %lu\n", line, retlen, len); +} + +static void test_CertGetNameString(void) +{ + static const char aric[] = "aric@codeweavers.com"; + static const char localhost[] = "localhost"; PCCERT_CONTEXT context; + DWORD len, type; context = CertCreateCertificateContext(X509_ASN_ENCODING, cert, sizeof(cert)); - ok(context != NULL, "CertCreateCertificateContext failed: %08lx\n", - GetLastError()); - if (context) - { - static const char aric[] = "aric@codeweavers.com"; - static const char localhost[] = "localhost"; - DWORD len, type; - LPSTR str; - - /* Bad string types/types missing from the cert */ - len = CertGetNameStringA(NULL, 0, 0, NULL, NULL, 0); - ok(len == 1, "expected 1, got %ld\n", len); - len = CertGetNameStringA(context, 0, 0, NULL, NULL, 0); - ok(len == 1, "expected 1, got %ld\n", len); - len = CertGetNameStringA(context, CERT_NAME_URL_TYPE, 0, NULL, NULL, - 0); - ok(len == 1, "expected 1, got %ld\n", len); - - len = CertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(aric) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, aric), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(issuerStr) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, issuerStr), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - type = 0; - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL, - 0); - ok(len == strlen(issuerStr) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, - str, len); - ok(!strcmp(str, issuerStr), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - type = CERT_OID_NAME_STR; - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL, - 0); - ok(len == strlen(subjectStr) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, - str, len); - ok(!strcmp(str, subjectStr), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(aric) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, aric), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_RSA_emailAddr, NULL, 0); - ok(len == strlen(aric) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_RSA_emailAddr, str, len); - ok(!strcmp(str, aric), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_COMMON_NAME, NULL, 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, - (void *)szOID_COMMON_NAME, str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, - NULL, NULL, 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, - 0, NULL, str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, - NULL, NULL, 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, - 0, NULL, str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - - len = CertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL, NULL, - 0); - ok(len == strlen(localhost) + 1, "unexpected length %ld\n", len); - if (len > 1) - { - str = HeapAlloc(GetProcessHeap(), 0, len); - if (str) - { - len = CertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL, - str, len); - ok(!strcmp(str, localhost), "unexpected value %s\n", str); - HeapFree(GetProcessHeap(), 0, str); - } - } - - CertFreeCertificateContext(context); - } + ok(!!context, "CertCreateCertificateContext failed, err %lu\n", GetLastError()); + + /* Bad string types/types missing from the cert */ + len = CertGetNameStringA(NULL, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringA(context, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringA(context, CERT_NAME_URL_TYPE, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + + len = CertGetNameStringW(NULL, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringW(context, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + len = CertGetNameStringW(context, CERT_NAME_URL_TYPE, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %lu\n", len); + + test_CertGetNameString_value(context, CERT_NAME_EMAIL_TYPE, 0, NULL, aric); + test_CertGetNameString_value(context, CERT_NAME_RDN_TYPE, 0, NULL, issuerStr); + type = 0; + test_CertGetNameString_value(context, CERT_NAME_RDN_TYPE, 0, &type, issuerStr); + type = CERT_OID_NAME_STR; + test_CertGetNameString_value(context, CERT_NAME_RDN_TYPE, 0, &type, subjectStr); + test_CertGetNameString_value(context, CERT_NAME_ATTR_TYPE, 0, NULL, aric); + test_CertGetNameString_value(context, CERT_NAME_ATTR_TYPE, 0, (void *)szOID_RSA_emailAddr, aric); + test_CertGetNameString_value(context, CERT_NAME_ATTR_TYPE, 0, (void *)szOID_COMMON_NAME, localhost); + test_CertGetNameString_value(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, localhost); + test_CertGetNameString_value(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL, localhost); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, 0, NULL, localhost); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, CERT_NAME_SEARCH_ALL_NAMES_FLAG, NULL, "localhost\0"); + test_CertGetNameString_value(context, CERT_NAME_EMAIL_TYPE, CERT_NAME_SEARCH_ALL_NAMES_FLAG, NULL, ""); + test_CertGetNameString_value(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, CERT_NAME_SEARCH_ALL_NAMES_FLAG, NULL, ""); + + CertFreeCertificateContext(context); + + ok(cert_v3[CERT_V3_SAN_OID_OFFSET] == 0x55, "Incorrect CERT_V3_SAN_OID_OFFSET.\n"); + ok(cert_v3[CERT_V3_IAN_OID_OFFSET] == 0x55, "Incorrect CERT_V3_IAN_OID_OFFSET.\n"); + cert_v3[CERT_V3_SAN_OID_OFFSET + 2] = 7; /* legacy OID_SUBJECT_ALT_NAME */ + cert_v3[CERT_V3_IAN_OID_OFFSET + 2] = 8; /* legacy OID_ISSUER_ALT_NAME */ + context = CertCreateCertificateContext(X509_ASN_ENCODING, cert_v3, sizeof(cert_v3)); + ok(!!context, "CertCreateCertificateContext failed, err %lu\n", GetLastError()); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, 0, NULL, "ex1.org"); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, CERT_NAME_ISSUER_FLAG, NULL, "ex3.org"); + CertFreeCertificateContext(context); + + cert_v3[CERT_V3_SAN_OID_OFFSET + 2] = 17; /* OID_SUBJECT_ALT_NAME2 */ + cert_v3[CERT_V3_IAN_OID_OFFSET + 2] = 18; /* OID_ISSUER_ALT_NAME2 */ + context = CertCreateCertificateContext(X509_ASN_ENCODING, cert_v3, sizeof(cert_v3)); + ok(!!context, "CertCreateCertificateContext failed, err %lu\n", GetLastError()); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, 0, NULL, "ex1.org"); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, CERT_NAME_ISSUER_FLAG, NULL, "ex3.org"); + test_CertGetNameString_value(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, "server_cn.org"); + test_CertGetNameString_value(context, CERT_NAME_ATTR_TYPE, 0, (void *)szOID_SUR_NAME, ""); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, CERT_NAME_SEARCH_ALL_NAMES_FLAG, + NULL, "ex1.org\0*.ex2.org\0"); + test_CertGetNameString_value(context, CERT_NAME_DNS_TYPE, CERT_NAME_SEARCH_ALL_NAMES_FLAG | CERT_NAME_ISSUER_FLAG, + NULL, "ex3.org\0*.ex4.org\0"); + CertFreeCertificateContext(context); } START_TEST(str) @@ -904,5 +987,5 @@ START_TEST(str) test_CertNameToStrW(); test_CertStrToNameA(); test_CertStrToNameW(); - test_CertGetNameStringA(); + test_CertGetNameString(); } diff --git a/dlls/crypt32/unixlib.c b/dlls/crypt32/unixlib.c index 069cb049851..9a36d12f293 100644 --- wine/dlls/crypt32/unixlib.c +++ wine/dlls/crypt32/unixlib.c @@ -95,21 +95,7 @@ static NTSTATUS process_attach( void *args ) setenv("GNUTLS_SYSTEM_PRIORITY_FILE", "/dev/null", 0); } -if (1) { /* CROSSOVER HACK - bug 10151 */ - const char *libgnutls_name_candidates[] = {SONAME_LIBGNUTLS, - "libgnutls.so.30", - "libgnutls.so.28", - "libgnutls-deb0.so.28", - "libgnutls.so.26", - NULL}; - int i; - for (i=0; libgnutls_name_candidates[i] && !libgnutls_handle; i++) - libgnutls_handle = dlopen(libgnutls_name_candidates[i], RTLD_NOW); -} -else - libgnutls_handle = dlopen( SONAME_LIBGNUTLS, RTLD_NOW ); - - if (!libgnutls_handle) + if (!(libgnutls_handle = dlopen( SONAME_LIBGNUTLS, RTLD_NOW ))) { ERR_(winediag)( "failed to load libgnutls, no support for pfx import/export\n" ); return STATUS_DLL_NOT_FOUND; diff --git a/dlls/cryptnet/cryptnet_main.c b/dlls/cryptnet/cryptnet_main.c index 6654ef77c8c..19de1ed2d8e 100644 --- wine/dlls/cryptnet/cryptnet_main.c +++ wine/dlls/cryptnet/cryptnet_main.c @@ -1690,6 +1690,15 @@ static DWORD verify_cert_revocation_from_dist_points_ext(const CRYPT_DATA_BLOB * const CRL_CONTEXT *crl; DWORD timeout = 0; + if (!params || !params->pIssuerCert) + { + TRACE("no issuer certificate\n"); + return CRYPT_E_REVOCATION_OFFLINE; + } + + if (find_cached_revocation_status(&cert->pCertInfo->SerialNumber, time, status)) + return status->dwError; + if (!CRYPT_GetUrlFromCRLDistPointsExt(value, NULL, &url_array_size, NULL, NULL)) return GetLastError(); @@ -1918,6 +1927,7 @@ static DWORD verify_signed_ocsp_response_info(const CERT_INFO *cert, const CERT_ HCRYPTPROV prov = 0; HCRYPTHASH hash = 0; HCRYPTKEY key = 0; + DWORD algid; if (!CryptDecodeObjectEx(X509_ASN_ENCODING, OCSP_BASIC_SIGNED_RESPONSE, blob->pbData, blob->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &size)) return GetLastError(); @@ -1925,7 +1935,7 @@ static DWORD verify_signed_ocsp_response_info(const CERT_INFO *cert, const CERT_ if ((error = check_ocsp_response_info(cert, issuer, &info->ToBeSigned, &status))) goto done; alg = &info->SignatureInfo.SignatureAlgorithm; - if (!alg->pszObjId || strcmp(alg->pszObjId, szOID_RSA_SHA256RSA)) + if (!alg->pszObjId || !(algid = CertOIDToAlgId(alg->pszObjId))) { FIXME("unhandled signature algorithm %s\n", debugstr_a(alg->pszObjId)); error = CRYPT_E_NO_REVOCATION_CHECK; @@ -1933,7 +1943,7 @@ static DWORD verify_signed_ocsp_response_info(const CERT_INFO *cert, const CERT_ } if (!CryptAcquireContextW(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) goto done; - if (!CryptCreateHash(prov, CALG_SHA_256, 0, 0, &hash)) goto done; + if (!CryptCreateHash(prov, algid, 0, 0, &hash)) goto done; if (!CryptHashData(hash, info->ToBeSigned.pbData, info->ToBeSigned.cbData, 0)) goto done; sig = &info->SignatureInfo.Signature; @@ -2136,22 +2146,19 @@ static DWORD verify_cert_revocation(const CERT_CONTEXT *cert, FILETIME *pTime, DWORD error = ERROR_SUCCESS; PCERT_EXTENSION ext; - if (find_cached_revocation_status(&cert->pCertInfo->SerialNumber, pTime, pRevStatus)) - return pRevStatus->dwError; - - if ((ext = CertFindExtension(szOID_CRL_DIST_POINTS, - cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension))) + if ((ext = CertFindExtension(szOID_AUTHORITY_INFO_ACCESS, cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension))) { - error = verify_cert_revocation_from_dist_points_ext(&ext->Value, cert, - pTime, dwFlags, pRevPara, pRevStatus); + error = verify_cert_revocation_from_aia_ext(&ext->Value, cert, pTime, dwFlags, pRevPara, pRevStatus); + TRACE("verify_cert_revocation_from_aia_ext() returned %08lx\n", error); + if (error == ERROR_SUCCESS || error == CRYPT_E_REVOKED) return error; } - else if ((ext = CertFindExtension(szOID_AUTHORITY_INFO_ACCESS, - cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension))) + if ((ext = CertFindExtension(szOID_CRL_DIST_POINTS, cert->pCertInfo->cExtension, cert->pCertInfo->rgExtension))) { - error = verify_cert_revocation_from_aia_ext(&ext->Value, cert, pTime, - dwFlags, pRevPara, pRevStatus); + error = verify_cert_revocation_from_dist_points_ext(&ext->Value, cert, pTime, dwFlags, pRevPara, pRevStatus); + TRACE("verify_cert_revocation_from_dist_points_ext() returned %08lx\n", error); + if (error == ERROR_SUCCESS || error == CRYPT_E_REVOKED) return error; } - else + if (!ext) { if (pRevPara && pRevPara->hCrlStore && pRevPara->pIssuerCert) { diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c index 53df5e7fe60..06b178a98b9 100644 --- wine/dlls/wintrust/softpub.c +++ wine/dlls/wintrust/softpub.c @@ -830,16 +830,93 @@ static DWORD WINTRUST_VerifySigner(CRYPT_PROVIDER_DATA *data, DWORD signerIdx) return err; } +static void load_secondary_signatures(CRYPT_PROVIDER_DATA *data, HCRYPTMSG msg) +{ + CRYPT_PROVIDER_SIGSTATE *s = data->pSigState; + CRYPT_ATTRIBUTES *attrs; + unsigned int i, j; + DWORD size; + + if (!CryptMsgGetParam(msg, CMSG_SIGNER_UNAUTH_ATTR_PARAM, 0, NULL, &size)) + return; + + if (!(attrs = data->psPfns->pfnAlloc(size))) + { + ERR("No memory.\n"); + return; + } + if (!CryptMsgGetParam(msg, CMSG_SIGNER_UNAUTH_ATTR_PARAM, 0, attrs, &size)) + goto done; + + for (i = 0; i < attrs->cAttr; ++i) + { + if (strcmp(attrs->rgAttr[i].pszObjId, szOID_NESTED_SIGNATURE)) + continue; + + if (!(s->rhSecondarySigs = data->psPfns->pfnAlloc(attrs->rgAttr[i].cValue * sizeof(*s->rhSecondarySigs)))) + { + ERR("No memory"); + goto done; + } + s->cSecondarySigs = 0; + for (j = 0; j < attrs->rgAttr[i].cValue; ++j) + { + if (!(msg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL))) + { + ERR("Could not create crypt message.\n"); + goto done; + } + if (!CryptMsgUpdate(msg, attrs->rgAttr[i].rgValue[j].pbData, attrs->rgAttr[i].rgValue[j].cbData, TRUE)) + { + ERR("Could not update crypt message, err %lu.\n", GetLastError()); + CryptMsgClose(msg); + goto done; + } + s->rhSecondarySigs[j] = msg; + ++s->cSecondarySigs; + } + break; + } +done: + data->psPfns->pfnFree(attrs); +} + HRESULT WINAPI SoftpubLoadSignature(CRYPT_PROVIDER_DATA *data) { - DWORD err; + DWORD err = ERROR_SUCCESS; TRACE("(%p)\n", data); if (!data->padwTrustStepErrors) return S_FALSE; - if (data->hMsg) + if (data->pSigState) + { + /* We did not initialize this, probably an unsupported usage. */ + FIXME("pSigState %p already initialized.\n", data->pSigState); + } + if (!(data->pSigState = data->psPfns->pfnAlloc(sizeof(*data->pSigState)))) + { + err = ERROR_OUTOFMEMORY; + } + else + { + data->pSigState->cbStruct = sizeof(*data->pSigState); + data->pSigState->fSupportMultiSig = TRUE; + data->pSigState->dwCryptoPolicySupport = WSS_SIGTRUST_SUPPORT | WSS_OBJTRUST_SUPPORT | WSS_CERTTRUST_SUPPORT; + if (data->hMsg) + { + data->pSigState->hPrimarySig = CryptMsgDuplicate(data->hMsg); + load_secondary_signatures(data, data->pSigState->hPrimarySig); + } + if (data->pSigSettings) + { + if (data->pSigSettings->dwFlags & WSS_GET_SECONDARY_SIG_COUNT) + data->pSigSettings->cSecondarySigs = data->pSigState->cSecondarySigs; + } + } + + if (!err && data->hMsg) { DWORD signerCount, size; @@ -859,8 +936,7 @@ HRESULT WINAPI SoftpubLoadSignature(CRYPT_PROVIDER_DATA *data) else err = TRUST_E_NOSIGNATURE; } - else - err = ERROR_SUCCESS; + if (err) data->padwTrustStepErrors[TRUSTERROR_STEP_FINAL_SIGPROV] = err; return !err ? S_OK : S_FALSE; @@ -1375,6 +1451,13 @@ HRESULT WINAPI SoftpubCleanup(CRYPT_PROVIDER_DATA *data) data->psPfns->pfnFree(data->u.pPDSip->psIndirectData); } + if (WVT_ISINSTRUCT(CRYPT_PROVIDER_DATA, data->cbStruct, pSigState) && data->pSigState) + { + CryptMsgClose(data->pSigState->hPrimarySig); + for (i = 0; i < data->pSigState->cSecondarySigs; ++i) + CryptMsgClose(data->pSigState->rhSecondarySigs[i]); + data->psPfns->pfnFree(data->pSigState); + } CryptMsgClose(data->hMsg); if (data->fOpenedFile && diff --git a/dlls/wintrust/tests/softpub.c b/dlls/wintrust/tests/softpub.c index 8195e6006b1..77e15b2feb4 100644 --- wine/dlls/wintrust/tests/softpub.c +++ wine/dlls/wintrust/tests/softpub.c @@ -1123,6 +1123,476 @@ static const BYTE SelfSignedFile64[] = 0x9C,0x68,0x1A,0x5D,0x92,0xCD,0xD0,0x5F,0x02,0xA1,0x2C,0xD9,0x56,0x20,0x00,0x00 }; +/* Self-signed 32 bit .exe, built with mingw-gcc, stripped, signed with signtool + * (certificates generated with a self-signed CA). + * + * small.c: + * int _start() + * { + * return 0; + * } + * + * i686-w64-mingw32-gcc -s -nodefaultlibs -fno-PIC ./small.c -o sign_3certs.exe + * strip -R .idata -R .rdata -R .edata -R .eh_fram ./sign_3certs.exe + * signtool.exe sign /v /f cert1.pfx /fd SHA256 /t http://timestamp.digicert.com sign_3certs.exe + * signtool.exe sign /v /f cert2.pfx /as /fd SHA256 sign_3certs.exe + * signtool.exe sign /v /f cert3.pfx /as /fd SHA256 sign_3certs.exe */ + +static const BYTE self_signed_3certs[] = +{ + 0x4d,0x5a,0x90,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x0e,0x1f,0xba,0x0e,0x00,0xb4,0x09,0xcd, + 0x21,0xb8,0x01,0x4c,0xcd,0x21,0x54,0x68,0x69,0x73,0x20,0x70,0x72,0x6f,0x67,0x72,0x61,0x6d,0x20,0x63,0x61,0x6e,0x6e,0x6f, + 0x74,0x20,0x62,0x65,0x20,0x72,0x75,0x6e,0x20,0x69,0x6e,0x20,0x44,0x4f,0x53,0x20,0x6d,0x6f,0x64,0x65,0x2e,0x0d,0x0d,0x0a, + 0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x45,0x00,0x00,0x4c,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xe0,0x00,0x0e,0x03,0x0b,0x01,0x02,0x25,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00, + 0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x02,0x00,0x00, + 0x76,0x3e,0x00,0x00,0x03,0x00,0x40,0x01,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x14,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x48,0x26,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x74,0x65,0x78,0x74,0x00,0x00,0x00, + 0x1c,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x89,0xe5,0xb8,0x00,0x00,0x00,0x00,0x5d,0xc3,0x90,0x90,0xff,0xff,0xff,0xff, + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x26,0x00,0x00,0x00,0x02,0x02,0x00, + 0x30,0x82,0x26,0x36,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x26,0x27,0x30,0x82,0x26,0x23,0x02, + 0x01,0x01,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x5c,0x06,0x0a,0x2b, + 0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0xa0,0x4e,0x30,0x4c,0x30,0x17,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37, + 0x02,0x01,0x0f,0x30,0x09,0x03,0x01,0x00,0xa0,0x04,0xa2,0x02,0x80,0x00,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01, + 0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0xdd,0x8b,0xd7,0x29,0x3b,0xae,0x16,0xec,0xbb,0x81,0x80,0x55,0x15,0xd8,0x87, + 0xa5,0x3e,0xeb,0x0b,0x74,0x59,0xb6,0x56,0xf1,0x0b,0x2e,0xe1,0xb4,0x42,0x4d,0x8b,0x18,0xa0,0x82,0x16,0x0c,0x30,0x82,0x03, + 0x01,0x30,0x82,0x01,0xe9,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0xd1,0x73,0x97,0xaa,0xa7,0x3a,0x31,0xa2,0x44,0xc0,0x4b,0x40, + 0x69,0x40,0x4b,0xfa,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x12,0x31,0x10,0x30, + 0x0e,0x06,0x03,0x55,0x04,0x03,0x13,0x07,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x32,0x32,0x30,0x39,0x33, + 0x30,0x31,0x37,0x31,0x39,0x33,0x32,0x5a,0x17,0x0d,0x33,0x39,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30, + 0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x63,0x65,0x72,0x74,0x31,0x30,0x82,0x01,0x22,0x30,0x0d,0x06, + 0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01, + 0x01,0x00,0xca,0x9c,0xd9,0xd4,0x25,0xb6,0x45,0x61,0x22,0x8d,0xdf,0xe9,0x11,0x0f,0xa1,0x7e,0x45,0xc5,0x0b,0xd0,0x42,0xfc, + 0x1f,0x3e,0xce,0x20,0xfc,0x1b,0x37,0xe4,0x0d,0x06,0x83,0x1c,0x3a,0x71,0x0f,0x75,0xf5,0xe5,0x06,0x33,0x01,0x77,0xda,0xc5, + 0xe9,0x2e,0xe3,0x37,0x1e,0x51,0x6e,0x08,0xe2,0x02,0xa1,0x8c,0x11,0xc6,0xfc,0x43,0xa2,0xf5,0x7d,0x74,0x5d,0x5a,0xcc,0x85, + 0x27,0x38,0xd4,0xfa,0xad,0xd7,0xf9,0x77,0xe4,0xef,0xdd,0xb0,0xb1,0x3e,0xdc,0xf5,0x5d,0x7e,0x62,0xdf,0x16,0x01,0x88,0xcd, + 0xb0,0xfa,0x06,0x24,0xd7,0xce,0xdc,0xe2,0x27,0xab,0xc3,0x0e,0x44,0x59,0x39,0x38,0xae,0x0a,0x5a,0xbd,0x5c,0xfd,0x11,0xed, + 0x5e,0xb8,0xd3,0x09,0x9c,0x84,0x80,0x6f,0x38,0xdf,0xd2,0xed,0x12,0x33,0xc9,0x66,0x3e,0x77,0x95,0x40,0xca,0xbb,0x63,0xd8, + 0x44,0x62,0x1d,0x60,0xc1,0x0d,0x92,0x18,0x68,0x4c,0xc7,0x26,0x83,0x5b,0x38,0x45,0xda,0x8d,0xe6,0x11,0xd0,0x08,0x79,0x0c, + 0x13,0xb8,0xe0,0xab,0xf5,0x78,0xe2,0x45,0xfd,0x42,0x7f,0x33,0xab,0x6d,0x53,0x10,0xa3,0x02,0x3c,0xd3,0x6f,0xaf,0x50,0x2f, + 0x20,0xfc,0x92,0xd1,0xab,0x68,0xe8,0x00,0xa0,0x1c,0x4b,0x6f,0x02,0x5a,0xf4,0x1a,0xf1,0x06,0x79,0xa1,0x34,0x8d,0x04,0x5c, + 0x0d,0xfe,0x2d,0x3c,0x53,0xb6,0xae,0x80,0x7d,0x98,0xb9,0x02,0x60,0x15,0x2c,0xb2,0xe5,0xc7,0x9b,0xcf,0x78,0x53,0x37,0xd9, + 0xbf,0x84,0x04,0xb0,0x61,0x1c,0xea,0x24,0x7b,0xf7,0xcd,0x71,0x45,0x1a,0x00,0x22,0x21,0xa9,0x02,0x03,0x01,0x00,0x01,0xa3, + 0x55,0x30,0x53,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x43,0x06,0x03,0x55,0x1d,0x01, + 0x04,0x3c,0x30,0x3a,0x80,0x10,0x88,0x17,0xf7,0x38,0x65,0x8b,0x78,0x78,0xf6,0x77,0xe3,0x25,0x47,0x54,0x33,0x4c,0xa1,0x14, + 0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x03,0x13,0x07,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x82,0x10,0x2b,0x59, + 0xb4,0xc7,0xe2,0xce,0x08,0x97,0x46,0x48,0x32,0x17,0x0f,0x97,0xc5,0x08,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d, + 0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x9d,0x05,0x0e,0xc5,0xa0,0x5e,0x47,0x18,0x31,0x60,0xf2,0x1b,0x37,0xa4, + 0x89,0xf7,0x05,0x3e,0xea,0xc2,0x00,0x9f,0xcb,0xdd,0x28,0xba,0xc9,0x1f,0xfa,0x7a,0x9b,0x24,0x3d,0xb6,0x47,0x80,0xc1,0xa6, + 0x67,0x4d,0x48,0x3d,0xe0,0x0b,0x32,0x6a,0xa7,0x93,0xf3,0x40,0x20,0x8a,0xff,0x0f,0x9a,0xe2,0x00,0x95,0xa3,0xb3,0x57,0xc7, + 0x11,0xe1,0x28,0xc5,0x63,0x01,0xdf,0x4a,0xd2,0x37,0xb2,0x53,0x09,0x5c,0x4e,0x50,0x4e,0x14,0xb8,0x3e,0xb4,0x52,0xfe,0xa5, + 0x5d,0x14,0x3f,0x07,0x4f,0xda,0x9a,0xb9,0xbe,0x40,0xc5,0x3b,0x90,0x54,0x03,0x2e,0x79,0x0e,0x9b,0xf7,0xa9,0x74,0xeb,0x7c, + 0x6b,0x71,0x12,0xf2,0xce,0x9f,0xc0,0x3e,0x8a,0x09,0xa4,0x91,0x91,0x93,0x64,0x11,0xcc,0x96,0x7b,0xf9,0xac,0x65,0x6b,0xc3, + 0x02,0x1d,0xf8,0x0c,0x82,0x72,0x04,0x19,0x05,0x06,0x33,0x44,0x48,0x4f,0x34,0x13,0x04,0x1e,0x6c,0x11,0xc0,0x7b,0x63,0x32, + 0x1e,0xb3,0x4f,0x79,0xfe,0x9d,0xe6,0x3a,0xbe,0x8e,0xa7,0x5f,0x67,0x1d,0xae,0xad,0x58,0x0e,0x53,0xb8,0x15,0xe3,0x85,0x6e, + 0x91,0xfe,0x2d,0x81,0x84,0xb9,0xc3,0x23,0x13,0xa0,0x3f,0x72,0xb7,0xb3,0x26,0xda,0x08,0xcf,0x10,0x65,0x1e,0xd5,0x3b,0xf4, + 0x8f,0x18,0xe0,0xab,0xe7,0x5e,0xfc,0x62,0x9e,0x7e,0x54,0xf9,0x35,0x5a,0xf8,0xfa,0x1f,0x10,0x6f,0x63,0x3d,0xa2,0xe9,0x8a, + 0xd6,0x49,0xc0,0x40,0x0b,0xa1,0x5e,0x83,0xb0,0x01,0xb6,0x03,0x66,0xa5,0x8a,0xb4,0x29,0x06,0xea,0x27,0x0c,0x28,0x88,0xf3, + 0x38,0x5e,0x30,0x82,0x05,0x8d,0x30,0x82,0x04,0x75,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0e,0x9b,0x18,0x8e,0xf9,0xd0,0x2d, + 0xe7,0xef,0xdb,0x50,0xe2,0x08,0x40,0x18,0x5a,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0c,0x05,0x00, + 0x30,0x65,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0a, + 0x13,0x0c,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49,0x6e,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0b,0x13, + 0x10,0x77,0x77,0x77,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x31,0x24,0x30,0x22,0x06,0x03,0x55, + 0x04,0x03,0x13,0x1b,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x41,0x73,0x73,0x75,0x72,0x65,0x64,0x20,0x49,0x44,0x20, + 0x52,0x6f,0x6f,0x74,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x32,0x32,0x30,0x38,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a, + 0x17,0x0d,0x33,0x31,0x31,0x31,0x30,0x39,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x62,0x31,0x0b,0x30,0x09,0x06,0x03,0x55, + 0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c,0x44,0x69,0x67,0x69,0x43,0x65,0x72, + 0x74,0x20,0x49,0x6e,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0b,0x13,0x10,0x77,0x77,0x77,0x2e,0x64,0x69,0x67,0x69, + 0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x31,0x21,0x30,0x1f,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x44,0x69,0x67,0x69,0x43, + 0x65,0x72,0x74,0x20,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x47,0x34,0x30,0x82,0x02,0x22,0x30, + 0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a,0x02, + 0x82,0x02,0x01,0x00,0xbf,0xe6,0x90,0x73,0x68,0xde,0xbb,0xe4,0x5d,0x4a,0x3c,0x30,0x22,0x30,0x69,0x33,0xec,0xc2,0xa7,0x25, + 0x2e,0xc9,0x21,0x3d,0xf2,0x8a,0xd8,0x59,0xc2,0xe1,0x29,0xa7,0x3d,0x58,0xab,0x76,0x9a,0xcd,0xae,0x7b,0x1b,0x84,0x0d,0xc4, + 0x30,0x1f,0xf3,0x1b,0xa4,0x38,0x16,0xeb,0x56,0xc6,0x97,0x6d,0x1d,0xab,0xb2,0x79,0xf2,0xca,0x11,0xd2,0xe4,0x5f,0xd6,0x05, + 0x3c,0x52,0x0f,0x52,0x1f,0xc6,0x9e,0x15,0xa5,0x7e,0xbe,0x9f,0xa9,0x57,0x16,0x59,0x55,0x72,0xaf,0x68,0x93,0x70,0xc2,0xb2, + 0xba,0x75,0x99,0x6a,0x73,0x32,0x94,0xd1,0x10,0x44,0x10,0x2e,0xdf,0x82,0xf3,0x07,0x84,0xe6,0x74,0x3b,0x6d,0x71,0xe2,0x2d, + 0x0c,0x1b,0xee,0x20,0xd5,0xc9,0x20,0x1d,0x63,0x29,0x2d,0xce,0xec,0x5e,0x4e,0xc8,0x93,0xf8,0x21,0x61,0x9b,0x34,0xeb,0x05, + 0xc6,0x5e,0xec,0x5b,0x1a,0xbc,0xeb,0xc9,0xcf,0xcd,0xac,0x34,0x40,0x5f,0xb1,0x7a,0x66,0xee,0x77,0xc8,0x48,0xa8,0x66,0x57, + 0x57,0x9f,0x54,0x58,0x8e,0x0c,0x2b,0xb7,0x4f,0xa7,0x30,0xd9,0x56,0xee,0xca,0x7b,0x5d,0xe3,0xad,0xc9,0x4f,0x5e,0xe5,0x35, + 0xe7,0x31,0xcb,0xda,0x93,0x5e,0xdc,0x8e,0x8f,0x80,0xda,0xb6,0x91,0x98,0x40,0x90,0x79,0xc3,0x78,0xc7,0xb6,0xb1,0xc4,0xb5, + 0x6a,0x18,0x38,0x03,0x10,0x8d,0xd8,0xd4,0x37,0xa4,0x2e,0x05,0x7d,0x88,0xf5,0x82,0x3e,0x10,0x91,0x70,0xab,0x55,0x82,0x41, + 0x32,0xd7,0xdb,0x04,0x73,0x2a,0x6e,0x91,0x01,0x7c,0x21,0x4c,0xd4,0xbc,0xae,0x1b,0x03,0x75,0x5d,0x78,0x66,0xd9,0x3a,0x31, + 0x44,0x9a,0x33,0x40,0xbf,0x08,0xd7,0x5a,0x49,0xa4,0xc2,0xe6,0xa9,0xa0,0x67,0xdd,0xa4,0x27,0xbc,0xa1,0x4f,0x39,0xb5,0x11, + 0x58,0x17,0xf7,0x24,0x5c,0x46,0x8f,0x64,0xf7,0xc1,0x69,0x88,0x76,0x98,0x76,0x3d,0x59,0x5d,0x42,0x76,0x87,0x89,0x97,0x69, + 0x7a,0x48,0xf0,0xe0,0xa2,0x12,0x1b,0x66,0x9a,0x74,0xca,0xde,0x4b,0x1e,0xe7,0x0e,0x63,0xae,0xe6,0xd4,0xef,0x92,0x92,0x3a, + 0x9e,0x3d,0xdc,0x00,0xe4,0x45,0x25,0x89,0xb6,0x9a,0x44,0x19,0x2b,0x7e,0xc0,0x94,0xb4,0xd2,0x61,0x6d,0xeb,0x33,0xd9,0xc5, + 0xdf,0x4b,0x04,0x00,0xcc,0x7d,0x1c,0x95,0xc3,0x8f,0xf7,0x21,0xb2,0xb2,0x11,0xb7,0xbb,0x7f,0xf2,0xd5,0x8c,0x70,0x2c,0x41, + 0x60,0xaa,0xb1,0x63,0x18,0x44,0x95,0x1a,0x76,0x62,0x7e,0xf6,0x80,0xb0,0xfb,0xe8,0x64,0xa6,0x33,0xd1,0x89,0x07,0xe1,0xbd, + 0xb7,0xe6,0x43,0xa4,0x18,0xb8,0xa6,0x77,0x01,0xe1,0x0f,0x94,0x0c,0x21,0x1d,0xb2,0x54,0x29,0x25,0x89,0x6c,0xe5,0x0e,0x52, + 0x51,0x47,0x74,0xbe,0x26,0xac,0xb6,0x41,0x75,0xde,0x7a,0xac,0x5f,0x8d,0x3f,0xc9,0xbc,0xd3,0x41,0x11,0x12,0x5b,0xe5,0x10, + 0x50,0xeb,0x31,0xc5,0xca,0x72,0x16,0x22,0x09,0xdf,0x7c,0x4c,0x75,0x3f,0x63,0xec,0x21,0x5f,0xc4,0x20,0x51,0x6b,0x6f,0xb1, + 0xab,0x86,0x8b,0x4f,0xc2,0xd6,0x45,0x5f,0x9d,0x20,0xfc,0xa1,0x1e,0xc5,0xc0,0x8f,0xa2,0xb1,0x7e,0x0a,0x26,0x99,0xf5,0xe4, + 0x69,0x2f,0x98,0x1d,0x2d,0xf5,0xd9,0xa9,0xb2,0x1d,0xe5,0x1b,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x3a,0x30,0x82,0x01, + 0x36,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1d,0x06,0x03,0x55,0x1d, + 0x0e,0x04,0x16,0x04,0x14,0xec,0xd7,0xe3,0x82,0xd2,0x71,0x5d,0x64,0x4c,0xdf,0x2e,0x67,0x3f,0xe7,0xba,0x98,0xae,0x1c,0x0f, + 0x4f,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x45,0xeb,0xa2,0xaf,0xf4,0x92,0xcb,0x82,0x31,0x2d, + 0x51,0x8b,0xa7,0xa7,0x21,0x9d,0xf3,0x6d,0xc8,0x0f,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02, + 0x01,0x86,0x30,0x79,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x6d,0x30,0x6b,0x30,0x24,0x06,0x08,0x2b,0x06, + 0x01,0x05,0x05,0x07,0x30,0x01,0x86,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70,0x2e,0x64,0x69,0x67,0x69, + 0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x43,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x37,0x68,0x74, + 0x74,0x70,0x3a,0x2f,0x2f,0x63,0x61,0x63,0x65,0x72,0x74,0x73,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f, + 0x6d,0x2f,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x41,0x73,0x73,0x75,0x72,0x65,0x64,0x49,0x44,0x52,0x6f,0x6f,0x74,0x43, + 0x41,0x2e,0x63,0x72,0x74,0x30,0x45,0x06,0x03,0x55,0x1d,0x1f,0x04,0x3e,0x30,0x3c,0x30,0x3a,0xa0,0x38,0xa0,0x36,0x86,0x34, + 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x33,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d, + 0x2f,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x41,0x73,0x73,0x75,0x72,0x65,0x64,0x49,0x44,0x52,0x6f,0x6f,0x74,0x43,0x41, + 0x2e,0x63,0x72,0x6c,0x30,0x11,0x06,0x03,0x55,0x1d,0x20,0x04,0x0a,0x30,0x08,0x30,0x06,0x06,0x04,0x55,0x1d,0x20,0x00,0x30, + 0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0c,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x70,0xa0,0xbf,0x43,0x5c, + 0x55,0xe7,0x38,0x5f,0xa0,0xa3,0x74,0x1b,0x3d,0xb6,0x16,0xd7,0xf7,0xbf,0x57,0x07,0xbd,0x9a,0xac,0xa1,0x87,0x2c,0xec,0x85, + 0x5e,0xa9,0x1a,0xbb,0x22,0xf8,0x87,0x1a,0x69,0x54,0x22,0xed,0xa4,0x88,0x77,0x6d,0xbd,0x1a,0x14,0xf4,0x13,0x4a,0x7a,0x2f, + 0x2d,0xb7,0x38,0xef,0xf4,0xff,0x80,0xb9,0xf8,0xa1,0xf7,0xf2,0x72,0xde,0x24,0xbc,0x52,0x03,0xc8,0x4e,0xd0,0x2a,0xde,0xfa, + 0x2d,0x56,0xcf,0xf9,0xf4,0xf7,0xac,0x30,0x7a,0x9a,0x8b,0xb2,0x5e,0xd4,0xcf,0xd1,0x43,0x44,0x9b,0x43,0x21,0xeb,0x96,0x72, + 0xa1,0x48,0xb4,0x99,0xcb,0x9d,0x4f,0xa7,0x06,0x03,0x13,0x77,0x27,0x44,0xd4,0xe7,0x7f,0xe8,0x59,0xa8,0xf0,0xbf,0x2f,0x0b, + 0xa6,0xe9,0xf2,0x34,0x3c,0xec,0xf7,0x03,0xc7,0x87,0xa8,0xd2,0x4c,0x40,0x19,0x35,0x46,0x6a,0x69,0x54,0xb0,0xb8,0xa1,0x56, + 0x8e,0xec,0xa4,0xd5,0x3d,0xe8,0xb1,0xdc,0xfd,0x1c,0xd8,0xf4,0x77,0x5a,0x5c,0x54,0x8c,0x6f,0xef,0xa1,0x50,0x3d,0xfc,0x76, + 0x09,0x68,0x84,0x9f,0x6f,0xca,0xdb,0x20,0x8d,0x35,0x60,0x1c,0x02,0x03,0xcb,0x20,0xb0,0xac,0x58,0xa0,0x0e,0x40,0x63,0xc5, + 0x98,0x22,0xc1,0xb2,0x59,0xf5,0x55,0x6b,0xcf,0x27,0xab,0x6c,0x76,0xce,0x6f,0x23,0x2d,0xf4,0x7e,0x71,0x6a,0x23,0x6b,0x22, + 0xff,0x12,0xb8,0x54,0x2d,0x27,0x7e,0xd8,0x3a,0xd9,0xf0,0xb6,0x87,0x96,0xfd,0x5b,0xd1,0x5c,0xac,0x18,0xc3,0x4d,0x9f,0x73, + 0xb7,0x01,0xa9,0x9f,0x57,0xaa,0x5e,0x28,0xe2,0xb9,0x94,0x30,0x82,0x06,0xae,0x30,0x82,0x04,0x96,0xa0,0x03,0x02,0x01,0x02, + 0x02,0x10,0x07,0x36,0x37,0xb7,0x24,0x54,0x7c,0xd8,0x47,0xac,0xfd,0x28,0x66,0x2a,0x5e,0x5b,0x30,0x0d,0x06,0x09,0x2a,0x86, + 0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x62,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53, + 0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49,0x6e,0x63,0x31, + 0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0b,0x13,0x10,0x77,0x77,0x77,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63, + 0x6f,0x6d,0x31,0x21,0x30,0x1f,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x54,0x72, + 0x75,0x73,0x74,0x65,0x64,0x20,0x52,0x6f,0x6f,0x74,0x20,0x47,0x34,0x30,0x1e,0x17,0x0d,0x32,0x32,0x30,0x33,0x32,0x33,0x30, + 0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x33,0x37,0x30,0x33,0x32,0x32,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x63,0x31, + 0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x44, + 0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x3b,0x30,0x39,0x06,0x03,0x55,0x04,0x03,0x13,0x32, + 0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x47,0x34,0x20,0x52,0x53,0x41,0x34, + 0x30,0x39,0x36,0x20,0x53,0x48,0x41,0x32,0x35,0x36,0x20,0x54,0x69,0x6d,0x65,0x53,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x20, + 0x43,0x41,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02, + 0x0f,0x00,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xc6,0x86,0x35,0x06,0x49,0xb3,0xc1,0x3d,0x72,0x49,0x51,0x55,0xc7, + 0x25,0x03,0xc4,0xf2,0x91,0x37,0xa9,0x97,0x51,0xa1,0xd6,0xd2,0x83,0xd1,0x9e,0x4c,0xa2,0x6d,0xa0,0xb0,0xcc,0x83,0xf9,0x5a, + 0xf6,0x11,0xa1,0x44,0x15,0x42,0x5f,0xa4,0x88,0xf3,0x68,0xfa,0x7d,0xf3,0x9c,0x89,0x0b,0x7f,0x9d,0x1f,0x9e,0x0f,0x33,0x1f, + 0x50,0x13,0x0b,0x26,0x73,0x96,0x6d,0xf8,0x57,0xa8,0x02,0x7d,0xfd,0x43,0xb4,0x84,0xda,0x11,0xf1,0x73,0xb1,0xb3,0xee,0x2b, + 0x80,0x84,0x8a,0x22,0x18,0xdf,0xeb,0xda,0x3d,0xc4,0x17,0x7f,0xab,0x19,0x2b,0x3e,0x42,0xdc,0x67,0x8e,0xea,0x51,0x3d,0xf0, + 0xd6,0x56,0xd4,0xe7,0x28,0x2d,0xeb,0xd3,0xb1,0xb5,0x75,0xe7,0x1f,0x06,0x65,0x8d,0x94,0x29,0xd3,0xd9,0xec,0x69,0xdf,0xd9, + 0x90,0x87,0x46,0x00,0x7b,0xdb,0x44,0x41,0x89,0xdc,0x7c,0x6a,0x57,0x7a,0xf0,0x37,0x79,0x9f,0x5d,0xac,0xcb,0xe8,0x84,0x64, + 0xb4,0x52,0xf2,0x76,0x47,0xf7,0x61,0x83,0x19,0xdd,0x5f,0xb4,0x54,0x0b,0x21,0x68,0x6e,0x37,0x21,0xbb,0x40,0xac,0x5f,0xb2, + 0xde,0x4a,0x7d,0xce,0xf5,0x39,0x12,0x67,0xef,0x0e,0xa5,0x63,0x6c,0xe4,0xa6,0xc5,0x1d,0xcd,0x36,0x0d,0x5c,0xd5,0xe6,0x1b, + 0xa8,0xc1,0x64,0x74,0x40,0xa7,0xc0,0x72,0xc5,0xba,0x4e,0x1f,0xb1,0xb5,0x58,0x4d,0x79,0xfe,0xd7,0x8f,0x73,0x93,0xac,0x2c, + 0x39,0xe2,0xa5,0x48,0xd6,0xf0,0xb0,0x31,0x13,0xa9,0x57,0x29,0x96,0x27,0x2e,0xf5,0x87,0xa6,0x8f,0x4e,0x76,0x15,0x55,0x26, + 0x70,0x98,0x26,0x7f,0xa0,0x1a,0x47,0x20,0x43,0xe3,0x43,0x63,0x80,0x7b,0x75,0x6e,0x27,0x25,0x90,0x98,0x3a,0x38,0x11,0xb3, + 0xf6,0xf6,0x9e,0xe6,0x3b,0x5b,0xec,0x81,0xde,0x22,0x14,0xd9,0x82,0x2a,0xc7,0x92,0xbf,0xa0,0xde,0xe3,0x3e,0xa2,0x73,0xfa, + 0xe7,0x1f,0x5a,0x6c,0x94,0xf2,0x52,0x95,0x11,0x2b,0x58,0x74,0x40,0x28,0xab,0x73,0x43,0xce,0xdf,0x4a,0xa1,0x1c,0x6b,0x38, + 0xc5,0x29,0xf3,0xca,0xaa,0x96,0x73,0x42,0x68,0x9f,0xb6,0x46,0xb3,0x9d,0x3a,0xa3,0xd5,0x03,0xe0,0xbf,0xf0,0xa2,0x3c,0xca, + 0x42,0xdc,0x18,0x48,0x7f,0x14,0x34,0xcf,0xd2,0x4c,0xab,0xef,0x9b,0x3d,0xfe,0x0e,0xb8,0x64,0x2a,0xfa,0x75,0x28,0x24,0x41, + 0xed,0x42,0xbf,0x05,0x9c,0x66,0x49,0x52,0x50,0xf4,0x51,0xf3,0x36,0x49,0x4d,0x8b,0x20,0xd2,0x2c,0x57,0x35,0x79,0x2b,0xa8, + 0xf3,0x45,0x60,0xbc,0x23,0x8d,0x58,0xf7,0xdc,0x61,0xde,0x93,0xfe,0x39,0xc0,0xf9,0xb2,0x30,0xa5,0x4c,0xd7,0xe9,0x98,0x4a, + 0x58,0x3e,0xd3,0x03,0x88,0xfe,0xb3,0x8f,0xd3,0x5e,0x4b,0x76,0x12,0x51,0x93,0xc9,0x8c,0x0c,0x3b,0x5b,0x8a,0x22,0xa8,0xc1, + 0x26,0x08,0xf9,0x14,0x10,0x12,0x03,0x7d,0x5f,0x23,0xbb,0x64,0xe3,0x63,0xe0,0xa6,0xe1,0x3e,0xf6,0xc2,0x74,0xb2,0x3f,0x1e, + 0x09,0x76,0xec,0xab,0x5d,0x46,0x75,0xe2,0x60,0xa3,0x58,0x09,0x01,0x28,0x00,0x0e,0x84,0x54,0xee,0xce,0xe9,0x5d,0xc8,0x5e, + 0x30,0x12,0xbd,0x46,0x9e,0xb5,0xd3,0x76,0xb9,0xd2,0x0e,0x6b,0x99,0x0c,0xd2,0x33,0xb4,0xcd,0xb1,0x02,0x03,0x01,0x00,0x01, + 0xa3,0x82,0x01,0x5d,0x30,0x82,0x01,0x59,0x30,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01,0x01, + 0xff,0x02,0x01,0x00,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0xba,0x16,0xd9,0x6d,0x4d,0x85,0x2f,0x73,0x29, + 0x76,0x9a,0x2f,0x75,0x8c,0x6a,0x20,0x8f,0x9e,0xc8,0x6f,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14, + 0xec,0xd7,0xe3,0x82,0xd2,0x71,0x5d,0x64,0x4c,0xdf,0x2e,0x67,0x3f,0xe7,0xba,0x98,0xae,0x1c,0x0f,0x4f,0x30,0x0e,0x06,0x03, + 0x55,0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x13,0x06,0x03,0x55,0x1d,0x25,0x04,0x0c,0x30,0x0a,0x06, + 0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x08,0x30,0x77,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x6b,0x30, + 0x69,0x30,0x24,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x01,0x86,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6f,0x63, + 0x73,0x70,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x30,0x41,0x06,0x08,0x2b,0x06,0x01,0x05,0x05, + 0x07,0x30,0x02,0x86,0x35,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x61,0x63,0x65,0x72,0x74,0x73,0x2e,0x64,0x69,0x67,0x69, + 0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x54,0x72,0x75,0x73,0x74,0x65,0x64, + 0x52,0x6f,0x6f,0x74,0x47,0x34,0x2e,0x63,0x72,0x74,0x30,0x43,0x06,0x03,0x55,0x1d,0x1f,0x04,0x3c,0x30,0x3a,0x30,0x38,0xa0, + 0x36,0xa0,0x34,0x86,0x32,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x33,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72, + 0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x52,0x6f,0x6f, + 0x74,0x47,0x34,0x2e,0x63,0x72,0x6c,0x30,0x20,0x06,0x03,0x55,0x1d,0x20,0x04,0x19,0x30,0x17,0x30,0x08,0x06,0x06,0x67,0x81, + 0x0c,0x01,0x04,0x02,0x30,0x0b,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xfd,0x6c,0x07,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48, + 0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x7d,0x59,0x8e,0xc0,0x93,0xb6,0x6f,0x98,0xa9,0x44,0x22, + 0x01,0x7e,0x66,0xd6,0xd8,0x21,0x42,0xe1,0xb0,0x18,0x2e,0x10,0x4d,0x13,0xcf,0x30,0x53,0xce,0xbf,0x18,0xfb,0xc7,0x50,0x5d, + 0xe2,0x4b,0x29,0xfb,0x70,0x8a,0x0d,0xaa,0x29,0x69,0xfc,0x69,0xc1,0xcf,0x1d,0x07,0xe9,0x3e,0x60,0xc8,0xd8,0x0b,0xe5,0x5c, + 0x5b,0xd7,0x6d,0x87,0xfa,0x84,0x20,0x25,0x34,0x31,0x67,0xcd,0xb6,0x12,0x96,0x6f,0xc4,0x50,0x4c,0x62,0x1d,0x0c,0x08,0x82, + 0xa8,0x16,0xbd,0xa9,0x56,0xcf,0x15,0x73,0x8d,0x01,0x22,0x25,0xce,0x95,0x69,0x3f,0x47,0x77,0xfb,0x72,0x74,0x14,0xd7,0xff, + 0xab,0x4f,0x8a,0x2c,0x7a,0xab,0x85,0xcd,0x43,0x5f,0xed,0x60,0xb6,0xaa,0x4f,0x91,0x66,0x9e,0x2c,0x9e,0xe0,0x8a,0xac,0xe5, + 0xfd,0x8c,0xbc,0x64,0x26,0x87,0x6c,0x92,0xbd,0x9d,0x7c,0xd0,0x70,0x0a,0x7c,0xef,0xa8,0xbc,0x75,0x4f,0xba,0x5a,0xf7,0xa9, + 0x10,0xb2,0x5d,0xe9,0xff,0x28,0x54,0x89,0xf0,0xd5,0x8a,0x71,0x76,0x65,0xda,0xcc,0xf0,0x72,0xa3,0x23,0xfa,0xc0,0x27,0x82, + 0x44,0xae,0x99,0x27,0x1b,0xab,0x24,0x1e,0x26,0xc1,0xb7,0xde,0x2a,0xeb,0xf6,0x9e,0xb1,0x79,0x99,0x81,0xa3,0x56,0x86,0xab, + 0x0a,0x45,0xc9,0xdf,0xc4,0x8d,0xa0,0xe7,0x98,0xfb,0xfb,0xa6,0x9d,0x72,0xaf,0xc4,0xc7,0xc1,0xc1,0x6a,0x71,0xd9,0xc6,0x13, + 0x80,0x09,0xc4,0xb6,0x9f,0xcd,0x87,0x87,0x24,0xbb,0x4f,0xa3,0x49,0xb9,0x77,0x66,0x91,0xf1,0x72,0x9c,0xe9,0x4b,0x02,0x52, + 0xa7,0x37,0x7e,0x93,0x53,0xac,0x3b,0x1d,0x08,0x49,0x0f,0x94,0xcd,0x39,0x7a,0xdd,0xff,0x25,0x63,0x99,0x27,0x2c,0x3d,0x3f, + 0x6b,0xa7,0xf1,0x66,0xc3,0x41,0xcd,0x4f,0xb6,0x40,0x9b,0x21,0x21,0x40,0xd0,0xb7,0x13,0x24,0xcd,0xdc,0x1d,0x78,0x3a,0xe4, + 0x9e,0xad,0xe5,0x34,0x71,0x92,0xd7,0x26,0x6b,0xe4,0x38,0x73,0xab,0xa6,0x01,0x4f,0xbd,0x3f,0x3b,0x78,0xad,0x4c,0xad,0xfb, + 0xc4,0x95,0x7b,0xed,0x0a,0x5f,0x33,0x39,0x87,0x41,0x78,0x7a,0x38,0xe9,0x9c,0xe1,0xdd,0x23,0xfd,0x1d,0x28,0xd3,0xc7,0xf9, + 0xe8,0xf1,0x98,0x5f,0xfb,0x2b,0xd8,0x7e,0xf2,0x46,0x9d,0x75,0x2c,0x1e,0x27,0x2c,0x26,0xdb,0x6f,0x15,0x7b,0x1e,0x19,0x8b, + 0x36,0xb8,0x93,0xd4,0xe6,0xf2,0x17,0x99,0x59,0xca,0x70,0xf0,0x37,0xbf,0x98,0x00,0xdf,0x20,0x16,0x4f,0x27,0xfb,0x60,0x67, + 0x16,0xa1,0x66,0xba,0xdd,0x55,0xc0,0x3a,0x29,0x86,0xb0,0x98,0xa0,0x2b,0xed,0x95,0x41,0xb7,0x3a,0xd5,0x15,0x98,0x31,0xb4, + 0x62,0x09,0x0f,0x0a,0xbd,0x81,0xd9,0x13,0xfe,0xbf,0xa4,0xd1,0xf3,0x57,0xd9,0xbc,0x04,0xfa,0x82,0xde,0x32,0xdf,0x04,0x89, + 0xf0,0x00,0xcd,0x5d,0xc2,0xf9,0xd0,0x23,0x7f,0x00,0x0b,0xe4,0x76,0x02,0x26,0xd9,0xf0,0x65,0x76,0x42,0xa6,0x29,0x87,0x09, + 0x47,0x2b,0xe6,0x7f,0x1a,0xa4,0x85,0x0f,0xfc,0x98,0x96,0xf6,0x55,0x54,0x2b,0x1f,0x80,0xfa,0xc0,0xf2,0x0e,0x2b,0xe5,0xd6, + 0xfb,0xa9,0x2f,0x44,0x15,0x4a,0xe7,0x13,0x0e,0x1d,0xdb,0x37,0x38,0x1a,0xa1,0x2b,0xf6,0xed,0xd6,0x7c,0xfc,0x30,0x82,0x06, + 0xc0,0x30,0x82,0x04,0xa8,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x0c,0x4d,0x69,0x72,0x4b,0x94,0xfa,0x3c,0x2a,0x4a,0x3d,0x29, + 0x07,0x80,0x3d,0x5a,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x63,0x31,0x0b,0x30, + 0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x44,0x69,0x67, + 0x69,0x43,0x65,0x72,0x74,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x3b,0x30,0x39,0x06,0x03,0x55,0x04,0x03,0x13,0x32,0x44,0x69, + 0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x47,0x34,0x20,0x52,0x53,0x41,0x34,0x30,0x39, + 0x36,0x20,0x53,0x48,0x41,0x32,0x35,0x36,0x20,0x54,0x69,0x6d,0x65,0x53,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x20,0x43,0x41, + 0x30,0x1e,0x17,0x0d,0x32,0x32,0x30,0x39,0x32,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x33,0x33,0x31,0x31,0x32, + 0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x46,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31, + 0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0a,0x13,0x08,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x31,0x24,0x30,0x22,0x06,0x03, + 0x55,0x04,0x03,0x13,0x1b,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x54,0x69,0x6d,0x65,0x73,0x74,0x61,0x6d,0x70,0x20, + 0x32,0x30,0x32,0x32,0x20,0x2d,0x20,0x32,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01, + 0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xcf,0xec,0xa5,0x26,0x3a,0xc6,0xa9, + 0xf2,0x6b,0xbb,0x8d,0xc1,0x0d,0x9a,0xdb,0xa1,0xe8,0x14,0x85,0x74,0x33,0x1a,0x26,0xac,0xd0,0x1c,0x55,0x1e,0x1e,0x36,0x6d, + 0xbc,0x92,0x55,0x0c,0x61,0xf4,0x9d,0x09,0x77,0x3d,0x15,0x96,0x08,0x2f,0x6b,0x64,0xa4,0xfd,0x06,0x83,0x16,0xd7,0x91,0x92, + 0x38,0x1c,0x31,0x02,0x96,0xfb,0x72,0xb1,0x97,0x3a,0x55,0xaf,0x33,0xec,0x61,0x8a,0xe9,0xa6,0x28,0xdb,0x90,0x63,0x5c,0xbd, + 0x89,0x53,0xe0,0x3a,0x2d,0x8c,0x87,0x42,0xae,0x26,0xa4,0xe4,0xbb,0x78,0x78,0xb9,0x7a,0x16,0xe1,0x56,0xc6,0xc0,0xba,0x64, + 0x53,0xbb,0x2a,0x16,0xe7,0x50,0x48,0xbb,0x88,0x69,0x0c,0x88,0xc6,0xf1,0xbe,0xe0,0x2f,0x7d,0x3b,0xb1,0xca,0x53,0x8d,0x40, + 0x83,0x1e,0xe7,0xcb,0x72,0x49,0x28,0x1e,0x4c,0x80,0x1e,0x85,0x56,0xe7,0x85,0xed,0xf2,0x61,0xbc,0xaa,0x3a,0x07,0x7d,0xf6, + 0xab,0x6e,0xe5,0x66,0xdd,0xe2,0x5c,0xf5,0x2f,0xed,0x8d,0xd4,0x4d,0x95,0x84,0x68,0xe3,0x80,0xcb,0x6a,0x79,0xd1,0xd2,0x10, + 0x91,0x46,0x29,0xeb,0x3e,0x26,0xf2,0xb4,0x8c,0xcd,0x4c,0xb9,0x66,0xc8,0xbb,0xaa,0x50,0x38,0x0d,0xe5,0x8c,0x94,0x5d,0x19, + 0x5a,0xbf,0xf5,0x7b,0x40,0x6e,0x6f,0x16,0xa8,0x9a,0x9c,0x95,0x47,0x86,0x85,0x79,0x3e,0x0c,0x5e,0x66,0x8c,0x1a,0x0a,0x24, + 0xbe,0x9c,0xaa,0xd2,0x9c,0xb6,0xf7,0x4f,0x6e,0x78,0xc4,0x28,0x3f,0xa3,0x1c,0x0f,0x50,0x06,0x37,0xba,0x08,0xd9,0x35,0xa6, + 0xb5,0x1e,0xda,0x78,0x58,0x1d,0x39,0xe8,0xf8,0x4c,0x91,0x10,0x96,0x7e,0x4d,0xe1,0xdd,0xc2,0xad,0xa5,0x7e,0xf8,0x2d,0x1b, + 0x1f,0xec,0x2b,0x46,0x18,0xa3,0x19,0xf6,0x39,0xf7,0xf5,0xc1,0x4f,0x71,0x2e,0x89,0x03,0x11,0xa2,0x4b,0xbb,0x98,0xbf,0xfa, + 0x4f,0xe4,0x7b,0x36,0xef,0x06,0x44,0xe4,0x55,0xff,0x36,0xea,0xe5,0x7c,0x31,0xe7,0xf3,0xc2,0x52,0xc4,0xe6,0x16,0x7b,0x5a, + 0x7e,0xa5,0x25,0x73,0xdb,0xc0,0x6a,0x99,0x21,0x2d,0x63,0xe5,0x59,0xf5,0x4d,0x2f,0x90,0x1f,0x27,0xb7,0xd2,0xab,0x14,0xe5, + 0x38,0x66,0x87,0x51,0x08,0x6b,0xfb,0x53,0x43,0x39,0xd0,0x64,0xfa,0x56,0xcf,0xe0,0xf4,0x0a,0xe6,0x14,0x6d,0x64,0x78,0xbb, + 0x98,0xfd,0x94,0xc3,0x73,0x21,0xf3,0x2f,0xc2,0x2e,0x20,0xd7,0x81,0xac,0xd3,0xf1,0x07,0xd4,0xe1,0xbd,0xd9,0x5d,0x4b,0x6e, + 0x31,0x94,0x29,0x8b,0xe6,0x41,0xa4,0x65,0x94,0xc0,0x58,0xe5,0xe5,0x2e,0x29,0x90,0xa6,0xb7,0x61,0x64,0xfa,0xd9,0x20,0x6c, + 0x18,0x51,0x60,0xba,0xa6,0x81,0x0f,0x09,0x25,0x53,0xf1,0xbf,0x3b,0xe9,0xab,0x07,0x0e,0x6a,0x07,0x39,0x62,0x19,0xc9,0xd6, + 0x85,0x7f,0x13,0xd9,0x8d,0x79,0xcf,0x62,0xc5,0xec,0xe1,0x7b,0xb9,0xcc,0x67,0x13,0x07,0x9a,0xc1,0x78,0xed,0xc6,0x88,0xc8, + 0xb0,0x6e,0x32,0x79,0xc7,0x0b,0x59,0x83,0x8d,0xc6,0xee,0xf5,0x2c,0x7c,0x7b,0x8e,0xcb,0x64,0x89,0xf1,0xb1,0xc4,0xb8,0xe7, + 0x53,0x5e,0x5f,0x55,0xd2,0x7d,0x19,0x29,0x59,0x03,0x4e,0xfa,0x5d,0xea,0x45,0x73,0x1c,0x84,0x7e,0xd7,0xce,0xe2,0xd4,0x3a, + 0x77,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x8b,0x30,0x82,0x01,0x87,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01,0xff, + 0x04,0x04,0x03,0x02,0x07,0x80,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x16,0x06,0x03, + 0x55,0x1d,0x25,0x01,0x01,0xff,0x04,0x0c,0x30,0x0a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x08,0x30,0x20,0x06,0x03, + 0x55,0x1d,0x20,0x04,0x19,0x30,0x17,0x30,0x08,0x06,0x06,0x67,0x81,0x0c,0x01,0x04,0x02,0x30,0x0b,0x06,0x09,0x60,0x86,0x48, + 0x01,0x86,0xfd,0x6c,0x07,0x01,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xba,0x16,0xd9,0x6d,0x4d, + 0x85,0x2f,0x73,0x29,0x76,0x9a,0x2f,0x75,0x8c,0x6a,0x20,0x8f,0x9e,0xc8,0x6f,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16, + 0x04,0x14,0x62,0x8a,0xde,0xd0,0x61,0xfc,0x8f,0x31,0x14,0xed,0x97,0x0b,0xcd,0x3d,0x2a,0x94,0x14,0xdf,0x52,0x9c,0x30,0x5a, + 0x06,0x03,0x55,0x1d,0x1f,0x04,0x53,0x30,0x51,0x30,0x4f,0xa0,0x4d,0xa0,0x4b,0x86,0x49,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f, + 0x63,0x72,0x6c,0x33,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x44,0x69,0x67,0x69,0x43,0x65, + 0x72,0x74,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x47,0x34,0x52,0x53,0x41,0x34,0x30,0x39,0x36,0x53,0x48,0x41,0x32,0x35,0x36, + 0x54,0x69,0x6d,0x65,0x53,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x43,0x41,0x2e,0x63,0x72,0x6c,0x30,0x81,0x90,0x06,0x08,0x2b, + 0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x81,0x83,0x30,0x81,0x80,0x30,0x24,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30, + 0x01,0x86,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e, + 0x63,0x6f,0x6d,0x30,0x58,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x4c,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f, + 0x63,0x61,0x63,0x65,0x72,0x74,0x73,0x2e,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x44,0x69,0x67, + 0x69,0x43,0x65,0x72,0x74,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x47,0x34,0x52,0x53,0x41,0x34,0x30,0x39,0x36,0x53,0x48,0x41, + 0x32,0x35,0x36,0x54,0x69,0x6d,0x65,0x53,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x43,0x41,0x2e,0x63,0x72,0x74,0x30,0x0d,0x06, + 0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x55,0xaa,0x2a,0x1a,0xf3,0x46,0xf3, + 0x78,0x57,0x37,0x30,0xfc,0x75,0xe3,0x4f,0xd6,0x85,0x23,0xf1,0xfc,0xf9,0x95,0x39,0x9b,0x25,0xe6,0xf7,0x72,0x8a,0x98,0xc3, + 0x77,0xd4,0x64,0xfc,0x15,0xfb,0x36,0xc2,0x49,0x51,0x2c,0x78,0x88,0x63,0x55,0x09,0x46,0x39,0x00,0xfc,0x69,0xd4,0xca,0x9b, + 0x29,0xfb,0xa3,0x3f,0xc0,0xc9,0x00,0x9b,0x13,0x1d,0xb0,0x98,0x89,0xdc,0x78,0xf2,0xcd,0x7c,0x85,0xcd,0x53,0x9d,0xaf,0x62, + 0xe2,0x61,0x66,0xa3,0x14,0x2a,0x45,0x87,0x4a,0x98,0x42,0x2b,0x50,0xfc,0x1b,0xb5,0x9e,0x08,0x30,0x09,0xfa,0xe4,0x2d,0xd7, + 0x09,0x89,0x79,0xf9,0x09,0xe6,0x88,0xce,0x7d,0x1b,0xb8,0x6a,0xa2,0x9b,0xc1,0x53,0x60,0x09,0xe8,0xa3,0xb8,0x9d,0xd7,0xad, + 0x1f,0x1c,0xb8,0xec,0x98,0x41,0xf0,0xf6,0x0e,0x80,0xfb,0xe4,0xff,0xdf,0x9d,0x10,0xa7,0xeb,0x00,0xba,0x5f,0x4a,0x8f,0x1a, + 0x3a,0x52,0xb4,0xea,0xbf,0x09,0x49,0x15,0x35,0x36,0x59,0x9a,0x0f,0x54,0xd2,0xb2,0x1b,0x7f,0x7e,0x5e,0x09,0xad,0x76,0x54, + 0x8a,0x74,0x6d,0xca,0xd2,0x05,0x67,0x2b,0x76,0xeb,0xff,0x98,0xb2,0x26,0x95,0x38,0x19,0x88,0x44,0x14,0xe5,0x0a,0x59,0xa2, + 0x6b,0xe7,0x22,0x3e,0x44,0x21,0xd2,0x3f,0x1c,0xc0,0x9b,0xed,0x7c,0x48,0xb2,0xd8,0x92,0x0c,0x91,0x4f,0x3c,0x66,0x94,0xaf, + 0x5d,0x02,0x53,0xeb,0x9e,0xe2,0x9e,0xe4,0xd3,0x1f,0x86,0x01,0x64,0x9c,0x00,0xc2,0xe9,0x5a,0x74,0x75,0x0d,0x3d,0xe1,0x79, + 0x88,0xbf,0x1c,0x01,0x97,0xc9,0x19,0x23,0x80,0xd7,0x36,0x5a,0x5f,0x96,0x16,0xb1,0x63,0x0c,0xc6,0x46,0x40,0x3b,0xce,0x5d, + 0x35,0xd4,0x59,0x3e,0x43,0x9a,0x18,0xae,0xc3,0xc9,0xcb,0xc3,0xfb,0x9b,0x13,0x5f,0x6a,0xb5,0xc7,0xe0,0xf3,0x05,0xc3,0x59, + 0xdf,0x27,0x62,0x2b,0xde,0x41,0xc9,0x53,0xb9,0xff,0x34,0x10,0x67,0xf6,0x26,0x32,0x98,0x7b,0xfe,0x5c,0x42,0x94,0x81,0x94, + 0x82,0x9d,0xac,0x0a,0x8b,0xc6,0x4b,0x15,0x4a,0xd3,0x98,0x90,0x45,0x60,0x33,0x80,0xe0,0x23,0xde,0xf8,0x03,0xa4,0xf6,0x45, + 0x47,0xe5,0xce,0xb8,0x03,0x42,0x47,0xe8,0x41,0x36,0x71,0x77,0xad,0xfd,0xa2,0xe8,0x97,0x74,0x4e,0x2e,0xda,0x1e,0x1d,0x8c, + 0x5a,0xc8,0x1e,0x9a,0xd5,0xc2,0xf0,0xc6,0x22,0xa8,0x4f,0x9b,0xbd,0xd8,0x1c,0x9a,0x51,0xc4,0x2f,0x9a,0xf6,0x5f,0xa7,0x27, + 0x97,0xba,0x96,0x2e,0x85,0x57,0xc0,0x60,0xe7,0x78,0x56,0x7f,0x6a,0xef,0xc2,0x95,0x9a,0x4b,0x11,0x02,0xc8,0x82,0x9c,0xc9, + 0x1a,0x05,0x7c,0xba,0x71,0xb5,0x4e,0x7a,0x99,0x6c,0xf4,0xe8,0x9e,0xd4,0x5a,0x98,0xc8,0x9f,0xbf,0x8d,0xbb,0x18,0x5c,0x43, + 0xf5,0xd0,0x2a,0xe8,0xe2,0x62,0xee,0x78,0x04,0xdb,0xbd,0xd1,0xfb,0x5b,0x0a,0xa8,0x70,0x7e,0xf0,0x97,0x84,0x78,0xe3,0x08, + 0x03,0x5d,0x47,0x2c,0x63,0xa8,0x25,0x38,0x97,0x01,0xd2,0x3f,0x3a,0xda,0xe5,0xe5,0xf6,0xe6,0x9b,0xdc,0x7e,0x2c,0xcc,0xff, + 0x17,0x4c,0x4d,0x00,0xa2,0xd8,0xd6,0x01,0x0e,0xb8,0x8b,0xee,0xe6,0xe0,0x72,0x55,0x89,0x2c,0x27,0x19,0x61,0xf6,0x77,0x01, + 0x8c,0x31,0x82,0x0f,0x9d,0x30,0x82,0x0f,0x99,0x02,0x01,0x01,0x30,0x26,0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04, + 0x03,0x13,0x07,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x02,0x10,0xd1,0x73,0x97,0xaa,0xa7,0x3a,0x31,0xa2,0x44,0xc0,0x4b,0x40, + 0x69,0x40,0x4b,0xfa,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x5e,0x30,0x10,0x06, + 0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0c,0x31,0x02,0x30,0x00,0x30,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7, + 0x0d,0x01,0x09,0x03,0x31,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0x30,0x2f,0x06,0x09,0x2a,0x86, + 0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xcb,0xa1,0x2f,0x7b,0x0f,0x6a,0x14,0x06,0x26,0x77,0x7b,0xee,0xd1, + 0x90,0x34,0x1c,0xa7,0xcd,0x94,0x65,0xe0,0xe4,0x24,0x12,0x0c,0x4e,0xa2,0x89,0xeb,0x2d,0xe5,0xbb,0x30,0x0d,0x06,0x09,0x2a, + 0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x01,0x00,0x73,0xb7,0xdf,0xb4,0xd2,0x60,0x31,0x2d,0x14,0x63, + 0x71,0x87,0x5b,0xd9,0xee,0x66,0x85,0x88,0xbe,0x1e,0xc3,0x5e,0x30,0x25,0x62,0x05,0x66,0x6e,0x9b,0x51,0xaa,0x5b,0xee,0xed, + 0xe4,0x4c,0x83,0x19,0x7e,0x7b,0x78,0xe0,0x04,0xb5,0xdb,0xb3,0x48,0xba,0xa3,0xa4,0x54,0xb2,0x3e,0xe4,0x99,0xf1,0xb2,0x6e, + 0xb7,0x7a,0x44,0x76,0x11,0xb4,0x51,0xae,0xe3,0xec,0xc2,0x43,0x65,0xf5,0x95,0x1c,0x57,0x9e,0x4d,0x49,0x4d,0x4c,0xee,0x09, + 0xdd,0xdb,0xab,0xf3,0x14,0x89,0xec,0x6e,0x94,0xd2,0xac,0xd8,0xed,0xe3,0xbb,0x8a,0xf0,0x05,0x9d,0x1d,0xbe,0x8b,0x7f,0x34, + 0x63,0xe7,0x87,0x04,0x25,0x5a,0xff,0xc9,0xca,0xa9,0xab,0xd5,0xf2,0x16,0xf6,0x26,0x5d,0xf9,0xf9,0xbf,0xb4,0xce,0x86,0x55, + 0xd4,0x95,0x91,0x1e,0x12,0x25,0x36,0x43,0x37,0x6e,0x93,0x14,0xf0,0x86,0xad,0xc6,0x7d,0x07,0x86,0xe5,0x18,0x4f,0x3d,0xe3, + 0x92,0x67,0x7b,0x74,0xbf,0xa9,0x71,0x5a,0x49,0xcf,0xf5,0x60,0xf4,0x09,0x65,0x38,0xfd,0x13,0xe2,0x03,0x8a,0x84,0x17,0xc7, + 0x83,0x7a,0xd5,0x42,0x95,0x47,0xd8,0x9d,0x76,0x52,0xb5,0xbc,0x11,0x63,0x78,0x53,0x66,0x0e,0x95,0xc8,0xd4,0xfa,0x6e,0x3d, + 0x3b,0x1b,0x56,0xf2,0x98,0xc3,0x4c,0xc8,0xdc,0x1f,0x7e,0xa3,0x8b,0x1a,0x3b,0xa6,0x4d,0xed,0x70,0x75,0x55,0xcd,0x0c,0xf9, + 0x4e,0xfb,0xa6,0x84,0xcb,0xbc,0xf5,0x28,0x89,0x2e,0x30,0x07,0x8f,0x1d,0x8d,0x10,0x03,0x20,0xe9,0xb0,0x56,0x53,0x9d,0xf9, + 0x43,0xfb,0xba,0xb7,0x25,0x5d,0xa1,0x82,0x0d,0xe8,0x30,0x82,0x03,0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09, + 0x06,0x31,0x82,0x03,0x0d,0x30,0x82,0x03,0x09,0x02,0x01,0x01,0x30,0x77,0x30,0x63,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04, + 0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74, + 0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x3b,0x30,0x39,0x06,0x03,0x55,0x04,0x03,0x13,0x32,0x44,0x69,0x67,0x69,0x43,0x65,0x72, + 0x74,0x20,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x47,0x34,0x20,0x52,0x53,0x41,0x34,0x30,0x39,0x36,0x20,0x53,0x48,0x41, + 0x32,0x35,0x36,0x20,0x54,0x69,0x6d,0x65,0x53,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x20,0x43,0x41,0x02,0x10,0x0c,0x4d,0x69, + 0x72,0x4b,0x94,0xfa,0x3c,0x2a,0x4a,0x3d,0x29,0x07,0x80,0x3d,0x5a,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04, + 0x02,0x01,0x05,0x00,0xa0,0x69,0x30,0x18,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0b,0x06,0x09,0x2a, + 0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0x30,0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x05,0x31,0x0f,0x17, + 0x0d,0x32,0x32,0x30,0x39,0x33,0x30,0x31,0x37,0x35,0x33,0x34,0x33,0x5a,0x30,0x2f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d, + 0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xbf,0x5c,0x03,0xc6,0x50,0xb0,0xde,0xd1,0x96,0x6d,0x74,0x64,0xa4,0xda,0x0f,0x51,0x71, + 0x0f,0x5a,0x87,0x97,0x78,0x2e,0x17,0x99,0xc6,0xa2,0x7b,0xa7,0x9b,0x75,0xeb,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7, + 0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x02,0x00,0x0e,0xb2,0xbf,0xf0,0xf2,0x35,0x55,0xc7,0x9d,0x49,0xce,0x0a,0xac,0x3a, + 0x6a,0xd8,0x85,0xa0,0x2b,0x81,0x97,0x85,0xc2,0x16,0x4d,0x6d,0x77,0x72,0xdf,0x2e,0x0a,0x6b,0x2e,0xbd,0xd6,0xb4,0x66,0x22, + 0x7b,0x43,0x1b,0x7e,0x7a,0x1b,0xdb,0x72,0xfb,0x1d,0xd5,0xe9,0x84,0x01,0xe1,0x64,0x15,0x05,0x0d,0xb5,0x85,0x1d,0x93,0xf0, + 0xcf,0x72,0x77,0x07,0x30,0x82,0xa9,0x6e,0x9c,0x5d,0xc9,0x39,0xda,0x19,0x9b,0xca,0x34,0x05,0xf0,0xe4,0xd7,0x02,0xbe,0x8a, + 0x5f,0x74,0x39,0xe6,0xe9,0xb4,0xdf,0x00,0x4a,0xeb,0xb4,0x0d,0xf6,0xb2,0x5b,0x7f,0x10,0xb1,0xef,0x05,0x53,0xfc,0x74,0x41, + 0x5b,0x83,0xeb,0xf9,0x37,0x9f,0x03,0xc2,0x1a,0x98,0x13,0xc9,0x6c,0x1c,0xd8,0x82,0xd8,0xd7,0xbf,0x13,0x07,0x20,0xf9,0xf2, + 0xea,0x96,0x46,0xb7,0x2d,0x51,0x2f,0xc3,0x40,0x12,0x3f,0x35,0xeb,0x88,0xfa,0x3c,0x66,0x30,0xd9,0x16,0xe2,0x4b,0x05,0x14, + 0x11,0x07,0x9a,0x64,0xc5,0x92,0x01,0xec,0xdb,0x5d,0x01,0x91,0x08,0x4f,0x1e,0xec,0x12,0xdd,0x7d,0xa0,0x32,0x5a,0x84,0x2a, + 0x7c,0xb9,0x25,0x34,0x57,0x12,0x0c,0x86,0x2d,0xcd,0x01,0x26,0x85,0x17,0x8c,0x7d,0x07,0x3f,0x2c,0x08,0xb6,0xac,0xc3,0xca, + 0x72,0x17,0xfe,0x4c,0xef,0xbb,0x69,0x20,0x11,0x33,0x63,0xf8,0xca,0x0a,0xe1,0x8c,0xf5,0x31,0x4e,0x83,0x87,0xfb,0xa9,0xd2, + 0x29,0x4b,0x82,0x84,0x27,0xfa,0x01,0x31,0x48,0xc1,0x25,0xe5,0x51,0x49,0xf5,0x52,0x60,0xdb,0x64,0x08,0x36,0xd2,0x2f,0x4e, + 0x7a,0x5d,0x92,0xee,0x06,0xec,0xe4,0x3b,0x5d,0xdc,0xc3,0x49,0xa1,0x8e,0x96,0xa6,0x17,0x00,0x2d,0x0d,0xee,0x6e,0x88,0x16, + 0x1e,0xea,0x9c,0x9b,0x55,0x9d,0xea,0x4a,0xa5,0xbb,0x54,0x33,0xaa,0x72,0x8c,0x5f,0xb7,0xe6,0x22,0xe9,0x1d,0xca,0xbc,0x6d, + 0xdf,0x7b,0x68,0xb5,0x71,0x3b,0x9f,0xfd,0x2b,0x53,0x35,0xa6,0xbb,0x78,0xf2,0x5a,0x41,0x69,0x52,0x5c,0x47,0xdc,0xf0,0x3e, + 0x06,0xef,0x60,0xb6,0xd3,0xb1,0x30,0xda,0x41,0xee,0x5a,0x2e,0x8e,0x24,0x0e,0x1e,0xcd,0x6c,0xa6,0x2e,0x9b,0x3c,0x77,0x02, + 0x21,0x86,0x16,0x68,0xfc,0xd6,0x64,0x84,0x46,0x1e,0xd1,0xe6,0x86,0x6f,0xee,0x5f,0x5c,0xca,0xb6,0xc9,0x9b,0xb8,0x03,0x46, + 0x1b,0x67,0x52,0x48,0x48,0x1c,0x07,0xad,0xbd,0x3c,0x2f,0x1b,0xd1,0xe3,0xb5,0xba,0x21,0x20,0x3b,0x6d,0xfb,0x30,0xa6,0x6d, + 0x2d,0xd7,0xb0,0x67,0xa4,0x19,0x0f,0x38,0xff,0xb0,0xad,0xf0,0xc3,0xb3,0xd7,0x7c,0x92,0xa0,0xe8,0x9c,0x22,0x60,0x0f,0x88, + 0x08,0xa7,0xf0,0xfa,0x90,0x45,0x2c,0x26,0xa6,0x88,0x25,0x24,0x7b,0x69,0x23,0x0b,0x20,0x04,0x89,0xd4,0x66,0x89,0x7d,0xb6, + 0x50,0x0e,0xb3,0xfe,0xf9,0xd0,0x91,0x2b,0x1d,0x17,0x62,0x6d,0xad,0x8e,0xf9,0x52,0x63,0x8f,0xe9,0x93,0xe6,0xea,0xb8,0xe6, + 0xce,0x0c,0x69,0xc9,0x47,0xd7,0x7e,0xb4,0x0d,0x49,0xbe,0xcb,0x05,0xe4,0xac,0x0b,0xd4,0xa1,0x6b,0x66,0x0f,0xff,0xe7,0x01, + 0x5a,0x91,0x05,0xa8,0xc0,0x2b,0xda,0xe9,0x5c,0x18,0xfb,0xe3,0x4d,0x60,0x0f,0x34,0x19,0x68,0x30,0x82,0x0a,0xc4,0x06,0x0a, + 0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x04,0x01,0x31,0x82,0x0a,0xb4,0x30,0x82,0x05,0x56,0x06,0x09,0x2a,0x86,0x48,0x86, + 0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x05,0x47,0x30,0x82,0x05,0x43,0x02,0x01,0x01,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86, + 0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x5c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0xa0, + 0x4e,0x30,0x4c,0x30,0x17,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0f,0x30,0x09,0x03,0x01,0x00,0xa0,0x04, + 0xa2,0x02,0x80,0x00,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0xdd, + 0x8b,0xd7,0x29,0x3b,0xae,0x16,0xec,0xbb,0x81,0x80,0x55,0x15,0xd8,0x87,0xa5,0x3e,0xeb,0x0b,0x74,0x59,0xb6,0x56,0xf1,0x0b, + 0x2e,0xe1,0xb4,0x42,0x4d,0x8b,0x18,0xa0,0x82,0x03,0x05,0x30,0x82,0x03,0x01,0x30,0x82,0x01,0xe9,0xa0,0x03,0x02,0x01,0x02, + 0x02,0x10,0x8d,0x01,0xec,0xa9,0x68,0x41,0x93,0x8f,0x40,0x42,0x93,0x4a,0x72,0x6b,0x03,0xcc,0x30,0x0d,0x06,0x09,0x2a,0x86, + 0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x03,0x13,0x07,0x54,0x65, + 0x73,0x74,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x32,0x32,0x30,0x39,0x33,0x30,0x31,0x37,0x32,0x34,0x31,0x39,0x5a,0x17,0x0d, + 0x33,0x39,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03, + 0x13,0x05,0x63,0x65,0x72,0x74,0x33,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01, + 0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xf4,0x21,0x90,0xec,0x4a,0x19,0xca,0xa7, + 0x1f,0x25,0x80,0x0b,0x92,0x21,0x2d,0x53,0xb4,0x25,0xa3,0x37,0x40,0xae,0xce,0xf1,0x46,0xf6,0xda,0x21,0xd3,0x54,0x8e,0x02, + 0x95,0xfe,0x37,0x3a,0xff,0xb9,0x36,0x88,0x70,0xf2,0x33,0x0c,0x5c,0x60,0x36,0xbf,0x8d,0x51,0xef,0x18,0x5d,0x47,0x68,0xbc, + 0xda,0xd8,0xf8,0x94,0xaf,0xcf,0xa6,0x48,0x61,0x78,0x04,0xcd,0x73,0x03,0xa0,0x6c,0xdb,0x24,0x94,0x20,0x54,0xbb,0x19,0xf2, + 0xb6,0xf9,0x0d,0xf4,0x31,0xbd,0x79,0xb5,0x98,0x12,0xc4,0x62,0x06,0xfb,0x16,0x08,0x51,0xa2,0xbf,0x12,0xcf,0x88,0xf4,0x4c, + 0x26,0xec,0x80,0xc7,0xa7,0xeb,0x89,0x24,0x6a,0xe4,0x1e,0x3a,0x1d,0x4a,0x7c,0x42,0xaa,0x03,0x5e,0x47,0xde,0x21,0xc4,0x06, + 0x86,0x57,0x0d,0xce,0xe0,0x27,0xf2,0x43,0x56,0x2a,0x60,0x1b,0x18,0xf5,0x03,0x91,0xa4,0xda,0x86,0x1c,0xcb,0x2c,0x2d,0x21, + 0x54,0xc5,0xd8,0xe2,0xe2,0x02,0x19,0xb0,0x73,0xe0,0xf8,0x95,0x5c,0x4f,0x1d,0x8f,0xd2,0xe0,0x4a,0x7c,0x20,0x9e,0x29,0xec, + 0x05,0x34,0xb0,0x4c,0x1a,0xaf,0x2a,0x01,0xf1,0x0f,0x26,0xdc,0x38,0x68,0x85,0xbd,0xc0,0x73,0xec,0x10,0x17,0x3a,0xd8,0x6d, + 0x33,0x3b,0xab,0xd3,0x79,0x61,0x2c,0xac,0x11,0xe1,0x09,0x5e,0xe0,0x7b,0xd3,0xc0,0xb8,0xf8,0xb5,0x9a,0x20,0x68,0xa7,0xf0, + 0x66,0x9b,0xc2,0xe8,0x83,0x14,0x7d,0x3c,0x7f,0x7a,0x85,0x95,0xc9,0x05,0x74,0xf4,0xee,0xa9,0x83,0x6a,0x55,0xa5,0x78,0xa8, + 0xa8,0xb4,0x6d,0xb1,0xab,0x49,0x50,0xd1,0x02,0x03,0x01,0x00,0x01,0xa3,0x55,0x30,0x53,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13, + 0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x43,0x06,0x03,0x55,0x1d,0x01,0x04,0x3c,0x30,0x3a,0x80,0x10,0x88,0x17,0xf7,0x38, + 0x65,0x8b,0x78,0x78,0xf6,0x77,0xe3,0x25,0x47,0x54,0x33,0x4c,0xa1,0x14,0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04, + 0x03,0x13,0x07,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x82,0x10,0x2b,0x59,0xb4,0xc7,0xe2,0xce,0x08,0x97,0x46,0x48,0x32,0x17, + 0x0f,0x97,0xc5,0x08,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x01,0x01,0x00, + 0x8e,0xe0,0xc9,0x58,0x24,0x1b,0x16,0x6a,0x8a,0x4f,0x67,0xac,0xd7,0x75,0x62,0x53,0x94,0xfc,0xeb,0x8b,0x36,0x2a,0x9f,0x9c, + 0x8b,0x8f,0x60,0x42,0xdd,0x37,0x13,0x10,0x5f,0x5a,0x52,0xc8,0xee,0x51,0x92,0x18,0xaf,0x84,0x18,0x5f,0x27,0x69,0xf4,0xde, + 0x22,0x4b,0x9c,0xaa,0x18,0x9e,0xde,0x04,0xc0,0xc4,0xfd,0x74,0x08,0x25,0x43,0xbf,0x00,0x1d,0xc2,0xd6,0xb2,0x4e,0xa4,0x4a, + 0x73,0xa1,0xff,0x71,0x3d,0xa5,0xf1,0x21,0xcf,0x4d,0xb4,0x5c,0x55,0x54,0x6f,0x94,0x50,0x21,0xbb,0x85,0xcb,0x54,0xeb,0x07, + 0xaf,0x74,0x62,0x21,0xf5,0x89,0x43,0xcb,0x10,0x62,0xd6,0xbe,0xc0,0x3a,0xb3,0x6b,0x9f,0x80,0xde,0xe0,0xc0,0x6e,0x8a,0x0a, + 0xe7,0x1f,0x08,0x9b,0x89,0x38,0xc2,0x30,0xfa,0xd9,0xc2,0x8c,0xf7,0xbd,0xbd,0xd4,0x6b,0x99,0xbd,0x5f,0x0e,0xb1,0x76,0xd6, + 0x5b,0x1f,0x1a,0xd7,0x27,0x5d,0x5b,0x19,0x1c,0x6d,0x5a,0x91,0x81,0x06,0x83,0x82,0x6d,0xaf,0x48,0x70,0x72,0x8b,0x7c,0x8e, + 0x57,0xcd,0x35,0x5d,0x7d,0x96,0xe5,0x2d,0x31,0xd2,0xa9,0xf8,0xad,0x9d,0x13,0xb4,0x89,0x75,0x7e,0xbc,0x39,0x11,0x27,0x9d, + 0xc3,0x7b,0xf1,0x40,0x2a,0x23,0xed,0x50,0xee,0x10,0x1b,0x97,0x13,0x71,0x1c,0x5a,0x7f,0x06,0xab,0x9b,0x51,0x2b,0x1f,0x85, + 0x27,0x99,0x11,0x18,0x62,0x97,0xcb,0x08,0x24,0x6d,0xf5,0x08,0x56,0xb5,0x36,0x00,0xf3,0x6b,0x3d,0xa9,0x13,0xd3,0xcf,0x0c, + 0x94,0x6f,0x9e,0x05,0x62,0xeb,0x9c,0x52,0x9d,0x0c,0x15,0x81,0x4d,0x7d,0xe3,0x2f,0x31,0x82,0x01,0xc4,0x30,0x82,0x01,0xc0, + 0x02,0x01,0x01,0x30,0x26,0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x03,0x13,0x07,0x54,0x65,0x73,0x74,0x20,0x43, + 0x41,0x02,0x10,0x8d,0x01,0xec,0xa9,0x68,0x41,0x93,0x8f,0x40,0x42,0x93,0x4a,0x72,0x6b,0x03,0xcc,0x30,0x0d,0x06,0x09,0x60, + 0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x71,0x30,0x10,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02, + 0x01,0x0c,0x31,0x02,0x30,0x00,0x30,0x11,0x06,0x0a,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x19,0x04,0x31,0x03,0x02,0x01, + 0x02,0x30,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82, + 0x37,0x02,0x01,0x04,0x30,0x2f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xcb,0xa1,0x2f, + 0x7b,0x0f,0x6a,0x14,0x06,0x26,0x77,0x7b,0xee,0xd1,0x90,0x34,0x1c,0xa7,0xcd,0x94,0x65,0xe0,0xe4,0x24,0x12,0x0c,0x4e,0xa2, + 0x89,0xeb,0x2d,0xe5,0xbb,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x01,0x00, + 0x68,0xfc,0x34,0xac,0x24,0xe1,0x93,0x00,0xec,0x8d,0x29,0xe1,0x32,0x03,0xe6,0x8a,0xd6,0x39,0x79,0x07,0x85,0x97,0xf4,0xb8, + 0x0c,0xf1,0x24,0xa0,0x16,0x09,0x0c,0xf8,0x02,0x40,0x94,0xdb,0x19,0x7a,0x6f,0x91,0xee,0x24,0x36,0x77,0x32,0x02,0xb5,0xd1, + 0xf9,0xe0,0xa2,0xdd,0xe0,0xe1,0x14,0x30,0x11,0xe1,0x25,0x02,0x0a,0x7c,0x10,0xdb,0xbd,0xb0,0x4e,0xbb,0x36,0xef,0x87,0xf0, + 0x17,0x49,0x77,0x45,0xa0,0x9e,0x47,0x70,0x1a,0xe2,0x87,0x39,0x41,0x24,0x1c,0xe0,0x09,0xb0,0xe0,0xfa,0xc5,0xf3,0xba,0xba, + 0x03,0x65,0x64,0xf9,0xa8,0x7d,0xe5,0x0e,0x84,0xc8,0xd1,0xe2,0xf5,0x44,0xa4,0x6f,0x33,0xac,0xbb,0x15,0x3b,0x0a,0x1a,0x04, + 0x6e,0xc2,0x54,0xa7,0x78,0x77,0x7d,0x32,0x21,0x4d,0x0c,0x3f,0x7b,0x0a,0x61,0x18,0x58,0xdb,0x59,0x02,0x3f,0xcf,0xb2,0xd0, + 0x5c,0xa5,0xea,0x96,0xd4,0x5c,0xd2,0x09,0xd3,0x18,0x61,0x73,0x6e,0x9f,0xdf,0xcb,0x17,0x4f,0xd1,0xc0,0xa2,0x2d,0x8b,0xf5, + 0x46,0xdf,0xf8,0xb8,0x4f,0x47,0x98,0xf4,0x44,0xa6,0xa1,0x5b,0xcb,0xfa,0xc1,0x31,0x4e,0xc4,0x03,0xea,0x06,0x1b,0x9b,0x94, + 0xa6,0xc8,0x1c,0x7a,0x69,0x3b,0x8d,0x8d,0x83,0x20,0x56,0x18,0xf1,0xe0,0xd2,0xfb,0xbc,0xaf,0xf7,0xdc,0x17,0x3b,0xcd,0xac, + 0x2b,0x07,0x86,0xc6,0x7f,0x25,0xc3,0xa2,0x6c,0x7c,0x49,0xa9,0xc1,0xe2,0x5e,0x40,0x05,0xfb,0x2f,0xab,0xd5,0x98,0x3a,0x69, + 0xbb,0x83,0x1c,0xbd,0xde,0x55,0xc0,0x74,0x71,0x8d,0xdb,0xc7,0x95,0xf4,0xf5,0xca,0x30,0x82,0x05,0x56,0x06,0x09,0x2a,0x86, + 0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x05,0x47,0x30,0x82,0x05,0x43,0x02,0x01,0x01,0x31,0x0f,0x30,0x0d,0x06,0x09, + 0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x5c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01, + 0x04,0xa0,0x4e,0x30,0x4c,0x30,0x17,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0f,0x30,0x09,0x03,0x01,0x00, + 0xa0,0x04,0xa2,0x02,0x80,0x00,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04, + 0x20,0xdd,0x8b,0xd7,0x29,0x3b,0xae,0x16,0xec,0xbb,0x81,0x80,0x55,0x15,0xd8,0x87,0xa5,0x3e,0xeb,0x0b,0x74,0x59,0xb6,0x56, + 0xf1,0x0b,0x2e,0xe1,0xb4,0x42,0x4d,0x8b,0x18,0xa0,0x82,0x03,0x05,0x30,0x82,0x03,0x01,0x30,0x82,0x01,0xe9,0xa0,0x03,0x02, + 0x01,0x02,0x02,0x10,0xae,0xfb,0x3e,0x08,0x15,0xa4,0xe3,0xa7,0x4d,0x91,0x6a,0x85,0x68,0x5b,0x58,0xa1,0x30,0x0d,0x06,0x09, + 0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x03,0x13,0x07, + 0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x32,0x32,0x30,0x39,0x33,0x30,0x31,0x37,0x32,0x33,0x30,0x33,0x5a, + 0x17,0x0d,0x33,0x39,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55, + 0x04,0x03,0x13,0x05,0x63,0x65,0x72,0x74,0x32,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, + 0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xca,0x01,0x2f,0x98,0x69,0x71, + 0x64,0x63,0x56,0x38,0xd7,0xc4,0xad,0x64,0x02,0x34,0xd4,0x31,0xc2,0x27,0x5d,0xd7,0x8f,0x72,0xd0,0x70,0x95,0xd9,0x75,0x65, + 0x2e,0x8c,0x5b,0x76,0xcd,0x54,0x3f,0xd9,0x0a,0xcc,0x3f,0x03,0x8f,0x74,0x2b,0x8c,0x3d,0x3d,0x4c,0xd3,0xaa,0x3c,0x97,0xf1, + 0x44,0x46,0x57,0x92,0xa9,0xdd,0xd9,0xf0,0xc7,0x8b,0x39,0xf5,0x8d,0x28,0x41,0x18,0xaf,0xca,0x99,0xd1,0xf1,0xe4,0xab,0x93, + 0x0a,0xb6,0xd4,0xad,0x2b,0x9f,0x60,0x27,0x4c,0xf2,0xc9,0x14,0xde,0xf2,0xc6,0xbe,0x82,0x14,0x83,0x65,0x13,0x9f,0x9c,0x8d, + 0xfa,0xac,0x95,0x12,0x00,0xd0,0xa4,0x36,0x4d,0xf0,0x8f,0xfc,0x1a,0x43,0x47,0xc3,0xff,0xce,0x1b,0x24,0xd6,0xcf,0x63,0xd1, + 0x41,0x23,0xb8,0x62,0x5f,0x31,0x4e,0x30,0x3f,0x63,0x64,0xff,0x72,0xb5,0x9d,0xe5,0xaa,0x22,0xbc,0x1d,0xb3,0x23,0xc9,0x16, + 0x49,0x10,0xed,0x51,0x02,0xd2,0x90,0xc6,0x86,0x47,0x40,0x7e,0xf1,0xcf,0xc1,0x17,0xa0,0x72,0xaf,0x40,0xb1,0x23,0x3d,0x5a, + 0xa1,0xf9,0xed,0xc8,0xb6,0x66,0xa7,0x94,0x39,0x09,0x03,0x6d,0x16,0x4e,0xc4,0x2a,0x4b,0x1f,0x5b,0x22,0x39,0xf7,0x60,0x1c, + 0x71,0x65,0x4c,0x11,0x29,0x59,0x96,0x5e,0x9e,0xfe,0xaf,0x23,0xd1,0xe3,0x2c,0xce,0xd2,0x31,0x8c,0x80,0x29,0x6c,0x82,0x99, + 0xe8,0x68,0xbd,0x7e,0x66,0xaa,0x35,0x0c,0xae,0x61,0xde,0x59,0x7d,0x5b,0x16,0x09,0x07,0x52,0x6a,0x14,0x26,0x3c,0x48,0x3e, + 0x03,0xdb,0xd4,0x8a,0xea,0x0e,0x46,0x1a,0x24,0xbd,0x02,0x03,0x01,0x00,0x01,0xa3,0x55,0x30,0x53,0x30,0x0c,0x06,0x03,0x55, + 0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x43,0x06,0x03,0x55,0x1d,0x01,0x04,0x3c,0x30,0x3a,0x80,0x10,0x88,0x17, + 0xf7,0x38,0x65,0x8b,0x78,0x78,0xf6,0x77,0xe3,0x25,0x47,0x54,0x33,0x4c,0xa1,0x14,0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03, + 0x55,0x04,0x03,0x13,0x07,0x54,0x65,0x73,0x74,0x20,0x43,0x41,0x82,0x10,0x2b,0x59,0xb4,0xc7,0xe2,0xce,0x08,0x97,0x46,0x48, + 0x32,0x17,0x0f,0x97,0xc5,0x08,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x01, + 0x01,0x00,0xd1,0x0d,0xdd,0x83,0x0c,0xd8,0xf9,0x0c,0x71,0xe3,0x2f,0x7c,0xc9,0xd7,0x8e,0x33,0x27,0xb6,0x6b,0x34,0x3c,0x41, + 0xf0,0x13,0x03,0xd6,0x5a,0xe2,0x55,0x12,0x42,0x06,0x20,0x03,0xb1,0x74,0xc7,0xc0,0x08,0x00,0x21,0xbe,0x90,0xe7,0xfd,0xac, + 0xe0,0x67,0x42,0xe7,0x53,0x86,0xcf,0x53,0x55,0x40,0xf1,0xbc,0xfc,0x87,0xab,0x67,0xb6,0x09,0xe1,0xf1,0xa2,0xce,0xf6,0xbf, + 0xe6,0x1d,0x43,0x4f,0x41,0xf0,0xf5,0xc0,0xfa,0xc5,0xd2,0x14,0x2d,0xd9,0x23,0x8e,0x9c,0xeb,0x68,0xff,0x3c,0x5f,0x18,0xca, + 0x4b,0x09,0xad,0xcd,0xbd,0x23,0x62,0x33,0x4e,0x02,0x10,0xf9,0xe3,0x68,0x6f,0x22,0xb0,0x86,0x0b,0x5a,0xbe,0xd3,0xee,0x8a, + 0x0b,0x4c,0x92,0x9e,0x06,0x31,0x1f,0x95,0x4f,0xbf,0x27,0x7f,0x1f,0xcd,0xcc,0x9c,0x70,0xa1,0x51,0x07,0x7a,0x09,0x36,0x3f, + 0x0a,0x2f,0x16,0x77,0x26,0x9b,0xb4,0xc9,0x1e,0x86,0xe3,0xb3,0xb7,0xc3,0xcc,0xf1,0x44,0x6e,0x2e,0xf4,0xc9,0x5b,0x23,0x08, + 0x0a,0xc0,0xdb,0xc1,0x1a,0x37,0xb3,0xb1,0x91,0xce,0x24,0x26,0x56,0x7f,0x26,0x37,0x88,0xa0,0x02,0x37,0x6e,0x9c,0xca,0xc1, + 0x8c,0x19,0x99,0xca,0x6c,0x9a,0x98,0x75,0x89,0xfc,0x6d,0x92,0xfc,0xb5,0x12,0x5b,0x29,0xb1,0x88,0x68,0x3b,0xef,0xf0,0xc0, + 0x8f,0x82,0x5e,0x33,0xf9,0x67,0x6b,0xe8,0x60,0x1b,0x14,0xec,0x9c,0xdf,0x21,0x38,0xbb,0x0d,0x3f,0xd9,0xbc,0xd2,0x01,0x2a, + 0x92,0x0c,0xc2,0x97,0x2e,0x12,0x22,0x54,0x76,0xeb,0x80,0x51,0x99,0x9d,0x0f,0x26,0x12,0xb7,0x31,0x82,0x01,0xc4,0x30,0x82, + 0x01,0xc0,0x02,0x01,0x01,0x30,0x26,0x30,0x12,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x03,0x13,0x07,0x54,0x65,0x73,0x74, + 0x20,0x43,0x41,0x02,0x10,0xae,0xfb,0x3e,0x08,0x15,0xa4,0xe3,0xa7,0x4d,0x91,0x6a,0x85,0x68,0x5b,0x58,0xa1,0x30,0x0d,0x06, + 0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x71,0x30,0x10,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82, + 0x37,0x02,0x01,0x0c,0x31,0x02,0x30,0x00,0x30,0x11,0x06,0x0a,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x19,0x04,0x31,0x03, + 0x02,0x01,0x01,0x30,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04, + 0x01,0x82,0x37,0x02,0x01,0x04,0x30,0x2f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xcb, + 0xa1,0x2f,0x7b,0x0f,0x6a,0x14,0x06,0x26,0x77,0x7b,0xee,0xd1,0x90,0x34,0x1c,0xa7,0xcd,0x94,0x65,0xe0,0xe4,0x24,0x12,0x0c, + 0x4e,0xa2,0x89,0xeb,0x2d,0xe5,0xbb,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82, + 0x01,0x00,0x26,0x76,0xb3,0xf2,0xc9,0xb1,0x73,0x13,0xb5,0xd2,0xc5,0xb7,0x01,0x5c,0xc6,0x94,0x38,0x9f,0xc7,0x57,0x56,0x95, + 0xb0,0xf4,0x6d,0xc2,0xd4,0x6a,0xf1,0x4d,0x09,0xa1,0x51,0xa6,0x91,0xf0,0x0e,0x84,0xc0,0x2c,0x74,0xa3,0x97,0x1f,0x41,0xe0, + 0x4a,0xfa,0x1a,0x78,0xa9,0xd5,0x3c,0x85,0x29,0x2b,0xaf,0xbb,0xc3,0x61,0x0d,0x50,0x20,0x20,0xf5,0x80,0x0d,0x6a,0x15,0x4b, + 0x38,0x6c,0x55,0xd9,0xf9,0xd0,0x44,0x22,0x46,0x98,0xe6,0x07,0xd4,0xba,0x3d,0x9d,0x50,0xa7,0x8e,0x1f,0xa8,0x82,0x25,0x7e, + 0x39,0xda,0xe1,0x49,0xc7,0x24,0x3f,0x31,0xfb,0x4b,0xba,0x75,0xdb,0x10,0x0a,0xbe,0xc5,0xad,0x3e,0x30,0x16,0x9b,0x15,0xbb, + 0xc0,0x59,0xf2,0xf5,0x4f,0xf5,0x56,0xc6,0x28,0xd0,0x1e,0x7d,0x8f,0x2e,0x2b,0xb6,0x76,0x94,0x52,0x87,0x99,0xa3,0x66,0x3d, + 0x94,0x0d,0x73,0xb0,0xd5,0xd4,0x76,0x5b,0x69,0x95,0x0a,0x16,0x4f,0x5c,0xf4,0x95,0x5b,0x42,0x45,0x04,0x5c,0x53,0xb7,0x1a, + 0x61,0x6c,0x82,0xdc,0x95,0x94,0x38,0x64,0x34,0x01,0x98,0x2e,0xf8,0xcf,0xf8,0x66,0xae,0xba,0xf8,0x70,0x9e,0x9e,0xde,0xa2, + 0x7f,0x56,0x8d,0xd9,0x6a,0x7b,0x41,0x02,0x46,0x05,0x5c,0xba,0xed,0x43,0x98,0x56,0x39,0x52,0xc0,0x0b,0x3c,0xe1,0x7d,0x1b, + 0xf5,0xac,0x03,0x5b,0xbb,0x7a,0x65,0x80,0x4b,0xcb,0xb7,0x51,0xa7,0x19,0x8a,0x38,0x75,0x76,0x75,0xc2,0x1f,0x12,0xc4,0x68, + 0x96,0xe0,0x89,0x9f,0x37,0x3d,0xab,0xfd,0x6b,0x03,0xb3,0xa1,0x51,0xf8,0x69,0x17,0xea,0xff,0x00,0x00,0x00,0x00,0x00,0x00, +}; + static void call_winverify(WCHAR *pathW, LONG *status, BOOL hash_only) { static GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2; @@ -1312,6 +1782,116 @@ static void test_get_known_usages(void) "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError()); } +static void test_multiple_signatures(void) +{ + static const BYTE serials[][16] = + { + { 0xfa, 0x4b, 0x40, 0x69, 0x40, 0x4b, 0xc0, 0x44, 0xa2, 0x31, 0x3a, 0xa7, 0xaa, 0x97, 0x73, 0xd1, }, + { 0xcc, 0x03, 0x6b, 0x72, 0x4a, 0x93, 0x42, 0x40, 0x8f, 0x93, 0x41, 0x68, 0xa9, 0xec, 0x01, 0x8d, }, + { 0xa1, 0x58, 0x5b, 0x68, 0x85, 0x6a, 0x91, 0x4d, 0xa7, 0xe3, 0xa4, 0x15, 0x08, 0x3e, 0xfb, 0xae, }, + }; + static GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2; + WINTRUST_SIGNATURE_SETTINGS settings = { sizeof(settings) }; + WINTRUST_FILE_INFO file_info = { sizeof(file_info) }; + WINTRUST_DATA data = { sizeof(data) }; + CRYPT_PROVIDER_DATA *prov; + WCHAR pathW[MAX_PATH]; + CERT_INFO *cert_info; + unsigned int i; + BYTE buf[4096]; + DWORD written; + LONG status; + HANDLE file; + DWORD size; + BOOL bret; + + file = create_temp_file(pathW); + ok(file != INVALID_HANDLE_VALUE, "Failed to create temporary file.\n"); + bret = WriteFile(file, self_signed_3certs, sizeof(self_signed_3certs), &written, NULL); + ok(bret, "Failed, err %lu.\n", GetLastError()); + CloseHandle(file); + + file_info.pcwszFilePath = pathW; + data.dwUIChoice = WTD_UI_NONE; + data.fdwRevocationChecks = WTD_REVOKE_NONE; + data.dwUnionChoice = WTD_CHOICE_FILE; + data.pFile = &file_info; + data.dwStateAction = WTD_STATEACTION_VERIFY; + data.dwProvFlags = 0; + data.pSignatureSettings = &settings; + + settings.cSecondarySigs = 0xcccccccc; + settings.dwVerifiedSigIndex = 0xcccccccc; + status = WinVerifyTrust(NULL, &WVTPolicyGUID, &data); + todo_wine ok(status == CERT_E_UNTRUSTEDROOT || status == CERT_E_CHAINING, "Failed, ret %#lx\n", status); + ok(settings.cSecondarySigs == 0xcccccccc, "Got %lu.\n", settings.cSecondarySigs); + todo_wine ok(settings.dwVerifiedSigIndex == 2, "Got %lu.\n", settings.dwVerifiedSigIndex); + + prov = (CRYPT_PROVIDER_DATA *)data.hWVTStateData; + ok(prov->cbStruct == sizeof(*prov), "Got size %lu.\n", prov->cbStruct); + ok(prov->csSigners == 1, "Got %lu.\n", prov->csSigners); + ok(prov->pSigSettings == &settings, "Got %p, expected %p.\n", prov->pSigSettings, &settings); + ok(!!prov->pSigState, "Got %p, expected %p.\n", prov->pSigSettings, &settings); + if (prov->cbStruct == sizeof(*prov) && prov->pSigState) + { + ok(prov->pSigState->cbStruct == sizeof(*prov->pSigState) + || broken(prov->pSigState->cbStruct == offsetof(CRYPT_PROVIDER_SIGSTATE, iAttemptCount)) /* Win7 */, + "Got %lu.\n", prov->pSigState->cbStruct); + ok(prov->pSigState->fSupportMultiSig, "Got %d.\n", prov->pSigState->fSupportMultiSig); + ok(prov->pSigState->dwCryptoPolicySupport == (WSS_SIGTRUST_SUPPORT | WSS_OBJTRUST_SUPPORT + | WSS_CERTTRUST_SUPPORT), "Got %#lx.\n", prov->pSigState->dwCryptoPolicySupport); + ok(prov->pSigState->cSecondarySigs == 2, "Got %lu.\n", prov->pSigState->cSecondarySigs); + + size = sizeof(buf); + bret = CryptMsgGetParam(prov->pSigState->hPrimarySig, CMSG_SIGNER_CERT_INFO_PARAM, 0, buf, &size); + ok(bret, "Failed, err %#lx.\n", GetLastError()); + cert_info = (CERT_INFO *)buf; + ok(cert_info->SerialNumber.cbData == sizeof(serials[0]), "Got %lu.\n", cert_info->SerialNumber.cbData); + ok(!memcmp(cert_info->SerialNumber.pbData, serials[0], sizeof(serials[0])), "Data does not match.\n"); + for (i = 0; i < prov->pSigState->cSecondarySigs; ++i) + { + bret = CryptMsgGetParam(prov->pSigState->rhSecondarySigs[i], CMSG_SIGNER_CERT_INFO_PARAM, 0, buf, &size); + ok(bret, "Failed, err %#lx.\n", GetLastError()); + ok(cert_info->SerialNumber.cbData == sizeof(serials[0]), "Got %lu.\n", cert_info->SerialNumber.cbData); + ok(!memcmp(cert_info->SerialNumber.pbData, serials[i + 1], sizeof(serials[0])), "Data does not match.\n"); + } + } + + data.dwStateAction = WTD_STATEACTION_CLOSE; + status = WinVerifyTrust(NULL, &WVTPolicyGUID, &data); + ok(status == S_OK, "Failed, ret %#lx\n", status); + + data.dwStateAction = WTD_STATEACTION_VERIFY; + settings.dwFlags = WSS_GET_SECONDARY_SIG_COUNT; + settings.cSecondarySigs = 0xcccccccc; + settings.dwVerifiedSigIndex = 0xcccccccc; + status = WinVerifyTrust(NULL, &WVTPolicyGUID, &data); + todo_wine ok(status == CERT_E_UNTRUSTEDROOT || status == CERT_E_CHAINING, "Failed, ret %#lx\n", status); + ok(settings.cSecondarySigs == 2, "Got %lu.\n", settings.cSecondarySigs); + todo_wine ok(settings.dwVerifiedSigIndex == 2, "Got %lu.\n", settings.dwVerifiedSigIndex); + + data.dwStateAction = WTD_STATEACTION_CLOSE; + status = WinVerifyTrust(NULL, &WVTPolicyGUID, &data); + ok(status == S_OK, "Failed, ret %#lx\n", status); + + data.dwStateAction = WTD_STATEACTION_VERIFY; + settings.dwFlags = WSS_VERIFY_SPECIFIC | WSS_GET_SECONDARY_SIG_COUNT; + settings.cSecondarySigs = 0xcccccccc; + settings.dwVerifiedSigIndex = 0xcccccccc; + settings.dwIndex = 1; + status = WinVerifyTrust(NULL, &WVTPolicyGUID, &data); + todo_wine ok(status == CERT_E_UNTRUSTEDROOT || status == CERT_E_CHAINING, "Failed, ret %#lx\n", status); + ok(settings.cSecondarySigs == 2, "Got %lu.\n", settings.cSecondarySigs); + todo_wine ok(settings.dwVerifiedSigIndex == 1, "Got %lu.\n", settings.dwVerifiedSigIndex); + settings.dwIndex = 0; + + data.dwStateAction = WTD_STATEACTION_CLOSE; + status = WinVerifyTrust(NULL, &WVTPolicyGUID, &data); + ok(status == S_OK, "Failed, ret %#lx\n", status); + + DeleteFileW(pathW); +} + START_TEST(softpub) { InitFunctionPtrs(); @@ -1320,4 +1900,5 @@ START_TEST(softpub) test_wintrust(); test_wintrust_digest(); test_get_known_usages(); + test_multiple_signatures(); } diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c index 33695008b24..925ae7ca85a 100644 --- wine/dlls/wintrust/wintrust_main.c +++ wine/dlls/wintrust/wintrust_main.c @@ -294,6 +294,10 @@ static LONG WINTRUST_DefaultVerify(HWND hwnd, GUID *actionID, data->hWVTStateData = provData; provData->pWintrustData = data; + + if (WVT_ISINSTRUCT(WINTRUST_DATA, data->cbStruct, pSignatureSettings)) + provData->pSigSettings = data->pSignatureSettings; + if (hwnd == INVALID_HANDLE_VALUE) provData->hWndParent = GetDesktopWindow(); else diff --git a/include/wincrypt.h b/include/wincrypt.h index db2c30c7d68..29735f6225d 100644 --- wine/include/wincrypt.h +++ wine/include/wincrypt.h @@ -21,8 +21,6 @@ #ifndef __WINE_WINCRYPT_H #define __WINE_WINCRYPT_H -#include "wine/winheader_enter.h" - #ifdef __cplusplus extern "C" { #endif @@ -1088,6 +1086,7 @@ typedef struct _CERT_CHAIN_POLICY_STATUS { #define CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG 0x00004000 #define CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG 0x00008000 #define MICROSOFT_ROOT_CERT_CHAIN_POLICY_ENABLE_TEST_ROOT_FLAG 0x00010000 +#define MICROSOFT_ROOT_CERT_CHAIN_POLICY_CHECK_APPLICATION_ROOT_FLAG 0x00020000 typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA { DWORD cbSize; @@ -3353,8 +3352,10 @@ typedef struct _CTL_FIND_SUBJECT_PARA #define CERT_NAME_URL_TYPE 7 #define CERT_NAME_UPN_TYPE 8 -#define CERT_NAME_ISSUER_FLAG 0x00000001 -#define CERT_NAME_DISABLE_IE4_UTF8_FLAG 0x00010000 +#define CERT_NAME_ISSUER_FLAG 0x00000001 +#define CERT_NAME_SEARCH_ALL_NAMES_FLAG 0x00000002 +#define CERT_NAME_DISABLE_IE4_UTF8_FLAG 0x00010000 +#define CERT_NAME_STR_ENABLE_PUNYCODE_FLAG 0x00200000 /* CryptFormatObject flags */ #define CRYPT_FORMAT_STR_MULTI_LINE 0x0001 @@ -4695,6 +4696,4 @@ HRESULT WINAPI FindCertsByIssuer(PCERT_CHAIN pCertChains, DWORD *pcbCertChains, } #endif -#include "wine/winheader_exit.h" - #endif diff --git a/include/wintrust.h b/include/wintrust.h index 28df37c1626..eeb149822b4 100644 --- wine/include/wintrust.h +++ wine/include/wintrust.h @@ -19,8 +19,6 @@ #ifndef __WINE_WINTRUST_H #define __WINE_WINTRUST_H -#include "wine/winheader_enter.h" - #include @@ -477,6 +475,8 @@ CRYPT_PROVIDER_SGNR * WINAPI WTHelperGetProvSignerFromChain( CRYPT_PROVIDER_DATA * WINAPI WTHelperProvDataFromStateData(HANDLE hStateData); CRYPT_PROVIDER_PRIVDATA * WINAPI WTHelperGetProvPrivateDataFromChain(CRYPT_PROVIDER_DATA *,GUID *); +#define szOID_NESTED_SIGNATURE "1.3.6.1.4.1.311.2.4.1" + #define SPC_INDIRECT_DATA_OBJID "1.3.6.1.4.1.311.2.1.4" #define SPC_SP_AGENCY_INFO_OBJID "1.3.6.1.4.1.311.2.1.10" #define SPC_STATEMENT_TYPE_OBJID "1.3.6.1.4.1.311.2.1.11" @@ -664,6 +664,4 @@ typedef struct _WIN_TRUST_SUBJECT_FILE_AND_DISPLAY } #endif -#include "wine/winheader_exit.h" - #endif -- 2.39.2 (Apple Git-144) diff --git a/configure b/configure index 24f958073a0..cdf99fc287d 100755 --- wine/configure +++ wine/configure @@ -950,6 +950,7 @@ enable_amstream enable_apisetschema enable_apphelp enable_appwiz_cpl +enable_atiadlxx enable_api_ms_win_core_psm_appnotify_l1_1_0 enable_api_ms_win_power_base_l1_1_0 enable_atl @@ -21778,6 +21779,7 @@ wine_fn_config_makefile dlls/apisetschema enable_apisetschema wine_fn_config_makefile dlls/apphelp enable_apphelp wine_fn_config_makefile dlls/apphelp/tests enable_tests wine_fn_config_makefile dlls/appwiz.cpl enable_appwiz_cpl +wine_fn_config_makefile dlls/atiadlxx enable_atiadlxx wine_fn_config_makefile dlls/api-ms-win-core-psm-appnotify-l1-1-0 enable_api_ms_win_core_psm_appnotify_l1_1_0 wine_fn_config_makefile dlls/api-ms-win-power-base-l1-1-0 enable_api_ms_win_power_base_l1_1_0 wine_fn_config_makefile dlls/atl enable_atl diff --git a/configure.ac b/configure.ac index 58063421cce..c05d5b6f539 100644 --- wine/configure.ac +++ wine/configure.ac @@ -2424,6 +2424,7 @@ WINE_CONFIG_MAKEFILE(dlls/apisetschema) WINE_CONFIG_MAKEFILE(dlls/apphelp) WINE_CONFIG_MAKEFILE(dlls/apphelp/tests) WINE_CONFIG_MAKEFILE(dlls/appwiz.cpl) +WINE_CONFIG_MAKEFILE(dlls/atiadlxx) WINE_CONFIG_MAKEFILE(dlls/api-ms-win-power-base-l1-1-0) WINE_CONFIG_MAKEFILE(dlls/atl) WINE_CONFIG_MAKEFILE(dlls/atl/tests) diff --git a/dlls/atiadlxx/Makefile.in b/dlls/atiadlxx/Makefile.in new file mode 100644 index 00000000000..fd9b8abf626 --- /dev/null +++ wine/dlls/atiadlxx/Makefile.in @@ -0,0 +1,8 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES +MODULE = atiadlxx.dll +IMPORTS = dxgi + +EXTRADLLFLAGS = -mno-cygwin -Wb,--prefer-native + +C_SRCS = \ + atiadlxx_main.c diff --git a/dlls/atiadlxx/atiadlxx.spec b/dlls/atiadlxx/atiadlxx.spec new file mode 100644 index 00000000000..1e447f38ded --- /dev/null +++ wine/dlls/atiadlxx/atiadlxx.spec @@ -0,0 +1,1138 @@ +@ stub ADL2_ADC_CurrentProfileFromDrv_Get +@ stub ADL2_ADC_Display_AdapterDeviceProfileEx_Get +@ stub ADL2_ADC_DrvDataToProfile_Copy +@ stub ADL2_ADC_FindClosestMode_Get +@ stub ADL2_ADC_IsDevModeEqual_Get +@ stub ADL2_ADC_Profile_Apply +@ stub ADL2_APO_AudioDelayAdjustmentInfo_Get +@ stub ADL2_APO_AudioDelay_Restore +@ stub ADL2_APO_AudioDelay_Set +@ stub ADL2_AdapterLimitation_Caps +@ stub ADL2_AdapterX2_Caps +@ stub ADL2_Adapter_AMDAndNonAMDDIsplayClone_Get +@ stub ADL2_Adapter_ASICFamilyType_Get +@ stub ADL2_Adapter_ASICInfo_Get +@ stub ADL2_Adapter_Accessibility_Get +@ stub ADL2_Adapter_AceDefaults_Restore +@ stub ADL2_Adapter_Active_Get +@ stub ADL2_Adapter_Active_Set +@ stub ADL2_Adapter_Active_SetPrefer +@ stub ADL2_Adapter_AdapterInfoX2_Get +@ stub ADL2_Adapter_AdapterInfoX3_Get +@ stub ADL2_Adapter_AdapterInfoX4_Get +@ stub ADL2_Adapter_AdapterInfo_Get +@ stub ADL2_Adapter_AdapterList_Disable +@ stub ADL2_Adapter_AdapterLocationPath_Get +@ stub ADL2_Adapter_Aspects_Get +@ stub ADL2_Adapter_AudioChannelSplitConfiguration_Get +@ stub ADL2_Adapter_AudioChannelSplit_Disable +@ stub ADL2_Adapter_AudioChannelSplit_Enable +@ stub ADL2_Adapter_BigSw_Info_Get +@ stub ADL2_Adapter_BlackAndWhiteLevelSupport_Get +@ stub ADL2_Adapter_BlackAndWhiteLevel_Get +@ stub ADL2_Adapter_BlackAndWhiteLevel_Set +@ stub ADL2_Adapter_BoardLayout_Get +@ stub ADL2_Adapter_Caps +@ stub ADL2_Adapter_ChipSetInfo_Get +@ stub ADL2_Adapter_CloneTypes_Get +@ stub ADL2_Adapter_ConfigMemory_Cap +@ stub ADL2_Adapter_ConfigMemory_Get +@ stub ADL2_Adapter_ConfigureState_Get +@ stub ADL2_Adapter_ConnectionData_Get +@ stub ADL2_Adapter_ConnectionData_Remove +@ stub ADL2_Adapter_ConnectionData_Set +@ stub ADL2_Adapter_ConnectionState_Get +@ stub ADL2_Adapter_CrossDisplayPlatformInfo_Get +@ stub ADL2_Adapter_CrossGPUClone_Disable +@ stub ADL2_Adapter_CrossdisplayAdapterRole_Caps +@ stub ADL2_Adapter_CrossdisplayInfoX2_Set +@ stub ADL2_Adapter_CrossdisplayInfo_Get +@ stub ADL2_Adapter_CrossdisplayInfo_Set +@ stub ADL2_Adapter_CrossfireX2_Get +@ stub ADL2_Adapter_Crossfire_Caps +@ stub ADL2_Adapter_Crossfire_Get +@ stub ADL2_Adapter_Crossfire_Set +@ stub ADL2_Adapter_DefaultAudioChannelTable_Load +@ stub ADL2_Adapter_Desktop_Caps +@ stub ADL2_Adapter_Desktop_SupportedSLSGridTypes_Get +@ stub ADL2_Adapter_DeviceID_Get +@ stub ADL2_Adapter_DisplayAudioEndpoint_Enable +@ stub ADL2_Adapter_DisplayAudioEndpoint_Mute +@ stub ADL2_Adapter_DisplayAudioInfo_Get +@ stub ADL2_Adapter_DisplayGTCCaps_Get +@ stub ADL2_Adapter_Display_Caps +@ stub ADL2_Adapter_DriverSettings_Get +@ stub ADL2_Adapter_DriverSettings_Set +@ stub ADL2_Adapter_ECC_ErrorInjection_Set +@ stub ADL2_Adapter_ECC_ErrorRecords_Get +@ stub ADL2_Adapter_EDC_ErrorInjection_Set +@ stub ADL2_Adapter_EDC_ErrorRecords_Get +@ stub ADL2_Adapter_EDIDManagement_Caps +@ stub ADL2_Adapter_EmulationMode_Set +@ stub ADL2_Adapter_ExtInfo_Get +@ stub ADL2_Adapter_Feature_Caps +@ stub ADL2_Adapter_FrameMetrics_Caps +@ stub ADL2_Adapter_FrameMetrics_FrameDuration_Disable +@ stub ADL2_Adapter_FrameMetrics_FrameDuration_Enable +@ stub ADL2_Adapter_FrameMetrics_FrameDuration_Get +@ stub ADL2_Adapter_FrameMetrics_FrameDuration_Start +@ stub ADL2_Adapter_FrameMetrics_FrameDuration_Stop +@ stub ADL2_Adapter_FrameMetrics_Get +@ stub ADL2_Adapter_FrameMetrics_Start +@ stub ADL2_Adapter_FrameMetrics_Stop +@ stub ADL2_Adapter_Gamma_Get +@ stub ADL2_Adapter_Gamma_Set +@ stub ADL2_Adapter_Graphic_Core_Info_Get +@ stub ADL2_Adapter_HBC_Caps +@ stub ADL2_Adapter_HBM_ECC_UC_Check +@ stub ADL2_Adapter_Headless_Get +@ stub ADL2_Adapter_ID_Get +@ stub ADL2_Adapter_IsGamingDriver_Info_Get +@ stub ADL2_Adapter_LocalDisplayConfig_Get +@ stub ADL2_Adapter_LocalDisplayConfig_Set +@ stub ADL2_Adapter_LocalDisplayState_Get +@ stub ADL2_Adapter_MVPU_Set +@ stub ADL2_Adapter_MaxCursorSize_Get +@ stub ADL2_Adapter_MemoryInfo2_Get +@ stub ADL2_Adapter_MemoryInfo_Get +@ stub ADL2_Adapter_MirabilisSupport_Get +@ stub ADL2_Adapter_ModeSwitch +@ stub ADL2_Adapter_ModeTimingOverride_Caps +@ stub ADL2_Adapter_Modes_ReEnumerate +@ stub ADL2_Adapter_NumberOfActivatableSources_Get +@ stdcall ADL2_Adapter_NumberOfAdapters_Get(ptr ptr) +@ stub ADL2_Adapter_ObservedClockInfo_Get +@ stub ADL2_Adapter_PMLog_Start +@ stub ADL2_Adapter_PMLog_Stop +@ stub ADL2_Adapter_PMLog_Support_Get +@ stub ADL2_Adapter_PreFlipPostProcessing_Disable +@ stub ADL2_Adapter_PreFlipPostProcessing_Enable +@ stub ADL2_Adapter_PreFlipPostProcessing_Get_Status +@ stub ADL2_Adapter_PreFlipPostProcessing_Select_LUT_Algorithm +@ stub ADL2_Adapter_PreFlipPostProcessing_Select_LUT_Buffer +@ stub ADL2_Adapter_PreFlipPostProcessing_Unselect_LUT_Buffer +@ stub ADL2_Adapter_Primary_Get +@ stub ADL2_Adapter_Primary_Set +@ stub ADL2_Adapter_RAS_ErrorInjection_Set +@ stub ADL2_Adapter_RegValueInt_Get +@ stub ADL2_Adapter_RegValueInt_Set +@ stub ADL2_Adapter_RegValueString_Get +@ stub ADL2_Adapter_RegValueString_Set +@ stub ADL2_Adapter_SWInfo_Get +@ stub ADL2_Adapter_Speed_Caps +@ stub ADL2_Adapter_Speed_Get +@ stub ADL2_Adapter_Speed_Set +@ stub ADL2_Adapter_SupportedConnections_Get +@ stub ADL2_Adapter_TRNG_Get +@ stub ADL2_Adapter_Tear_Free_Cap +@ stub ADL2_Adapter_VRAMUsage_Get +@ stub ADL2_Adapter_VariBrightEnable_Set +@ stub ADL2_Adapter_VariBrightLevel_Get +@ stub ADL2_Adapter_VariBrightLevel_Set +@ stub ADL2_Adapter_VariBright_Caps +@ stub ADL2_Adapter_VerndorID_Int_get +@ stub ADL2_Adapter_VideoBiosInfo_Get +@ stub ADL2_Adapter_VideoTheaterModeInfo_Get +@ stub ADL2_Adapter_VideoTheaterModeInfo_Set +@ stub ADL2_Adapter_XConnectSupport_Get +@ stub ADL2_ApplicationProfilesX2_AppInterceptionList_Set +@ stub ADL2_ApplicationProfilesX2_AppStartStopInfo_Get +@ stub ADL2_ApplicationProfiles_AppInterceptionList_Set +@ stub ADL2_ApplicationProfiles_AppInterception_Set +@ stub ADL2_ApplicationProfiles_AppStartStopInfo_Get +@ stub ADL2_ApplicationProfiles_AppStartStop_Resume +@ stub ADL2_ApplicationProfiles_Applications_Get +@ stub ADL2_ApplicationProfiles_ConvertToCompact +@ stub ADL2_ApplicationProfiles_DriverAreaPrivacy_Get +@ stub ADL2_ApplicationProfiles_GetCustomization +@ stub ADL2_ApplicationProfiles_HitListsX2_Get +@ stub ADL2_ApplicationProfiles_HitListsX3_Get +@ stub ADL2_ApplicationProfiles_HitLists_Get +@ stub ADL2_ApplicationProfiles_ProfileApplicationX2_Assign +@ stub ADL2_ApplicationProfiles_ProfileApplication_Assign +@ stub ADL2_ApplicationProfiles_ProfileOfAnApplicationX2_Search +@ stub ADL2_ApplicationProfiles_ProfileOfAnApplication_InMemorySearch +@ stub ADL2_ApplicationProfiles_ProfileOfAnApplication_Search +@ stub ADL2_ApplicationProfiles_Profile_Create +@ stub ADL2_ApplicationProfiles_Profile_Exist +@ stub ADL2_ApplicationProfiles_Profile_Remove +@ stub ADL2_ApplicationProfiles_PropertyType_Get +@ stub ADL2_ApplicationProfiles_Release_Get +@ stub ADL2_ApplicationProfiles_RemoveApplication +@ stub ADL2_ApplicationProfiles_StatusInfo_Get +@ stub ADL2_ApplicationProfiles_System_Reload +@ stub ADL2_ApplicationProfiles_User_Load +@ stub ADL2_ApplicationProfiles_User_Unload +@ stub ADL2_Audio_CurrentSampleRate_Get +@ stub ADL2_AutoTuningResult_Get +@ stub ADL2_BOOST_Settings_Get +@ stub ADL2_BOOST_Settings_Set +@ stub ADL2_Blockchain_BlockchainMode_Caps +@ stub ADL2_Blockchain_BlockchainMode_Get +@ stub ADL2_Blockchain_BlockchainMode_Set +@ stub ADL2_Blockchain_Hashrate_Set +@ stub ADL2_CDS_UnsafeMode_Set +@ stub ADL2_CHILL_SettingsX2_Get +@ stub ADL2_CHILL_SettingsX2_Set +@ stub ADL2_CV_DongleSettings_Get +@ stub ADL2_CV_DongleSettings_Reset +@ stub ADL2_CV_DongleSettings_Set +@ stub ADL2_Chill_Caps_Get +@ stub ADL2_Chill_Settings_Get +@ stub ADL2_Chill_Settings_Notify +@ stub ADL2_Chill_Settings_Set +@ stub ADL2_CustomFan_Caps +@ stub ADL2_CustomFan_Get +@ stub ADL2_CustomFan_Set +@ stub ADL2_DELAG_Settings_Get +@ stub ADL2_DELAG_Settings_Set +@ stub ADL2_DFP_AllowOnlyCETimings_Get +@ stub ADL2_DFP_AllowOnlyCETimings_Set +@ stub ADL2_DFP_BaseAudioSupport_Get +@ stub ADL2_DFP_GPUScalingEnable_Get +@ stub ADL2_DFP_GPUScalingEnable_Set +@ stub ADL2_DFP_HDMISupport_Get +@ stub ADL2_DFP_MVPUAnalogSupport_Get +@ stub ADL2_DFP_PixelFormat_Caps +@ stub ADL2_DFP_PixelFormat_Get +@ stub ADL2_DFP_PixelFormat_Set +@ stub ADL2_DVRSupport_Get +@ stub ADL2_Desktop_DOPP_Enable +@ stub ADL2_Desktop_DOPP_EnableX2 +@ stub ADL2_Desktop_Detach +@ stub ADL2_Desktop_Device_Create +@ stub ADL2_Desktop_Device_Destroy +@ stub ADL2_Desktop_ExclusiveModeX2_Get +@ stub ADL2_Desktop_HardwareCursor_SetBitmap +@ stub ADL2_Desktop_HardwareCursor_SetPosition +@ stub ADL2_Desktop_HardwareCursor_Toggle +@ stub ADL2_Desktop_PFPAComplete_Set +@ stub ADL2_Desktop_PFPAState_Get +@ stub ADL2_Desktop_PrimaryInfo_Get +@ stub ADL2_Desktop_TextureState_Get +@ stub ADL2_Desktop_Texture_Enable +@ stub ADL2_Device_PMLog_Device_Create +@ stub ADL2_Device_PMLog_Device_Destroy +@ stub ADL2_DisplayScaling_Set +@ stub ADL2_Display_AdapterID_Get +@ stub ADL2_Display_AdjustCaps_Get +@ stub ADL2_Display_AdjustmentCoherent_Get +@ stub ADL2_Display_AdjustmentCoherent_Set +@ stub ADL2_Display_AudioMappingInfo_Get +@ stub ADL2_Display_AvivoColor_Get +@ stub ADL2_Display_AvivoCurrentColor_Set +@ stub ADL2_Display_AvivoDefaultColor_Set +@ stub ADL2_Display_BackLight_Get +@ stub ADL2_Display_BackLight_Set +@ stub ADL2_Display_BezelOffsetSteppingSize_Get +@ stub ADL2_Display_BezelOffset_Set +@ stub ADL2_Display_BezelSupported_Validate +@ stub ADL2_Display_Capabilities_Get +@ stub ADL2_Display_ColorCaps_Get +@ stub ADL2_Display_ColorDepth_Get +@ stub ADL2_Display_ColorDepth_Set +@ stub ADL2_Display_ColorTemperatureSourceDefault_Get +@ stub ADL2_Display_ColorTemperatureSource_Get +@ stub ADL2_Display_ColorTemperatureSource_Set +@ stub ADL2_Display_Color_Get +@ stub ADL2_Display_Color_Set +@ stub ADL2_Display_ConnectedDisplays_Get +@ stub ADL2_Display_ContainerID_Get +@ stub ADL2_Display_ControllerOverlayAdjustmentCaps_Get +@ stub ADL2_Display_ControllerOverlayAdjustmentData_Get +@ stub ADL2_Display_ControllerOverlayAdjustmentData_Set +@ stub ADL2_Display_CustomizedModeListNum_Get +@ stub ADL2_Display_CustomizedModeList_Get +@ stub ADL2_Display_CustomizedMode_Add +@ stub ADL2_Display_CustomizedMode_Delete +@ stub ADL2_Display_CustomizedMode_Validate +@ stub ADL2_Display_DCE_Get +@ stub ADL2_Display_DCE_Set +@ stub ADL2_Display_DDCBlockAccess_Get +@ stub ADL2_Display_DDCInfo2_Get +@ stub ADL2_Display_DDCInfo_Get +@ stub ADL2_Display_Deflicker_Get +@ stub ADL2_Display_Deflicker_Set +@ stub ADL2_Display_DeviceConfig_Get +@ stub ADL2_Display_DisplayContent_Cap +@ stub ADL2_Display_DisplayContent_Get +@ stub ADL2_Display_DisplayContent_Set +@ stub ADL2_Display_DisplayInfo_Get +@ stub ADL2_Display_DisplayMapConfigX2_Set +@ stub ADL2_Display_DisplayMapConfig_Get +@ stub ADL2_Display_DisplayMapConfig_PossibleAddAndRemove +@ stub ADL2_Display_DisplayMapConfig_Set +@ stub ADL2_Display_DisplayMapConfig_Validate +@ stub ADL2_Display_DitherState_Get +@ stub ADL2_Display_DitherState_Set +@ stub ADL2_Display_Downscaling_Caps +@ stub ADL2_Display_DpMstAuxMsg_Get +@ stub ADL2_Display_DpMstInfo_Get +@ stub ADL2_Display_DummyVirtual_Destroy +@ stub ADL2_Display_DummyVirtual_Get +@ stub ADL2_Display_EdidData_Get +@ stub ADL2_Display_EdidData_Set +@ stub ADL2_Display_EnumDisplays_Get +@ stub ADL2_Display_FilterSVideo_Get +@ stub ADL2_Display_FilterSVideo_Set +@ stub ADL2_Display_ForcibleDisplay_Get +@ stub ADL2_Display_ForcibleDisplay_Set +@ stub ADL2_Display_FormatsOverride_Get +@ stub ADL2_Display_FormatsOverride_Set +@ stub ADL2_Display_FreeSyncState_Get +@ stub ADL2_Display_FreeSyncState_Set +@ stub ADL2_Display_FreeSync_Cap +@ stub ADL2_Display_GamutMapping_Get +@ stub ADL2_Display_GamutMapping_Reset +@ stub ADL2_Display_GamutMapping_Set +@ stub ADL2_Display_Gamut_Caps +@ stub ADL2_Display_Gamut_Get +@ stub ADL2_Display_Gamut_Set +@ stub ADL2_Display_HDCP_Get +@ stub ADL2_Display_HDCP_Set +@ stub ADL2_Display_HDRState_Get +@ stub ADL2_Display_HDRState_Set +@ stub ADL2_Display_ImageExpansion_Get +@ stub ADL2_Display_ImageExpansion_Set +@ stub ADL2_Display_InfoPacket_Get +@ stub ADL2_Display_InfoPacket_Set +@ stub ADL2_Display_IsVirtual_Get +@ stub ADL2_Display_LCDRefreshRateCapability_Get +@ stub ADL2_Display_LCDRefreshRateOptions_Get +@ stub ADL2_Display_LCDRefreshRateOptions_Set +@ stub ADL2_Display_LCDRefreshRate_Get +@ stub ADL2_Display_LCDRefreshRate_Set +@ stub ADL2_Display_Limits_Get +@ stub ADL2_Display_MVPUCaps_Get +@ stub ADL2_Display_MVPUStatus_Get +@ stub ADL2_Display_ModeTimingOverrideInfo_Get +@ stub ADL2_Display_ModeTimingOverrideListX2_Get +@ stub ADL2_Display_ModeTimingOverrideListX3_Get +@ stub ADL2_Display_ModeTimingOverrideList_Get +@ stub ADL2_Display_ModeTimingOverrideX2_Get +@ stub ADL2_Display_ModeTimingOverrideX2_Set +@ stub ADL2_Display_ModeTimingOverrideX3_Get +@ stub ADL2_Display_ModeTimingOverride_Delete +@ stub ADL2_Display_ModeTimingOverride_Get +@ stub ADL2_Display_ModeTimingOverride_Set +@ stub ADL2_Display_Modes_Get +@ stub ADL2_Display_Modes_Set +@ stub ADL2_Display_Modes_X2_Get +@ stub ADL2_Display_MonitorPowerState_Set +@ stub ADL2_Display_NativeAUXChannel_Access +@ stub ADL2_Display_NeedWorkaroundFor5Clone_Get +@ stub ADL2_Display_NumberOfDisplays_Get +@ stub ADL2_Display_ODClockConfig_Set +@ stub ADL2_Display_ODClockInfo_Get +@ stub ADL2_Display_Overlap_NotifyAdjustment +@ stub ADL2_Display_Overlap_Set +@ stub ADL2_Display_Overscan_Get +@ stub ADL2_Display_Overscan_Set +@ stub ADL2_Display_PixelFormatDefault_Get +@ stub ADL2_Display_PixelFormat_Get +@ stub ADL2_Display_PixelFormat_Set +@ stub ADL2_Display_Position_Get +@ stub ADL2_Display_Position_Set +@ stub ADL2_Display_PossibleMapping_Get +@ stub ADL2_Display_PossibleMode_Get +@ stub ADL2_Display_PowerXpressActiveGPU_Get +@ stub ADL2_Display_PowerXpressActiveGPU_Set +@ stub ADL2_Display_PowerXpressActvieGPUR2_Get +@ stub ADL2_Display_PowerXpressVersion_Get +@ stub ADL2_Display_PowerXpress_AutoSwitchConfig_Get +@ stub ADL2_Display_PowerXpress_AutoSwitchConfig_Set +@ stub ADL2_Display_PreferredMode_Get +@ stub ADL2_Display_PreservedAspectRatio_Get +@ stub ADL2_Display_PreservedAspectRatio_Set +@ stub ADL2_Display_Property_Get +@ stub ADL2_Display_Property_Set +@ stub ADL2_Display_RcDisplayAdjustment +@ stub ADL2_Display_ReGammaCoefficients_Get +@ stub ADL2_Display_ReGammaCoefficients_Set +@ stub ADL2_Display_ReducedBlanking_Get +@ stub ADL2_Display_ReducedBlanking_Set +@ stub ADL2_Display_RegammaR1_Get +@ stub ADL2_Display_RegammaR1_Set +@ stub ADL2_Display_Regamma_Get +@ stub ADL2_Display_Regamma_Set +@ stub ADL2_Display_SLSBuilder_CommonMode_Get +@ stub ADL2_Display_SLSBuilder_Create +@ stub ADL2_Display_SLSBuilder_DisplaysCanBeNextCandidateInSLS_Get +@ stub ADL2_Display_SLSBuilder_DisplaysCanBeNextCandidateToEnabled_Get +@ stub ADL2_Display_SLSBuilder_Get +@ stub ADL2_Display_SLSBuilder_IsActive_Notify +@ stub ADL2_Display_SLSBuilder_MaxSLSLayoutSize_Get +@ stub ADL2_Display_SLSBuilder_TimeOut_Get +@ stub ADL2_Display_SLSBuilder_Update +@ stub ADL2_Display_SLSGrid_Caps +@ stub ADL2_Display_SLSMapConfigX2_Delete +@ stub ADL2_Display_SLSMapConfigX2_Get +@ stub ADL2_Display_SLSMapConfig_Create +@ stub ADL2_Display_SLSMapConfig_Delete +@ stub ADL2_Display_SLSMapConfig_Get +@ stub ADL2_Display_SLSMapConfig_ImageCropType_Set +@ stub ADL2_Display_SLSMapConfig_Rearrange +@ stub ADL2_Display_SLSMapConfig_SetState +@ stub ADL2_Display_SLSMapConfig_SupportedImageCropType_Get +@ stub ADL2_Display_SLSMapConfig_Valid +@ stub ADL2_Display_SLSMapIndexList_Get +@ stub ADL2_Display_SLSMapIndex_Get +@ stub ADL2_Display_SLSMiddleMode_Get +@ stub ADL2_Display_SLSMiddleMode_Set +@ stub ADL2_Display_SLSRecords_Get +@ stub ADL2_Display_Sharpness_Caps +@ stub ADL2_Display_Sharpness_Get +@ stub ADL2_Display_Sharpness_Info_Get +@ stub ADL2_Display_Sharpness_Set +@ stub ADL2_Display_Size_Get +@ stub ADL2_Display_Size_Set +@ stub ADL2_Display_SourceContentAttribute_Get +@ stub ADL2_Display_SourceContentAttribute_Set +@ stub ADL2_Display_SplitDisplay_Caps +@ stub ADL2_Display_SplitDisplay_Get +@ stub ADL2_Display_SplitDisplay_RestoreDesktopConfiguration +@ stub ADL2_Display_SplitDisplay_Set +@ stub ADL2_Display_SupportedColorDepth_Get +@ stub ADL2_Display_SupportedPixelFormat_Get +@ stub ADL2_Display_SwitchingCapability_Get +@ stub ADL2_Display_TVCaps_Get +@ stub ADL2_Display_TargetTimingX2_Get +@ stub ADL2_Display_TargetTiming_Get +@ stub ADL2_Display_UnderScan_Auto_Get +@ stub ADL2_Display_UnderScan_Auto_Set +@ stub ADL2_Display_UnderscanState_Get +@ stub ADL2_Display_UnderscanState_Set +@ stub ADL2_Display_UnderscanSupport_Get +@ stub ADL2_Display_Underscan_Get +@ stub ADL2_Display_Underscan_Set +@ stub ADL2_Display_Vector_Get +@ stub ADL2_Display_ViewPort_Cap +@ stub ADL2_Display_ViewPort_Get +@ stub ADL2_Display_ViewPort_Set +@ stub ADL2_Display_VirtualType_Get +@ stub ADL2_Display_WriteAndReadI2C +@ stub ADL2_Display_WriteAndReadI2CLargePayload +@ stub ADL2_Display_WriteAndReadI2CRev_Get +@ stub ADL2_ElmCompatibilityMode_Caps +@ stub ADL2_ElmCompatibilityMode_Status_Get +@ stub ADL2_ElmCompatibilityMode_Status_Set +@ stub ADL2_ExclusiveModeGet +@ stub ADL2_FPS_Caps +@ stub ADL2_FPS_Settings_Get +@ stub ADL2_FPS_Settings_Reset +@ stub ADL2_FPS_Settings_Set +@ stub ADL2_Feature_Settings_Get +@ stub ADL2_Feature_Settings_Set +@ stub ADL2_Flush_Driver_Data +@ stub ADL2_GPUVMPageSize_Info_Get +@ stub ADL2_GPUVMPageSize_Info_Set +@ stub ADL2_GPUVerInfo_Get +@ stub ADL2_GcnAsicInfo_Get +@ stub ADL2_Graphics_IsDetachableGraphicsPlatform_Get +@ stub ADL2_Graphics_IsGfx9AndAbove +@ stub ADL2_Graphics_MantleVersion_Get +@ stub ADL2_Graphics_Platform_Get +@ stdcall ADL2_Graphics_VersionsX2_Get(ptr ptr) +@ stub ADL2_Graphics_Versions_Get +@ stub ADL2_Graphics_VulkanVersion_Get +@ stub ADL2_HybridGraphicsGPU_Set +@ stub ADL2_MGPUSLS_Status_Set +@ stub ADL2_MMD_FeatureList_Get +@ stub ADL2_MMD_FeatureValuesX2_Get +@ stub ADL2_MMD_FeatureValuesX2_Set +@ stub ADL2_MMD_FeatureValues_Get +@ stub ADL2_MMD_FeatureValues_Set +@ stub ADL2_MMD_FeaturesX2_Caps +@ stub ADL2_MMD_Features_Caps +@ stub ADL2_MMD_VideoAdjustInfo_Get +@ stub ADL2_MMD_VideoAdjustInfo_Set +@ stub ADL2_MMD_VideoColor_Caps +@ stub ADL2_MMD_VideoColor_Get +@ stub ADL2_MMD_VideoColor_Set +@ stub ADL2_MMD_Video_Caps +@ stub ADL2_Main_ControlX2_Create +@ stdcall ADL2_Main_Control_Create(ptr long ptr) +@ stub ADL2_Main_Control_Destroy +@ stub ADL2_Main_Control_GetProcAddress +@ stub ADL2_Main_Control_IsFunctionValid +@ stub ADL2_Main_Control_Refresh +@ stub ADL2_Main_LogDebug_Set +@ stub ADL2_Main_LogError_Set +@ stub ADL2_New_QueryPMLogData_Get +@ stub ADL2_Overdrive5_CurrentActivity_Get +@ stub ADL2_Overdrive5_FanSpeedInfo_Get +@ stub ADL2_Overdrive5_FanSpeedToDefault_Set +@ stub ADL2_Overdrive5_FanSpeed_Get +@ stub ADL2_Overdrive5_FanSpeed_Set +@ stub ADL2_Overdrive5_ODParameters_Get +@ stub ADL2_Overdrive5_ODPerformanceLevels_Get +@ stub ADL2_Overdrive5_ODPerformanceLevels_Set +@ stub ADL2_Overdrive5_PowerControlAbsValue_Caps +@ stub ADL2_Overdrive5_PowerControlAbsValue_Get +@ stub ADL2_Overdrive5_PowerControlAbsValue_Set +@ stub ADL2_Overdrive5_PowerControlInfo_Get +@ stub ADL2_Overdrive5_PowerControl_Caps +@ stub ADL2_Overdrive5_PowerControl_Get +@ stub ADL2_Overdrive5_PowerControl_Set +@ stub ADL2_Overdrive5_Temperature_Get +@ stub ADL2_Overdrive5_ThermalDevices_Enum +@ stub ADL2_Overdrive6_AdvancedFan_Caps +@ stub ADL2_Overdrive6_CapabilitiesEx_Get +@ stub ADL2_Overdrive6_Capabilities_Get +@ stub ADL2_Overdrive6_ControlI2C +@ stub ADL2_Overdrive6_CurrentPower_Get +@ stub ADL2_Overdrive6_CurrentStatus_Get +@ stub ADL2_Overdrive6_FanPWMLimitData_Get +@ stub ADL2_Overdrive6_FanPWMLimitData_Set +@ stub ADL2_Overdrive6_FanPWMLimitRangeInfo_Get +@ stub ADL2_Overdrive6_FanSpeed_Get +@ stub ADL2_Overdrive6_FanSpeed_Reset +@ stub ADL2_Overdrive6_FanSpeed_Set +@ stub ADL2_Overdrive6_FuzzyController_Caps +@ stub ADL2_Overdrive6_MaxClockAdjust_Get +@ stub ADL2_Overdrive6_PowerControlInfo_Get +@ stub ADL2_Overdrive6_PowerControlInfo_Get_X2 +@ stub ADL2_Overdrive6_PowerControl_Caps +@ stub ADL2_Overdrive6_PowerControl_Get +@ stub ADL2_Overdrive6_PowerControl_Set +@ stub ADL2_Overdrive6_StateEx_Get +@ stub ADL2_Overdrive6_StateEx_Set +@ stub ADL2_Overdrive6_StateInfo_Get +@ stub ADL2_Overdrive6_State_Reset +@ stub ADL2_Overdrive6_State_Set +@ stub ADL2_Overdrive6_TargetTemperatureData_Get +@ stub ADL2_Overdrive6_TargetTemperatureData_Set +@ stub ADL2_Overdrive6_TargetTemperatureRangeInfo_Get +@ stub ADL2_Overdrive6_TemperatureEx_Get +@ stub ADL2_Overdrive6_Temperature_Get +@ stub ADL2_Overdrive6_ThermalController_Caps +@ stub ADL2_Overdrive6_ThermalLimitUnlock_Get +@ stub ADL2_Overdrive6_ThermalLimitUnlock_Set +@ stub ADL2_Overdrive6_VoltageControlInfo_Get +@ stub ADL2_Overdrive6_VoltageControl_Get +@ stub ADL2_Overdrive6_VoltageControl_Set +@ stub ADL2_Overdrive8_Current_SettingX2_Get +@ stub ADL2_Overdrive8_Current_SettingX3_Get +@ stub ADL2_Overdrive8_Current_Setting_Get +@ stub ADL2_Overdrive8_Init_SettingX2_Get +@ stub ADL2_Overdrive8_Init_Setting_Get +@ stub ADL2_Overdrive8_PMLogSenorRange_Caps +@ stub ADL2_Overdrive8_PMLogSenorType_Support_Get +@ stub ADL2_Overdrive8_PMLog_ShareMemory_Read +@ stub ADL2_Overdrive8_PMLog_ShareMemory_Start +@ stub ADL2_Overdrive8_PMLog_ShareMemory_Stop +@ stub ADL2_Overdrive8_PMLog_ShareMemory_Support +@ stub ADL2_Overdrive8_Setting_Set +@ stub ADL2_OverdriveN_AutoWattman_Caps +@ stub ADL2_OverdriveN_AutoWattman_Get +@ stub ADL2_OverdriveN_AutoWattman_Set +@ stub ADL2_OverdriveN_CapabilitiesX2_Get +@ stub ADL2_OverdriveN_Capabilities_Get +@ stub ADL2_OverdriveN_CountOfEvents_Get +@ stub ADL2_OverdriveN_FanControl_Get +@ stub ADL2_OverdriveN_FanControl_Set +@ stub ADL2_OverdriveN_MemoryClocksX2_Get +@ stub ADL2_OverdriveN_MemoryClocksX2_Set +@ stub ADL2_OverdriveN_MemoryClocks_Get +@ stub ADL2_OverdriveN_MemoryClocks_Set +@ stub ADL2_OverdriveN_MemoryTimingLevel_Get +@ stub ADL2_OverdriveN_MemoryTimingLevel_Set +@ stub ADL2_OverdriveN_PerformanceStatus_Get +@ stub ADL2_OverdriveN_PowerLimit_Get +@ stub ADL2_OverdriveN_PowerLimit_Set +@ stub ADL2_OverdriveN_SCLKAutoOverClock_Get +@ stub ADL2_OverdriveN_SCLKAutoOverClock_Set +@ stub ADL2_OverdriveN_SettingsExt_Get +@ stub ADL2_OverdriveN_SettingsExt_Set +@ stub ADL2_OverdriveN_SystemClocksX2_Get +@ stub ADL2_OverdriveN_SystemClocksX2_Set +@ stub ADL2_OverdriveN_SystemClocks_Get +@ stub ADL2_OverdriveN_SystemClocks_Set +@ stub ADL2_OverdriveN_Temperature_Get +@ stub ADL2_OverdriveN_Test_Set +@ stub ADL2_OverdriveN_ThrottleNotification_Get +@ stub ADL2_OverdriveN_ZeroRPMFan_Get +@ stub ADL2_OverdriveN_ZeroRPMFan_Set +@ stub ADL2_Overdrive_Caps +@ stub ADL2_PPLogSettings_Get +@ stub ADL2_PPLogSettings_Set +@ stub ADL2_PPW_Caps +@ stub ADL2_PPW_Status_Get +@ stub ADL2_PPW_Status_Set +@ stub ADL2_PageMigration_Settings_Get +@ stub ADL2_PageMigration_Settings_Set +@ stub ADL2_PerGPU_GDEvent_Register +@ stub ADL2_PerGPU_GDEvent_UnRegister +@ stub ADL2_PerfTuning_Status_Get +@ stub ADL2_PerfTuning_Status_Set +@ stub ADL2_PerformanceTuning_Caps +@ stub ADL2_PowerStates_Get +@ stub ADL2_PowerXpress_AncillaryDevices_Get +@ stub ADL2_PowerXpress_Config_Caps +@ stub ADL2_PowerXpress_Configuration_Get +@ stub ADL2_PowerXpress_ExtendedBatteryMode_Caps +@ stub ADL2_PowerXpress_ExtendedBatteryMode_Get +@ stub ADL2_PowerXpress_ExtendedBatteryMode_Set +@ stub ADL2_PowerXpress_LongIdleDetect_Get +@ stub ADL2_PowerXpress_LongIdleDetect_Set +@ stub ADL2_PowerXpress_PowerControlMode_Get +@ stub ADL2_PowerXpress_PowerControlMode_Set +@ stub ADL2_PowerXpress_Scheme_Get +@ stub ADL2_PowerXpress_Scheme_Set +@ stub ADL2_RIS_Settings_Get +@ stub ADL2_RIS_Settings_Set +@ stub ADL2_RegisterEvent +@ stub ADL2_RegisterEventX2 +@ stub ADL2_Remap +@ stub ADL2_RemoteDisplay_Destroy +@ stub ADL2_RemoteDisplay_Display_Acquire +@ stub ADL2_RemoteDisplay_Display_Release +@ stub ADL2_RemoteDisplay_Display_Release_All +@ stub ADL2_RemoteDisplay_Hdcp20_Create +@ stub ADL2_RemoteDisplay_Hdcp20_Destroy +@ stub ADL2_RemoteDisplay_Hdcp20_Notify +@ stub ADL2_RemoteDisplay_Hdcp20_Process +@ stub ADL2_RemoteDisplay_IEPort_Set +@ stub ADL2_RemoteDisplay_Initialize +@ stub ADL2_RemoteDisplay_Nofitiation_Register +@ stub ADL2_RemoteDisplay_Notification_UnRegister +@ stub ADL2_RemoteDisplay_Support_Caps +@ stub ADL2_RemoteDisplay_VirtualWirelessAdapter_InUse_Get +@ stub ADL2_RemoteDisplay_VirtualWirelessAdapter_Info_Get +@ stub ADL2_RemoteDisplay_VirtualWirelessAdapter_RadioState_Get +@ stub ADL2_RemoteDisplay_VirtualWirelessAdapter_WPSSetting_Change +@ stub ADL2_RemoteDisplay_VirtualWirelessAdapter_WPSSetting_Get +@ stub ADL2_RemoteDisplay_WFDDeviceInfo_Get +@ stub ADL2_RemoteDisplay_WFDDeviceName_Change +@ stub ADL2_RemoteDisplay_WFDDevice_StatusInfo_Get +@ stub ADL2_RemoteDisplay_WFDDiscover_Start +@ stub ADL2_RemoteDisplay_WFDDiscover_Stop +@ stub ADL2_RemoteDisplay_WFDLink_Connect +@ stub ADL2_RemoteDisplay_WFDLink_Creation_Accept +@ stub ADL2_RemoteDisplay_WFDLink_Disconnect +@ stub ADL2_RemoteDisplay_WFDLink_WPS_Process +@ stub ADL2_RemoteDisplay_WFDWDSPSettings_Set +@ stub ADL2_RemoteDisplay_WirelessDisplayEnableDisable_Commit +@ stub ADL2_RemotePlay_ControlFlags_Set +@ stub ADL2_ScreenPoint_AudioMappingInfo_Get +@ stub ADL2_Send +@ stub ADL2_SendX2 +@ stub ADL2_Stereo3D_2DPackedFormat_Set +@ stub ADL2_Stereo3D_3DCursorOffset_Get +@ stub ADL2_Stereo3D_3DCursorOffset_Set +@ stub ADL2_Stereo3D_CurrentFormat_Get +@ stub ADL2_Stereo3D_Info_Get +@ stub ADL2_Stereo3D_Modes_Get +@ stub ADL2_SwitchableGraphics_Applications_Get +@ stub ADL2_TV_Standard_Get +@ stub ADL2_TV_Standard_Set +@ stub ADL2_TurboSyncSupport_Get +@ stub ADL2_UnRegisterEvent +@ stub ADL2_UnRegisterEventX2 +@ stub ADL2_User_Settings_Notify +@ stub ADL2_WS_Overdrive_Caps +@ stub ADL2_Win_IsHybridAI +@ stub ADL2_Workstation_8BitGrayscale_Get +@ stub ADL2_Workstation_8BitGrayscale_Set +@ stub ADL2_Workstation_AdapterNumOfGLSyncConnectors_Get +@ stub ADL2_Workstation_Caps +@ stub ADL2_Workstation_DeepBitDepthX2_Get +@ stub ADL2_Workstation_DeepBitDepthX2_Set +@ stub ADL2_Workstation_DeepBitDepth_Get +@ stub ADL2_Workstation_DeepBitDepth_Set +@ stub ADL2_Workstation_DisplayGLSyncMode_Get +@ stub ADL2_Workstation_DisplayGLSyncMode_Set +@ stub ADL2_Workstation_DisplayGenlockCapable_Get +@ stub ADL2_Workstation_ECCData_Get +@ stub ADL2_Workstation_ECCX2_Get +@ stub ADL2_Workstation_ECC_Caps +@ stub ADL2_Workstation_ECC_Get +@ stub ADL2_Workstation_ECC_Set +@ stub ADL2_Workstation_GLSyncCounters_Get +@ stub ADL2_Workstation_GLSyncGenlockConfiguration_Get +@ stub ADL2_Workstation_GLSyncGenlockConfiguration_Set +@ stub ADL2_Workstation_GLSyncModuleDetect_Get +@ stub ADL2_Workstation_GLSyncModuleInfo_Get +@ stub ADL2_Workstation_GLSyncPortState_Get +@ stub ADL2_Workstation_GLSyncPortState_Set +@ stub ADL2_Workstation_GLSyncSupportedTopology_Get +@ stub ADL2_Workstation_GlobalEDIDPersistence_Get +@ stub ADL2_Workstation_GlobalEDIDPersistence_Set +@ stub ADL2_Workstation_LoadBalancing_Caps +@ stub ADL2_Workstation_LoadBalancing_Get +@ stub ADL2_Workstation_LoadBalancing_Set +@ stub ADL2_Workstation_RAS_ErrorCounts_Get +@ stub ADL2_Workstation_RAS_ErrorCounts_Reset +@ stub ADL2_Workstation_SDISegmentList_Get +@ stub ADL2_Workstation_SDI_Caps +@ stub ADL2_Workstation_SDI_Get +@ stub ADL2_Workstation_SDI_Set +@ stub ADL2_Workstation_Stereo_Get +@ stub ADL2_Workstation_Stereo_Set +@ stub ADL2_Workstation_UnsupportedDisplayModes_Enable +@ stub ADL_ADC_CurrentProfileFromDrv_Get +@ stub ADL_ADC_Display_AdapterDeviceProfileEx_Get +@ stub ADL_ADC_DrvDataToProfile_Copy +@ stub ADL_ADC_FindClosestMode_Get +@ stub ADL_ADC_IsDevModeEqual_Get +@ stub ADL_ADC_Profile_Apply +@ stub ADL_APO_AudioDelayAdjustmentInfo_Get +@ stub ADL_APO_AudioDelay_Restore +@ stub ADL_APO_AudioDelay_Set +@ stub ADL_AdapterLimitation_Caps +@ stub ADL_AdapterX2_Caps +@ stdcall ADL_Adapter_ASICFamilyType_Get(long ptr ptr) +@ stub ADL_Adapter_ASICInfo_Get +@ stub ADL_Adapter_Accessibility_Get +@ stub ADL_Adapter_Active_Get +@ stub ADL_Adapter_Active_Set +@ stub ADL_Adapter_Active_SetPrefer +@ stub ADL_Adapter_AdapterInfoX2_Get +@ stdcall ADL_Adapter_AdapterInfo_Get(ptr long) +@ stub ADL_Adapter_AdapterList_Disable +@ stub ADL_Adapter_Aspects_Get +@ stub ADL_Adapter_AudioChannelSplitConfiguration_Get +@ stub ADL_Adapter_AudioChannelSplit_Disable +@ stub ADL_Adapter_AudioChannelSplit_Enable +@ stub ADL_Adapter_BigSw_Info_Get +@ stub ADL_Adapter_BlackAndWhiteLevelSupport_Get +@ stub ADL_Adapter_BlackAndWhiteLevel_Get +@ stub ADL_Adapter_BlackAndWhiteLevel_Set +@ stub ADL_Adapter_BoardLayout_Get +@ stub ADL_Adapter_Caps +@ stub ADL_Adapter_ChipSetInfo_Get +@ stub ADL_Adapter_ConfigMemory_Cap +@ stub ADL_Adapter_ConfigMemory_Get +@ stub ADL_Adapter_ConfigureState_Get +@ stub ADL_Adapter_ConnectionData_Get +@ stub ADL_Adapter_ConnectionData_Remove +@ stub ADL_Adapter_ConnectionData_Set +@ stub ADL_Adapter_ConnectionState_Get +@ stub ADL_Adapter_CrossDisplayPlatformInfo_Get +@ stub ADL_Adapter_CrossdisplayAdapterRole_Caps +@ stub ADL_Adapter_CrossdisplayInfoX2_Set +@ stub ADL_Adapter_CrossdisplayInfo_Get +@ stub ADL_Adapter_CrossdisplayInfo_Set +@ stub ADL_Adapter_CrossfireX2_Get +@ stdcall ADL_Adapter_Crossfire_Caps(long ptr ptr ptr) +@ stdcall ADL_Adapter_Crossfire_Get(long ptr ptr) +@ stub ADL_Adapter_Crossfire_Set +@ stub ADL_Adapter_DefaultAudioChannelTable_Load +@ stub ADL_Adapter_DisplayAudioEndpoint_Enable +@ stub ADL_Adapter_DisplayAudioEndpoint_Mute +@ stub ADL_Adapter_DisplayAudioInfo_Get +@ stub ADL_Adapter_DisplayGTCCaps_Get +@ stub ADL_Adapter_Display_Caps +@ stub ADL_Adapter_DriverSettings_Get +@ stub ADL_Adapter_DriverSettings_Set +@ stub ADL_Adapter_EDIDManagement_Caps +@ stub ADL_Adapter_EmulationMode_Set +@ stub ADL_Adapter_ExtInfo_Get +@ stub ADL_Adapter_Gamma_Get +@ stub ADL_Adapter_Gamma_Set +@ stub ADL_Adapter_ID_Get +@ stub ADL_Adapter_LocalDisplayConfig_Get +@ stub ADL_Adapter_LocalDisplayConfig_Set +@ stub ADL_Adapter_LocalDisplayState_Get +@ stub ADL_Adapter_MaxCursorSize_Get +@ stub ADL_Adapter_MemoryInfo2_Get +@ stdcall ADL_Adapter_MemoryInfo_Get(long ptr) +@ stub ADL_Adapter_MirabilisSupport_Get +@ stub ADL_Adapter_ModeSwitch +@ stub ADL_Adapter_ModeTimingOverride_Caps +@ stub ADL_Adapter_Modes_ReEnumerate +@ stub ADL_Adapter_NumberOfActivatableSources_Get +@ stdcall ADL_Adapter_NumberOfAdapters_Get(ptr) +@ stdcall ADL_Adapter_ObservedClockInfo_Get(long ptr ptr) +@ stub ADL_Adapter_ObservedGameClockInfo_Get +@ stub ADL_Adapter_Primary_Get +@ stub ADL_Adapter_Primary_Set +@ stub ADL_Adapter_RegValueInt_Get +@ stub ADL_Adapter_RegValueInt_Set +@ stub ADL_Adapter_RegValueString_Get +@ stub ADL_Adapter_RegValueString_Set +@ stub ADL_Adapter_SWInfo_Get +@ stub ADL_Adapter_Speed_Caps +@ stub ADL_Adapter_Speed_Get +@ stub ADL_Adapter_Speed_Set +@ stub ADL_Adapter_SupportedConnections_Get +@ stub ADL_Adapter_Tear_Free_Cap +@ stub ADL_Adapter_VariBrightEnable_Set +@ stub ADL_Adapter_VariBrightLevel_Get +@ stub ADL_Adapter_VariBrightLevel_Set +@ stub ADL_Adapter_VariBright_Caps +@ stub ADL_Adapter_VideoBiosInfo_Get +@ stub ADL_Adapter_VideoTheaterModeInfo_Get +@ stub ADL_Adapter_VideoTheaterModeInfo_Set +@ stub ADL_ApplicationProfiles_Applications_Get +@ stub ADL_ApplicationProfiles_ConvertToCompact +@ stub ADL_ApplicationProfiles_DriverAreaPrivacy_Get +@ stub ADL_ApplicationProfiles_GetCustomization +@ stub ADL_ApplicationProfiles_HitListsX2_Get +@ stub ADL_ApplicationProfiles_HitLists_Get +@ stub ADL_ApplicationProfiles_ProfileApplicationX2_Assign +@ stub ADL_ApplicationProfiles_ProfileApplication_Assign +@ stub ADL_ApplicationProfiles_ProfileOfAnApplicationX2_Search +@ stub ADL_ApplicationProfiles_ProfileOfAnApplication_InMemorySearch +@ stub ADL_ApplicationProfiles_ProfileOfAnApplication_Search +@ stub ADL_ApplicationProfiles_Profile_Create +@ stub ADL_ApplicationProfiles_Profile_Exist +@ stub ADL_ApplicationProfiles_Profile_Remove +@ stub ADL_ApplicationProfiles_PropertyType_Get +@ stub ADL_ApplicationProfiles_Release_Get +@ stub ADL_ApplicationProfiles_RemoveApplication +@ stub ADL_ApplicationProfiles_StatusInfo_Get +@ stub ADL_ApplicationProfiles_System_Reload +@ stub ADL_ApplicationProfiles_User_Load +@ stub ADL_ApplicationProfiles_User_Unload +@ stub ADL_Audio_CurrentSampleRate_Get +@ stub ADL_CDS_UnsafeMode_Set +@ stub ADL_CV_DongleSettings_Get +@ stub ADL_CV_DongleSettings_Reset +@ stub ADL_CV_DongleSettings_Set +@ stub ADL_DFP_AllowOnlyCETimings_Get +@ stub ADL_DFP_AllowOnlyCETimings_Set +@ stub ADL_DFP_BaseAudioSupport_Get +@ stub ADL_DFP_GPUScalingEnable_Get +@ stub ADL_DFP_GPUScalingEnable_Set +@ stub ADL_DFP_HDMISupport_Get +@ stub ADL_DFP_MVPUAnalogSupport_Get +@ stub ADL_DFP_PixelFormat_Caps +@ stub ADL_DFP_PixelFormat_Get +@ stub ADL_DFP_PixelFormat_Set +@ stub ADL_DisplayScaling_Set +@ stub ADL_Display_AdapterID_Get +@ stub ADL_Display_AdjustCaps_Get +@ stub ADL_Display_AdjustmentCoherent_Get +@ stub ADL_Display_AdjustmentCoherent_Set +@ stub ADL_Display_AudioMappingInfo_Get +@ stub ADL_Display_AvivoColor_Get +@ stub ADL_Display_AvivoCurrentColor_Set +@ stub ADL_Display_AvivoDefaultColor_Set +@ stub ADL_Display_BackLight_Get +@ stub ADL_Display_BackLight_Set +@ stub ADL_Display_BezelOffsetSteppingSize_Get +@ stub ADL_Display_BezelOffset_Set +@ stub ADL_Display_BezelSupported_Validate +@ stub ADL_Display_Capabilities_Get +@ stub ADL_Display_ColorCaps_Get +@ stub ADL_Display_ColorDepth_Get +@ stub ADL_Display_ColorDepth_Set +@ stub ADL_Display_ColorTemperatureSource_Get +@ stub ADL_Display_ColorTemperatureSource_Set +@ stub ADL_Display_Color_Get +@ stub ADL_Display_Color_Set +@ stub ADL_Display_ConnectedDisplays_Get +@ stub ADL_Display_ContainerID_Get +@ stub ADL_Display_ControllerOverlayAdjustmentCaps_Get +@ stub ADL_Display_ControllerOverlayAdjustmentData_Get +@ stub ADL_Display_ControllerOverlayAdjustmentData_Set +@ stub ADL_Display_CurrentPixelClock_Get +@ stub ADL_Display_CustomizedModeListNum_Get +@ stub ADL_Display_CustomizedModeList_Get +@ stub ADL_Display_CustomizedMode_Add +@ stub ADL_Display_CustomizedMode_Delete +@ stub ADL_Display_CustomizedMode_Validate +@ stub ADL_Display_DCE_Get +@ stub ADL_Display_DCE_Set +@ stub ADL_Display_DDCBlockAccess_Get +@ stub ADL_Display_DDCInfo2_Get +@ stub ADL_Display_DDCInfo_Get +@ stub ADL_Display_Deflicker_Get +@ stub ADL_Display_Deflicker_Set +@ stub ADL_Display_DeviceConfig_Get +@ stub ADL_Display_DisplayContent_Cap +@ stub ADL_Display_DisplayContent_Get +@ stub ADL_Display_DisplayContent_Set +@ stdcall ADL_Display_DisplayInfo_Get(long long ptr long) +@ stdcall ADL_Display_DisplayMapConfig_Get(long ptr ptr ptr ptr long) +@ stub ADL_Display_DisplayMapConfig_PossibleAddAndRemove +@ stub ADL_Display_DisplayMapConfig_Set +@ stub ADL_Display_DisplayMapConfig_Validate +@ stub ADL_Display_DitherState_Get +@ stub ADL_Display_DitherState_Set +@ stub ADL_Display_Downscaling_Caps +@ stub ADL_Display_DpMstInfo_Get +@ stub ADL_Display_EdidData_Get +@ stub ADL_Display_EdidData_Set +@ stub ADL_Display_EnumDisplays_Get +@ stub ADL_Display_FilterSVideo_Get +@ stub ADL_Display_FilterSVideo_Set +@ stub ADL_Display_ForcibleDisplay_Get +@ stub ADL_Display_ForcibleDisplay_Set +@ stub ADL_Display_FormatsOverride_Get +@ stub ADL_Display_FormatsOverride_Set +@ stub ADL_Display_FreeSyncState_Get +@ stub ADL_Display_FreeSyncState_Set +@ stub ADL_Display_FreeSync_Cap +@ stub ADL_Display_GamutMapping_Get +@ stub ADL_Display_GamutMapping_Reset +@ stub ADL_Display_GamutMapping_Set +@ stub ADL_Display_Gamut_Caps +@ stub ADL_Display_Gamut_Get +@ stub ADL_Display_Gamut_Set +@ stub ADL_Display_ImageExpansion_Get +@ stub ADL_Display_ImageExpansion_Set +@ stub ADL_Display_InfoPacket_Get +@ stub ADL_Display_InfoPacket_Set +@ stub ADL_Display_LCDRefreshRateCapability_Get +@ stub ADL_Display_LCDRefreshRateOptions_Get +@ stub ADL_Display_LCDRefreshRateOptions_Set +@ stub ADL_Display_LCDRefreshRate_Get +@ stub ADL_Display_LCDRefreshRate_Set +@ stub ADL_Display_Limits_Get +@ stub ADL_Display_MVPUCaps_Get +@ stub ADL_Display_MVPUStatus_Get +@ stub ADL_Display_ModeTimingOverrideInfo_Get +@ stub ADL_Display_ModeTimingOverrideListX2_Get +@ stub ADL_Display_ModeTimingOverrideList_Get +@ stub ADL_Display_ModeTimingOverrideX2_Get +@ stub ADL_Display_ModeTimingOverride_Delete +@ stub ADL_Display_ModeTimingOverride_Get +@ stub ADL_Display_ModeTimingOverride_Set +@ stub ADL_Display_Modes_Get +@ stub ADL_Display_Modes_Set +@ stub ADL_Display_MonitorPowerState_Set +@ stub ADL_Display_NativeAUXChannel_Access +@ stub ADL_Display_NeedWorkaroundFor5Clone_Get +@ stub ADL_Display_NumberOfDisplays_Get +@ stub ADL_Display_ODClockConfig_Set +@ stub ADL_Display_ODClockInfo_Get +@ stub ADL_Display_Overlap_Set +@ stub ADL_Display_Overscan_Get +@ stub ADL_Display_Overscan_Set +@ stub ADL_Display_PixelClockAllowableRange_Set +@ stub ADL_Display_PixelClockCaps_Get +@ stub ADL_Display_PixelFormat_Get +@ stub ADL_Display_PixelFormat_Set +@ stub ADL_Display_Position_Get +@ stub ADL_Display_Position_Set +@ stub ADL_Display_PossibleMapping_Get +@ stub ADL_Display_PossibleMode_Get +@ stub ADL_Display_PowerXpressActiveGPU_Get +@ stub ADL_Display_PowerXpressActiveGPU_Set +@ stub ADL_Display_PowerXpressActvieGPUR2_Get +@ stub ADL_Display_PowerXpressVersion_Get +@ stub ADL_Display_PowerXpress_AutoSwitchConfig_Get +@ stub ADL_Display_PowerXpress_AutoSwitchConfig_Set +@ stub ADL_Display_PreservedAspectRatio_Get +@ stub ADL_Display_PreservedAspectRatio_Set +@ stub ADL_Display_Property_Get +@ stub ADL_Display_Property_Set +@ stub ADL_Display_RcDisplayAdjustment +@ stub ADL_Display_ReGammaCoefficients_Get +@ stub ADL_Display_ReGammaCoefficients_Set +@ stub ADL_Display_ReducedBlanking_Get +@ stub ADL_Display_ReducedBlanking_Set +@ stub ADL_Display_RegammaR1_Get +@ stub ADL_Display_RegammaR1_Set +@ stub ADL_Display_Regamma_Get +@ stub ADL_Display_Regamma_Set +@ stub ADL_Display_SLSGrid_Caps +@ stub ADL_Display_SLSMapConfigX2_Get +@ stub ADL_Display_SLSMapConfig_Create +@ stub ADL_Display_SLSMapConfig_Delete +@ stub ADL_Display_SLSMapConfig_Get +@ stub ADL_Display_SLSMapConfig_Rearrange +@ stub ADL_Display_SLSMapConfig_SetState +@ stub ADL_Display_SLSMapIndexList_Get +@ stub ADL_Display_SLSMapIndex_Get +@ stub ADL_Display_SLSMiddleMode_Get +@ stub ADL_Display_SLSMiddleMode_Set +@ stub ADL_Display_SLSRecords_Get +@ stub ADL_Display_Sharpness_Caps +@ stub ADL_Display_Sharpness_Get +@ stub ADL_Display_Sharpness_Info_Get +@ stub ADL_Display_Sharpness_Set +@ stub ADL_Display_Size_Get +@ stub ADL_Display_Size_Set +@ stub ADL_Display_SourceContentAttribute_Get +@ stub ADL_Display_SourceContentAttribute_Set +@ stub ADL_Display_SplitDisplay_Caps +@ stub ADL_Display_SplitDisplay_Get +@ stub ADL_Display_SplitDisplay_RestoreDesktopConfiguration +@ stub ADL_Display_SplitDisplay_Set +@ stub ADL_Display_SupportedColorDepth_Get +@ stub ADL_Display_SupportedPixelFormat_Get +@ stub ADL_Display_SwitchingCapability_Get +@ stub ADL_Display_TVCaps_Get +@ stub ADL_Display_TargetTiming_Get +@ stub ADL_Display_UnderScan_Auto_Get +@ stub ADL_Display_UnderScan_Auto_Set +@ stub ADL_Display_Underscan_Get +@ stub ADL_Display_Underscan_Set +@ stub ADL_Display_Vector_Get +@ stub ADL_Display_ViewPort_Cap +@ stub ADL_Display_ViewPort_Get +@ stub ADL_Display_ViewPort_Set +@ stub ADL_Display_WriteAndReadI2C +@ stub ADL_Display_WriteAndReadI2CLargePayload +@ stub ADL_Display_WriteAndReadI2CRev_Get +@ stub ADL_Flush_Driver_Data +@ stdcall ADL_Graphics_Platform_Get(ptr) +@ stdcall ADL_Graphics_Versions_Get(ptr) +@ stub ADL_MMD_FeatureList_Get +@ stub ADL_MMD_FeatureValuesX2_Get +@ stub ADL_MMD_FeatureValuesX2_Set +@ stub ADL_MMD_FeatureValues_Get +@ stub ADL_MMD_FeatureValues_Set +@ stub ADL_MMD_FeaturesX2_Caps +@ stub ADL_MMD_Features_Caps +@ stub ADL_MMD_VideoAdjustInfo_Get +@ stub ADL_MMD_VideoAdjustInfo_Set +@ stub ADL_MMD_VideoColor_Caps +@ stub ADL_MMD_VideoColor_Get +@ stub ADL_MMD_VideoColor_Set +@ stub ADL_MMD_Video_Caps +@ stub ADL_Main_ControlX2_Create +@ stdcall ADL_Main_Control_Create(ptr long) +@ stdcall ADL_Main_Control_Destroy() +@ stub ADL_Main_Control_GetProcAddress +@ stub ADL_Main_Control_IsFunctionValid +@ stub ADL_Main_Control_Refresh +@ stub ADL_Main_LogDebug_Set +@ stub ADL_Main_LogError_Set +@ stub ADL_Overdrive5_CurrentActivity_Get +@ stub ADL_Overdrive5_FanSpeedInfo_Get +@ stub ADL_Overdrive5_FanSpeedToDefault_Set +@ stub ADL_Overdrive5_FanSpeed_Get +@ stub ADL_Overdrive5_FanSpeed_Set +@ stub ADL_Overdrive5_ODParameters_Get +@ stub ADL_Overdrive5_ODPerformanceLevels_Get +@ stub ADL_Overdrive5_ODPerformanceLevels_Set +@ stub ADL_Overdrive5_PowerControlAbsValue_Caps +@ stub ADL_Overdrive5_PowerControlAbsValue_Get +@ stub ADL_Overdrive5_PowerControlAbsValue_Set +@ stub ADL_Overdrive5_PowerControlInfo_Get +@ stub ADL_Overdrive5_PowerControl_Caps +@ stub ADL_Overdrive5_PowerControl_Get +@ stub ADL_Overdrive5_PowerControl_Set +@ stub ADL_Overdrive5_Temperature_Get +@ stub ADL_Overdrive5_ThermalDevices_Enum +@ stub ADL_Overdrive6_AdvancedFan_Caps +@ stub ADL_Overdrive6_CapabilitiesEx_Get +@ stub ADL_Overdrive6_Capabilities_Get +@ stub ADL_Overdrive6_CurrentStatus_Get +@ stub ADL_Overdrive6_FanPWMLimitData_Get +@ stub ADL_Overdrive6_FanPWMLimitData_Set +@ stub ADL_Overdrive6_FanPWMLimitRangeInfo_Get +@ stub ADL_Overdrive6_FanSpeed_Get +@ stub ADL_Overdrive6_FanSpeed_Reset +@ stub ADL_Overdrive6_FanSpeed_Set +@ stub ADL_Overdrive6_FuzzyController_Caps +@ stub ADL_Overdrive6_MaxClockAdjust_Get +@ stub ADL_Overdrive6_PowerControlInfo_Get +@ stub ADL_Overdrive6_PowerControl_Caps +@ stub ADL_Overdrive6_PowerControl_Get +@ stub ADL_Overdrive6_PowerControl_Set +@ stub ADL_Overdrive6_StateEx_Get +@ stub ADL_Overdrive6_StateEx_Set +@ stub ADL_Overdrive6_StateInfo_Get +@ stub ADL_Overdrive6_State_Reset +@ stub ADL_Overdrive6_State_Set +@ stub ADL_Overdrive6_TargetTemperatureData_Get +@ stub ADL_Overdrive6_TargetTemperatureData_Set +@ stub ADL_Overdrive6_TargetTemperatureRangeInfo_Get +@ stub ADL_Overdrive6_Temperature_Get +@ stub ADL_Overdrive6_ThermalController_Caps +@ stub ADL_Overdrive6_ThermalLimitUnlock_Get +@ stub ADL_Overdrive6_ThermalLimitUnlock_Set +@ stub ADL_Overdrive6_VoltageControlInfo_Get +@ stub ADL_Overdrive6_VoltageControl_Get +@ stub ADL_Overdrive6_VoltageControl_Set +@ stub ADL_Overdrive_Caps +@ stub ADL_PowerXpress_AncillaryDevices_Get +@ stub ADL_PowerXpress_Config_Caps +@ stub ADL_PowerXpress_ExtendedBatteryMode_Caps +@ stub ADL_PowerXpress_ExtendedBatteryMode_Get +@ stub ADL_PowerXpress_ExtendedBatteryMode_Set +@ stub ADL_PowerXpress_LongIdleDetect_Get +@ stub ADL_PowerXpress_LongIdleDetect_Set +@ stub ADL_PowerXpress_PowerControlMode_Get +@ stub ADL_PowerXpress_PowerControlMode_Set +@ stub ADL_PowerXpress_Scheme_Get +@ stub ADL_PowerXpress_Scheme_Set +@ stub ADL_Remap +@ stub ADL_RemoteDisplay_Destroy +@ stub ADL_RemoteDisplay_Display_Acquire +@ stub ADL_RemoteDisplay_Display_Release +@ stub ADL_RemoteDisplay_Display_Release_All +@ stub ADL_RemoteDisplay_Hdcp20_Create +@ stub ADL_RemoteDisplay_Hdcp20_Destroy +@ stub ADL_RemoteDisplay_Hdcp20_Notify +@ stub ADL_RemoteDisplay_Hdcp20_Process +@ stub ADL_RemoteDisplay_IEPort_Set +@ stub ADL_RemoteDisplay_Initialize +@ stub ADL_RemoteDisplay_Nofitiation_Register +@ stub ADL_RemoteDisplay_Notification_UnRegister +@ stub ADL_RemoteDisplay_Support_Caps +@ stub ADL_RemoteDisplay_VirtualWirelessAdapter_InUse_Get +@ stub ADL_RemoteDisplay_VirtualWirelessAdapter_Info_Get +@ stub ADL_RemoteDisplay_VirtualWirelessAdapter_RadioState_Get +@ stub ADL_RemoteDisplay_VirtualWirelessAdapter_WPSSetting_Change +@ stub ADL_RemoteDisplay_VirtualWirelessAdapter_WPSSetting_Get +@ stub ADL_RemoteDisplay_WFDDeviceInfo_Get +@ stub ADL_RemoteDisplay_WFDDeviceName_Change +@ stub ADL_RemoteDisplay_WFDDevice_StatusInfo_Get +@ stub ADL_RemoteDisplay_WFDDiscover_Start +@ stub ADL_RemoteDisplay_WFDDiscover_Stop +@ stub ADL_RemoteDisplay_WFDLink_Connect +@ stub ADL_RemoteDisplay_WFDLink_Creation_Accept +@ stub ADL_RemoteDisplay_WFDLink_Disconnect +@ stub ADL_RemoteDisplay_WFDLink_WPS_Process +@ stub ADL_RemoteDisplay_WFDWDSPSettings_Set +@ stub ADL_RemoteDisplay_WirelessDisplayEnableDisable_Commit +@ stub ADL_ScreenPoint_AudioMappingInfo_Get +@ stub ADL_Stereo3D_2DPackedFormat_Set +@ stub ADL_Stereo3D_3DCursorOffset_Get +@ stub ADL_Stereo3D_3DCursorOffset_Set +@ stub ADL_Stereo3D_CurrentFormat_Get +@ stub ADL_Stereo3D_Info_Get +@ stub ADL_Stereo3D_Modes_Get +@ stub ADL_TV_Standard_Get +@ stub ADL_TV_Standard_Set +@ stub ADL_Win_IsHybridAI +@ stub ADL_Workstation_8BitGrayscale_Get +@ stub ADL_Workstation_8BitGrayscale_Set +@ stub ADL_Workstation_AdapterNumOfGLSyncConnectors_Get +@ stub ADL_Workstation_Caps +@ stub ADL_Workstation_DeepBitDepthX2_Get +@ stub ADL_Workstation_DeepBitDepthX2_Set +@ stub ADL_Workstation_DeepBitDepth_Get +@ stub ADL_Workstation_DeepBitDepth_Set +@ stub ADL_Workstation_DisplayGLSyncMode_Get +@ stub ADL_Workstation_DisplayGLSyncMode_Set +@ stub ADL_Workstation_DisplayGenlockCapable_Get +@ stub ADL_Workstation_ECCData_Get +@ stub ADL_Workstation_ECCX2_Get +@ stub ADL_Workstation_ECC_Caps +@ stub ADL_Workstation_ECC_Get +@ stub ADL_Workstation_ECC_Set +@ stub ADL_Workstation_GLSyncCounters_Get +@ stub ADL_Workstation_GLSyncGenlockConfiguration_Get +@ stub ADL_Workstation_GLSyncGenlockConfiguration_Set +@ stub ADL_Workstation_GLSyncModuleDetect_Get +@ stub ADL_Workstation_GLSyncModuleInfo_Get +@ stub ADL_Workstation_GLSyncPortState_Get +@ stub ADL_Workstation_GLSyncPortState_Set +@ stub ADL_Workstation_GLSyncSupportedTopology_Get +@ stub ADL_Workstation_GlobalEDIDPersistence_Get +@ stub ADL_Workstation_GlobalEDIDPersistence_Set +@ stub ADL_Workstation_LoadBalancing_Caps +@ stub ADL_Workstation_LoadBalancing_Get +@ stub ADL_Workstation_LoadBalancing_Set +@ stub ADL_Workstation_RAS_Get_Error_Counts +@ stub ADL_Workstation_RAS_Get_Features +@ stub ADL_Workstation_RAS_Reset_Error_Counts +@ stub ADL_Workstation_RAS_Set_Features +@ stub ADL_Workstation_SDISegmentList_Get +@ stub ADL_Workstation_SDI_Caps +@ stub ADL_Workstation_SDI_Get +@ stub ADL_Workstation_SDI_Set +@ stub ADL_Workstation_Stereo_Get +@ stub ADL_Workstation_Stereo_Set +@ stub ADL_Workstation_UnsupportedDisplayModes_Enable +@ stub AmdPowerXpressRequestHighPerformance +@ stub Desktop_Detach +@ stub Send +@ stub SendX2 diff --git a/dlls/atiadlxx/atiadlxx_main.c b/dlls/atiadlxx/atiadlxx_main.c new file mode 100644 index 00000000000..21dfbe71096 --- /dev/null +++ wine/dlls/atiadlxx/atiadlxx_main.c @@ -0,0 +1,493 @@ +/* Headers: https://github.com/GPUOpen-LibrariesAndSDKs/display-library */ + +#include +#include +#include + +#define COBJMACROS +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" +#include "initguid.h" +#include "wine/debug.h" + +#include "dxgi.h" + +#define MAX_GPUS 64 +#define VENDOR_AMD 0x1002 + +#define ADL_OK 0 +#define ADL_ERR -1 +#define ADL_ERR_INVALID_PARAM -3 +#define ADL_ERR_INVALID_ADL_IDX -5 +#define ADL_ERR_NOT_SUPPORTED -8 +#define ADL_ERR_NULL_POINTER -9 + +#define ADL_DISPLAY_DISPLAYINFO_DISPLAYCONNECTED 0x00000001 +#define ADL_DISPLAY_DISPLAYINFO_DISPLAYMAPPED 0x00000002 +#define ADL_DISPLAY_DISPLAYINFO_MASK 0x31fff + +#define ADL_ASIC_DISCRETE (1 << 0) +#define ADL_ASIC_MASK 0xAF + +enum ADLPlatForm +{ + GRAPHICS_PLATFORM_DESKTOP = 0, + GRAPHICS_PLATFORM_MOBILE = 1 +}; +#define GRAPHICS_PLATFORM_UNKNOWN -1 + + +static IDXGIFactory *dxgi_factory; + +WINE_DEFAULT_DEBUG_CHANNEL(atiadlxx); + +BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved) +{ + TRACE("(%p, %u, %p)\n", instance, reason, reserved); + + switch (reason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(instance); + break; + } + + return TRUE; +} + +typedef void *(CALLBACK *ADL_MAIN_MALLOC_CALLBACK)(int); +typedef void *ADL_CONTEXT_HANDLE; + +ADL_MAIN_MALLOC_CALLBACK adl_malloc; +#define ADL_MAX_PATH 256 + +typedef struct ADLVersionsInfo +{ + char strDriverVer[ADL_MAX_PATH]; + char strCatalystVersion[ADL_MAX_PATH]; + char strCatalystWebLink[ADL_MAX_PATH]; +} ADLVersionsInfo, *LPADLVersionsInfo; + +typedef struct ADLVersionsInfoX2 +{ + char strDriverVer[ADL_MAX_PATH]; + char strCatalystVersion[ADL_MAX_PATH]; + char strCrimsonVersion[ADL_MAX_PATH]; + char strCatalystWebLink[ADL_MAX_PATH]; +} ADLVersionsInfoX2, *LPADLVersionsInfoX2; + +typedef struct ADLAdapterInfo { + int iSize; + int iAdapterIndex; + char strUDID[ADL_MAX_PATH]; + int iBusNumber; + int iDeviceNumber; + int iFunctionNumber; + int iVendorID; + char strAdapterName[ADL_MAX_PATH]; + char strDisplayName[ADL_MAX_PATH]; + int iPresent; + int iExist; + char strDriverPath[ADL_MAX_PATH]; + char strDriverPathExt[ADL_MAX_PATH]; + char strPNPString[ADL_MAX_PATH]; + int iOSDisplayIndex; +} ADLAdapterInfo, *LPADLAdapterInfo; + +typedef struct ADLDisplayID +{ + int iDisplayLogicalIndex; + int iDisplayPhysicalIndex; + int iDisplayLogicalAdapterIndex; + int iDisplayPhysicalAdapterIndex; +} ADLDisplayID, *LPADLDisplayID; + +typedef struct ADLDisplayInfo +{ + ADLDisplayID displayID; + int iDisplayControllerIndex; + char strDisplayName[ADL_MAX_PATH]; + char strDisplayManufacturerName[ADL_MAX_PATH]; + int iDisplayType; + int iDisplayOutputType; + int iDisplayConnector; + int iDisplayInfoMask; + int iDisplayInfoValue; +} ADLDisplayInfo, *LPADLDisplayInfo; + +typedef struct ADLCrossfireComb +{ + int iNumLinkAdapter; + int iAdaptLink[3]; +} ADLCrossfireComb; + +typedef struct ADLCrossfireInfo +{ + int iErrorCode; + int iState; + int iSupported; +} ADLCrossfireInfo; + +typedef struct ADLMemoryInfo +{ + long long iMemorySize; + char strMemoryType[ADL_MAX_PATH]; + long long iMemoryBandwidth; +} ADLMemoryInfo, *LPADLMemoryInfo; + +typedef struct ADLDisplayTarget +{ + ADLDisplayID displayID; + int iDisplayMapIndex; + int iDisplayTargetMask; + int iDisplayTargetValue; +} ADLDisplayTarget, *LPADLDisplayTarget; + +typedef struct ADLMode +{ + int iAdapterIndex; + ADLDisplayID displayID; + int iXPos; + int iYPos; + int iXRes; + int iYRes; + int iColourDepth; + float fRefreshRate; + int iOrientation; + int iModeFlag; + int iModeMask; + int iModeValue; +} ADLMode, *LPADLMode; + +typedef struct ADLDisplayMap +{ + int iDisplayMapIndex; + ADLMode displayMode; + int iNumDisplayTarget; + int iFirstDisplayTargetArrayIndex; + int iDisplayMapMask; + int iDisplayMapValue; +} ADLDisplayMap, *LPADLDisplayMap; + +static const ADLVersionsInfo version = { + "22.20.19.16-221003a-384125E-AMD-Software-Adrenalin-Edition", + "", + "http://support.amd.com/drivers/xml/driver_09_us.xml", +}; + +static const ADLVersionsInfoX2 version2 = { + "22.20.19.16-221003a-384125E-AMD-Software-Adrenalin-Edition", + "", + "22.10.1", + "http://support.amd.com/drivers/xml/driver_09_us.xml", +}; + +int WINAPI ADL2_Main_Control_Create(ADL_MAIN_MALLOC_CALLBACK cb, int arg, ADL_CONTEXT_HANDLE *ptr) +{ + FIXME("cb %p, arg %d, ptr %p stub!\n", cb, arg, ptr); + return ADL_OK; +} + +int WINAPI ADL_Main_Control_Create(ADL_MAIN_MALLOC_CALLBACK cb, int arg) +{ + FIXME("cb %p, arg %d stub!\n", cb, arg); + adl_malloc = cb; + + + if (SUCCEEDED(CreateDXGIFactory(&IID_IDXGIFactory, (void**) &dxgi_factory))) + return ADL_OK; + else + return ADL_ERR; +} + +int WINAPI ADL_Main_Control_Destroy(void) +{ + FIXME("stub!\n"); + + if (dxgi_factory != NULL) + IUnknown_Release(dxgi_factory); + + return ADL_OK; +} + +int WINAPI ADL2_Adapter_NumberOfAdapters_Get(ADL_CONTEXT_HANDLE *ptr, int *count) +{ + FIXME("ptr %p, count %p stub!\n", ptr, count); + + *count = 0; + + return ADL_OK; +} + +int WINAPI ADL2_Graphics_VersionsX2_Get(ADL_CONTEXT_HANDLE *ptr, ADLVersionsInfoX2 *ver) +{ + FIXME("ptr %p, ver %p stub!\n", ptr, ver); + memcpy(ver, &version2, sizeof(version2)); + return ADL_OK; +} + +int WINAPI ADL_Graphics_Versions_Get(ADLVersionsInfo *ver) +{ + FIXME("ver %p stub!\n", ver); + memcpy(ver, &version, sizeof(version)); + return ADL_OK; +} + +int WINAPI ADL_Adapter_NumberOfAdapters_Get(int *count) +{ + IDXGIAdapter *adapter; + + FIXME("count %p stub!\n", count); + + *count = 0; + while (SUCCEEDED(IDXGIFactory_EnumAdapters(dxgi_factory, *count, &adapter))) + { + (*count)++; + IUnknown_Release(adapter); + } + + TRACE("*count = %d\n", *count); + return ADL_OK; +} + +static int get_adapter_desc(int adapter_index, DXGI_ADAPTER_DESC *desc) +{ + IDXGIAdapter *adapter; + HRESULT hr; + + if (FAILED(IDXGIFactory_EnumAdapters(dxgi_factory, adapter_index, &adapter))) + return ADL_ERR; + + hr = IDXGIAdapter_GetDesc(adapter, desc); + + IUnknown_Release(adapter); + + return SUCCEEDED(hr) ? ADL_OK : ADL_ERR; +} + +/* yep, seriously */ +static int convert_vendor_id(int id) +{ + char str[16]; + snprintf(str, ARRAY_SIZE(str), "%x", id); + return atoi(str); +} + +int WINAPI ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo *adapters, int input_size) +{ + int count, i; + DXGI_ADAPTER_DESC adapter_desc; + + FIXME("adapters %p, input_size %d, stub!\n", adapters, input_size); + + ADL_Adapter_NumberOfAdapters_Get(&count); + + if (!adapters) return ADL_ERR_INVALID_PARAM; + if (input_size != count * sizeof(ADLAdapterInfo)) return ADL_ERR_INVALID_PARAM; + + memset(adapters, 0, input_size); + + for (i = 0; i < count; i++) + { + adapters[i].iSize = sizeof(ADLAdapterInfo); + adapters[i].iAdapterIndex = i; + + if (get_adapter_desc(i, &adapter_desc) != ADL_OK) + return ADL_ERR; + + adapters[i].iVendorID = convert_vendor_id(adapter_desc.VendorId); + } + + return ADL_OK; +} + +int WINAPI ADL_Display_DisplayInfo_Get(int adapter_index, int *num_displays, ADLDisplayInfo **info, int force_detect) +{ + IDXGIAdapter *adapter; + IDXGIOutput *output; + int i; + + FIXME("adapter %d, num_displays %p, info %p stub!\n", adapter_index, num_displays, info); + + if (info == NULL || num_displays == NULL) return ADL_ERR_NULL_POINTER; + + if (FAILED(IDXGIFactory_EnumAdapters(dxgi_factory, adapter_index, &adapter))) + return ADL_ERR_INVALID_PARAM; + + *num_displays = 0; + + while (SUCCEEDED(IDXGIAdapter_EnumOutputs(adapter, *num_displays, &output))) + { + (*num_displays)++; + IUnknown_Release(output); + } + + IUnknown_Release(adapter); + + if (*num_displays == 0) + return ADL_OK; + + *info = adl_malloc(*num_displays * sizeof(**info)); + memset(*info, 0, *num_displays * sizeof(**info)); + + for (i = 0; i < *num_displays; i++) + { + (*info)[i].displayID.iDisplayLogicalIndex = i; + (*info)[i].iDisplayInfoValue = ADL_DISPLAY_DISPLAYINFO_DISPLAYCONNECTED | ADL_DISPLAY_DISPLAYINFO_DISPLAYMAPPED; + (*info)[i].iDisplayInfoMask = (*info)[i].iDisplayInfoValue; + } + + return ADL_OK; +} + +int WINAPI ADL_Adapter_Crossfire_Caps(int adapter_index, int *preffered, int *num_comb, ADLCrossfireComb** comb) +{ + FIXME("adapter %d, preffered %p, num_comb %p, comb %p stub!\n", adapter_index, preffered, num_comb, comb); + return ADL_ERR; +} + +int WINAPI ADL_Adapter_Crossfire_Get(int adapter_index, ADLCrossfireComb *comb, ADLCrossfireInfo *info) +{ + FIXME("adapter %d, comb %p, info %p, stub!\n", adapter_index, comb, info); + return ADL_ERR; +} + +int WINAPI ADL_Adapter_ASICFamilyType_Get(int adapter_index, int *asic_type, int *valids) +{ + DXGI_ADAPTER_DESC adapter_desc; + + FIXME("adapter %d, asic_type %p, valids %p, stub!\n", adapter_index, asic_type, valids); + + if (asic_type == NULL || valids == NULL) + return ADL_ERR_NULL_POINTER; + + if (get_adapter_desc(adapter_index, &adapter_desc) != ADL_OK) + return ADL_ERR_INVALID_ADL_IDX; + + if (adapter_desc.VendorId != VENDOR_AMD) + return ADL_ERR_NOT_SUPPORTED; + + *asic_type = ADL_ASIC_DISCRETE; + *valids = ADL_ASIC_MASK; + + return ADL_OK; +} + +static int get_max_clock(const char *clock, int default_value) +{ + char path[MAX_PATH], line[256]; + FILE *file; + int drm_card, value = 0; + + for (drm_card = 0; drm_card < MAX_GPUS; drm_card++) + { + sprintf(path, "/sys/class/drm/card%d/device/pp_dpm_%s", drm_card, clock); + file = fopen(path, "r"); + + if (file == NULL) + continue; + + while (fgets(line, sizeof(line), file) != NULL) + { + char *number; + + number = strchr(line, ' '); + if (number == NULL) + { + WARN("pp_dpm_%s file has unexpected format\n", clock); + break; + } + + number++; + value = max(strtol(number, NULL, 0), value); + } + } + + if (value != 0) + return value; + + return default_value; +} + +/* documented in the "Linux Specific APIs" section, present and used on Windows */ +/* the name and documentation suggests that this returns current freqs, but it's actually max */ +int WINAPI ADL_Adapter_ObservedClockInfo_Get(int adapter_index, int *core_clock, int *memory_clock) +{ + DXGI_ADAPTER_DESC adapter_desc; + + FIXME("adapter %d, core_clock %p, memory_clock %p, stub!\n", adapter_index, core_clock, memory_clock); + + if (core_clock == NULL || memory_clock == NULL) return ADL_ERR; + if (get_adapter_desc(adapter_index, &adapter_desc) != ADL_OK) return ADL_ERR; + if (adapter_desc.VendorId != VENDOR_AMD) return ADL_ERR_INVALID_ADL_IDX; + + /* default values based on RX580 */ + *core_clock = get_max_clock("sclk", 1350); + *memory_clock = get_max_clock("mclk", 2000); + + TRACE("*core_clock: %i, *memory_clock %i\n", *core_clock, *memory_clock); + + return ADL_OK; +} + +/* documented in the "Linux Specific APIs" section, present and used on Windows */ +int WINAPI ADL_Adapter_MemoryInfo_Get(int adapter_index, ADLMemoryInfo *mem_info) +{ + DXGI_ADAPTER_DESC adapter_desc; + + FIXME("adapter %d, mem_info %p stub!\n", adapter_index, mem_info); + + if (mem_info == NULL) return ADL_ERR_NULL_POINTER; + if (get_adapter_desc(adapter_index, &adapter_desc) != ADL_OK) return ADL_ERR_INVALID_ADL_IDX; + if (adapter_desc.VendorId != VENDOR_AMD) return ADL_ERR; + + mem_info->iMemorySize = adapter_desc.DedicatedVideoMemory; + mem_info->iMemoryBandwidth = 256000; /* not exposed on Linux, probably needs a lookup table */ + + TRACE("iMemoryBandwidth %s, iMemorySize %s\n", + wine_dbgstr_longlong(mem_info->iMemoryBandwidth), + wine_dbgstr_longlong(mem_info->iMemorySize)); + return ADL_OK; +} + +int WINAPI ADL_Graphics_Platform_Get(int *platform) +{ + DXGI_ADAPTER_DESC adapter_desc; + int count, i; + + FIXME("platform %p, stub!\n", platform); + + *platform = GRAPHICS_PLATFORM_UNKNOWN; + + ADL_Adapter_NumberOfAdapters_Get(&count); + + for (i = 0; i < count; i ++) + { + if (get_adapter_desc(i, &adapter_desc) != ADL_OK) + continue; + + if (adapter_desc.VendorId == VENDOR_AMD) + *platform = GRAPHICS_PLATFORM_DESKTOP; + } + + /* NOTE: The real value can be obtained by doing: + * 1. ioctl(DRM_AMDGPU_INFO) with AMDGPU_INFO_DEV_INFO - dev_info.ids_flags & AMDGPU_IDS_FLAGS_FUSION + * 2. VkPhysicalDeviceType() if we ever want to use Vulkan directly + */ + + return ADL_OK; +} + + +int WINAPI ADL_Display_DisplayMapConfig_Get(int adapter_index, int *display_map_count, ADLDisplayMap **display_maps, + int *display_target_count, ADLDisplayTarget **display_targets, int options) +{ + FIXME("adapter_index %d, display_map_count %p, display_maps %p, " + "display_target_count %p, display_targets %p, options %d stub.\n", + adapter_index, display_map_count, display_maps, display_target_count, + display_targets, options); + + return ADL_ERR; +} -- 2.39.2 (Apple Git-144) diff --git a/dlls/windows.gaming.input/Makefile.in b/dlls/windows.gaming.input/Makefile.in index 1e0ce5c360c..3ec3dd0d864 100644 --- wine/dlls/windows.gaming.input/Makefile.in +++ wine/dlls/windows.gaming.input/Makefile.in @@ -2,13 +2,19 @@ MODULE = windows.gaming.input.dll IMPORTS = combase uuid user32 dinput8 setupapi hid C_SRCS = \ + async.c \ + condition_effect.c \ + constant_effect.c \ controller.c \ event_handlers.c \ + force_feedback.c \ gamepad.c \ main.c \ manager.c \ + periodic_effect.c \ provider.c \ racing_wheel.c \ + ramp_effect.c \ vector.c IDL_SRCS = \ diff --git a/dlls/windows.gaming.input/async.c b/dlls/windows.gaming.input/async.c new file mode 100644 index 00000000000..862886195ba --- /dev/null +++ wine/dlls/windows.gaming.input/async.c @@ -0,0 +1,647 @@ +/* WinRT Windows.Gaming.Input implementation + * + * Copyright 2022 Bernhard Kölbl for CodeWeavers + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "private.h" +#include "provider.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(input); + +#define Closed 4 +#define HANDLER_NOT_SET ((void *)~(ULONG_PTR)0) + +struct async_info +{ + IWineAsyncInfoImpl IWineAsyncInfoImpl_iface; + IAsyncInfo IAsyncInfo_iface; + IInspectable *IInspectable_outer; + LONG ref; + + async_operation_callback callback; + TP_WORK *async_run_work; + IUnknown *invoker; + IUnknown *param; + + CRITICAL_SECTION cs; + IWineAsyncOperationCompletedHandler *handler; + PROPVARIANT result; + AsyncStatus status; + HRESULT hr; +}; + +static inline struct async_info *impl_from_IWineAsyncInfoImpl( IWineAsyncInfoImpl *iface ) +{ + return CONTAINING_RECORD( iface, struct async_info, IWineAsyncInfoImpl_iface ); +} + +static HRESULT WINAPI async_impl_QueryInterface( IWineAsyncInfoImpl *iface, REFIID iid, void **out ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IWineAsyncInfoImpl )) + { + IInspectable_AddRef( (*out = &impl->IWineAsyncInfoImpl_iface) ); + return S_OK; + } + + if (IsEqualGUID( iid, &IID_IAsyncInfo )) + { + IInspectable_AddRef( (*out = &impl->IAsyncInfo_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI async_impl_AddRef( IWineAsyncInfoImpl *iface ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI async_impl_Release( IWineAsyncInfoImpl *iface ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) + { + if (impl->handler && impl->handler != HANDLER_NOT_SET) IWineAsyncOperationCompletedHandler_Release( impl->handler ); + IAsyncInfo_Close( &impl->IAsyncInfo_iface ); + if (impl->param) IUnknown_Release( impl->param ); + if (impl->invoker) IUnknown_Release( impl->invoker ); + impl->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection( &impl->cs ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI async_impl_put_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler *handler ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, handler %p.\n", iface, handler ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + else if (impl->handler != HANDLER_NOT_SET) hr = E_ILLEGAL_DELEGATE_ASSIGNMENT; + else if ((impl->handler = handler)) + { + IWineAsyncOperationCompletedHandler_AddRef( impl->handler ); + + if (impl->status > Started) + { + IInspectable *operation = impl->IInspectable_outer; + AsyncStatus status = impl->status; + impl->handler = NULL; /* Prevent concurrent invoke. */ + LeaveCriticalSection( &impl->cs ); + + IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); + IWineAsyncOperationCompletedHandler_Release( handler ); + + return S_OK; + } + } + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_impl_get_Completed( IWineAsyncInfoImpl *iface, IWineAsyncOperationCompletedHandler **handler ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, handler %p.\n", iface, handler ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + if (impl->handler == NULL || impl->handler == HANDLER_NOT_SET) *handler = NULL; + else IWineAsyncOperationCompletedHandler_AddRef( (*handler = impl->handler) ); + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_impl_get_Result( IWineAsyncInfoImpl *iface, PROPVARIANT *result ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + HRESULT hr = E_ILLEGAL_METHOD_CALL; + + TRACE( "iface %p, result %p.\n", iface, result ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Completed || impl->status == Error) + { + PropVariantCopy( result, &impl->result ); + hr = impl->hr; + } + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_impl_Start( IWineAsyncInfoImpl *iface ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + + TRACE( "iface %p.\n", iface ); + + /* keep the async alive in the callback */ + IInspectable_AddRef( impl->IInspectable_outer ); + SubmitThreadpoolWork( impl->async_run_work ); + + return S_OK; +} + +static const struct IWineAsyncInfoImplVtbl async_impl_vtbl = +{ + /* IUnknown methods */ + async_impl_QueryInterface, + async_impl_AddRef, + async_impl_Release, + /* IWineAsyncInfoImpl */ + async_impl_put_Completed, + async_impl_get_Completed, + async_impl_get_Result, + async_impl_Start, +}; + +DEFINE_IINSPECTABLE_OUTER( async_info, IAsyncInfo, struct async_info, IInspectable_outer ) + +static HRESULT WINAPI async_info_get_Id( IAsyncInfo *iface, UINT32 *id ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, id %p.\n", iface, id ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + *id = 1; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_get_Status( IAsyncInfo *iface, AsyncStatus *status ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, status %p.\n", iface, status ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + *status = impl->status; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_get_ErrorCode( IAsyncInfo *iface, HRESULT *error_code ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p, error_code %p.\n", iface, error_code ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) *error_code = hr = E_ILLEGAL_METHOD_CALL; + else *error_code = impl->hr; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_Cancel( IAsyncInfo *iface ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p.\n", iface ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Closed) hr = E_ILLEGAL_METHOD_CALL; + else if (impl->status == Started) impl->status = Canceled; + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI async_info_Close( IAsyncInfo *iface ) +{ + struct async_info *impl = impl_from_IAsyncInfo( iface ); + HRESULT hr = S_OK; + + TRACE( "iface %p.\n", iface ); + + EnterCriticalSection( &impl->cs ); + if (impl->status == Started) + hr = E_ILLEGAL_STATE_CHANGE; + else if (impl->status != Closed) + { + CloseThreadpoolWork( impl->async_run_work ); + impl->async_run_work = NULL; + impl->status = Closed; + } + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static const struct IAsyncInfoVtbl async_info_vtbl = +{ + /* IUnknown methods */ + async_info_QueryInterface, + async_info_AddRef, + async_info_Release, + /* IInspectable methods */ + async_info_GetIids, + async_info_GetRuntimeClassName, + async_info_GetTrustLevel, + /* IAsyncInfo */ + async_info_get_Id, + async_info_get_Status, + async_info_get_ErrorCode, + async_info_Cancel, + async_info_Close, +}; + +static void CALLBACK async_info_callback( TP_CALLBACK_INSTANCE *instance, void *iface, TP_WORK *work ) +{ + struct async_info *impl = impl_from_IWineAsyncInfoImpl( iface ); + IInspectable *operation = impl->IInspectable_outer; + PROPVARIANT result; + HRESULT hr; + + hr = impl->callback( impl->invoker, impl->param, &result ); + + EnterCriticalSection( &impl->cs ); + if (impl->status != Closed) impl->status = FAILED(hr) ? Error : Completed; + PropVariantCopy( &impl->result, &result ); + impl->hr = hr; + + if (impl->handler != NULL && impl->handler != HANDLER_NOT_SET) + { + IWineAsyncOperationCompletedHandler *handler = impl->handler; + AsyncStatus status = impl->status; + impl->handler = NULL; /* Prevent concurrent invoke. */ + LeaveCriticalSection( &impl->cs ); + + IWineAsyncOperationCompletedHandler_Invoke( handler, operation, status ); + IWineAsyncOperationCompletedHandler_Release( handler ); + } + else LeaveCriticalSection( &impl->cs ); + + /* release refcount acquired in Start */ + IInspectable_Release( operation ); + + PropVariantClear( &result ); +} + +static HRESULT async_info_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, + IInspectable *outer, IWineAsyncInfoImpl **out ) +{ + struct async_info *impl; + + if (!(impl = calloc( 1, sizeof(struct async_info) ))) return E_OUTOFMEMORY; + impl->IWineAsyncInfoImpl_iface.lpVtbl = &async_impl_vtbl; + impl->IAsyncInfo_iface.lpVtbl = &async_info_vtbl; + impl->IInspectable_outer = outer; + impl->ref = 1; + + impl->callback = callback; + impl->handler = HANDLER_NOT_SET; + impl->status = Started; + if (!(impl->async_run_work = CreateThreadpoolWork( async_info_callback, &impl->IWineAsyncInfoImpl_iface, NULL ))) + return HRESULT_FROM_WIN32( GetLastError() ); + + if ((impl->invoker = invoker)) IUnknown_AddRef( impl->invoker ); + if ((impl->param = param)) IUnknown_AddRef( impl->param ); + + InitializeCriticalSection( &impl->cs ); + impl->cs.DebugInfo->Spare[0] = (DWORD_PTR)( __FILE__ ": async_info.cs" ); + + *out = &impl->IWineAsyncInfoImpl_iface; + return S_OK; +} + +struct async_bool +{ + IAsyncOperation_boolean IAsyncOperation_boolean_iface; + IWineAsyncInfoImpl *IWineAsyncInfoImpl_inner; + LONG ref; +}; + +static inline struct async_bool *impl_from_IAsyncOperation_boolean( IAsyncOperation_boolean *iface ) +{ + return CONTAINING_RECORD( iface, struct async_bool, IAsyncOperation_boolean_iface ); +} + +static HRESULT WINAPI async_bool_QueryInterface( IAsyncOperation_boolean *iface, REFIID iid, void **out ) +{ + struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IAsyncOperation_boolean )) + { + IInspectable_AddRef( (*out = &impl->IAsyncOperation_boolean_iface) ); + return S_OK; + } + + return IWineAsyncInfoImpl_QueryInterface( impl->IWineAsyncInfoImpl_inner, iid, out ); +} + +static ULONG WINAPI async_bool_AddRef( IAsyncOperation_boolean *iface ) +{ + struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI async_bool_Release( IAsyncOperation_boolean *iface ) +{ + struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) + { + /* guard against re-entry if inner releases an outer iface */ + InterlockedIncrement( &impl->ref ); + IWineAsyncInfoImpl_Release( impl->IWineAsyncInfoImpl_inner ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI async_bool_GetIids( IAsyncOperation_boolean *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI async_bool_GetRuntimeClassName( IAsyncOperation_boolean *iface, HSTRING *class_name ) +{ + return WindowsCreateString( L"Windows.Foundation.IAsyncOperation`1", + ARRAY_SIZE(L"Windows.Foundation.IAsyncOperation`1"), + class_name ); +} + +static HRESULT WINAPI async_bool_GetTrustLevel( IAsyncOperation_boolean *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI async_bool_put_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean *bool_handler ) +{ + IWineAsyncOperationCompletedHandler *handler = (IWineAsyncOperationCompletedHandler *)bool_handler; + struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); + TRACE( "iface %p, handler %p.\n", iface, handler ); + return IWineAsyncInfoImpl_put_Completed( impl->IWineAsyncInfoImpl_inner, (IWineAsyncOperationCompletedHandler *)handler ); +} + +static HRESULT WINAPI async_bool_get_Completed( IAsyncOperation_boolean *iface, IAsyncOperationCompletedHandler_boolean **bool_handler ) +{ + IWineAsyncOperationCompletedHandler **handler = (IWineAsyncOperationCompletedHandler **)bool_handler; + struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); + TRACE( "iface %p, handler %p.\n", iface, handler ); + return IWineAsyncInfoImpl_get_Completed( impl->IWineAsyncInfoImpl_inner, (IWineAsyncOperationCompletedHandler **)handler ); +} + +static HRESULT WINAPI async_bool_GetResults( IAsyncOperation_boolean *iface, BOOLEAN *results ) +{ + struct async_bool *impl = impl_from_IAsyncOperation_boolean( iface ); + PROPVARIANT result = {.vt = VT_BOOL}; + HRESULT hr; + + TRACE( "iface %p, results %p.\n", iface, results ); + + hr = IWineAsyncInfoImpl_get_Result( impl->IWineAsyncInfoImpl_inner, &result ); + + *results = result.boolVal; + PropVariantClear( &result ); + return hr; +} + +static const struct IAsyncOperation_booleanVtbl async_bool_vtbl = +{ + /* IUnknown methods */ + async_bool_QueryInterface, + async_bool_AddRef, + async_bool_Release, + /* IInspectable methods */ + async_bool_GetIids, + async_bool_GetRuntimeClassName, + async_bool_GetTrustLevel, + /* IAsyncOperation */ + async_bool_put_Completed, + async_bool_get_Completed, + async_bool_GetResults, +}; + +HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, + IAsyncOperation_boolean **out ) +{ + struct async_bool *impl; + HRESULT hr; + + *out = NULL; + if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; + impl->IAsyncOperation_boolean_iface.lpVtbl = &async_bool_vtbl; + impl->ref = 1; + + if (FAILED(hr = async_info_create( invoker, param, callback, (IInspectable *)&impl->IAsyncOperation_boolean_iface, &impl->IWineAsyncInfoImpl_inner )) || + FAILED(hr = IWineAsyncInfoImpl_Start( impl->IWineAsyncInfoImpl_inner ))) + { + if (impl->IWineAsyncInfoImpl_inner) IWineAsyncInfoImpl_Release( impl->IWineAsyncInfoImpl_inner ); + free( impl ); + return hr; + } + + *out = &impl->IAsyncOperation_boolean_iface; + TRACE( "created IAsyncOperation_boolean %p\n", *out ); + return S_OK; +} + +struct async_result +{ + IAsyncOperation_ForceFeedbackLoadEffectResult IAsyncOperation_ForceFeedbackLoadEffectResult_iface; + IWineAsyncInfoImpl *IWineAsyncInfoImpl_inner; + LONG ref; +}; + +static inline struct async_result *impl_from_IAsyncOperation_ForceFeedbackLoadEffectResult( IAsyncOperation_ForceFeedbackLoadEffectResult *iface ) +{ + return CONTAINING_RECORD( iface, struct async_result, IAsyncOperation_ForceFeedbackLoadEffectResult_iface ); +} + +static HRESULT WINAPI async_result_QueryInterface( IAsyncOperation_ForceFeedbackLoadEffectResult *iface, REFIID iid, void **out ) +{ + struct async_result *impl = impl_from_IAsyncOperation_ForceFeedbackLoadEffectResult( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IAsyncOperation_ForceFeedbackLoadEffectResult )) + { + IInspectable_AddRef( (*out = &impl->IAsyncOperation_ForceFeedbackLoadEffectResult_iface) ); + return S_OK; + } + + return IWineAsyncInfoImpl_QueryInterface( impl->IWineAsyncInfoImpl_inner, iid, out ); +} + +static ULONG WINAPI async_result_AddRef( IAsyncOperation_ForceFeedbackLoadEffectResult *iface ) +{ + struct async_result *impl = impl_from_IAsyncOperation_ForceFeedbackLoadEffectResult( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI async_result_Release( IAsyncOperation_ForceFeedbackLoadEffectResult *iface ) +{ + struct async_result *impl = impl_from_IAsyncOperation_ForceFeedbackLoadEffectResult( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p, ref %lu.\n", iface, ref ); + + if (!ref) + { + /* guard against re-entry if inner releases an outer iface */ + InterlockedIncrement( &impl->ref ); + IWineAsyncInfoImpl_Release( impl->IWineAsyncInfoImpl_inner ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI async_result_GetIids( IAsyncOperation_ForceFeedbackLoadEffectResult *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI async_result_GetRuntimeClassName( IAsyncOperation_ForceFeedbackLoadEffectResult *iface, HSTRING *class_name ) +{ + return WindowsCreateString( L"Windows.Foundation.IAsyncOperation`1", + ARRAY_SIZE(L"Windows.Foundation.IAsyncOperation`1"), + class_name ); +} + +static HRESULT WINAPI async_result_GetTrustLevel( IAsyncOperation_ForceFeedbackLoadEffectResult *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI async_result_put_Completed( IAsyncOperation_ForceFeedbackLoadEffectResult *iface, IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult *handler ) +{ + struct async_result *impl = impl_from_IAsyncOperation_ForceFeedbackLoadEffectResult( iface ); + TRACE( "iface %p, handler %p.\n", iface, handler ); + return IWineAsyncInfoImpl_put_Completed( impl->IWineAsyncInfoImpl_inner, (IWineAsyncOperationCompletedHandler *)handler ); +} + +static HRESULT WINAPI async_result_get_Completed( IAsyncOperation_ForceFeedbackLoadEffectResult *iface, IAsyncOperationCompletedHandler_ForceFeedbackLoadEffectResult **handler ) +{ + struct async_result *impl = impl_from_IAsyncOperation_ForceFeedbackLoadEffectResult( iface ); + TRACE( "iface %p, handler %p.\n", iface, handler ); + return IWineAsyncInfoImpl_get_Completed( impl->IWineAsyncInfoImpl_inner, (IWineAsyncOperationCompletedHandler **)handler ); +} + +static HRESULT WINAPI async_result_GetResults( IAsyncOperation_ForceFeedbackLoadEffectResult *iface, ForceFeedbackLoadEffectResult *results ) +{ + struct async_result *impl = impl_from_IAsyncOperation_ForceFeedbackLoadEffectResult( iface ); + PROPVARIANT result = {.vt = VT_UI4}; + HRESULT hr; + + TRACE( "iface %p, results %p.\n", iface, results ); + + hr = IWineAsyncInfoImpl_get_Result( impl->IWineAsyncInfoImpl_inner, &result ); + + *results = result.ulVal; + PropVariantClear( &result ); + return hr; +} + +static const struct IAsyncOperation_ForceFeedbackLoadEffectResultVtbl async_result_vtbl = +{ + /* IUnknown methods */ + async_result_QueryInterface, + async_result_AddRef, + async_result_Release, + /* IInspectable methods */ + async_result_GetIids, + async_result_GetRuntimeClassName, + async_result_GetTrustLevel, + /* IAsyncOperation */ + async_result_put_Completed, + async_result_get_Completed, + async_result_GetResults, +}; + +HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, + IAsyncOperation_ForceFeedbackLoadEffectResult **out ) +{ + struct async_result *impl; + HRESULT hr; + + *out = NULL; + if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; + impl->IAsyncOperation_ForceFeedbackLoadEffectResult_iface.lpVtbl = &async_result_vtbl; + impl->ref = 1; + + if (FAILED(hr = async_info_create( invoker, param, callback, (IInspectable *)&impl->IAsyncOperation_ForceFeedbackLoadEffectResult_iface, &impl->IWineAsyncInfoImpl_inner )) || + FAILED(hr = IWineAsyncInfoImpl_Start( impl->IWineAsyncInfoImpl_inner ))) + { + if (impl->IWineAsyncInfoImpl_inner) IWineAsyncInfoImpl_Release( impl->IWineAsyncInfoImpl_inner ); + free( impl ); + return hr; + } + + *out = &impl->IAsyncOperation_ForceFeedbackLoadEffectResult_iface; + TRACE( "created IAsyncOperation_ForceFeedbackLoadEffectResult %p\n", *out ); + return S_OK; +} diff --git a/dlls/windows.gaming.input/classes.idl b/dlls/windows.gaming.input/classes.idl index ca3bd5d8dd7..3172def88f5 100644 --- wine/dlls/windows.gaming.input/classes.idl +++ wine/dlls/windows.gaming.input/classes.idl @@ -29,6 +29,7 @@ import "asyncinfo.idl"; import "eventtoken.idl"; import "windowscontracts.idl"; import "windows.foundation.idl"; +import "windows.foundation.numerics.idl"; import "windows.devices.haptics.idl"; import "windows.gaming.input.forcefeedback.idl"; import "windows.system.idl"; @@ -36,4 +37,5 @@ import "windows.devices.power.idl"; #define DO_NO_IMPORTS #include "windows.gaming.input.idl" +#include "windows.gaming.ui.idl" #include "windows.gaming.input.custom.idl" diff --git a/dlls/windows.gaming.input/condition_effect.c b/dlls/windows.gaming.input/condition_effect.c new file mode 100644 index 00000000000..c3a5a1fcd8b --- /dev/null +++ wine/dlls/windows.gaming.input/condition_effect.c @@ -0,0 +1,288 @@ +/* WinRT Windows.Gaming.Input implementation + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "private.h" +#include "provider.h" + +WINE_DEFAULT_DEBUG_CHANNEL(input); + +struct condition_effect +{ + IConditionForceEffect IConditionForceEffect_iface; + IWineForceFeedbackEffectImpl *IWineForceFeedbackEffectImpl_inner; + LONG ref; + + ConditionForceEffectKind kind; +}; + +static inline struct condition_effect *impl_from_IConditionForceEffect( IConditionForceEffect *iface ) +{ + return CONTAINING_RECORD( iface, struct condition_effect, IConditionForceEffect_iface ); +} + +static HRESULT WINAPI effect_QueryInterface( IConditionForceEffect *iface, REFIID iid, void **out ) +{ + struct condition_effect *impl = impl_from_IConditionForceEffect( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IConditionForceEffect )) + { + IInspectable_AddRef( (*out = &impl->IConditionForceEffect_iface) ); + return S_OK; + } + + return IWineForceFeedbackEffectImpl_QueryInterface( impl->IWineForceFeedbackEffectImpl_inner, iid, out ); +} + +static ULONG WINAPI effect_AddRef( IConditionForceEffect *iface ) +{ + struct condition_effect *impl = impl_from_IConditionForceEffect( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI effect_Release( IConditionForceEffect *iface ) +{ + struct condition_effect *impl = impl_from_IConditionForceEffect( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) + { + /* guard against re-entry if inner releases an outer iface */ + InterlockedIncrement( &impl->ref ); + IWineForceFeedbackEffectImpl_Release( impl->IWineForceFeedbackEffectImpl_inner ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI effect_GetIids( IConditionForceEffect *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_GetRuntimeClassName( IConditionForceEffect *iface, HSTRING *class_name ) +{ + return WindowsCreateString( RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect, + ARRAY_SIZE(RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect), + class_name ); +} + +static HRESULT WINAPI effect_GetTrustLevel( IConditionForceEffect *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_get_Kind( IConditionForceEffect *iface, ConditionForceEffectKind *kind ) +{ + struct condition_effect *impl = impl_from_IConditionForceEffect( iface ); + TRACE( "iface %p, kind %p.\n", iface, kind ); + *kind = impl->kind; + return S_OK; +} + +static HRESULT WINAPI effect_SetParameters( IConditionForceEffect *iface, Vector3 direction, FLOAT positive_coeff, FLOAT negative_coeff, + FLOAT max_positive_magnitude, FLOAT max_negative_magnitude, FLOAT deadzone, FLOAT bias ) +{ + struct condition_effect *impl = impl_from_IConditionForceEffect( iface ); + WineForceFeedbackEffectParameters params = + { + .condition = + { + .type = WineForceFeedbackEffectType_Condition + impl->kind, + .direction = direction, + .positive_coeff = positive_coeff, + .negative_coeff = negative_coeff, + .max_positive_magnitude = max_positive_magnitude, + .max_negative_magnitude = max_negative_magnitude, + .deadzone = deadzone, + .bias = bias, + }, + }; + + TRACE( "iface %p, direction %s, positive_coeff %f, negative_coeff %f, max_positive_magnitude %f, max_negative_magnitude %f, deadzone %f, bias %f.\n", + iface, debugstr_vector3( &direction ), positive_coeff, negative_coeff, max_positive_magnitude, max_negative_magnitude, deadzone, bias ); + + return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, NULL ); +} + +static const struct IConditionForceEffectVtbl effect_vtbl = +{ + effect_QueryInterface, + effect_AddRef, + effect_Release, + /* IInspectable methods */ + effect_GetIids, + effect_GetRuntimeClassName, + effect_GetTrustLevel, + /* IConditionForceEffect methods */ + effect_get_Kind, + effect_SetParameters, +}; + +struct condition_factory +{ + IActivationFactory IActivationFactory_iface; + IConditionForceEffectFactory IConditionForceEffectFactory_iface; + LONG ref; +}; + +static inline struct condition_factory *impl_from_IActivationFactory( IActivationFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct condition_factory, IActivationFactory_iface ); +} + +static HRESULT WINAPI activation_QueryInterface( IActivationFactory *iface, REFIID iid, void **out ) +{ + struct condition_factory *impl = impl_from_IActivationFactory( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IActivationFactory )) + { + IInspectable_AddRef( (*out = &impl->IActivationFactory_iface) ); + return S_OK; + } + + if (IsEqualGUID( iid, &IID_IConditionForceEffectFactory )) + { + IInspectable_AddRef( (*out = &impl->IConditionForceEffectFactory_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI activation_AddRef( IActivationFactory *iface ) +{ + struct condition_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI activation_Release( IActivationFactory *iface ) +{ + struct condition_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static HRESULT WINAPI activation_GetIids( IActivationFactory *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetRuntimeClassName( IActivationFactory *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetTrustLevel( IActivationFactory *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) +{ + FIXME( "iface %p, instance %p stub!\n", iface, instance ); + return E_NOTIMPL; +} + +static const struct IActivationFactoryVtbl activation_vtbl = +{ + activation_QueryInterface, + activation_AddRef, + activation_Release, + /* IInspectable methods */ + activation_GetIids, + activation_GetRuntimeClassName, + activation_GetTrustLevel, + /* IActivationFactory methods */ + activation_ActivateInstance, +}; + +DEFINE_IINSPECTABLE( factory, IConditionForceEffectFactory, struct condition_factory, IActivationFactory_iface ) + +static HRESULT WINAPI factory_CreateInstance( IConditionForceEffectFactory *iface, enum ConditionForceEffectKind kind, IForceFeedbackEffect **out ) +{ + enum WineForceFeedbackEffectType type = WineForceFeedbackEffectType_Condition + kind; + struct condition_effect *impl; + HRESULT hr; + + TRACE( "iface %p, kind %u, out %p.\n", iface, kind, out ); + + if (!(impl = calloc( 1, sizeof(struct condition_effect) ))) return E_OUTOFMEMORY; + impl->IConditionForceEffect_iface.lpVtbl = &effect_vtbl; + impl->ref = 1; + impl->kind = kind; + + if (FAILED(hr = force_feedback_effect_create( type, (IInspectable *)&impl->IConditionForceEffect_iface, &impl->IWineForceFeedbackEffectImpl_inner )) || + FAILED(hr = IConditionForceEffect_QueryInterface( &impl->IConditionForceEffect_iface, &IID_IForceFeedbackEffect, (void **)out ))) + { + if (impl->IWineForceFeedbackEffectImpl_inner) IWineForceFeedbackEffectImpl_Release( impl->IWineForceFeedbackEffectImpl_inner ); + free( impl ); + return hr; + } + + IConditionForceEffect_Release( &impl->IConditionForceEffect_iface ); + TRACE( "created ConditionForceEffect %p\n", *out ); + return S_OK; +} + +static const struct IConditionForceEffectFactoryVtbl factory_vtbl = +{ + factory_QueryInterface, + factory_AddRef, + factory_Release, + /* IInspectable methods */ + factory_GetIids, + factory_GetRuntimeClassName, + factory_GetTrustLevel, + /* IConditionForceEffectFactory methods */ + factory_CreateInstance, +}; + +static struct condition_factory condition_statics = +{ + {&activation_vtbl}, + {&factory_vtbl}, + 1, +}; + +IInspectable *condition_effect_factory = (IInspectable *)&condition_statics.IActivationFactory_iface; diff --git a/dlls/windows.gaming.input/constant_effect.c b/dlls/windows.gaming.input/constant_effect.c new file mode 100644 index 00000000000..15763b30d67 --- /dev/null +++ wine/dlls/windows.gaming.input/constant_effect.c @@ -0,0 +1,275 @@ +/* WinRT Windows.Gaming.Input implementation + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "private.h" +#include "provider.h" + +WINE_DEFAULT_DEBUG_CHANNEL(input); + +struct constant_effect +{ + IConstantForceEffect IConstantForceEffect_iface; + IWineForceFeedbackEffectImpl *IWineForceFeedbackEffectImpl_inner; + LONG ref; +}; + +static inline struct constant_effect *impl_from_IConstantForceEffect( IConstantForceEffect *iface ) +{ + return CONTAINING_RECORD( iface, struct constant_effect, IConstantForceEffect_iface ); +} + +static HRESULT WINAPI effect_QueryInterface( IConstantForceEffect *iface, REFIID iid, void **out ) +{ + struct constant_effect *impl = impl_from_IConstantForceEffect( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IConstantForceEffect )) + { + IInspectable_AddRef( (*out = &impl->IConstantForceEffect_iface) ); + return S_OK; + } + + return IWineForceFeedbackEffectImpl_QueryInterface( impl->IWineForceFeedbackEffectImpl_inner, iid, out ); +} + +static ULONG WINAPI effect_AddRef( IConstantForceEffect *iface ) +{ + struct constant_effect *impl = impl_from_IConstantForceEffect( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI effect_Release( IConstantForceEffect *iface ) +{ + struct constant_effect *impl = impl_from_IConstantForceEffect( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) + { + /* guard against re-entry if inner releases an outer iface */ + InterlockedIncrement( &impl->ref ); + IWineForceFeedbackEffectImpl_Release( impl->IWineForceFeedbackEffectImpl_inner ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI effect_GetIids( IConstantForceEffect *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_GetRuntimeClassName( IConstantForceEffect *iface, HSTRING *class_name ) +{ + return WindowsCreateString( RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect, + ARRAY_SIZE(RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect), + class_name ); +} + +static HRESULT WINAPI effect_GetTrustLevel( IConstantForceEffect *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_SetParameters( IConstantForceEffect *iface, Vector3 direction, TimeSpan duration ) +{ + WineForceFeedbackEffectParameters params = + { + .constant = + { + .type = WineForceFeedbackEffectType_Constant, + .direction = direction, + .duration = duration, + .repeat_count = 1, + .gain = 1., + }, + }; + struct constant_effect *impl = impl_from_IConstantForceEffect( iface ); + + TRACE( "iface %p, direction %s, duration %I64u.\n", iface, debugstr_vector3( &direction ), duration.Duration ); + + return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, NULL ); +} + +static HRESULT WINAPI effect_SetParametersWithEnvelope( IConstantForceEffect *iface, Vector3 direction, FLOAT attack_gain, + FLOAT sustain_gain, FLOAT release_gain, TimeSpan start_delay, + TimeSpan attack_duration, TimeSpan sustain_duration, + TimeSpan release_duration, UINT32 repeat_count ) +{ + WineForceFeedbackEffectParameters params = + { + .constant = + { + .type = WineForceFeedbackEffectType_Constant, + .direction = direction, + .duration = {attack_duration.Duration + sustain_duration.Duration + release_duration.Duration}, + .start_delay = start_delay, + .repeat_count = repeat_count, + .gain = sustain_gain, + }, + }; + WineForceFeedbackEffectEnvelope envelope = + { + .attack_gain = attack_gain, + .release_gain = release_gain, + .attack_duration = attack_duration, + .release_duration = release_duration, + }; + struct constant_effect *impl = impl_from_IConstantForceEffect( iface ); + + TRACE( "iface %p, direction %s, attack_gain %f, sustain_gain %f, release_gain %f, start_delay %I64u, attack_duration %I64u, " + "sustain_duration %I64u, release_duration %I64u, repeat_count %u.\n", iface, debugstr_vector3( &direction ), + attack_gain, sustain_gain, release_gain, start_delay.Duration, attack_duration.Duration, sustain_duration.Duration, + release_duration.Duration, repeat_count ); + + return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, &envelope ); +} + +static const struct IConstantForceEffectVtbl effect_vtbl = +{ + effect_QueryInterface, + effect_AddRef, + effect_Release, + /* IInspectable methods */ + effect_GetIids, + effect_GetRuntimeClassName, + effect_GetTrustLevel, + /* IConstantForceEffect methods */ + effect_SetParameters, + effect_SetParametersWithEnvelope, +}; + +struct constant_factory +{ + IActivationFactory IActivationFactory_iface; + LONG ref; +}; + +static inline struct constant_factory *impl_from_IActivationFactory( IActivationFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct constant_factory, IActivationFactory_iface ); +} + +static HRESULT WINAPI activation_QueryInterface( IActivationFactory *iface, REFIID iid, void **out ) +{ + struct constant_factory *impl = impl_from_IActivationFactory( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IActivationFactory )) + { + IInspectable_AddRef( (*out = &impl->IActivationFactory_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI activation_AddRef( IActivationFactory *iface ) +{ + struct constant_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI activation_Release( IActivationFactory *iface ) +{ + struct constant_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static HRESULT WINAPI activation_GetIids( IActivationFactory *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetRuntimeClassName( IActivationFactory *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetTrustLevel( IActivationFactory *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) +{ + struct constant_effect *impl; + HRESULT hr; + + TRACE( "iface %p, instance %p.\n", iface, instance ); + + if (!(impl = calloc( 1, sizeof(struct constant_effect) ))) return E_OUTOFMEMORY; + impl->IConstantForceEffect_iface.lpVtbl = &effect_vtbl; + impl->ref = 1; + + if (FAILED(hr = force_feedback_effect_create( WineForceFeedbackEffectType_Constant, (IInspectable *)&impl->IConstantForceEffect_iface, + &impl->IWineForceFeedbackEffectImpl_inner ))) + { + free( impl ); + return hr; + } + + *instance = (IInspectable *)&impl->IConstantForceEffect_iface; + TRACE( "created ConstantForceEffect %p\n", *instance ); + return S_OK; +} + +static const struct IActivationFactoryVtbl activation_vtbl = +{ + activation_QueryInterface, + activation_AddRef, + activation_Release, + /* IInspectable methods */ + activation_GetIids, + activation_GetRuntimeClassName, + activation_GetTrustLevel, + /* IActivationFactory methods */ + activation_ActivateInstance, +}; + +static struct constant_factory constant_statics = +{ + {&activation_vtbl}, + 1, +}; + +IInspectable *constant_effect_factory = (IInspectable *)&constant_statics.IActivationFactory_iface; diff --git a/dlls/windows.gaming.input/controller.c b/dlls/windows.gaming.input/controller.c index 03a3ae398cf..bd3d441c445 100644 --- wine/dlls/windows.gaming.input/controller.c +++ wine/dlls/windows.gaming.input/controller.c @@ -99,7 +99,7 @@ static HRESULT WINAPI controller_QueryInterface( IGameControllerImpl *iface, REF return S_OK; } - WARN( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; } @@ -229,8 +229,32 @@ static HRESULT WINAPI raw_controller_get_ButtonCount( IRawGameController *iface, static HRESULT WINAPI raw_controller_get_ForceFeedbackMotors( IRawGameController *iface, IVectorView_ForceFeedbackMotor **value ) { - FIXME( "iface %p, value %p stub!\n", iface, value ); - return E_NOTIMPL; + static const struct vector_iids iids = + { + .vector = &IID_IVector_ForceFeedbackMotor, + .view = &IID_IVectorView_ForceFeedbackMotor, + .iterable = &IID_IIterable_ForceFeedbackMotor, + .iterator = &IID_IIterator_ForceFeedbackMotor, + }; + struct controller *impl = impl_from_IRawGameController( iface ); + IVector_ForceFeedbackMotor *vector; + IForceFeedbackMotor *motor; + HRESULT hr; + + TRACE( "iface %p, value %p\n", iface, value ); + + if (FAILED(hr = vector_create( &iids, (void **)&vector ))) return hr; + + if (SUCCEEDED(IWineGameControllerProvider_get_ForceFeedbackMotor( impl->wine_provider, &motor )) && motor) + { + hr = IVector_ForceFeedbackMotor_Append( vector, motor ); + IForceFeedbackMotor_Release( motor ); + } + + if (SUCCEEDED(hr)) hr = IVector_ForceFeedbackMotor_GetView( vector, value ); + IVector_ForceFeedbackMotor_Release( vector ); + + return hr; } static HRESULT WINAPI raw_controller_get_HardwareProductId( IRawGameController *iface, UINT16 *value ) diff --git a/dlls/windows.gaming.input/force_feedback.c b/dlls/windows.gaming.input/force_feedback.c new file mode 100644 index 00000000000..f7a233b46d4 --- /dev/null +++ wine/dlls/windows.gaming.input/force_feedback.c @@ -0,0 +1,801 @@ +/* WinRT Windows.Gaming.Input implementation + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "private.h" + +#include "math.h" + +#include "ddk/hidsdi.h" +#include "dinput.h" +#include "hidusage.h" +#include "provider.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(input); + +struct effect +{ + IWineForceFeedbackEffectImpl IWineForceFeedbackEffectImpl_iface; + IForceFeedbackEffect IForceFeedbackEffect_iface; + IInspectable *IInspectable_outer; + LONG ref; + + CRITICAL_SECTION cs; + IDirectInputEffect *effect; + + GUID type; + DWORD axes[3]; + LONG directions[3]; + ULONG repeat_count; + DICONSTANTFORCE constant_force; + DIRAMPFORCE ramp_force; + DICONDITION condition; + DIPERIODIC periodic; + DIENVELOPE envelope; + DIEFFECT params; +}; + +static inline struct effect *impl_from_IWineForceFeedbackEffectImpl( IWineForceFeedbackEffectImpl *iface ) +{ + return CONTAINING_RECORD( iface, struct effect, IWineForceFeedbackEffectImpl_iface ); +} + +static HRESULT WINAPI effect_impl_QueryInterface( IWineForceFeedbackEffectImpl *iface, REFIID iid, void **out ) +{ + struct effect *impl = impl_from_IWineForceFeedbackEffectImpl( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IWineForceFeedbackEffectImpl )) + { + IWineForceFeedbackEffectImpl_AddRef( (*out = &impl->IWineForceFeedbackEffectImpl_iface) ); + return S_OK; + } + + if (IsEqualGUID( iid, &IID_IForceFeedbackEffect )) + { + IInspectable_AddRef( (*out = &impl->IForceFeedbackEffect_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI effect_impl_AddRef( IWineForceFeedbackEffectImpl *iface ) +{ + struct effect *impl = impl_from_IWineForceFeedbackEffectImpl( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI effect_impl_Release( IWineForceFeedbackEffectImpl *iface ) +{ + struct effect *impl = impl_from_IWineForceFeedbackEffectImpl( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) + { + if (impl->effect) IDirectInputEffect_Release( impl->effect ); + impl->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection( &impl->cs ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI effect_impl_put_Parameters( IWineForceFeedbackEffectImpl *iface, WineForceFeedbackEffectParameters params, + WineForceFeedbackEffectEnvelope *envelope ) +{ + struct effect *impl = impl_from_IWineForceFeedbackEffectImpl( iface ); + DWORD count = 0; + HRESULT hr; + + TRACE( "iface %p, params %p, envelope %p.\n", iface, ¶ms, envelope ); + + EnterCriticalSection( &impl->cs ); + switch (params.type) + { + case WineForceFeedbackEffectType_Constant: + impl->repeat_count = params.constant.repeat_count; + impl->constant_force.lMagnitude = round( params.constant.gain * params.constant.direction.X * 10000 ); + impl->params.dwDuration = params.constant.duration.Duration / 10; + impl->params.dwStartDelay = params.constant.start_delay.Duration / 10; + if (impl->axes[count] == DIJOFS_X) impl->directions[count++] = round( -params.constant.direction.X * 10000 ); + if (impl->axes[count] == DIJOFS_Y) impl->directions[count++] = round( -params.constant.direction.Y * 10000 ); + if (impl->axes[count] == DIJOFS_Z) impl->directions[count++] = round( -params.constant.direction.Z * 10000 ); + break; + + case WineForceFeedbackEffectType_Ramp: + impl->repeat_count = params.ramp.repeat_count; + impl->ramp_force.lStart = round( params.ramp.gain * params.ramp.start_vector.X * 10000 ); + impl->ramp_force.lEnd = round( params.ramp.gain * params.ramp.end_vector.X * 10000 ); + impl->params.dwDuration = params.ramp.duration.Duration / 10; + impl->params.dwStartDelay = params.ramp.start_delay.Duration / 10; + if (impl->axes[count] == DIJOFS_X) impl->directions[count++] = round( -params.ramp.start_vector.X * 10000 ); + if (impl->axes[count] == DIJOFS_Y) impl->directions[count++] = round( -params.ramp.start_vector.Y * 10000 ); + if (impl->axes[count] == DIJOFS_Z) impl->directions[count++] = round( -params.ramp.start_vector.Z * 10000 ); + break; + + case WineForceFeedbackEffectType_Periodic_SineWave: + case WineForceFeedbackEffectType_Periodic_TriangleWave: + case WineForceFeedbackEffectType_Periodic_SquareWave: + case WineForceFeedbackEffectType_Periodic_SawtoothWaveDown: + case WineForceFeedbackEffectType_Periodic_SawtoothWaveUp: + impl->repeat_count = params.periodic.repeat_count; + impl->periodic.dwMagnitude = round( params.periodic.gain * 10000 ); + impl->periodic.dwPeriod = 1000000 / params.periodic.frequency; + impl->periodic.dwPhase = round( params.periodic.phase * 36000 ); + impl->periodic.lOffset = round( params.periodic.bias * 10000 ); + impl->params.dwDuration = params.periodic.duration.Duration / 10; + impl->params.dwStartDelay = params.periodic.start_delay.Duration / 10; + if (impl->axes[count] == DIJOFS_X) impl->directions[count++] = round( -params.periodic.direction.X * 10000 ); + if (impl->axes[count] == DIJOFS_Y) impl->directions[count++] = round( -params.periodic.direction.Y * 10000 ); + if (impl->axes[count] == DIJOFS_Z) impl->directions[count++] = round( -params.periodic.direction.Z * 10000 ); + break; + + case WineForceFeedbackEffectType_Condition_Spring: + case WineForceFeedbackEffectType_Condition_Damper: + case WineForceFeedbackEffectType_Condition_Inertia: + case WineForceFeedbackEffectType_Condition_Friction: + impl->repeat_count = 1; + impl->condition.lPositiveCoefficient = round( atan( params.condition.positive_coeff ) / M_PI_2 * 10000 ); + impl->condition.lNegativeCoefficient = round( atan( params.condition.negative_coeff ) / M_PI_2 * 10000 ); + impl->condition.dwPositiveSaturation = round( params.condition.max_positive_magnitude * 10000 ); + impl->condition.dwNegativeSaturation = round( params.condition.max_negative_magnitude * 10000 ); + impl->condition.lDeadBand = round( params.condition.deadzone * 10000 ); + impl->condition.lOffset = round( params.condition.bias * 10000 ); + impl->params.dwDuration = -1; + impl->params.dwStartDelay = 0; + if (impl->axes[count] == DIJOFS_X) impl->directions[count++] = round( params.condition.direction.X * 10000 ); + if (impl->axes[count] == DIJOFS_Y) impl->directions[count++] = round( params.condition.direction.Y * 10000 ); + if (impl->axes[count] == DIJOFS_Z) impl->directions[count++] = round( params.condition.direction.Z * 10000 ); + break; + } + + if (!envelope) impl->params.lpEnvelope = NULL; + else + { + impl->envelope.dwAttackTime = envelope->attack_duration.Duration / 10; + impl->envelope.dwAttackLevel = round( envelope->attack_gain * 10000 ); + impl->envelope.dwFadeTime = impl->params.dwDuration - envelope->release_duration.Duration / 10; + impl->envelope.dwFadeLevel = round( envelope->release_gain * 10000 ); + impl->params.lpEnvelope = &impl->envelope; + } + + if (!impl->effect) hr = S_OK; + else hr = IDirectInputEffect_SetParameters( impl->effect, &impl->params, DIEP_ALLPARAMS & ~DIEP_AXES ); + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static const struct IWineForceFeedbackEffectImplVtbl effect_impl_vtbl = +{ + effect_impl_QueryInterface, + effect_impl_AddRef, + effect_impl_Release, + /* IWineForceFeedbackEffectImpl methods */ + effect_impl_put_Parameters, +}; + +DEFINE_IINSPECTABLE_OUTER( effect, IForceFeedbackEffect, struct effect, IInspectable_outer ) + +static HRESULT WINAPI effect_get_Gain( IForceFeedbackEffect *iface, DOUBLE *value ) +{ + struct effect *impl = impl_from_IForceFeedbackEffect( iface ); + + TRACE( "iface %p, value %p.\n", iface, value ); + + EnterCriticalSection( &impl->cs ); + *value = impl->params.dwGain / 10000.; + LeaveCriticalSection( &impl->cs ); + + return S_OK; +} + +static HRESULT WINAPI effect_put_Gain( IForceFeedbackEffect *iface, DOUBLE value ) +{ + struct effect *impl = impl_from_IForceFeedbackEffect( iface ); + HRESULT hr; + + TRACE( "iface %p, value %f.\n", iface, value ); + + EnterCriticalSection( &impl->cs ); + impl->params.dwGain = round( value * 10000 ); + if (!impl->effect) hr = S_FALSE; + else hr = IDirectInputEffect_SetParameters( impl->effect, &impl->params, DIEP_GAIN ); + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI effect_get_State( IForceFeedbackEffect *iface, ForceFeedbackEffectState *value ) +{ + struct effect *impl = impl_from_IForceFeedbackEffect( iface ); + DWORD status; + HRESULT hr; + + TRACE( "iface %p, value %p.\n", iface, value ); + + EnterCriticalSection( &impl->cs ); + if (!impl->effect) + *value = ForceFeedbackEffectState_Stopped; + else if (FAILED(hr = IDirectInputEffect_GetEffectStatus( impl->effect, &status ))) + *value = ForceFeedbackEffectState_Faulted; + else + { + if (status == DIEGES_PLAYING) *value = ForceFeedbackEffectState_Running; + else *value = ForceFeedbackEffectState_Stopped; + } + LeaveCriticalSection( &impl->cs ); + + return S_OK; +} + +static HRESULT WINAPI effect_Start( IForceFeedbackEffect *iface ) +{ + struct effect *impl = impl_from_IForceFeedbackEffect( iface ); + HRESULT hr = E_UNEXPECTED; + DWORD flags = 0; + + TRACE( "iface %p.\n", iface ); + + EnterCriticalSection( &impl->cs ); + if (impl->effect) hr = IDirectInputEffect_Start( impl->effect, impl->repeat_count, flags ); + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static HRESULT WINAPI effect_Stop( IForceFeedbackEffect *iface ) +{ + struct effect *impl = impl_from_IForceFeedbackEffect( iface ); + HRESULT hr = E_UNEXPECTED; + + TRACE( "iface %p.\n", iface ); + + EnterCriticalSection( &impl->cs ); + if (impl->effect) hr = IDirectInputEffect_Stop( impl->effect ); + LeaveCriticalSection( &impl->cs ); + + return hr; +} + +static const struct IForceFeedbackEffectVtbl effect_vtbl = +{ + effect_QueryInterface, + effect_AddRef, + effect_Release, + /* IInspectable methods */ + effect_GetIids, + effect_GetRuntimeClassName, + effect_GetTrustLevel, + /* IForceFeedbackEffect methods */ + effect_get_Gain, + effect_put_Gain, + effect_get_State, + effect_Start, + effect_Stop, +}; + +HRESULT force_feedback_effect_create( enum WineForceFeedbackEffectType type, IInspectable *outer, IWineForceFeedbackEffectImpl **out ) +{ + struct effect *impl; + + TRACE( "outer %p, out %p\n", outer, out ); + + if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; + impl->IWineForceFeedbackEffectImpl_iface.lpVtbl = &effect_impl_vtbl; + impl->IForceFeedbackEffect_iface.lpVtbl = &effect_vtbl; + impl->IInspectable_outer = outer; + impl->ref = 1; + + switch (type) + { + case WineForceFeedbackEffectType_Constant: + impl->type = GUID_ConstantForce; + impl->params.lpvTypeSpecificParams = &impl->constant_force; + impl->params.cbTypeSpecificParams = sizeof(impl->constant_force); + break; + + case WineForceFeedbackEffectType_Ramp: + impl->type = GUID_RampForce; + impl->params.lpvTypeSpecificParams = &impl->ramp_force; + impl->params.cbTypeSpecificParams = sizeof(impl->ramp_force); + break; + + case WineForceFeedbackEffectType_Periodic_SineWave: + impl->type = GUID_Sine; + goto WineForceFeedbackEffectType_Periodic; + case WineForceFeedbackEffectType_Periodic_TriangleWave: + impl->type = GUID_Triangle; + goto WineForceFeedbackEffectType_Periodic; + case WineForceFeedbackEffectType_Periodic_SquareWave: + impl->type = GUID_Square; + goto WineForceFeedbackEffectType_Periodic; + case WineForceFeedbackEffectType_Periodic_SawtoothWaveDown: + impl->type = GUID_SawtoothDown; + goto WineForceFeedbackEffectType_Periodic; + case WineForceFeedbackEffectType_Periodic_SawtoothWaveUp: + impl->type = GUID_SawtoothUp; + goto WineForceFeedbackEffectType_Periodic; + WineForceFeedbackEffectType_Periodic: + impl->params.lpvTypeSpecificParams = &impl->periodic; + impl->params.cbTypeSpecificParams = sizeof(impl->periodic); + break; + + case WineForceFeedbackEffectType_Condition_Spring: + impl->type = GUID_Spring; + goto WineForceFeedbackEffectType_Condition; + case WineForceFeedbackEffectType_Condition_Damper: + impl->type = GUID_Damper; + goto WineForceFeedbackEffectType_Condition; + case WineForceFeedbackEffectType_Condition_Inertia: + impl->type = GUID_Inertia; + goto WineForceFeedbackEffectType_Condition; + case WineForceFeedbackEffectType_Condition_Friction: + impl->type = GUID_Friction; + goto WineForceFeedbackEffectType_Condition; + WineForceFeedbackEffectType_Condition: + impl->params.lpvTypeSpecificParams = &impl->condition; + impl->params.cbTypeSpecificParams = sizeof(impl->condition); + break; + } + + impl->envelope.dwSize = sizeof(DIENVELOPE); + impl->params.dwSize = sizeof(DIEFFECT); + impl->params.rgdwAxes = impl->axes; + impl->params.rglDirection = impl->directions; + impl->params.dwTriggerButton = -1; + impl->params.dwGain = 10000; + impl->params.dwFlags = DIEFF_CARTESIAN|DIEFF_OBJECTOFFSETS; + impl->params.cAxes = -1; + impl->axes[0] = DIJOFS_X; + impl->axes[1] = DIJOFS_Y; + impl->axes[2] = DIJOFS_Z; + + InitializeCriticalSection( &impl->cs ); + impl->cs.DebugInfo->Spare[0] = (DWORD_PTR)( __FILE__ ": effect.cs" ); + + *out = &impl->IWineForceFeedbackEffectImpl_iface; + TRACE( "created ForceFeedbackEffect %p\n", *out ); + return S_OK; +} + +struct motor +{ + IForceFeedbackMotor IForceFeedbackMotor_iface; + LONG ref; + + IDirectInputDevice8W *device; +}; + +static inline struct motor *impl_from_IForceFeedbackMotor( IForceFeedbackMotor *iface ) +{ + return CONTAINING_RECORD( iface, struct motor, IForceFeedbackMotor_iface ); +} + +static HRESULT WINAPI motor_QueryInterface( IForceFeedbackMotor *iface, REFIID iid, void **out ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IForceFeedbackMotor )) + { + IInspectable_AddRef( (*out = &impl->IForceFeedbackMotor_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI motor_AddRef( IForceFeedbackMotor *iface ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI motor_Release( IForceFeedbackMotor *iface ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) + { + IDirectInputDevice8_Release( impl->device ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI motor_GetIids( IForceFeedbackMotor *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI motor_GetRuntimeClassName( IForceFeedbackMotor *iface, HSTRING *class_name ) +{ + return WindowsCreateString( RuntimeClass_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor, + ARRAY_SIZE(RuntimeClass_Windows_Gaming_Input_ForceFeedback_ForceFeedbackMotor), + class_name ); +} + +static HRESULT WINAPI motor_GetTrustLevel( IForceFeedbackMotor *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI motor_get_AreEffectsPaused( IForceFeedbackMotor *iface, BOOLEAN *value ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + DWORD state; + HRESULT hr; + + TRACE( "iface %p, value %p.\n", iface, value ); + + if (FAILED(hr = IDirectInputDevice8_GetForceFeedbackState( impl->device, &state ))) *value = FALSE; + else *value = (state & DIGFFS_PAUSED); + + return hr; +} + +static HRESULT WINAPI motor_get_MasterGain( IForceFeedbackMotor *iface, double *value ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + DIPROPDWORD gain = + { + .diph = + { + .dwSize = sizeof(DIPROPDWORD), + .dwHeaderSize = sizeof(DIPROPHEADER), + .dwHow = DIPH_DEVICE, + }, + }; + HRESULT hr; + + TRACE( "iface %p, value %p.\n", iface, value ); + + if (FAILED(hr = IDirectInputDevice8_GetProperty( impl->device, DIPROP_FFGAIN, &gain.diph ))) *value = 1.; + else *value = gain.dwData / 10000.; + + return hr; +} + +static HRESULT WINAPI motor_put_MasterGain( IForceFeedbackMotor *iface, double value ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + DIPROPDWORD gain = + { + .diph = + { + .dwSize = sizeof(DIPROPDWORD), + .dwHeaderSize = sizeof(DIPROPHEADER), + .dwHow = DIPH_DEVICE, + }, + }; + + TRACE( "iface %p, value %f.\n", iface, value ); + + gain.dwData = 10000 * value; + return IDirectInputDevice8_SetProperty( impl->device, DIPROP_FFGAIN, &gain.diph ); +} + +static HRESULT WINAPI motor_get_IsEnabled( IForceFeedbackMotor *iface, BOOLEAN *value ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + DWORD state; + HRESULT hr; + + TRACE( "iface %p, value %p.\n", iface, value ); + + if (FAILED(hr = IDirectInputDevice8_GetForceFeedbackState( impl->device, &state ))) *value = FALSE; + else *value = !(state & DIGFFS_ACTUATORSOFF); + + return hr; +} + +static BOOL CALLBACK check_ffb_axes( const DIDEVICEOBJECTINSTANCEW *obj, void *args ) +{ + ForceFeedbackEffectAxes *value = args; + + if (obj->dwType & DIDFT_FFACTUATOR) + { + if (IsEqualIID( &obj->guidType, &GUID_XAxis )) *value |= ForceFeedbackEffectAxes_X; + else if (IsEqualIID( &obj->guidType, &GUID_YAxis )) *value |= ForceFeedbackEffectAxes_Y; + else if (IsEqualIID( &obj->guidType, &GUID_ZAxis )) *value |= ForceFeedbackEffectAxes_Z; + } + + return DIENUM_CONTINUE; +} + +static HRESULT WINAPI motor_get_SupportedAxes( IForceFeedbackMotor *iface, enum ForceFeedbackEffectAxes *value ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + HRESULT hr; + + TRACE( "iface %p, value %p.\n", iface, value ); + + *value = ForceFeedbackEffectAxes_None; + if (FAILED(hr = IDirectInputDevice8_EnumObjects( impl->device, check_ffb_axes, value, DIDFT_AXIS ))) + *value = ForceFeedbackEffectAxes_None; + + return hr; +} + +static HRESULT WINAPI motor_load_effect_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +{ + struct effect *effect = impl_from_IForceFeedbackEffect( (IForceFeedbackEffect *)param ); + IForceFeedbackMotor *motor = (IForceFeedbackMotor *)invoker; + struct motor *impl = impl_from_IForceFeedbackMotor( motor ); + ForceFeedbackEffectAxes supported_axes = 0; + IDirectInputEffect *dinput_effect; + HRESULT hr; + + EnterCriticalSection( &effect->cs ); + + if (FAILED(hr = IForceFeedbackMotor_get_SupportedAxes( motor, &supported_axes ))) + { + WARN( "get_SupportedAxes for motor %p returned %#lx\n", motor, hr ); + effect->params.cAxes = 0; + } + else if (effect->params.cAxes == -1) + { + DWORD count = 0; + + /* initialize axis mapping and re-map directions that were set with the initial mapping */ + if (supported_axes & ForceFeedbackEffectAxes_X) + { + effect->directions[count] = effect->directions[0]; + effect->axes[count++] = DIJOFS_X; + } + if (supported_axes & ForceFeedbackEffectAxes_Y) + { + effect->directions[count] = effect->directions[1]; + effect->axes[count++] = DIJOFS_Y; + } + if (supported_axes & ForceFeedbackEffectAxes_Z) + { + effect->directions[count] = effect->directions[2]; + effect->axes[count++] = DIJOFS_Z; + } + + effect->params.cAxes = count; + } + + if (SUCCEEDED(hr = IDirectInputDevice8_CreateEffect( impl->device, &effect->type, &effect->params, + &dinput_effect, NULL ))) + { + if (effect->effect) IDirectInputEffect_Release( effect->effect ); + effect->effect = dinput_effect; + IDirectInputEffect_AddRef( effect->effect ); + } + + LeaveCriticalSection( &effect->cs ); + + result->vt = VT_UI4; + if (SUCCEEDED(hr)) result->ulVal = ForceFeedbackLoadEffectResult_Succeeded; + else if (hr == DIERR_DEVICEFULL) result->ulVal = ForceFeedbackLoadEffectResult_EffectStorageFull; + else result->ulVal = ForceFeedbackLoadEffectResult_EffectNotSupported; + + return hr; +} + +static HRESULT WINAPI motor_LoadEffectAsync( IForceFeedbackMotor *iface, IForceFeedbackEffect *effect, + IAsyncOperation_ForceFeedbackLoadEffectResult **async_op ) +{ + TRACE( "iface %p, effect %p, async_op %p.\n", iface, effect, async_op ); + return async_operation_effect_result_create( (IUnknown *)iface, (IUnknown *)effect, motor_load_effect_async, async_op ); +} + +static HRESULT WINAPI motor_PauseAllEffects( IForceFeedbackMotor *iface ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + + TRACE( "iface %p.\n", iface ); + + return IDirectInputDevice8_SendForceFeedbackCommand( impl->device, DISFFC_PAUSE ); +} + +static HRESULT WINAPI motor_ResumeAllEffects( IForceFeedbackMotor *iface ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + + TRACE( "iface %p.\n", iface ); + + return IDirectInputDevice8_SendForceFeedbackCommand( impl->device, DISFFC_CONTINUE ); +} + +static HRESULT WINAPI motor_StopAllEffects( IForceFeedbackMotor *iface ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( iface ); + + TRACE( "iface %p.\n", iface ); + + return IDirectInputDevice8_SendForceFeedbackCommand( impl->device, DISFFC_STOPALL ); +} + +static HRESULT WINAPI motor_try_disable_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( (IForceFeedbackMotor *)invoker ); + HRESULT hr; + + hr = IDirectInputDevice8_SendForceFeedbackCommand( impl->device, DISFFC_SETACTUATORSOFF ); + result->vt = VT_BOOL; + result->boolVal = SUCCEEDED(hr); + + return hr; +} + +static HRESULT WINAPI motor_TryDisableAsync( IForceFeedbackMotor *iface, IAsyncOperation_boolean **async_op ) +{ + TRACE( "iface %p, async_op %p.\n", iface, async_op ); + return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_disable_async, async_op ); +} + +static HRESULT WINAPI motor_try_enable_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( (IForceFeedbackMotor *)invoker ); + HRESULT hr; + + hr = IDirectInputDevice8_SendForceFeedbackCommand( impl->device, DISFFC_SETACTUATORSON ); + result->vt = VT_BOOL; + result->boolVal = SUCCEEDED(hr); + + return hr; +} + +static HRESULT WINAPI motor_TryEnableAsync( IForceFeedbackMotor *iface, IAsyncOperation_boolean **async_op ) +{ + TRACE( "iface %p, async_op %p.\n", iface, async_op ); + return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_enable_async, async_op ); +} + +static HRESULT WINAPI motor_try_reset_async( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ) +{ + struct motor *impl = impl_from_IForceFeedbackMotor( (IForceFeedbackMotor *)invoker ); + HRESULT hr; + + hr = IDirectInputDevice8_SendForceFeedbackCommand( impl->device, DISFFC_RESET ); + result->vt = VT_BOOL; + result->boolVal = SUCCEEDED(hr); + + return hr; +} + +static HRESULT WINAPI motor_TryResetAsync( IForceFeedbackMotor *iface, IAsyncOperation_boolean **async_op ) +{ + TRACE( "iface %p, async_op %p.\n", iface, async_op ); + return async_operation_boolean_create( (IUnknown *)iface, NULL, motor_try_reset_async, async_op ); +} + +static HRESULT WINAPI motor_unload_effect_async( IUnknown *iface, IUnknown *param, PROPVARIANT *result ) +{ + struct effect *effect = impl_from_IForceFeedbackEffect( (IForceFeedbackEffect *)param ); + IDirectInputEffect *dinput_effect; + HRESULT hr; + + EnterCriticalSection( &effect->cs ); + dinput_effect = effect->effect; + effect->effect = NULL; + LeaveCriticalSection( &effect->cs ); + + if (!dinput_effect) hr = S_OK; + else + { + hr = IDirectInputEffect_Unload( dinput_effect ); + IDirectInputEffect_Release( dinput_effect ); + } + + result->vt = VT_BOOL; + result->boolVal = SUCCEEDED(hr); + return hr; +} + +static HRESULT WINAPI motor_TryUnloadEffectAsync( IForceFeedbackMotor *iface, IForceFeedbackEffect *effect, + IAsyncOperation_boolean **async_op ) +{ + struct effect *impl = impl_from_IForceFeedbackEffect( (IForceFeedbackEffect *)effect ); + HRESULT hr = S_OK; + + TRACE( "iface %p, effect %p, async_op %p.\n", iface, effect, async_op ); + + EnterCriticalSection( &impl->cs ); + if (!impl->effect) hr = E_FAIL; + LeaveCriticalSection( &impl->cs ); + if (FAILED(hr)) return hr; + + return async_operation_boolean_create( (IUnknown *)iface, (IUnknown *)effect, motor_unload_effect_async, async_op ); +} + +static const struct IForceFeedbackMotorVtbl motor_vtbl = +{ + motor_QueryInterface, + motor_AddRef, + motor_Release, + /* IInspectable methods */ + motor_GetIids, + motor_GetRuntimeClassName, + motor_GetTrustLevel, + /* IForceFeedbackMotor methods */ + motor_get_AreEffectsPaused, + motor_get_MasterGain, + motor_put_MasterGain, + motor_get_IsEnabled, + motor_get_SupportedAxes, + motor_LoadEffectAsync, + motor_PauseAllEffects, + motor_ResumeAllEffects, + motor_StopAllEffects, + motor_TryDisableAsync, + motor_TryEnableAsync, + motor_TryResetAsync, + motor_TryUnloadEffectAsync, +}; + +HRESULT force_feedback_motor_create( IDirectInputDevice8W *device, IForceFeedbackMotor **out ) +{ + struct motor *impl; + HRESULT hr; + + TRACE( "device %p, out %p\n", device, out ); + + if (FAILED(hr = IDirectInputDevice8_Unacquire( device ))) goto failed; + if (FAILED(hr = IDirectInputDevice8_SetCooperativeLevel( device, GetDesktopWindow(), DISCL_BACKGROUND | DISCL_EXCLUSIVE ))) goto failed; + if (FAILED(hr = IDirectInputDevice8_Acquire( device ))) goto failed; + + if (!(impl = calloc( 1, sizeof(*impl) ))) return E_OUTOFMEMORY; + impl->IForceFeedbackMotor_iface.lpVtbl = &motor_vtbl; + impl->ref = 1; + + IDirectInputDevice_AddRef( device ); + impl->device = device; + + *out = &impl->IForceFeedbackMotor_iface; + TRACE( "created ForceFeedbackMotor %p\n", *out ); + return S_OK; + +failed: + IDirectInputDevice8_SetCooperativeLevel( device, 0, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE ); + IDirectInputDevice8_Acquire( device ); + WARN( "Failed to acquire device exclusively, hr %#lx\n", hr ); + return hr; +} diff --git a/dlls/windows.gaming.input/gamepad.c b/dlls/windows.gaming.input/gamepad.c index 0c38fb5cd1a..8dab9a62d09 100644 --- wine/dlls/windows.gaming.input/gamepad.c +++ wine/dlls/windows.gaming.input/gamepad.c @@ -61,6 +61,7 @@ struct gamepad IGameControllerImpl IGameControllerImpl_iface; IGameControllerInputSink IGameControllerInputSink_iface; IGamepad IGamepad_iface; + IGamepad2 IGamepad2_iface; IGameController *IGameController_outer; LONG ref; @@ -99,7 +100,13 @@ static HRESULT WINAPI controller_QueryInterface( IGameControllerImpl *iface, REF return S_OK; } - WARN( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + if (IsEqualGUID( iid, &IID_IGamepad2 )) + { + IInspectable_AddRef( (*out = &impl->IGamepad2_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; } @@ -330,6 +337,28 @@ static const struct IGamepadVtbl gamepad_vtbl = gamepad_GetCurrentReading, }; +DEFINE_IINSPECTABLE_OUTER( gamepad2, IGamepad2, struct gamepad, IGameController_outer ) + +static HRESULT WINAPI gamepad2_GetButtonLabel(IGamepad2 *iface, GamepadButtons button, GameControllerButtonLabel *value) +{ + FIXME( "iface %p, button %#x, value %p stub!\n", iface, button, value ); + *value = GameControllerButtonLabel_None; + return S_OK; +} + +static const struct IGamepad2Vtbl gamepad2_vtbl = +{ + gamepad2_QueryInterface, + gamepad2_AddRef, + gamepad2_Release, + /* IInspectable methods */ + gamepad2_GetIids, + gamepad2_GetRuntimeClassName, + gamepad2_GetTrustLevel, + /* IGamepad2 methods */ + gamepad2_GetButtonLabel, +}; + struct gamepad_statics { IActivationFactory IActivationFactory_iface; @@ -542,6 +571,7 @@ static HRESULT WINAPI controller_factory_CreateGameController( ICustomGameContro impl->IGameControllerImpl_iface.lpVtbl = &controller_vtbl; impl->IGameControllerInputSink_iface.lpVtbl = &input_sink_vtbl; impl->IGamepad_iface.lpVtbl = &gamepad_vtbl; + impl->IGamepad2_iface.lpVtbl = &gamepad2_vtbl; impl->ref = 1; TRACE( "created Gamepad %p\n", impl ); diff --git a/dlls/windows.gaming.input/main.c b/dlls/windows.gaming.input/main.c index 21808d9c2ad..a20630cd20b 100644 --- wine/dlls/windows.gaming.input/main.c +++ wine/dlls/windows.gaming.input/main.c @@ -185,6 +185,15 @@ HRESULT WINAPI DllGetActivationFactory( HSTRING class_str, IActivationFactory ** if (!wcscmp( buffer, RuntimeClass_Windows_Gaming_Input_Custom_GameControllerFactoryManager )) IGameControllerFactoryManagerStatics2_QueryInterface( manager_factory, &IID_IActivationFactory, (void **)factory ); + if (!wcscmp( buffer, RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConstantForceEffect )) + IInspectable_QueryInterface( constant_effect_factory, &IID_IActivationFactory, (void **)factory ); + if (!wcscmp( buffer, RuntimeClass_Windows_Gaming_Input_ForceFeedback_RampForceEffect )) + IInspectable_QueryInterface( ramp_effect_factory, &IID_IActivationFactory, (void **)factory ); + if (!wcscmp( buffer, RuntimeClass_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect )) + IInspectable_QueryInterface( periodic_effect_factory, &IID_IActivationFactory, (void **)factory ); + if (!wcscmp( buffer, RuntimeClass_Windows_Gaming_Input_ForceFeedback_ConditionForceEffect )) + IInspectable_QueryInterface( condition_effect_factory, &IID_IActivationFactory, (void **)factory ); + if (*factory) return S_OK; return CLASS_E_CLASSNOTAVAILABLE; } diff --git a/dlls/windows.gaming.input/periodic_effect.c b/dlls/windows.gaming.input/periodic_effect.c new file mode 100644 index 00000000000..8633a8fb9b9 --- /dev/null +++ wine/dlls/windows.gaming.input/periodic_effect.c @@ -0,0 +1,326 @@ +/* WinRT Windows.Gaming.Input implementation + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "private.h" +#include "provider.h" + +WINE_DEFAULT_DEBUG_CHANNEL(input); + +struct periodic_effect +{ + IPeriodicForceEffect IPeriodicForceEffect_iface; + IWineForceFeedbackEffectImpl *IWineForceFeedbackEffectImpl_inner; + LONG ref; + + PeriodicForceEffectKind kind; +}; + +static inline struct periodic_effect *impl_from_IPeriodicForceEffect( IPeriodicForceEffect *iface ) +{ + return CONTAINING_RECORD( iface, struct periodic_effect, IPeriodicForceEffect_iface ); +} + +static HRESULT WINAPI effect_QueryInterface( IPeriodicForceEffect *iface, REFIID iid, void **out ) +{ + struct periodic_effect *impl = impl_from_IPeriodicForceEffect( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IPeriodicForceEffect )) + { + IInspectable_AddRef( (*out = &impl->IPeriodicForceEffect_iface) ); + return S_OK; + } + + return IWineForceFeedbackEffectImpl_QueryInterface( impl->IWineForceFeedbackEffectImpl_inner, iid, out ); +} + +static ULONG WINAPI effect_AddRef( IPeriodicForceEffect *iface ) +{ + struct periodic_effect *impl = impl_from_IPeriodicForceEffect( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI effect_Release( IPeriodicForceEffect *iface ) +{ + struct periodic_effect *impl = impl_from_IPeriodicForceEffect( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) + { + /* guard against re-entry if inner releases an outer iface */ + InterlockedIncrement( &impl->ref ); + IWineForceFeedbackEffectImpl_Release( impl->IWineForceFeedbackEffectImpl_inner ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI effect_GetIids( IPeriodicForceEffect *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_GetRuntimeClassName( IPeriodicForceEffect *iface, HSTRING *class_name ) +{ + return WindowsCreateString( RuntimeClass_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect, + ARRAY_SIZE(RuntimeClass_Windows_Gaming_Input_ForceFeedback_PeriodicForceEffect), + class_name ); +} + +static HRESULT WINAPI effect_GetTrustLevel( IPeriodicForceEffect *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_get_Kind( IPeriodicForceEffect *iface, PeriodicForceEffectKind *kind ) +{ + struct periodic_effect *impl = impl_from_IPeriodicForceEffect( iface ); + TRACE( "iface %p, kind %p.\n", iface, kind ); + *kind = impl->kind; + return S_OK; +} + +static HRESULT WINAPI effect_SetParameters( IPeriodicForceEffect *iface, Vector3 direction, FLOAT frequency, FLOAT phase, + FLOAT bias, TimeSpan duration ) +{ + struct periodic_effect *impl = impl_from_IPeriodicForceEffect( iface ); + WineForceFeedbackEffectParameters params = + { + .periodic = + { + .type = WineForceFeedbackEffectType_Periodic_SquareWave + impl->kind, + .direction = direction, + .frequency = frequency, + .phase = phase, + .bias = bias, + .duration = duration, + .repeat_count = 1, + .gain = 1., + }, + }; + + TRACE( "iface %p, direction %s, frequency %f, phase %f, bias %f, duration %I64u.\n", iface, + debugstr_vector3( &direction ), frequency, phase, bias, duration.Duration ); + + return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, NULL ); +} + +static HRESULT WINAPI effect_SetParametersWithEnvelope( IPeriodicForceEffect *iface, Vector3 direction, FLOAT frequency, FLOAT phase, FLOAT bias, + FLOAT attack_gain, FLOAT sustain_gain, FLOAT release_gain, TimeSpan start_delay, + TimeSpan attack_duration, TimeSpan sustain_duration, + TimeSpan release_duration, UINT32 repeat_count ) +{ + struct periodic_effect *impl = impl_from_IPeriodicForceEffect( iface ); + WineForceFeedbackEffectParameters params = + { + .periodic = + { + .type = WineForceFeedbackEffectType_Periodic_SquareWave + impl->kind, + .direction = direction, + .frequency = frequency, + .phase = phase, + .bias = bias, + .duration = {attack_duration.Duration + sustain_duration.Duration + release_duration.Duration}, + .start_delay = start_delay, + .repeat_count = repeat_count, + .gain = sustain_gain, + }, + }; + WineForceFeedbackEffectEnvelope envelope = + { + .attack_gain = attack_gain, + .release_gain = release_gain, + .attack_duration = attack_duration, + .release_duration = release_duration, + }; + + TRACE( "iface %p, direction %s, frequency %f, phase %f, bias %f, attack_gain %f, sustain_gain %f, release_gain %f, start_delay %I64u, " + "attack_duration %I64u, sustain_duration %I64u, release_duration %I64u, repeat_count %u.\n", iface, debugstr_vector3( &direction ), + frequency, phase, bias, attack_gain, sustain_gain, release_gain, start_delay.Duration, attack_duration.Duration, sustain_duration.Duration, + release_duration.Duration, repeat_count ); + + return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, &envelope ); +} + +static const struct IPeriodicForceEffectVtbl effect_vtbl = +{ + effect_QueryInterface, + effect_AddRef, + effect_Release, + /* IInspectable methods */ + effect_GetIids, + effect_GetRuntimeClassName, + effect_GetTrustLevel, + /* IPeriodicForceEffect methods */ + effect_get_Kind, + effect_SetParameters, + effect_SetParametersWithEnvelope, +}; + +struct periodic_factory +{ + IActivationFactory IActivationFactory_iface; + IPeriodicForceEffectFactory IPeriodicForceEffectFactory_iface; + LONG ref; +}; + +static inline struct periodic_factory *impl_from_IActivationFactory( IActivationFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct periodic_factory, IActivationFactory_iface ); +} + +static HRESULT WINAPI activation_QueryInterface( IActivationFactory *iface, REFIID iid, void **out ) +{ + struct periodic_factory *impl = impl_from_IActivationFactory( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IActivationFactory )) + { + IInspectable_AddRef( (*out = &impl->IActivationFactory_iface) ); + return S_OK; + } + + if (IsEqualGUID( iid, &IID_IPeriodicForceEffectFactory )) + { + IInspectable_AddRef( (*out = &impl->IPeriodicForceEffectFactory_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI activation_AddRef( IActivationFactory *iface ) +{ + struct periodic_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI activation_Release( IActivationFactory *iface ) +{ + struct periodic_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static HRESULT WINAPI activation_GetIids( IActivationFactory *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetRuntimeClassName( IActivationFactory *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetTrustLevel( IActivationFactory *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) +{ + FIXME( "iface %p, instance %p stub!\n", iface, instance ); + return E_NOTIMPL; +} + +static const struct IActivationFactoryVtbl activation_vtbl = +{ + activation_QueryInterface, + activation_AddRef, + activation_Release, + /* IInspectable methods */ + activation_GetIids, + activation_GetRuntimeClassName, + activation_GetTrustLevel, + /* IActivationFactory methods */ + activation_ActivateInstance, +}; + +DEFINE_IINSPECTABLE( factory, IPeriodicForceEffectFactory, struct periodic_factory, IActivationFactory_iface ) + +static HRESULT WINAPI factory_CreateInstance( IPeriodicForceEffectFactory *iface, enum PeriodicForceEffectKind kind, IForceFeedbackEffect **out ) +{ + enum WineForceFeedbackEffectType type = WineForceFeedbackEffectType_Periodic + kind; + struct periodic_effect *impl; + HRESULT hr; + + TRACE( "iface %p, kind %u, out %p.\n", iface, kind, out ); + + if (!(impl = calloc( 1, sizeof(struct periodic_effect) ))) return E_OUTOFMEMORY; + impl->IPeriodicForceEffect_iface.lpVtbl = &effect_vtbl; + impl->ref = 1; + impl->kind = kind; + + if (FAILED(hr = force_feedback_effect_create( type, (IInspectable *)&impl->IPeriodicForceEffect_iface, &impl->IWineForceFeedbackEffectImpl_inner )) || + FAILED(hr = IPeriodicForceEffect_QueryInterface( &impl->IPeriodicForceEffect_iface, &IID_IForceFeedbackEffect, (void **)out ))) + { + if (impl->IWineForceFeedbackEffectImpl_inner) IWineForceFeedbackEffectImpl_Release( impl->IWineForceFeedbackEffectImpl_inner ); + free( impl ); + return hr; + } + + IPeriodicForceEffect_Release( &impl->IPeriodicForceEffect_iface ); + TRACE( "created PeriodicForceEffect %p\n", *out ); + return S_OK; +} + +static const struct IPeriodicForceEffectFactoryVtbl factory_vtbl = +{ + factory_QueryInterface, + factory_AddRef, + factory_Release, + /* IInspectable methods */ + factory_GetIids, + factory_GetRuntimeClassName, + factory_GetTrustLevel, + /* IPeriodicForceEffectFactory methods */ + factory_CreateInstance, +}; + +static struct periodic_factory periodic_statics = +{ + {&activation_vtbl}, + {&factory_vtbl}, + 1, +}; + +IInspectable *periodic_effect_factory = (IInspectable *)&periodic_statics.IActivationFactory_iface; diff --git a/dlls/windows.gaming.input/private.h b/dlls/windows.gaming.input/private.h index 58b2040d3de..f53d5b5bc37 100644 --- wine/dlls/windows.gaming.input/private.h +++ wine/dlls/windows.gaming.input/private.h @@ -25,11 +25,13 @@ #include "winbase.h" #include "winstring.h" #include "objbase.h" +#include "dinput.h" #include "activation.h" #define WIDL_using_Windows_Foundation #define WIDL_using_Windows_Foundation_Collections +#define WIDL_using_Windows_Foundation_Numerics #include "windows.foundation.h" #define WIDL_using_Windows_Devices_Power #define WIDL_using_Windows_Gaming_Input @@ -37,13 +39,20 @@ #define WIDL_using_Windows_Gaming_Input_ForceFeedback #include "windows.gaming.input.custom.h" +#include "wine/debug.h" #include "wine/list.h" +#include "provider.h" + extern HINSTANCE windows_gaming_input; extern ICustomGameControllerFactory *controller_factory; extern ICustomGameControllerFactory *gamepad_factory; extern ICustomGameControllerFactory *racing_wheel_factory; extern IGameControllerFactoryManagerStatics2 *manager_factory; +extern IInspectable *constant_effect_factory; +extern IInspectable *ramp_effect_factory; +extern IInspectable *periodic_effect_factory; +extern IInspectable *condition_effect_factory; struct vector_iids { @@ -64,6 +73,15 @@ extern HRESULT event_handlers_append( struct list *list, IEventHandler_IInspecta extern HRESULT event_handlers_remove( struct list *list, EventRegistrationToken *token ); extern void event_handlers_notify( struct list *list, IInspectable *element ); +extern HRESULT force_feedback_motor_create( IDirectInputDevice8W *device, IForceFeedbackMotor **out ); +extern HRESULT force_feedback_effect_create( enum WineForceFeedbackEffectType type, IInspectable *outer, IWineForceFeedbackEffectImpl **out ); + +typedef HRESULT (WINAPI *async_operation_callback)( IUnknown *invoker, IUnknown *param, PROPVARIANT *result ); +extern HRESULT async_operation_boolean_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, + IAsyncOperation_boolean **out ); +extern HRESULT async_operation_effect_result_create( IUnknown *invoker, IUnknown *param, async_operation_callback callback, + IAsyncOperation_ForceFeedbackLoadEffectResult **out ); + #define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \ static inline impl_type *impl_from( iface_type *iface ) \ { \ @@ -103,3 +121,9 @@ extern void event_handlers_notify( struct list *list, IInspectable *element ); DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, &impl->base_iface ) #define DEFINE_IINSPECTABLE_OUTER( pfx, iface_type, impl_type, outer_iface ) \ DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, impl->outer_iface ) + +static inline const char *debugstr_vector3( const Vector3 *vector ) +{ + if (!vector) return "(null)"; + return wine_dbg_sprintf( "[%f, %f, %f]", vector->X, vector->Y, vector->Z ); +} diff --git a/dlls/windows.gaming.input/provider.c b/dlls/windows.gaming.input/provider.c index 69098e8abb6..d0472727224 100644 --- wine/dlls/windows.gaming.input/provider.c +++ wine/dlls/windows.gaming.input/provider.c @@ -141,21 +141,37 @@ static HRESULT WINAPI wine_provider_GetTrustLevel( IWineGameControllerProvider * return E_NOTIMPL; } +static BOOL CALLBACK count_ffb_axes( const DIDEVICEOBJECTINSTANCEW *obj, void *args ) +{ + DWORD *count = args; + if (obj->dwType & DIDFT_FFACTUATOR) (*count)++; + return DIENUM_CONTINUE; +} + static HRESULT WINAPI wine_provider_get_Type( IWineGameControllerProvider *iface, WineGameControllerType *value ) { struct provider *impl = impl_from_IWineGameControllerProvider( iface ); DIDEVICEINSTANCEW instance = {.dwSize = sizeof(DIDEVICEINSTANCEW)}; + const WCHAR *tmp; HRESULT hr; TRACE( "iface %p, value %p.\n", iface, value ); if (FAILED(hr = IDirectInputDevice8_GetDeviceInfo( impl->dinput_device, &instance ))) return hr; - switch (GET_DIDEVICE_TYPE( instance.dwDevType )) + if ((tmp = wcschr( impl->device_path + 8, '#' )) && !wcsnicmp( tmp - 6, L"&XI_", 4 )) + *value = WineGameControllerType_Gamepad; + else switch (GET_DIDEVICE_TYPE( instance.dwDevType )) { case DI8DEVTYPE_DRIVING: *value = WineGameControllerType_RacingWheel; break; - case DI8DEVTYPE_GAMEPAD: *value = WineGameControllerType_Gamepad; break; - default: *value = WineGameControllerType_Joystick; break; + default: + { + DWORD count = 0; + hr = IDirectInputDevice8_EnumObjects( impl->dinput_device, count_ffb_axes, &count, DIDFT_AXIS ); + if (SUCCEEDED(hr) && count == 1) *value = WineGameControllerType_RacingWheel; + else *value = WineGameControllerType_Joystick; + break; + } } return S_OK; @@ -212,7 +228,7 @@ static HRESULT WINAPI wine_provider_get_State( IWineGameControllerProvider *ifac if (FAILED(hr = IDirectInputDevice8_GetDeviceState( impl->dinput_device, sizeof(state), &state ))) { WARN( "Failed to read device state, hr %#lx\n", hr ); - return hr; + return S_OK; } i = ARRAY_SIZE(state.rgbButtons); @@ -315,6 +331,21 @@ static HRESULT WINAPI wine_provider_put_Vibration( IWineGameControllerProvider * return S_OK; } +static HRESULT WINAPI wine_provider_get_ForceFeedbackMotor( IWineGameControllerProvider *iface, IForceFeedbackMotor **value ) +{ + struct provider *impl = impl_from_IWineGameControllerProvider( iface ); + DIDEVCAPS caps = {.dwSize = sizeof(DIDEVCAPS)}; + HRESULT hr; + + TRACE( "iface %p, value %p.\n", iface, value ); + + if (SUCCEEDED(hr = IDirectInputDevice8_GetCapabilities( impl->dinput_device, &caps )) && (caps.dwFlags & DIDC_FORCEFEEDBACK)) + return force_feedback_motor_create( impl->dinput_device, value ); + + *value = NULL; + return S_OK; +} + static const struct IWineGameControllerProviderVtbl wine_provider_vtbl = { wine_provider_QueryInterface, @@ -332,6 +363,7 @@ static const struct IWineGameControllerProviderVtbl wine_provider_vtbl = wine_provider_get_State, wine_provider_get_Vibration, wine_provider_put_Vibration, + wine_provider_get_ForceFeedbackMotor, }; DEFINE_IINSPECTABLE( game_provider, IGameControllerProvider, struct provider, IWineGameControllerProvider_iface ) @@ -556,7 +588,7 @@ void provider_create( const WCHAR *device_path ) EnterCriticalSection( &provider_cs ); LIST_FOR_EACH_ENTRY( entry, &provider_list, struct provider, entry ) - if ((found = !wcscmp( entry->device_path, device_path ))) break; + if ((found = !wcsicmp( entry->device_path, device_path ))) break; if (!found) list_add_tail( &provider_list, &impl->entry ); LeaveCriticalSection( &provider_cs ); @@ -576,11 +608,12 @@ void provider_remove( const WCHAR *device_path ) EnterCriticalSection( &provider_cs ); LIST_FOR_EACH_ENTRY( entry, &provider_list, struct provider, entry ) - if ((found = !wcscmp( entry->device_path, device_path ))) break; + if ((found = !wcsicmp( entry->device_path, device_path ))) break; if (found) list_remove( &entry->entry ); LeaveCriticalSection( &provider_cs ); - if (found) + if (!found) WARN( "provider not found for device %s\n", debugstr_w( device_path ) ); + else { provider = &entry->IGameControllerProvider_iface; manager_on_provider_removed( provider ); diff --git a/dlls/windows.gaming.input/provider.idl b/dlls/windows.gaming.input/provider.idl index 865a149eaa5..e7b6e96b8aa 100644 --- wine/dlls/windows.gaming.input/provider.idl +++ wine/dlls/windows.gaming.input/provider.idl @@ -22,6 +22,7 @@ #pragma winrt ns_prefix #endif +import "propidl.idl"; import "inspectable.idl"; import "asyncinfo.idl"; import "eventtoken.idl"; @@ -29,14 +30,25 @@ import "windowscontracts.idl"; import "windows.foundation.idl"; import "windows.gaming.input.idl"; import "windows.gaming.input.custom.idl"; +import "windows.gaming.input.forcefeedback.idl"; namespace Windows.Gaming.Input.Custom { typedef enum WineGameControllerType WineGameControllerType; + typedef enum WineForceFeedbackEffectType WineForceFeedbackEffectType; typedef struct WineGameControllerState WineGameControllerState; typedef struct WineGameControllerVibration WineGameControllerVibration; + typedef struct WineConditionEffectParameters WineConditionEffectParameters; + typedef struct WineConstantEffectParameters WineConstantEffectParameters; + typedef struct WineRampEffectParameters WineRampEffectParameters; + typedef struct WinePeriodicEffectParameters WinePeriodicEffectParameters; + typedef struct WineForceFeedbackEffectEnvelope WineForceFeedbackEffectEnvelope; + typedef union WineForceFeedbackEffectParameters WineForceFeedbackEffectParameters; interface IWineGameControllerProvider; runtimeclass WineGameControllerProvider; + /* type-pruning version of AsyncOperationCompletedHandler */ + delegate HRESULT WineAsyncOperationCompletedHandler([in] IInspectable *async, [in] AsyncStatus status); + enum WineGameControllerType { Joystick = 0, @@ -44,6 +56,27 @@ namespace Windows.Gaming.Input.Custom { RacingWheel = 2, }; + enum WineForceFeedbackEffectType + { + Constant = 1, + Ramp = 2, + + Periodic = 10, + /* same order as PeriodicForceEffectKind */ + Periodic_SquareWave = 10, + Periodic_SineWave = 11, + Periodic_TriangleWave = 12, + Periodic_SawtoothWaveUp = 13, + Periodic_SawtoothWaveDown = 14, + + Condition = 20, + /* same order as ConditionForceEffectKind */ + Condition_Spring = 20, + Condition_Damper = 21, + Condition_Inertia = 22, + Condition_Friction = 23, + }; + struct WineGameControllerState { UINT64 timestamp; @@ -60,6 +93,69 @@ namespace Windows.Gaming.Input.Custom { UINT16 right; }; + struct WineConditionEffectParameters + { + WineForceFeedbackEffectType type; + Windows.Foundation.Numerics.Vector3 direction; + FLOAT positive_coeff; + FLOAT negative_coeff; + FLOAT max_positive_magnitude; + FLOAT max_negative_magnitude; + FLOAT deadzone; + FLOAT bias; + }; + + struct WineConstantEffectParameters + { + WineForceFeedbackEffectType type; + Windows.Foundation.Numerics.Vector3 direction; + Windows.Foundation.TimeSpan duration; + Windows.Foundation.TimeSpan start_delay; + UINT32 repeat_count; + FLOAT gain; + }; + + struct WineRampEffectParameters + { + WineForceFeedbackEffectType type; + Windows.Foundation.Numerics.Vector3 start_vector; + Windows.Foundation.Numerics.Vector3 end_vector; + Windows.Foundation.TimeSpan duration; + Windows.Foundation.TimeSpan start_delay; + UINT32 repeat_count; + FLOAT gain; + }; + + struct WinePeriodicEffectParameters + { + WineForceFeedbackEffectType type; + Windows.Foundation.Numerics.Vector3 direction; + Windows.Foundation.TimeSpan duration; + Windows.Foundation.TimeSpan start_delay; + UINT32 repeat_count; + FLOAT frequency; + FLOAT phase; + FLOAT bias; + FLOAT gain; + }; + + struct WineForceFeedbackEffectEnvelope + { + FLOAT attack_gain; + FLOAT release_gain; + Windows.Foundation.TimeSpan attack_duration; + Windows.Foundation.TimeSpan release_duration; + }; + + union WineForceFeedbackEffectParameters + { + WineForceFeedbackEffectType type; + WineConditionEffectParameters condition; + WineConstantEffectParameters constant; + WineRampEffectParameters ramp; + WinePeriodicEffectParameters periodic; + }; + [ uuid(06e58977-7684-4dc5-bad1-cda52a4aa06d) ] @@ -85,6 +181,29 @@ namespace Windows.Gaming.Input.Custom { [propget] HRESULT State([out, retval] WineGameControllerState *state); [propget] HRESULT Vibration([out, retval] WineGameControllerVibration *vibration); [propput] HRESULT Vibration([in] WineGameControllerVibration vibration); + + [propget] HRESULT ForceFeedbackMotor([out, retval] Windows.Gaming.Input.ForceFeedback.ForceFeedbackMotor **motor); + } + + [ + uuid(27833469-7760-417e-adbe-e011a66e16ee) + ] + interface IWineForceFeedbackEffectImpl : IUnknown + requires Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect + { + [propput] HRESULT Parameters([in] WineForceFeedbackEffectParameters parameters, + [in, optional] WineForceFeedbackEffectEnvelope *envelope); + } + + [ + uuid(83f377ee-c799-11ec-9d64-0242ac120002) + ] + interface IWineAsyncInfoImpl : IUnknown + { + [propput] HRESULT Completed([in] WineAsyncOperationCompletedHandler *handler); + [propget] HRESULT Completed([out, retval] WineAsyncOperationCompletedHandler **handler); + [propget] HRESULT Result([out, retval] PROPVARIANT *result); + HRESULT Start(); } [ diff --git a/dlls/windows.gaming.input/racing_wheel.c b/dlls/windows.gaming.input/racing_wheel.c index b4635d03153..d646ca26c03 100644 --- wine/dlls/windows.gaming.input/racing_wheel.c +++ wine/dlls/windows.gaming.input/racing_wheel.c @@ -99,7 +99,7 @@ static HRESULT WINAPI controller_QueryInterface( IGameControllerImpl *iface, REF return S_OK; } - WARN( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; } @@ -245,8 +245,11 @@ static HRESULT WINAPI racing_wheel_get_MaxWheelAngle( IRacingWheel *iface, DOUBL static HRESULT WINAPI racing_wheel_get_WheelMotor( IRacingWheel *iface, IForceFeedbackMotor **value ) { - FIXME( "iface %p, value %p stub!\n", iface, value ); - return E_NOTIMPL; + struct racing_wheel *impl = impl_from_IRacingWheel( iface ); + + TRACE( "iface %p, value %p\n", iface, value ); + + return IWineGameControllerProvider_get_ForceFeedbackMotor( impl->wine_provider, value ); } static HRESULT WINAPI racing_wheel_GetButtonLabel( IRacingWheel *iface, enum RacingWheelButtons button, diff --git a/dlls/windows.gaming.input/ramp_effect.c b/dlls/windows.gaming.input/ramp_effect.c new file mode 100644 index 00000000000..fadcf151c04 --- /dev/null +++ wine/dlls/windows.gaming.input/ramp_effect.c @@ -0,0 +1,278 @@ +/* WinRT Windows.Gaming.Input implementation + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "private.h" +#include "provider.h" + +WINE_DEFAULT_DEBUG_CHANNEL(input); + +struct ramp_effect +{ + IRampForceEffect IRampForceEffect_iface; + IWineForceFeedbackEffectImpl *IWineForceFeedbackEffectImpl_inner; + LONG ref; +}; + +static inline struct ramp_effect *impl_from_IRampForceEffect( IRampForceEffect *iface ) +{ + return CONTAINING_RECORD( iface, struct ramp_effect, IRampForceEffect_iface ); +} + +static HRESULT WINAPI effect_QueryInterface( IRampForceEffect *iface, REFIID iid, void **out ) +{ + struct ramp_effect *impl = impl_from_IRampForceEffect( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IRampForceEffect )) + { + IInspectable_AddRef( (*out = &impl->IRampForceEffect_iface) ); + return S_OK; + } + + return IWineForceFeedbackEffectImpl_QueryInterface( impl->IWineForceFeedbackEffectImpl_inner, iid, out ); +} + +static ULONG WINAPI effect_AddRef( IRampForceEffect *iface ) +{ + struct ramp_effect *impl = impl_from_IRampForceEffect( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI effect_Release( IRampForceEffect *iface ) +{ + struct ramp_effect *impl = impl_from_IRampForceEffect( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + + if (!ref) + { + /* guard against re-entry if inner releases an outer iface */ + InterlockedIncrement( &impl->ref ); + IWineForceFeedbackEffectImpl_Release( impl->IWineForceFeedbackEffectImpl_inner ); + free( impl ); + } + + return ref; +} + +static HRESULT WINAPI effect_GetIids( IRampForceEffect *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_GetRuntimeClassName( IRampForceEffect *iface, HSTRING *class_name ) +{ + return WindowsCreateString( RuntimeClass_Windows_Gaming_Input_ForceFeedback_RampForceEffect, + ARRAY_SIZE(RuntimeClass_Windows_Gaming_Input_ForceFeedback_RampForceEffect), + class_name ); +} + +static HRESULT WINAPI effect_GetTrustLevel( IRampForceEffect *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI effect_SetParameters( IRampForceEffect *iface, Vector3 start_vector, Vector3 end_vector, TimeSpan duration ) +{ + WineForceFeedbackEffectParameters params = + { + .ramp = + { + .type = WineForceFeedbackEffectType_Ramp, + .start_vector = start_vector, + .end_vector = end_vector, + .duration = duration, + .repeat_count = 1, + .gain = 1., + }, + }; + struct ramp_effect *impl = impl_from_IRampForceEffect( iface ); + + TRACE( "iface %p, start_vector %s, end_vector %s, duration %I64u.\n", iface, + debugstr_vector3( &start_vector ), debugstr_vector3( &end_vector ), duration.Duration ); + + return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, NULL ); +} + +static HRESULT WINAPI effect_SetParametersWithEnvelope( IRampForceEffect *iface, Vector3 start_vector, Vector3 end_vector, FLOAT attack_gain, + FLOAT sustain_gain, FLOAT release_gain, TimeSpan start_delay, + TimeSpan attack_duration, TimeSpan sustain_duration, + TimeSpan release_duration, UINT32 repeat_count ) +{ + WineForceFeedbackEffectParameters params = + { + .ramp = + { + .type = WineForceFeedbackEffectType_Ramp, + .start_vector = start_vector, + .end_vector = end_vector, + .duration = {attack_duration.Duration + sustain_duration.Duration + release_duration.Duration}, + .start_delay = start_delay, + .repeat_count = repeat_count, + .gain = sustain_gain, + }, + }; + WineForceFeedbackEffectEnvelope envelope = + { + .attack_gain = attack_gain, + .release_gain = release_gain, + .attack_duration = attack_duration, + .release_duration = release_duration, + }; + struct ramp_effect *impl = impl_from_IRampForceEffect( iface ); + + TRACE( "iface %p, start_vector %s, end_vector %s, attack_gain %f, sustain_gain %f, release_gain %f, start_delay %I64u, attack_duration %I64u, " + "sustain_duration %I64u, release_duration %I64u, repeat_count %u.\n", iface, debugstr_vector3( &start_vector ), debugstr_vector3( &end_vector ), + attack_gain, sustain_gain, release_gain, start_delay.Duration, attack_duration.Duration, sustain_duration.Duration, + release_duration.Duration, repeat_count ); + + return IWineForceFeedbackEffectImpl_put_Parameters( impl->IWineForceFeedbackEffectImpl_inner, params, &envelope ); +} + +static const struct IRampForceEffectVtbl effect_vtbl = +{ + effect_QueryInterface, + effect_AddRef, + effect_Release, + /* IInspectable methods */ + effect_GetIids, + effect_GetRuntimeClassName, + effect_GetTrustLevel, + /* IRampForceEffect methods */ + effect_SetParameters, + effect_SetParametersWithEnvelope, +}; + +struct ramp_factory +{ + IActivationFactory IActivationFactory_iface; + LONG ref; +}; + +static inline struct ramp_factory *impl_from_IActivationFactory( IActivationFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct ramp_factory, IActivationFactory_iface ); +} + +static HRESULT WINAPI activation_QueryInterface( IActivationFactory *iface, REFIID iid, void **out ) +{ + struct ramp_factory *impl = impl_from_IActivationFactory( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IActivationFactory )) + { + IInspectable_AddRef( (*out = &impl->IActivationFactory_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI activation_AddRef( IActivationFactory *iface ) +{ + struct ramp_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI activation_Release( IActivationFactory *iface ) +{ + struct ramp_factory *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static HRESULT WINAPI activation_GetIids( IActivationFactory *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetRuntimeClassName( IActivationFactory *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_GetTrustLevel( IActivationFactory *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI activation_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) +{ + struct ramp_effect *impl; + HRESULT hr; + + TRACE( "iface %p, instance %p.\n", iface, instance ); + + if (!(impl = calloc( 1, sizeof(struct ramp_effect) ))) return E_OUTOFMEMORY; + impl->IRampForceEffect_iface.lpVtbl = &effect_vtbl; + impl->ref = 1; + + if (FAILED(hr = force_feedback_effect_create( WineForceFeedbackEffectType_Ramp, (IInspectable *)&impl->IRampForceEffect_iface, + &impl->IWineForceFeedbackEffectImpl_inner ))) + { + free( impl ); + return hr; + } + + *instance = (IInspectable *)&impl->IRampForceEffect_iface; + TRACE( "created RampForceEffect %p\n", *instance ); + return S_OK; +} + +static const struct IActivationFactoryVtbl activation_vtbl = +{ + activation_QueryInterface, + activation_AddRef, + activation_Release, + /* IInspectable methods */ + activation_GetIids, + activation_GetRuntimeClassName, + activation_GetTrustLevel, + /* IActivationFactory methods */ + activation_ActivateInstance, +}; + +static struct ramp_factory ramp_statics = +{ + {&activation_vtbl}, + 1, +}; + +IInspectable *ramp_effect_factory = (IInspectable *)&ramp_statics.IActivationFactory_iface; diff --git a/dlls/windows.gaming.input/vector.c b/dlls/windows.gaming.input/vector.c index db1a9057682..8958b07c0f2 100644 --- wine/dlls/windows.gaming.input/vector.c +++ wine/dlls/windows.gaming.input/vector.c @@ -54,7 +54,7 @@ static HRESULT WINAPI iterator_QueryInterface( IIterator_IInspectable *iface, RE return S_OK; } - WARN( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; } @@ -189,7 +189,7 @@ static HRESULT WINAPI vector_view_QueryInterface( IVectorView_IInspectable *ifac return S_OK; } - WARN( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; } @@ -384,7 +384,7 @@ static HRESULT WINAPI vector_QueryInterface( IVector_IInspectable *iface, REFIID return S_OK; } - WARN( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); *out = NULL; return E_NOINTERFACE; } diff --git a/include/Makefile.in b/include/Makefile.in index 19d0088e431..cade5bb49dd 100644 --- wine/include/Makefile.in +++ wine/include/Makefile.in @@ -788,8 +788,10 @@ SOURCES = \ windows.foundation.collections.idl \ windows.foundation.idl \ windows.foundation.metadata.idl \ + windows.foundation.numerics.idl \ windows.gaming.input.custom.idl \ windows.gaming.input.forcefeedback.idl \ + windows.gaming.ui.idl \ windows.gaming.input.idl \ windows.globalization.idl \ windows.h \ diff --git a/include/windows.foundation.numerics.idl b/include/windows.foundation.numerics.idl new file mode 100644 index 00000000000..eca99ca29bc --- /dev/null +++ wine/include/windows.foundation.numerics.idl @@ -0,0 +1,39 @@ +/* + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifdef __WIDL__ +#pragma winrt ns_prefix +#endif + +import "inspectable.idl"; +import "asyncinfo.idl"; +import "eventtoken.idl"; +import "windowscontracts.idl"; +import "windows.foundation.idl"; + +namespace Windows.Foundation.Numerics { + typedef struct Vector3 Vector3; + + [contract(Windows.Foundation.UniversalApiContract, 1.0)] + struct Vector3 + { + FLOAT X; + FLOAT Y; + FLOAT Z; + }; +} diff --git a/include/windows.gaming.input.forcefeedback.idl b/include/windows.gaming.input.forcefeedback.idl index 432b60a5592..82fb083b34b 100644 --- wine/include/windows.gaming.input.forcefeedback.idl +++ wine/include/windows.gaming.input.forcefeedback.idl @@ -20,23 +20,41 @@ #pragma winrt ns_prefix #endif +#ifndef DO_NO_IMPORTS import "inspectable.idl"; import "asyncinfo.idl"; import "eventtoken.idl"; import "windowscontracts.idl"; import "windows.foundation.idl"; +import "windows.foundation.numerics.idl"; +#endif namespace Windows.Gaming.Input.ForceFeedback { typedef enum ForceFeedbackEffectAxes ForceFeedbackEffectAxes; typedef enum ForceFeedbackEffectState ForceFeedbackEffectState; typedef enum ForceFeedbackLoadEffectResult ForceFeedbackLoadEffectResult; + typedef enum PeriodicForceEffectKind PeriodicForceEffectKind; + typedef enum ConditionForceEffectKind ConditionForceEffectKind; interface IForceFeedbackEffect; + interface IPeriodicForceEffect; + interface IPeriodicForceEffectFactory; + interface IConditionForceEffect; + interface IConditionForceEffectFactory; + interface IConstantForceEffect; + interface IRampForceEffect; runtimeclass ForceFeedbackMotor; + runtimeclass PeriodicForceEffect; + runtimeclass ConditionForceEffect; + runtimeclass ConstantForceEffect; + runtimeclass RampForceEffect; declare { interface Windows.Foundation.AsyncOperationCompletedHandler; interface Windows.Foundation.IAsyncOperation; + interface Windows.Foundation.Collections.IIterator; + interface Windows.Foundation.Collections.IIterable; interface Windows.Foundation.Collections.IVectorView; + interface Windows.Foundation.Collections.IVector; } [ @@ -68,6 +86,25 @@ namespace Windows.Gaming.Input.ForceFeedback { EffectNotSupported = 2 }; + [contract(Windows.Foundation.UniversalApiContract, 3.0)] + enum PeriodicForceEffectKind + { + SquareWave = 0, + SineWave = 1, + TriangleWave = 2, + SawtoothWaveUp = 3, + SawtoothWaveDown = 4, + }; + + [contract(Windows.Foundation.UniversalApiContract, 3.0)] + enum ConditionForceEffectKind + { + Spring = 0, + Damper = 1, + Inertia = 2, + Friction = 3, + }; + [ contract(Windows.Foundation.UniversalApiContract, 3.0), uuid(a17fba0c-2ae4-48c2-8063-eabd0777cb89) @@ -105,6 +142,91 @@ namespace Windows.Gaming.Input.ForceFeedback { [out, retval] Windows.Foundation.IAsyncOperation **async_op); } + [ + contract(Windows.Foundation.UniversalApiContract, 3.0), + exclusiveto(Windows.Gaming.Input.ForceFeedback.PeriodicForceEffect), + uuid(5c5138d7-fc75-4d52-9a0a-efe4cab5fe64) + ] + interface IPeriodicForceEffect : IInspectable + requires Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect + { + [propget] HRESULT Kind([out, retval] Windows.Gaming.Input.ForceFeedback.PeriodicForceEffectKind *value); + HRESULT SetParameters([in] Windows.Foundation.Numerics.Vector3 vector, [in] FLOAT frequency, [in] FLOAT phase, + [in] FLOAT bias, [in] Windows.Foundation.TimeSpan duration); + HRESULT SetParametersWithEnvelope([in] Windows.Foundation.Numerics.Vector3 vector, [in] FLOAT frequency, [in] FLOAT phase, + [in] FLOAT bias, [in] FLOAT attack_gain, [in] FLOAT sustain_gain, [in] FLOAT release_gain, + [in] Windows.Foundation.TimeSpan start_delay, [in] Windows.Foundation.TimeSpan attack_duration, + [in] Windows.Foundation.TimeSpan sustain_duration, [in] Windows.Foundation.TimeSpan release_duration, + [in] UINT32 repeat_count); + } + + [ + contract(Windows.Foundation.UniversalApiContract, 3.0), + exclusiveto(Windows.Gaming.Input.ForceFeedback.PeriodicForceEffect), + uuid(6f62eb1a-9851-477b-b318-35ecaa15070f) + ] + interface IPeriodicForceEffectFactory : IInspectable + { + HRESULT CreateInstance([in] Windows.Gaming.Input.ForceFeedback.PeriodicForceEffectKind kind, + [out, retval] Windows.Gaming.Input.ForceFeedback.PeriodicForceEffect **value); + } + + [ + contract(Windows.Foundation.UniversalApiContract, 3.0), + exclusiveto(Windows.Gaming.Input.ForceFeedback.ConditionForceEffect), + uuid(32d1ea68-3695-4e69-85c0-cd1944189140) + ] + interface IConditionForceEffect : IInspectable + requires Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect + { + [propget] HRESULT Kind([out, retval] Windows.Gaming.Input.ForceFeedback.ConditionForceEffectKind *value); + HRESULT SetParameters([in] Windows.Foundation.Numerics.Vector3 direction, [in] FLOAT positive_coeff, + [in] FLOAT negative_coeff, [in] FLOAT max_positive_magnitude, [in] FLOAT max_negative_magnitude, + [in] FLOAT deadzone, [in] FLOAT bias); + } + + [ + contract(Windows.Foundation.UniversalApiContract, 3.0), + exclusiveto(Windows.Gaming.Input.ForceFeedback.ConditionForceEffect), + uuid(91a99264-1810-4eb6-a773-bfd3b8cddbab) + ] + interface IConditionForceEffectFactory : IInspectable + { + HRESULT CreateInstance([in] Windows.Gaming.Input.ForceFeedback.ConditionForceEffectKind kind, + [out, retval] Windows.Gaming.Input.ForceFeedback.ConditionForceEffect **value); + } + + [ + contract(Windows.Foundation.UniversalApiContract, 3.0), + exclusiveto(Windows.Gaming.Input.ForceFeedback.ConstantForceEffect), + uuid(9bfa0140-f3c7-415c-b068-0f068734bce0) + ] + interface IConstantForceEffect : IInspectable + requires Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect + { + HRESULT SetParameters([in] Windows.Foundation.Numerics.Vector3 vector, [in] Windows.Foundation.TimeSpan duration); + HRESULT SetParametersWithEnvelope([in] Windows.Foundation.Numerics.Vector3 vector, [in] FLOAT attack_gain, + [in] FLOAT sustain_gain, [in] FLOAT release_gain, [in] Windows.Foundation.TimeSpan start_delay, + [in] Windows.Foundation.TimeSpan attack_duration, [in] Windows.Foundation.TimeSpan sustain_duration, + [in] Windows.Foundation.TimeSpan release_duration, [in] UINT32 repeat_count); + } + + [ + contract(Windows.Foundation.UniversalApiContract, 3.0), + exclusiveto(Windows.Gaming.Input.ForceFeedback.RampForceEffect), + uuid(f1f81259-1ca6-4080-b56d-b43f3354d052) + ] + interface IRampForceEffect : IInspectable + requires Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect + { + HRESULT SetParameters([in] Windows.Foundation.Numerics.Vector3 start_vector, [in] Windows.Foundation.Numerics.Vector3 end_vector, + [in] Windows.Foundation.TimeSpan duration); + HRESULT SetParametersWithEnvelope([in] Windows.Foundation.Numerics.Vector3 start_vector, [in] Windows.Foundation.Numerics.Vector3 end_vector, + [in] FLOAT attack_gain, [in] FLOAT sustain_gain, [in] FLOAT release_gain, [in] Windows.Foundation.TimeSpan start_delay, + [in] Windows.Foundation.TimeSpan attack_duration, [in] Windows.Foundation.TimeSpan sustain_duration, + [in] Windows.Foundation.TimeSpan release_duration, [in] UINT32 repeat_count); + } + [ contract(Windows.Foundation.UniversalApiContract, 3.0), marshaling_behavior(agile), @@ -114,4 +236,52 @@ namespace Windows.Gaming.Input.ForceFeedback { { [default] interface Windows.Gaming.Input.ForceFeedback.IForceFeedbackMotor; } + + [ + activatable(Windows.Gaming.Input.ForceFeedback.IPeriodicForceEffectFactory, Windows.Foundation.UniversalApiContract, 3.0), + contract(Windows.Foundation.UniversalApiContract, 3.0), + marshaling_behavior(agile), + threading(both) + ] + runtimeclass PeriodicForceEffect + { + [default] interface Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect; + interface Windows.Gaming.Input.ForceFeedback.IPeriodicForceEffect; + } + + [ + activatable(Windows.Gaming.Input.ForceFeedback.IConditionForceEffectFactory, Windows.Foundation.UniversalApiContract, 3.0), + contract(Windows.Foundation.UniversalApiContract, 3.0), + marshaling_behavior(agile), + threading(both) + ] + runtimeclass ConditionForceEffect + { + [default] interface Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect; + interface Windows.Gaming.Input.ForceFeedback.IConditionForceEffect; + } + + [ + activatable(Windows.Foundation.UniversalApiContract, 3.0), + contract(Windows.Foundation.UniversalApiContract, 3.0), + marshaling_behavior(agile), + threading(both) + ] + runtimeclass ConstantForceEffect + { + [default] interface Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect; + interface Windows.Gaming.Input.ForceFeedback.IConstantForceEffect; + } + + [ + activatable(Windows.Foundation.UniversalApiContract, 3.0), + contract(Windows.Foundation.UniversalApiContract, 3.0), + marshaling_behavior(agile), + threading(both) + ] + runtimeclass RampForceEffect + { + [default] interface Windows.Gaming.Input.ForceFeedback.IForceFeedbackEffect; + interface Windows.Gaming.Input.ForceFeedback.IRampForceEffect; + } } diff --git a/include/windows.gaming.input.idl b/include/windows.gaming.input.idl index fdae3aa70b1..5fc5265247d 100644 --- wine/include/windows.gaming.input.idl +++ wine/include/windows.gaming.input.idl @@ -446,6 +446,19 @@ namespace Windows.Gaming.Input { HRESULT GetCurrentReading([out, retval] Windows.Gaming.Input.GamepadReading *value); } + [ + contract(Windows.Foundation.UniversalApiContract, 3.0), + exclusiveto(Windows.Gaming.Input.Gamepad), + uuid(3c1689bd-5915-4245-b0c0-c89fae0308ff) + ] + interface IGamepad2 : IInspectable + requires Windows.Gaming.Input.IGamepad, + Windows.Gaming.Input.IGameController + { + HRESULT GetButtonLabel([in] Windows.Gaming.Input.GamepadButtons button, + [out, retval] Windows.Gaming.Input.GameControllerButtonLabel *value); + } + [ contract(Windows.Foundation.UniversalApiContract, 3.0), exclusiveto(Windows.Gaming.Input.RacingWheel), diff --git a/include/windows.gaming.ui.idl b/include/windows.gaming.ui.idl new file mode 100644 index 00000000000..730f5dd90f7 --- /dev/null +++ wine/include/windows.gaming.ui.idl @@ -0,0 +1,61 @@ +/* + * Copyright 2022 Paul Gofman for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifdef __WIDL__ +#pragma winrt ns_prefix +#endif + +#ifndef DO_NO_IMPORTS +import "inspectable.idl"; +import "eventtoken.idl"; +import "windowscontracts.idl"; +import "windows.foundation.idl"; +#endif + +namespace Windows.Gaming.UI { + runtimeclass GameBar; + + declare { + interface Windows.Foundation.EventHandler; + } + + [ + contract(Windows.Foundation.UniversalApiContract, 2.0), + exclusiveto(Windows.Gaming.UI.GameBar), + uuid(1db9a292-cc78-4173-be45-b61e67283ea7) + ] + interface IGameBarStatics : IInspectable + { + [eventadd] HRESULT VisibilityChanged([in] Windows.Foundation.EventHandler *handler, [out, retval] EventRegistrationToken *token); + [eventremove] HRESULT VisibilityChanged([in] EventRegistrationToken token); + [eventadd] HRESULT IsInputRedirectedChanged([in] Windows.Foundation.EventHandler *handler, [out, retval] EventRegistrationToken *token); + [eventremove] HRESULT IsInputRedirectedChanged([in] EventRegistrationToken token); + [propget] HRESULT Visible([out] [retval] boolean* value); + [propget] HRESULT IsInputRedirected([out] [retval] boolean* value); + } + + [ + contract(Windows.Foundation.UniversalApiContract, 2.0), + marshaling_behavior(agile), + static(Windows.Gaming.UI.IGameBarStatics, Windows.Foundation.UniversalApiContract, 2.0), + threading(both) + ] + runtimeclass GameBar + { + } +} -- 2.39.2 (Apple Git-144) diff --git a/dlls/advapi32/advapi.c b/dlls/advapi32/advapi.c index 6497ea22f4e..f7d6e973252 100644 --- wine/dlls/advapi32/advapi.c +++ wine/dlls/advapi32/advapi.c @@ -32,6 +32,7 @@ #include "winerror.h" #include "wincred.h" #include "wct.h" +#include "perflib.h" #include "wine/debug.h" @@ -334,3 +335,50 @@ BOOL WINAPI GetThreadWaitChain(HWCT handle, DWORD_PTR ctx, DWORD flags, DWORD th SetLastError(ERROR_NOT_SUPPORTED); return FALSE; } + +ULONG WINAPI PerfCloseQueryHandle( HANDLE query ) +{ + FIXME( "query %p stub.\n", query ); + + return ERROR_SUCCESS; +} + +ULONG WINAPI PerfOpenQueryHandle( const WCHAR *machine, HANDLE *query ) +{ + FIXME( "machine %s, query %p.\n", debugstr_w(machine), query ); + + if (!query) return ERROR_INVALID_PARAMETER; + *query = (HANDLE)0xdeadbeef; + + return ERROR_SUCCESS; +} + +ULONG WINAPI PerfAddCounters( HANDLE query, PERF_COUNTER_IDENTIFIER *id, DWORD size ) +{ + FIXME( "query %p, id %p, size %lu stub.\n", query, id, size ); + + if (!id || size < sizeof(*id) || id->Size < sizeof(*id)) return ERROR_INVALID_PARAMETER; + + id->Status = ERROR_WMI_GUID_NOT_FOUND; + return ERROR_SUCCESS; +} + +ULONG WINAPI PerfQueryCounterData( HANDLE query, PERF_DATA_HEADER *data, DWORD data_size, DWORD *size_needed ) +{ + FIXME( "query %p, data %p, data_size %lu, size_needed %p stub.\n", query, data, data_size, size_needed ); + + if (!size_needed) return ERROR_INVALID_PARAMETER; + + *size_needed = sizeof(PERF_DATA_HEADER); + + if (!data || data_size < sizeof(PERF_DATA_HEADER)) return ERROR_NOT_ENOUGH_MEMORY; + + data->dwTotalSize = sizeof(PERF_DATA_HEADER); + data->dwNumCounters = 0; + QueryPerformanceCounter( (LARGE_INTEGER *)&data->PerfTimeStamp ); + QueryPerformanceFrequency( (LARGE_INTEGER *)&data->PerfFreq ); + GetSystemTimeAsFileTime( (FILETIME *)&data->PerfTime100NSec ); + FileTimeToSystemTime( (FILETIME *)&data->PerfTime100NSec, &data->SystemTime ); + + return ERROR_SUCCESS; +} diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index 3b5f587d40e..1c3f59bb7ee 100644 --- wine/dlls/advapi32/advapi32.spec +++ wine/dlls/advapi32/advapi32.spec @@ -553,8 +553,8 @@ @ stdcall -ret64 -import OpenTraceW(ptr) # @ stub OperationEnd # @ stub OperationStart -# @ stub PerfAddCounters -# @ stub PerfCloseQueryHandle +@ stdcall PerfAddCounters(long ptr long) +@ stdcall PerfCloseQueryHandle(long) @ stdcall -import PerfCreateInstance(long ptr wstr long) # @ stub PerfDecrementULongCounterValue # @ stub PerfDecrementULongLongCounterValue @@ -564,8 +564,8 @@ # @ stub PerfEnumerateCounterSetInstances # @ stub PerfIncrementULongCounterValue # @ stub PerfIncrementULongLongCounterValue -# @ stub PerfOpenQueryHandle -# @ stub PerfQueryCounterData +@ stdcall PerfOpenQueryHandle(wstr ptr) +@ stdcall PerfQueryCounterData(long ptr long ptr) # @ stub PerfQueryCounterInfo # @ stub PerfQueryCounterSetRegistrationInfo # @ stub PerfQueryInstance diff --git a/dlls/advapi32/tests/perf.c b/dlls/advapi32/tests/perf.c index fc07a09d327..34b6e952842 100644 --- wine/dlls/advapi32/tests/perf.c +++ wine/dlls/advapi32/tests/perf.c @@ -25,9 +25,31 @@ #include "winerror.h" #include "perflib.h" #include "winperf.h" +#include "winternl.h" #include "wine/test.h" +#include "initguid.h" + +#define DEFINE_FUNCTION(name) static typeof(name) *p##name; +DEFINE_FUNCTION(PerfCloseQueryHandle); +DEFINE_FUNCTION(PerfOpenQueryHandle); +DEFINE_FUNCTION(PerfAddCounters); +DEFINE_FUNCTION(PerfQueryCounterData); +#undef DEFINE_FUNCTION + +static void init_functions(void) +{ + HANDLE hadvapi = GetModuleHandleA("advapi32.dll"); + +#define GET_FUNCTION(name) p##name = (void *)GetProcAddress(hadvapi, #name) + GET_FUNCTION(PerfCloseQueryHandle); + GET_FUNCTION(PerfOpenQueryHandle); + GET_FUNCTION(PerfAddCounters); + GET_FUNCTION(PerfQueryCounterData); +#undef GET_FUNCTION +} + static ULONG WINAPI test_provider_callback(ULONG code, void *buffer, ULONG size) { ok(0, "Provider callback called.\n"); @@ -188,7 +210,94 @@ void test_provider_init(void) ok(!ret, "Got unexpected ret %lu.\n", ret); } +DEFINE_GUID(TestCounterGUID, 0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x11, 0x11, 0x22, 0x22, 0x33, 0x33); + +static ULONG64 trunc_nttime_ms(ULONG64 t) +{ + return (t / 10000) * 10000; +} + +static void test_perf_counters(void) +{ + LARGE_INTEGER freq, qpc1, qpc2, nttime1, nttime2, systime; + char buffer[sizeof(PERF_COUNTER_IDENTIFIER) + 8]; + PERF_COUNTER_IDENTIFIER *counter_id; + PERF_DATA_HEADER dh; + HANDLE query; + DWORD size; + ULONG ret; + + if (!pPerfOpenQueryHandle) + { + win_skip("PerfOpenQueryHandle not found.\n"); + return; + } + + ret = pPerfOpenQueryHandle(NULL, NULL); + ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret); + ret = pPerfOpenQueryHandle(NULL, &query); + ok(!ret, "got ret %lu.\n", ret); + + counter_id = (PERF_COUNTER_IDENTIFIER *)buffer; + memset(buffer, 0, sizeof(buffer)); + + counter_id->CounterSetGuid = TestCounterGUID; + counter_id->CounterId = PERF_WILDCARD_COUNTER; + counter_id->InstanceId = PERF_WILDCARD_COUNTER; + + ret = pPerfAddCounters(query, counter_id, sizeof(*counter_id)); + ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret); + + counter_id->Size = sizeof(*counter_id); + ret = pPerfAddCounters(query, counter_id, 8); + ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret); + ret = pPerfAddCounters(query, counter_id, sizeof(*counter_id)); + ok(!ret, "got ret %lu.\n", ret); + ok(counter_id->Status == ERROR_WMI_GUID_NOT_FOUND, "got Status %#lx.\n", counter_id->Status); + + ret = pPerfQueryCounterData(query, NULL, 0, NULL); + ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret); + + size = 0xdeadbeef; + ret = pPerfQueryCounterData(query, NULL, 0, &size); + ok(ret == ERROR_NOT_ENOUGH_MEMORY, "got ret %lu.\n", ret); + ok(size == sizeof(dh), "got size %lu.\n", size); + + ret = pPerfQueryCounterData(query, &dh, sizeof(dh), NULL); + ok(ret == ERROR_INVALID_PARAMETER, "got ret %lu.\n", ret); + + QueryPerformanceFrequency(&freq); + QueryPerformanceCounter(&qpc1); + NtQuerySystemTime(&nttime1); + + size = 0xdeadbeef; + ret = pPerfQueryCounterData(query, &dh, sizeof(dh), &size); + QueryPerformanceCounter(&qpc2); + NtQuerySystemTime(&nttime2); + SystemTimeToFileTime(&dh.SystemTime, (FILETIME *)&systime); + ok(!ret, "got ret %lu.\n", ret); + ok(size == sizeof(dh), "got size %lu.\n", size); + ok(dh.dwTotalSize == sizeof(dh), "got dwTotalSize %lu.\n", dh.dwTotalSize); + ok(!dh.dwNumCounters, "got dwNumCounters %lu.\n", dh.dwNumCounters); + ok(dh.PerfFreq == freq.QuadPart, "got PerfFreq %I64u.\n", dh.PerfFreq); + ok(dh.PerfTimeStamp >= qpc1.QuadPart && dh.PerfTimeStamp <= qpc2.QuadPart, + "got PerfTimeStamp %I64u, qpc1 %I64u, qpc2 %I64u.\n", + dh.PerfTimeStamp, qpc1.QuadPart, qpc2.QuadPart); + ok(dh.PerfTime100NSec >= nttime1.QuadPart && dh.PerfTime100NSec <= nttime2.QuadPart, + "got PerfTime100NSec %I64u, nttime1 %I64u, nttime2 %I64u.\n", + dh.PerfTime100NSec, nttime1.QuadPart, nttime2.QuadPart); + ok(systime.QuadPart >= trunc_nttime_ms(nttime1.QuadPart) && systime.QuadPart <= trunc_nttime_ms(nttime2.QuadPart), + "got systime %I64u, nttime1 %I64u, nttime2 %I64u, %d.\n", + systime.QuadPart, nttime1.QuadPart, nttime2.QuadPart, dh.SystemTime.wMilliseconds); + + ret = pPerfCloseQueryHandle(query); + ok(!ret, "got ret %lu.\n", ret); +} + START_TEST(perf) { + init_functions(); + test_provider_init(); + test_perf_counters(); } diff --git a/include/perflib.h b/include/perflib.h index eb65f0802a4..40704aeb6f7 100644 --- wine/include/perflib.h +++ wine/include/perflib.h @@ -83,6 +83,28 @@ typedef struct _PROVIDER_CONTEXT { LPVOID pMemContext; } PERF_PROVIDER_CONTEXT, * PPERF_PROVIDER_CONTEXT; +typedef struct _PERF_COUNTER_IDENTIFIER { + GUID CounterSetGuid; + ULONG Status; + ULONG Size; + ULONG CounterId; + ULONG InstanceId; + ULONG Index; + ULONG Reserved; +} PERF_COUNTER_IDENTIFIER, *PPERF_COUNTER_IDENTIFIER; + +#define PERF_WILDCARD_COUNTER 0xFFFFFFFF +#define PERF_WILDCARD_INSTANCE L"*" + +typedef struct _PERF_DATA_HEADER { + ULONG dwTotalSize; + ULONG dwNumCounters; + LONGLONG PerfTimeStamp; + LONGLONG PerfTime100NSec; + LONGLONG PerfFreq; + SYSTEMTIME SystemTime; +} PERF_DATA_HEADER, *PPERF_DATA_HEADER; + PERF_COUNTERSET_INSTANCE WINAPI *PerfCreateInstance(HANDLE, const GUID *, const WCHAR *, ULONG); ULONG WINAPI PerfDeleteInstance(HANDLE, PERF_COUNTERSET_INSTANCE *); ULONG WINAPI PerfSetCounterRefValue(HANDLE, PERF_COUNTERSET_INSTANCE *, ULONG, void *); @@ -91,6 +113,11 @@ ULONG WINAPI PerfStartProvider(GUID *, PERFLIBREQUEST, HANDLE *); ULONG WINAPI PerfStartProviderEx(GUID *, PERF_PROVIDER_CONTEXT *, HANDLE *); ULONG WINAPI PerfStopProvider(HANDLE); +ULONG WINAPI PerfAddCounters(HANDLE, PERF_COUNTER_IDENTIFIER *, DWORD); +ULONG WINAPI PerfCloseQueryHandle(HANDLE); +ULONG WINAPI PerfOpenQueryHandle(const WCHAR *, HANDLE *); +ULONG WINAPI PerfQueryCounterData(HANDLE, PERF_DATA_HEADER *, DWORD, DWORD *); + #ifdef __cplusplus } /* extern "C" */ #endif -- 2.39.2 (Apple Git-144) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 2ae9ccdc93f..51a14338d93 100644 --- wine/dlls/kernel32/kernel32.spec +++ wine/dlls/kernel32/kernel32.spec @@ -1470,6 +1470,7 @@ @ stdcall -import SetThreadGroupAffinity(long ptr ptr) @ stdcall -import SetThreadIdealProcessor(long long) @ stdcall -import SetThreadIdealProcessorEx(long ptr ptr) +@ stdcall -import SetThreadInformation(long long ptr long) @ stdcall -import SetThreadLocale(long) @ stdcall -import SetThreadPreferredUILanguages(long ptr ptr) @ stdcall -import SetThreadPriority(long long) diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 00012198eb6..3fb2192b1ff 100644 --- wine/dlls/kernelbase/kernelbase.spec +++ wine/dlls/kernelbase/kernelbase.spec @@ -1519,7 +1519,7 @@ @ stdcall SetThreadGroupAffinity(long ptr ptr) @ stdcall SetThreadIdealProcessor(long long) @ stdcall SetThreadIdealProcessorEx(long ptr ptr) -# @ stub SetThreadInformation +@ stdcall SetThreadInformation(long long ptr long) @ stdcall SetThreadLocale(long) @ stdcall SetThreadPreferredUILanguages(long ptr ptr) @ stdcall SetThreadPriority(long long) diff --git a/dlls/kernelbase/thread.c b/dlls/kernelbase/thread.c index 1c878474acb..3f61ae46776 100644 --- wine/dlls/kernelbase/thread.c +++ wine/dlls/kernelbase/thread.c @@ -606,6 +606,25 @@ LANGID WINAPI DECLSPEC_HOTPATCH SetThreadUILanguage( LANGID langid ) } +/********************************************************************** + * SetThreadInformation (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH SetThreadInformation( HANDLE thread, THREAD_INFORMATION_CLASS info_class, + VOID *info, DWORD size ) +{ + switch (info_class) + { + case ThreadMemoryPriority: + return set_ntstatus( NtSetInformationThread( thread, ThreadPagePriority, info, size )); + case ThreadPowerThrottling: + return set_ntstatus( NtSetInformationThread( thread, ThreadPowerThrottlingState, info, size )); + default: + FIXME("Unsupported class %u.\n", info_class); + return FALSE; + } +} + + /********************************************************************** * SuspendThread (kernelbase.@) */ diff --git a/include/processthreadsapi.h b/include/processthreadsapi.h index 8cdaff4796a..d266b7a727b 100644 --- wine/include/processthreadsapi.h +++ wine/include/processthreadsapi.h @@ -23,8 +23,23 @@ extern "C" { #endif +typedef enum _THREAD_INFORMATION_CLASS +{ + ThreadMemoryPriority, + ThreadAbsoluteCpuPriority, + ThreadDynamicCodePolicy, + ThreadPowerThrottling, + ThreadInformationClassMax +} THREAD_INFORMATION_CLASS; + +typedef struct _MEMORY_PRIORITY_INFORMATION +{ + ULONG MemoryPriority; +} MEMORY_PRIORITY_INFORMATION, *PMEMORY_PRIORITY_INFORMATION; + WINBASEAPI HRESULT WINAPI GetThreadDescription(HANDLE,PWSTR *); WINBASEAPI HRESULT WINAPI SetThreadDescription(HANDLE,PCWSTR); +WINBASEAPI BOOL WINAPI SetThreadInformation(HANDLE,THREAD_INFORMATION_CLASS,LPVOID,DWORD); #ifdef __cplusplus } -- 2.39.2 (Apple Git-144) diff --git a/configure b/configure index cdf99fc287d..bfa6e1885a1 100755 --- wine/configure +++ wine/configure @@ -1424,6 +1424,7 @@ enable_wimgapi enable_win32u enable_windows_devices_enumeration enable_windows_gaming_input +enable_windows_gaming_ui_gamebar enable_windows_globalization enable_windows_media_devices enable_windows_media_speech @@ -22531,6 +22532,8 @@ wine_fn_config_makefile dlls/windebug.dll16 enable_win16 wine_fn_config_makefile dlls/windows.devices.enumeration enable_windows_devices_enumeration wine_fn_config_makefile dlls/windows.gaming.input enable_windows_gaming_input wine_fn_config_makefile dlls/windows.gaming.input/tests enable_tests +wine_fn_config_makefile dlls/windows.gaming.ui.gamebar enable_windows_gaming_ui_gamebar +wine_fn_config_makefile dlls/windows.gaming.ui.gamebar/tests enable_tests wine_fn_config_makefile dlls/windows.globalization enable_windows_globalization wine_fn_config_makefile dlls/windows.globalization/tests enable_tests wine_fn_config_makefile dlls/windows.media.devices enable_windows_media_devices diff --git a/configure.ac b/configure.ac index c05d5b6f539..8fad7462dd9 100644 --- wine/configure.ac +++ wine/configure.ac @@ -3175,6 +3175,8 @@ WINE_CONFIG_MAKEFILE(dlls/windebug.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/windows.devices.enumeration) WINE_CONFIG_MAKEFILE(dlls/windows.gaming.input) WINE_CONFIG_MAKEFILE(dlls/windows.gaming.input/tests) +WINE_CONFIG_MAKEFILE(dlls/windows.gaming.ui.gamebar) +WINE_CONFIG_MAKEFILE(dlls/windows.gaming.ui.gamebar/tests) WINE_CONFIG_MAKEFILE(dlls/windows.globalization) WINE_CONFIG_MAKEFILE(dlls/windows.globalization/tests) WINE_CONFIG_MAKEFILE(dlls/windows.media.devices) diff --git a/dlls/windows.gaming.ui.gamebar/Makefile.in b/dlls/windows.gaming.ui.gamebar/Makefile.in new file mode 100644 index 00000000000..a0eefc4b951 --- /dev/null +++ wine/dlls/windows.gaming.ui.gamebar/Makefile.in @@ -0,0 +1,8 @@ +MODULE = windows.gaming.ui.gamebar.dll +IMPORTS = combase uuid + +C_SRCS = \ + main.c + +IDL_SRCS = \ + classes.idl diff --git a/dlls/windows.gaming.ui.gamebar/classes.idl b/dlls/windows.gaming.ui.gamebar/classes.idl new file mode 100644 index 00000000000..ef10fcb6283 --- /dev/null +++ wine/dlls/windows.gaming.ui.gamebar/classes.idl @@ -0,0 +1,33 @@ +/* + * Runtime Classes for windows.gaming.ui.gamebar.dll + * + * Copyright 2022 Paul Gofman for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma makedep register + +#ifdef __WIDL__ +#pragma winrt ns_prefix +#endif + +import "inspectable.idl"; +import "eventtoken.idl"; +import "windowscontracts.idl"; +import "windows.foundation.idl"; + +#define DO_NO_IMPORTS +#include "windows.gaming.ui.idl" diff --git a/dlls/windows.gaming.ui.gamebar/main.c b/dlls/windows.gaming.ui.gamebar/main.c new file mode 100644 index 00000000000..ec6b442cfc0 --- /dev/null +++ wine/dlls/windows.gaming.ui.gamebar/main.c @@ -0,0 +1,282 @@ +/* WinRT Windows.Gaming.UI.GameBar implementation + * + * Copyright 2022 Paul Gofman for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +#define COBJMACROS +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "winstring.h" + +#include "initguid.h" + +#define WIDL_using_Windows_Foundation +#define WIDL_using_Windows_Gaming_UI +#include "activation.h" +#include "windows.gaming.ui.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(gamebar); + +static EventRegistrationToken dummy_token = {.value = 0xdeadbeef}; + +struct gamebar_statics +{ + IActivationFactory IActivationFactory_iface; + IGameBarStatics IGameBarStatics_iface; + LONG ref; +}; + +static inline struct gamebar_statics *impl_from_IActivationFactory( IActivationFactory *iface ) +{ + return CONTAINING_RECORD( iface, struct gamebar_statics, IActivationFactory_iface ); +} + +static HRESULT WINAPI factory_QueryInterface( IActivationFactory *iface, REFIID iid, void **out ) +{ + struct gamebar_statics *impl = impl_from_IActivationFactory( iface ); + + TRACE( "iface %p, iid %s, out %p.\n", iface, debugstr_guid( iid ), out ); + + if (IsEqualGUID( iid, &IID_IUnknown ) || + IsEqualGUID( iid, &IID_IInspectable ) || + IsEqualGUID( iid, &IID_IAgileObject ) || + IsEqualGUID( iid, &IID_IActivationFactory )) + { + IInspectable_AddRef( (*out = &impl->IActivationFactory_iface) ); + return S_OK; + } + + if (IsEqualGUID( iid, &IID_IGameBarStatics )) + { + IInspectable_AddRef( (*out = &impl->IGameBarStatics_iface) ); + return S_OK; + } + + FIXME( "%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid( iid ) ); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI factory_AddRef( IActivationFactory *iface ) +{ + struct gamebar_statics *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedIncrement( &impl->ref ); + TRACE( "iface %p increasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static ULONG WINAPI factory_Release( IActivationFactory *iface ) +{ + struct gamebar_statics *impl = impl_from_IActivationFactory( iface ); + ULONG ref = InterlockedDecrement( &impl->ref ); + TRACE( "iface %p decreasing refcount to %lu.\n", iface, ref ); + return ref; +} + +static HRESULT WINAPI factory_GetIids( IActivationFactory *iface, ULONG *iid_count, IID **iids ) +{ + FIXME( "iface %p, iid_count %p, iids %p stub!\n", iface, iid_count, iids ); + return E_NOTIMPL; +} + +static HRESULT WINAPI factory_GetRuntimeClassName( IActivationFactory *iface, HSTRING *class_name ) +{ + FIXME( "iface %p, class_name %p stub!\n", iface, class_name ); + return E_NOTIMPL; +} + +static HRESULT WINAPI factory_GetTrustLevel( IActivationFactory *iface, TrustLevel *trust_level ) +{ + FIXME( "iface %p, trust_level %p stub!\n", iface, trust_level ); + return E_NOTIMPL; +} + +static HRESULT WINAPI factory_ActivateInstance( IActivationFactory *iface, IInspectable **instance ) +{ + FIXME( "iface %p, instance %p stub!\n", iface, instance ); + return E_NOTIMPL; +} + +static const struct IActivationFactoryVtbl factory_vtbl = +{ + factory_QueryInterface, + factory_AddRef, + factory_Release, + /* IInspectable methods */ + factory_GetIids, + factory_GetRuntimeClassName, + factory_GetTrustLevel, + /* IActivationFactory methods */ + factory_ActivateInstance, +}; + +#define DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from, iface_mem, expr ) \ + static inline impl_type *impl_from( iface_type *iface ) \ + { \ + return CONTAINING_RECORD( iface, impl_type, iface_mem ); \ + } \ + static HRESULT WINAPI pfx##_QueryInterface( iface_type *iface, REFIID iid, void **out ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_QueryInterface( (IInspectable *)(expr), iid, out ); \ + } \ + static ULONG WINAPI pfx##_AddRef( iface_type *iface ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_AddRef( (IInspectable *)(expr) ); \ + } \ + static ULONG WINAPI pfx##_Release( iface_type *iface ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_Release( (IInspectable *)(expr) ); \ + } \ + static HRESULT WINAPI pfx##_GetIids( iface_type *iface, ULONG *iid_count, IID **iids ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_GetIids( (IInspectable *)(expr), iid_count, iids ); \ + } \ + static HRESULT WINAPI pfx##_GetRuntimeClassName( iface_type *iface, HSTRING *class_name ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_GetRuntimeClassName( (IInspectable *)(expr), class_name ); \ + } \ + static HRESULT WINAPI pfx##_GetTrustLevel( iface_type *iface, TrustLevel *trust_level ) \ + { \ + impl_type *impl = impl_from( iface ); \ + return IInspectable_GetTrustLevel( (IInspectable *)(expr), trust_level ); \ + } +#define DEFINE_IINSPECTABLE( pfx, iface_type, impl_type, base_iface ) \ + DEFINE_IINSPECTABLE_( pfx, iface_type, impl_type, impl_from_##iface_type, iface_type##_iface, &impl->base_iface ) + +DEFINE_IINSPECTABLE( statics, IGameBarStatics, struct gamebar_statics, IActivationFactory_iface ) + +static HRESULT WINAPI statics_add_VisibilityChanged( IGameBarStatics *iface, + IEventHandler_IInspectable *handler, + EventRegistrationToken *token ) +{ + FIXME( "iface %p, handler %p, token %p stub.\n", iface, handler, token ); + *token = dummy_token; + return S_OK; +} + +static HRESULT WINAPI statics_remove_VisibilityChanged( IGameBarStatics *iface, EventRegistrationToken token ) +{ + FIXME( "iface %p, token %#I64x stub.\n", iface, token.value ); + return S_OK; +} + +static HRESULT WINAPI statics_add_IsInputRedirectedChanged( IGameBarStatics *iface, + IEventHandler_IInspectable *handler, + EventRegistrationToken *token ) +{ + FIXME( "iface %p, handler %p, token %p stub.\n", iface, handler, token ); + *token = dummy_token; + return S_OK; +} + +static HRESULT WINAPI statics_remove_IsInputRedirectedChanged( IGameBarStatics *iface, EventRegistrationToken token ) +{ + FIXME( "iface %p, token %#I64x stub.\n", iface, token.value ); + return S_OK; +} + +static HRESULT WINAPI statics_get_Visible( IGameBarStatics *iface, BOOLEAN *value) +{ + TRACE( "iface %p, value %p.\n", iface, value ); + + if (!value) return E_INVALIDARG; + *value = FALSE; + return S_OK; +} + +static HRESULT WINAPI statics_get_IsInputRedirected( IGameBarStatics *iface, BOOLEAN *value) +{ + TRACE( "iface %p, value %p.\n", iface, value ); + + if (!value) return E_INVALIDARG; + *value = FALSE; + return S_OK; +} + +static const struct IGameBarStaticsVtbl statics_vtbl = +{ + statics_QueryInterface, + statics_AddRef, + statics_Release, + /* IInspectable methods */ + statics_GetIids, + statics_GetRuntimeClassName, + statics_GetTrustLevel, + /* IGameBarStatics methods */ + statics_add_VisibilityChanged, + statics_remove_VisibilityChanged, + statics_add_IsInputRedirectedChanged, + statics_remove_IsInputRedirectedChanged, + statics_get_Visible, + statics_get_IsInputRedirected, +}; + +static struct gamebar_statics gamebar_statics = +{ + {&factory_vtbl}, + {&statics_vtbl}, + 1, +}; + +static IActivationFactory *gamebar_factory = &gamebar_statics.IActivationFactory_iface; + +HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **out) +{ + FIXME("clsid %s, riid %s, out %p stub!\n", debugstr_guid(clsid), debugstr_guid(riid), out); + + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT WINAPI DllGetActivationFactory( HSTRING class_str, IActivationFactory **factory ) +{ + const WCHAR *buffer = WindowsGetStringRawBuffer( class_str, NULL ); + + TRACE( "class %s, factory %p.\n", debugstr_w(buffer), factory ); + + *factory = NULL; + + if (!wcscmp( buffer, RuntimeClass_Windows_Gaming_UI_GameBar )) + IActivationFactory_QueryInterface( gamebar_factory, &IID_IActivationFactory, (void **)factory ); + + if (*factory) return S_OK; + return CLASS_E_CLASSNOTAVAILABLE; +} + +BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, void *reserved ) +{ + TRACE( "instance %p, reason %lu, reserved %p.\n", instance, reason, reserved ); + + switch (reason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls( instance ); + break; + } + return TRUE; +} diff --git a/dlls/windows.gaming.ui.gamebar/tests/Makefile.in b/dlls/windows.gaming.ui.gamebar/tests/Makefile.in new file mode 100644 index 00000000000..67d70eee241 --- /dev/null +++ wine/dlls/windows.gaming.ui.gamebar/tests/Makefile.in @@ -0,0 +1,5 @@ +TESTDLL = windows.gaming.ui.gamebar.dll +IMPORTS = combase + +C_SRCS = \ + gamebar.c diff --git a/dlls/windows.gaming.ui.gamebar/tests/gamebar.c b/dlls/windows.gaming.ui.gamebar/tests/gamebar.c new file mode 100644 index 00000000000..14fcb05284f --- /dev/null +++ wine/dlls/windows.gaming.ui.gamebar/tests/gamebar.c @@ -0,0 +1,91 @@ +/* + * Copyright 2022 Paul Gofman for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#define COBJMACROS +#include "initguid.h" +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "winstring.h" + +#include "roapi.h" + +#define WIDL_using_Windows_Foundation +#define WIDL_using_Windows_Gaming_UI +#include "windows.foundation.h" +#include "windows.gaming.ui.h" + +#include "wine/test.h" + +static void test_GameBarStatics(void) +{ + static const WCHAR *gamebar_statics_name = L"Windows.Gaming.UI.GameBar"; + + IActivationFactory *factory = NULL; + IInspectable *inspectable = NULL, *tmp_inspectable = NULL; + IAgileObject *agile_object = NULL, *tmp_agile_object = NULL; + IGameBarStatics *gamebar_statics = NULL; + HSTRING str; + HRESULT hr; + + hr = WindowsCreateString(gamebar_statics_name, wcslen(gamebar_statics_name), &str); + ok(hr == S_OK, "WindowsCreateString failed, hr %#lx\n", hr); + + hr = RoGetActivationFactory(str, &IID_IActivationFactory, (void **)&factory); + ok(hr == S_OK, "RoGetActivationFactory failed, hr %#lx\n", hr); + WindowsDeleteString(str); + + /* interface tests */ + hr = IActivationFactory_QueryInterface(factory, &IID_IInspectable, (void **)&inspectable); + ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IInspectable failed, hr %#lx\n", hr); + + hr = IActivationFactory_QueryInterface(factory, &IID_IAgileObject, (void **)&agile_object); + ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IAgileObject failed, hr %#lx\n", hr); + + hr = IActivationFactory_QueryInterface(factory, &IID_IGameBarStatics, (void **)&gamebar_statics); + ok(hr == S_OK, "IActivationFactory_QueryInterface IID_IMediaDeviceStatics failed, hr %#lx\n", hr); + + hr = IGameBarStatics_QueryInterface(gamebar_statics, &IID_IInspectable, (void **)&tmp_inspectable); + ok(hr == S_OK, "IMediaDeviceStatics_QueryInterface IID_IInspectable failed, hr %#lx\n", hr); + ok(tmp_inspectable == inspectable, "IMediaDeviceStatics_QueryInterface IID_IInspectable returned %p, expected %p\n", tmp_inspectable, inspectable); + IInspectable_Release(tmp_inspectable); + + hr = IGameBarStatics_QueryInterface(gamebar_statics, &IID_IAgileObject, (void **)&tmp_agile_object); + ok(hr == S_OK, "IMediaDeviceStatics_QueryInterface IID_IAgileObject failed, hr %#lx\n", hr); + ok(tmp_agile_object == agile_object, "IMediaDeviceStatics_QueryInterface IID_IAgileObject returned %p, expected %p\n", tmp_agile_object, agile_object); + IAgileObject_Release(tmp_agile_object); + + + IAgileObject_Release(agile_object); + IInspectable_Release(inspectable); + IActivationFactory_Release(factory); + IGameBarStatics_Release(gamebar_statics); +} + +START_TEST(gamebar) +{ + HRESULT hr; + + hr = RoInitialize(RO_INIT_MULTITHREADED); + ok(hr == S_OK, "RoInitialize failed, hr %#lx\n", hr); + + test_GameBarStatics(); + + RoUninitialize(); +} diff --git a/dlls/windows.gaming.ui.gamebar/windows.gaming.ui.gamebar.spec b/dlls/windows.gaming.ui.gamebar/windows.gaming.ui.gamebar.spec new file mode 100644 index 00000000000..20a8bfa98ea --- /dev/null +++ wine/dlls/windows.gaming.ui.gamebar/windows.gaming.ui.gamebar.spec @@ -0,0 +1,3 @@ +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetActivationFactory(ptr ptr) +@ stdcall -private DllGetClassObject(ptr ptr ptr) -- 2.39.2 (Apple Git-144) diff --git a/dlls/mfmediaengine/Makefile.in b/dlls/mfmediaengine/Makefile.in index a0e944c0633..bd273aafdab 100644 --- wine/dlls/mfmediaengine/Makefile.in +++ wine/dlls/mfmediaengine/Makefile.in @@ -1,4 +1,6 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES MODULE = mfmediaengine.dll +IMPORTLIB = mfmediaengine IMPORTS = oleaut32 ole32 mfplat mf mfuuid dxguid uuid EXTRADLLFLAGS = -Wb,--prefer-native diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index a191448b69f..98504c5e269 100644 --- wine/dlls/mfmediaengine/main.c +++ wine/dlls/mfmediaengine/main.c @@ -29,8 +29,6 @@ #include "mferror.h" #include "dxgi.h" #include "d3d11.h" -#include "mmdeviceapi.h" -#include "audiosessiontypes.h" #include "wine/debug.h" @@ -115,8 +113,7 @@ struct rect struct media_engine { - IMFMediaEngineEx IMFMediaEngineEx_iface; - IMFGetService IMFGetService_iface; + IMFMediaEngine IMFMediaEngine_iface; IMFAsyncCallback session_events; IMFAsyncCallback load_handler; IMFSampleGrabberSinkCallback grabber_callback; @@ -141,11 +138,6 @@ struct media_engine IMFSourceResolver *resolver; BSTR current_source; struct - { - IMFMediaSource *source; - IMFPresentationDescriptor *pd; - } presentation; - struct { LONGLONG pts; SIZE size; @@ -214,7 +206,7 @@ static HRESULT media_engine_lock_d3d_device(struct media_engine *engine, ID3D11D { if (FAILED(hr = IMFDXGIDeviceManager_OpenDeviceHandle(engine->device_manager, &engine->device_handle))) { - WARN("Failed to open device handle, hr %#lx.\n", hr); + WARN("Failed to open device handle, hr %#x.\n", hr); return hr; } } @@ -230,7 +222,7 @@ static HRESULT media_engine_lock_d3d_device(struct media_engine *engine, ID3D11D if (FAILED(hr = IMFDXGIDeviceManager_OpenDeviceHandle(engine->device_manager, &engine->device_handle))) { - WARN("Failed to open a device handle, hr %#lx.\n", hr); + WARN("Failed to open a device handle, hr %#x.\n", hr); return hr; } hr = IMFDXGIDeviceManager_LockDevice(engine->device_manager, engine->device_handle, &IID_ID3D11Device, @@ -340,7 +332,7 @@ static HRESULT media_engine_create_d3d11_video_frame_resources(struct media_engi if (FAILED(hr = ID3D11Device_CreateBuffer(device, &buffer_desc, &resource_data, &engine->video_frame.d3d11.vb))) { - WARN("Failed to create a vertex buffer, hr %#lx.\n", hr); + WARN("Failed to create a vertex buffer, hr %#x.\n", hr); goto failed; } @@ -349,7 +341,7 @@ static HRESULT media_engine_create_d3d11_video_frame_resources(struct media_engi if (FAILED(hr = ID3D11Device_CreateBuffer(device, &buffer_desc, NULL, &engine->video_frame.d3d11.ps_cb))) { - WARN("Failed to create a buffer, hr %#lx.\n", hr); + WARN("Failed to create a buffer, hr %#x.\n", hr); goto failed; } @@ -368,14 +360,14 @@ static HRESULT media_engine_create_d3d11_video_frame_resources(struct media_engi if (FAILED(hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &engine->video_frame.d3d11.source))) { - WARN("Failed to create source texture, hr %#lx.\n", hr); + WARN("Failed to create source texture, hr %#x.\n", hr); goto failed; } if (FAILED(hr = ID3D11Device_CreateShaderResourceView(device, (ID3D11Resource *)engine->video_frame.d3d11.source, NULL, &engine->video_frame.d3d11.srv))) { - WARN("Failed to create SRV, hr %#lx.\n", hr); + WARN("Failed to create SRV, hr %#x.\n", hr); goto failed; } @@ -388,7 +380,7 @@ static HRESULT media_engine_create_d3d11_video_frame_resources(struct media_engi if (FAILED(hr = ID3D11Device_CreateSamplerState(device, &sampler_desc, &engine->video_frame.d3d11.sampler))) { - WARN("Failed to create a sampler state, hr %#lx.\n", hr); + WARN("Failed to create a sampler state, hr %#x.\n", hr); goto failed; } @@ -396,20 +388,20 @@ static HRESULT media_engine_create_d3d11_video_frame_resources(struct media_engi if (FAILED(hr = ID3D11Device_CreateInputLayout(device, layout_desc, ARRAY_SIZE(layout_desc), vs_code, sizeof(vs_code), &engine->video_frame.d3d11.input_layout))) { - WARN("Failed to create input layout, hr %#lx.\n", hr); + WARN("Failed to create input layout, hr %#x.\n", hr); goto failed; } /* Shaders */ if (FAILED(hr = ID3D11Device_CreateVertexShader(device, vs_code, sizeof(vs_code), NULL, &engine->video_frame.d3d11.vs))) { - WARN("Failed to create the vertex shader, hr %#lx.\n", hr); + WARN("Failed to create the vertex shader, hr %#x.\n", hr); goto failed; } if (FAILED(hr = ID3D11Device_CreatePixelShader(device, ps_code, sizeof(ps_code), NULL, &engine->video_frame.d3d11.ps))) { - WARN("Failed to create the pixel shader, hr %#lx.\n", hr); + WARN("Failed to create the pixel shader, hr %#x.\n", hr); goto failed; } @@ -474,7 +466,7 @@ static ULONG WINAPI media_error_AddRef(IMFMediaError *iface) struct media_error *me = impl_from_IMFMediaError(iface); ULONG refcount = InterlockedIncrement(&me->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -484,7 +476,7 @@ static ULONG WINAPI media_error_Release(IMFMediaError *iface) struct media_error *me = impl_from_IMFMediaError(iface); ULONG refcount = InterlockedDecrement(&me->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) free(me); @@ -524,7 +516,7 @@ static HRESULT WINAPI media_error_SetExtendedErrorCode(IMFMediaError *iface, HRE { struct media_error *me = impl_from_IMFMediaError(iface); - TRACE("%p, %#lx.\n", iface, code); + TRACE("%p, %#x.\n", iface, code); me->extended_code = code; @@ -581,7 +573,7 @@ static ULONG WINAPI time_range_AddRef(IMFMediaTimeRange *iface) struct time_range *range = impl_from_IMFMediaTimeRange(iface); ULONG refcount = InterlockedIncrement(&range->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -591,7 +583,7 @@ static ULONG WINAPI time_range_Release(IMFMediaTimeRange *iface) struct time_range *range = impl_from_IMFMediaTimeRange(iface); ULONG refcount = InterlockedDecrement(&range->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -615,7 +607,7 @@ static HRESULT WINAPI time_range_GetStart(IMFMediaTimeRange *iface, DWORD idx, d { struct time_range *range = impl_from_IMFMediaTimeRange(iface); - TRACE("%p, %lu, %p.\n", iface, idx, start); + TRACE("%p, %u, %p.\n", iface, idx, start); if (idx >= range->count) return E_INVALIDARG; @@ -629,7 +621,7 @@ static HRESULT WINAPI time_range_GetEnd(IMFMediaTimeRange *iface, DWORD idx, dou { struct time_range *range = impl_from_IMFMediaTimeRange(iface); - TRACE("%p, %lu, %p.\n", iface, idx, end); + TRACE("%p, %u, %p.\n", iface, idx, end); if (idx >= range->count) return E_INVALIDARG; @@ -658,35 +650,13 @@ static BOOL WINAPI time_range_ContainsTime(IMFMediaTimeRange *iface, double time static HRESULT WINAPI time_range_AddRange(IMFMediaTimeRange *iface, double start, double end) { struct time_range *range = impl_from_IMFMediaTimeRange(iface); - struct range *c; - size_t i; TRACE("%p, %.8e, %.8e.\n", iface, start, end); - for (i = 0; i < range->count; ++i) + if (range->count) { - c = &range->ranges[i]; - - /* New range is fully contained within existing one. */ - if (c->start <= start && c->end >= end) - return S_OK; - - /* New range fully contains existing one. */ - if (c->start >= start && c->end <= end) - { - c->start = start; - c->end = end; - return S_OK; - } - - /* Merge if ranges intersect. */ - if ((start >= c->start && start <= c->end) || - (end >= c->start && end <= c->end)) - { - c->start = min(c->start, start); - c->end = max(c->end, end); - return S_OK; - } + FIXME("Range merging is not implemented.\n"); + return E_NOTIMPL; } if (!mf_array_reserve((void **)&range->ranges, &range->capacity, range->count + 1, sizeof(*range->ranges))) @@ -747,14 +717,9 @@ static void media_engine_set_flag(struct media_engine *engine, unsigned int mask engine->flags &= ~mask; } -static inline struct media_engine *impl_from_IMFMediaEngineEx(IMFMediaEngineEx *iface) +static inline struct media_engine *impl_from_IMFMediaEngine(IMFMediaEngine *iface) { - return CONTAINING_RECORD(iface, struct media_engine, IMFMediaEngineEx_iface); -} - -static inline struct media_engine *impl_from_IMFGetService(IMFGetService *iface) -{ - return CONTAINING_RECORD(iface, struct media_engine, IMFGetService_iface); + return CONTAINING_RECORD(iface, struct media_engine, IMFMediaEngine_iface); } static struct media_engine *impl_from_session_events_IMFAsyncCallback(IMFAsyncCallback *iface) @@ -819,7 +784,7 @@ static void media_engine_get_frame_size(struct media_engine *engine, IMFTopology IMFMediaTypeHandler_Release(handler); if (FAILED(hr)) { - WARN("Failed to get current media type %#lx.\n", hr); + WARN("Failed to get current media type %#x.\n", hr); return; } @@ -855,13 +820,13 @@ static HRESULT WINAPI media_engine_callback_QueryInterface(IMFAsyncCallback *ifa static ULONG WINAPI media_engine_session_events_AddRef(IMFAsyncCallback *iface) { struct media_engine *engine = impl_from_session_events_IMFAsyncCallback(iface); - return IMFMediaEngineEx_AddRef(&engine->IMFMediaEngineEx_iface); + return IMFMediaEngine_AddRef(&engine->IMFMediaEngine_iface); } static ULONG WINAPI media_engine_session_events_Release(IMFAsyncCallback *iface) { struct media_engine *engine = impl_from_session_events_IMFAsyncCallback(iface); - return IMFMediaEngineEx_Release(&engine->IMFMediaEngineEx_iface); + return IMFMediaEngine_Release(&engine->IMFMediaEngine_iface); } static HRESULT WINAPI media_engine_callback_GetParameters(IMFAsyncCallback *iface, DWORD *flags, DWORD *queue) @@ -878,13 +843,13 @@ static HRESULT WINAPI media_engine_session_events_Invoke(IMFAsyncCallback *iface if (FAILED(hr = IMFMediaSession_EndGetEvent(engine->session, result, &event))) { - WARN("Failed to get session event, hr %#lx.\n", hr); + WARN("Failed to get session event, hr %#x.\n", hr); goto failed; } if (FAILED(hr = IMFMediaEvent_GetType(event, &event_type))) { - WARN("Failed to get event type, hr %#lx.\n", hr); + WARN("Failed to get event type, hr %#x.\n", hr); goto failed; } @@ -960,7 +925,7 @@ failed: IMFMediaEvent_Release(event); if (FAILED(hr = IMFMediaSession_BeginGetEvent(engine->session, iface, NULL))) - WARN("Failed to subscribe to session events, hr %#lx.\n", hr); + WARN("Failed to subscribe to session events, hr %#x.\n", hr); return S_OK; } @@ -977,13 +942,13 @@ static const IMFAsyncCallbackVtbl media_engine_session_events_vtbl = static ULONG WINAPI media_engine_load_handler_AddRef(IMFAsyncCallback *iface) { struct media_engine *engine = impl_from_load_handler_IMFAsyncCallback(iface); - return IMFMediaEngineEx_AddRef(&engine->IMFMediaEngineEx_iface); + return IMFMediaEngine_AddRef(&engine->IMFMediaEngine_iface); } static ULONG WINAPI media_engine_load_handler_Release(IMFAsyncCallback *iface) { struct media_engine *engine = impl_from_load_handler_IMFAsyncCallback(iface); - return IMFMediaEngineEx_Release(&engine->IMFMediaEngineEx_iface); + return IMFMediaEngine_Release(&engine->IMFMediaEngine_iface); } static HRESULT media_engine_create_source_node(IMFMediaSource *source, IMFPresentationDescriptor *pd, IMFStreamDescriptor *sd, @@ -1076,35 +1041,22 @@ static HRESULT media_engine_create_video_renderer(struct media_engine *engine, I return hr; } -static void media_engine_clear_presentation(struct media_engine *engine) -{ - if (engine->presentation.source) - { - IMFMediaSource_Shutdown(engine->presentation.source); - IMFMediaSource_Release(engine->presentation.source); - } - if (engine->presentation.pd) - IMFPresentationDescriptor_Release(engine->presentation.pd); - memset(&engine->presentation, 0, sizeof(engine->presentation)); -} - static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMediaSource *source) { IMFStreamDescriptor *sd_audio = NULL, *sd_video = NULL; + unsigned int stream_count = 0, i; IMFPresentationDescriptor *pd; - DWORD stream_count = 0, i; IMFTopology *topology; UINT64 duration; HRESULT hr; media_engine_release_video_frame_resources(engine); - media_engine_clear_presentation(engine); if (FAILED(hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd))) return hr; if (FAILED(hr = IMFPresentationDescriptor_GetStreamDescriptorCount(pd, &stream_count))) - WARN("Failed to get stream count, hr %#lx.\n", hr); + WARN("Failed to get stream count, hr %#x.\n", hr); /* Enable first video stream and first audio stream. */ @@ -1142,8 +1094,6 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi IMFMediaTypeHandler_Release(type_handler); } - - IMFStreamDescriptor_Release(sd); } if (!sd_video && !sd_audio) @@ -1152,11 +1102,6 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi return E_UNEXPECTED; } - engine->presentation.source = source; - IMFMediaSource_AddRef(engine->presentation.source); - engine->presentation.pd = pd; - IMFPresentationDescriptor_AddRef(engine->presentation.pd); - media_engine_set_flag(engine, FLAGS_ENGINE_HAS_VIDEO, !!sd_video); media_engine_set_flag(engine, FLAGS_ENGINE_HAS_AUDIO, !!sd_audio); @@ -1174,16 +1119,13 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi IMFTopologyNode *sar_node = NULL, *audio_src = NULL; IMFTopologyNode *grabber_node = NULL, *video_src = NULL; - if (engine->flags & MF_MEDIA_ENGINE_REAL_TIME_MODE) - IMFTopology_SetUINT32(topology, &MF_LOW_LATENCY, TRUE); - if (sd_audio) { if (FAILED(hr = media_engine_create_source_node(source, pd, sd_audio, &audio_src))) - WARN("Failed to create audio source node, hr %#lx.\n", hr); + WARN("Failed to create audio source node, hr %#x.\n", hr); if (FAILED(hr = media_engine_create_audio_renderer(engine, &sar_node))) - WARN("Failed to create audio renderer node, hr %#lx.\n", hr); + WARN("Failed to create audio renderer node, hr %#x.\n", hr); if (sar_node && audio_src) { @@ -1201,10 +1143,10 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi if (SUCCEEDED(hr) && sd_video) { if (FAILED(hr = media_engine_create_source_node(source, pd, sd_video, &video_src))) - WARN("Failed to create video source node, hr %#lx.\n", hr); + WARN("Failed to create video source node, hr %#x.\n", hr); if (FAILED(hr = media_engine_create_video_renderer(engine, &grabber_node))) - WARN("Failed to create video grabber node, hr %#lx.\n", hr); + WARN("Failed to create video grabber node, hr %#x.\n", hr); if (grabber_node && video_src) { @@ -1252,10 +1194,10 @@ static void media_engine_start_playback(struct media_engine *engine) static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { struct media_engine *engine = impl_from_load_handler_IMFAsyncCallback(iface); - IUnknown *object = NULL, *state; unsigned int start_playback; MF_OBJECT_TYPE obj_type; IMFMediaSource *source; + IUnknown *object = NULL; HRESULT hr; EnterCriticalSection(&engine->cs); @@ -1266,16 +1208,8 @@ static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, start_playback = engine->flags & FLAGS_ENGINE_PLAY_PENDING; media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING | FLAGS_ENGINE_PLAY_PENDING, FALSE); - if (SUCCEEDED(IMFAsyncResult_GetState(result, &state))) - { - hr = IMFSourceResolver_EndCreateObjectFromByteStream(engine->resolver, result, &obj_type, &object); - IUnknown_Release(state); - } - else - hr = IMFSourceResolver_EndCreateObjectFromURL(engine->resolver, result, &obj_type, &object); - - if (FAILED(hr)) - WARN("Failed to create source object, hr %#lx.\n", hr); + if (FAILED(hr = IMFSourceResolver_EndCreateObjectFromURL(engine->resolver, result, &obj_type, &object))) + WARN("Failed to create source object, hr %#x.\n", hr); if (object) { @@ -1316,39 +1250,29 @@ static const IMFAsyncCallbackVtbl media_engine_load_handler_vtbl = media_engine_load_handler_Invoke, }; -static HRESULT WINAPI media_engine_QueryInterface(IMFMediaEngineEx *iface, REFIID riid, void **obj) +static HRESULT WINAPI media_engine_QueryInterface(IMFMediaEngine *iface, REFIID riid, void **obj) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); - if (IsEqualIID(riid, &IID_IMFMediaEngineEx) || - IsEqualIID(riid, &IID_IMFMediaEngine) || + if (IsEqualIID(riid, &IID_IMFMediaEngine) || IsEqualIID(riid, &IID_IUnknown)) { *obj = iface; - } - else if (IsEqualIID(riid, &IID_IMFGetService)) - { - *obj = &engine->IMFGetService_iface; - } - else - { - WARN("Unsupported interface %s.\n", debugstr_guid(riid)); - *obj = NULL; - return E_NOINTERFACE; + IMFMediaEngine_AddRef(iface); + return S_OK; } - IUnknown_AddRef((IUnknown *)*obj); - return S_OK; + WARN("Unsupported interface %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; } -static ULONG WINAPI media_engine_AddRef(IMFMediaEngineEx *iface) +static ULONG WINAPI media_engine_AddRef(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); ULONG refcount = InterlockedIncrement(&engine->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -1366,7 +1290,6 @@ static void free_media_engine(struct media_engine *engine) if (engine->resolver) IMFSourceResolver_Release(engine->resolver); media_engine_release_video_frame_resources(engine); - media_engine_clear_presentation(engine); if (engine->device_manager) { IMFDXGIDeviceManager_CloseDeviceHandle(engine->device_manager, engine->device_handle); @@ -1378,12 +1301,12 @@ static void free_media_engine(struct media_engine *engine) free(engine); } -static ULONG WINAPI media_engine_Release(IMFMediaEngineEx *iface) +static ULONG WINAPI media_engine_Release(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); ULONG refcount = InterlockedDecrement(&engine->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) free_media_engine(engine); @@ -1391,9 +1314,9 @@ static ULONG WINAPI media_engine_Release(IMFMediaEngineEx *iface) return refcount; } -static HRESULT WINAPI media_engine_GetError(IMFMediaEngineEx *iface, IMFMediaError **error) +static HRESULT WINAPI media_engine_GetError(IMFMediaEngine *iface, IMFMediaError **error) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %p.\n", iface, error); @@ -1416,9 +1339,9 @@ static HRESULT WINAPI media_engine_GetError(IMFMediaEngineEx *iface, IMFMediaErr return hr; } -static HRESULT WINAPI media_engine_SetErrorCode(IMFMediaEngineEx *iface, MF_MEDIA_ENGINE_ERR code) +static HRESULT WINAPI media_engine_SetErrorCode(IMFMediaEngine *iface, MF_MEDIA_ENGINE_ERR code) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %u.\n", iface, code); @@ -1436,76 +1359,66 @@ static HRESULT WINAPI media_engine_SetErrorCode(IMFMediaEngineEx *iface, MF_MEDI return hr; } -static HRESULT WINAPI media_engine_SetSourceElements(IMFMediaEngineEx *iface, IMFMediaEngineSrcElements *elements) +static HRESULT WINAPI media_engine_SetSourceElements(IMFMediaEngine *iface, IMFMediaEngineSrcElements *elements) { FIXME("(%p, %p): stub.\n", iface, elements); return E_NOTIMPL; } -static HRESULT media_engine_set_source(struct media_engine *engine, IMFByteStream *bytestream, BSTR url) +static HRESULT WINAPI media_engine_SetSource(IMFMediaEngine *iface, BSTR url) { - IPropertyStore *props = NULL; - unsigned int flags; + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; - SysFreeString(engine->current_source); - engine->current_source = NULL; - if (url) - engine->current_source = SysAllocString(url); - - engine->ready_state = MF_MEDIA_ENGINE_READY_HAVE_NOTHING; - - IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0); + TRACE("%p, %s.\n", iface, debugstr_w(url)); - engine->network_state = MF_MEDIA_ENGINE_NETWORK_NO_SOURCE; + EnterCriticalSection(&engine->cs); - if (url || bytestream) + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else { - flags = MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE; - if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS) - flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS; + SysFreeString(engine->current_source); + engine->current_source = NULL; + if (url) + engine->current_source = SysAllocString(url); - IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE, - &IID_IPropertyStore, (void **)&props); - if (bytestream) - hr = IMFSourceResolver_BeginCreateObjectFromByteStream(engine->resolver, bytestream, url, flags, - props, NULL, &engine->load_handler, (IUnknown *)bytestream); - else - hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, - &engine->load_handler, NULL); - if (SUCCEEDED(hr)) - media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING, TRUE); + engine->ready_state = MF_MEDIA_ENGINE_READY_HAVE_NOTHING; - if (props) - IPropertyStore_Release(props); - } + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0); - return hr; -} + engine->network_state = MF_MEDIA_ENGINE_NETWORK_NO_SOURCE; -static HRESULT WINAPI media_engine_SetSource(IMFMediaEngineEx *iface, BSTR url) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr; + if (url) + { + IPropertyStore *props = NULL; + unsigned int flags; - TRACE("%p, %s.\n", iface, debugstr_w(url)); + flags = MF_RESOLUTION_MEDIASOURCE; + if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS) + flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS; - EnterCriticalSection(&engine->cs); + IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE, + &IID_IPropertyStore, (void **)&props); + hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, + &engine->load_handler, NULL); + if (SUCCEEDED(hr)) + media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING, TRUE); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - hr = media_engine_set_source(engine, NULL, url); + if (props) + IPropertyStore_Release(props); + } + } LeaveCriticalSection(&engine->cs); return hr; } -static HRESULT WINAPI media_engine_GetCurrentSource(IMFMediaEngineEx *iface, BSTR *url) +static HRESULT WINAPI media_engine_GetCurrentSource(IMFMediaEngine *iface, BSTR *url) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %p.\n", iface, url); @@ -1513,32 +1426,28 @@ static HRESULT WINAPI media_engine_GetCurrentSource(IMFMediaEngineEx *iface, BST *url = NULL; EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; if (engine->current_source) { if (!(*url = SysAllocString(engine->current_source))) hr = E_OUTOFMEMORY; } - LeaveCriticalSection(&engine->cs); return hr; } -static USHORT WINAPI media_engine_GetNetworkState(IMFMediaEngineEx *iface) +static USHORT WINAPI media_engine_GetNetworkState(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); TRACE("%p.\n", iface); return engine->network_state; } -static MF_MEDIA_ENGINE_PRELOAD WINAPI media_engine_GetPreload(IMFMediaEngineEx *iface) +static MF_MEDIA_ENGINE_PRELOAD WINAPI media_engine_GetPreload(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); MF_MEDIA_ENGINE_PRELOAD preload; TRACE("%p.\n", iface); @@ -1550,9 +1459,9 @@ static MF_MEDIA_ENGINE_PRELOAD WINAPI media_engine_GetPreload(IMFMediaEngineEx * return preload; } -static HRESULT WINAPI media_engine_SetPreload(IMFMediaEngineEx *iface, MF_MEDIA_ENGINE_PRELOAD preload) +static HRESULT WINAPI media_engine_SetPreload(IMFMediaEngine *iface, MF_MEDIA_ENGINE_PRELOAD preload) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); TRACE("%p, %d.\n", iface, preload); @@ -1563,9 +1472,9 @@ static HRESULT WINAPI media_engine_SetPreload(IMFMediaEngineEx *iface, MF_MEDIA_ return S_OK; } -static HRESULT WINAPI media_engine_GetBuffered(IMFMediaEngineEx *iface, IMFMediaTimeRange **range) +static HRESULT WINAPI media_engine_GetBuffered(IMFMediaEngine *iface, IMFMediaTimeRange **range) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr; TRACE("%p, %p.\n", iface, range); @@ -1574,54 +1483,30 @@ static HRESULT WINAPI media_engine_GetBuffered(IMFMediaEngineEx *iface, IMFMedia return hr; EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else if (!isnan(engine->duration)) + if (!isnan(engine->duration)) hr = IMFMediaTimeRange_AddRange(*range, 0.0, engine->duration); - LeaveCriticalSection(&engine->cs); return hr; } -static HRESULT WINAPI media_engine_Load(IMFMediaEngineEx *iface) +static HRESULT WINAPI media_engine_Load(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_NOTIMPL; - FIXME("(%p): stub.\n", iface); - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - - LeaveCriticalSection(&engine->cs); - - return hr; + return E_NOTIMPL; } -static HRESULT WINAPI media_engine_CanPlayType(IMFMediaEngineEx *iface, BSTR type, MF_MEDIA_ENGINE_CANPLAY *answer) +static HRESULT WINAPI media_engine_CanPlayType(IMFMediaEngine *iface, BSTR type, MF_MEDIA_ENGINE_CANPLAY *answer) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_NOTIMPL; - FIXME("(%p, %s, %p): stub.\n", iface, debugstr_w(type), answer); - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - - LeaveCriticalSection(&engine->cs); - - return hr; + return E_NOTIMPL; } -static USHORT WINAPI media_engine_GetReadyState(IMFMediaEngineEx *iface) +static USHORT WINAPI media_engine_GetReadyState(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); unsigned short state; TRACE("%p.\n", iface); @@ -1633,16 +1518,16 @@ static USHORT WINAPI media_engine_GetReadyState(IMFMediaEngineEx *iface) return state; } -static BOOL WINAPI media_engine_IsSeeking(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_IsSeeking(IMFMediaEngine *iface) { FIXME("(%p): stub.\n", iface); return FALSE; } -static double WINAPI media_engine_GetCurrentTime(IMFMediaEngineEx *iface) +static double WINAPI media_engine_GetCurrentTime(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); double ret = 0.0; MFTIME clocktime; @@ -1662,33 +1547,23 @@ static double WINAPI media_engine_GetCurrentTime(IMFMediaEngineEx *iface) return ret; } -static HRESULT WINAPI media_engine_SetCurrentTime(IMFMediaEngineEx *iface, double time) +static HRESULT WINAPI media_engine_SetCurrentTime(IMFMediaEngine *iface, double time) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_NOTIMPL; - FIXME("(%p, %f): stub.\n", iface, time); - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - - LeaveCriticalSection(&engine->cs); - - return hr; + return E_NOTIMPL; } -static double WINAPI media_engine_GetStartTime(IMFMediaEngineEx *iface) +static double WINAPI media_engine_GetStartTime(IMFMediaEngine *iface) { FIXME("(%p): stub.\n", iface); return 0.0; } -static double WINAPI media_engine_GetDuration(IMFMediaEngineEx *iface) +static double WINAPI media_engine_GetDuration(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); double value; TRACE("%p.\n", iface); @@ -1700,9 +1575,9 @@ static double WINAPI media_engine_GetDuration(IMFMediaEngineEx *iface) return value; } -static BOOL WINAPI media_engine_IsPaused(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_IsPaused(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); BOOL value; TRACE("%p.\n", iface); @@ -1714,9 +1589,9 @@ static BOOL WINAPI media_engine_IsPaused(IMFMediaEngineEx *iface) return value; } -static double WINAPI media_engine_GetDefaultPlaybackRate(IMFMediaEngineEx *iface) +static double WINAPI media_engine_GetDefaultPlaybackRate(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); double rate; TRACE("%p.\n", iface); @@ -1728,9 +1603,9 @@ static double WINAPI media_engine_GetDefaultPlaybackRate(IMFMediaEngineEx *iface return rate; } -static HRESULT WINAPI media_engine_SetDefaultPlaybackRate(IMFMediaEngineEx *iface, double rate) +static HRESULT WINAPI media_engine_SetDefaultPlaybackRate(IMFMediaEngine *iface, double rate) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %f.\n", iface, rate); @@ -1748,9 +1623,9 @@ static HRESULT WINAPI media_engine_SetDefaultPlaybackRate(IMFMediaEngineEx *ifac return hr; } -static double WINAPI media_engine_GetPlaybackRate(IMFMediaEngineEx *iface) +static double WINAPI media_engine_GetPlaybackRate(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); double rate; TRACE("%p.\n", iface); @@ -1762,9 +1637,9 @@ static double WINAPI media_engine_GetPlaybackRate(IMFMediaEngineEx *iface) return rate; } -static HRESULT WINAPI media_engine_SetPlaybackRate(IMFMediaEngineEx *iface, double rate) +static HRESULT WINAPI media_engine_SetPlaybackRate(IMFMediaEngine *iface, double rate) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %f.\n", iface, rate); @@ -1782,43 +1657,23 @@ static HRESULT WINAPI media_engine_SetPlaybackRate(IMFMediaEngineEx *iface, doub return hr; } -static HRESULT WINAPI media_engine_GetPlayed(IMFMediaEngineEx *iface, IMFMediaTimeRange **played) +static HRESULT WINAPI media_engine_GetPlayed(IMFMediaEngine *iface, IMFMediaTimeRange **played) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_NOTIMPL; - FIXME("(%p, %p): stub.\n", iface, played); - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - - LeaveCriticalSection(&engine->cs); - - return hr; + return E_NOTIMPL; } -static HRESULT WINAPI media_engine_GetSeekable(IMFMediaEngineEx *iface, IMFMediaTimeRange **seekable) +static HRESULT WINAPI media_engine_GetSeekable(IMFMediaEngine *iface, IMFMediaTimeRange **seekable) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_NOTIMPL; - FIXME("(%p, %p): stub.\n", iface, seekable); - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - - LeaveCriticalSection(&engine->cs); - - return hr; + return E_NOTIMPL; } -static BOOL WINAPI media_engine_IsEnded(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_IsEnded(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); BOOL value; TRACE("%p.\n", iface); @@ -1830,9 +1685,9 @@ static BOOL WINAPI media_engine_IsEnded(IMFMediaEngineEx *iface) return value; } -static BOOL WINAPI media_engine_GetAutoPlay(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_GetAutoPlay(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); BOOL value; TRACE("%p.\n", iface); @@ -1844,9 +1699,9 @@ static BOOL WINAPI media_engine_GetAutoPlay(IMFMediaEngineEx *iface) return value; } -static HRESULT WINAPI media_engine_SetAutoPlay(IMFMediaEngineEx *iface, BOOL autoplay) +static HRESULT WINAPI media_engine_SetAutoPlay(IMFMediaEngine *iface, BOOL autoplay) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); FIXME("(%p, %d): stub.\n", iface, autoplay); @@ -1857,9 +1712,9 @@ static HRESULT WINAPI media_engine_SetAutoPlay(IMFMediaEngineEx *iface, BOOL aut return S_OK; } -static BOOL WINAPI media_engine_GetLoop(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_GetLoop(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); BOOL value; TRACE("%p.\n", iface); @@ -1871,9 +1726,9 @@ static BOOL WINAPI media_engine_GetLoop(IMFMediaEngineEx *iface) return value; } -static HRESULT WINAPI media_engine_SetLoop(IMFMediaEngineEx *iface, BOOL loop) +static HRESULT WINAPI media_engine_SetLoop(IMFMediaEngine *iface, BOOL loop) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); FIXME("(%p, %d): stub.\n", iface, loop); @@ -1884,75 +1739,63 @@ static HRESULT WINAPI media_engine_SetLoop(IMFMediaEngineEx *iface, BOOL loop) return S_OK; } -static HRESULT WINAPI media_engine_Play(IMFMediaEngineEx *iface) +static HRESULT WINAPI media_engine_Play(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = S_OK; + struct media_engine *engine = impl_from_IMFMediaEngine(iface); TRACE("%p.\n", iface); EnterCriticalSection(&engine->cs); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - { - IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0); - - if (!(engine->flags & FLAGS_ENGINE_WAITING)) - { - media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED | FLAGS_ENGINE_IS_ENDED, FALSE); - IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PLAY, 0, 0); + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0); - if (!(engine->flags & FLAGS_ENGINE_SOURCE_PENDING)) - media_engine_start_playback(engine); - else - media_engine_set_flag(engine, FLAGS_ENGINE_PLAY_PENDING, TRUE); + if (!(engine->flags & FLAGS_ENGINE_WAITING)) + { + media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED | FLAGS_ENGINE_IS_ENDED, FALSE); + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PLAY, 0, 0); - media_engine_set_flag(engine, FLAGS_ENGINE_WAITING, TRUE); - } + if (!(engine->flags & FLAGS_ENGINE_SOURCE_PENDING)) + media_engine_start_playback(engine); + else + media_engine_set_flag(engine, FLAGS_ENGINE_PLAY_PENDING, TRUE); - IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_WAITING, 0, 0); + media_engine_set_flag(engine, FLAGS_ENGINE_WAITING, TRUE); } + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_WAITING, 0, 0); + LeaveCriticalSection(&engine->cs); - return hr; + return S_OK; } -static HRESULT WINAPI media_engine_Pause(IMFMediaEngineEx *iface) +static HRESULT WINAPI media_engine_Pause(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = S_OK; + struct media_engine *engine = impl_from_IMFMediaEngine(iface); TRACE("%p.\n", iface); EnterCriticalSection(&engine->cs); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else + if (!(engine->flags & FLAGS_ENGINE_PAUSED)) { - if (!(engine->flags & FLAGS_ENGINE_PAUSED)) - { - media_engine_set_flag(engine, FLAGS_ENGINE_WAITING | FLAGS_ENGINE_IS_ENDED, FALSE); - media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, TRUE); - - IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_TIMEUPDATE, 0, 0); - IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PAUSE, 0, 0); - } + media_engine_set_flag(engine, FLAGS_ENGINE_WAITING | FLAGS_ENGINE_IS_ENDED, FALSE); + media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, TRUE); - IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0); + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_TIMEUPDATE, 0, 0); + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PAUSE, 0, 0); } + IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PURGEQUEUEDEVENTS, 0, 0); + LeaveCriticalSection(&engine->cs); - return hr; + return S_OK; } -static BOOL WINAPI media_engine_GetMuted(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_GetMuted(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); BOOL ret; TRACE("%p.\n", iface); @@ -1964,9 +1807,9 @@ static BOOL WINAPI media_engine_GetMuted(IMFMediaEngineEx *iface) return ret; } -static HRESULT WINAPI media_engine_SetMuted(IMFMediaEngineEx *iface, BOOL muted) +static HRESULT WINAPI media_engine_SetMuted(IMFMediaEngine *iface, BOOL muted) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %d.\n", iface, muted); @@ -1984,9 +1827,9 @@ static HRESULT WINAPI media_engine_SetMuted(IMFMediaEngineEx *iface, BOOL muted) return hr; } -static double WINAPI media_engine_GetVolume(IMFMediaEngineEx *iface) +static double WINAPI media_engine_GetVolume(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); double volume; TRACE("%p.\n", iface); @@ -1998,9 +1841,9 @@ static double WINAPI media_engine_GetVolume(IMFMediaEngineEx *iface) return volume; } -static HRESULT WINAPI media_engine_SetVolume(IMFMediaEngineEx *iface, double volume) +static HRESULT WINAPI media_engine_SetVolume(IMFMediaEngine *iface, double volume) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %f.\n", iface, volume); @@ -2018,9 +1861,9 @@ static HRESULT WINAPI media_engine_SetVolume(IMFMediaEngineEx *iface, double vol return hr; } -static BOOL WINAPI media_engine_HasVideo(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_HasVideo(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); BOOL value; TRACE("%p.\n", iface); @@ -2032,9 +1875,9 @@ static BOOL WINAPI media_engine_HasVideo(IMFMediaEngineEx *iface) return value; } -static BOOL WINAPI media_engine_HasAudio(IMFMediaEngineEx *iface) +static BOOL WINAPI media_engine_HasAudio(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); BOOL value; TRACE("%p.\n", iface); @@ -2046,9 +1889,9 @@ static BOOL WINAPI media_engine_HasAudio(IMFMediaEngineEx *iface) return value; } -static HRESULT WINAPI media_engine_GetNativeVideoSize(IMFMediaEngineEx *iface, DWORD *cx, DWORD *cy) +static HRESULT WINAPI media_engine_GetNativeVideoSize(IMFMediaEngine *iface, DWORD *cx, DWORD *cy) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %p, %p.\n", iface, cx, cy); @@ -2073,9 +1916,9 @@ static HRESULT WINAPI media_engine_GetNativeVideoSize(IMFMediaEngineEx *iface, D return hr; } -static HRESULT WINAPI media_engine_GetVideoAspectRatio(IMFMediaEngineEx *iface, DWORD *cx, DWORD *cy) +static HRESULT WINAPI media_engine_GetVideoAspectRatio(IMFMediaEngine *iface, DWORD *cx, DWORD *cy) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; TRACE("%p, %p, %p.\n", iface, cx, cy); @@ -2100,9 +1943,9 @@ static HRESULT WINAPI media_engine_GetVideoAspectRatio(IMFMediaEngineEx *iface, return hr; } -static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngineEx *iface) +static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngine *iface) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr = S_OK; FIXME("(%p): stub.\n", iface); @@ -2113,7 +1956,6 @@ static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngineEx *iface) else { media_engine_set_flag(engine, FLAGS_ENGINE_SHUT_DOWN, TRUE); - media_engine_clear_presentation(engine); IMFMediaSession_Shutdown(engine->session); } LeaveCriticalSection(&engine->cs); @@ -2215,7 +2057,7 @@ static HRESULT media_engine_transfer_to_d3d11_texture(struct media_engine *engin if (FAILED(hr = media_engine_create_d3d11_video_frame_resources(engine, device))) { - WARN("Failed to create d3d resources, hr %#lx.\n", hr); + WARN("Failed to create d3d resources, hr %#x.\n", hr); goto done; } @@ -2234,7 +2076,7 @@ static HRESULT media_engine_transfer_to_d3d11_texture(struct media_engine *engin if (FAILED(hr = ID3D11Device_CreateRenderTargetView(device, (ID3D11Resource *)texture, NULL, &rtv))) { - WARN("Failed to create an rtv, hr %#lx.\n", hr); + WARN("Failed to create an rtv, hr %#x.\n", hr); goto done; } @@ -2343,10 +2185,10 @@ done: return hr; } -static HRESULT WINAPI media_engine_TransferVideoFrame(IMFMediaEngineEx *iface, IUnknown *surface, +static HRESULT WINAPI media_engine_TransferVideoFrame(IMFMediaEngine *iface, IUnknown *surface, const MFVideoNormalizedRect *src_rect, const RECT *dst_rect, const MFARGB *color) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); ID3D11Texture2D *texture; HRESULT hr = E_NOINTERFACE; @@ -2371,9 +2213,9 @@ static HRESULT WINAPI media_engine_TransferVideoFrame(IMFMediaEngineEx *iface, I return hr; } -static HRESULT WINAPI media_engine_OnVideoStreamTick(IMFMediaEngineEx *iface, LONGLONG *pts) +static HRESULT WINAPI media_engine_OnVideoStreamTick(IMFMediaEngine *iface, LONGLONG *pts) { - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); HRESULT hr; TRACE("%p, %p.\n", iface, pts); @@ -2395,390 +2237,7 @@ static HRESULT WINAPI media_engine_OnVideoStreamTick(IMFMediaEngineEx *iface, LO return hr; } -static HRESULT WINAPI media_engine_SetSourceFromByteStream(IMFMediaEngineEx *iface, IMFByteStream *bytestream, BSTR url) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr; - - TRACE("%p, %p, %s.\n", iface, bytestream, debugstr_w(url)); - - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else if (!bytestream || !url) - hr = E_POINTER; - else - hr = media_engine_set_source(engine, bytestream, url); - - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_GetStatistics(IMFMediaEngineEx *iface, MF_MEDIA_ENGINE_STATISTIC stat_id, PROPVARIANT *stat) -{ - FIXME("%p, %x, %p stub.\n", iface, stat_id, stat); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_UpdateVideoStream(IMFMediaEngineEx *iface, const MFVideoNormalizedRect *src, - const RECT *dst, const MFARGB *border_color) -{ - FIXME("%p, %p, %p, %p stub.\n", iface, src, dst, border_color); - - return E_NOTIMPL; -} - -static double WINAPI media_engine_GetBalance(IMFMediaEngineEx *iface) -{ - FIXME("%p stub.\n", iface); - - return 0.0; -} - -static HRESULT WINAPI media_engine_SetBalance(IMFMediaEngineEx *iface, double balance) -{ - FIXME("%p, %f stub.\n", iface, balance); - - return E_NOTIMPL; -} - -static BOOL WINAPI media_engine_IsPlaybackRateSupported(IMFMediaEngineEx *iface, double rate) -{ - FIXME("%p, %f stub.\n", iface, rate); - - return FALSE; -} - -static HRESULT WINAPI media_engine_FrameStep(IMFMediaEngineEx *iface, BOOL forward) -{ - FIXME("%p, %d stub.\n", iface, forward); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_GetResourceCharacteristics(IMFMediaEngineEx *iface, DWORD *flags) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_FAIL; - - TRACE("%p, %p.\n", iface, flags); - - EnterCriticalSection(&engine->cs); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else if (engine->presentation.source) - hr = IMFMediaSource_GetCharacteristics(engine->presentation.source, flags); - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_GetPresentationAttribute(IMFMediaEngineEx *iface, REFGUID attribute, - PROPVARIANT *value) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = E_FAIL; - - TRACE("%p, %s, %p.\n", iface, debugstr_guid(attribute), value); - - EnterCriticalSection(&engine->cs); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else if (engine->presentation.pd) - hr = IMFPresentationDescriptor_GetItem(engine->presentation.pd, attribute, value); - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_GetNumberOfStreams(IMFMediaEngineEx *iface, DWORD *stream_count) -{ - FIXME("%p, %p stub.\n", iface, stream_count); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_GetStreamAttribute(IMFMediaEngineEx *iface, DWORD stream_index, REFGUID attribute, - PROPVARIANT *value) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - IMFStreamDescriptor *sd; - HRESULT hr = E_FAIL; - BOOL selected; - - TRACE("%p, %ld, %s, %p.\n", iface, stream_index, debugstr_guid(attribute), value); - - EnterCriticalSection(&engine->cs); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else if (engine->presentation.pd) - { - if (SUCCEEDED(hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(engine->presentation.pd, - stream_index, &selected, &sd))) - { - hr = IMFStreamDescriptor_GetItem(sd, attribute, value); - IMFStreamDescriptor_Release(sd); - } - } - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_GetStreamSelection(IMFMediaEngineEx *iface, DWORD stream_index, BOOL *enabled) -{ - FIXME("%p, %ld, %p stub.\n", iface, stream_index, enabled); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_SetStreamSelection(IMFMediaEngineEx *iface, DWORD stream_index, BOOL enabled) -{ - FIXME("%p, %ld, %d stub.\n", iface, stream_index, enabled); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_ApplyStreamSelections(IMFMediaEngineEx *iface) -{ - FIXME("%p stub.\n", iface); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_IsProtected(IMFMediaEngineEx *iface, BOOL *protected) -{ - FIXME("%p, %p stub.\n", iface, protected); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_InsertVideoEffect(IMFMediaEngineEx *iface, IUnknown *effect, BOOL is_optional) -{ - FIXME("%p, %p, %d stub.\n", iface, effect, is_optional); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_InsertAudioEffect(IMFMediaEngineEx *iface, IUnknown *effect, BOOL is_optional) -{ - FIXME("%p, %p, %d stub.\n", iface, effect, is_optional); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_RemoveAllEffects(IMFMediaEngineEx *iface) -{ - FIXME("%p stub.\n", iface); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_SetTimelineMarkerTimer(IMFMediaEngineEx *iface, double timeout) -{ - FIXME("%p, %f stub.\n", iface, timeout); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_GetTimelineMarkerTimer(IMFMediaEngineEx *iface, double *timeout) -{ - FIXME("%p, %p stub.\n", iface, timeout); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_CancelTimelineMarkerTimer(IMFMediaEngineEx *iface) -{ - FIXME("%p stub.\n", iface); - - return E_NOTIMPL; -} - -static BOOL WINAPI media_engine_IsStereo3D(IMFMediaEngineEx *iface) -{ - FIXME("%p stub.\n", iface); - - return FALSE; -} - -static HRESULT WINAPI media_engine_GetStereo3DFramePackingMode(IMFMediaEngineEx *iface, MF_MEDIA_ENGINE_S3D_PACKING_MODE *mode) -{ - FIXME("%p, %p stub.\n", iface, mode); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_SetStereo3DFramePackingMode(IMFMediaEngineEx *iface, MF_MEDIA_ENGINE_S3D_PACKING_MODE mode) -{ - FIXME("%p, %#x stub.\n", iface, mode); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_GetStereo3DRenderMode(IMFMediaEngineEx *iface, MF3DVideoOutputType *output_type) -{ - FIXME("%p, %p stub.\n", iface, output_type); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_SetStereo3DRenderMode(IMFMediaEngineEx *iface, MF3DVideoOutputType output_type) -{ - FIXME("%p, %#x stub.\n", iface, output_type); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_EnableWindowlessSwapchainMode(IMFMediaEngineEx *iface, BOOL enable) -{ - FIXME("%p, %d stub.\n", iface, enable); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_GetVideoSwapchainHandle(IMFMediaEngineEx *iface, HANDLE *swapchain) -{ - FIXME("%p, %p stub.\n", iface, swapchain); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_EnableHorizontalMirrorMode(IMFMediaEngineEx *iface, BOOL enable) -{ - FIXME("%p, %d stub.\n", iface, enable); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_GetAudioStreamCategory(IMFMediaEngineEx *iface, UINT32 *category) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr; - - TRACE("%p, %p.\n", iface, category); - - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - hr = IMFAttributes_GetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, category); - - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_SetAudioStreamCategory(IMFMediaEngineEx *iface, UINT32 category) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr; - - TRACE("%p, %u.\n", iface, category); - - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - hr = IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, category); - - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_GetAudioEndpointRole(IMFMediaEngineEx *iface, UINT32 *role) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr; - - TRACE("%p, %p.\n", iface, role); - - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - hr = IMFAttributes_GetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, role); - - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_SetAudioEndpointRole(IMFMediaEngineEx *iface, UINT32 role) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr; - - TRACE("%p, %u.\n", iface, role); - - EnterCriticalSection(&engine->cs); - - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - hr = IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, role); - - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_GetRealTimeMode(IMFMediaEngineEx *iface, BOOL *enabled) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = S_OK; - - TRACE("%p, %p.\n", iface, enabled); - - EnterCriticalSection(&engine->cs); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - *enabled = !!(engine->flags & MF_MEDIA_ENGINE_REAL_TIME_MODE); - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_SetRealTimeMode(IMFMediaEngineEx *iface, BOOL enable) -{ - struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); - HRESULT hr = S_OK; - - TRACE("%p, %d.\n", iface, enable); - - EnterCriticalSection(&engine->cs); - if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) - hr = MF_E_SHUTDOWN; - else - media_engine_set_flag(engine, MF_MEDIA_ENGINE_REAL_TIME_MODE, enable); - LeaveCriticalSection(&engine->cs); - - return hr; -} - -static HRESULT WINAPI media_engine_SetCurrentTimeEx(IMFMediaEngineEx *iface, double seektime, MF_MEDIA_ENGINE_SEEK_MODE mode) -{ - FIXME("%p, %f, %#x stub.\n", iface, seektime, mode); - - return E_NOTIMPL; -} - -static HRESULT WINAPI media_engine_EnableTimeUpdateTimer(IMFMediaEngineEx *iface, BOOL enable) -{ - FIXME("%p, %d stub.\n", iface, enable); - - return E_NOTIMPL; -} - -static const IMFMediaEngineExVtbl media_engine_vtbl = +static const IMFMediaEngineVtbl media_engine_vtbl = { media_engine_QueryInterface, media_engine_AddRef, @@ -2825,77 +2284,6 @@ static const IMFMediaEngineExVtbl media_engine_vtbl = media_engine_Shutdown, media_engine_TransferVideoFrame, media_engine_OnVideoStreamTick, - media_engine_SetSourceFromByteStream, - media_engine_GetStatistics, - media_engine_UpdateVideoStream, - media_engine_GetBalance, - media_engine_SetBalance, - media_engine_IsPlaybackRateSupported, - media_engine_FrameStep, - media_engine_GetResourceCharacteristics, - media_engine_GetPresentationAttribute, - media_engine_GetNumberOfStreams, - media_engine_GetStreamAttribute, - media_engine_GetStreamSelection, - media_engine_SetStreamSelection, - media_engine_ApplyStreamSelections, - media_engine_IsProtected, - media_engine_InsertVideoEffect, - media_engine_InsertAudioEffect, - media_engine_RemoveAllEffects, - media_engine_SetTimelineMarkerTimer, - media_engine_GetTimelineMarkerTimer, - media_engine_CancelTimelineMarkerTimer, - media_engine_IsStereo3D, - media_engine_GetStereo3DFramePackingMode, - media_engine_SetStereo3DFramePackingMode, - media_engine_GetStereo3DRenderMode, - media_engine_SetStereo3DRenderMode, - media_engine_EnableWindowlessSwapchainMode, - media_engine_GetVideoSwapchainHandle, - media_engine_EnableHorizontalMirrorMode, - media_engine_GetAudioStreamCategory, - media_engine_SetAudioStreamCategory, - media_engine_GetAudioEndpointRole, - media_engine_SetAudioEndpointRole, - media_engine_GetRealTimeMode, - media_engine_SetRealTimeMode, - media_engine_SetCurrentTimeEx, - media_engine_EnableTimeUpdateTimer, -}; - -static HRESULT WINAPI media_engine_gs_QueryInterface(IMFGetService *iface, REFIID riid, void **obj) -{ - struct media_engine *engine = impl_from_IMFGetService(iface); - return IMFMediaEngineEx_QueryInterface(&engine->IMFMediaEngineEx_iface, riid, obj); -} - -static ULONG WINAPI media_engine_gs_AddRef(IMFGetService *iface) -{ - struct media_engine *engine = impl_from_IMFGetService(iface); - return IMFMediaEngineEx_AddRef(&engine->IMFMediaEngineEx_iface); -} - -static ULONG WINAPI media_engine_gs_Release(IMFGetService *iface) -{ - struct media_engine *engine = impl_from_IMFGetService(iface); - return IMFMediaEngineEx_Release(&engine->IMFMediaEngineEx_iface); -} - -static HRESULT WINAPI media_engine_gs_GetService(IMFGetService *iface, REFGUID service, - REFIID riid, void **object) -{ - FIXME("%p, %s, %s, %p stub.\n", iface, debugstr_guid(service), debugstr_guid(riid), object); - - return E_NOTIMPL; -} - -static const IMFGetServiceVtbl media_engine_get_service_vtbl = -{ - media_engine_gs_QueryInterface, - media_engine_gs_AddRef, - media_engine_gs_Release, - media_engine_gs_GetService, }; static HRESULT WINAPI media_engine_grabber_callback_QueryInterface(IMFSampleGrabberSinkCallback *iface, @@ -2916,13 +2304,13 @@ static HRESULT WINAPI media_engine_grabber_callback_QueryInterface(IMFSampleGrab static ULONG WINAPI media_engine_grabber_callback_AddRef(IMFSampleGrabberSinkCallback *iface) { struct media_engine *engine = impl_from_IMFSampleGrabberSinkCallback(iface); - return IMFMediaEngineEx_AddRef(&engine->IMFMediaEngineEx_iface); + return IMFMediaEngine_AddRef(&engine->IMFMediaEngine_iface); } static ULONG WINAPI media_engine_grabber_callback_Release(IMFSampleGrabberSinkCallback *iface) { struct media_engine *engine = impl_from_IMFSampleGrabberSinkCallback(iface); - return IMFMediaEngineEx_Release(&engine->IMFMediaEngineEx_iface); + return IMFMediaEngine_Release(&engine->IMFMediaEngine_iface); } static HRESULT WINAPI media_engine_grabber_callback_OnClockStart(IMFSampleGrabberSinkCallback *iface, @@ -3051,8 +2439,7 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct IMFClock *clock; HRESULT hr; - engine->IMFMediaEngineEx_iface.lpVtbl = &media_engine_vtbl; - engine->IMFGetService_iface.lpVtbl = &media_engine_get_service_vtbl; + engine->IMFMediaEngine_iface.lpVtbl = &media_engine_vtbl; engine->session_events.lpVtbl = &media_engine_session_events_vtbl; engine->load_handler.lpVtbl = &media_engine_load_handler_vtbl; engine->grabber_callback.lpVtbl = &media_engine_grabber_callback_vtbl; @@ -3096,12 +2483,6 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct if (FAILED(hr = IMFAttributes_CopyAllItems(attributes, engine->attributes))) return hr; - /* Set default audio configuration */ - if (FAILED(IMFAttributes_GetItem(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, NULL))) - IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_CATEGORY, AudioCategory_Other); - if (FAILED(IMFAttributes_GetItem(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, NULL))) - IMFAttributes_SetUINT32(engine->attributes, &MF_MEDIA_ENGINE_AUDIO_ENDPOINT_ROLE, eMultimedia); - IMFAttributes_GetUINT64(attributes, &MF_MEDIA_ENGINE_PLAYBACK_HWND, &playback_hwnd); hr = IMFAttributes_GetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, &output_format); if (playback_hwnd) /* FIXME: handle MF_MEDIA_ENGINE_PLAYBACK_VISUAL */ @@ -3123,7 +2504,7 @@ static HRESULT WINAPI media_engine_factory_CreateInstance(IMFMediaEngineClassFac struct media_engine *object; HRESULT hr; - TRACE("%p, %#lx, %p, %p.\n", iface, flags, attributes, engine); + TRACE("%p, %#x, %p, %p.\n", iface, flags, attributes, engine); if (!attributes || !engine) return E_POINTER; @@ -3139,7 +2520,7 @@ static HRESULT WINAPI media_engine_factory_CreateInstance(IMFMediaEngineClassFac return hr; } - *engine = (IMFMediaEngine *)&object->IMFMediaEngineEx_iface; + *engine = &object->IMFMediaEngine_iface; return S_OK; } diff --git a/dlls/mfmediaengine/tests/Makefile.in b/dlls/mfmediaengine/tests/Makefile.in index 421b75587a0..13bbef64df2 100644 --- wine/dlls/mfmediaengine/tests/Makefile.in +++ wine/dlls/mfmediaengine/tests/Makefile.in @@ -1,5 +1,6 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES TESTDLL = mfmediaengine.dll -IMPORTS = ole32 mfplat oleaut32 mfuuid uuid +IMPORTS = ole32 mfplat mfmediaengine oleaut32 mfuuid uuid C_SRCS = \ mfmediaengine.c diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 008ee58849c..096f6e3f2a5 100644 --- wine/dlls/mfmediaengine/tests/mfmediaengine.c +++ wine/dlls/mfmediaengine/tests/mfmediaengine.c @@ -29,9 +29,8 @@ #include "mferror.h" #include "dxgi.h" #include "initguid.h" -#include "mmdeviceapi.h" -#include "audiosessiontypes.h" +#include "wine/heap.h" #include "wine/test.h" static HRESULT (WINAPI *pMFCreateDXGIDeviceManager)(UINT *token, IMFDXGIDeviceManager **manager); @@ -44,22 +43,7 @@ static void _expect_ref(IUnknown *obj, ULONG ref, int line) ULONG rc; IUnknown_AddRef(obj); rc = IUnknown_Release(obj); - ok_(__FILE__,line)(rc == ref, "Unexpected refcount %ld, expected %ld.\n", rc, ref); -} - -#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) -static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) -{ - IUnknown *iface = iface_ptr; - HRESULT hr, expected_hr; - IUnknown *unk; - - expected_hr = supported ? S_OK : E_NOINTERFACE; - - hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); - if (SUCCEEDED(hr)) - IUnknown_Release(unk); + ok_(__FILE__,line)(rc == ref, "Unexpected refcount %d, expected %d.\n", rc, ref); } static void init_functions(void) @@ -105,12 +89,7 @@ static ULONG WINAPI media_engine_notify_AddRef(IMFMediaEngineNotify *iface) static ULONG WINAPI media_engine_notify_Release(IMFMediaEngineNotify *iface) { struct media_engine_notify *notify = impl_from_IMFMediaEngineNotify(iface); - ULONG refcount = InterlockedDecrement(¬ify->refcount); - - if (!refcount) - free(notify); - - return refcount; + return InterlockedDecrement(¬ify->refcount); } static HRESULT WINAPI media_engine_notify_EventNotify(IMFMediaEngineNotify *iface, DWORD event, DWORD_PTR param1, DWORD param2) @@ -126,18 +105,6 @@ static IMFMediaEngineNotifyVtbl media_engine_notify_vtbl = media_engine_notify_EventNotify, }; -static struct media_engine_notify *create_callback(void) -{ - struct media_engine_notify *object; - - object = calloc(1, sizeof(*object)); - - object->IMFMediaEngineNotify_iface.lpVtbl = &media_engine_notify_vtbl; - object->refcount = 1; - - return object; -} - static IMFMediaEngine *create_media_engine(IMFMediaEngineNotify *callback) { IMFDXGIDeviceManager *manager; @@ -147,18 +114,18 @@ static IMFMediaEngine *create_media_engine(IMFMediaEngineNotify *callback) HRESULT hr; hr = pMFCreateDXGIDeviceManager(&token, &manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create dxgi device manager, hr %#x.\n", hr); hr = MFCreateAttributes(&attributes, 3); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create attributes, hr %#x.\n", hr); hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, (IUnknown *)callback); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFAttributes_SetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, DXGI_FORMAT_UNKNOWN); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaEngineClassFactory_CreateInstance(factory, 0, attributes, &media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media engine, hr %#x.\n", hr); IMFAttributes_Release(attributes); IMFDXGIDeviceManager_Release(manager); @@ -166,24 +133,11 @@ static IMFMediaEngine *create_media_engine(IMFMediaEngineNotify *callback) return media_engine; } -static IMFMediaEngineEx *create_media_engine_ex(IMFMediaEngineNotify *callback) -{ - IMFMediaEngine *engine = create_media_engine(callback); - IMFMediaEngineEx *engine_ex = NULL; - - if (engine) - { - IMFMediaEngine_QueryInterface(engine, &IID_IMFMediaEngineEx, (void **)&engine_ex); - IMFMediaEngine_Release(engine); - } - - return engine_ex; -} - static void test_factory(void) { + struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1}; + IMFMediaEngineNotify *notify = ¬ify_impl.IMFMediaEngineNotify_iface; IMFMediaEngineClassFactory *factory, *factory2; - struct media_engine_notify *notify; IMFDXGIDeviceManager *manager; IMFMediaEngine *media_engine; IMFAttributes *attributes; @@ -192,158 +146,118 @@ static void test_factory(void) hr = CoCreateInstance(&CLSID_MFMediaEngineClassFactory, NULL, CLSCTX_INPROC_SERVER, &IID_IMFMediaEngineClassFactory, (void **)&factory); - ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* pre-win8 */, "Failed to create class factory, hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG) /* pre-win8 */, "Failed to create class factory, hr %#x.\n", hr); if (FAILED(hr)) { win_skip("Media Engine is not supported.\n"); return; } - notify = create_callback(); - /* Aggregation is not supported. */ hr = CoCreateInstance(&CLSID_MFMediaEngineClassFactory, (IUnknown *)factory, CLSCTX_INPROC_SERVER, &IID_IMFMediaEngineClassFactory, (void **)&factory2); - ok(hr == CLASS_E_NOAGGREGATION, "Unexpected hr %#lx.\n", hr); + ok(hr == CLASS_E_NOAGGREGATION, "Unexpected hr %#x.\n", hr); hr = pMFCreateDXGIDeviceManager(&token, &manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "MFCreateDXGIDeviceManager failed: %#x.\n", hr); hr = MFCreateAttributes(&attributes, 3); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "MFCreateAttributes failed: %#x.\n", hr); - hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, + attributes, &media_engine); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "IMFMediaEngineClassFactory_CreateInstance got %#x.\n", hr); hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_OPM_HWND, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "IMFAttributes_SetUnknown failed: %#x.\n", hr); + hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, + attributes, &media_engine); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "IMFMediaEngineClassFactory_CreateInstance got %#x.\n", hr); IMFAttributes_DeleteAllItems(attributes); - hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, (IUnknown *)¬ify->IMFMediaEngineNotify_iface); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, (IUnknown *)notify); + ok(hr == S_OK, "IMFAttributes_SetUnknown failed: %#x.\n", hr); hr = IMFAttributes_SetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, DXGI_FORMAT_UNKNOWN); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "IMFAttributes_SetUINT32 failed: %#x.\n", hr); EXPECT_REF(factory, 1); - hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, + attributes, &media_engine); + ok(hr == S_OK, "IMFMediaEngineClassFactory_CreateInstance failed: %#x.\n", hr); EXPECT_REF(factory, 1); IMFMediaEngine_Release(media_engine); IMFAttributes_Release(attributes); IMFDXGIDeviceManager_Release(manager); IMFMediaEngineClassFactory_Release(factory); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } static void test_CreateInstance(void) { - struct media_engine_notify *notify; - IMFMediaEngineEx *media_engine_ex; + struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1}; + IMFMediaEngineNotify *notify = ¬ify_impl.IMFMediaEngineNotify_iface; IMFDXGIDeviceManager *manager; IMFMediaEngine *media_engine; IMFAttributes *attributes; - IUnknown *unk; UINT token; HRESULT hr; - BOOL ret; - - notify = create_callback(); hr = pMFCreateDXGIDeviceManager(&token, &manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create dxgi device manager, hr %#x.\n", hr); hr = MFCreateAttributes(&attributes, 3); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create attributes, hr %#x.\n", hr); hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_OPM_HWND, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); IMFAttributes_DeleteAllItems(attributes); - hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, (IUnknown *)¬ify->IMFMediaEngineNotify_iface); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, (IUnknown *)notify); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFAttributes_SetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, DXGI_FORMAT_UNKNOWN); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_REAL_TIME_MODE - | MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - check_interface(media_engine, &IID_IMFMediaEngine, TRUE); - - hr = IMFMediaEngine_QueryInterface(media_engine, &IID_IMFGetService, (void **)&unk); - ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* supported since win10 */, "Unexpected hr %#lx.\n", hr); - if (SUCCEEDED(hr)) - IUnknown_Release(unk); - - if (SUCCEEDED(IMFMediaEngine_QueryInterface(media_engine, &IID_IMFMediaEngineEx, (void **)&media_engine_ex))) - { - hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(ret, "Unexpected value.\n"); - - hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!ret, "Unexpected value.\n"); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); - hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(ret, "Unexpected value.\n"); - - IMFMediaEngineEx_Release(media_engine_ex); - } + hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); + ok(hr == S_OK, "Failed to create media engine, hr %#x.\n", hr); IMFMediaEngine_Release(media_engine); IMFAttributes_Release(attributes); IMFDXGIDeviceManager_Release(manager); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } static void test_Shutdown(void) { - struct media_engine_notify *notify; - IMFMediaEngineEx *media_engine_ex; + struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1}; + IMFMediaEngineNotify *callback = ¬ify_impl.IMFMediaEngineNotify_iface; IMFMediaTimeRange *time_range; IMFMediaEngine *media_engine; - PROPVARIANT propvar; - DWORD flags, cx, cy; unsigned int state; - UINT32 value; + DWORD cx, cy; double val; HRESULT hr; BSTR str; - BOOL ret; - notify = create_callback(); - - media_engine = create_media_engine(¬ify->IMFMediaEngineNotify_iface); + media_engine = create_media_engine(callback); hr = IMFMediaEngine_Shutdown(media_engine); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); hr = IMFMediaEngine_Shutdown(media_engine); - ok(hr == MF_E_SHUTDOWN || broken(hr == S_OK) /* before win10 */, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN || broken(hr == S_OK) /* before win10 */, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_SetSource(media_engine, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_GetCurrentSource(media_engine, &str); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_GetNetworkState(media_engine); ok(!state, "Unexpected state %d.\n", state); @@ -353,26 +267,29 @@ static void test_Shutdown(void) ok(!state, "Unexpected state %d.\n", state); hr = IMFMediaEngine_SetPreload(media_engine, MF_MEDIA_ENGINE_PRELOAD_AUTOMATIC); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_GetPreload(media_engine); ok(state == MF_MEDIA_ENGINE_PRELOAD_AUTOMATIC, "Unexpected state %d.\n", state); hr = IMFMediaEngine_SetPreload(media_engine, 100); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_GetPreload(media_engine); ok(state == 100, "Unexpected state %d.\n", state); hr = IMFMediaEngine_GetBuffered(media_engine, &time_range); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_Load(media_engine); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); str = SysAllocString(L"video/mp4"); hr = IMFMediaEngine_CanPlayType(media_engine, str, &state); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); SysFreeString(str); state = IMFMediaEngine_GetReadyState(media_engine); @@ -385,7 +302,8 @@ static void test_Shutdown(void) ok(val == 0.0, "Unexpected time %f.\n", val); hr = IMFMediaEngine_SetCurrentTime(media_engine, 1.0); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); val = IMFMediaEngine_GetStartTime(media_engine); ok(val == 0.0, "Unexpected time %f.\n", val); @@ -397,16 +315,18 @@ static void test_Shutdown(void) ok(val == 1.0, "Unexpected rate %f.\n", val); hr = IMFMediaEngine_SetDefaultPlaybackRate(media_engine, 2.0); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); val = IMFMediaEngine_GetPlaybackRate(media_engine); ok(val == 1.0, "Unexpected rate %f.\n", val); hr = IMFMediaEngine_GetPlayed(media_engine, &time_range); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_GetSeekable(media_engine, &time_range); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_IsEnded(media_engine); ok(!state, "Unexpected state %d.\n", state); @@ -416,7 +336,7 @@ static void test_Shutdown(void) ok(!state, "Unexpected state.\n"); hr = IMFMediaEngine_SetAutoPlay(media_engine, TRUE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_GetAutoPlay(media_engine); ok(!!state, "Unexpected state.\n"); @@ -426,28 +346,30 @@ static void test_Shutdown(void) ok(!state, "Unexpected state.\n"); hr = IMFMediaEngine_SetLoop(media_engine, TRUE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_GetLoop(media_engine); ok(!!state, "Unexpected state.\n"); hr = IMFMediaEngine_Play(media_engine); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_Pause(media_engine); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_GetMuted(media_engine); ok(!state, "Unexpected state.\n"); hr = IMFMediaEngine_SetMuted(media_engine, TRUE); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); val = IMFMediaEngine_GetVolume(media_engine); ok(val == 1.0, "Unexpected value %f.\n", val); hr = IMFMediaEngine_SetVolume(media_engine, 2.0); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); state = IMFMediaEngine_HasVideo(media_engine); ok(!state, "Unexpected state.\n"); @@ -456,59 +378,18 @@ static void test_Shutdown(void) ok(!state, "Unexpected state.\n"); hr = IMFMediaEngine_GetNativeVideoSize(media_engine, &cx, &cy); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_GetVideoAspectRatio(media_engine, &cx, &cy); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - if (SUCCEEDED(IMFMediaEngine_QueryInterface(media_engine, &IID_IMFMediaEngineEx, (void **)&media_engine_ex))) - { - hr = IMFMediaEngineEx_SetSourceFromByteStream(media_engine_ex, NULL, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetAudioStreamCategory(media_engine_ex, &value); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetAudioEndpointRole(media_engine_ex, &value); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_SetAudioStreamCategory(media_engine_ex, AudioCategory_ForegroundOnlyMedia); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_SetAudioEndpointRole(media_engine_ex, eConsole); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine_ex, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine_ex, &flags); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine_ex, &MF_PD_DURATION, &propvar); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetStreamAttribute(media_engine_ex, 0, &MF_SD_PROTECTED, &propvar); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); - - IMFMediaEngineEx_Release(media_engine_ex); - } + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); IMFMediaEngine_Release(media_engine); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } static void test_Play(void) { - struct media_engine_notify *notify; + struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1}; + IMFMediaEngineNotify *callback = ¬ify_impl.IMFMediaEngineNotify_iface; IMFMediaTimeRange *range, *range1; IMFMediaEngine *media_engine; LONGLONG pts; @@ -516,18 +397,16 @@ static void test_Play(void) HRESULT hr; BOOL ret; - notify = create_callback(); - - media_engine = create_media_engine(¬ify->IMFMediaEngineNotify_iface); + media_engine = create_media_engine(callback); hr = IMFMediaEngine_GetBuffered(media_engine, &range); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_GetBuffered(media_engine, &range1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(range != range1, "Unexpected pointer.\n"); count = IMFMediaTimeRange_GetLength(range); - ok(!count, "Unexpected count %lu.\n", count); + ok(!count, "Unexpected count %u.\n", count); IMFMediaTimeRange_Release(range); IMFMediaTimeRange_Release(range1); @@ -536,30 +415,30 @@ static void test_Play(void) ok(ret, "Unexpected state %d.\n", ret); hr = IMFMediaEngine_OnVideoStreamTick(media_engine, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); pts = 0; hr = IMFMediaEngine_OnVideoStreamTick(media_engine, &pts); - ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(pts == MINLONGLONG, "Unexpected timestamp.\n"); hr = IMFMediaEngine_Play(media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ret = IMFMediaEngine_IsPaused(media_engine); ok(!ret, "Unexpected state %d.\n", ret); hr = IMFMediaEngine_Play(media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_Shutdown(media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_OnVideoStreamTick(media_engine, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_OnVideoStreamTick(media_engine, &pts); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); ret = IMFMediaEngine_IsPaused(media_engine); ok(!ret, "Unexpected state %d.\n", ret); @@ -567,34 +446,32 @@ static void test_Play(void) IMFMediaEngine_Release(media_engine); /* Play -> Pause */ - media_engine = create_media_engine(¬ify->IMFMediaEngineNotify_iface); + media_engine = create_media_engine(callback); hr = IMFMediaEngine_Play(media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ret = IMFMediaEngine_IsPaused(media_engine); ok(!ret, "Unexpected state %d.\n", ret); hr = IMFMediaEngine_Pause(media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ret = IMFMediaEngine_IsPaused(media_engine); ok(!!ret, "Unexpected state %d.\n", ret); IMFMediaEngine_Release(media_engine); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } static void test_playback_rate(void) { - struct media_engine_notify *notify; + struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1}; + IMFMediaEngineNotify *callback = ¬ify_impl.IMFMediaEngineNotify_iface; IMFMediaEngine *media_engine; double rate; HRESULT hr; - notify = create_callback(); - - media_engine = create_media_engine(¬ify->IMFMediaEngineNotify_iface); + media_engine = create_media_engine(callback); rate = IMFMediaEngine_GetDefaultPlaybackRate(media_engine); ok(rate == 1.0, "Unexpected default rate.\n"); @@ -603,132 +480,127 @@ static void test_playback_rate(void) ok(rate == 1.0, "Unexpected default rate.\n"); hr = IMFMediaEngine_SetPlaybackRate(media_engine, 0.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); rate = IMFMediaEngine_GetPlaybackRate(media_engine); ok(rate == 0.0, "Unexpected default rate.\n"); hr = IMFMediaEngine_SetDefaultPlaybackRate(media_engine, 0.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMFMediaEngine_Release(media_engine); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } static void test_mute(void) { - struct media_engine_notify *notify; + struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1}; + IMFMediaEngineNotify *callback = ¬ify_impl.IMFMediaEngineNotify_iface; IMFMediaEngine *media_engine; HRESULT hr; BOOL ret; - notify = create_callback(); - - media_engine = create_media_engine(¬ify->IMFMediaEngineNotify_iface); + media_engine = create_media_engine(callback); ret = IMFMediaEngine_GetMuted(media_engine); ok(!ret, "Unexpected state.\n"); hr = IMFMediaEngine_SetMuted(media_engine, TRUE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ret = IMFMediaEngine_GetMuted(media_engine); ok(ret, "Unexpected state.\n"); hr = IMFMediaEngine_Shutdown(media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ret = IMFMediaEngine_GetMuted(media_engine); ok(ret, "Unexpected state.\n"); IMFMediaEngine_Release(media_engine); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } static void test_error(void) { - struct media_engine_notify *notify; + struct media_engine_notify notify_impl = {{&media_engine_notify_vtbl}, 1}; + IMFMediaEngineNotify *callback = ¬ify_impl.IMFMediaEngineNotify_iface; IMFMediaEngine *media_engine; IMFMediaError *eo, *eo2; unsigned int code; HRESULT hr; - notify = create_callback(); - - media_engine = create_media_engine(¬ify->IMFMediaEngineNotify_iface); + media_engine = create_media_engine(callback); eo = (void *)0xdeadbeef; hr = IMFMediaEngine_GetError(media_engine, &eo); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!eo, "Unexpected instance.\n"); hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_ENCRYPTED + 1); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_ABORTED); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); eo = NULL; hr = IMFMediaEngine_GetError(media_engine, &eo); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!eo, "Unexpected instance.\n"); eo2 = NULL; hr = IMFMediaEngine_GetError(media_engine, &eo2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(eo2 != eo, "Unexpected instance.\n"); IMFMediaError_Release(eo2); IMFMediaError_Release(eo); hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_NOERROR); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); eo = (void *)0xdeadbeef; hr = IMFMediaEngine_GetError(media_engine, &eo); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!eo, "Unexpected instance.\n"); hr = IMFMediaEngine_Shutdown(media_engine); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); eo = (void *)0xdeadbeef; hr = IMFMediaEngine_GetError(media_engine, &eo); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); ok(!eo, "Unexpected instance.\n"); hr = IMFMediaEngine_SetErrorCode(media_engine, MF_MEDIA_ENGINE_ERR_NOERROR); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); IMFMediaEngine_Release(media_engine); /* Error object. */ hr = IMFMediaEngineClassFactory_CreateError(factory, &eo); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create error object, hr %#x.\n", hr); code = IMFMediaError_GetErrorCode(eo); ok(code == MF_MEDIA_ENGINE_ERR_NOERROR, "Unexpected code %u.\n", code); hr = IMFMediaError_GetExtendedErrorCode(eo); - ok(hr == S_OK, "Unexpected code %#lx.\n", hr); + ok(hr == S_OK, "Unexpected code %#x.\n", hr); hr = IMFMediaError_SetErrorCode(eo, MF_MEDIA_ENGINE_ERR_ENCRYPTED + 1); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFMediaError_SetErrorCode(eo, MF_MEDIA_ENGINE_ERR_ABORTED); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); code = IMFMediaError_GetErrorCode(eo); ok(code == MF_MEDIA_ENGINE_ERR_ABORTED, "Unexpected code %u.\n", code); hr = IMFMediaError_SetExtendedErrorCode(eo, E_FAIL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaError_GetExtendedErrorCode(eo); - ok(hr == E_FAIL, "Unexpected code %#lx.\n", hr); + ok(hr == E_FAIL, "Unexpected code %#x.\n", hr); IMFMediaError_Release(eo); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); } static void test_time_range(void) @@ -740,11 +612,11 @@ static void test_time_range(void) BOOL ret; hr = IMFMediaEngineClassFactory_CreateTimeRange(factory, &range); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* Empty ranges. */ hr = IMFMediaTimeRange_Clear(range); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ret = IMFMediaTimeRange_ContainsTime(range, 10.0); ok(!ret, "Unexpected return value %d.\n", ret); @@ -753,225 +625,81 @@ static void test_time_range(void) ok(!count, "Unexpected range count.\n"); hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); /* Add a range. */ hr = IMFMediaTimeRange_AddRange(range, 10.0, 1.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); count = IMFMediaTimeRange_GetLength(range); ok(count == 1, "Unexpected range count.\n"); hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(start == 10.0, "Unexpected start %.e.\n", start); hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(end == 1.0, "Unexpected end %.e.\n", end); hr = IMFMediaTimeRange_AddRange(range, 2.0, 3.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); count = IMFMediaTimeRange_GetLength(range); ok(count == 1, "Unexpected range count.\n"); hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); +todo_wine ok(start == 2.0, "Unexpected start %.8e.\n", start); hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); +todo_wine ok(end == 3.0, "Unexpected end %.8e.\n", end); hr = IMFMediaTimeRange_AddRange(range, 10.0, 9.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); count = IMFMediaTimeRange_GetLength(range); +todo_wine ok(count == 2, "Unexpected range count.\n"); hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); +todo_wine ok(start == 2.0, "Unexpected start %.8e.\n", start); hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); +todo_wine ok(end == 3.0, "Unexpected end %.8e.\n", end); start = 0.0; hr = IMFMediaTimeRange_GetStart(range, 1, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(start == 10.0, "Unexpected start %.8e.\n", start); - - hr = IMFMediaTimeRange_GetEnd(range, 1, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(end == 9.0, "Unexpected end %.8e.\n", end); - - hr = IMFMediaTimeRange_AddRange(range, 2.0, 9.1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - count = IMFMediaTimeRange_GetLength(range); - ok(count == 2, "Unexpected range count.\n"); - - hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(start == 2.0, "Unexpected start %.8e.\n", start); - - hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(end == 9.1, "Unexpected end %.8e.\n", end); - - hr = IMFMediaTimeRange_GetStart(range, 1, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +todo_wine { + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(start == 10.0, "Unexpected start %.8e.\n", start); - +} hr = IMFMediaTimeRange_GetEnd(range, 1, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); +todo_wine { + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(end == 9.0, "Unexpected end %.8e.\n", end); - - hr = IMFMediaTimeRange_AddRange(range, 8.5, 2.5); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - count = IMFMediaTimeRange_GetLength(range); - ok(count == 2, "Unexpected range count.\n"); - - hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(start == 2.0, "Unexpected start %.8e.\n", start); - - hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(end == 9.1, "Unexpected end %.8e.\n", end); - - hr = IMFMediaTimeRange_AddRange(range, 20.0, 20.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - count = IMFMediaTimeRange_GetLength(range); - ok(count == 3, "Unexpected range count.\n"); - +} hr = IMFMediaTimeRange_Clear(range); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); count = IMFMediaTimeRange_GetLength(range); ok(!count, "Unexpected range count.\n"); - /* Intersect */ - hr = IMFMediaTimeRange_AddRange(range, 5.0, 10.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaTimeRange_AddRange(range, 6.0, 12.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(start == 5.0, "Unexpected start %.8e.\n", start); - - hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(end == 12.0, "Unexpected end %.8e.\n", end); - - count = IMFMediaTimeRange_GetLength(range); - ok(count == 1, "Unexpected range count.\n"); - - hr = IMFMediaTimeRange_AddRange(range, 4.0, 6.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - count = IMFMediaTimeRange_GetLength(range); - ok(count == 1, "Unexpected range count.\n"); - - hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(start == 4.0, "Unexpected start %.8e.\n", start); - - hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(end == 12.0, "Unexpected end %.8e.\n", end); - - hr = IMFMediaTimeRange_AddRange(range, 5.0, 3.0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - count = IMFMediaTimeRange_GetLength(range); - ok(count == 1, "Unexpected range count.\n"); - - hr = IMFMediaTimeRange_GetStart(range, 0, &start); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(start == 4.0, "Unexpected start %.8e.\n", start); - - hr = IMFMediaTimeRange_GetEnd(range, 0, &end); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(end == 12.0, "Unexpected end %.8e.\n", end); - IMFMediaTimeRange_Release(range); } -static void test_SetSourceFromByteStream(void) -{ - struct media_engine_notify *notify; - IMFMediaEngineEx *media_engine; - PROPVARIANT propvar; - DWORD flags; - HRESULT hr; - - notify = create_callback(); - - media_engine = create_media_engine_ex(¬ify->IMFMediaEngineNotify_iface); - if (!media_engine) - { - win_skip("IMFMediaEngineEx is not supported.\n"); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); - return; - } - - hr = IMFMediaEngineEx_SetSourceFromByteStream(media_engine, NULL, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine, NULL); - ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine, &flags); - ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine, &MF_PD_DURATION, &propvar); - ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaEngineEx_GetStreamAttribute(media_engine, 0, &MF_SD_PROTECTED, &propvar); - ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); - - IMFMediaEngineEx_Release(media_engine); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); -} - -static void test_audio_configuration(void) -{ - struct media_engine_notify *notify; - IMFMediaEngineEx *media_engine; - UINT32 value; - HRESULT hr; - - notify = create_callback(); - - media_engine = create_media_engine_ex(¬ify->IMFMediaEngineNotify_iface); - if (!media_engine) - { - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); - return; - } - - hr = IMFMediaEngineEx_GetAudioStreamCategory(media_engine, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(value == AudioCategory_Other, "Unexpected value %u.\n", value); - - hr = IMFMediaEngineEx_GetAudioEndpointRole(media_engine, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(value == eMultimedia, "Unexpected value %u.\n", value); - - IMFMediaEngineEx_Release(media_engine); - IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); -} - START_TEST(mfmediaengine) { HRESULT hr; @@ -990,7 +718,7 @@ START_TEST(mfmediaengine) init_functions(); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "MFStartup failed: %#lx.\n", hr); + ok(hr == S_OK, "MFStartup failed: %#x.\n", hr); test_factory(); test_CreateInstance(); @@ -1000,8 +728,6 @@ START_TEST(mfmediaengine) test_mute(); test_error(); test_time_range(); - test_SetSourceFromByteStream(); - test_audio_configuration(); IMFMediaEngineClassFactory_Release(factory); diff --git a/dlls/mfplat/Makefile.in b/dlls/mfplat/Makefile.in index 4515d652c58..79af7650de6 100644 --- wine/dlls/mfplat/Makefile.in +++ wine/dlls/mfplat/Makefile.in @@ -1,7 +1,7 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES MODULE = mfplat.dll IMPORTLIB = mfplat -IMPORTS = advapi32 ole32 mfuuid propsys rtworkq kernelbase -DELAYIMPORTS = bcrypt +IMPORTS = advapi32 ole32 mfuuid propsys rtworkq EXTRADLLFLAGS = -Wb,--prefer-native diff --git a/dlls/mfplat/aac_decoder.c b/dlls/mfplat/aac_decoder.c new file mode 100644 index 00000000000..97f2824039d --- /dev/null +++ wine/dlls/mfplat/aac_decoder.c @@ -0,0 +1,620 @@ +/* AAC Decoder Transform + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" +#include "mfobjects.h" +#include "mftransform.h" +#include "wmcodecdsp.h" + +#include "wine/debug.h" +#include "wine/heap.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +static const GUID *aac_decoder_input_types[] = +{ + &MFAudioFormat_AAC, +}; +static const GUID *aac_decoder_output_types[] = +{ + &MFAudioFormat_PCM, + &MFAudioFormat_Float, +}; + +struct aac_decoder +{ + IMFTransform IMFTransform_iface; + LONG refcount; + IMFMediaType *input_type; + IMFMediaType *output_type; + + IMFSample *input_sample; + struct wg_transform *wg_transform; +}; + +static struct aac_decoder *impl_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct aac_decoder, IMFTransform_iface); +} + +static void try_create_wg_transform(struct aac_decoder *decoder) +{ + struct wg_encoded_format input_format; + struct wg_format output_format; + + if (!decoder->input_type || !decoder->output_type) + return; + + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + + mf_media_type_to_wg_encoded_format(decoder->input_type, &input_format); + if (input_format.encoded_type == WG_ENCODED_TYPE_UNKNOWN) + return; + + mf_media_type_to_wg_format(decoder->output_type, &output_format); + if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + return; + + decoder->wg_transform = wg_transform_create(&input_format, &output_format); + if (!decoder->wg_transform) + WARN("Failed to create wg_transform.\n"); +} + +static HRESULT WINAPI aac_decoder_QueryInterface(IMFTransform *iface, REFIID iid, void **out) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IMFTransform)) + *out = &decoder->IMFTransform_iface; + else + { + *out = NULL; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI aac_decoder_AddRef(IMFTransform *iface) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&decoder->refcount); + + TRACE("iface %p increasing refcount to %u.\n", decoder, refcount); + + return refcount; +} + +static ULONG WINAPI aac_decoder_Release(IMFTransform *iface) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&decoder->refcount); + + TRACE("iface %p decreasing refcount to %u.\n", decoder, refcount); + + if (!refcount) + { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + if (decoder->input_type) + IMFMediaType_Release(decoder->input_type); + if (decoder->output_type) + IMFMediaType_Release(decoder->output_type); + free(decoder); + } + + return refcount; +} + +static HRESULT WINAPI aac_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + FIXME("iface %p, input_minimum %p, input_maximum %p, output_minimum %p, output_maximum %p stub!\n", + iface, input_minimum, input_maximum, output_minimum, output_maximum); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + FIXME("iface %p, inputs %p, outputs %p stub!\n", iface, inputs, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + FIXME("iface %p, input_size %u, inputs %p, output_size %u, outputs %p stub!\n", + iface, input_size, inputs, output_size, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + UINT32 block_alignment; + HRESULT hr; + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_alignment))) + return hr; + + info->hnsMaxLatency = 0; + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES|MFT_INPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER + |MFT_INPUT_STREAM_FIXED_SAMPLE_SIZE|MFT_INPUT_STREAM_HOLDS_BUFFERS; + info->cbSize = 0; + info->cbMaxLookahead = 0; + info->cbAlignment = 0; + + return S_OK; +} + +static HRESULT WINAPI aac_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + UINT32 channel_count, block_alignment; + HRESULT hr; + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->output_type, &MF_MT_AUDIO_NUM_CHANNELS, &channel_count))) + return hr; + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->output_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_alignment))) + return hr; + + info->dwFlags = 0; + info->cbSize = 0x1800 * block_alignment * channel_count; + info->cbAlignment = 0; + + return S_OK; +} + +static HRESULT WINAPI aac_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("iface %p, attributes %p stub!\n", iface, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + FIXME("iface %p, id %u stub!\n", iface, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + FIXME("iface %p, streams %u, ids %p stub!\n", iface, streams, ids); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + FIXME("iface %p, id %u, index %u, type %p stub!\n", iface, id, index, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + UINT32 channel_count, sample_size, sample_rate, block_alignment; + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaType *media_type; + const GUID *output_type; + HRESULT hr; + + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); + + if (!decoder->input_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *type = NULL; + + if (index >= ARRAY_SIZE(aac_decoder_output_types)) + return MF_E_NO_MORE_TYPES; + index = ARRAY_SIZE(aac_decoder_output_types) - index - 1; + output_type = aac_decoder_output_types[index]; + + if (FAILED(hr = MFCreateMediaType(&media_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio))) + goto done; + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, output_type))) + goto done; + + if (IsEqualGUID(output_type, &MFAudioFormat_Float)) + sample_size = 32; + else if (IsEqualGUID(output_type, &MFAudioFormat_PCM)) + sample_size = 16; + else + { + FIXME("Subtype %s not implemented!\n", debugstr_guid(output_type)); + hr = E_NOTIMPL; + goto done; + } + + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, sample_size))) + goto done; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_NUM_CHANNELS, &channel_count))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_NUM_CHANNELS, channel_count))) + goto done; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &sample_rate))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, sample_rate))) + goto done; + + block_alignment = sample_size * channel_count / 8; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, block_alignment))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, sample_rate * block_alignment))) + goto done; + + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, 1))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, 1))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_PREFER_WAVEFORMATEX, 1))) + goto done; + +done: + if (SUCCEEDED(hr)) + IMFMediaType_AddRef((*type = media_type)); + + IMFMediaType_Release(media_type); + return hr; +} + +static HRESULT WINAPI aac_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + MF_ATTRIBUTE_TYPE item_type; + GUID major, subtype; + HRESULT hr; + ULONG i; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (!IsEqualGUID(&major, &MFMediaType_Audio)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(aac_decoder_input_types); ++i) + if (IsEqualGUID(&subtype, aac_decoder_input_types[i])) + break; + if (i == ARRAY_SIZE(aac_decoder_input_types)) + return MF_E_INVALIDMEDIATYPE; + + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_USER_DATA, &item_type)) || + item_type != MF_ATTRIBUTE_BLOB) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_NUM_CHANNELS, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_PREFER_WAVEFORMATEX, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + + if (!decoder->input_type && FAILED(hr = MFCreateMediaType(&decoder->input_type))) + return hr; + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + return IMFMediaType_CopyAllItems(type, (IMFAttributes *)decoder->input_type); +} + +static HRESULT WINAPI aac_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + MF_ATTRIBUTE_TYPE item_type; + ULONG i, sample_size; + GUID major, subtype; + HRESULT hr; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (!IsEqualGUID(&major, &MFMediaType_Audio)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(aac_decoder_output_types); ++i) + if (IsEqualGUID(&subtype, aac_decoder_output_types[i])) + break; + if (i == ARRAY_SIZE(aac_decoder_output_types)) + return MF_E_INVALIDMEDIATYPE; + + if (IsEqualGUID(&subtype, &MFAudioFormat_Float)) + sample_size = 32; + else if (IsEqualGUID(&subtype, &MFAudioFormat_PCM)) + sample_size = 16; + else + { + FIXME("Subtype %s not implemented!\n", debugstr_guid(&subtype)); + hr = E_NOTIMPL; + return hr; + } + + if (FAILED(IMFMediaType_SetUINT32(decoder->input_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, sample_size))) + return MF_E_INVALIDMEDIATYPE; + + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_NUM_CHANNELS, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + + if (!decoder->output_type && FAILED(hr = MFCreateMediaType(&decoder->output_type))) + return hr; + + if (FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *)decoder->output_type))) + return hr; + + try_create_wg_transform(decoder); + return S_OK; +} + +static HRESULT WINAPI aac_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("iface %p, id %u, flags %p stub!\n", iface, id, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("iface %p, flags %p stub!\n", iface, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("iface %p, lower %s, upper %s stub!\n", iface, + wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + FIXME("iface %p, id %u, event %p stub!\n", iface, id, event); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + FIXME("iface %p, message %#x, param %p stub!\n", iface, message, (void *)param); + return S_OK; +} + +static HRESULT WINAPI aac_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaBuffer *media_buffer; + MFT_INPUT_STREAM_INFO info; + UINT32 buffer_size; + BYTE *buffer; + HRESULT hr; + + TRACE("iface %p, id %u, sample %p, flags %#x.\n", iface, id, sample, flags); + + if (FAILED(hr = IMFTransform_GetInputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (decoder->input_sample) + return MF_E_NOTACCEPTING; + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &buffer_size))) + goto done; + + if (SUCCEEDED(hr = wg_transform_push_data(decoder->wg_transform, buffer, buffer_size))) + IMFSample_AddRef((decoder->input_sample = sample)); + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static HRESULT WINAPI aac_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + struct wg_sample wg_sample = {0}; + IMFMediaBuffer *media_buffer; + MFT_OUTPUT_STREAM_INFO info; + HRESULT hr; + + TRACE("iface %p, flags %#x, count %u, samples %p, status %p.\n", iface, flags, count, samples, status); + + if (count > 1) + { + FIXME("Not implemented count %u\n", count); + return E_NOTIMPL; + } + + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *status = 0; + samples[0].dwStatus = 0; + if (!samples[0].pSample) + { + samples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &wg_sample.data, &wg_sample.size, NULL))) + goto done; + + if (wg_sample.size < info.cbSize) + hr = MF_E_BUFFERTOOSMALL; + else if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, &wg_sample))) + { + if (wg_sample.flags & WG_SAMPLE_FLAG_INCOMPLETE) + samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_INCOMPLETE; + } + else + { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); + decoder->input_sample = NULL; + } + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_SetCurrentLength(media_buffer, wg_sample.size); + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static const IMFTransformVtbl aac_decoder_vtbl = +{ + aac_decoder_QueryInterface, + aac_decoder_AddRef, + aac_decoder_Release, + aac_decoder_GetStreamLimits, + aac_decoder_GetStreamCount, + aac_decoder_GetStreamIDs, + aac_decoder_GetInputStreamInfo, + aac_decoder_GetOutputStreamInfo, + aac_decoder_GetAttributes, + aac_decoder_GetInputStreamAttributes, + aac_decoder_GetOutputStreamAttributes, + aac_decoder_DeleteInputStream, + aac_decoder_AddInputStreams, + aac_decoder_GetInputAvailableType, + aac_decoder_GetOutputAvailableType, + aac_decoder_SetInputType, + aac_decoder_SetOutputType, + aac_decoder_GetInputCurrentType, + aac_decoder_GetOutputCurrentType, + aac_decoder_GetInputStatus, + aac_decoder_GetOutputStatus, + aac_decoder_SetOutputBounds, + aac_decoder_ProcessEvent, + aac_decoder_ProcessMessage, + aac_decoder_ProcessInput, + aac_decoder_ProcessOutput, +}; + +HRESULT aac_decoder_create(REFIID riid, void **ret) +{ + struct aac_decoder *decoder; + + TRACE("riid %s, ret %p.\n", debugstr_guid(riid), ret); + + if (!(decoder = calloc(1, sizeof(*decoder)))) + return E_OUTOFMEMORY; + + decoder->IMFTransform_iface.lpVtbl = &aac_decoder_vtbl; + decoder->refcount = 1; + + *ret = &decoder->IMFTransform_iface; + TRACE("Created decoder %p\n", *ret); + return S_OK; +} diff --git a/dlls/mfplat/audioconvert.c b/dlls/mfplat/audioconvert.c new file mode 100644 index 00000000000..2e16c9c78f5 --- /dev/null +++ wine/dlls/mfplat/audioconvert.c @@ -0,0 +1,910 @@ +/* GStreamer Audio Converter + * + * Copyright 2020 Derek Lesho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" +#include "ks.h" +#include "ksmedia.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +struct audio_converter +{ + IMFTransform IMFTransform_iface; + LONG refcount; + IMFMediaType *input_type; + IMFMediaType *output_type; + CRITICAL_SECTION cs; + BOOL buffer_inflight; + LONGLONG buffer_pts, buffer_dur; + struct wg_parser *parser; + struct wg_parser_stream *stream; + IMFAttributes *attributes, *output_attributes; +}; + +static struct audio_converter *impl_audio_converter_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct audio_converter, IMFTransform_iface); +} + +static HRESULT WINAPI audio_converter_QueryInterface(IMFTransform *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IMFTransform) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFTransform_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI audio_converter_AddRef(IMFTransform *iface) +{ + struct audio_converter *transform = impl_audio_converter_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI audio_converter_Release(IMFTransform *iface) +{ + struct audio_converter *transform = impl_audio_converter_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + transform->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&transform->cs); + if (transform->attributes) + IMFAttributes_Release(transform->attributes); + if (transform->output_attributes) + IMFAttributes_Release(transform->output_attributes); + if (transform->stream) + wg_parser_disconnect(transform->parser); + if (transform->parser) + wg_parser_destroy(transform->parser); + free(transform); + } + + return refcount; +} + +static HRESULT WINAPI audio_converter_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + TRACE("%p, %p, %p, %p, %p.\n", iface, input_minimum, input_maximum, output_minimum, output_maximum); + + *input_minimum = *input_maximum = *output_minimum = *output_maximum = 1; + + return S_OK; +} + +static HRESULT WINAPI audio_converter_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + TRACE("%p, %p, %p.\n", iface, inputs, outputs); + + *inputs = *outputs = 1; + + return S_OK; +} + +static HRESULT WINAPI audio_converter_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + TRACE("%p %u %p %u %p.\n", iface, input_size, inputs, output_size, outputs); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_DOES_NOT_ADDREF; + info->cbMaxLookahead = 0; + info->cbAlignment = 0; + info->hnsMaxLatency = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + IMFMediaType_GetUINT32(converter->input_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &info->cbSize); + + LeaveCriticalSection(&converter->cs); + + return S_OK; +} + +static HRESULT WINAPI audio_converter_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES; + info->cbAlignment = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + IMFMediaType_GetUINT32(converter->output_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &info->cbSize); + + LeaveCriticalSection(&converter->cs); + + return S_OK; +} + +static HRESULT WINAPI audio_converter_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + + TRACE("%p, %p.\n", iface, attributes); + + *attributes = converter->attributes; + IMFAttributes_AddRef(*attributes); + + return S_OK; +} + +static HRESULT WINAPI audio_converter_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + + TRACE("%p, %u, %p.\n", iface, id, attributes); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + *attributes = converter->output_attributes; + IMFAttributes_AddRef(*attributes); + + return S_OK; +} + +static HRESULT WINAPI audio_converter_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + TRACE("%p, %u.\n", iface, id); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + TRACE("%p, %u, %p.\n", iface, streams, ids); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= 2) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio))) + { + IMFMediaType_Release(ret); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_SUBTYPE, index ? &MFAudioFormat_Float : &MFAudioFormat_PCM))) + { + IMFMediaType_Release(ret); + return hr; + } + + *type = ret; + + return S_OK; +} + +static HRESULT WINAPI audio_converter_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + IMFMediaType *output_type; + HRESULT hr; + + static const struct + { + const GUID *subtype; + DWORD depth; + } + formats[] = + { + {&MFAudioFormat_PCM, 16}, + {&MFAudioFormat_PCM, 24}, + {&MFAudioFormat_PCM, 32}, + {&MFAudioFormat_Float, 32}, + }; + + static const DWORD rates[] = {44100, 48000}; + static const DWORD channel_cnts[] = {1, 2, 6}; + const GUID *subtype; + DWORD rate, channels, bps; + + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= ARRAY_SIZE(formats) * 2/*rates*/ * 3/*layouts*/) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&output_type))) + return hr; + + subtype = formats[index / 6].subtype; + bps = formats[index / 6].depth; + rate = rates[index % 2]; + channels = channel_cnts[(index / 2) % 3]; + + if (FAILED(hr = IMFMediaType_SetGUID(output_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio))) + goto fail; + if (FAILED(hr = IMFMediaType_SetGUID(output_type, &MF_MT_SUBTYPE, subtype))) + goto fail; + if (FAILED(hr = IMFMediaType_SetUINT32(output_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, rate))) + goto fail; + if (FAILED(hr = IMFMediaType_SetUINT32(output_type, &MF_MT_AUDIO_NUM_CHANNELS, channels))) + goto fail; + if (FAILED(hr = IMFMediaType_SetUINT32(output_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, bps))) + goto fail; + + if (FAILED(hr = IMFMediaType_SetUINT32(output_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, channels * bps / 8))) + goto fail; + if (FAILED(hr = IMFMediaType_SetUINT32(output_type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, rate * channels * bps / 8))) + goto fail; + if (FAILED(hr = IMFMediaType_SetUINT32(output_type, &MF_MT_AUDIO_CHANNEL_MASK, + channels == 1 ? KSAUDIO_SPEAKER_MONO : + channels == 2 ? KSAUDIO_SPEAKER_STEREO : + /*channels == 6*/ KSAUDIO_SPEAKER_5POINT1))) + goto fail; + if (FAILED(hr = IMFMediaType_SetUINT32(output_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE))) + goto fail; + + *type = output_type; + + return S_OK; +fail: + IMFMediaType_Release(output_type); + return hr; +} + +static HRESULT WINAPI audio_converter_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + GUID major_type, subtype; + struct wg_format format; + DWORD unused; + HRESULT hr; + + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + IMFMediaType_Release(converter->input_type); + converter->input_type = NULL; + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &unused))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_NUM_CHANNELS, &unused))) + return MF_E_INVALIDTYPE; + if (IsEqualGUID(&subtype, &MFAudioFormat_PCM) && FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &unused))) + return MF_E_INVALIDTYPE; + + if (!(IsEqualGUID(&major_type, &MFMediaType_Audio))) + return MF_E_INVALIDTYPE; + + if (!IsEqualGUID(&subtype, &MFAudioFormat_PCM) && !IsEqualGUID(&subtype, &MFAudioFormat_Float)) + return MF_E_INVALIDTYPE; + + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + hr = S_OK; + + if (!converter->input_type) + hr = MFCreateMediaType(&converter->input_type); + + if (SUCCEEDED(hr)) + hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *) converter->input_type); + + if (FAILED(hr)) + { + IMFMediaType_Release(converter->input_type); + converter->input_type = NULL; + } + + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format output_format; + mf_media_type_to_wg_format(converter->output_type, &output_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &format, 1, &output_format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + + LeaveCriticalSection(&converter->cs); + + return hr; +} + +static HRESULT WINAPI audio_converter_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + GUID major_type, subtype; + struct wg_format format; + DWORD unused; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + IMFMediaType_Release(converter->output_type); + converter->output_type = NULL; + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_NUM_CHANNELS, &unused))) + return MF_E_INVALIDTYPE; + if (IsEqualGUID(&subtype, &MFAudioFormat_PCM) && FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &unused))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &unused))) + return MF_E_INVALIDTYPE; + + if (!(IsEqualGUID(&major_type, &MFMediaType_Audio))) + return MF_E_INVALIDTYPE; + + if (!IsEqualGUID(&subtype, &MFAudioFormat_PCM) && !IsEqualGUID(&subtype, &MFAudioFormat_Float)) + return MF_E_INVALIDTYPE; + + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + hr = S_OK; + + if (!converter->output_type) + hr = MFCreateMediaType(&converter->output_type); + + if (SUCCEEDED(hr)) + hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *) converter->output_type); + + if (FAILED(hr)) + { + IMFMediaType_Release(converter->output_type); + converter->output_type = NULL; + } + + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format input_format; + mf_media_type_to_wg_format(converter->input_type, &input_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &input_format, 1, &format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + + LeaveCriticalSection(&converter->cs); + + return hr; +} + +static HRESULT WINAPI audio_converter_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %p.\n", converter, id, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + hr = IMFMediaType_CopyAllItems(converter->input_type, (IMFAttributes *)ret); + else + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + + LeaveCriticalSection(&converter->cs); + + if (SUCCEEDED(hr)) + *type = ret; + else + IMFMediaType_Release(ret); + + return hr; +} + +static HRESULT WINAPI audio_converter_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %p.\n", converter, id, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + hr = IMFMediaType_CopyAllItems(converter->output_type, (IMFAttributes *)ret); + else + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + + LeaveCriticalSection(&converter->cs); + + if (SUCCEEDED(hr)) + *type = ret; + else + IMFMediaType_Release(ret); + + return hr; +} + +static HRESULT WINAPI audio_converter_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("%p, %u, %p.\n", iface, id, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("%p, %p.\n", iface, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("%p, %s, %s.\n", iface, wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + TRACE("%p, %u, %p.\n", iface, id, event); + + return E_NOTIMPL; +} + +static HRESULT WINAPI audio_converter_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + struct wg_parser_buffer wg_buffer; + + TRACE("%p, %u %lu.\n", iface, message, param); + + switch(message) + { + case MFT_MESSAGE_COMMAND_FLUSH: + { + EnterCriticalSection(&converter->cs); + if (!converter->buffer_inflight) + { + LeaveCriticalSection(&converter->cs); + return S_OK; + } + + wg_parser_stream_get_buffer(converter->stream, &wg_buffer); + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + LeaveCriticalSection(&converter->cs); + return S_OK; + } + case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: + return S_OK; + default: + FIXME("Unhandled message type %x.\n", message); + return E_NOTIMPL; + } +} + +static HRESULT WINAPI audio_converter_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_size; + uint64_t offset; + uint32_t size; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, sample, flags); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (converter->buffer_inflight) + { + hr = MF_E_NOTACCEPTING; + goto done; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer))) + goto done; + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, &buffer_size))) + goto done; + + if (!wg_parser_get_next_read_offset(converter->parser, &offset, &size)) + { + hr = MF_E_UNEXPECTED; + IMFMediaBuffer_Unlock(buffer); + goto done; + } + + wg_parser_push_data(converter->parser, WG_READ_SUCCESS, buffer_data, buffer_size); + + IMFMediaBuffer_Unlock(buffer); + converter->buffer_inflight = TRUE; + if (FAILED(IMFSample_GetSampleTime(sample, &converter->buffer_pts))) + converter->buffer_pts = -1; + if (FAILED(IMFSample_GetSampleDuration(sample, &converter->buffer_dur))) + converter->buffer_dur = -1; + +done: + if (buffer) + IMFMediaBuffer_Release(buffer); + LeaveCriticalSection(&converter->cs); + return hr; +} + +static HRESULT WINAPI audio_converter_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + IMFSample *allocated_sample = NULL; + struct wg_parser_buffer wg_buffer; + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_len; + HRESULT hr = S_OK; + + TRACE("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (!count) + return S_OK; + + if (count != 1) + return MF_E_INVALIDSTREAMNUMBER; + + if (samples[0].dwStreamID != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (!converter->buffer_inflight) + { + hr = MF_E_TRANSFORM_NEED_MORE_INPUT; + goto done; + } + + if (!wg_parser_stream_get_buffer(converter->stream, &wg_buffer)) + assert(0); + + if (!samples[0].pSample) + { + if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer.size, &buffer))) + { + ERR("Failed to create buffer, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = MFCreateSample(&allocated_sample))) + { + ERR("Failed to create sample, hr %#x.\n", hr); + goto done; + } + + samples[0].pSample = allocated_sample; + + if (FAILED(hr = IMFSample_AddBuffer(samples[0].pSample, buffer))) + { + ERR("Failed to add buffer, hr %#x.\n", hr); + goto done; + } + + IMFMediaBuffer_Release(buffer); + buffer = NULL; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &buffer))) + { + ERR("Failed to get buffer from sample, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_GetMaxLength(buffer, &buffer_len))) + { + ERR("Failed to get buffer size, hr %#x.\n", hr); + goto done; + } + + if (buffer_len < wg_buffer.size) + { + WARN("Client's buffer is smaller (%u bytes) than the output sample (%u bytes)\n", + buffer_len, wg_buffer.size); + + hr = MF_E_BUFFERTOOSMALL; + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer.size))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, NULL))) + { + ERR("Failed to lock buffer hr %#x.\n", hr); + goto done; + } + + if (!wg_parser_stream_copy_buffer(converter->stream, buffer_data, 0, wg_buffer.size)) + { + ERR("Failed to copy buffer.\n"); + IMFMediaBuffer_Unlock(buffer); + hr = E_FAIL; + goto done; + } + + IMFMediaBuffer_Unlock(buffer); + + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + if (converter->buffer_pts != -1) + IMFSample_SetSampleTime(samples[0].pSample, converter->buffer_pts); + if (converter->buffer_dur != -1) + IMFSample_SetSampleDuration(samples[0].pSample, converter->buffer_dur); + + samples[0].dwStatus = 0; + samples[0].pEvents = NULL; + + done: + if (buffer) + IMFMediaBuffer_Release(buffer); + if (allocated_sample && FAILED(hr)) + { + IMFSample_Release(allocated_sample); + samples[0].pSample = NULL; + } + LeaveCriticalSection(&converter->cs); + return hr; +} + +static const IMFTransformVtbl audio_converter_vtbl = +{ + audio_converter_QueryInterface, + audio_converter_AddRef, + audio_converter_Release, + audio_converter_GetStreamLimits, + audio_converter_GetStreamCount, + audio_converter_GetStreamIDs, + audio_converter_GetInputStreamInfo, + audio_converter_GetOutputStreamInfo, + audio_converter_GetAttributes, + audio_converter_GetInputStreamAttributes, + audio_converter_GetOutputStreamAttributes, + audio_converter_DeleteInputStream, + audio_converter_AddInputStreams, + audio_converter_GetInputAvailableType, + audio_converter_GetOutputAvailableType, + audio_converter_SetInputType, + audio_converter_SetOutputType, + audio_converter_GetInputCurrentType, + audio_converter_GetOutputCurrentType, + audio_converter_GetInputStatus, + audio_converter_GetOutputStatus, + audio_converter_SetOutputBounds, + audio_converter_ProcessEvent, + audio_converter_ProcessMessage, + audio_converter_ProcessInput, + audio_converter_ProcessOutput, +}; + +HRESULT audio_converter_create(REFIID riid, void **ret) +{ + struct audio_converter *object; + HRESULT hr; + + TRACE("%s %p\n", debugstr_guid(riid), ret); + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IMFTransform_iface.lpVtbl = &audio_converter_vtbl; + object->refcount = 1; + + InitializeCriticalSection(&object->cs); + object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": audio_converter_lock"); + + if (FAILED(hr = MFCreateAttributes(&object->attributes, 0))) + { + IMFTransform_Release(&object->IMFTransform_iface); + return hr; + } + + if (FAILED(hr = MFCreateAttributes(&object->output_attributes, 0))) + { + IMFTransform_Release(&object->IMFTransform_iface); + return hr; + } + + if (!(object->parser = wg_parser_create(WG_PARSER_AUDIOCONV, true))) + { + ERR("Failed to create audio converter due to GStreamer error.\n"); + IMFTransform_Release(&object->IMFTransform_iface); + return E_OUTOFMEMORY; + } + + *ret = &object->IMFTransform_iface; + return S_OK; +} diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c index eada3df18ad..9081dc39eab 100644 --- wine/dlls/mfplat/buffer.c +++ wine/dlls/mfplat/buffer.c @@ -18,8 +18,6 @@ #define COBJMACROS -#include - #include "mfplat_private.h" #include "rtworkq.h" @@ -28,6 +26,8 @@ #include "d3d9.h" #include "evr.h" +#include "wine/debug.h" + WINE_DEFAULT_DEBUG_CHANNEL(mfplat); #define ALIGN_SIZE(size, alignment) (((size) + (alignment)) & ~((alignment))) @@ -49,7 +49,7 @@ struct buffer struct { BYTE *linear_buffer; - DWORD plane_size; + unsigned int plane_size; BYTE *scanline0; unsigned int width; @@ -148,7 +148,7 @@ static ULONG WINAPI memory_buffer_AddRef(IMFMediaBuffer *iface) struct buffer *buffer = impl_from_IMFMediaBuffer(iface); ULONG refcount = InterlockedIncrement(&buffer->refcount); - TRACE("%p, refcount %lu.\n", buffer, refcount); + TRACE("%p, refcount %u.\n", buffer, refcount); return refcount; } @@ -158,7 +158,7 @@ static ULONG WINAPI memory_buffer_Release(IMFMediaBuffer *iface) struct buffer *buffer = impl_from_IMFMediaBuffer(iface); ULONG refcount = InterlockedDecrement(&buffer->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -173,7 +173,7 @@ static ULONG WINAPI memory_buffer_Release(IMFMediaBuffer *iface) } DeleteCriticalSection(&buffer->cs); free(buffer->_2d.linear_buffer); - _aligned_free(buffer->data); + free(buffer->data); free(buffer); } @@ -223,7 +223,7 @@ static HRESULT WINAPI memory_buffer_SetCurrentLength(IMFMediaBuffer *iface, DWOR { struct buffer *buffer = impl_from_IMFMediaBuffer(iface); - TRACE("%p, %lu.\n", iface, current_length); + TRACE("%p, %u.\n", iface, current_length); if (current_length > buffer->max_length) return E_INVALIDARG; @@ -309,12 +309,8 @@ static HRESULT WINAPI memory_1d_2d_buffer_Lock(IMFMediaBuffer *iface, BYTE **dat hr = MF_E_INVALIDREQUEST; else if (!buffer->_2d.linear_buffer) { - if (!(buffer->_2d.linear_buffer = malloc(buffer->_2d.plane_size))) + if (!(buffer->_2d.linear_buffer = malloc(ALIGN_SIZE(buffer->_2d.plane_size, MF_64_BYTE_ALIGNMENT)))) hr = E_OUTOFMEMORY; - - if (SUCCEEDED(hr)) - copy_image(buffer, buffer->_2d.linear_buffer, buffer->_2d.width, buffer->data, buffer->_2d.pitch, - buffer->_2d.width, buffer->_2d.height); } if (SUCCEEDED(hr)) @@ -384,7 +380,7 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock(IMFMediaBuffer *iface, BYTE **dat { D3DLOCKED_RECT rect; - if (!(buffer->_2d.linear_buffer = malloc(buffer->_2d.plane_size))) + if (!(buffer->_2d.linear_buffer = malloc(ALIGN_SIZE(buffer->_2d.plane_size, MF_64_BYTE_ALIGNMENT)))) hr = E_OUTOFMEMORY; if (SUCCEEDED(hr)) @@ -449,7 +445,7 @@ static HRESULT WINAPI d3d9_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface { struct buffer *buffer = impl_from_IMFMediaBuffer(iface); - TRACE("%p, %lu.\n", iface, current_length); + TRACE("%p, %u.\n", iface, current_length); buffer->current_length = current_length; @@ -601,14 +597,14 @@ static HRESULT WINAPI memory_2d_buffer_GetContiguousLength(IMF2DBuffer2 *iface, static HRESULT WINAPI memory_2d_buffer_ContiguousCopyTo(IMF2DBuffer2 *iface, BYTE *dest_buffer, DWORD dest_length) { - FIXME("%p, %p, %lu.\n", iface, dest_buffer, dest_length); + FIXME("%p, %p, %u.\n", iface, dest_buffer, dest_length); return E_NOTIMPL; } static HRESULT WINAPI memory_2d_buffer_ContiguousCopyFrom(IMF2DBuffer2 *iface, const BYTE *src_buffer, DWORD src_length) { - FIXME("%p, %p, %lu.\n", iface, src_buffer, src_length); + FIXME("%p, %p, %u.\n", iface, src_buffer, src_length); return E_NOTIMPL; } @@ -670,14 +666,13 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2D(IMF2DBuffer2 *iface, BYTE **sca if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; - else if (!buffer->_2d.locks) + else if (!buffer->_2d.locks++) { hr = IDirect3DSurface9_LockRect(buffer->d3d9_surface.surface, &buffer->d3d9_surface.rect, NULL, 0); } if (SUCCEEDED(hr)) { - buffer->_2d.locks++; *scanline0 = buffer->d3d9_surface.rect.pBits; *pitch = buffer->d3d9_surface.rect.Pitch; } @@ -756,14 +751,13 @@ static HRESULT WINAPI d3d9_surface_buffer_Lock2DSize(IMF2DBuffer2 *iface, MF2DBu if (buffer->_2d.linear_buffer) hr = MF_E_UNEXPECTED; - else if (!buffer->_2d.locks) + else if (!buffer->_2d.locks++) { hr = IDirect3DSurface9_LockRect(buffer->d3d9_surface.surface, &buffer->d3d9_surface.rect, NULL, 0); } if (SUCCEEDED(hr)) { - buffer->_2d.locks++; *scanline0 = buffer->d3d9_surface.rect.pBits; *pitch = buffer->d3d9_surface.rect.Pitch; if (buffer_start) @@ -897,7 +891,7 @@ static HRESULT dxgi_surface_buffer_create_readback_texture(struct buffer *buffer texture_desc.MiscFlags = 0; texture_desc.MipLevels = 1; if (FAILED(hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &buffer->dxgi_surface.rb_texture))) - WARN("Failed to create readback texture, hr %#lx.\n", hr); + WARN("Failed to create readback texture, hr %#x.\n", hr); ID3D11Device_Release(device); @@ -922,7 +916,7 @@ static HRESULT dxgi_surface_buffer_map(struct buffer *buffer) if (FAILED(hr = ID3D11DeviceContext_Map(immediate_context, (ID3D11Resource *)buffer->dxgi_surface.rb_texture, 0, D3D11_MAP_READ_WRITE, 0, &buffer->dxgi_surface.map_desc))) { - WARN("Failed to map readback texture, hr %#lx.\n", hr); + WARN("Failed to map readback texture, hr %#x.\n", hr); } ID3D11DeviceContext_Release(immediate_context); @@ -965,7 +959,7 @@ static HRESULT WINAPI dxgi_surface_buffer_Lock(IMFMediaBuffer *iface, BYTE **dat hr = MF_E_INVALIDREQUEST; else if (!buffer->_2d.linear_buffer) { - if (!(buffer->_2d.linear_buffer = malloc(buffer->_2d.plane_size))) + if (!(buffer->_2d.linear_buffer = malloc(ALIGN_SIZE(buffer->_2d.plane_size, MF_64_BYTE_ALIGNMENT)))) hr = E_OUTOFMEMORY; if (SUCCEEDED(hr)) @@ -1024,7 +1018,7 @@ static HRESULT WINAPI dxgi_surface_buffer_SetCurrentLength(IMFMediaBuffer *iface { struct buffer *buffer = impl_from_IMFMediaBuffer(iface); - TRACE("%p, %lu.\n", iface, current_length); + TRACE("%p, %u.\n", iface, current_length); buffer->current_length = current_length; @@ -1262,24 +1256,8 @@ static const IMFDXGIBufferVtbl dxgi_buffer_vtbl = static HRESULT memory_buffer_init(struct buffer *buffer, DWORD max_length, DWORD alignment, const IMFMediaBufferVtbl *vtbl) { - if (alignment < MF_16_BYTE_ALIGNMENT) - alignment = MF_16_BYTE_ALIGNMENT; - alignment++; - - if (alignment & (alignment - 1)) - { - alignment--; - alignment |= alignment >> 1; - alignment |= alignment >> 2; - alignment |= alignment >> 4; - alignment |= alignment >> 8; - alignment |= alignment >> 16; - alignment++; - } - - if (!(buffer->data = _aligned_malloc(max_length, alignment))) + if (!(buffer->data = calloc(1, ALIGN_SIZE(max_length, alignment)))) return E_OUTOFMEMORY; - memset(buffer->data, 0, max_length); buffer->IMFMediaBuffer_iface.lpVtbl = vtbl; buffer->refcount = 1; @@ -1328,10 +1306,9 @@ static p_copy_image_func get_2d_buffer_copy_func(DWORD fourcc) static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bottom_up, IMFMediaBuffer **buffer) { - unsigned int stride, max_length; - unsigned int row_alignment; + unsigned int stride, max_length, plane_size; struct buffer *object; - DWORD plane_size; + unsigned int row_alignment; GUID subtype; BOOL is_yuv; HRESULT hr; @@ -1389,7 +1366,7 @@ static HRESULT create_2d_buffer(DWORD width, DWORD height, DWORD fourcc, BOOL bo max_length = pitch * height; } - if (FAILED(hr = memory_buffer_init(object, max_length, row_alignment, &memory_1d_2d_buffer_vtbl))) + if (FAILED(hr = memory_buffer_init(object, max_length, MF_1_BYTE_ALIGNMENT, &memory_1d_2d_buffer_vtbl))) { free(object); return hr; @@ -1462,7 +1439,7 @@ static HRESULT create_dxgi_surface_buffer(IUnknown *surface, unsigned int sub_re if (FAILED(hr = IUnknown_QueryInterface(surface, &IID_ID3D11Texture2D, (void **)&texture))) { - WARN("Failed to get texture interface, hr %#lx.\n", hr); + WARN("Failed to get texture interface, hr %#x.\n", hr); return hr; } @@ -1514,7 +1491,7 @@ static HRESULT create_dxgi_surface_buffer(IUnknown *surface, unsigned int sub_re */ HRESULT WINAPI MFCreateMemoryBuffer(DWORD max_length, IMFMediaBuffer **buffer) { - TRACE("%lu, %p.\n", max_length, buffer); + TRACE("%u, %p.\n", max_length, buffer); return create_1d_buffer(max_length, MF_1_BYTE_ALIGNMENT, buffer); } @@ -1524,7 +1501,7 @@ HRESULT WINAPI MFCreateMemoryBuffer(DWORD max_length, IMFMediaBuffer **buffer) */ HRESULT WINAPI MFCreateAlignedMemoryBuffer(DWORD max_length, DWORD alignment, IMFMediaBuffer **buffer) { - TRACE("%lu, %lu, %p.\n", max_length, alignment, buffer); + TRACE("%u, %u, %p.\n", max_length, alignment, buffer); return create_1d_buffer(max_length, alignment, buffer); } @@ -1534,7 +1511,7 @@ HRESULT WINAPI MFCreateAlignedMemoryBuffer(DWORD max_length, DWORD alignment, IM */ HRESULT WINAPI MFCreate2DMediaBuffer(DWORD width, DWORD height, DWORD fourcc, BOOL bottom_up, IMFMediaBuffer **buffer) { - TRACE("%lu, %lu, %s, %d, %p.\n", width, height, debugstr_fourcc(fourcc), bottom_up, buffer); + TRACE("%u, %u, %s, %d, %p.\n", width, height, debugstr_fourcc(fourcc), bottom_up, buffer); return create_2d_buffer(width, height, fourcc, bottom_up, buffer); } @@ -1582,7 +1559,7 @@ HRESULT WINAPI MFCreateMediaBufferFromMediaType(IMFMediaType *media_type, LONGLO HRESULT hr; GUID major; - TRACE("%p, %s, %lu, %lu, %p.\n", media_type, debugstr_time(duration), min_length, alignment, buffer); + TRACE("%p, %s, %u, %u, %p.\n", media_type, debugstr_time(duration), min_length, alignment, buffer); if (!media_type) return E_INVALIDARG; @@ -1596,8 +1573,6 @@ HRESULT WINAPI MFCreateMediaBufferFromMediaType(IMFMediaType *media_type, LONGLO if (FAILED(IMFMediaType_GetUINT32(media_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_alignment))) WARN("Block alignment was not specified.\n"); - alignment = max(16, alignment); - if (block_alignment) { avg_length = 0; @@ -1612,6 +1587,8 @@ HRESULT WINAPI MFCreateMediaBufferFromMediaType(IMFMediaType *media_type, LONGLO } } + alignment = max(16, alignment); + length = buffer_get_aligned_length(avg_length + 1, alignment); length = buffer_get_aligned_length(length, block_alignment); } @@ -1620,7 +1597,7 @@ HRESULT WINAPI MFCreateMediaBufferFromMediaType(IMFMediaType *media_type, LONGLO length = max(length, min_length); - return create_1d_buffer(length, alignment - 1, buffer); + return create_1d_buffer(length, MF_1_BYTE_ALIGNMENT, buffer); } else FIXME("Major type %s is not supported.\n", debugstr_guid(&major)); diff --git a/dlls/mfplat/colorconvert.c b/dlls/mfplat/colorconvert.c new file mode 100644 index 00000000000..92322e877ec --- /dev/null +++ wine/dlls/mfplat/colorconvert.c @@ -0,0 +1,901 @@ +/* GStreamer Color Converter + * + * Copyright 2020 Derek Lesho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +static const GUID *raw_types[] = { + &MFVideoFormat_RGB24, + &MFVideoFormat_RGB32, + &MFVideoFormat_RGB555, + &MFVideoFormat_RGB8, + &MFVideoFormat_AYUV, + &MFVideoFormat_I420, + &MFVideoFormat_IYUV, + &MFVideoFormat_NV11, + &MFVideoFormat_NV12, + &MFVideoFormat_UYVY, + &MFVideoFormat_v216, + &MFVideoFormat_v410, + &MFVideoFormat_YUY2, + &MFVideoFormat_YVYU, + &MFVideoFormat_YVYU, +}; + +struct color_converter +{ + IMFTransform IMFTransform_iface; + LONG refcount; + IMFMediaType *input_type; + IMFMediaType *output_type; + CRITICAL_SECTION cs; + BOOL buffer_inflight; + LONGLONG buffer_pts, buffer_dur; + struct wg_parser *parser; + struct wg_parser_stream *stream; +}; + +static struct color_converter *impl_color_converter_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct color_converter, IMFTransform_iface); +} + +static HRESULT WINAPI color_converter_QueryInterface(IMFTransform *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualGUID(riid, &IID_IMFTransform) || + IsEqualGUID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFTransform_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI color_converter_AddRef(IMFTransform *iface) +{ + struct color_converter *transform = impl_color_converter_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI color_converter_Release(IMFTransform *iface) +{ + struct color_converter *transform = impl_color_converter_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + transform->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&transform->cs); + if (transform->output_type) + IMFMediaType_Release(transform->output_type); + if (transform->stream) + wg_parser_disconnect(transform->parser); + if (transform->parser) + wg_parser_destroy(transform->parser); + free(transform); + } + + return refcount; +} + +static HRESULT WINAPI color_converter_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + TRACE("%p, %p, %p, %p, %p.\n", iface, input_minimum, input_maximum, output_minimum, output_maximum); + + *input_minimum = *input_maximum = *output_minimum = *output_maximum = 1; + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + TRACE("%p, %p, %p.\n", iface, inputs, outputs); + + *inputs = *outputs = 1; + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + TRACE("%p %u %p %u %p.\n", iface, input_size, inputs, output_size, outputs); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 framesize; + GUID subtype; + + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_DOES_NOT_ADDREF | MFT_INPUT_STREAM_FIXED_SAMPLE_SIZE; + info->cbMaxLookahead = 0; + info->cbAlignment = 0; + info->hnsMaxLatency = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + { + if (SUCCEEDED(IMFMediaType_GetGUID(converter->input_type, &MF_MT_SUBTYPE, &subtype)) && + SUCCEEDED(IMFMediaType_GetUINT64(converter->input_type, &MF_MT_FRAME_SIZE, &framesize))) + { + MFCalculateImageSize(&subtype, framesize >> 32, (UINT32) framesize, &info->cbSize); + } + + if (!info->cbSize) + WARN("Failed to get desired input buffer size, the non-provided sample path will likely break\n"); + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 framesize; + GUID subtype; + + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER; + info->cbAlignment = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + { + if (SUCCEEDED(IMFMediaType_GetGUID(converter->output_type, &MF_MT_SUBTYPE, &subtype)) && + SUCCEEDED(IMFMediaType_GetUINT64(converter->output_type, &MF_MT_FRAME_SIZE, &framesize))) + { + MFCalculateImageSize(&subtype, framesize >> 32, (UINT32) framesize, &info->cbSize); + } + + if (!info->cbSize) + WARN("Failed to get desired output buffer size, the non-provided sample path will likely break\n"); + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("%p, %p.\n", iface, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + TRACE("%p, %u.\n", iface, id); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + TRACE("%p, %u, %p.\n", iface, streams, ids); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= ARRAY_SIZE(raw_types)) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_MAJOR_TYPE, &MFMediaType_Video))) + { + IMFMediaType_Release(ret); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_SUBTYPE, raw_types[index]))) + { + IMFMediaType_Release(ret); + return hr; + } + + *type = ret; + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= ARRAY_SIZE(raw_types)) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + IMFMediaType_CopyAllItems(converter->input_type, (IMFAttributes *) ret); + + LeaveCriticalSection(&converter->cs); + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_MAJOR_TYPE, &MFMediaType_Video))) + { + IMFMediaType_Release(ret); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_SUBTYPE, raw_types[index]))) + { + IMFMediaType_Release(ret); + return hr; + } + + *type = ret; + + return S_OK; +} + +static HRESULT WINAPI color_converter_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 input_framesize, output_framesize; + GUID major_type, subtype; + struct wg_format format; + unsigned int i; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + IMFMediaType_Release(converter->input_type); + converter->input_type = NULL; + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!IsEqualGUID(&major_type, &MFMediaType_Video)) + return MF_E_INVALIDTYPE; + + for (i = 0; i < ARRAY_SIZE(raw_types); i++) + { + if (IsEqualGUID(&subtype, raw_types[i])) + break; + } + + if (i == ARRAY_SIZE(raw_types)) + return MF_E_INVALIDTYPE; + + EnterCriticalSection(&converter->cs); + + if(converter->output_type + && SUCCEEDED(IMFMediaType_GetUINT64(converter->output_type, &MF_MT_FRAME_SIZE, &output_framesize)) + && SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &input_framesize)) + && input_framesize != output_framesize) + { + LeaveCriticalSection(&converter->cs); + return MF_E_INVALIDTYPE; + } + + LeaveCriticalSection(&converter->cs); + + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + hr = S_OK; + + if (!converter->input_type) + hr = MFCreateMediaType(&converter->input_type); + + if (SUCCEEDED(hr)) + hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *) converter->input_type); + + if (FAILED(hr)) + { + IMFMediaType_Release(converter->input_type); + converter->input_type = NULL; + } + + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format output_format; + mf_media_type_to_wg_format(converter->output_type, &output_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &format, 1, &output_format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + + LeaveCriticalSection(&converter->cs); + + return hr; +} + +static HRESULT WINAPI color_converter_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 input_framesize, output_framesize; + GUID major_type, subtype; + struct wg_format format; + unsigned int i; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + IMFMediaType_Release(converter->output_type); + converter->output_type = NULL; + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!IsEqualGUID(&major_type, &MFMediaType_Video)) + return MF_E_INVALIDTYPE; + + for (i = 0; i < ARRAY_SIZE(raw_types); i++) + { + if (IsEqualGUID(&subtype, raw_types[i])) + break; + } + + if (i == ARRAY_SIZE(raw_types)) + return MF_E_INVALIDTYPE; + + EnterCriticalSection(&converter->cs); + + if(converter->input_type + && SUCCEEDED(IMFMediaType_GetUINT64(converter->input_type, &MF_MT_FRAME_SIZE, &input_framesize)) + && SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &output_framesize)) + && input_framesize != output_framesize) + { + LeaveCriticalSection(&converter->cs); + return MF_E_INVALIDTYPE; + } + + LeaveCriticalSection(&converter->cs); + + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + hr = S_OK; + + if (!converter->output_type) + hr = MFCreateMediaType(&converter->output_type); + + if (SUCCEEDED(hr)) + hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *) converter->output_type); + + if (FAILED(hr)) + { + IMFMediaType_Release(converter->output_type); + converter->output_type = NULL; + } + + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format input_format; + mf_media_type_to_wg_format(converter->input_type, &input_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &input_format, 1, &format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + + LeaveCriticalSection(&converter->cs); + + return hr; +} + +static HRESULT WINAPI color_converter_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %p.\n", converter, id, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + hr = IMFMediaType_CopyAllItems(converter->output_type, (IMFAttributes *)ret); + else + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + + LeaveCriticalSection(&converter->cs); + + if (SUCCEEDED(hr)) + *type = ret; + else + IMFMediaType_Release(ret); + + return hr; +} + +static HRESULT WINAPI color_converter_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("%p, %u, %p.\n", iface, id, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("%p, %p.\n", iface, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("%p, %s, %s.\n", iface, wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + TRACE("%p, %u, %p.\n", iface, id, event); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + struct wg_parser_buffer wg_buffer; + + TRACE("%p, %u %lu.\n", iface, message, param); + + switch(message) + { + case MFT_MESSAGE_COMMAND_FLUSH: + { + EnterCriticalSection(&converter->cs); + if (!converter->buffer_inflight) + { + LeaveCriticalSection(&converter->cs); + return S_OK; + } + + wg_parser_stream_get_buffer(converter->stream, &wg_buffer); + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + LeaveCriticalSection(&converter->cs); + return S_OK; + } + case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: + return S_OK; + default: + FIXME("Unhandled message type %x.\n", message); + return E_NOTIMPL; + } +} + +static HRESULT WINAPI color_converter_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_size; + uint64_t offset; + uint32_t size; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, sample, flags); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (converter->buffer_inflight) + { + hr = MF_E_NOTACCEPTING; + goto done; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer))) + goto done; + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, &buffer_size))) + goto done; + + for (;;) + { + if (!wg_parser_get_next_read_offset(converter->parser, &offset, &size)) + { + TRACE("sink unconnected\n"); + continue; + } + + wg_parser_push_data(converter->parser, WG_READ_SUCCESS, buffer_data, min(buffer_size, size)); + + if (buffer_size <= size) + break; + + buffer_data += size; + buffer_size -= size; + } + + IMFMediaBuffer_Unlock(buffer); + converter->buffer_inflight = TRUE; + if (FAILED(IMFSample_GetSampleTime(sample, &converter->buffer_pts))) + converter->buffer_pts = -1; + if (FAILED(IMFSample_GetSampleDuration(sample, &converter->buffer_dur))) + converter->buffer_dur = -1; + +done: + if (buffer) + IMFMediaBuffer_Release(buffer); + LeaveCriticalSection(&converter->cs); + return hr; +} + +static HRESULT WINAPI color_converter_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFSample *allocated_sample = NULL; + struct wg_parser_buffer wg_buffer; + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_len; + HRESULT hr = S_OK; + + TRACE("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (!count) + return S_OK; + + if (count != 1) + return MF_E_INVALIDSTREAMNUMBER; + + if (samples[0].dwStreamID != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (!converter->buffer_inflight) + { + hr = MF_E_TRANSFORM_NEED_MORE_INPUT; + goto done; + } + + if (!wg_parser_stream_get_buffer(converter->stream, &wg_buffer)) + assert(0); + + if (!samples[0].pSample) + { + if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer.size, &buffer))) + { + ERR("Failed to create buffer, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = MFCreateSample(&allocated_sample))) + { + ERR("Failed to create sample, hr %#x.\n", hr); + goto done; + } + + samples[0].pSample = allocated_sample; + + if (FAILED(hr = IMFSample_AddBuffer(samples[0].pSample, buffer))) + { + ERR("Failed to add buffer, hr %#x.\n", hr); + goto done; + } + + IMFMediaBuffer_Release(buffer); + buffer = NULL; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &buffer))) + { + ERR("Failed to get buffer from sample, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_GetMaxLength(buffer, &buffer_len))) + { + ERR("Failed to get buffer size, hr %#x.\n", hr); + goto done; + } + + if (buffer_len < wg_buffer.size) + { + WARN("Client's buffer is smaller (%u bytes) than the output sample (%u bytes)\n", + buffer_len, wg_buffer.size); + + hr = MF_E_BUFFERTOOSMALL; + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer.size))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, NULL))) + { + ERR("Failed to lock buffer hr %#x.\n", hr); + goto done; + } + + if (!wg_parser_stream_copy_buffer(converter->stream, buffer_data, 0, wg_buffer.size)) + { + ERR("Failed to copy buffer.\n"); + IMFMediaBuffer_Unlock(buffer); + hr = E_FAIL; + goto done; + } + + IMFMediaBuffer_Unlock(buffer); + + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + if (converter->buffer_pts != -1) + IMFSample_SetSampleTime(samples[0].pSample, converter->buffer_pts); + if (converter->buffer_dur != -1) + IMFSample_SetSampleDuration(samples[0].pSample, converter->buffer_dur); + + samples[0].dwStatus = 0; + samples[0].pEvents = NULL; + + done: + if (buffer) + IMFMediaBuffer_Release(buffer); + if (FAILED(hr) && allocated_sample) + { + IMFSample_Release(allocated_sample); + samples[0].pSample = NULL; + } + LeaveCriticalSection(&converter->cs); + return hr; +} + +static const IMFTransformVtbl color_converter_vtbl = +{ + color_converter_QueryInterface, + color_converter_AddRef, + color_converter_Release, + color_converter_GetStreamLimits, + color_converter_GetStreamCount, + color_converter_GetStreamIDs, + color_converter_GetInputStreamInfo, + color_converter_GetOutputStreamInfo, + color_converter_GetAttributes, + color_converter_GetInputStreamAttributes, + color_converter_GetOutputStreamAttributes, + color_converter_DeleteInputStream, + color_converter_AddInputStreams, + color_converter_GetInputAvailableType, + color_converter_GetOutputAvailableType, + color_converter_SetInputType, + color_converter_SetOutputType, + color_converter_GetInputCurrentType, + color_converter_GetOutputCurrentType, + color_converter_GetInputStatus, + color_converter_GetOutputStatus, + color_converter_SetOutputBounds, + color_converter_ProcessEvent, + color_converter_ProcessMessage, + color_converter_ProcessInput, + color_converter_ProcessOutput, +}; + +HRESULT color_converter_create(REFIID riid, void **ret) +{ + struct color_converter *object; + + TRACE("%s %p\n", debugstr_guid(riid), ret); + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IMFTransform_iface.lpVtbl = &color_converter_vtbl; + object->refcount = 1; + + InitializeCriticalSection(&object->cs); + object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": color_converter_lock"); + + if (!(object->parser = wg_parser_create(WG_PARSER_VIDEOCONV, true))) + { + ERR("Failed to create video converter due to GStreamer error.\n"); + IMFTransform_Release(&object->IMFTransform_iface); + return E_OUTOFMEMORY; + } + + *ret = &object->IMFTransform_iface; + return S_OK; +} diff --git a/dlls/mfplat/decode_transform.c b/dlls/mfplat/decode_transform.c new file mode 100644 index 00000000000..fb7f432923f --- /dev/null +++ wine/dlls/mfplat/decode_transform.c @@ -0,0 +1,1218 @@ +/* GStreamer Decoder Transform + * + * Copyright 2021 Derek Lesho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" +#include "mfobjects.h" +#include "mftransform.h" + +#include "wine/debug.h" +#include "wine/heap.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +const GUID *h264_input_types[] = {&MFVideoFormat_H264}; +/* NV12 comes first https://docs.microsoft.com/en-us/windows/win32/medfound/mft-decoder-expose-output-types-in-native-order . thanks to @vitorhnn */ +const GUID *h264_output_types[] = {&MFVideoFormat_NV12, &MFVideoFormat_I420, &MFVideoFormat_IYUV, &MFVideoFormat_YUY2, &MFVideoFormat_YV12}; + +const GUID *aac_input_types[] = {&MFAudioFormat_AAC}; +const GUID *aac_output_types[] = {&MFAudioFormat_Float}; + +static struct decoder_desc +{ + const GUID *major_type; + const GUID **input_types; + unsigned int input_types_count; + const GUID **output_types; + unsigned int output_types_count; +} decoder_descs[] = +{ + { /* DECODER_TYPE_H264 */ + &MFMediaType_Video, + h264_input_types, + ARRAY_SIZE(h264_input_types), + h264_output_types, + ARRAY_SIZE(h264_output_types), + }, + { /* DECODER_TYPE_AAC */ + &MFMediaType_Audio, + aac_input_types, + ARRAY_SIZE(aac_input_types), + aac_output_types, + ARRAY_SIZE(aac_output_types), + } +}; + +struct pipeline_event +{ + enum + { + PIPELINE_EVENT_NONE, + PIPELINE_EVENT_PARSER_STARTED, + PIPELINE_EVENT_READ_REQUEST, + } type; + union + { + struct + { + struct wg_parser_stream *stream; + } parser_started; + } u; +}; + +struct mf_decoder +{ + IMFTransform IMFTransform_iface; + LONG refcount; + enum decoder_type type; + IMFMediaType *input_type, *output_type; + CRITICAL_SECTION cs, help_cs, event_cs; + CONDITION_VARIABLE help_cv, event_cv; + BOOL flushing, draining, eos, helper_thread_shutdown, video; + HANDLE helper_thread, read_thread; + uint64_t offset_tracker; + struct wg_parser *wg_parser; + struct wg_parser_stream *wg_stream; + + struct + { + enum + { + HELP_REQ_NONE, + HELP_REQ_START_PARSER, + } type; + } help_request; + + struct pipeline_event event; +}; + +static struct mf_decoder *impl_mf_decoder_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct mf_decoder, IMFTransform_iface); +} + +static HRESULT WINAPI mf_decoder_QueryInterface (IMFTransform *iface, REFIID riid, void **out) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualIID(riid, &IID_IMFTransform) || + IsEqualIID(riid, &IID_IUnknown)) + { + *out = iface; + IMFTransform_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI mf_decoder_AddRef(IMFTransform *iface) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&decoder->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI mf_decoder_Release(IMFTransform *iface) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&decoder->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + if (decoder->input_type) + { + IMFMediaType_Release(decoder->input_type); + decoder->input_type = NULL; + } + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + if (decoder->wg_parser) + { + /* NULL wg_parser is possible if the wg_parser creation failed. */ + + if (decoder->wg_stream) + wg_parser_disconnect(decoder->wg_parser); + + EnterCriticalSection(&decoder->event_cs); + decoder->helper_thread_shutdown = TRUE; + WakeAllConditionVariable(&decoder->event_cv); + LeaveCriticalSection(&decoder->event_cs); + + EnterCriticalSection(&decoder->help_cs); + WakeAllConditionVariable(&decoder->help_cv); + LeaveCriticalSection(&decoder->help_cs); + + if (WaitForSingleObject(decoder->helper_thread, 10000) != WAIT_OBJECT_0) + FIXME("Failed waiting for helper thread to terminate.\n"); + CloseHandle(decoder->helper_thread); + if (WaitForSingleObject(decoder->read_thread, 10000) != WAIT_OBJECT_0) + FIXME("Failed waiting for read thread to terminate.\n"); + CloseHandle(decoder->read_thread); + + wg_parser_destroy(decoder->wg_parser); + } + + DeleteCriticalSection(&decoder->cs); + DeleteCriticalSection(&decoder->help_cs); + DeleteCriticalSection(&decoder->event_cs); + + heap_free(decoder); + } + + return refcount; +} + +static HRESULT WINAPI mf_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + TRACE("%p, %p, %p, %p, %p.\n", iface, input_minimum, input_maximum, output_minimum, output_maximum); + + *input_minimum = *input_maximum = *output_minimum = *output_maximum = 1; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + TRACE("%p %p %p.\n", iface, inputs, outputs); + + *inputs = *outputs = 1; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + TRACE("%p %u %p %u %p.\n", iface, input_size, inputs, output_size, outputs); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + + TRACE("%p %u %p\n", decoder, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_DOES_NOT_ADDREF; + info->cbAlignment = 0; + info->cbSize = 0; + /* TODO: retrieve following fields from gstreamer */ + info->hnsMaxLatency = 0; + info->cbMaxLookahead = 0; + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + MFT_OUTPUT_STREAM_INFO stream_info = {}; + GUID output_subtype; + UINT64 framesize; + + TRACE("%p %u %p\n", decoder, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&decoder->cs); + + if (!decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + if (decoder->video) + { + stream_info.dwFlags = MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | + MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES; + stream_info.cbSize = 0; + if (SUCCEEDED(IMFMediaType_GetGUID(decoder->output_type, &MF_MT_SUBTYPE, &output_subtype)) && + SUCCEEDED(IMFMediaType_GetUINT64(decoder->output_type, &MF_MT_FRAME_SIZE, &framesize))) + { + MFCalculateImageSize(&output_subtype, framesize >> 32, (UINT32) framesize, &stream_info.cbSize); + } + if (!stream_info.cbSize) + ERR("Failed to get desired output buffer size\n"); + } + else + { + stream_info.dwFlags = MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES; + stream_info.cbSize = 4; + } + stream_info.cbAlignment = 0; + + LeaveCriticalSection(&decoder->cs); + + *info = stream_info; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("%p, %p. semi-stub!\n", iface, attributes); + + return MFCreateAttributes(attributes, 0); +} + +static HRESULT WINAPI mf_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + TRACE("%p, %u.\n", iface, id); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + TRACE("%p, %u, %p.\n", iface, streams, ids); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + IMFMediaType *input_type; + HRESULT hr; + + TRACE("%p, %u, %u, %p\n", decoder, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= decoder_descs[decoder->type].input_types_count) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&input_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(input_type, &MF_MT_MAJOR_TYPE, decoder_descs[decoder->type].major_type))) + { + IMFMediaType_Release(input_type); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(input_type, &MF_MT_SUBTYPE, decoder_descs[decoder->type].input_types[index]))) + { + IMFMediaType_Release(input_type); + return hr; + } + + *type = input_type; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + IMFMediaType *output_type; + HRESULT hr; + + TRACE("%p, %u, %u, %p\n", decoder, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= decoder_descs[decoder->type].output_types_count) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&output_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(output_type, &MF_MT_MAJOR_TYPE, decoder_descs[decoder->type].major_type))) + { + IMFMediaType_Release(output_type); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(output_type, &MF_MT_SUBTYPE, decoder_descs[decoder->type].output_types[index]))) + { + IMFMediaType_Release(output_type); + return hr; + } + + *type = output_type; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + struct wg_format input_format; + GUID major_type, subtype; + unsigned int i; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", decoder, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (decoder->input_type) + { + IMFMediaType_Release(decoder->input_type); + decoder->input_type = NULL; + } + + LeaveCriticalSection(&decoder->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!(IsEqualGUID(&major_type, decoder_descs[decoder->type].major_type))) + return MF_E_INVALIDTYPE; + + for (i = 0; i < decoder_descs[decoder->type].input_types_count; i++) + { + if (IsEqualGUID(&subtype, decoder_descs[decoder->type].input_types[i])) + break; + if (i == decoder_descs[decoder->type].input_types_count) + return MF_E_INVALIDTYPE; + } + + mf_media_type_to_wg_format(type, &input_format); + if (!input_format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + hr = S_OK; + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (!decoder->input_type) + hr = MFCreateMediaType(&decoder->input_type); + + if (SUCCEEDED(hr) && FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes*) decoder->input_type))) + { + IMFMediaType_Release(decoder->input_type); + decoder->input_type = NULL; + } + + if (decoder->input_type && decoder->output_type) + { + EnterCriticalSection(&decoder->help_cs); + while(decoder->help_request.type != HELP_REQ_NONE) + SleepConditionVariableCS(&decoder->help_cv, &decoder->help_cs, INFINITE); + decoder->help_request.type = HELP_REQ_START_PARSER; + LeaveCriticalSection(&decoder->help_cs); + WakeAllConditionVariable(&decoder->help_cv); + } + + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + struct wg_format output_format; + GUID major_type, subtype; + HRESULT hr; + unsigned int i; + + TRACE("%p, %u, %p, %#x.\n", decoder, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + LeaveCriticalSection(&decoder->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!(IsEqualGUID(&major_type, decoder_descs[decoder->type].major_type))) + return MF_E_INVALIDTYPE; + + for (i = 0; i < decoder_descs[decoder->type].output_types_count; i++) + { + if (IsEqualGUID(&subtype, decoder_descs[decoder->type].output_types[i])) + break; + if (i == decoder_descs[decoder->type].output_types_count) + return MF_E_INVALIDTYPE; + } + + mf_media_type_to_wg_format(type, &output_format); + if (!output_format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + hr = S_OK; + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (!decoder->output_type) + hr = MFCreateMediaType(&decoder->output_type); + + if (SUCCEEDED(hr) && FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes*) decoder->output_type))) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + if (decoder->input_type && decoder->output_type) + { + EnterCriticalSection(&decoder->help_cs); + while(decoder->help_request.type != HELP_REQ_NONE) + SleepConditionVariableCS(&decoder->help_cv, &decoder->help_cs, INFINITE); + decoder->help_request.type = HELP_REQ_START_PARSER; + LeaveCriticalSection(&decoder->help_cs); + WakeAllConditionVariable(&decoder->help_cv); + } + + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("%p, %u, %p\n", iface, id, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("%p, %p.\n", iface, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("%p, %s, %s.\n", iface, wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + FIXME("%p, %u, %p.\n", iface, id, event); + + return E_NOTIMPL; +} + +static DWORD CALLBACK helper_thread_func(PVOID ctx) +{ + struct mf_decoder *decoder = (struct mf_decoder *)ctx; + + for(;;) + { + EnterCriticalSection(&decoder->help_cs); + + while(!decoder->helper_thread_shutdown && decoder->help_request.type == HELP_REQ_NONE) + SleepConditionVariableCS(&decoder->help_cv, &decoder->help_cs, INFINITE); + if (decoder->helper_thread_shutdown) + { + LeaveCriticalSection(&decoder->help_cs); + return 0; + } + + switch(decoder->help_request.type) + { + case HELP_REQ_START_PARSER: + { + struct wg_format input_format, output_format; + struct wg_rect wg_aperture = {0}; + MFVideoArea *aperture = NULL; + UINT32 aperture_size; + + decoder->help_request.type = HELP_REQ_NONE; + LeaveCriticalSection(&decoder->help_cs); + + mf_media_type_to_wg_format(decoder->input_type, &input_format); + mf_media_type_to_wg_format(decoder->output_type, &output_format); + + if (SUCCEEDED(IMFMediaType_GetAllocatedBlob(decoder->output_type, + &MF_MT_MINIMUM_DISPLAY_APERTURE, (UINT8 **) &aperture, &aperture_size))) + { + TRACE("Decoded media's aperture: x: %u %u/65536, y: %u %u/65536, area: %u x %u\n", + aperture->OffsetX.value, aperture->OffsetX.fract, + aperture->OffsetY.value, aperture->OffsetY.fract, aperture->Area.cx, aperture->Area.cy); + + /* TODO: verify aperture params? */ + + wg_aperture.left = aperture->OffsetX.value; + wg_aperture.top = aperture->OffsetY.value; + wg_aperture.right = aperture->Area.cx; + wg_aperture.bottom = aperture->Area.cy; + + CoTaskMemFree(aperture); + } + + wg_parser_connect_unseekable(decoder->wg_parser, + &input_format, 1, &output_format, aperture ? &wg_aperture : NULL); + + EnterCriticalSection(&decoder->event_cs); + while (!decoder->helper_thread_shutdown && decoder->event.type != PIPELINE_EVENT_NONE) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + + if (decoder->helper_thread_shutdown) + { + LeaveCriticalSection(&decoder->event_cs); + return 0; + } + + decoder->event.type = PIPELINE_EVENT_PARSER_STARTED; + decoder->event.u.parser_started.stream = wg_parser_get_stream(decoder->wg_parser, 0); + + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + break; + } + default: + assert(0); + } + } +} + +/* We use a separate thread to wait for reads, as we may want to wait to WAIT_ANY + on a read and another event. */ +static DWORD CALLBACK read_thread_func(PVOID ctx) +{ + struct mf_decoder *decoder = (struct mf_decoder *)ctx; + uint64_t offset; + uint32_t size; + + for (;;) + { + if (decoder->helper_thread_shutdown) + break; + + if (!wg_parser_get_next_read_offset(decoder->wg_parser, &offset, &size)) + continue; + + EnterCriticalSection(&decoder->event_cs); + while (!decoder->helper_thread_shutdown && decoder->event.type != PIPELINE_EVENT_NONE) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + + if (decoder->helper_thread_shutdown) + { + LeaveCriticalSection(&decoder->event_cs); + break; + } + + decoder->event.type = PIPELINE_EVENT_READ_REQUEST; + WakeAllConditionVariable(&decoder->event_cv); + while (!decoder->helper_thread_shutdown && decoder->event.type == PIPELINE_EVENT_READ_REQUEST) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + LeaveCriticalSection(&decoder->event_cs); + } + + return 0; +} + +static struct pipeline_event get_pipeline_event(struct mf_decoder *decoder) +{ + struct pipeline_event ret; + + EnterCriticalSection(&decoder->event_cs); + while(decoder->event.type == PIPELINE_EVENT_NONE) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + + ret = decoder->event; + + if (ret.type != PIPELINE_EVENT_READ_REQUEST) + { + decoder->event.type = PIPELINE_EVENT_NONE; + WakeAllConditionVariable(&decoder->event_cv); + } + + LeaveCriticalSection(&decoder->event_cs); + + return ret; +} + +static HRESULT WINAPI mf_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + HRESULT hr; + + TRACE("%p, %x %lu.\n", decoder, message, param); + + EnterCriticalSection(&decoder->cs); + if (!decoder->input_type || !decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + hr = S_OK; + + switch (message) + { + case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: + case MFT_MESSAGE_NOTIFY_START_OF_STREAM: + break; + case MFT_MESSAGE_NOTIFY_END_OF_STREAM: + { + if (param) + { + hr = MF_E_INVALIDSTREAMNUMBER; + break; + } + if (!decoder->wg_stream) + { + ERR("End-Of-Stream marked on a decoder MFT which hasn't finished initialization\n"); + hr = E_FAIL; + break; + } + + decoder->eos = TRUE; + break; + } + case MFT_MESSAGE_COMMAND_DRAIN: + { + struct pipeline_event pip_event; + + if (!decoder->wg_stream) + { + ERR("Drain requested on a decoder MFT which hasn't finished initialization\n"); + hr = E_FAIL; + break; + } + + pip_event = get_pipeline_event(decoder); + assert(pip_event.type == PIPELINE_EVENT_READ_REQUEST); + + wg_parser_push_data(decoder->wg_parser, WG_READ_EOS, NULL, 0); + + EnterCriticalSection(&decoder->event_cs); + decoder->event.type = PIPELINE_EVENT_NONE; + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + decoder->draining = TRUE; + decoder->offset_tracker = 0; + break; + } + case MFT_MESSAGE_COMMAND_FLUSH: + { + struct pipeline_event pip_event; + + if (!decoder->wg_stream) + { + ERR("Flush requested on a decoder MFT which hasn't finished initialization\n"); + hr = E_FAIL; + break; + } + + pip_event = get_pipeline_event(decoder); + assert(pip_event.type == PIPELINE_EVENT_READ_REQUEST); + + wg_parser_push_data(decoder->wg_parser, WG_READ_FLUSHING, NULL, 0); + + EnterCriticalSection(&decoder->event_cs); + decoder->event.type = PIPELINE_EVENT_NONE; + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + decoder->offset_tracker = 0; + break; + } + default: + { + ERR("Unhandled message type %x.\n", message); + hr = E_FAIL; + break; + } + } + + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + struct pipeline_event pip_event; + IMFMediaBuffer *buffer = NULL; + HRESULT hr = S_OK; + BYTE *buffer_data; + DWORD buffer_size; + uint32_t size = 0; + uint64_t offset; + + TRACE("%p, %u, %p, %#x.\n", decoder, id, sample, flags); + + if (flags) + WARN("Unsupported flags %#x\n", flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&decoder->cs); + + if (!decoder->input_type || !decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + if (decoder->draining) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_NOTACCEPTING; + } + + if (!decoder->wg_stream) + { + pip_event = get_pipeline_event(decoder); + + switch (pip_event.type) + { + case PIPELINE_EVENT_PARSER_STARTED: + decoder->wg_stream = pip_event.u.parser_started.stream; + break; + case PIPELINE_EVENT_READ_REQUEST: + break; + default: + assert(0); + } + } + + if (decoder->wg_stream && !wg_parser_stream_drain(decoder->wg_stream)) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_NOTACCEPTING; + } + + /* At this point, we either have a pre-init read request, or drained pipeline */ + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer))) + goto done; + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, &buffer_size))) + goto done; + + pip_event = get_pipeline_event(decoder); + assert(pip_event.type == PIPELINE_EVENT_READ_REQUEST); + + for(;;) + { + uint32_t copy_size; + + if (!wg_parser_get_next_read_offset(decoder->wg_parser, &offset, &size)) + continue; + + copy_size = min(size, buffer_size); + + if (offset != decoder->offset_tracker) + { + ERR("A seek is needed, MFTs don't support this!\n"); + wg_parser_push_data(decoder->wg_parser, WG_READ_FAILURE, NULL, 0); + IMFMediaBuffer_Unlock(buffer); + hr = E_FAIL; + goto done; + } + + wg_parser_push_data(decoder->wg_parser, WG_READ_SUCCESS, buffer_data, buffer_size); + + decoder->offset_tracker += copy_size; + + if (buffer_size <= size) + break; + + buffer_data += copy_size; + buffer_size -= copy_size; + + WARN("Input sample split into multiple read requests\n"); + } + + EnterCriticalSection(&decoder->event_cs); + decoder->event.type = PIPELINE_EVENT_NONE; + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + IMFMediaBuffer_Unlock(buffer); + + done: + if (buffer) + IMFMediaBuffer_Release(buffer); + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + MFT_OUTPUT_DATA_BUFFER *relevant_buffer = NULL; + struct wg_parser_buffer wg_buffer; + struct pipeline_event pip_event; + IMFMediaBuffer *buffer; + DWORD buffer_len; + unsigned int i; + BYTE *data; + HRESULT hr; + + TRACE("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); + + if (flags) + WARN("Unsupported flags %#x\n", flags); + + for (i = 0; i < count; i++) + { + MFT_OUTPUT_DATA_BUFFER *out_buffer = &samples[i]; + + if (out_buffer->dwStreamID != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (relevant_buffer) + return MF_E_INVALIDSTREAMNUMBER; + + relevant_buffer = out_buffer; + } + + if (!relevant_buffer) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + if (!decoder->input_type || !decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + if (!decoder->wg_stream) + { + pip_event = get_pipeline_event(decoder); + + switch (pip_event.type) + { + case PIPELINE_EVENT_PARSER_STARTED: + decoder->wg_stream = pip_event.u.parser_started.stream; + break; + case PIPELINE_EVENT_READ_REQUEST: + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_NEED_MORE_INPUT; + default: + assert(0); + } + } + + if (wg_parser_stream_drain(decoder->wg_stream)) + { + /* this would be unexpected, as we should get the EOS-event when a drain command completes. */ + assert (!decoder->draining); + + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (!wg_parser_stream_get_buffer(decoder->wg_stream, &wg_buffer)) + { + if (!decoder->draining) + { + LeaveCriticalSection(&decoder->cs); + WARN("Received EOS event while not draining\n"); + return E_FAIL; + } + decoder->draining = FALSE; + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (relevant_buffer->pSample) + { + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(relevant_buffer->pSample, &buffer))) + { + ERR("Failed to get buffer from sample, hr %#x.\n", hr); + LeaveCriticalSection(&decoder->cs); + return hr; + } + } + else + { + if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer.size, &buffer))) + { + ERR("Failed to create buffer, hr %#x.\n", hr); + LeaveCriticalSection(&decoder->cs); + return hr; + } + + if (FAILED(hr = MFCreateSample(&relevant_buffer->pSample))) + { + ERR("Failed to create sample, hr %#x.\n", hr); + LeaveCriticalSection(&decoder->cs); + IMFMediaBuffer_Release(buffer); + return hr; + } + + if (FAILED(hr = IMFSample_AddBuffer(relevant_buffer->pSample, buffer))) + { + ERR("Failed to add buffer, hr %#x.\n", hr); + goto out; + } + } + + if (FAILED(hr = IMFMediaBuffer_GetMaxLength(buffer, &buffer_len))) + { + ERR("Failed to get buffer size, hr %#x.\n", hr); + goto out; + } + + if (buffer_len < wg_buffer.size) + { + WARN("Client's buffer is smaller (%u bytes) than the output sample (%u bytes)\n", + buffer_len, wg_buffer.size); + + if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, buffer_len))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto out; + } + } + else if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer.size))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto out; + } + + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL))) + { + ERR("Failed to lock buffer, hr %#x.\n", hr); + goto out; + } + + if (!wg_parser_stream_copy_buffer(decoder->wg_stream, data, 0, min(buffer_len, wg_buffer.size))) + { + hr = E_FAIL; + goto out; + } + + if (FAILED(hr = IMFMediaBuffer_Unlock(buffer))) + { + ERR("Failed to unlock buffer, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFSample_SetSampleTime(relevant_buffer->pSample, wg_buffer.pts))) + { + ERR("Failed to set sample time, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFSample_SetSampleDuration(relevant_buffer->pSample, wg_buffer.duration))) + { + ERR("Failed to set sample duration, hr %#x.\n", hr); + goto out; + } + + relevant_buffer->dwStatus = 0; + relevant_buffer->pEvents = NULL; + *status = 0; + + out: + if (SUCCEEDED(hr)) + wg_parser_stream_release_buffer(decoder->wg_stream); + LeaveCriticalSection(&decoder->cs); + + if (FAILED(hr)) + { + IMFSample_Release(relevant_buffer->pSample); + relevant_buffer->pSample = NULL; + } + + IMFMediaBuffer_Release(buffer); + + return hr; +} + +static const IMFTransformVtbl mf_decoder_vtbl = +{ + mf_decoder_QueryInterface, + mf_decoder_AddRef, + mf_decoder_Release, + mf_decoder_GetStreamLimits, + mf_decoder_GetStreamCount, + mf_decoder_GetStreamIDs, + mf_decoder_GetInputStreamInfo, + mf_decoder_GetOutputStreamInfo, + mf_decoder_GetAttributes, + mf_decoder_GetInputStreamAttributes, + mf_decoder_GetOutputStreamAttributes, + mf_decoder_DeleteInputStream, + mf_decoder_AddInputStreams, + mf_decoder_GetInputAvailableType, + mf_decoder_GetOutputAvailableType, + mf_decoder_SetInputType, + mf_decoder_SetOutputType, + mf_decoder_GetInputCurrentType, + mf_decoder_GetOutputCurrentType, + mf_decoder_GetInputStatus, + mf_decoder_GetOutputStatus, + mf_decoder_SetOutputBounds, + mf_decoder_ProcessEvent, + mf_decoder_ProcessMessage, + mf_decoder_ProcessInput, + mf_decoder_ProcessOutput, +}; + +HRESULT decode_transform_create(REFIID riid, void **obj, enum decoder_type type) +{ + struct mf_decoder *object; + struct wg_parser *parser; + + TRACE("%s, %p %u.\n", debugstr_guid(riid), obj, type); + + if (!(object = heap_alloc_zero(sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IMFTransform_iface.lpVtbl = &mf_decoder_vtbl; + object->refcount = 1; + + object->type = type; + object->video = decoder_descs[type].major_type == &MFMediaType_Video; + + InitializeCriticalSection(&object->cs); + InitializeCriticalSection(&object->help_cs); + InitializeCriticalSection(&object->event_cs); + InitializeConditionVariable(&object->help_cv); + InitializeConditionVariable(&object->event_cv); + + if (!(parser = wg_parser_create(WG_PARSER_DECODEBIN, TRUE))) + { + ERR("Failed to create Decoder MFT type %u: Unspecified GStreamer error\n", type); + IMFTransform_Release(&object->IMFTransform_iface); + return E_OUTOFMEMORY; + } + object->wg_parser = parser; + + object->helper_thread = CreateThread(NULL, 0, helper_thread_func, object, 0, NULL); + object->read_thread = CreateThread(NULL, 0, read_thread_func, object, 0, NULL); + + *obj = &object->IMFTransform_iface; + return S_OK; +} diff --git a/dlls/mfplat/gst_guids.h b/dlls/mfplat/gst_guids.h new file mode 100644 index 00000000000..ea859586d7f --- /dev/null +++ wine/dlls/mfplat/gst_guids.h @@ -0,0 +1,23 @@ +/* + * GStreamer Guids + * + * Copyright 2010 Maarten Lankhorst for CodeWeavers + * Copyright 2010 Aric Stewart for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +DEFINE_GUID(CLSID_decodebin_parser, 0xf9d8d64e, 0xa144, 0x47dc, 0x8e, 0xe0, 0xf5, 0x34, 0x98, 0x37, 0x2c, 0x29); +DEFINE_GUID(WINESUBTYPE_Gstreamer, 0xffffffff, 0x128f, 0x4dd1, 0xad, 0x22, 0xbe, 0xcf, 0xa6, 0x6c, 0xe7, 0xaa); diff --git a/dlls/mfplat/gst_private.h b/dlls/mfplat/gst_private.h new file mode 100644 index 00000000000..c6b256b4fdd --- /dev/null +++ wine/dlls/mfplat/gst_private.h @@ -0,0 +1,217 @@ +/* + * GStreamer splitter + decoder, adapted from parser.c + * + * Copyright 2010 Maarten Lankhorst for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __GST_PRIVATE_INCLUDED__ +#define __GST_PRIVATE_INCLUDED__ + +#include +#include +#include +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#include "dshow.h" +#include "mfidl.h" +#include "wmsdk.h" +#include "wine/debug.h" +#include "wine/strmbase.h" + +#include "unixlib.h" + +bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size) DECLSPEC_HIDDEN; + +static inline const char *debugstr_time(REFERENCE_TIME time) +{ + ULONGLONG abstime = time >= 0 ? time : -time; + unsigned int i = 0, j = 0; + char buffer[23], rev[23]; + + while (abstime || i <= 8) + { + buffer[i++] = '0' + (abstime % 10); + abstime /= 10; + if (i == 7) buffer[i++] = '.'; + } + if (time < 0) buffer[i++] = '-'; + + while (i--) rev[j++] = buffer[i]; + while (rev[j-1] == '0' && rev[j-2] != '.') --j; + rev[j] = 0; + + return wine_dbg_sprintf("%s", rev); +} + +#define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000) + +struct wg_parser *wg_parser_create(enum wg_parser_type type, bool unlimited_buffering) DECLSPEC_HIDDEN; +void wg_parser_destroy(struct wg_parser *parser) DECLSPEC_HIDDEN; + +HRESULT wg_parser_connect(struct wg_parser *parser, uint64_t file_size) DECLSPEC_HIDDEN; +HRESULT wg_parser_connect_unseekable(struct wg_parser *parser, const struct wg_format *in_format, + uint32_t stream_count, const struct wg_format *out_formats, const struct wg_rect *apertures) DECLSPEC_HIDDEN; +void wg_parser_disconnect(struct wg_parser *parser) DECLSPEC_HIDDEN; + +bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, uint32_t *size) DECLSPEC_HIDDEN; +void wg_parser_push_data(struct wg_parser *parser, enum wg_read_result result, const void *data, uint32_t size) DECLSPEC_HIDDEN; + +uint32_t wg_parser_get_stream_count(struct wg_parser *parser) DECLSPEC_HIDDEN; +struct wg_parser_stream *wg_parser_get_stream(struct wg_parser *parser, uint32_t index) DECLSPEC_HIDDEN; + +void wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, struct wg_format *format) DECLSPEC_HIDDEN; +void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format, const struct wg_rect *aperture, uint32_t flags) DECLSPEC_HIDDEN; +void wg_parser_stream_disable(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; + +bool wg_parser_stream_get_buffer(struct wg_parser_stream *stream, struct wg_parser_buffer *buffer) DECLSPEC_HIDDEN; +bool wg_parser_stream_copy_buffer(struct wg_parser_stream *stream, + void *data, uint32_t offset, uint32_t size) DECLSPEC_HIDDEN; +void wg_parser_stream_release_buffer(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; +void wg_parser_stream_notify_qos(struct wg_parser_stream *stream, + bool underflow, double proportion, int64_t diff, uint64_t timestamp) DECLSPEC_HIDDEN; + +/* Returns the duration in 100-nanosecond units. */ +uint64_t wg_parser_stream_get_duration(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; +bool wg_parser_stream_get_language(struct wg_parser_stream *stream, char *buffer, uint32_t size) DECLSPEC_HIDDEN; +/* start_pos and stop_pos are in 100-nanosecond units. */ +void wg_parser_stream_seek(struct wg_parser_stream *stream, double rate, + uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags) DECLSPEC_HIDDEN; +bool wg_parser_stream_drain(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; + +struct wg_transform *wg_transform_create(const struct wg_encoded_format *input_format, + const struct wg_format *output_format) DECLSPEC_HIDDEN; +void wg_transform_destroy(struct wg_transform *transform) DECLSPEC_HIDDEN; +HRESULT wg_transform_push_data(struct wg_transform *transform, const void *data, uint32_t size) DECLSPEC_HIDDEN; +HRESULT wg_transform_read_data(struct wg_transform *transform, struct wg_sample *sample) DECLSPEC_HIDDEN; + +unsigned int wg_format_get_max_size(const struct wg_format *format); + +HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT wave_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT wma_decoder_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; + +bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool wm); +bool amt_to_wg_format(const AM_MEDIA_TYPE *mt, struct wg_format *format); + +BOOL init_gstreamer(void) DECLSPEC_HIDDEN; + +extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN; +extern HRESULT mfplat_DllRegisterServer(void) DECLSPEC_HIDDEN; + +IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) DECLSPEC_HIDDEN; +void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format) DECLSPEC_HIDDEN; +void mf_media_type_to_wg_encoded_format(IMFMediaType *type, struct wg_encoded_format *format) DECLSPEC_HIDDEN; + +HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj) DECLSPEC_HIDDEN; + +HRESULT aac_decoder_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; +HRESULT h264_decoder_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; +HRESULT audio_converter_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; +HRESULT color_converter_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; + +enum decoder_type +{ + DECODER_TYPE_H264, + DECODER_TYPE_AAC, +}; +HRESULT decode_transform_create(REFIID riid, void **obj, enum decoder_type) DECLSPEC_HIDDEN; + +struct wm_stream +{ + struct wm_reader *reader; + struct wg_parser_stream *wg_stream; + struct wg_format format; + WMT_STREAM_SELECTION selection; + WORD index; + bool eos; + bool allocate_output; + bool allocate_stream; + /* Note that we only pretend to read compressed samples, and instead output + * uncompressed samples regardless of whether we are configured to read + * compressed samples. Rather, the behaviour of the reader objects differs + * in nontrivial ways depending on this field. */ + bool read_compressed; +}; + +struct wm_reader +{ + IWMHeaderInfo3 IWMHeaderInfo3_iface; + IWMLanguageList IWMLanguageList_iface; + IWMPacketSize2 IWMPacketSize2_iface; + IWMProfile3 IWMProfile3_iface; + IWMReaderPlaylistBurn IWMReaderPlaylistBurn_iface; + IWMReaderTimecode IWMReaderTimecode_iface; + LONG refcount; + CRITICAL_SECTION cs; + + QWORD start_time; + + IStream *source_stream; + HANDLE file; + HANDLE read_thread; + bool read_thread_shutdown; + struct wg_parser *wg_parser; + + struct wm_stream *streams; + WORD stream_count; + + IWMReaderCallbackAdvanced *callback_advanced; + + const struct wm_reader_ops *ops; +}; + +struct wm_reader_ops +{ + void *(*query_interface)(struct wm_reader *reader, REFIID iid); + void (*destroy)(struct wm_reader *reader); +}; + +void wm_reader_cleanup(struct wm_reader *reader); +HRESULT wm_reader_close(struct wm_reader *reader); +HRESULT wm_reader_get_max_stream_size(struct wm_reader *reader, WORD stream_number, DWORD *size); +HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, + DWORD index, IWMOutputMediaProps **props); +HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output, DWORD *count); +HRESULT wm_reader_get_output_props(struct wm_reader *reader, DWORD output, + IWMOutputMediaProps **props); +struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, + WORD stream_number); +HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number, + INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number); +HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, + WORD stream_number, WMT_STREAM_SELECTION *selection); +void wm_reader_init(struct wm_reader *reader, const struct wm_reader_ops *ops); +HRESULT wm_reader_open_file(struct wm_reader *reader, const WCHAR *filename); +HRESULT wm_reader_open_stream(struct wm_reader *reader, IStream *stream); +void wm_reader_seek(struct wm_reader *reader, QWORD start, LONGLONG duration); +HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output, BOOL allocate); +HRESULT wm_reader_set_allocate_for_stream(struct wm_reader *reader, WORD stream_number, BOOL allocate); +HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output, + IWMOutputMediaProps *props); +HRESULT wm_reader_set_read_compressed(struct wm_reader *reader, + WORD stream_number, BOOL compressed); +HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count, + const WORD *stream_numbers, const WMT_STREAM_SELECTION *selections); + +#endif /* __GST_PRIVATE_INCLUDED__ */ diff --git a/dlls/mfplat/h264_decoder.c b/dlls/mfplat/h264_decoder.c new file mode 100644 index 00000000000..f6a4d47188f --- /dev/null +++ wine/dlls/mfplat/h264_decoder.c @@ -0,0 +1,727 @@ +/* H264 Decoder Transform + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" +#include "mfobjects.h" +#include "mftransform.h" +#include "wmcodecdsp.h" + +#include "wine/debug.h" +#include "wine/heap.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +static const GUID *h264_decoder_input_types[] = +{ + &MFVideoFormat_H264, +}; +static const GUID *h264_decoder_output_types[] = +{ + &MFVideoFormat_NV12, + &MFVideoFormat_YV12, + &MFVideoFormat_IYUV, + &MFVideoFormat_I420, + &MFVideoFormat_YUY2, +}; + +struct h264_decoder +{ + IMFTransform IMFTransform_iface; + LONG refcount; + IMFMediaType *input_type; + IMFMediaType *output_type; + + struct wg_transform *wg_transform; + struct wg_format wg_format; + ULONGLONG last_pts; +}; + +static struct h264_decoder *impl_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct h264_decoder, IMFTransform_iface); +} + +static HRESULT try_create_wg_transform(struct h264_decoder *decoder) +{ + struct wg_encoded_format input_format; + struct wg_format output_format; + + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + + mf_media_type_to_wg_encoded_format(decoder->input_type, &input_format); + if (input_format.encoded_type == WG_ENCODED_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + + mf_media_type_to_wg_format(decoder->output_type, &output_format); + if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + + decoder->last_pts = 0; + decoder->wg_transform = wg_transform_create(&input_format, &output_format); + if (decoder->wg_transform) + return S_OK; + + WARN("Failed to create H264 wg_transform.\n"); + return E_FAIL; +} + +static HRESULT fill_output_media_type(IMFMediaType *media_type, IMFMediaType *default_type) +{ + UINT32 value, width, height; + MFVideoArea aperture = {0}; + UINT64 value64; + GUID subtype; + HRESULT hr; + + if (FAILED(hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (FAILED(hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_FRAME_SIZE, &value64))) + value64 = (UINT64)1920 << 32 | 1080; + if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, value64))) + return hr; + } + width = value64 >> 32; + height = value64; + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_FRAME_RATE, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_FRAME_RATE, &value64))) + value64 = (UINT64)30000 << 32 | 1001; + if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_RATE, value64))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_PIXEL_ASPECT_RATIO, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64))) + value64 = (UINT64)1 << 32 | 1; + if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, value64))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_SAMPLE_SIZE, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_SAMPLE_SIZE, &value))) + { + if (IsEqualGUID(&subtype, &MFVideoFormat_YUY2)) + value = width * height * 2; + else + value = width * height * 3 / 2; + } + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_SAMPLE_SIZE, value))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_DEFAULT_STRIDE, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_DEFAULT_STRIDE, &value))) + { + if (IsEqualGUID(&subtype, &MFVideoFormat_YUY2)) + value = width * 2; + else + value = width; + } + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, value))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_INTERLACE_MODE, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_INTERLACE_MODE, &value))) + value = MFVideoInterlace_MixedInterlaceOrProgressive; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_INTERLACE_MODE, value))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, &value))) + value = 1; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, value))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_VIDEO_ROTATION, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_VIDEO_ROTATION, &value))) + value = 0; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_VIDEO_ROTATION, value))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_FIXED_SIZE_SAMPLES, NULL))) + { + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_FIXED_SIZE_SAMPLES, &value))) + value = 1; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, value))) + return hr; + } + + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, NULL))) + { + if (default_type && SUCCEEDED(hr = IMFMediaType_GetBlob(default_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, + (BYTE *)&aperture, sizeof(aperture), NULL))) + { + if (FAILED(hr = IMFMediaType_SetBlob(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, + (BYTE *)&aperture, sizeof(aperture)))) + return hr; + } + } + + return S_OK; +} + +static HRESULT WINAPI h264_decoder_QueryInterface(IMFTransform *iface, REFIID iid, void **out) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IMFTransform)) + *out = &decoder->IMFTransform_iface; + else + { + *out = NULL; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI h264_decoder_AddRef(IMFTransform *iface) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&decoder->refcount); + + TRACE("iface %p increasing refcount to %u.\n", decoder, refcount); + + return refcount; +} + +static ULONG WINAPI h264_decoder_Release(IMFTransform *iface) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&decoder->refcount); + + TRACE("iface %p decreasing refcount to %u.\n", decoder, refcount); + + if (!refcount) + { + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + if (decoder->input_type) + IMFMediaType_Release(decoder->input_type); + if (decoder->output_type) + IMFMediaType_Release(decoder->output_type); + free(decoder); + } + + return refcount; +} + +static HRESULT WINAPI h264_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + FIXME("iface %p, input_minimum %p, input_maximum %p, output_minimum %p, output_maximum %p stub!\n", + iface, input_minimum, input_maximum, output_minimum, output_maximum); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + FIXME("iface %p, inputs %p, outputs %p stub!\n", iface, inputs, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + FIXME("iface %p, input_size %u, inputs %p, output_size %u, outputs %p stub!\n", + iface, input_size, inputs, output_size, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + info->hnsMaxLatency = 0; + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_INPUT_STREAM_FIXED_SAMPLE_SIZE; + info->cbSize = 0x1000; + info->cbMaxLookahead = 0; + info->cbAlignment = 0; + + return S_OK; +} + +static HRESULT WINAPI h264_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaType *media_type; + HRESULT hr; + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + media_type = decoder->output_type; + + info->dwFlags = MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE; + if (FAILED(hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &info->cbSize))) + info->cbSize = 1920 * 1080 * 2; + info->cbAlignment = 0; + + return S_OK; +} + +static HRESULT WINAPI h264_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("iface %p, attributes %p stub!\n", iface, attributes); + + return MFCreateAttributes(attributes, 0); +} + +static HRESULT WINAPI h264_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + FIXME("iface %p, id %u stub!\n", iface, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + FIXME("iface %p, streams %u, ids %p stub!\n", iface, streams, ids); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + IMFMediaType *media_type; + const GUID *subtype; + HRESULT hr; + + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); + + *type = NULL; + + if (index >= ARRAY_SIZE(h264_decoder_input_types)) + return MF_E_NO_MORE_TYPES; + subtype = h264_decoder_input_types[index]; + + if (FAILED(hr = MFCreateMediaType(&media_type))) + return hr; + + if (SUCCEEDED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video)) && + SUCCEEDED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, subtype))) + IMFMediaType_AddRef((*type = media_type)); + + IMFMediaType_Release(media_type); + return hr; +} + +static HRESULT WINAPI h264_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaType *media_type; + const GUID *output_type; + HRESULT hr; + + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); + + if (!decoder->input_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *type = NULL; + + if (index >= ARRAY_SIZE(h264_decoder_output_types)) + return MF_E_NO_MORE_TYPES; + output_type = h264_decoder_output_types[index]; + + if (FAILED(hr = MFCreateMediaType(&media_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video))) + goto done; + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, output_type))) + goto done; + + hr = fill_output_media_type(media_type, decoder->output_type); + +done: + if (SUCCEEDED(hr)) + IMFMediaType_AddRef((*type = media_type)); + + IMFMediaType_Release(media_type); + return hr; +} + +static HRESULT WINAPI h264_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + GUID major, subtype; + HRESULT hr; + ULONG i; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return E_INVALIDARG; + + if (!IsEqualGUID(&major, &MFMediaType_Video)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(h264_decoder_input_types); ++i) + if (IsEqualGUID(&subtype, h264_decoder_input_types[i])) + break; + if (i == ARRAY_SIZE(h264_decoder_input_types)) + return MF_E_INVALIDMEDIATYPE; + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + if (decoder->input_type) + IMFMediaType_Release(decoder->input_type); + IMFMediaType_AddRef((decoder->input_type = type)); + + return S_OK; +} + +static HRESULT WINAPI h264_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + GUID major, subtype; + BOOL identical; + HRESULT hr; + ULONG i; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (!decoder->input_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (!IsEqualGUID(&major, &MFMediaType_Video)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(h264_decoder_output_types); ++i) + if (IsEqualGUID(&subtype, h264_decoder_output_types[i])) + break; + if (i == ARRAY_SIZE(h264_decoder_output_types)) + return MF_E_INVALIDMEDIATYPE; + + if (decoder->output_type) + { + if (SUCCEEDED(hr = IMFMediaType_Compare(decoder->output_type, (IMFAttributes *)type, + MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &identical)) && identical) + return S_OK; + IMFMediaType_Release(decoder->output_type); + } + + IMFMediaType_AddRef((decoder->output_type = type)); + + if (FAILED(hr = try_create_wg_transform(decoder))) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + return hr; +} + +static HRESULT WINAPI h264_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("iface %p, id %u, flags %p stub!\n", iface, id, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("iface %p, flags %p stub!\n", iface, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("iface %p, lower %s, upper %s stub!\n", iface, + wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + FIXME("iface %p, id %u, event %p stub!\n", iface, id, event); + return E_NOTIMPL; +} + +static HRESULT WINAPI h264_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + + FIXME("iface %p, message %#x, param %p stub!\n", iface, message, (void *)param); + + switch (message) + { + case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: + memset(&decoder->wg_format, 0, sizeof(decoder->wg_format)); + break; + default: + break; + } + + return S_OK; +} + +static HRESULT WINAPI h264_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaBuffer *media_buffer; + MFT_INPUT_STREAM_INFO info; + UINT32 buffer_size; + BYTE *buffer; + HRESULT hr; + + TRACE("iface %p, id %u, sample %p, flags %#x.\n", iface, id, sample, flags); + + if (FAILED(hr = IMFTransform_GetInputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &buffer_size))) + goto done; + + hr = wg_transform_push_data(decoder->wg_transform, buffer, buffer_size); + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static HRESULT WINAPI h264_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + struct wg_sample wg_sample = {0}; + IMFMediaBuffer *media_buffer; + MFT_OUTPUT_STREAM_INFO info; + MFVideoArea aperture = {0}; + IMFMediaType *media_type; + UINT32 align, offset; + UINT64 framerate; + HRESULT hr; + + TRACE("iface %p, flags %#x, count %u, samples %p, status %p.\n", iface, flags, count, samples, status); + + if (count > 1) + { + FIXME("Not implemented count %u\n", count); + return E_NOTIMPL; + } + + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *status = 0; + samples[0].dwStatus = 0; + if (!samples[0].pSample) + { + samples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &wg_sample.data, &wg_sample.size, NULL))) + goto done; + + wg_sample.format = &decoder->wg_format; + if (wg_sample.size < info.cbSize) + hr = MF_E_BUFFERTOOSMALL; + else if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, &wg_sample))) + { + if (!(wg_sample.flags & (WG_SAMPLE_FLAG_HAS_PTS|WG_SAMPLE_FLAG_HAS_DURATION))) + { + IMFMediaType_GetUINT64(decoder->output_type, &MF_MT_FRAME_RATE, &framerate); + wg_sample.pts = decoder->last_pts; + wg_sample.duration = (UINT64)10000000 * (UINT32)framerate / (framerate >> 32); + wg_sample.flags |= (WG_SAMPLE_FLAG_HAS_PTS|WG_SAMPLE_FLAG_HAS_DURATION); + decoder->last_pts += wg_sample.duration; + } + + if (wg_sample.flags & WG_SAMPLE_FLAG_HAS_PTS) + IMFSample_SetSampleTime(samples[0].pSample, wg_sample.pts); + if (wg_sample.flags & WG_SAMPLE_FLAG_HAS_DURATION) + IMFSample_SetSampleDuration(samples[0].pSample, wg_sample.duration); + + if (decoder->wg_format.u.video.format == WG_VIDEO_FORMAT_NV12 && + (align = decoder->wg_format.u.video.height & 15)) + { + offset = decoder->wg_format.u.video.width * decoder->wg_format.u.video.height; + align = (16 - align) * decoder->wg_format.u.video.width; + memmove(wg_sample.data + offset + align, wg_sample.data + offset, + wg_sample.size - offset); + wg_sample.size += align; + } + + hr = IMFMediaBuffer_SetCurrentLength(media_buffer, wg_sample.size); + } + else if (hr == MF_E_TRANSFORM_STREAM_CHANGE) + { + media_type = mf_media_type_from_wg_format(&decoder->wg_format); + IMFMediaType_SetUINT32(media_type, &MF_MT_SAMPLE_SIZE, wg_sample.size); + IMFMediaType_DeleteItem(media_type, &MF_MT_FRAME_RATE); + IMFMediaType_DeleteItem(decoder->output_type, &MF_MT_DEFAULT_STRIDE); + fill_output_media_type(media_type, decoder->output_type); + + if (decoder->wg_format.u.video.format == WG_VIDEO_FORMAT_NV12 && + (align = decoder->wg_format.u.video.height & 15)) + { + aperture.Area.cx = decoder->wg_format.u.video.width; + aperture.Area.cy = decoder->wg_format.u.video.height; + IMFMediaType_SetBlob(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, + (BYTE *)&aperture, sizeof(aperture)); + + aperture.Area.cy += 16 - align; + IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, + (UINT64)aperture.Area.cx << 32 | aperture.Area.cy); + IMFMediaType_SetUINT32(media_type, &MF_MT_SAMPLE_SIZE, + aperture.Area.cx * aperture.Area.cy * 3 / 2); + } + + IMFMediaType_Release(decoder->output_type); + decoder->output_type = media_type; + + samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE; + *status |= MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE; + } + + IMFMediaBuffer_Unlock(media_buffer); + +done: + if (FAILED(hr)) + IMFMediaBuffer_SetCurrentLength(media_buffer, 0); + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static const IMFTransformVtbl h264_decoder_vtbl = +{ + h264_decoder_QueryInterface, + h264_decoder_AddRef, + h264_decoder_Release, + h264_decoder_GetStreamLimits, + h264_decoder_GetStreamCount, + h264_decoder_GetStreamIDs, + h264_decoder_GetInputStreamInfo, + h264_decoder_GetOutputStreamInfo, + h264_decoder_GetAttributes, + h264_decoder_GetInputStreamAttributes, + h264_decoder_GetOutputStreamAttributes, + h264_decoder_DeleteInputStream, + h264_decoder_AddInputStreams, + h264_decoder_GetInputAvailableType, + h264_decoder_GetOutputAvailableType, + h264_decoder_SetInputType, + h264_decoder_SetOutputType, + h264_decoder_GetInputCurrentType, + h264_decoder_GetOutputCurrentType, + h264_decoder_GetInputStatus, + h264_decoder_GetOutputStatus, + h264_decoder_SetOutputBounds, + h264_decoder_ProcessEvent, + h264_decoder_ProcessMessage, + h264_decoder_ProcessInput, + h264_decoder_ProcessOutput, +}; + +HRESULT h264_decoder_create(REFIID riid, void **ret) +{ + struct h264_decoder *decoder; + + TRACE("riid %s, ret %p.\n", debugstr_guid(riid), ret); + + if (!(decoder = calloc(1, sizeof(*decoder)))) + return E_OUTOFMEMORY; + + decoder->IMFTransform_iface.lpVtbl = &h264_decoder_vtbl; + decoder->refcount = 1; + + *ret = &decoder->IMFTransform_iface; + TRACE("Created decoder %p\n", *ret); + return S_OK; +} diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c index cee052defeb..83fc8549e24 100644 --- wine/dlls/mfplat/main.c +++ wine/dlls/mfplat/main.c @@ -36,6 +36,7 @@ #include "d3d11.h" #include "uuids.h" +#include "wine/debug.h" #include "wine/list.h" #include "mfplat_private.h" @@ -52,9 +53,6 @@ #include "initguid.h" #include "mfd3d12.h" -#include "bcrypt.h" -#include "pathcch.h" - WINE_DEFAULT_DEBUG_CHANNEL(mfplat); struct local_handler @@ -124,20 +122,17 @@ struct system_time_source MFCLOCK_STATE state; IMFClock *clock; LONGLONG start_offset; - LONGLONG system_time; - LONGLONG clock_time; float rate; int i_rate; CRITICAL_SECTION cs; }; -static void system_time_source_update_clock_time(struct system_time_source *source, LONGLONG system_time) +static void system_time_source_apply_rate(const struct system_time_source *source, LONGLONG *value) { - LONGLONG diff = system_time - source->system_time; - if (source->i_rate) diff *= source->i_rate; - else if (source->rate != 1.0f) diff *= source->rate; - source->clock_time += diff; - source->system_time = system_time; + if (source->i_rate) + *value *= source->i_rate; + else + *value *= source->rate; } static struct system_time_source *impl_from_IMFPresentationTimeSource(IMFPresentationTimeSource *iface) @@ -183,7 +178,7 @@ static ULONG WINAPI transform_activate_AddRef(IMFActivate *iface) struct transform_activate *activate = impl_from_IMFActivate(iface); ULONG refcount = InterlockedIncrement(&activate->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -193,7 +188,7 @@ static ULONG WINAPI transform_activate_Release(IMFActivate *iface) struct transform_activate *activate = impl_from_IMFActivate(iface); ULONG refcount = InterlockedDecrement(&activate->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -707,10 +702,9 @@ static HRESULT register_transform(const CLSID *clsid, const WCHAR *name, UINT32 HRESULT hr = S_OK; HKEY hclsid = 0; WCHAR buffer[64]; + DWORD size, ret; WCHAR str[250]; UINT8 *blob; - UINT32 size; - DWORD ret; guid_to_string(buffer, clsid); swprintf(str, ARRAY_SIZE(str), L"%s\\%s", transform_keyW, buffer); @@ -1196,7 +1190,7 @@ static HRESULT mft_enum(GUID category, UINT32 flags, const MFT_REGISTER_TYPE_INF if (FAILED(hr = MFGetPluginControl(&plugin_control))) { - WARN("Failed to get plugin control instance, hr %#lx.\n", hr); + WARN("Failed to get plugin control instance, hr %#x.\n", hr); return hr; } @@ -1519,7 +1513,7 @@ static HRESULT mft_get_attributes(HKEY hkey, IMFAttributes **ret) if (!RegQueryValueExW(hkey, L"Attributes", NULL, NULL, blob, &size)) { if (FAILED(hr = MFInitAttributesFromBlob(attributes, blob, size))) - WARN("Failed to initialize attributes, hr %#lx.\n", hr); + WARN("Failed to initialize attributes, hr %#x.\n", hr); } free(blob); @@ -1583,6 +1577,18 @@ HRESULT WINAPI MFTGetInfo(CLSID clsid, WCHAR **name, MFT_REGISTER_TYPE_INFO **in return hr; } +static BOOL CALLBACK register_winegstreamer_proc(INIT_ONCE *once, void *param, void **ctx) +{ + HMODULE mod = LoadLibraryW(L"winegstreamer.dll"); + if (mod) + { + HRESULT (WINAPI *proc)(void) = (void *)GetProcAddress(mod, "DllRegisterServer"); + proc(); + FreeLibrary(mod); + } + return TRUE; +} + /*********************************************************************** * MFStartup (mfplat.@) */ @@ -1590,8 +1596,11 @@ HRESULT WINAPI MFStartup(ULONG version, DWORD flags) { #define MF_VERSION_XP MAKELONG( MF_API_VERSION, 1 ) #define MF_VERSION_WIN7 MAKELONG( MF_API_VERSION, 2 ) + static INIT_ONCE once = INIT_ONCE_STATIC_INIT; + + TRACE("%#x, %#x.\n", version, flags); - TRACE("%#lx, %#lx.\n", version, flags); + InitOnceExecuteOnce(&once, register_winegstreamer_proc, NULL, NULL); if (version != MF_VERSION_XP && version != MF_VERSION_WIN7) return MF_E_BAD_STARTUP_VERSION; @@ -1618,7 +1627,7 @@ HRESULT WINAPI MFShutdown(void) */ HRESULT WINAPI MFCopyImage(BYTE *dest, LONG deststride, const BYTE *src, LONG srcstride, DWORD width, DWORD lines) { - TRACE("%p, %ld, %p, %ld, %lu, %lu.\n", dest, deststride, src, srcstride, width, lines); + TRACE("%p, %d, %p, %d, %u, %u.\n", dest, deststride, src, srcstride, width, lines); while (lines--) { @@ -2312,7 +2321,7 @@ static const char *debugstr_eventid(DWORD event) }; struct event_id *ret = bsearch(&event, event_ids, ARRAY_SIZE(event_ids), sizeof(*event_ids), debug_event_id); - return ret ? wine_dbg_sprintf("%s", ret->name) : wine_dbg_sprintf("%lu", event); + return ret ? wine_dbg_sprintf("%s", ret->name) : wine_dbg_sprintf("%u", event); } static inline struct attributes *impl_from_IMFAttributes(IMFAttributes *iface) @@ -2342,7 +2351,7 @@ static ULONG WINAPI mfattributes_AddRef(IMFAttributes *iface) struct attributes *attributes = impl_from_IMFAttributes(iface); ULONG refcount = InterlockedIncrement(&attributes->ref); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); return refcount; } @@ -2352,7 +2361,7 @@ static ULONG WINAPI mfattributes_Release(IMFAttributes *iface) struct attributes *attributes = impl_from_IMFAttributes(iface); ULONG refcount = InterlockedDecrement(&attributes->ref); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); if (!refcount) { @@ -2670,7 +2679,8 @@ HRESULT attributes_GetAllocatedString(struct attributes *attributes, REFGUID key if (SUCCEEDED(hr)) { *value = attrval.pwszVal; - *length = lstrlenW(*value); + if (length) + *length = lstrlenW(*value); } return hr; @@ -3730,7 +3740,7 @@ static ULONG WINAPI async_stream_op_AddRef(IUnknown *iface) struct async_stream_op *op = impl_async_stream_op_from_IUnknown(iface); ULONG refcount = InterlockedIncrement(&op->refcount); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); return refcount; } @@ -3740,7 +3750,7 @@ static ULONG WINAPI async_stream_op_Release(IUnknown *iface) struct async_stream_op *op = impl_async_stream_op_from_IUnknown(iface); ULONG refcount = InterlockedDecrement(&op->refcount); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); if (!refcount) { @@ -3902,7 +3912,7 @@ static ULONG WINAPI bytestream_AddRef(IMFByteStream *iface) struct bytestream *stream = impl_from_IMFByteStream(iface); ULONG refcount = InterlockedIncrement(&stream->attributes.ref); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); return refcount; } @@ -3913,7 +3923,7 @@ static ULONG WINAPI bytestream_Release(IMFByteStream *iface) ULONG refcount = InterlockedDecrement(&stream->attributes.ref); struct async_stream_op *cur, *cur2; - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); if (!refcount) { @@ -3952,7 +3962,7 @@ static HRESULT WINAPI bytestream_stream_GetCapabilities(IMFByteStream *iface, DW return S_OK; } -static HRESULT WINAPI bytestream_GetCapabilities(IMFByteStream *iface, DWORD *capabilities) +static HRESULT WINAPI bytestream_file_GetCapabilities(IMFByteStream *iface, DWORD *capabilities) { struct bytestream *stream = impl_from_IMFByteStream(iface); @@ -3963,14 +3973,14 @@ static HRESULT WINAPI bytestream_GetCapabilities(IMFByteStream *iface, DWORD *ca return S_OK; } -static HRESULT WINAPI bytestream_SetLength(IMFByteStream *iface, QWORD length) +static HRESULT WINAPI bytestream_file_SetLength(IMFByteStream *iface, QWORD length) { FIXME("%p, %s\n", iface, wine_dbgstr_longlong(length)); return E_NOTIMPL; } -static HRESULT WINAPI bytestream_file_GetCurrentPosition(IMFByteStream *iface, QWORD *position) +static HRESULT WINAPI bytestream_GetCurrentPosition(IMFByteStream *iface, QWORD *position) { struct bytestream *stream = impl_from_IMFByteStream(iface); @@ -4030,7 +4040,7 @@ static HRESULT WINAPI bytestream_file_Read(IMFByteStream *iface, BYTE *buffer, U HRESULT hr = S_OK; BOOL ret; - TRACE("%p, %p, %lu, %p.\n", iface, buffer, size, read_len); + TRACE("%p, %p, %u, %p.\n", iface, buffer, size, read_len); EnterCriticalSection(&stream->cs); @@ -4054,7 +4064,7 @@ static HRESULT WINAPI bytestream_BeginRead(IMFByteStream *iface, BYTE *data, ULO { struct bytestream *stream = impl_from_IMFByteStream(iface); - TRACE("%p, %p, %lu, %p, %p.\n", iface, data, size, callback, state); + TRACE("%p, %p, %u, %p, %p.\n", iface, data, size, callback, state); return bytestream_create_io_request(stream, ASYNC_STREAM_OP_READ, data, size, callback, state); } @@ -4068,9 +4078,9 @@ static HRESULT WINAPI bytestream_EndRead(IMFByteStream *iface, IMFAsyncResult *r return bytestream_complete_io_request(stream, ASYNC_STREAM_OP_READ, result, byte_read); } -static HRESULT WINAPI bytestream_Write(IMFByteStream *iface, const BYTE *data, ULONG count, ULONG *written) +static HRESULT WINAPI bytestream_file_Write(IMFByteStream *iface, const BYTE *data, ULONG count, ULONG *written) { - FIXME("%p, %p, %lu, %p\n", iface, data, count, written); + FIXME("%p, %p, %u, %p\n", iface, data, count, written); return E_NOTIMPL; } @@ -4080,7 +4090,7 @@ static HRESULT WINAPI bytestream_BeginWrite(IMFByteStream *iface, const BYTE *da { struct bytestream *stream = impl_from_IMFByteStream(iface); - TRACE("%p, %p, %lu, %p, %p.\n", iface, data, size, callback, state); + TRACE("%p, %p, %u, %p, %p.\n", iface, data, size, callback, state); return bytestream_create_io_request(stream, ASYNC_STREAM_OP_WRITE, data, size, callback, state); } @@ -4094,22 +4104,44 @@ static HRESULT WINAPI bytestream_EndWrite(IMFByteStream *iface, IMFAsyncResult * return bytestream_complete_io_request(stream, ASYNC_STREAM_OP_WRITE, result, written); } -static HRESULT WINAPI bytestream_Seek(IMFByteStream *iface, MFBYTESTREAM_SEEK_ORIGIN seek, LONGLONG offset, - DWORD flags, QWORD *current) +static HRESULT WINAPI bytestream_Seek(IMFByteStream *iface, MFBYTESTREAM_SEEK_ORIGIN origin, LONGLONG offset, + DWORD flags, QWORD *current) { - FIXME("%p, %u, %s, 0x%08lx, %p\n", iface, seek, wine_dbgstr_longlong(offset), flags, current); + struct bytestream *stream = impl_from_IMFByteStream(iface); + HRESULT hr = S_OK; - return E_NOTIMPL; + TRACE("%p, %u, %s, 0x%08x, %p\n", iface, origin, wine_dbgstr_longlong(offset), flags, current); + + EnterCriticalSection(&stream->cs); + + switch (origin) + { + case msoBegin: + stream->position = offset; + break; + case msoCurrent: + stream->position += offset; + break; + default: + WARN("Unknown origin mode %d.\n", origin); + hr = E_INVALIDARG; + } + + *current = stream->position; + + LeaveCriticalSection(&stream->cs); + + return hr; } -static HRESULT WINAPI bytestream_Flush(IMFByteStream *iface) +static HRESULT WINAPI bytestream_file_Flush(IMFByteStream *iface) { FIXME("%p\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI bytestream_Close(IMFByteStream *iface) +static HRESULT WINAPI bytestream_file_Close(IMFByteStream *iface) { FIXME("%p\n", iface); @@ -4134,21 +4166,21 @@ static const IMFByteStreamVtbl bytestream_file_vtbl = bytestream_QueryInterface, bytestream_AddRef, bytestream_Release, - bytestream_GetCapabilities, + bytestream_file_GetCapabilities, bytestream_file_GetLength, - bytestream_SetLength, - bytestream_file_GetCurrentPosition, + bytestream_file_SetLength, + bytestream_GetCurrentPosition, bytestream_SetCurrentPosition, bytestream_file_IsEndOfStream, bytestream_file_Read, bytestream_BeginRead, bytestream_EndRead, - bytestream_Write, + bytestream_file_Write, bytestream_BeginWrite, bytestream_EndWrite, bytestream_Seek, - bytestream_Flush, - bytestream_Close + bytestream_file_Flush, + bytestream_file_Close }; static HRESULT WINAPI bytestream_stream_GetLength(IMFByteStream *iface, QWORD *length) @@ -4185,17 +4217,6 @@ static HRESULT WINAPI bytestream_stream_SetLength(IMFByteStream *iface, QWORD le return hr; } -static HRESULT WINAPI bytestream_stream_GetCurrentPosition(IMFByteStream *iface, QWORD *position) -{ - struct bytestream *stream = impl_from_IMFByteStream(iface); - - TRACE("%p, %p.\n", iface, position); - - *position = stream->position; - - return S_OK; -} - static HRESULT WINAPI bytestream_stream_IsEndOfStream(IMFByteStream *iface, BOOL *ret) { struct bytestream *stream = impl_from_IMFByteStream(iface); @@ -4220,7 +4241,7 @@ static HRESULT WINAPI bytestream_stream_Read(IMFByteStream *iface, BYTE *buffer, LARGE_INTEGER position; HRESULT hr; - TRACE("%p, %p, %lu, %p.\n", iface, buffer, size, read_len); + TRACE("%p, %p, %u, %p.\n", iface, buffer, size, read_len); EnterCriticalSection(&stream->cs); @@ -4242,7 +4263,7 @@ static HRESULT WINAPI bytestream_stream_Write(IMFByteStream *iface, const BYTE * LARGE_INTEGER position; HRESULT hr; - TRACE("%p, %p, %lu, %p.\n", iface, buffer, size, written); + TRACE("%p, %p, %u, %p.\n", iface, buffer, size, written); EnterCriticalSection(&stream->cs); @@ -4258,36 +4279,6 @@ static HRESULT WINAPI bytestream_stream_Write(IMFByteStream *iface, const BYTE * return hr; } -static HRESULT WINAPI bytestream_stream_Seek(IMFByteStream *iface, MFBYTESTREAM_SEEK_ORIGIN origin, LONGLONG offset, - DWORD flags, QWORD *current) -{ - struct bytestream *stream = impl_from_IMFByteStream(iface); - HRESULT hr = S_OK; - - TRACE("%p, %u, %s, %#lx, %p.\n", iface, origin, wine_dbgstr_longlong(offset), flags, current); - - EnterCriticalSection(&stream->cs); - - switch (origin) - { - case msoBegin: - stream->position = offset; - break; - case msoCurrent: - stream->position += offset; - break; - default: - WARN("Unknown origin mode %d.\n", origin); - hr = E_INVALIDARG; - } - - *current = stream->position; - - LeaveCriticalSection(&stream->cs); - - return hr; -} - static HRESULT WINAPI bytestream_stream_Flush(IMFByteStream *iface) { struct bytestream *stream = impl_from_IMFByteStream(iface); @@ -4312,7 +4303,7 @@ static const IMFByteStreamVtbl bytestream_stream_vtbl = bytestream_stream_GetCapabilities, bytestream_stream_GetLength, bytestream_stream_SetLength, - bytestream_stream_GetCurrentPosition, + bytestream_GetCurrentPosition, bytestream_SetCurrentPosition, bytestream_stream_IsEndOfStream, bytestream_stream_Read, @@ -4321,7 +4312,7 @@ static const IMFByteStreamVtbl bytestream_stream_vtbl = bytestream_stream_Write, bytestream_BeginWrite, bytestream_EndWrite, - bytestream_stream_Seek, + bytestream_Seek, bytestream_stream_Flush, bytestream_stream_Close, }; @@ -4386,11 +4377,10 @@ static const IMFAttributesVtbl bytestream_attributes_vtbl = mfattributes_CopyAllItems }; -static HRESULT WINAPI bytestream_stream_read_callback_Invoke(IRtwqAsyncCallback *iface, IRtwqAsyncResult *result) +static HRESULT WINAPI bytestream_read_callback_Invoke(IRtwqAsyncCallback *iface, IRtwqAsyncResult *result) { struct bytestream *stream = impl_from_read_callback_IRtwqAsyncCallback(iface); struct async_stream_op *op; - LARGE_INTEGER position; IUnknown *object; HRESULT hr; @@ -4401,13 +4391,8 @@ static HRESULT WINAPI bytestream_stream_read_callback_Invoke(IRtwqAsyncCallback EnterCriticalSection(&stream->cs); - position.QuadPart = op->position; - if (SUCCEEDED(hr = IStream_Seek(stream->stream, position, STREAM_SEEK_SET, NULL))) - { - if (SUCCEEDED(hr = IStream_Read(stream->stream, op->u.dest, op->requested_length, &op->actual_length))) - stream->position += op->actual_length; - } - + hr = IMFByteStream_Read(&stream->IMFByteStream_iface, op->u.dest, op->requested_length, &op->actual_length); + if(FAILED(hr)) TRACE("Read failed: %#lx\n", hr); IMFAsyncResult_SetStatus(op->caller, hr); list_add_tail(&stream->pending, &op->entry); @@ -4418,11 +4403,10 @@ static HRESULT WINAPI bytestream_stream_read_callback_Invoke(IRtwqAsyncCallback return S_OK; } -static HRESULT WINAPI bytestream_stream_write_callback_Invoke(IRtwqAsyncCallback *iface, IRtwqAsyncResult *result) +static HRESULT WINAPI bytestream_write_callback_Invoke(IRtwqAsyncCallback *iface, IRtwqAsyncResult *result) { struct bytestream *stream = impl_from_read_callback_IRtwqAsyncCallback(iface); struct async_stream_op *op; - LARGE_INTEGER position; IUnknown *object; HRESULT hr; @@ -4433,13 +4417,8 @@ static HRESULT WINAPI bytestream_stream_write_callback_Invoke(IRtwqAsyncCallback EnterCriticalSection(&stream->cs); - position.QuadPart = op->position; - if (SUCCEEDED(hr = IStream_Seek(stream->stream, position, STREAM_SEEK_SET, NULL))) - { - if (SUCCEEDED(hr = IStream_Write(stream->stream, op->u.src, op->requested_length, &op->actual_length))) - stream->position += op->actual_length; - } - + hr = IMFByteStream_Write(&stream->IMFByteStream_iface, op->u.src, op->requested_length, &op->actual_length); + if(FAILED(hr)) TRACE("Write failed: %#lx\n", hr); IMFAsyncResult_SetStatus(op->caller, hr); list_add_tail(&stream->pending, &op->entry); @@ -4450,22 +4429,22 @@ static HRESULT WINAPI bytestream_stream_write_callback_Invoke(IRtwqAsyncCallback return S_OK; } -static const IRtwqAsyncCallbackVtbl bytestream_stream_read_callback_vtbl = +static const IRtwqAsyncCallbackVtbl bytestream_read_callback_vtbl = { bytestream_callback_QueryInterface, bytestream_read_callback_AddRef, bytestream_read_callback_Release, bytestream_callback_GetParameters, - bytestream_stream_read_callback_Invoke, + bytestream_read_callback_Invoke, }; -static const IRtwqAsyncCallbackVtbl bytestream_stream_write_callback_vtbl = +static const IRtwqAsyncCallbackVtbl bytestream_write_callback_vtbl = { bytestream_callback_QueryInterface, bytestream_write_callback_AddRef, bytestream_write_callback_Release, bytestream_callback_GetParameters, - bytestream_stream_write_callback_Invoke, + bytestream_write_callback_Invoke, }; /*********************************************************************** @@ -4491,8 +4470,8 @@ HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **byt object->IMFByteStream_iface.lpVtbl = &bytestream_stream_vtbl; object->attributes.IMFAttributes_iface.lpVtbl = &bytestream_attributes_vtbl; - object->read_callback.lpVtbl = &bytestream_stream_read_callback_vtbl; - object->write_callback.lpVtbl = &bytestream_stream_write_callback_vtbl; + object->read_callback.lpVtbl = &bytestream_read_callback_vtbl; + object->write_callback.lpVtbl = &bytestream_write_callback_vtbl; InitializeCriticalSection(&object->cs); list_init(&object->pending); @@ -4516,38 +4495,6 @@ HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **byt return S_OK; } -static HRESULT WINAPI bytestream_file_read_callback_Invoke(IRtwqAsyncCallback *iface, IRtwqAsyncResult *result) -{ - FIXME("%p, %p.\n", iface, result); - - return E_NOTIMPL; -} - -static HRESULT WINAPI bytestream_file_write_callback_Invoke(IRtwqAsyncCallback *iface, IRtwqAsyncResult *result) -{ - FIXME("%p, %p.\n", iface, result); - - return E_NOTIMPL; -} - -static const IRtwqAsyncCallbackVtbl bytestream_file_read_callback_vtbl = -{ - bytestream_callback_QueryInterface, - bytestream_read_callback_AddRef, - bytestream_read_callback_Release, - bytestream_callback_GetParameters, - bytestream_file_read_callback_Invoke, -}; - -static const IRtwqAsyncCallbackVtbl bytestream_file_write_callback_vtbl = -{ - bytestream_callback_QueryInterface, - bytestream_write_callback_AddRef, - bytestream_write_callback_Release, - bytestream_callback_GetParameters, - bytestream_file_write_callback_Invoke, -}; - static HRESULT WINAPI bytestream_file_getservice_QueryInterface(IMFGetService *iface, REFIID riid, void **obj) { struct bytestream *stream = impl_bytestream_from_IMFGetService(iface); @@ -4582,8 +4529,11 @@ static const IMFGetServiceVtbl bytestream_file_getservice_vtbl = bytestream_file_getservice_GetService, }; -static HRESULT create_file_bytestream(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE openmode, MF_FILE_FLAGS flags, - const WCHAR *path, BOOL is_tempfile, IMFByteStream **bytestream) +/*********************************************************************** + * MFCreateFile (mfplat.@) + */ +HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE openmode, MF_FILE_FLAGS flags, + LPCWSTR url, IMFByteStream **bytestream) { DWORD capabilities = MFBYTESTREAM_IS_SEEKABLE | MFBYTESTREAM_DOES_NOT_USE_NETWORK; DWORD filecreation_disposition = 0, fileaccessmode = 0, fileattributes = 0; @@ -4593,6 +4543,8 @@ static HRESULT create_file_bytestream(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPE HANDLE file; HRESULT hr; + TRACE("%d, %d, %#x, %s, %p.\n", accessmode, openmode, flags, debugstr_w(url), bytestream); + switch (accessmode) { case MF_ACCESSMODE_READ: @@ -4631,12 +4583,12 @@ static HRESULT create_file_bytestream(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPE if (flags & MF_FILEFLAGS_NOBUFFERING) fileattributes |= FILE_FLAG_NO_BUFFERING; - if (is_tempfile) - fileattributes |= FILE_FLAG_DELETE_ON_CLOSE; /* Open HANDLE to file */ - file = CreateFileW(path, fileaccessmode, filesharemode, NULL, filecreation_disposition, fileattributes, 0); - if (file == INVALID_HANDLE_VALUE) + file = CreateFileW(url, fileaccessmode, filesharemode, NULL, + filecreation_disposition, fileattributes, 0); + + if(file == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError()); if (!(object = calloc(1, sizeof(*object)))) @@ -4654,68 +4606,26 @@ static HRESULT create_file_bytestream(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPE object->IMFByteStream_iface.lpVtbl = &bytestream_file_vtbl; object->attributes.IMFAttributes_iface.lpVtbl = &bytestream_attributes_vtbl; object->IMFGetService_iface.lpVtbl = &bytestream_file_getservice_vtbl; - object->read_callback.lpVtbl = &bytestream_file_read_callback_vtbl; - object->write_callback.lpVtbl = &bytestream_file_write_callback_vtbl; + object->read_callback.lpVtbl = &bytestream_read_callback_vtbl; + object->write_callback.lpVtbl = &bytestream_write_callback_vtbl; InitializeCriticalSection(&object->cs); list_init(&object->pending); object->capabilities = capabilities; object->hfile = file; - if (!is_tempfile && GetFileTime(file, NULL, NULL, &writetime)) + if (GetFileTime(file, NULL, NULL, &writetime)) { IMFAttributes_SetBlob(&object->attributes.IMFAttributes_iface, &MF_BYTESTREAM_LAST_MODIFIED_TIME, (const UINT8 *)&writetime, sizeof(writetime)); } - IMFAttributes_SetString(&object->attributes.IMFAttributes_iface, &MF_BYTESTREAM_ORIGIN_NAME, path); + IMFAttributes_SetString(&object->attributes.IMFAttributes_iface, &MF_BYTESTREAM_ORIGIN_NAME, url); *bytestream = &object->IMFByteStream_iface; return S_OK; } -/*********************************************************************** - * MFCreateFile (mfplat.@) - */ -HRESULT WINAPI MFCreateFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE openmode, MF_FILE_FLAGS flags, - const WCHAR *path, IMFByteStream **bytestream) -{ - TRACE("%d, %d, %#x, %s, %p.\n", accessmode, openmode, flags, debugstr_w(path), bytestream); - - return create_file_bytestream(accessmode, openmode, flags, path, FALSE, bytestream); -} - -/*********************************************************************** - * MFCreateTempFile (mfplat.@) - */ -HRESULT WINAPI MFCreateTempFile(MF_FILE_ACCESSMODE accessmode, MF_FILE_OPENMODE openmode, MF_FILE_FLAGS flags, - IMFByteStream **bytestream) -{ - WCHAR name[24], tmppath[MAX_PATH], *path; - ULONG64 rnd; - size_t len; - HRESULT hr; - - TRACE("%d, %d, %#x, %p.\n", accessmode, openmode, flags, bytestream); - - BCryptGenRandom(NULL, (UCHAR *)&rnd, sizeof(rnd), BCRYPT_USE_SYSTEM_PREFERRED_RNG); - swprintf(name, ARRAY_SIZE(name), L"MFP%llX.TMP", rnd); - GetTempPathW(ARRAY_SIZE(tmppath), tmppath); - - len = wcslen(tmppath) + wcslen(name) + 2; - if (!(path = malloc(len * sizeof(*path)))) - return E_OUTOFMEMORY; - - wcscpy(path, tmppath); - PathCchAppend(path, len, name); - - hr = create_file_bytestream(accessmode, openmode, flags, path, TRUE, bytestream); - - free(path); - - return hr; -} - struct bytestream_wrapper { IMFByteStreamCacheControl IMFByteStreamCacheControl_iface; @@ -4834,7 +4744,7 @@ static ULONG WINAPI bytestream_wrapper_AddRef(IMFByteStream *iface) struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFByteStream(iface); ULONG refcount = InterlockedIncrement(&wrapper->refcount); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); return refcount; } @@ -4844,7 +4754,7 @@ static ULONG WINAPI bytestream_wrapper_Release(IMFByteStream *iface) struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFByteStream(iface); ULONG refcount = InterlockedDecrement(&wrapper->refcount); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); if (!refcount) { @@ -4942,7 +4852,7 @@ static HRESULT WINAPI bytestream_wrapper_Read(IMFByteStream *iface, BYTE *data, { struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFByteStream(iface); - TRACE("%p, %p, %lu, %p.\n", iface, data, count, byte_read); + TRACE("%p, %p, %u, %p.\n", iface, data, count, byte_read); return wrapper->is_closed ? MF_E_INVALIDREQUEST : IMFByteStream_Read(wrapper->stream, data, count, byte_read); @@ -4953,7 +4863,7 @@ static HRESULT WINAPI bytestream_wrapper_BeginRead(IMFByteStream *iface, BYTE *d { struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFByteStream(iface); - TRACE("%p, %p, %lu, %p, %p.\n", iface, data, size, callback, state); + TRACE("%p, %p, %u, %p, %p.\n", iface, data, size, callback, state); return wrapper->is_closed ? MF_E_INVALIDREQUEST : IMFByteStream_BeginRead(wrapper->stream, data, size, callback, state); @@ -4973,7 +4883,7 @@ static HRESULT WINAPI bytestream_wrapper_Write(IMFByteStream *iface, const BYTE { struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFByteStream(iface); - TRACE("%p, %p, %lu, %p.\n", iface, data, count, written); + TRACE("%p, %p, %u, %p.\n", iface, data, count, written); return wrapper->is_closed ? MF_E_INVALIDREQUEST : IMFByteStream_Write(wrapper->stream, data, count, written); @@ -4984,7 +4894,7 @@ static HRESULT WINAPI bytestream_wrapper_BeginWrite(IMFByteStream *iface, const { struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFByteStream(iface); - TRACE("%p, %p, %lu, %p, %p.\n", iface, data, size, callback, state); + TRACE("%p, %p, %u, %p, %p.\n", iface, data, size, callback, state); return wrapper->is_closed ? MF_E_INVALIDREQUEST : IMFByteStream_BeginWrite(wrapper->stream, data, size, callback, state); @@ -5005,7 +4915,7 @@ static HRESULT WINAPI bytestream_wrapper_Seek(IMFByteStream *iface, MFBYTESTREAM { struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFByteStream(iface); - TRACE("%p, %u, %s, %#lx, %p.\n", iface, seek, wine_dbgstr_longlong(offset), flags, current); + TRACE("%p, %u, %s, %#x, %p.\n", iface, seek, wine_dbgstr_longlong(offset), flags, current); return wrapper->is_closed ? MF_E_INVALIDREQUEST : IMFByteStream_Seek(wrapper->stream, seek, offset, flags, current); @@ -5226,7 +5136,7 @@ static HRESULT WINAPI bytestream_wrapper_events_GetEvent(IMFMediaEventGenerator { struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFMediaEventGenerator(iface); - TRACE("%p, %#lx, %p.\n", iface, flags, event); + TRACE("%p, %#x, %p.\n", iface, flags, event); return IMFMediaEventGenerator_GetEvent(wrapper->event_generator, flags, event); } @@ -5254,7 +5164,7 @@ static HRESULT WINAPI bytestream_wrapper_events_QueueEvent(IMFMediaEventGenerato { struct bytestream_wrapper *wrapper = impl_wrapper_from_IMFMediaEventGenerator(iface); - TRACE("%p, %ld, %s, %#lx, %s.\n", iface, type, debugstr_guid(ext_type), hr, debugstr_propvar(value)); + TRACE("%p, %d, %s, %#x, %s.\n", iface, type, debugstr_guid(ext_type), hr, debugstr_propvar(value)); return IMFMediaEventGenerator_QueueEvent(wrapper->event_generator, type, ext_type, hr, value); } @@ -5357,7 +5267,7 @@ static HRESULT WINAPI bytestream_wrapper_propstore_GetAt(IPropertyStore *iface, { struct bytestream_wrapper *wrapper = impl_wrapper_from_IPropertyStore(iface); - TRACE("%p, %lu, %p.\n", iface, prop, key); + TRACE("%p, %u, %p.\n", iface, prop, key); return IPropertyStore_GetAt(wrapper->propstore, prop, key); } @@ -5803,39 +5713,39 @@ static ULONG WINAPI MFPluginControl_Release(IMFPluginControl *iface) static HRESULT WINAPI MFPluginControl_GetPreferredClsid(IMFPluginControl *iface, DWORD plugin_type, const WCHAR *selector, CLSID *clsid) { - FIXME("(%ld %s %p)\n", plugin_type, debugstr_w(selector), clsid); + FIXME("(%d %s %p)\n", plugin_type, debugstr_w(selector), clsid); return E_NOTIMPL; } static HRESULT WINAPI MFPluginControl_GetPreferredClsidByIndex(IMFPluginControl *iface, DWORD plugin_type, DWORD index, WCHAR **selector, CLSID *clsid) { - FIXME("(%ld %ld %p %p)\n", plugin_type, index, selector, clsid); + FIXME("(%d %d %p %p)\n", plugin_type, index, selector, clsid); return E_NOTIMPL; } static HRESULT WINAPI MFPluginControl_SetPreferredClsid(IMFPluginControl *iface, DWORD plugin_type, const WCHAR *selector, const CLSID *clsid) { - FIXME("(%ld %s %s)\n", plugin_type, debugstr_w(selector), debugstr_guid(clsid)); + FIXME("(%d %s %s)\n", plugin_type, debugstr_w(selector), debugstr_guid(clsid)); return E_NOTIMPL; } static HRESULT WINAPI MFPluginControl_IsDisabled(IMFPluginControl *iface, DWORD plugin_type, REFCLSID clsid) { - FIXME("(%ld %s)\n", plugin_type, debugstr_guid(clsid)); + FIXME("(%d %s)\n", plugin_type, debugstr_guid(clsid)); return E_NOTIMPL; } static HRESULT WINAPI MFPluginControl_GetDisabledByIndex(IMFPluginControl *iface, DWORD plugin_type, DWORD index, CLSID *clsid) { - FIXME("(%ld %ld %p)\n", plugin_type, index, clsid); + FIXME("(%d %d %p)\n", plugin_type, index, clsid); return E_NOTIMPL; } static HRESULT WINAPI MFPluginControl_SetDisabled(IMFPluginControl *iface, DWORD plugin_type, REFCLSID clsid, BOOL disabled) { - FIXME("(%ld %s %x)\n", plugin_type, debugstr_guid(clsid), disabled); + FIXME("(%d %s %x)\n", plugin_type, debugstr_guid(clsid), disabled); return E_NOTIMPL; } @@ -6137,9 +6047,8 @@ static const IRtwqAsyncCallbackVtbl source_resolver_callback_url_vtbl = static HRESULT resolver_create_registered_handler(HKEY hkey, REFIID riid, void **handler) { - DWORD name_length, type; + unsigned int j = 0, name_length, type; HRESULT hr = E_FAIL; - unsigned int j = 0; WCHAR clsidW[39]; CLSID clsid; @@ -6162,15 +6071,40 @@ static HRESULT resolver_create_registered_handler(HKEY hkey, REFIID riid, void * return hr; } -static HRESULT resolver_create_bytestream_handler(IMFByteStream *stream, DWORD flags, const WCHAR *mime, - const WCHAR *extension, IMFByteStreamHandler **handler) +static HRESULT resolver_get_bytestream_handler(IMFByteStream *stream, const WCHAR *url, DWORD flags, + IMFByteStreamHandler **handler) { static const HKEY hkey_roots[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }; + WCHAR *mimeW = NULL, *urlW = NULL; + IMFAttributes *attributes; + const WCHAR *url_ext; HRESULT hr = E_FAIL; unsigned int i, j; + UINT32 length; *handler = NULL; + /* MIME type */ + if (SUCCEEDED(IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes))) + { + IMFAttributes_GetAllocatedString(attributes, &MF_BYTESTREAM_CONTENT_TYPE, &mimeW, &length); + if (!url) + { + IMFAttributes_GetAllocatedString(attributes, &MF_BYTESTREAM_ORIGIN_NAME, &urlW, &length); + url = urlW; + } + IMFAttributes_Release(attributes); + } + + /* Extension */ + url_ext = url ? wcsrchr(url, '.') : NULL; + + if (!url_ext && !mimeW) + { + CoTaskMemFree(urlW); + return MF_E_UNSUPPORTED_BYTESTREAM_TYPE; + } + if (!(flags & MF_RESOLUTION_DISABLE_LOCAL_PLUGINS)) { struct local_handler *local_handler; @@ -6179,8 +6113,8 @@ static HRESULT resolver_create_bytestream_handler(IMFByteStream *stream, DWORD f LIST_FOR_EACH_ENTRY(local_handler, &local_bytestream_handlers, struct local_handler, entry) { - if ((mime && !lstrcmpiW(mime, local_handler->u.bytestream.mime)) - || (extension && !lstrcmpiW(extension, local_handler->u.bytestream.extension))) + if ((mimeW && !lstrcmpiW(mimeW, local_handler->u.bytestream.mime)) + || (url_ext && !lstrcmpiW(url_ext, local_handler->u.bytestream.extension))) { if (SUCCEEDED(hr = IMFActivate_ActivateObject(local_handler->activate, &IID_IMFByteStreamHandler, (void **)handler))) @@ -6191,12 +6125,16 @@ static HRESULT resolver_create_bytestream_handler(IMFByteStream *stream, DWORD f LeaveCriticalSection(&local_handlers_section); if (*handler) + { + CoTaskMemFree(mimeW); + CoTaskMemFree(urlW); return hr; + } } for (i = 0, hr = E_FAIL; i < ARRAY_SIZE(hkey_roots); ++i) { - const WCHAR *namesW[2] = { mime, extension }; + const WCHAR *namesW[2] = { mimeW, url_ext }; HKEY hkey, hkey_handler; if (RegOpenKeyW(hkey_roots[i], L"Software\\Microsoft\\Windows Media Foundation\\ByteStreamHandlers", &hkey)) @@ -6223,161 +6161,14 @@ static HRESULT resolver_create_bytestream_handler(IMFByteStream *stream, DWORD f break; } - return hr; -} - -static HRESULT resolver_get_bytestream_url_hint(IMFByteStream *stream, WCHAR const **url) -{ - static const unsigned char asfmagic[] = {0x30,0x26,0xb2,0x75,0x8e,0x66,0xcf,0x11,0xa6,0xd9,0x00,0xaa,0x00,0x62,0xce,0x6c}; - static const unsigned char wavmagic[] = { 'R', 'I', 'F', 'F',0x00,0x00,0x00,0x00, 'W', 'A', 'V', 'E', 'f', 'm', 't', ' '}; - static const unsigned char wavmask[] = {0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; - static const unsigned char isommagic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'i', 's', 'o', 'm',0x00,0x00,0x00,0x00}; - static const unsigned char mp4_magic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'M', 'S', 'N', 'V',0x00,0x00,0x00,0x00}; - static const unsigned char mp42magic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'm', 'p', '4', '2',0x00,0x00,0x00,0x00}; - static const unsigned char mp4vmagic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'M', '4', 'V', ' ',0x00,0x00,0x00,0x00}; - static const unsigned char mp4mask[] = {0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00}; - static const struct stream_content_url_hint - { - const unsigned char *magic; - const WCHAR *url; - const unsigned char *mask; - } - url_hints[] = - { - { asfmagic, L".asf" }, - { wavmagic, L".wav", wavmask }, - { isommagic, L".mp4", mp4mask }, - { mp42magic, L".mp4", mp4mask }, - { mp4_magic, L".mp4", mp4mask }, - { mp4vmagic, L".m4v", mp4mask }, - }; - unsigned char buffer[4 * sizeof(unsigned int)], pattern[4 * sizeof(unsigned int)]; - IMFAttributes *attributes; - DWORD length = 0, caps = 0; - unsigned int i, j; - QWORD position; - HRESULT hr; - - *url = NULL; - - if (SUCCEEDED(IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes))) - { - UINT32 string_length = 0; - IMFAttributes_GetStringLength(attributes, &MF_BYTESTREAM_CONTENT_TYPE, &string_length); - IMFAttributes_Release(attributes); - - if (string_length) - return S_OK; - } - - if (FAILED(hr = IMFByteStream_GetCapabilities(stream, &caps))) - return hr; - - if (!(caps & MFBYTESTREAM_IS_SEEKABLE)) - return MF_E_UNSUPPORTED_BYTESTREAM_TYPE; - - if (FAILED(hr = IMFByteStream_GetCurrentPosition(stream, &position))) - return hr; - - hr = IMFByteStream_Read(stream, buffer, sizeof(buffer), &length); - IMFByteStream_SetCurrentPosition(stream, position); if (FAILED(hr)) - return hr; - - if (length < sizeof(buffer)) - return S_OK; - - for (i = 0; i < ARRAY_SIZE(url_hints); ++i) - { - memcpy(pattern, buffer, sizeof(buffer)); - if (url_hints[i].mask) - { - unsigned int *mask = (unsigned int *)url_hints[i].mask; - unsigned int *data = (unsigned int *)pattern; - - for (j = 0; j < sizeof(buffer) / sizeof(unsigned int); ++j) - data[j] &= mask[j]; - - } - if (!memcmp(pattern, url_hints[i].magic, sizeof(pattern))) - { - *url = url_hints[i].url; - break; - } - } - - if (*url) - TRACE("Content type guessed as %s from %s.\n", debugstr_w(*url), debugstr_an((char *)buffer, length)); - else - WARN("Unrecognized content type %s.\n", debugstr_an((char *)buffer, length)); - - return S_OK; -} - -static HRESULT resolver_create_gstreamer_handler(IMFByteStreamHandler **handler) -{ - static const GUID CLSID_GStreamerByteStreamHandler = {0x317df618, 0x5e5a, 0x468a, {0x9f, 0x15, 0xd8, 0x27, 0xa9, 0xa0, 0x81, 0x62}}; - return CoCreateInstance(&CLSID_GStreamerByteStreamHandler, NULL, CLSCTX_INPROC_SERVER, &IID_IMFByteStreamHandler, (void **)handler); -} - -static HRESULT resolver_get_bytestream_handler(IMFByteStream *stream, const WCHAR *url, DWORD flags, - IMFByteStreamHandler **handler) -{ - WCHAR *mimeW = NULL, *urlW = NULL; - IMFAttributes *attributes; - const WCHAR *url_ext; - HRESULT hr = E_FAIL; - UINT32 length; - - *handler = NULL; - - /* MIME type */ - if (SUCCEEDED(IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes))) { - IMFAttributes_GetAllocatedString(attributes, &MF_BYTESTREAM_CONTENT_TYPE, &mimeW, &length); - if (!url) - { - IMFAttributes_GetAllocatedString(attributes, &MF_BYTESTREAM_ORIGIN_NAME, &urlW, &length); - url = urlW; - } - IMFAttributes_Release(attributes); - } - - /* Extension */ - url_ext = url ? wcsrchr(url, '.') : NULL; - - /* If content type was provided by the caller, it's tried first. Otherwise an attempt to deduce - content type from the content itself is made. - - TODO: wine specific fallback to predefined handler could be replaced by normally registering - this handler for all possible types. - */ - - if (url_ext || mimeW) - { - hr = resolver_create_bytestream_handler(stream, flags, mimeW, url_ext, handler); - - if (FAILED(hr)) - hr = resolver_create_gstreamer_handler(handler); + static const GUID CLSID_GStreamerByteStreamHandler = {0x317df618, 0x5e5a, 0x468a, {0x9f, 0x15, 0xd8, 0x27, 0xa9, 0xa0, 0x81, 0x62}}; + hr = CoCreateInstance(&CLSID_GStreamerByteStreamHandler, NULL, CLSCTX_INPROC_SERVER, &IID_IMFByteStreamHandler, (void **)handler); } CoTaskMemFree(mimeW); CoTaskMemFree(urlW); - - if (SUCCEEDED(hr)) - return hr; - - if (!(flags & MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE)) - return MF_E_UNSUPPORTED_BYTESTREAM_TYPE; - - if (FAILED(hr = resolver_get_bytestream_url_hint(stream, &url_ext))) - return hr; - - hr = resolver_create_bytestream_handler(stream, flags, NULL, url_ext, handler); - - if (FAILED(hr)) - hr = resolver_create_gstreamer_handler(handler); - return hr; } @@ -6387,7 +6178,7 @@ static HRESULT resolver_create_scheme_handler(const WCHAR *scheme, DWORD flags, HRESULT hr = MF_E_UNSUPPORTED_SCHEME; unsigned int i; - TRACE("%s, %#lx, %p.\n", debugstr_w(scheme), flags, handler); + TRACE("%s, %#x, %p.\n", debugstr_w(scheme), flags, handler); *handler = NULL; @@ -6469,11 +6260,10 @@ static HRESULT resolver_get_scheme_handler(const WCHAR *url, DWORD flags, IMFSch if (ptr == url || *ptr != ':') { url = fileschemeW; - len = ARRAY_SIZE(fileschemeW) - 1; + ptr = fileschemeW + ARRAY_SIZE(fileschemeW) - 1; } - else - len = ptr - url + 1; + len = ptr - url; scheme = malloc((len + 1) * sizeof(WCHAR)); if (!scheme) return E_OUTOFMEMORY; @@ -6558,7 +6348,7 @@ static ULONG WINAPI source_resolver_AddRef(IMFSourceResolver *iface) struct source_resolver *resolver = impl_from_IMFSourceResolver(iface); ULONG refcount = InterlockedIncrement(&resolver->refcount); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); return refcount; } @@ -6569,7 +6359,7 @@ static ULONG WINAPI source_resolver_Release(IMFSourceResolver *iface) ULONG refcount = InterlockedDecrement(&resolver->refcount); struct resolver_queued_result *result, *result2; - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); if (!refcount) { @@ -6596,7 +6386,7 @@ static HRESULT WINAPI source_resolver_CreateObjectFromURL(IMFSourceResolver *ifa RTWQASYNCRESULT *data; HRESULT hr; - TRACE("%p, %s, %#lx, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, obj_type, object); + TRACE("%p, %s, %#x, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, obj_type, object); if (!url || !obj_type || !object) return E_POINTER; @@ -6637,7 +6427,7 @@ static HRESULT WINAPI source_resolver_CreateObjectFromByteStream(IMFSourceResolv RTWQASYNCRESULT *data; HRESULT hr; - TRACE("%p, %p, %s, %#lx, %p, %p, %p.\n", iface, stream, debugstr_w(url), flags, props, obj_type, object); + TRACE("%p, %p, %s, %#x, %p, %p, %p.\n", iface, stream, debugstr_w(url), flags, props, obj_type, object); if (!stream || !obj_type || !object) return E_POINTER; @@ -6678,7 +6468,7 @@ static HRESULT WINAPI source_resolver_BeginCreateObjectFromURL(IMFSourceResolver IRtwqAsyncResult *result; HRESULT hr; - TRACE("%p, %s, %#lx, %p, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, cancel_cookie, callback, state); + TRACE("%p, %s, %#x, %p, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, cancel_cookie, callback, state); if (FAILED(hr = resolver_get_scheme_handler(url, flags, &handler))) return hr; @@ -6722,7 +6512,7 @@ static HRESULT WINAPI source_resolver_BeginCreateObjectFromByteStream(IMFSourceR IRtwqAsyncResult *result; HRESULT hr; - TRACE("%p, %p, %s, %#lx, %p, %p, %p, %p.\n", iface, stream, debugstr_w(url), flags, props, cancel_cookie, + TRACE("%p, %p, %s, %#x, %p, %p, %p, %p.\n", iface, stream, debugstr_w(url), flags, props, cancel_cookie, callback, state); if (FAILED(hr = resolver_get_bytestream_handler(stream, url, flags, &handler))) @@ -6868,7 +6658,7 @@ static ULONG WINAPI mfmediaevent_AddRef(IMFMediaEvent *iface) struct media_event *event = impl_from_IMFMediaEvent(iface); ULONG refcount = InterlockedIncrement(&event->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -6878,7 +6668,7 @@ static ULONG WINAPI mfmediaevent_Release(IMFMediaEvent *iface) struct media_event *event = impl_from_IMFMediaEvent(iface); ULONG refcount = InterlockedDecrement(&event->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -7258,7 +7048,7 @@ HRESULT WINAPI MFCreateMediaEvent(MediaEventType type, REFGUID extended_type, HR struct media_event *object; HRESULT hr; - TRACE("%s, %s, %#lx, %s, %p.\n", debugstr_eventid(type), debugstr_guid(extended_type), status, + TRACE("%s, %s, %#x, %s, %p.\n", debugstr_eventid(type), debugstr_guid(extended_type), status, debugstr_propvar(value), event); object = malloc(sizeof(*object)); @@ -7367,7 +7157,7 @@ static ULONG WINAPI eventqueue_AddRef(IMFMediaEventQueue *iface) struct event_queue *queue = impl_from_IMFMediaEventQueue(iface); ULONG refcount = InterlockedIncrement(&queue->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -7377,7 +7167,7 @@ static ULONG WINAPI eventqueue_Release(IMFMediaEventQueue *iface) struct event_queue *queue = impl_from_IMFMediaEventQueue(iface); ULONG refcount = InterlockedDecrement(&queue->refcount); - TRACE("%p, refcount %lu.\n", queue, refcount); + TRACE("%p, refcount %u.\n", queue, refcount); if (!refcount) { @@ -7542,7 +7332,7 @@ static HRESULT WINAPI eventqueue_QueueEventParamVar(IMFMediaEventQueue *iface, M IMFMediaEvent *event; HRESULT hr; - TRACE("%p, %s, %s, %#lx, %s\n", iface, debugstr_eventid(event_type), debugstr_guid(extended_type), status, + TRACE("%p, %s, %s, %#x, %s\n", iface, debugstr_eventid(event_type), debugstr_guid(extended_type), status, debugstr_propvar(value)); if (FAILED(hr = MFCreateMediaEvent(event_type, extended_type, status, value, &event))) @@ -7561,7 +7351,7 @@ static HRESULT WINAPI eventqueue_QueueEventParamUnk(IMFMediaEventQueue *iface, M PROPVARIANT value; HRESULT hr; - TRACE("%p, %s, %s, %#lx, %p.\n", iface, debugstr_eventid(event_type), debugstr_guid(extended_type), status, unk); + TRACE("%p, %s, %s, %#x, %p.\n", iface, debugstr_eventid(event_type), debugstr_guid(extended_type), status, unk); value.vt = VT_UNKNOWN; value.punkVal = unk; @@ -7684,7 +7474,7 @@ static ULONG WINAPI collection_AddRef(IMFCollection *iface) struct collection *collection = impl_from_IMFCollection(iface); ULONG refcount = InterlockedIncrement(&collection->refcount); - TRACE("%p, %ld.\n", collection, refcount); + TRACE("%p, %d.\n", collection, refcount); return refcount; } @@ -7694,7 +7484,7 @@ static ULONG WINAPI collection_Release(IMFCollection *iface) struct collection *collection = impl_from_IMFCollection(iface); ULONG refcount = InterlockedDecrement(&collection->refcount); - TRACE("%p, %ld.\n", collection, refcount); + TRACE("%p, %d.\n", collection, refcount); if (!refcount) { @@ -7724,7 +7514,7 @@ static HRESULT WINAPI collection_GetElement(IMFCollection *iface, DWORD idx, IUn { struct collection *collection = impl_from_IMFCollection(iface); - TRACE("%p, %lu, %p.\n", iface, idx, element); + TRACE("%p, %u, %p.\n", iface, idx, element); if (!element) return E_POINTER; @@ -7761,7 +7551,7 @@ static HRESULT WINAPI collection_RemoveElement(IMFCollection *iface, DWORD idx, struct collection *collection = impl_from_IMFCollection(iface); size_t count; - TRACE("%p, %lu, %p.\n", iface, idx, element); + TRACE("%p, %u, %p.\n", iface, idx, element); if (!element) return E_POINTER; @@ -7784,7 +7574,7 @@ static HRESULT WINAPI collection_InsertElementAt(IMFCollection *iface, DWORD idx struct collection *collection = impl_from_IMFCollection(iface); size_t i; - TRACE("%p, %lu, %p.\n", iface, idx, element); + TRACE("%p, %u, %p.\n", iface, idx, element); if (!mf_array_reserve((void **)&collection->elements, &collection->capacity, idx + 1, sizeof(*collection->elements))) @@ -7862,7 +7652,7 @@ HRESULT WINAPI MFCreateCollection(IMFCollection **collection) */ void *WINAPI MFHeapAlloc(SIZE_T size, ULONG flags, char *file, int line, EAllocationType type) { - TRACE("%Iu, %#lx, %s, %d, %#x.\n", size, flags, debugstr_a(file), line, type); + TRACE("%lu, %#x, %s, %d, %#x.\n", size, flags, debugstr_a(file), line, type); return HeapAlloc(GetProcessHeap(), flags, size); } @@ -7907,7 +7697,7 @@ static ULONG WINAPI system_clock_AddRef(IMFClock *iface) struct system_clock *clock = impl_from_IMFClock(iface); ULONG refcount = InterlockedIncrement(&clock->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -7917,7 +7707,7 @@ static ULONG WINAPI system_clock_Release(IMFClock *iface) struct system_clock *clock = impl_from_IMFClock(iface); ULONG refcount = InterlockedDecrement(&clock->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) free(clock); @@ -7938,7 +7728,7 @@ static HRESULT WINAPI system_clock_GetClockCharacteristics(IMFClock *iface, DWOR static HRESULT WINAPI system_clock_GetCorrelatedTime(IMFClock *iface, DWORD reserved, LONGLONG *clock_time, MFTIME *system_time) { - TRACE("%p, %#lx, %p, %p.\n", iface, reserved, clock_time, system_time); + TRACE("%p, %#x, %p, %p.\n", iface, reserved, clock_time, system_time); *clock_time = *system_time = MFGetSystemTime(); @@ -7956,7 +7746,7 @@ static HRESULT WINAPI system_clock_GetContinuityKey(IMFClock *iface, DWORD *key) static HRESULT WINAPI system_clock_GetState(IMFClock *iface, DWORD reserved, MFCLOCK_STATE *state) { - TRACE("%p, %#lx, %p.\n", iface, reserved, state); + TRACE("%p, %#x, %p.\n", iface, reserved, state); *state = MFCLOCK_STATE_RUNNING; @@ -8036,7 +7826,7 @@ static ULONG WINAPI system_time_source_AddRef(IMFPresentationTimeSource *iface) struct system_time_source *source = impl_from_IMFPresentationTimeSource(iface); ULONG refcount = InterlockedIncrement(&source->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -8046,7 +7836,7 @@ static ULONG WINAPI system_time_source_Release(IMFPresentationTimeSource *iface) struct system_time_source *source = impl_from_IMFPresentationTimeSource(iface); ULONG refcount = InterlockedDecrement(&source->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -8074,14 +7864,18 @@ static HRESULT WINAPI system_time_source_GetCorrelatedTime(IMFPresentationTimeSo struct system_time_source *source = impl_from_IMFPresentationTimeSource(iface); HRESULT hr; - TRACE("%p, %#lx, %p, %p.\n", iface, reserved, clock_time, system_time); + TRACE("%p, %#x, %p, %p.\n", iface, reserved, clock_time, system_time); EnterCriticalSection(&source->cs); if (SUCCEEDED(hr = IMFClock_GetCorrelatedTime(source->clock, 0, clock_time, system_time))) { if (source->state == MFCLOCK_STATE_RUNNING) - system_time_source_update_clock_time(source, *system_time); - *clock_time = source->start_offset + source->clock_time; + { + system_time_source_apply_rate(source, clock_time); + *clock_time += source->start_offset; + } + else + *clock_time = source->start_offset; } LeaveCriticalSection(&source->cs); @@ -8102,7 +7896,7 @@ static HRESULT WINAPI system_time_source_GetState(IMFPresentationTimeSource *ifa { struct system_time_source *source = impl_from_IMFPresentationTimeSource(iface); - TRACE("%p, %#lx, %p.\n", iface, reserved, state); + TRACE("%p, %#x, %p.\n", iface, reserved, state); EnterCriticalSection(&source->cs); *state = source->state; @@ -8220,19 +8014,25 @@ static HRESULT WINAPI system_time_source_sink_OnClockStart(IMFClockStateSink *if state = source->state; if (SUCCEEDED(hr = system_time_source_change_state(source, CLOCK_CMD_START))) { + system_time_source_apply_rate(source, &system_time); if (start_offset == PRESENTATION_CURRENT_POSITION) { - if (state != MFCLOCK_STATE_RUNNING) + switch (state) { - source->start_offset -= system_time; - source->system_time = 0; + case MFCLOCK_STATE_RUNNING: + break; + case MFCLOCK_STATE_PAUSED: + source->start_offset -= system_time; + break; + default: + source->start_offset = -system_time; + break; + ; } } else { - source->start_offset = start_offset; - source->system_time = system_time; - source->clock_time = 0; + source->start_offset = -system_time + start_offset; } } LeaveCriticalSection(&source->cs); @@ -8249,9 +8049,7 @@ static HRESULT WINAPI system_time_source_sink_OnClockStop(IMFClockStateSink *ifa EnterCriticalSection(&source->cs); if (SUCCEEDED(hr = system_time_source_change_state(source, CLOCK_CMD_STOP))) - { - source->start_offset = source->system_time = source->clock_time = 0; - } + source->start_offset = 0; LeaveCriticalSection(&source->cs); return hr; @@ -8267,7 +8065,8 @@ static HRESULT WINAPI system_time_source_sink_OnClockPause(IMFClockStateSink *if EnterCriticalSection(&source->cs); if (SUCCEEDED(hr = system_time_source_change_state(source, CLOCK_CMD_PAUSE))) { - system_time_source_update_clock_time(source, system_time); + system_time_source_apply_rate(source, &system_time); + source->start_offset += system_time; } LeaveCriticalSection(&source->cs); @@ -8284,7 +8083,8 @@ static HRESULT WINAPI system_time_source_sink_OnClockRestart(IMFClockStateSink * EnterCriticalSection(&source->cs); if (SUCCEEDED(hr = system_time_source_change_state(source, CLOCK_CMD_RESTART))) { - source->system_time = system_time; + system_time_source_apply_rate(source, &system_time); + source->start_offset -= system_time; } LeaveCriticalSection(&source->cs); @@ -8399,7 +8199,7 @@ static ULONG WINAPI async_create_file_callback_AddRef(IRtwqAsyncCallback *iface) struct async_create_file *async = impl_from_create_file_IRtwqAsyncCallback(iface); ULONG refcount = InterlockedIncrement(&async->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -8409,7 +8209,7 @@ static ULONG WINAPI async_create_file_callback_Release(IRtwqAsyncCallback *iface struct async_create_file *async = impl_from_create_file_IRtwqAsyncCallback(iface); ULONG refcount = InterlockedDecrement(&async->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -8696,7 +8496,7 @@ static ULONG WINAPI property_store_AddRef(IPropertyStore *iface) struct property_store *store = impl_from_IPropertyStore(iface); ULONG refcount = InterlockedIncrement(&store->refcount); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); return refcount; } @@ -8706,7 +8506,7 @@ static ULONG WINAPI property_store_Release(IPropertyStore *iface) struct property_store *store = impl_from_IPropertyStore(iface); ULONG refcount = InterlockedDecrement(&store->refcount); - TRACE("%p, refcount %ld.\n", iface, refcount); + TRACE("%p, refcount %d.\n", iface, refcount); if (!refcount) { @@ -8737,7 +8537,7 @@ static HRESULT WINAPI property_store_GetAt(IPropertyStore *iface, DWORD index, P { struct property_store *store = impl_from_IPropertyStore(iface); - TRACE("%p, %lu, %p.\n", iface, index, key); + TRACE("%p, %u, %p.\n", iface, index, key); EnterCriticalSection(&store->cs); @@ -8929,7 +8729,7 @@ static ULONG WINAPI dxgi_device_manager_AddRef(IMFDXGIDeviceManager *iface) struct dxgi_device_manager *manager = impl_from_IMFDXGIDeviceManager(iface); ULONG refcount = InterlockedIncrement(&manager->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -8939,7 +8739,7 @@ static ULONG WINAPI dxgi_device_manager_Release(IMFDXGIDeviceManager *iface) struct dxgi_device_manager *manager = impl_from_IMFDXGIDeviceManager(iface); ULONG refcount = InterlockedDecrement(&manager->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -9232,9 +9032,21 @@ static const IMFDXGIDeviceManagerVtbl dxgi_device_manager_vtbl = HRESULT WINAPI MFCreateDXGIDeviceManager(UINT *token, IMFDXGIDeviceManager **manager) { struct dxgi_device_manager *object; + const char *do_not_create = getenv("WINE_DO_NOT_CREATE_DXGI_DEVICE_MANAGER"); TRACE("%p, %p.\n", token, manager); + /* Returning a DXGI device manager triggers a bug and breaks The + * Long Dark and Trailmakers. This should be removed once CW bug + * #19126 is solved. Returning a DXGI device manager also breaks + * Age of Empires Definitive Edition - this gameid should be removed + * once CW bug #19741 is solved. */ + if (do_not_create && do_not_create[0] != '\0') + { + FIXME("stubbing out\n"); + return E_NOTIMPL; + } + if (!token || !manager) return E_POINTER; @@ -9360,7 +9172,7 @@ static ULONGLONG lldiv128(ULARGE_INTEGER c1, ULARGE_INTEGER c0, LONGLONG denom) { ULARGE_INTEGER q1, q0, rhat; ULARGE_INTEGER v, cmp1, cmp2; - DWORD s = 0; + unsigned int s = 0; v.QuadPart = llabs(denom); diff --git a/dlls/mfplat/media_source.c b/dlls/mfplat/media_source.c new file mode 100644 index 00000000000..82a6da1bcbf --- /dev/null +++ wine/dlls/mfplat/media_source.c @@ -0,0 +1,2006 @@ +/* GStreamer Media Source + * + * Copyright 2020 Derek Lesho + * Copyright 2020 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" + +#include "wine/list.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +struct media_stream +{ + IMFMediaStream IMFMediaStream_iface; + LONG ref; + struct media_source *parent_source; + IMFMediaEventQueue *event_queue; + IMFStreamDescriptor *descriptor; + + struct wg_parser_stream *wg_stream; + + IUnknown **token_queue; + LONG token_queue_count; + LONG token_queue_cap; + + enum + { + STREAM_INACTIVE, + STREAM_SHUTDOWN, + STREAM_RUNNING, + } state; + DWORD stream_id; + BOOL eos; +}; + +enum source_async_op +{ + SOURCE_ASYNC_START, + SOURCE_ASYNC_PAUSE, + SOURCE_ASYNC_STOP, + SOURCE_ASYNC_REQUEST_SAMPLE, +}; + +struct source_async_command +{ + IUnknown IUnknown_iface; + LONG refcount; + enum source_async_op op; + union + { + struct + { + IMFPresentationDescriptor *descriptor; + GUID format; + PROPVARIANT position; + } start; + struct + { + struct media_stream *stream; + IUnknown *token; + } request_sample; + } u; +}; + +struct media_source +{ + IMFMediaSource IMFMediaSource_iface; + IMFGetService IMFGetService_iface; + IMFRateSupport IMFRateSupport_iface; + IMFRateControl IMFRateControl_iface; + IMFAsyncCallback async_commands_callback; + LONG ref; + DWORD async_commands_queue; + IMFMediaEventQueue *event_queue; + IMFByteStream *byte_stream; + + struct wg_parser *wg_parser; + + struct media_stream **streams; + ULONG stream_count; + IMFPresentationDescriptor *pres_desc; + enum + { + SOURCE_OPENING, + SOURCE_STOPPED, + SOURCE_PAUSED, + SOURCE_RUNNING, + SOURCE_SHUTDOWN, + } state; + + HANDLE read_thread; + bool read_thread_shutdown; +}; + +static inline struct media_stream *impl_from_IMFMediaStream(IMFMediaStream *iface) +{ + return CONTAINING_RECORD(iface, struct media_stream, IMFMediaStream_iface); +} + +static inline struct media_source *impl_from_IMFMediaSource(IMFMediaSource *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, IMFMediaSource_iface); +} + +static inline struct media_source *impl_from_IMFGetService(IMFGetService *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, IMFGetService_iface); +} + +static inline struct media_source *impl_from_IMFRateSupport(IMFRateSupport *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, IMFRateSupport_iface); +} + +static inline struct media_source *impl_from_IMFRateControl(IMFRateControl *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, IMFRateControl_iface); +} + +static inline struct media_source *impl_from_async_commands_callback_IMFAsyncCallback(IMFAsyncCallback *iface) +{ + return CONTAINING_RECORD(iface, struct media_source, async_commands_callback); +} + +static inline struct source_async_command *impl_from_async_command_IUnknown(IUnknown *iface) +{ + return CONTAINING_RECORD(iface, struct source_async_command, IUnknown_iface); +} + +static HRESULT WINAPI source_async_command_QueryInterface(IUnknown *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("Unsupported interface %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI source_async_command_AddRef(IUnknown *iface) +{ + struct source_async_command *command = impl_from_async_command_IUnknown(iface); + return InterlockedIncrement(&command->refcount); +} + +static ULONG WINAPI source_async_command_Release(IUnknown *iface) +{ + struct source_async_command *command = impl_from_async_command_IUnknown(iface); + ULONG refcount = InterlockedDecrement(&command->refcount); + + if (!refcount) + { + if (command->op == SOURCE_ASYNC_START) + PropVariantClear(&command->u.start.position); + else if (command->op == SOURCE_ASYNC_REQUEST_SAMPLE) + { + if (command->u.request_sample.token) + IUnknown_Release(command->u.request_sample.token); + } + free(command); + } + + return refcount; +} + +static const IUnknownVtbl source_async_command_vtbl = +{ + source_async_command_QueryInterface, + source_async_command_AddRef, + source_async_command_Release, +}; + +static HRESULT source_create_async_op(enum source_async_op op, struct source_async_command **ret) +{ + struct source_async_command *command; + + if (!(command = calloc(1, sizeof(*command)))) + return E_OUTOFMEMORY; + + command->IUnknown_iface.lpVtbl = &source_async_command_vtbl; + command->op = op; + + *ret = command; + + return S_OK; +} + +static HRESULT WINAPI callback_QueryInterface(IMFAsyncCallback *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IMFAsyncCallback) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFAsyncCallback_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static HRESULT WINAPI callback_GetParameters(IMFAsyncCallback *iface, + DWORD *flags, DWORD *queue) +{ + return E_NOTIMPL; +} + +static ULONG WINAPI source_async_commands_callback_AddRef(IMFAsyncCallback *iface) +{ + struct media_source *source = impl_from_async_commands_callback_IMFAsyncCallback(iface); + return IMFMediaSource_AddRef(&source->IMFMediaSource_iface); +} + +static ULONG WINAPI source_async_commands_callback_Release(IMFAsyncCallback *iface) +{ + struct media_source *source = impl_from_async_commands_callback_IMFAsyncCallback(iface); + return IMFMediaSource_Release(&source->IMFMediaSource_iface); +} + +static IMFStreamDescriptor *stream_descriptor_from_id(IMFPresentationDescriptor *pres_desc, DWORD id, BOOL *selected) +{ + ULONG sd_count; + IMFStreamDescriptor *ret; + unsigned int i; + + if (FAILED(IMFPresentationDescriptor_GetStreamDescriptorCount(pres_desc, &sd_count))) + return NULL; + + for (i = 0; i < sd_count; i++) + { + DWORD stream_id; + + if (FAILED(IMFPresentationDescriptor_GetStreamDescriptorByIndex(pres_desc, i, selected, &ret))) + return NULL; + + if (SUCCEEDED(IMFStreamDescriptor_GetStreamIdentifier(ret, &stream_id)) && stream_id == id) + return ret; + + IMFStreamDescriptor_Release(ret); + } + return NULL; +} + +static BOOL enqueue_token(struct media_stream *stream, IUnknown *token) +{ + if (stream->token_queue_count == stream->token_queue_cap) + { + IUnknown **buf; + stream->token_queue_cap = stream->token_queue_cap * 2 + 1; + buf = realloc(stream->token_queue, stream->token_queue_cap * sizeof(*buf)); + if (buf) + stream->token_queue = buf; + else + { + stream->token_queue_cap = stream->token_queue_count; + return FALSE; + } + } + stream->token_queue[stream->token_queue_count++] = token; + return TRUE; +} + +static void flush_token_queue(struct media_stream *stream, BOOL send) +{ + LONG i; + + for (i = 0; i < stream->token_queue_count; i++) + { + if (send) + { + HRESULT hr; + struct source_async_command *command; + if (SUCCEEDED(hr = source_create_async_op(SOURCE_ASYNC_REQUEST_SAMPLE, &command))) + { + command->u.request_sample.stream = stream; + command->u.request_sample.token = stream->token_queue[i]; + + hr = MFPutWorkItem(stream->parent_source->async_commands_queue, + &stream->parent_source->async_commands_callback, &command->IUnknown_iface); + } + if (FAILED(hr)) + WARN("Could not enqueue sample request, hr %#x\n", hr); + } + else if (stream->token_queue[i]) + IUnknown_Release(stream->token_queue[i]); + } + free(stream->token_queue); + stream->token_queue = NULL; + stream->token_queue_count = 0; + stream->token_queue_cap = 0; +} + +static void start_pipeline(struct media_source *source, struct source_async_command *command) +{ + PROPVARIANT *position = &command->u.start.position; + BOOL seek_message = source->state != SOURCE_STOPPED && position->vt != VT_EMPTY; + unsigned int i; + + /* seek to beginning on stop->play */ + if (source->state == SOURCE_STOPPED && position->vt == VT_EMPTY) + { + position->vt = VT_I8; + position->hVal.QuadPart = 0; + } + + for (i = 0; i < source->stream_count; i++) + { + struct media_stream *stream; + IMFStreamDescriptor *sd; + IMFMediaTypeHandler *mth; + IMFMediaType *current_mt; + DWORD stream_id; + BOOL was_active; + BOOL selected; + + stream = source->streams[i]; + + IMFStreamDescriptor_GetStreamIdentifier(stream->descriptor, &stream_id); + + sd = stream_descriptor_from_id(command->u.start.descriptor, stream_id, &selected); + IMFStreamDescriptor_Release(sd); + + was_active = stream->state != STREAM_INACTIVE; + + stream->state = selected ? STREAM_RUNNING : STREAM_INACTIVE; + + if (selected) + { + struct wg_format format; + + IMFStreamDescriptor_GetMediaTypeHandler(stream->descriptor, &mth); + IMFMediaTypeHandler_GetCurrentMediaType(mth, ¤t_mt); + + mf_media_type_to_wg_format(current_mt, &format); + wg_parser_stream_enable(stream->wg_stream, &format, NULL, 0); + + IMFMediaType_Release(current_mt); + IMFMediaTypeHandler_Release(mth); + } + + if (position->vt != VT_EMPTY) + stream->eos = FALSE; + + if (selected) + { + TRACE("Stream %u (%p) selected\n", i, stream); + IMFMediaEventQueue_QueueEventParamUnk(source->event_queue, + was_active ? MEUpdatedStream : MENewStream, &GUID_NULL, + S_OK, (IUnknown*) &stream->IMFMediaStream_iface); + + IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, + seek_message ? MEStreamSeeked : MEStreamStarted, &GUID_NULL, S_OK, position); + } + } + + IMFMediaEventQueue_QueueEventParamVar(source->event_queue, + seek_message ? MESourceSeeked : MESourceStarted, + &GUID_NULL, S_OK, position); + + source->state = SOURCE_RUNNING; + + if (position->vt == VT_I8) + wg_parser_stream_seek(source->streams[0]->wg_stream, 1.0, position->hVal.QuadPart, 0, + AM_SEEKING_AbsolutePositioning, AM_SEEKING_NoPositioning); + + for (i = 0; i < source->stream_count; i++) + flush_token_queue(source->streams[i], position->vt == VT_EMPTY); +} + +static void pause_pipeline(struct media_source *source) +{ + unsigned int i; + + for (i = 0; i < source->stream_count; i++) + { + struct media_stream *stream = source->streams[i]; + if (stream->state != STREAM_INACTIVE) + { + IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamPaused, &GUID_NULL, S_OK, NULL); + } + } + + IMFMediaEventQueue_QueueEventParamVar(source->event_queue, MESourcePaused, &GUID_NULL, S_OK, NULL); + + source->state = SOURCE_PAUSED; +} + +static void stop_pipeline(struct media_source *source) +{ + unsigned int i; + + for (i = 0; i < source->stream_count; i++) + { + struct media_stream *stream = source->streams[i]; + if (stream->state != STREAM_INACTIVE) + { + IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamStopped, &GUID_NULL, S_OK, NULL); + wg_parser_stream_disable(stream->wg_stream); + } + } + + IMFMediaEventQueue_QueueEventParamVar(source->event_queue, MESourceStopped, &GUID_NULL, S_OK, NULL); + + source->state = SOURCE_STOPPED; + + for (i = 0; i < source->stream_count; i++) + flush_token_queue(source->streams[i], FALSE); +} + +static void dispatch_end_of_presentation(struct media_source *source) +{ + PROPVARIANT empty = {.vt = VT_EMPTY}; + unsigned int i; + + /* A stream has ended, check whether all have */ + for (i = 0; i < source->stream_count; i++) + { + struct media_stream *stream = source->streams[i]; + + if (stream->state != STREAM_INACTIVE && !stream->eos) + return; + } + + IMFMediaEventQueue_QueueEventParamVar(source->event_queue, MEEndOfPresentation, &GUID_NULL, S_OK, &empty); +} + +static void send_buffer(struct media_stream *stream, const struct wg_parser_buffer *wg_buffer, IUnknown *token) +{ + IMFMediaBuffer *buffer; + IMFSample *sample; + HRESULT hr; + BYTE *data; + + if (FAILED(hr = MFCreateSample(&sample))) + { + ERR("Failed to create sample, hr %#x.\n", hr); + return; + } + + if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer->size, &buffer))) + { + ERR("Failed to create buffer, hr %#x.\n", hr); + IMFSample_Release(sample); + return; + } + + if (FAILED(hr = IMFSample_AddBuffer(sample, buffer))) + { + ERR("Failed to add buffer, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer->size))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL))) + { + ERR("Failed to lock buffer, hr %#x.\n", hr); + goto out; + } + + if (!wg_parser_stream_copy_buffer(stream->wg_stream, data, 0, wg_buffer->size)) + { + wg_parser_stream_release_buffer(stream->wg_stream); + IMFMediaBuffer_Unlock(buffer); + goto out; + } + wg_parser_stream_release_buffer(stream->wg_stream); + + if (FAILED(hr = IMFMediaBuffer_Unlock(buffer))) + { + ERR("Failed to unlock buffer, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFSample_SetSampleTime(sample, wg_buffer->pts))) + { + ERR("Failed to set sample time, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFSample_SetSampleDuration(sample, wg_buffer->duration))) + { + ERR("Failed to set sample duration, hr %#x.\n", hr); + goto out; + } + + if (token) + IMFSample_SetUnknown(sample, &MFSampleExtension_Token, token); + + IMFMediaEventQueue_QueueEventParamUnk(stream->event_queue, MEMediaSample, + &GUID_NULL, S_OK, (IUnknown *)sample); + +out: + IMFMediaBuffer_Release(buffer); + IMFSample_Release(sample); +} + +static void wait_on_sample(struct media_stream *stream, IUnknown *token) +{ + PROPVARIANT empty_var = {.vt = VT_EMPTY}; + struct wg_parser_buffer buffer; + + TRACE("%p, %p\n", stream, token); + + if (wg_parser_stream_get_buffer(stream->wg_stream, &buffer)) + { + send_buffer(stream, &buffer, token); + } + else + { + stream->eos = TRUE; + IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEEndOfStream, &GUID_NULL, S_OK, &empty_var); + dispatch_end_of_presentation(stream->parent_source); + } +} + +static HRESULT WINAPI source_async_commands_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) +{ + struct media_source *source = impl_from_async_commands_callback_IMFAsyncCallback(iface); + struct source_async_command *command; + IUnknown *state; + HRESULT hr; + + if (source->state == SOURCE_SHUTDOWN) + return S_OK; + + if (FAILED(hr = IMFAsyncResult_GetState(result, &state))) + return hr; + + command = impl_from_async_command_IUnknown(state); + switch (command->op) + { + case SOURCE_ASYNC_START: + start_pipeline(source, command); + break; + case SOURCE_ASYNC_PAUSE: + pause_pipeline(source); + break; + case SOURCE_ASYNC_STOP: + stop_pipeline(source); + break; + case SOURCE_ASYNC_REQUEST_SAMPLE: + if (source->state == SOURCE_PAUSED) + enqueue_token(command->u.request_sample.stream, command->u.request_sample.token); + else + wait_on_sample(command->u.request_sample.stream, command->u.request_sample.token); + break; + } + + IUnknown_Release(state); + + return S_OK; +} + +static const IMFAsyncCallbackVtbl source_async_commands_callback_vtbl = +{ + callback_QueryInterface, + source_async_commands_callback_AddRef, + source_async_commands_callback_Release, + callback_GetParameters, + source_async_commands_Invoke, +}; + +static DWORD CALLBACK read_thread(void *arg) +{ + struct media_source *source = arg; + IMFByteStream *byte_stream = source->byte_stream; + size_t buffer_size = 4096; + uint64_t file_size; + void *data; + + if (!(data = malloc(buffer_size))) + return 0; + + IMFByteStream_GetLength(byte_stream, &file_size); + + TRACE("Starting read thread for media source %p.\n", source); + + while (!source->read_thread_shutdown) + { + uint64_t offset; + ULONG ret_size; + uint32_t size; + HRESULT hr; + + if (!wg_parser_get_next_read_offset(source->wg_parser, &offset, &size)) + continue; + + if (offset >= file_size) + size = 0; + else if (offset + size >= file_size) + size = file_size - offset; + + /* Some IMFByteStreams (including the standard file-based stream) return + * an error when reading past the file size. */ + if (!size) + { + wg_parser_push_data(source->wg_parser, WG_READ_SUCCESS, data, 0); + continue; + } + + if (!array_reserve(&data, &buffer_size, size, 1)) + { + free(data); + return 0; + } + + ret_size = 0; + + if (SUCCEEDED(hr = IMFByteStream_SetCurrentPosition(byte_stream, offset))) + hr = IMFByteStream_Read(byte_stream, data, size, &ret_size); + if (FAILED(hr)) + ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); + else if (ret_size != size) + ERR("Unexpected short read: requested %u bytes, got %u.\n", size, ret_size); + wg_parser_push_data(source->wg_parser, SUCCEEDED(hr) ? WG_READ_SUCCESS : WG_READ_FAILURE, data, ret_size); + } + + free(data); + TRACE("Media source is shutting down; exiting.\n"); + return 0; +} + +static HRESULT WINAPI media_stream_QueryInterface(IMFMediaStream *iface, REFIID riid, void **out) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualIID(riid, &IID_IMFMediaStream) || + IsEqualIID(riid, &IID_IMFMediaEventGenerator) || + IsEqualIID(riid, &IID_IUnknown)) + { + *out = &stream->IMFMediaStream_iface; + } + else + { + FIXME("(%s, %p)\n", debugstr_guid(riid), out); + *out = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*out); + return S_OK; +} + +static ULONG WINAPI media_stream_AddRef(IMFMediaStream *iface) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + ULONG ref = InterlockedIncrement(&stream->ref); + + TRACE("%p, refcount %u.\n", iface, ref); + + return ref; +} + +static ULONG WINAPI media_stream_Release(IMFMediaStream *iface) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + ULONG ref = InterlockedDecrement(&stream->ref); + + TRACE("%p, refcount %u.\n", iface, ref); + + if (!ref) + { + if (stream->event_queue) + IMFMediaEventQueue_Release(stream->event_queue); + flush_token_queue(stream, FALSE); + free(stream); + } + + return ref; +} + +static HRESULT WINAPI media_stream_GetEvent(IMFMediaStream *iface, DWORD flags, IMFMediaEvent **event) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + + TRACE("%p, %#x, %p.\n", iface, flags, event); + + return IMFMediaEventQueue_GetEvent(stream->event_queue, flags, event); +} + +static HRESULT WINAPI media_stream_BeginGetEvent(IMFMediaStream *iface, IMFAsyncCallback *callback, IUnknown *state) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + + TRACE("%p, %p, %p.\n", iface, callback, state); + + return IMFMediaEventQueue_BeginGetEvent(stream->event_queue, callback, state); +} + +static HRESULT WINAPI media_stream_EndGetEvent(IMFMediaStream *iface, IMFAsyncResult *result, IMFMediaEvent **event) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + + TRACE("%p, %p, %p.\n", stream, result, event); + + return IMFMediaEventQueue_EndGetEvent(stream->event_queue, result, event); +} + +static HRESULT WINAPI media_stream_QueueEvent(IMFMediaStream *iface, MediaEventType event_type, REFGUID ext_type, + HRESULT hr, const PROPVARIANT *value) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + + TRACE("%p, %d, %s, %#x, %p.\n", iface, event_type, debugstr_guid(ext_type), hr, value); + + return IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, event_type, ext_type, hr, value); +} + +static HRESULT WINAPI media_stream_GetMediaSource(IMFMediaStream *iface, IMFMediaSource **source) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + + TRACE("%p, %p.\n", iface, source); + + if (stream->state == STREAM_SHUTDOWN) + return MF_E_SHUTDOWN; + + IMFMediaSource_AddRef(&stream->parent_source->IMFMediaSource_iface); + *source = &stream->parent_source->IMFMediaSource_iface; + + return S_OK; +} + +static HRESULT WINAPI media_stream_GetStreamDescriptor(IMFMediaStream* iface, IMFStreamDescriptor **descriptor) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + + TRACE("%p, %p.\n", iface, descriptor); + + if (stream->state == STREAM_SHUTDOWN) + return MF_E_SHUTDOWN; + + IMFStreamDescriptor_AddRef(stream->descriptor); + *descriptor = stream->descriptor; + + return S_OK; +} + +static HRESULT WINAPI media_stream_RequestSample(IMFMediaStream *iface, IUnknown *token) +{ + struct media_stream *stream = impl_from_IMFMediaStream(iface); + struct source_async_command *command; + HRESULT hr; + + TRACE("%p, %p.\n", iface, token); + + if (stream->state == STREAM_SHUTDOWN) + return MF_E_SHUTDOWN; + + if (stream->state == STREAM_INACTIVE) + { + WARN("Stream isn't active\n"); + return MF_E_MEDIA_SOURCE_WRONGSTATE; + } + + if (stream->eos) + { + return MF_E_END_OF_STREAM; + } + + if (SUCCEEDED(hr = source_create_async_op(SOURCE_ASYNC_REQUEST_SAMPLE, &command))) + { + command->u.request_sample.stream = stream; + if (token) + IUnknown_AddRef(token); + command->u.request_sample.token = token; + + hr = MFPutWorkItem(stream->parent_source->async_commands_queue, + &stream->parent_source->async_commands_callback, &command->IUnknown_iface); + } + + return hr; +} + +static const IMFMediaStreamVtbl media_stream_vtbl = +{ + media_stream_QueryInterface, + media_stream_AddRef, + media_stream_Release, + media_stream_GetEvent, + media_stream_BeginGetEvent, + media_stream_EndGetEvent, + media_stream_QueueEvent, + media_stream_GetMediaSource, + media_stream_GetStreamDescriptor, + media_stream_RequestSample +}; + +static HRESULT new_media_stream(struct media_source *source, + struct wg_parser_stream *wg_stream, DWORD stream_id, struct media_stream **out_stream) +{ + struct media_stream *object = calloc(1, sizeof(*object)); + HRESULT hr; + + TRACE("source %p, wg_stream %p, stream_id %u.\n", source, wg_stream, stream_id); + + object->IMFMediaStream_iface.lpVtbl = &media_stream_vtbl; + object->ref = 1; + + if (FAILED(hr = MFCreateEventQueue(&object->event_queue))) + { + free(object); + return hr; + } + + IMFMediaSource_AddRef(&source->IMFMediaSource_iface); + object->parent_source = source; + object->stream_id = stream_id; + + object->state = STREAM_INACTIVE; + object->eos = FALSE; + object->wg_stream = wg_stream; + + TRACE("Created stream object %p.\n", object); + + *out_stream = object; + + return S_OK; +} + +static HRESULT media_stream_init_desc(struct media_stream *stream) +{ + IMFMediaTypeHandler *type_handler = NULL; + IMFMediaType *stream_types[8]; + struct wg_format format; + DWORD type_count = 0; + unsigned int i; + HRESULT hr; + + wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + + if (format.major_type == WG_MAJOR_TYPE_VIDEO) + { + /* These are the most common native output types of decoders: + https://docs.microsoft.com/en-us/windows/win32/medfound/mft-decoder-expose-output-types-in-native-order */ + static const GUID *const video_types[] = + { + &MFVideoFormat_NV12, + &MFVideoFormat_YV12, + &MFVideoFormat_YUY2, + &MFVideoFormat_IYUV, + &MFVideoFormat_I420, + &MFVideoFormat_ARGB32, + &MFVideoFormat_RGB32, + }; + + IMFMediaType *base_type = mf_media_type_from_wg_format(&format); + GUID base_subtype; + + IMFMediaType_GetGUID(base_type, &MF_MT_SUBTYPE, &base_subtype); + + stream_types[0] = base_type; + type_count = 1; + + for (i = 0; i < ARRAY_SIZE(video_types); i++) + { + IMFMediaType *new_type; + + if (IsEqualGUID(&base_subtype, video_types[i])) + continue; + + if (FAILED(hr = MFCreateMediaType(&new_type))) + goto done; + stream_types[type_count++] = new_type; + + if (FAILED(hr = IMFMediaType_CopyAllItems(base_type, (IMFAttributes *) new_type))) + goto done; + if (FAILED(hr = IMFMediaType_SetGUID(new_type, &MF_MT_SUBTYPE, video_types[i]))) + goto done; + } + } + else if (format.major_type == WG_MAJOR_TYPE_AUDIO) + { + /* Expose at least one PCM and one floating point type for the + consumer to pick from. */ + static const enum wg_audio_format audio_types[] = + { + WG_AUDIO_FORMAT_S16LE, + WG_AUDIO_FORMAT_F32LE, + }; + + stream_types[0] = mf_media_type_from_wg_format(&format); + type_count = 1; + + for (i = 0; i < ARRAY_SIZE(audio_types); i++) + { + struct wg_format new_format; + if (format.u.audio.format == audio_types[i]) + continue; + new_format = format; + new_format.u.audio.format = audio_types[i]; + stream_types[type_count++] = mf_media_type_from_wg_format(&new_format); + } + } + else + { + if ((stream_types[0] = mf_media_type_from_wg_format(&format))) + type_count = 1; + } + + assert(type_count <= ARRAY_SIZE(stream_types)); + + if (!type_count) + { + ERR("Failed to establish an IMFMediaType from any of the possible stream caps!\n"); + return E_FAIL; + } + + if (FAILED(hr = MFCreateStreamDescriptor(stream->stream_id, type_count, stream_types, &stream->descriptor))) + goto done; + + if (FAILED(hr = IMFStreamDescriptor_GetMediaTypeHandler(stream->descriptor, &type_handler))) + { + IMFStreamDescriptor_Release(stream->descriptor); + goto done; + } + + if (FAILED(hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, stream_types[0]))) + { + IMFStreamDescriptor_Release(stream->descriptor); + goto done; + } + +done: + if (type_handler) + IMFMediaTypeHandler_Release(type_handler); + for (i = 0; i < type_count; i++) + IMFMediaType_Release(stream_types[i]); + return hr; +} + +static HRESULT WINAPI media_source_get_service_QueryInterface(IMFGetService *iface, REFIID riid, void **obj) +{ + struct media_source *source = impl_from_IMFGetService(iface); + return IMFMediaSource_QueryInterface(&source->IMFMediaSource_iface, riid, obj); +} + +static ULONG WINAPI media_source_get_service_AddRef(IMFGetService *iface) +{ + struct media_source *source = impl_from_IMFGetService(iface); + return IMFMediaSource_AddRef(&source->IMFMediaSource_iface); +} + +static ULONG WINAPI media_source_get_service_Release(IMFGetService *iface) +{ + struct media_source *source = impl_from_IMFGetService(iface); + return IMFMediaSource_Release(&source->IMFMediaSource_iface); +} + +static HRESULT WINAPI media_source_get_service_GetService(IMFGetService *iface, REFGUID service, REFIID riid, void **obj) +{ + struct media_source *source = impl_from_IMFGetService(iface); + + TRACE("%p, %s, %s, %p.\n", iface, debugstr_guid(service), debugstr_guid(riid), obj); + + *obj = NULL; + + if (IsEqualGUID(service, &MF_RATE_CONTROL_SERVICE)) + { + if (IsEqualIID(riid, &IID_IMFRateSupport)) + { + *obj = &source->IMFRateSupport_iface; + } + else if (IsEqualIID(riid, &IID_IMFRateControl)) + { + *obj = &source->IMFRateControl_iface; + } + } + else + FIXME("Unsupported service %s.\n", debugstr_guid(service)); + + if (*obj) + IUnknown_AddRef((IUnknown *)*obj); + + return *obj ? S_OK : E_NOINTERFACE; +} + +static const IMFGetServiceVtbl media_source_get_service_vtbl = +{ + media_source_get_service_QueryInterface, + media_source_get_service_AddRef, + media_source_get_service_Release, + media_source_get_service_GetService, +}; + +static HRESULT WINAPI media_source_rate_support_QueryInterface(IMFRateSupport *iface, REFIID riid, void **obj) +{ + struct media_source *source = impl_from_IMFRateSupport(iface); + return IMFMediaSource_QueryInterface(&source->IMFMediaSource_iface, riid, obj); +} + +static ULONG WINAPI media_source_rate_support_AddRef(IMFRateSupport *iface) +{ + struct media_source *source = impl_from_IMFRateSupport(iface); + return IMFMediaSource_AddRef(&source->IMFMediaSource_iface); +} + +static ULONG WINAPI media_source_rate_support_Release(IMFRateSupport *iface) +{ + struct media_source *source = impl_from_IMFRateSupport(iface); + return IMFMediaSource_Release(&source->IMFMediaSource_iface); +} + +static HRESULT WINAPI media_source_rate_support_GetSlowestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction, BOOL thin, float *rate) +{ + TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate); + + *rate = 0.0f; + + return S_OK; +} + +static HRESULT WINAPI media_source_rate_support_GetFastestRate(IMFRateSupport *iface, MFRATE_DIRECTION direction, BOOL thin, float *rate) +{ + TRACE("%p, %d, %d, %p.\n", iface, direction, thin, rate); + + *rate = direction == MFRATE_FORWARD ? 1e6f : -1e6f; + + return S_OK; +} + +static HRESULT WINAPI media_source_rate_support_IsRateSupported(IMFRateSupport *iface, BOOL thin, float rate, + float *nearest_rate) +{ + TRACE("%p, %d, %f, %p.\n", iface, thin, rate, nearest_rate); + + if (nearest_rate) + *nearest_rate = rate; + + return rate >= -1e6f && rate <= 1e6f ? S_OK : MF_E_UNSUPPORTED_RATE; +} + +static const IMFRateSupportVtbl media_source_rate_support_vtbl = +{ + media_source_rate_support_QueryInterface, + media_source_rate_support_AddRef, + media_source_rate_support_Release, + media_source_rate_support_GetSlowestRate, + media_source_rate_support_GetFastestRate, + media_source_rate_support_IsRateSupported, +}; + +static HRESULT WINAPI media_source_rate_control_QueryInterface(IMFRateControl *iface, REFIID riid, void **obj) +{ + struct media_source *source = impl_from_IMFRateControl(iface); + return IMFMediaSource_QueryInterface(&source->IMFMediaSource_iface, riid, obj); +} + +static ULONG WINAPI media_source_rate_control_AddRef(IMFRateControl *iface) +{ + struct media_source *source = impl_from_IMFRateControl(iface); + return IMFMediaSource_AddRef(&source->IMFMediaSource_iface); +} + +static ULONG WINAPI media_source_rate_control_Release(IMFRateControl *iface) +{ + struct media_source *source = impl_from_IMFRateControl(iface); + return IMFMediaSource_Release(&source->IMFMediaSource_iface); +} + +static HRESULT WINAPI media_source_rate_control_SetRate(IMFRateControl *iface, BOOL thin, float rate) +{ + FIXME("%p, %d, %f.\n", iface, thin, rate); + + if (rate < 0.0f) + return MF_E_REVERSE_UNSUPPORTED; + + if (thin) + return MF_E_THINNING_UNSUPPORTED; + + if (rate != 1.0f) + return MF_E_UNSUPPORTED_RATE; + + return S_OK; +} + +static HRESULT WINAPI media_source_rate_control_GetRate(IMFRateControl *iface, BOOL *thin, float *rate) +{ + TRACE("%p, %p, %p.\n", iface, thin, rate); + + if (thin) + *thin = FALSE; + + *rate = 1.0f; + + return S_OK; +} + +static const IMFRateControlVtbl media_source_rate_control_vtbl = +{ + media_source_rate_control_QueryInterface, + media_source_rate_control_AddRef, + media_source_rate_control_Release, + media_source_rate_control_SetRate, + media_source_rate_control_GetRate, +}; + +static HRESULT WINAPI media_source_QueryInterface(IMFMediaSource *iface, REFIID riid, void **out) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualIID(riid, &IID_IMFMediaSource) || + IsEqualIID(riid, &IID_IMFMediaEventGenerator) || + IsEqualIID(riid, &IID_IUnknown)) + { + *out = &source->IMFMediaSource_iface; + } + else if (IsEqualIID(riid, &IID_IMFGetService)) + { + *out = &source->IMFGetService_iface; + } + else + { + FIXME("%s, %p.\n", debugstr_guid(riid), out); + *out = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*out); + return S_OK; +} + +static ULONG WINAPI media_source_AddRef(IMFMediaSource *iface) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + ULONG ref = InterlockedIncrement(&source->ref); + + TRACE("%p, refcount %u.\n", iface, ref); + + return ref; +} + +static ULONG WINAPI media_source_Release(IMFMediaSource *iface) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + ULONG ref = InterlockedDecrement(&source->ref); + + TRACE("%p, refcount %u.\n", iface, ref); + + if (!ref) + { + IMFMediaSource_Shutdown(&source->IMFMediaSource_iface); + IMFMediaEventQueue_Release(source->event_queue); + free(source); + } + + return ref; +} + +static HRESULT WINAPI media_source_GetEvent(IMFMediaSource *iface, DWORD flags, IMFMediaEvent **event) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + + TRACE("%p, %#x, %p.\n", iface, flags, event); + + return IMFMediaEventQueue_GetEvent(source->event_queue, flags, event); +} + +static HRESULT WINAPI media_source_BeginGetEvent(IMFMediaSource *iface, IMFAsyncCallback *callback, IUnknown *state) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + + TRACE("%p, %p, %p.\n", iface, callback, state); + + return IMFMediaEventQueue_BeginGetEvent(source->event_queue, callback, state); +} + +static HRESULT WINAPI media_source_EndGetEvent(IMFMediaSource *iface, IMFAsyncResult *result, IMFMediaEvent **event) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + + TRACE("%p, %p, %p.\n", iface, result, event); + + return IMFMediaEventQueue_EndGetEvent(source->event_queue, result, event); +} + +static HRESULT WINAPI media_source_QueueEvent(IMFMediaSource *iface, MediaEventType event_type, REFGUID ext_type, + HRESULT hr, const PROPVARIANT *value) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + + TRACE("%p, %d, %s, %#x, %p.\n", iface, event_type, debugstr_guid(ext_type), hr, value); + + return IMFMediaEventQueue_QueueEventParamVar(source->event_queue, event_type, ext_type, hr, value); +} + +static HRESULT WINAPI media_source_GetCharacteristics(IMFMediaSource *iface, DWORD *characteristics) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + + TRACE("%p, %p.\n", iface, characteristics); + + if (source->state == SOURCE_SHUTDOWN) + return MF_E_SHUTDOWN; + + *characteristics = MFMEDIASOURCE_CAN_SEEK | MFMEDIASOURCE_CAN_PAUSE; + + return S_OK; +} + +static HRESULT WINAPI media_source_CreatePresentationDescriptor(IMFMediaSource *iface, IMFPresentationDescriptor **descriptor) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + + TRACE("%p, %p.\n", iface, descriptor); + + if (source->state == SOURCE_SHUTDOWN) + return MF_E_SHUTDOWN; + + return IMFPresentationDescriptor_Clone(source->pres_desc, descriptor); +} + +static HRESULT WINAPI media_source_Start(IMFMediaSource *iface, IMFPresentationDescriptor *descriptor, + const GUID *time_format, const PROPVARIANT *position) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + struct source_async_command *command; + HRESULT hr; + + TRACE("%p, %p, %p, %p.\n", iface, descriptor, time_format, position); + + if (source->state == SOURCE_SHUTDOWN) + return MF_E_SHUTDOWN; + + if (!(IsEqualIID(time_format, &GUID_NULL))) + return MF_E_UNSUPPORTED_TIME_FORMAT; + + if (SUCCEEDED(hr = source_create_async_op(SOURCE_ASYNC_START, &command))) + { + command->u.start.descriptor = descriptor; + command->u.start.format = *time_format; + PropVariantCopy(&command->u.start.position, position); + + hr = MFPutWorkItem(source->async_commands_queue, &source->async_commands_callback, &command->IUnknown_iface); + } + + return hr; +} + +static HRESULT WINAPI media_source_Stop(IMFMediaSource *iface) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + struct source_async_command *command; + HRESULT hr; + + TRACE("%p.\n", iface); + + if (source->state == SOURCE_SHUTDOWN) + return MF_E_SHUTDOWN; + + if (SUCCEEDED(hr = source_create_async_op(SOURCE_ASYNC_STOP, &command))) + hr = MFPutWorkItem(source->async_commands_queue, &source->async_commands_callback, &command->IUnknown_iface); + + return hr; +} + +static HRESULT WINAPI media_source_Pause(IMFMediaSource *iface) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + struct source_async_command *command; + HRESULT hr; + + TRACE("%p.\n", iface); + + if (source->state == SOURCE_SHUTDOWN) + return MF_E_SHUTDOWN; + + if (source->state != SOURCE_RUNNING) + return MF_E_INVALID_STATE_TRANSITION; + + if (SUCCEEDED(hr = source_create_async_op(SOURCE_ASYNC_PAUSE, &command))) + hr = MFPutWorkItem(source->async_commands_queue, + &source->async_commands_callback, &command->IUnknown_iface); + + return S_OK; +} + +static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface) +{ + struct media_source *source = impl_from_IMFMediaSource(iface); + unsigned int i; + + TRACE("%p.\n", iface); + + if (source->state == SOURCE_SHUTDOWN) + return MF_E_SHUTDOWN; + + source->state = SOURCE_SHUTDOWN; + + wg_parser_disconnect(source->wg_parser); + + source->read_thread_shutdown = true; + WaitForSingleObject(source->read_thread, INFINITE); + CloseHandle(source->read_thread); + + IMFPresentationDescriptor_Release(source->pres_desc); + IMFMediaEventQueue_Shutdown(source->event_queue); + IMFByteStream_Release(source->byte_stream); + + for (i = 0; i < source->stream_count; i++) + { + struct media_stream *stream = source->streams[i]; + + stream->state = STREAM_SHUTDOWN; + + IMFMediaEventQueue_Shutdown(stream->event_queue); + IMFStreamDescriptor_Release(stream->descriptor); + IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface); + + IMFMediaStream_Release(&stream->IMFMediaStream_iface); + } + + wg_parser_destroy(source->wg_parser); + + free(source->streams); + + MFUnlockWorkQueue(source->async_commands_queue); + + return S_OK; +} + +static const IMFMediaSourceVtbl IMFMediaSource_vtbl = +{ + media_source_QueryInterface, + media_source_AddRef, + media_source_Release, + media_source_GetEvent, + media_source_BeginGetEvent, + media_source_EndGetEvent, + media_source_QueueEvent, + media_source_GetCharacteristics, + media_source_CreatePresentationDescriptor, + media_source_Start, + media_source_Stop, + media_source_Pause, + media_source_Shutdown, +}; + +static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_source **out_media_source) +{ + BOOL video_selected = FALSE, audio_selected = FALSE; + IMFStreamDescriptor **descriptors = NULL; + unsigned int stream_count = UINT_MAX; + struct media_source *object; + UINT64 total_pres_time = 0; + struct wg_parser *parser; + DWORD bytestream_caps; + uint64_t file_size; + unsigned int i; + HRESULT hr; + + if (FAILED(hr = IMFByteStream_GetCapabilities(bytestream, &bytestream_caps))) + return hr; + + if (!(bytestream_caps & MFBYTESTREAM_IS_SEEKABLE)) + { + FIXME("Non-seekable bytestreams not supported.\n"); + return MF_E_BYTESTREAM_NOT_SEEKABLE; + } + + if (FAILED(hr = IMFByteStream_GetLength(bytestream, &file_size))) + { + FIXME("Failed to get byte stream length, hr %#x.\n", hr); + return hr; + } + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl; + object->IMFGetService_iface.lpVtbl = &media_source_get_service_vtbl; + object->IMFRateSupport_iface.lpVtbl = &media_source_rate_support_vtbl; + object->IMFRateControl_iface.lpVtbl = &media_source_rate_control_vtbl; + object->async_commands_callback.lpVtbl = &source_async_commands_callback_vtbl; + object->ref = 1; + object->byte_stream = bytestream; + IMFByteStream_AddRef(bytestream); + + if (FAILED(hr = MFCreateEventQueue(&object->event_queue))) + goto fail; + + if (FAILED(hr = MFAllocateWorkQueue(&object->async_commands_queue))) + goto fail; + + /* In Media Foundation, sources may read from any media source stream + * without fear of blocking due to buffering limits on another. Trailmakers, + * a Unity3D Engine game, only reads one sample from the audio stream (and + * never deselects it). Remove buffering limits from decodebin in order to + * account for this. Note that this does leak memory, but the same memory + * leak occurs with native. */ + if (!(parser = wg_parser_create(WG_PARSER_DECODEBIN, true))) + { + hr = E_OUTOFMEMORY; + goto fail; + } + object->wg_parser = parser; + + object->read_thread = CreateThread(NULL, 0, read_thread, object, 0, NULL); + + object->state = SOURCE_OPENING; + + if (FAILED(hr = wg_parser_connect(parser, file_size))) + goto fail; + + stream_count = wg_parser_get_stream_count(parser); + + if (!(object->streams = calloc(stream_count, sizeof(*object->streams)))) + { + hr = E_OUTOFMEMORY; + goto fail; + } + + for (i = 0; i < stream_count; ++i) + { + if (FAILED(hr = new_media_stream(object, wg_parser_get_stream(parser, i), i, &object->streams[i]))) + goto fail; + + if (FAILED(hr = media_stream_init_desc(object->streams[i]))) + { + ERR("Failed to finish initialization of media stream %p, hr %x.\n", object->streams[i], hr); + IMFMediaSource_Release(&object->streams[i]->parent_source->IMFMediaSource_iface); + IMFMediaEventQueue_Release(object->streams[i]->event_queue); + free(object->streams[i]); + goto fail; + } + + object->stream_count++; + } + + /* init presentation descriptor */ + + descriptors = malloc(object->stream_count * sizeof(IMFStreamDescriptor *)); + for (i = 0; i < object->stream_count; i++) + { + IMFStreamDescriptor **descriptor = &descriptors[object->stream_count - 1 - i]; + char language[128]; + DWORD language_len; + WCHAR *languageW; + + IMFMediaStream_GetStreamDescriptor(&object->streams[i]->IMFMediaStream_iface, descriptor); + + if (wg_parser_stream_get_language(object->streams[i]->wg_stream, language, sizeof(language))) + { + if ((language_len = MultiByteToWideChar(CP_UTF8, 0, language, -1, NULL, 0))) + { + languageW = malloc(language_len * sizeof(WCHAR)); + if (MultiByteToWideChar(CP_UTF8, 0, language, -1, languageW, language_len)) + { + IMFStreamDescriptor_SetString(*descriptor, &MF_SD_LANGUAGE, languageW); + } + free(languageW); + } + } + } + + if (FAILED(hr = MFCreatePresentationDescriptor(object->stream_count, descriptors, &object->pres_desc))) + goto fail; + + /* Select one of each major type. */ + for (i = 0; i < object->stream_count; i++) + { + IMFMediaTypeHandler *handler; + GUID major_type; + BOOL select_stream = FALSE; + + IMFStreamDescriptor_GetMediaTypeHandler(descriptors[i], &handler); + IMFMediaTypeHandler_GetMajorType(handler, &major_type); + if (IsEqualGUID(&major_type, &MFMediaType_Video) && !video_selected) + { + select_stream = TRUE; + video_selected = TRUE; + } + if (IsEqualGUID(&major_type, &MFMediaType_Audio) && !audio_selected) + { + select_stream = TRUE; + audio_selected = TRUE; + } + if (select_stream) + IMFPresentationDescriptor_SelectStream(object->pres_desc, i); + IMFMediaTypeHandler_Release(handler); + IMFStreamDescriptor_Release(descriptors[i]); + } + free(descriptors); + descriptors = NULL; + + for (i = 0; i < object->stream_count; i++) + total_pres_time = max(total_pres_time, + wg_parser_stream_get_duration(object->streams[i]->wg_stream)); + + if (object->stream_count) + IMFPresentationDescriptor_SetUINT64(object->pres_desc, &MF_PD_DURATION, total_pres_time); + + object->state = SOURCE_STOPPED; + + *out_media_source = object; + return S_OK; + + fail: + WARN("Failed to construct MFMediaSource, hr %#x.\n", hr); + + if (descriptors) + { + for (i = 0; i < object->stream_count; i++) + IMFStreamDescriptor_Release(descriptors[i]); + free(descriptors); + } + for (i = 0; i < object->stream_count; i++) + { + struct media_stream *stream = object->streams[i]; + + IMFMediaEventQueue_Release(stream->event_queue); + IMFStreamDescriptor_Release(stream->descriptor); + IMFMediaSource_Release(&stream->parent_source->IMFMediaSource_iface); + + free(stream); + } + free(object->streams); + if (stream_count != UINT_MAX) + wg_parser_disconnect(object->wg_parser); + if (object->read_thread) + { + object->read_thread_shutdown = true; + WaitForSingleObject(object->read_thread, INFINITE); + CloseHandle(object->read_thread); + } + if (object->wg_parser) + wg_parser_destroy(object->wg_parser); + if (object->async_commands_queue) + MFUnlockWorkQueue(object->async_commands_queue); + if (object->event_queue) + IMFMediaEventQueue_Release(object->event_queue); + IMFByteStream_Release(object->byte_stream); + free(object); + return hr; +} + +struct winegstreamer_stream_handler_result +{ + struct list entry; + IMFAsyncResult *result; + MF_OBJECT_TYPE obj_type; + IUnknown *object; +}; + +struct winegstreamer_stream_handler +{ + IMFByteStreamHandler IMFByteStreamHandler_iface; + IMFAsyncCallback IMFAsyncCallback_iface; + LONG refcount; + struct list results; + CRITICAL_SECTION cs; +}; + +static struct winegstreamer_stream_handler *impl_from_IMFByteStreamHandler(IMFByteStreamHandler *iface) +{ + return CONTAINING_RECORD(iface, struct winegstreamer_stream_handler, IMFByteStreamHandler_iface); +} + +static struct winegstreamer_stream_handler *impl_from_IMFAsyncCallback(IMFAsyncCallback *iface) +{ + return CONTAINING_RECORD(iface, struct winegstreamer_stream_handler, IMFAsyncCallback_iface); +} + +static HRESULT WINAPI winegstreamer_stream_handler_QueryInterface(IMFByteStreamHandler *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IMFByteStreamHandler) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFByteStreamHandler_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI winegstreamer_stream_handler_AddRef(IMFByteStreamHandler *iface) +{ + struct winegstreamer_stream_handler *handler = impl_from_IMFByteStreamHandler(iface); + ULONG refcount = InterlockedIncrement(&handler->refcount); + + TRACE("%p, refcount %u.\n", handler, refcount); + + return refcount; +} + +static ULONG WINAPI winegstreamer_stream_handler_Release(IMFByteStreamHandler *iface) +{ + struct winegstreamer_stream_handler *handler = impl_from_IMFByteStreamHandler(iface); + ULONG refcount = InterlockedDecrement(&handler->refcount); + struct winegstreamer_stream_handler_result *result, *next; + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + LIST_FOR_EACH_ENTRY_SAFE(result, next, &handler->results, struct winegstreamer_stream_handler_result, entry) + { + list_remove(&result->entry); + IMFAsyncResult_Release(result->result); + if (result->object) + IUnknown_Release(result->object); + free(result); + } + DeleteCriticalSection(&handler->cs); + free(handler); + } + + return refcount; +} + +struct create_object_context +{ + IUnknown IUnknown_iface; + LONG refcount; + + IPropertyStore *props; + IMFByteStream *stream; + WCHAR *url; + DWORD flags; +}; + +static struct create_object_context *impl_from_IUnknown(IUnknown *iface) +{ + return CONTAINING_RECORD(iface, struct create_object_context, IUnknown_iface); +} + +static HRESULT WINAPI create_object_context_QueryInterface(IUnknown *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI create_object_context_AddRef(IUnknown *iface) +{ + struct create_object_context *context = impl_from_IUnknown(iface); + ULONG refcount = InterlockedIncrement(&context->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI create_object_context_Release(IUnknown *iface) +{ + struct create_object_context *context = impl_from_IUnknown(iface); + ULONG refcount = InterlockedDecrement(&context->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + if (context->props) + IPropertyStore_Release(context->props); + if (context->stream) + IMFByteStream_Release(context->stream); + free(context->url); + free(context); + } + + return refcount; +} + +static const IUnknownVtbl create_object_context_vtbl = +{ + create_object_context_QueryInterface, + create_object_context_AddRef, + create_object_context_Release, +}; + +static HRESULT WINAPI winegstreamer_stream_handler_BeginCreateObject(IMFByteStreamHandler *iface, IMFByteStream *stream, const WCHAR *url, DWORD flags, + IPropertyStore *props, IUnknown **cancel_cookie, IMFAsyncCallback *callback, IUnknown *state) +{ + struct winegstreamer_stream_handler *this = impl_from_IMFByteStreamHandler(iface); + struct create_object_context *context; + IMFAsyncResult *caller, *item; + HRESULT hr; + + TRACE("%p, %s, %#x, %p, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, cancel_cookie, callback, state); + + if (cancel_cookie) + *cancel_cookie = NULL; + + if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &caller))) + return hr; + + if (!(context = calloc(1, sizeof(*context)))) + { + IMFAsyncResult_Release(caller); + return E_OUTOFMEMORY; + } + + context->IUnknown_iface.lpVtbl = &create_object_context_vtbl; + context->refcount = 1; + context->props = props; + if (context->props) + IPropertyStore_AddRef(context->props); + context->flags = flags; + context->stream = stream; + if (context->stream) + IMFByteStream_AddRef(context->stream); + if (url) + context->url = wcsdup(url); + if (!context->stream) + { + IMFAsyncResult_Release(caller); + IUnknown_Release(&context->IUnknown_iface); + return E_OUTOFMEMORY; + } + + hr = MFCreateAsyncResult(&context->IUnknown_iface, &this->IMFAsyncCallback_iface, (IUnknown *)caller, &item); + IUnknown_Release(&context->IUnknown_iface); + if (SUCCEEDED(hr)) + { + if (SUCCEEDED(hr = MFPutWorkItemEx(MFASYNC_CALLBACK_QUEUE_IO, item))) + { + if (cancel_cookie) + { + *cancel_cookie = (IUnknown *)caller; + IUnknown_AddRef(*cancel_cookie); + } + } + + IMFAsyncResult_Release(item); + } + IMFAsyncResult_Release(caller); + + return hr; +} + +static HRESULT WINAPI winegstreamer_stream_handler_EndCreateObject(IMFByteStreamHandler *iface, IMFAsyncResult *result, + MF_OBJECT_TYPE *obj_type, IUnknown **object) +{ + struct winegstreamer_stream_handler *this = impl_from_IMFByteStreamHandler(iface); + struct winegstreamer_stream_handler_result *found = NULL, *cur; + HRESULT hr; + + TRACE("%p, %p, %p, %p.\n", iface, result, obj_type, object); + + EnterCriticalSection(&this->cs); + + LIST_FOR_EACH_ENTRY(cur, &this->results, struct winegstreamer_stream_handler_result, entry) + { + if (result == cur->result) + { + list_remove(&cur->entry); + found = cur; + break; + } + } + + LeaveCriticalSection(&this->cs); + + if (found) + { + *obj_type = found->obj_type; + *object = found->object; + hr = IMFAsyncResult_GetStatus(found->result); + IMFAsyncResult_Release(found->result); + free(found); + } + else + { + *obj_type = MF_OBJECT_INVALID; + *object = NULL; + hr = MF_E_UNEXPECTED; + } + + return hr; +} + +static HRESULT WINAPI winegstreamer_stream_handler_CancelObjectCreation(IMFByteStreamHandler *iface, IUnknown *cancel_cookie) +{ + struct winegstreamer_stream_handler *this = impl_from_IMFByteStreamHandler(iface); + struct winegstreamer_stream_handler_result *found = NULL, *cur; + + TRACE("%p, %p.\n", iface, cancel_cookie); + + EnterCriticalSection(&this->cs); + + LIST_FOR_EACH_ENTRY(cur, &this->results, struct winegstreamer_stream_handler_result, entry) + { + if (cancel_cookie == (IUnknown *)cur->result) + { + list_remove(&cur->entry); + found = cur; + break; + } + } + + LeaveCriticalSection(&this->cs); + + if (found) + { + IMFAsyncResult_Release(found->result); + if (found->object) + IUnknown_Release(found->object); + free(found); + } + + return found ? S_OK : MF_E_UNEXPECTED; +} + +static HRESULT WINAPI winegstreamer_stream_handler_GetMaxNumberOfBytesRequiredForResolution(IMFByteStreamHandler *iface, QWORD *bytes) +{ + FIXME("stub (%p %p)\n", iface, bytes); + return E_NOTIMPL; +} + +static const IMFByteStreamHandlerVtbl winegstreamer_stream_handler_vtbl = +{ + winegstreamer_stream_handler_QueryInterface, + winegstreamer_stream_handler_AddRef, + winegstreamer_stream_handler_Release, + winegstreamer_stream_handler_BeginCreateObject, + winegstreamer_stream_handler_EndCreateObject, + winegstreamer_stream_handler_CancelObjectCreation, + winegstreamer_stream_handler_GetMaxNumberOfBytesRequiredForResolution, +}; + +static HRESULT WINAPI winegstreamer_stream_handler_callback_QueryInterface(IMFAsyncCallback *iface, REFIID riid, void **obj) +{ + if (IsEqualIID(riid, &IID_IMFAsyncCallback) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFAsyncCallback_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI winegstreamer_stream_handler_callback_AddRef(IMFAsyncCallback *iface) +{ + struct winegstreamer_stream_handler *handler = impl_from_IMFAsyncCallback(iface); + return IMFByteStreamHandler_AddRef(&handler->IMFByteStreamHandler_iface); +} + +static ULONG WINAPI winegstreamer_stream_handler_callback_Release(IMFAsyncCallback *iface) +{ + struct winegstreamer_stream_handler *handler = impl_from_IMFAsyncCallback(iface); + return IMFByteStreamHandler_Release(&handler->IMFByteStreamHandler_iface); +} + +static HRESULT WINAPI winegstreamer_stream_handler_callback_GetParameters(IMFAsyncCallback *iface, DWORD *flags, DWORD *queue) +{ + return E_NOTIMPL; +} + +static HRESULT winegstreamer_stream_handler_create_object(struct winegstreamer_stream_handler *This, WCHAR *url, IMFByteStream *stream, DWORD flags, + IPropertyStore *props, IUnknown **out_object, MF_OBJECT_TYPE *out_obj_type) +{ + TRACE("%p, %s, %p, %u, %p, %p, %p.\n", This, debugstr_w(url), stream, flags, props, out_object, out_obj_type); + + if (flags & MF_RESOLUTION_MEDIASOURCE) + { + HRESULT hr; + struct media_source *new_source; + + if (FAILED(hr = media_source_constructor(stream, &new_source))) + return hr; + + TRACE("->(%p)\n", new_source); + + *out_object = (IUnknown*)&new_source->IMFMediaSource_iface; + *out_obj_type = MF_OBJECT_MEDIASOURCE; + + return S_OK; + } + else + { + FIXME("flags = %08x\n", flags); + return E_NOTIMPL; + } +} + +static HRESULT WINAPI winegstreamer_stream_handler_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) +{ + struct winegstreamer_stream_handler *handler = impl_from_IMFAsyncCallback(iface); + struct winegstreamer_stream_handler_result *handler_result; + MF_OBJECT_TYPE obj_type = MF_OBJECT_INVALID; + IUnknown *object = NULL, *context_object; + struct create_object_context *context; + IMFAsyncResult *caller; + HRESULT hr; + + caller = (IMFAsyncResult *)IMFAsyncResult_GetStateNoAddRef(result); + + if (FAILED(hr = IMFAsyncResult_GetObject(result, &context_object))) + { + WARN("Expected context set for callee result.\n"); + return hr; + } + + context = impl_from_IUnknown(context_object); + + hr = winegstreamer_stream_handler_create_object(handler, context->url, context->stream, context->flags, context->props, &object, &obj_type); + + if ((handler_result = malloc(sizeof(*handler_result)))) + { + handler_result->result = caller; + IMFAsyncResult_AddRef(handler_result->result); + handler_result->obj_type = obj_type; + handler_result->object = object; + + EnterCriticalSection(&handler->cs); + list_add_tail(&handler->results, &handler_result->entry); + LeaveCriticalSection(&handler->cs); + } + else + { + if (object) + IUnknown_Release(object); + hr = E_OUTOFMEMORY; + } + + IUnknown_Release(&context->IUnknown_iface); + + IMFAsyncResult_SetStatus(caller, hr); + MFInvokeCallback(caller); + + return S_OK; +} + +static const IMFAsyncCallbackVtbl winegstreamer_stream_handler_callback_vtbl = +{ + winegstreamer_stream_handler_callback_QueryInterface, + winegstreamer_stream_handler_callback_AddRef, + winegstreamer_stream_handler_callback_Release, + winegstreamer_stream_handler_callback_GetParameters, + winegstreamer_stream_handler_callback_Invoke, +}; + +HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj) +{ + struct winegstreamer_stream_handler *this; + HRESULT hr; + + TRACE("%s, %p.\n", debugstr_guid(riid), obj); + + if (!(this = calloc(1, sizeof(*this)))) + return E_OUTOFMEMORY; + + list_init(&this->results); + InitializeCriticalSection(&this->cs); + + this->IMFByteStreamHandler_iface.lpVtbl = &winegstreamer_stream_handler_vtbl; + this->IMFAsyncCallback_iface.lpVtbl = &winegstreamer_stream_handler_callback_vtbl; + this->refcount = 1; + + hr = IMFByteStreamHandler_QueryInterface(&this->IMFByteStreamHandler_iface, riid, obj); + IMFByteStreamHandler_Release(&this->IMFByteStreamHandler_iface); + + return hr; +} diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c index b36a44d1e1c..4f24ccbd237 100644 --- wine/dlls/mfplat/mediatype.c +++ wine/dlls/mfplat/mediatype.c @@ -25,6 +25,8 @@ #include "ks.h" #include "ksmedia.h" +#include "wine/debug.h" + WINE_DEFAULT_DEBUG_CHANNEL(mfplat); DEFINE_MEDIATYPE_GUID(MFVideoFormat_IMC1, MAKEFOURCC('I','M','C','1')); @@ -138,7 +140,7 @@ static ULONG WINAPI mediatype_AddRef(IMFMediaType *iface) struct media_type *media_type = impl_from_IMFMediaType(iface); ULONG refcount = InterlockedIncrement(&media_type->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -148,7 +150,7 @@ static ULONG WINAPI mediatype_Release(IMFMediaType *iface) struct media_type *media_type = impl_from_IMFMediaType(iface); ULONG refcount = InterlockedDecrement(&media_type->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -976,9 +978,8 @@ static const MFVIDEOFORMAT * WINAPI video_mediatype_GetVideoFormat(IMFVideoMedia TRACE("%p.\n", iface); CoTaskMemFree(media_type->video_format); - media_type->video_format = NULL; if (FAILED(hr = MFCreateMFVideoFormatFromMFMediaType(&media_type->IMFMediaType_iface, &media_type->video_format, &size))) - WARN("Failed to create format description, hr %#lx.\n", hr); + WARN("Failed to create format description, hr %#x.\n", hr); return media_type->video_format; } @@ -986,7 +987,7 @@ static const MFVIDEOFORMAT * WINAPI video_mediatype_GetVideoFormat(IMFVideoMedia static HRESULT WINAPI video_mediatype_GetVideoRepresentation(IMFVideoMediaType *iface, GUID representation, void **data, LONG stride) { - FIXME("%p, %s, %p, %ld.\n", iface, debugstr_guid(&representation), data, stride); + FIXME("%p, %s, %p, %d.\n", iface, debugstr_guid(&representation), data, stride); return E_NOTIMPL; } @@ -1377,11 +1378,10 @@ static const WAVEFORMATEX * WINAPI audio_mediatype_GetAudioFormat(IMFAudioMediaT TRACE("%p.\n", iface); CoTaskMemFree(media_type->audio_format); - media_type->audio_format = NULL; if (FAILED(hr = MFCreateWaveFormatExFromMFMediaType(&media_type->IMFMediaType_iface, &media_type->audio_format, &size, MFWaveFormatExConvertFlag_Normal))) { - WARN("Failed to create wave format description, hr %#lx.\n", hr); + WARN("Failed to create wave format description, hr %#x.\n", hr); } return media_type->audio_format; @@ -1498,7 +1498,7 @@ static ULONG WINAPI stream_descriptor_AddRef(IMFStreamDescriptor *iface) struct stream_desc *stream_desc = impl_from_IMFStreamDescriptor(iface); ULONG refcount = InterlockedIncrement(&stream_desc->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -1509,7 +1509,7 @@ static ULONG WINAPI stream_descriptor_Release(IMFStreamDescriptor *iface) ULONG refcount = InterlockedDecrement(&stream_desc->attributes.ref); unsigned int i; - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -1955,7 +1955,7 @@ static HRESULT WINAPI mediatype_handler_GetMediaTypeByIndex(IMFMediaTypeHandler { struct stream_desc *stream_desc = impl_from_IMFMediaTypeHandler(iface); - TRACE("%p, %lu, %p.\n", iface, index, type); + TRACE("%p, %u, %p.\n", iface, index, type); if (index >= stream_desc->media_types_count) return MF_E_NO_MORE_TYPES; @@ -2046,7 +2046,7 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count, unsigned int i; HRESULT hr; - TRACE("%ld, %ld, %p, %p.\n", identifier, count, types, descriptor); + TRACE("%d, %d, %p, %p.\n", identifier, count, types, descriptor); if (!count) return E_INVALIDARG; @@ -2104,7 +2104,7 @@ static ULONG WINAPI presentation_descriptor_AddRef(IMFPresentationDescriptor *if struct presentation_desc *presentation_desc = impl_from_IMFPresentationDescriptor(iface); ULONG refcount = InterlockedIncrement(&presentation_desc->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -2115,7 +2115,7 @@ static ULONG WINAPI presentation_descriptor_Release(IMFPresentationDescriptor *i ULONG refcount = InterlockedDecrement(&presentation_desc->attributes.ref); unsigned int i; - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -2433,7 +2433,7 @@ static HRESULT WINAPI presentation_descriptor_GetStreamDescriptorByIndex(IMFPres { struct presentation_desc *presentation_desc = impl_from_IMFPresentationDescriptor(iface); - TRACE("%p, %lu, %p, %p.\n", iface, index, selected, descriptor); + TRACE("%p, %u, %p, %p.\n", iface, index, selected, descriptor); if (index >= presentation_desc->count) return E_INVALIDARG; @@ -2452,7 +2452,7 @@ static HRESULT WINAPI presentation_descriptor_SelectStream(IMFPresentationDescri { struct presentation_desc *presentation_desc = impl_from_IMFPresentationDescriptor(iface); - TRACE("%p, %lu.\n", iface, index); + TRACE("%p, %u.\n", iface, index); if (index >= presentation_desc->count) return E_INVALIDARG; @@ -2468,7 +2468,7 @@ static HRESULT WINAPI presentation_descriptor_DeselectStream(IMFPresentationDesc { struct presentation_desc *presentation_desc = impl_from_IMFPresentationDescriptor(iface); - TRACE("%p, %lu.\n", iface, index); + TRACE("%p, %u.\n", iface, index); if (index >= presentation_desc->count) return E_INVALIDARG; @@ -2580,7 +2580,7 @@ HRESULT WINAPI MFCreatePresentationDescriptor(DWORD count, IMFStreamDescriptor * unsigned int i; HRESULT hr; - TRACE("%lu, %p, %p.\n", count, descriptors, out); + TRACE("%u, %p, %p.\n", count, descriptors, out); if (!count) return E_INVALIDARG; @@ -2685,7 +2685,7 @@ HRESULT WINAPI MFGetStrideForBitmapInfoHeader(DWORD fourcc, DWORD width, LONG *s struct uncompressed_video_format *format; GUID subtype; - TRACE("%s, %lu, %p.\n", debugstr_fourcc(fourcc), width, stride); + TRACE("%s, %u, %p.\n", debugstr_fourcc(fourcc), width, stride); memcpy(&subtype, &MFVideoFormat_Base, sizeof(subtype)); subtype.Data1 = fourcc; @@ -2752,15 +2752,15 @@ HRESULT WINAPI MFGetPlaneSize(DWORD fourcc, DWORD width, DWORD height, DWORD *si unsigned int stride; GUID subtype; - TRACE("%s, %lu, %lu, %p.\n", debugstr_fourcc(fourcc), width, height, size); + TRACE("%s, %u, %u, %p.\n", debugstr_fourcc(fourcc), width, height, size); memcpy(&subtype, &MFVideoFormat_Base, sizeof(subtype)); subtype.Data1 = fourcc; - if ((format = mf_get_video_format(&subtype))) - stride = mf_get_stride_for_format(format, width); - else - stride = 0; + if (!(format = mf_get_video_format(&subtype))) + return MF_E_INVALIDMEDIATYPE; + + stride = mf_get_stride_for_format(format, width); switch (fourcc) { @@ -2926,10 +2926,8 @@ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVE if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_NUM_CHANNELS, &value))) format->nChannels = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &value))) - format->nSamplesPerSec = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &value))) - format->nAvgBytesPerSec = value; + IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &format->nSamplesPerSec); + IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &format->nAvgBytesPerSec); if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &value))) format->nBlockAlign = value; if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_BITS_PER_SAMPLE, &value))) @@ -2941,8 +2939,7 @@ HRESULT WINAPI MFCreateWaveFormatExFromMFMediaType(IMFMediaType *mediatype, WAVE if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_VALID_BITS_PER_SAMPLE, &value))) format_ext->Samples.wSamplesPerBlock = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_CHANNEL_MASK, &value))) - format_ext->dwChannelMask = value; + IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_CHANNEL_MASK, &format_ext->dwChannelMask); memcpy(&format_ext->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM, sizeof(format_ext->SubFormat)); } @@ -3088,8 +3085,8 @@ HRESULT WINAPI MFCreateAudioMediaType(const WAVEFORMATEX *format, IMFAudioMediaT return S_OK; } -static void media_type_get_ratio(IMFMediaType *media_type, const GUID *attr, DWORD *numerator, - DWORD *denominator) +static void media_type_get_ratio(IMFMediaType *media_type, const GUID *attr, UINT32 *numerator, + UINT32 *denominator) { UINT64 value; @@ -3105,7 +3102,7 @@ static void media_type_get_ratio(IMFMediaType *media_type, const GUID *attr, DWO */ HRESULT WINAPI MFCreateMFVideoFormatFromMFMediaType(IMFMediaType *media_type, MFVIDEOFORMAT **video_format, UINT32 *size) { - UINT32 flags, palette_size = 0, value; + UINT32 flags, palette_size = 0, avgrate; MFVIDEOFORMAT *format; INT32 stride; GUID guid; @@ -3165,12 +3162,11 @@ HRESULT WINAPI MFCreateMFVideoFormatFromMFMediaType(IMFMediaType *media_type, MF if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, (UINT32 *)&stride)) && stride < 0) format->videoInfo.VideoFlags |= MFVideoFlag_BottomUpLinearRep; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BITRATE, &value))) - format->compressedInfo.AvgBitrate = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BIT_ERROR_RATE, &value))) - format->compressedInfo.AvgBitErrorRate = value; - if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_MAX_KEYFRAME_SPACING, &value))) - format->compressedInfo.MaxKeyFrameSpacing = value; + if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BITRATE, &avgrate))) + format->compressedInfo.AvgBitrate = avgrate; + if (SUCCEEDED(IMFMediaType_GetUINT32(media_type, &MF_MT_AVG_BIT_ERROR_RATE, &avgrate))) + format->compressedInfo.AvgBitErrorRate = avgrate; + IMFMediaType_GetUINT32(media_type, &MF_MT_MAX_KEYFRAME_SPACING, &format->compressedInfo.MaxKeyFrameSpacing); /* Palette. */ if (palette_size) @@ -3217,15 +3213,15 @@ HRESULT WINAPI MFConvertColorInfoToDXVA(DWORD *dxva_info, const MFVIDEOFORMAT *f struct frame_rate { - UINT64 key; - UINT64 value; + UINT64 rate; + UINT64 frame_time; }; static int __cdecl frame_rate_compare(const void *a, const void *b) { - const UINT64 *key = a; + const UINT64 *rate = a; const struct frame_rate *known_rate = b; - return *key == known_rate->key ? 0 : ( *key < known_rate->key ? 1 : -1 ); + return *rate == known_rate->rate ? 0 : ( *rate < known_rate->rate ? 1 : -1 ); } /*********************************************************************** @@ -3254,7 +3250,7 @@ HRESULT WINAPI MFFrameRateToAverageTimePerFrame(UINT32 numerator, UINT32 denomin if ((entry = bsearch(&rate, known_rates, ARRAY_SIZE(known_rates), sizeof(*known_rates), frame_rate_compare))) { - *avgframetime = entry->value; + *avgframetime = entry->frame_time; } else *avgframetime = numerator ? denominator * (UINT64)10000000 / numerator : 0; @@ -3262,64 +3258,6 @@ HRESULT WINAPI MFFrameRateToAverageTimePerFrame(UINT32 numerator, UINT32 denomin return S_OK; } -static unsigned int get_gcd(unsigned int a, unsigned int b) -{ - unsigned int m; - - while (b) - { - m = a % b; - a = b; - b = m; - } - - return a; -} - -/*********************************************************************** - * MFAverageTimePerFrameToFrameRate (mfplat.@) - */ -HRESULT WINAPI MFAverageTimePerFrameToFrameRate(UINT64 avgtime, UINT32 *numerator, UINT32 *denominator) -{ - static const struct frame_rate known_rates[] = - { -#define KNOWN_RATE(ft,n,d) { ft, ((UINT64)n << 32) | d } - KNOWN_RATE(417188, 24000, 1001), - KNOWN_RATE(416667, 24, 1), - KNOWN_RATE(400000, 25, 1), - KNOWN_RATE(333667, 30000, 1001), - KNOWN_RATE(333333, 30, 1), - KNOWN_RATE(200000, 50, 1), - KNOWN_RATE(166833, 60000, 1001), - KNOWN_RATE(166667, 60, 1), -#undef KNOWN_RATE - }; - const struct frame_rate *entry; - unsigned int gcd; - - TRACE("%s, %p, %p.\n", wine_dbgstr_longlong(avgtime), numerator, denominator); - - if ((entry = bsearch(&avgtime, known_rates, ARRAY_SIZE(known_rates), sizeof(*known_rates), - frame_rate_compare))) - { - *numerator = entry->value >> 32; - *denominator = entry->value; - } - else if (avgtime) - { - if (avgtime > 100000000) avgtime = 100000000; - gcd = get_gcd(10000000, avgtime); - *numerator = 10000000 / gcd; - *denominator = avgtime / gcd; - } - else - { - *numerator = *denominator = 0; - } - - return S_OK; -} - /*********************************************************************** * MFMapDXGIFormatToDX9Format (mfplat.@) */ @@ -3513,7 +3451,7 @@ HRESULT WINAPI MFInitVideoFormat_RGB(MFVIDEOFORMAT *format, DWORD width, DWORD h { unsigned int transfer_function; - TRACE("%p, %lu, %lu, %#lx.\n", format, width, height, d3dformat); + TRACE("%p, %u, %u, %#x.\n", format, width, height, d3dformat); if (!format) return E_INVALIDARG; diff --git a/dlls/mfplat/mfplat.c b/dlls/mfplat/mfplat.c new file mode 100644 index 00000000000..3ec45d7de4e --- /dev/null +++ wine/dlls/mfplat/mfplat.c @@ -0,0 +1,1036 @@ +/* + * Copyright 2019 Nikolay Sivov for CodeWeavers + * Copyright 2020 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "ks.h" +#include "ksmedia.h" +#include "wmcodecdsp.h" +#include "initguid.h" +#include "mfapi.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +DEFINE_MEDIATYPE_GUID(MFAudioFormat_XMAudio2, 0x0166); + +struct video_processor +{ + IMFTransform IMFTransform_iface; + LONG refcount; + IMFAttributes *attributes; + IMFAttributes *output_attributes; +}; + +static struct video_processor *impl_video_processor_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct video_processor, IMFTransform_iface); +} + +static HRESULT WINAPI video_processor_QueryInterface(IMFTransform *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IMFTransform) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFTransform_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI video_processor_AddRef(IMFTransform *iface) +{ + struct video_processor *transform = impl_video_processor_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI video_processor_Release(IMFTransform *iface) +{ + struct video_processor *transform = impl_video_processor_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + if (transform->attributes) + IMFAttributes_Release(transform->attributes); + if (transform->output_attributes) + IMFAttributes_Release(transform->output_attributes); + free(transform); + } + + return refcount; +} + +static HRESULT WINAPI video_processor_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + TRACE("%p, %p, %p, %p, %p.\n", iface, input_minimum, input_maximum, output_minimum, output_maximum); + + *input_minimum = *input_maximum = *output_minimum = *output_maximum = 1; + + return S_OK; +} + +static HRESULT WINAPI video_processor_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + TRACE("%p, %p, %p.\n", iface, inputs, outputs); + + *inputs = *outputs = 1; + + return S_OK; +} + +static HRESULT WINAPI video_processor_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + struct video_processor *transform = impl_video_processor_from_IMFTransform(iface); + + TRACE("%p, %p.\n", iface, attributes); + + *attributes = transform->attributes; + IMFAttributes_AddRef(*attributes); + + return S_OK; +} + +static HRESULT WINAPI video_processor_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + struct video_processor *transform = impl_video_processor_from_IMFTransform(iface); + + TRACE("%p, %u, %p.\n", iface, id, attributes); + + *attributes = transform->output_attributes; + IMFAttributes_AddRef(*attributes); + + return S_OK; +} + +static HRESULT WINAPI video_processor_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + TRACE("%p, %u.\n", iface, id); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + TRACE("%p, %u, %p.\n", iface, streams, ids); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + FIXME("%p, %u, %u, %p.\n", iface, id, index, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + FIXME("%p, %u, %u, %p.\n", iface, id, index, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + FIXME("%p, %u, %p, %#x.\n", iface, id, type, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + FIXME("%p, %u, %p, %#x.\n", iface, id, type, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("%p, %u, %p.\n", iface, id, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("%p, %p.\n", iface, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("%p, %s, %s.\n", iface, wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + TRACE("%p, %u, %p.\n", iface, id, event); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + FIXME("%p, %u.\n", iface, message); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + FIXME("%p, %u, %p, %#x.\n", iface, id, sample, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI video_processor_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + FIXME("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); + + return E_NOTIMPL; +} + +static const IMFTransformVtbl video_processor_vtbl = +{ + video_processor_QueryInterface, + video_processor_AddRef, + video_processor_Release, + video_processor_GetStreamLimits, + video_processor_GetStreamCount, + video_processor_GetStreamIDs, + video_processor_GetInputStreamInfo, + video_processor_GetOutputStreamInfo, + video_processor_GetAttributes, + video_processor_GetInputStreamAttributes, + video_processor_GetOutputStreamAttributes, + video_processor_DeleteInputStream, + video_processor_AddInputStreams, + video_processor_GetInputAvailableType, + video_processor_GetOutputAvailableType, + video_processor_SetInputType, + video_processor_SetOutputType, + video_processor_GetInputCurrentType, + video_processor_GetOutputCurrentType, + video_processor_GetInputStatus, + video_processor_GetOutputStatus, + video_processor_SetOutputBounds, + video_processor_ProcessEvent, + video_processor_ProcessMessage, + video_processor_ProcessInput, + video_processor_ProcessOutput, +}; + +struct class_factory +{ + IClassFactory IClassFactory_iface; + LONG refcount; + HRESULT (*create_instance)(REFIID riid, void **obj); +}; + +static struct class_factory *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, struct class_factory, IClassFactory_iface); +} + +static HRESULT WINAPI class_factory_QueryInterface(IClassFactory *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualGUID(riid, &IID_IClassFactory) || + IsEqualGUID(riid, &IID_IUnknown)) + { + *obj = iface; + IClassFactory_AddRef(iface); + return S_OK; + } + + WARN("%s is not supported.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI class_factory_AddRef(IClassFactory *iface) +{ + struct class_factory *factory = impl_from_IClassFactory(iface); + return InterlockedIncrement(&factory->refcount); +} + +static ULONG WINAPI class_factory_Release(IClassFactory *iface) +{ + struct class_factory *factory = impl_from_IClassFactory(iface); + ULONG refcount = InterlockedDecrement(&factory->refcount); + + if (!refcount) + free(factory); + + return refcount; +} + +static HRESULT WINAPI class_factory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **obj) +{ + struct class_factory *factory = impl_from_IClassFactory(iface); + + TRACE("%p, %p, %s, %p.\n", iface, outer, debugstr_guid(riid), obj); + + if (outer) + { + *obj = NULL; + return CLASS_E_NOAGGREGATION; + } + + return factory->create_instance(riid, obj); +} + +static HRESULT WINAPI class_factory_LockServer(IClassFactory *iface, BOOL dolock) +{ + TRACE("%p, %d.\n", iface, dolock); + return S_OK; +} + +static const IClassFactoryVtbl class_factory_vtbl = +{ + class_factory_QueryInterface, + class_factory_AddRef, + class_factory_Release, + class_factory_CreateInstance, + class_factory_LockServer, +}; + +static HRESULT video_processor_create(REFIID riid, void **ret) +{ + struct video_processor *object; + HRESULT hr; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IMFTransform_iface.lpVtbl = &video_processor_vtbl; + object->refcount = 1; + + if (FAILED(hr = MFCreateAttributes(&object->attributes, 0))) + goto failed; + + if (FAILED(hr = MFCreateAttributes(&object->output_attributes, 0))) + goto failed; + + *ret = &object->IMFTransform_iface; + return S_OK; + +failed: + + IMFTransform_Release(&object->IMFTransform_iface); + return hr; +} + +static const GUID CLSID_GStreamerByteStreamHandler = {0x317df618, 0x5e5a, 0x468a, {0x9f, 0x15, 0xd8, 0x27, 0xa9, 0xa0, 0x81, 0x62}}; + +static const GUID CLSID_WINEAudioConverter = {0x6a170414,0xaad9,0x4693,{0xb8,0x06,0x3a,0x0c,0x47,0xc5,0x70,0xd6}}; + +static const struct class_object +{ + const GUID *clsid; + HRESULT (*create_instance)(REFIID riid, void **obj); +} +class_objects[] = +{ + { &CLSID_VideoProcessorMFT, &video_processor_create }, + { &CLSID_GStreamerByteStreamHandler, &winegstreamer_stream_handler_create }, + { &CLSID_WINEAudioConverter, &audio_converter_create }, + { &CLSID_CColorConvertDMO, &color_converter_create }, + { &CLSID_MSH264DecoderMFT, &h264_decoder_create }, + { &CLSID_MSAACDecMFT, &aac_decoder_create }, +}; + +HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) +{ + struct class_factory *factory; + unsigned int i; + HRESULT hr; + + for (i = 0; i < ARRAY_SIZE(class_objects); ++i) + { + if (IsEqualGUID(class_objects[i].clsid, rclsid)) + { + if (!(factory = malloc(sizeof(*factory)))) + return E_OUTOFMEMORY; + + factory->IClassFactory_iface.lpVtbl = &class_factory_vtbl; + factory->refcount = 1; + factory->create_instance = class_objects[i].create_instance; + + hr = IClassFactory_QueryInterface(&factory->IClassFactory_iface, riid, obj); + IClassFactory_Release(&factory->IClassFactory_iface); + return hr; + } + } + + return CLASS_E_CLASSNOTAVAILABLE; +} + +static WCHAR audio_converterW[] = L"Audio Converter"; +static const GUID *audio_converter_supported_types[] = +{ + &MFAudioFormat_PCM, + &MFAudioFormat_Float, +}; + +static WCHAR wma_decoderW[] = L"WMAudio Decoder MFT"; +static const GUID *wma_decoder_input_types[] = +{ + &MEDIASUBTYPE_MSAUDIO1, + &MFAudioFormat_WMAudioV8, + &MFAudioFormat_WMAudioV9, + &MFAudioFormat_WMAudio_Lossless, +}; +static const GUID *wma_decoder_output_types[] = +{ + &MFAudioFormat_PCM, + &MFAudioFormat_Float, +}; + +static WCHAR video_processorW[] = L"Video Processor MFT"; +static const GUID *video_processor_supported_types[] = +{ + &MFVideoFormat_IYUV, +}; + +static WCHAR color_converterW[] = L"Color Converter"; +static const GUID *color_converter_supported_types[] = +{ + &MFVideoFormat_RGB24, + &MFVideoFormat_RGB32, + &MFVideoFormat_RGB555, + &MFVideoFormat_RGB8, + &MFVideoFormat_AYUV, + &MFVideoFormat_I420, + &MFVideoFormat_IYUV, + &MFVideoFormat_NV11, + &MFVideoFormat_NV12, + &MFVideoFormat_UYVY, + &MFVideoFormat_v216, + &MFVideoFormat_v410, + &MFVideoFormat_YUY2, + &MFVideoFormat_YVYU, + &MFVideoFormat_YVYU, +}; + +static WCHAR h264_decoderW[] = L"H.264 Decoder"; +static const GUID *h264_decoder_input_types[] = +{ + &MFVideoFormat_H264, +}; +static const GUID *h264_decoder_output_types[] = +{ + &MFVideoFormat_NV12, + &MFVideoFormat_I420, + &MFVideoFormat_IYUV, + &MFVideoFormat_YUY2, + &MFVideoFormat_YV12, +}; + +static WCHAR aac_decoderW[] = L"AAC Decoder"; +static const GUID *aac_decoder_input_types[] = +{ + &MFAudioFormat_AAC, +}; +static const GUID *aac_decoder_output_types[] = +{ + &MFAudioFormat_Float, + &MFAudioFormat_PCM, +}; + +static const struct mft +{ + const GUID *clsid; + const GUID *category; + LPWSTR name; + const UINT32 flags; + const GUID *major_type; + const UINT32 input_types_count; + const GUID **input_types; + const UINT32 output_types_count; + const GUID **output_types; +} +mfts[] = +{ + { + &CLSID_WINEAudioConverter, + &MFT_CATEGORY_AUDIO_EFFECT, + audio_converterW, + MFT_ENUM_FLAG_SYNCMFT, + &MFMediaType_Audio, + ARRAY_SIZE(audio_converter_supported_types), + audio_converter_supported_types, + ARRAY_SIZE(audio_converter_supported_types), + audio_converter_supported_types, + }, + { + &CLSID_WMADecMediaObject, + &MFT_CATEGORY_AUDIO_DECODER, + wma_decoderW, + MFT_ENUM_FLAG_SYNCMFT, + &MFMediaType_Audio, + ARRAY_SIZE(wma_decoder_input_types), + wma_decoder_input_types, + ARRAY_SIZE(wma_decoder_output_types), + wma_decoder_output_types, + }, + { + &CLSID_VideoProcessorMFT, + &MFT_CATEGORY_VIDEO_PROCESSOR, + video_processorW, + 0, + &MFMediaType_Video, + ARRAY_SIZE(video_processor_supported_types), + video_processor_supported_types, + ARRAY_SIZE(video_processor_supported_types), + video_processor_supported_types, + }, + { + &CLSID_CColorConvertDMO, + &MFT_CATEGORY_VIDEO_EFFECT, + color_converterW, + MFT_ENUM_FLAG_SYNCMFT, + &MFMediaType_Video, + ARRAY_SIZE(color_converter_supported_types), + color_converter_supported_types, + ARRAY_SIZE(color_converter_supported_types), + color_converter_supported_types, + }, + { + &CLSID_MSH264DecoderMFT, + &MFT_CATEGORY_VIDEO_DECODER, + h264_decoderW, + MFT_ENUM_FLAG_SYNCMFT, + &MFMediaType_Video, + ARRAY_SIZE(h264_decoder_input_types), + h264_decoder_input_types, + ARRAY_SIZE(h264_decoder_output_types), + h264_decoder_output_types, + }, + { + &CLSID_MSAACDecMFT, + &MFT_CATEGORY_AUDIO_DECODER, + aac_decoderW, + MFT_ENUM_FLAG_SYNCMFT, + &MFMediaType_Audio, + ARRAY_SIZE(aac_decoder_input_types), + aac_decoder_input_types, + ARRAY_SIZE(aac_decoder_output_types), + aac_decoder_output_types, + }, +}; + +HRESULT mfplat_DllRegisterServer(void) +{ + unsigned int i, j; + HRESULT hr; + MFT_REGISTER_TYPE_INFO input_types[15], output_types[15]; + + for (i = 0; i < ARRAY_SIZE(mfts); i++) + { + const struct mft *cur = &mfts[i]; + + for (j = 0; j < cur->input_types_count; j++) + { + input_types[j].guidMajorType = *(cur->major_type); + input_types[j].guidSubtype = *(cur->input_types[j]); + } + for (j = 0; j < cur->output_types_count; j++) + { + output_types[j].guidMajorType = *(cur->major_type); + output_types[j].guidSubtype = *(cur->output_types[j]); + } + + hr = MFTRegister(*(cur->clsid), *(cur->category), cur->name, cur->flags, cur->input_types_count, + input_types, cur->output_types_count, output_types, NULL); + + if (FAILED(hr)) + { + FIXME("Failed to register MFT, hr %#x\n", hr); + return hr; + } + } + return S_OK; +} + +static const struct +{ + const GUID *subtype; + enum wg_video_format format; +} +video_formats[] = +{ + {&MFVideoFormat_ARGB32, WG_VIDEO_FORMAT_BGRA}, + {&MFVideoFormat_RGB32, WG_VIDEO_FORMAT_BGRx}, + {&MFVideoFormat_RGB24, WG_VIDEO_FORMAT_BGR}, + {&MFVideoFormat_RGB555, WG_VIDEO_FORMAT_RGB15}, + {&MFVideoFormat_RGB565, WG_VIDEO_FORMAT_RGB16}, + {&MFVideoFormat_AYUV, WG_VIDEO_FORMAT_AYUV}, + {&MFVideoFormat_I420, WG_VIDEO_FORMAT_I420}, + {&MFVideoFormat_IYUV, WG_VIDEO_FORMAT_I420}, + {&MFVideoFormat_NV12, WG_VIDEO_FORMAT_NV12}, + {&MFVideoFormat_UYVY, WG_VIDEO_FORMAT_UYVY}, + {&MFVideoFormat_YUY2, WG_VIDEO_FORMAT_YUY2}, + {&MFVideoFormat_YV12, WG_VIDEO_FORMAT_YV12}, + {&MFVideoFormat_YVYU, WG_VIDEO_FORMAT_YVYU}, +}; + +static const struct +{ + const GUID *subtype; + UINT32 depth; + enum wg_audio_format format; +} +audio_formats[] = +{ + {&MFAudioFormat_PCM, 8, WG_AUDIO_FORMAT_U8}, + {&MFAudioFormat_PCM, 16, WG_AUDIO_FORMAT_S16LE}, + {&MFAudioFormat_PCM, 24, WG_AUDIO_FORMAT_S24LE}, + {&MFAudioFormat_PCM, 32, WG_AUDIO_FORMAT_S32LE}, + {&MFAudioFormat_Float, 32, WG_AUDIO_FORMAT_F32LE}, + {&MFAudioFormat_Float, 64, WG_AUDIO_FORMAT_F64LE}, +}; + +static inline UINT64 make_uint64(UINT32 high, UINT32 low) +{ + return ((UINT64)high << 32) | low; +} + +static IMFMediaType *mf_media_type_from_wg_format_audio(const struct wg_format *format) +{ + IMFMediaType *type; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(audio_formats); ++i) + { + if (format->u.audio.format == audio_formats[i].format) + { + if (FAILED(MFCreateMediaType(&type))) + return NULL; + + IMFMediaType_SetGUID(type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); + IMFMediaType_SetGUID(type, &MF_MT_SUBTYPE, audio_formats[i].subtype); + IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, audio_formats[i].depth); + IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, format->u.audio.rate); + IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_NUM_CHANNELS, format->u.audio.channels); + if (format->u.audio.channel_mask) + IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_CHANNEL_MASK, format->u.audio.channel_mask); + IMFMediaType_SetUINT32(type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); + IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, format->u.audio.channels * audio_formats[i].depth / 8); + + return type; + } + } + + return NULL; +} + +static IMFMediaType *mf_media_type_from_wg_format_video(const struct wg_format *format) +{ + IMFMediaType *type; + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(video_formats); ++i) + { + if (format->u.video.format == video_formats[i].format) + { + if (FAILED(MFCreateMediaType(&type))) + return NULL; + + IMFMediaType_SetGUID(type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + IMFMediaType_SetGUID(type, &MF_MT_SUBTYPE, video_formats[i].subtype); + IMFMediaType_SetUINT64(type, &MF_MT_FRAME_SIZE, + make_uint64(format->u.video.width, format->u.video.height)); + IMFMediaType_SetUINT64(type, &MF_MT_FRAME_RATE, + make_uint64(format->u.video.fps_n, format->u.video.fps_d)); + IMFMediaType_SetUINT32(type, &MF_MT_COMPRESSED, FALSE); + IMFMediaType_SetUINT32(type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); + IMFMediaType_SetUINT32(type, &MF_MT_VIDEO_ROTATION, MFVideoRotationFormat_0); + + return type; + } + } + + return NULL; +} + +IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) +{ + switch (format->major_type) + { + case WG_MAJOR_TYPE_UNKNOWN: + return NULL; + + case WG_MAJOR_TYPE_AUDIO: + return mf_media_type_from_wg_format_audio(format); + + case WG_MAJOR_TYPE_VIDEO: + return mf_media_type_from_wg_format_video(format); + } + + assert(0); + return NULL; +} + +static void mf_media_type_to_wg_format_audio(IMFMediaType *type, struct wg_format *format) +{ + UINT32 rate, channels, channel_mask, depth; + unsigned int i; + GUID subtype; + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + { + FIXME("Subtype is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &rate))) + { + FIXME("Sample rate is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_NUM_CHANNELS, &channels))) + { + FIXME("Channel count is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &depth))) + { + FIXME("Depth is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_CHANNEL_MASK, &channel_mask))) + { + if (channels == 1) + channel_mask = KSAUDIO_SPEAKER_MONO; + else if (channels == 2) + channel_mask = KSAUDIO_SPEAKER_STEREO; + else if IsEqualGUID(&subtype, &MFAudioFormat_AAC) + channel_mask = 0; + else + { + FIXME("Channel mask is not set.\n"); + return; + } + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.channels = channels; + format->u.audio.channel_mask = channel_mask; + format->u.audio.rate = rate; + + for (i = 0; i < ARRAY_SIZE(audio_formats); ++i) + { + if (IsEqualGUID(&subtype, audio_formats[i].subtype) && depth == audio_formats[i].depth) + { + format->u.audio.format = audio_formats[i].format; + return; + } + } + FIXME("Unrecognized audio subtype %s, depth %u.\n", debugstr_guid(&subtype), depth); +} + +static void mf_media_type_to_wg_format_video(IMFMediaType *type, struct wg_format *format) +{ + UINT64 frame_rate, frame_size; + unsigned int i; + GUID subtype; + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + { + FIXME("Subtype is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &frame_size))) + { + FIXME("Frame size is not set.\n"); + return; + } + + format->major_type = WG_MAJOR_TYPE_VIDEO; + format->u.video.width = (UINT32)(frame_size >> 32); + format->u.video.height = (UINT32)frame_size; + format->u.video.fps_n = 1; + format->u.video.fps_d = 1; + + if (SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_RATE, &frame_rate)) && (UINT32)frame_rate) + { + format->u.video.fps_n = (UINT32)(frame_rate >> 32); + format->u.video.fps_d = (UINT32)frame_rate; + } + + for (i = 0; i < ARRAY_SIZE(video_formats); ++i) + { + if (IsEqualGUID(&subtype, video_formats[i].subtype)) + { + format->u.video.format = video_formats[i].format; + break; + } + } + if (i == ARRAY_SIZE(video_formats)) + FIXME("Unrecognized video subtype %s.\n", debugstr_guid(&subtype)); +} + +void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format) +{ + GUID major_type; + + memset(format, 0, sizeof(*format)); + + if (FAILED(IMFMediaType_GetMajorType(type, &major_type))) + { + FIXME("Major type is not set.\n"); + return; + } + + if (IsEqualGUID(&major_type, &MFMediaType_Audio)) + mf_media_type_to_wg_format_audio(type, format); + else if (IsEqualGUID(&major_type, &MFMediaType_Video)) + mf_media_type_to_wg_format_video(type, format); + else + FIXME("Unrecognized major type %s.\n", debugstr_guid(&major_type)); +} + +static void mf_media_type_to_wg_encoded_format_xwma(IMFMediaType *type, struct wg_encoded_format *format, + enum wg_encoded_type encoded_type, UINT32 version) +{ + UINT32 rate, depth, channels, block_align, bytes_per_second, codec_data_len; + BYTE codec_data[64]; + + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &rate))) + { + FIXME("Sample rate is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_NUM_CHANNELS, &channels))) + { + FIXME("Channel count is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &bytes_per_second))) + { + FIXME("Bitrate is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_align))) + { + FIXME("Block alignment is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &depth))) + { + FIXME("Depth is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetBlob(type, &MF_MT_USER_DATA, codec_data, sizeof(codec_data), &codec_data_len))) + { + FIXME("Codec data is not set.\n"); + return; + } + + format->encoded_type = encoded_type; + format->u.xwma.version = version; + format->u.xwma.bitrate = bytes_per_second * 8; + format->u.xwma.rate = rate; + format->u.xwma.depth = depth; + format->u.xwma.channels = channels; + format->u.xwma.block_align = block_align; + format->u.xwma.codec_data_len = codec_data_len; + memcpy(format->u.xwma.codec_data, codec_data, codec_data_len); +} + +static void mf_media_type_to_wg_encoded_format_aac(IMFMediaType *type, struct wg_encoded_format *format) +{ + UINT32 codec_data_len, payload_type, profile_level_indication; + BYTE codec_data[64]; + + /* Audio specific config is stored at after HEAACWAVEINFO in MF_MT_USER_DATA + * https://docs.microsoft.com/en-us/windows/win32/api/mmreg/ns-mmreg-heaacwaveformat + */ + struct + { + WORD payload_type; + WORD profile_level_indication; + WORD type; + WORD reserved1; + DWORD reserved2; + } *aac_info = (void *)codec_data; + + if (FAILED(IMFMediaType_GetBlob(type, &MF_MT_USER_DATA, codec_data, sizeof(codec_data), &codec_data_len))) + { + FIXME("Codec data is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AAC_PAYLOAD_TYPE, &payload_type))) + { + FIXME("AAC payload type is not set.\n"); + payload_type = aac_info->payload_type; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION, &profile_level_indication))) + { + FIXME("AAC provile level indication is not set.\n"); + profile_level_indication = aac_info->profile_level_indication; + } + + format->encoded_type = WG_ENCODED_TYPE_AAC; + format->u.aac.payload_type = payload_type; + format->u.aac.profile_level_indication = profile_level_indication; + format->u.aac.codec_data_len = 0; + + if (codec_data_len > sizeof(*aac_info)) + { + format->u.aac.codec_data_len = codec_data_len - sizeof(*aac_info); + memcpy(format->u.aac.codec_data, codec_data + sizeof(*aac_info), codec_data_len - sizeof(*aac_info)); + } +} + +static void mf_media_type_to_wg_encoded_format_h264(IMFMediaType *type, struct wg_encoded_format *format) +{ + UINT64 frame_rate, frame_size; + UINT32 profile, level; + + format->encoded_type = WG_ENCODED_TYPE_H264; + format->u.h264.width = 0; + format->u.h264.height = 0; + format->u.h264.fps_n = 1; + format->u.h264.fps_d = 1; + + if (SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &frame_size))) + { + format->u.h264.width = (UINT32)(frame_size >> 32); + format->u.h264.height = (UINT32)frame_size; + } + + if (SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_RATE, &frame_rate)) && (UINT32)frame_rate) + { + format->u.h264.fps_n = (UINT32)(frame_rate >> 32); + format->u.h264.fps_d = (UINT32)frame_rate; + } + + if (SUCCEEDED(IMFMediaType_GetUINT32(type, &MF_MT_MPEG2_PROFILE, &profile))) + format->u.h264.profile = profile; + + if (SUCCEEDED(IMFMediaType_GetUINT32(type, &MF_MT_MPEG2_LEVEL, &level))) + format->u.h264.level = level; +} + +void mf_media_type_to_wg_encoded_format(IMFMediaType *type, struct wg_encoded_format *format) +{ + GUID major_type, subtype; + + memset(format, 0, sizeof(*format)); + + if (FAILED(IMFMediaType_GetMajorType(type, &major_type))) + { + FIXME("Major type is not set.\n"); + return; + } + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + { + FIXME("Subtype is not set.\n"); + return; + } + + if (IsEqualGUID(&major_type, &MFMediaType_Audio)) + { + if (IsEqualGUID(&subtype, &MEDIASUBTYPE_MSAUDIO1)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 1); + else if (IsEqualGUID(&subtype, &MFAudioFormat_WMAudioV8)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 2); + else if (IsEqualGUID(&subtype, &MFAudioFormat_WMAudioV9)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 3); + else if (IsEqualGUID(&subtype, &MFAudioFormat_WMAudio_Lossless)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 4); + else if (IsEqualGUID(&subtype, &MFAudioFormat_XMAudio2)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_XMA, 2); + else if (IsEqualGUID(&subtype, &MFAudioFormat_AAC)) + mf_media_type_to_wg_encoded_format_aac(type, format); + else + FIXME("Unimplemented audio subtype %s.\n", debugstr_guid(&subtype)); + } + else if (IsEqualGUID(&major_type, &MFMediaType_Video)) + { + if (IsEqualGUID(&subtype, &MFVideoFormat_H264)) + mf_media_type_to_wg_encoded_format_h264(type, format); + else + FIXME("Unimplemented audio subtype %s.\n", debugstr_guid(&subtype)); + } + else + { + FIXME("Unimplemented major type %s.\n", debugstr_guid(&major_type)); + } +} diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec index 31c80f596c2..44d98a957e2 100644 --- wine/dlls/mfplat/mfplat.spec +++ wine/dlls/mfplat/mfplat.spec @@ -20,7 +20,7 @@ @ stdcall MFAllocateWorkQueue(ptr) @ stdcall MFAllocateWorkQueueEx(long ptr) rtworkq.RtwqAllocateWorkQueue @ stub MFAppendCollection -@ stdcall MFAverageTimePerFrameToFrameRate(int64 ptr ptr) +@ stub MFAverageTimePerFrameToFrameRate @ stdcall MFBeginCreateFile(long long long wstr ptr ptr ptr) @ stub MFBeginGetHostByName @ stdcall MFBeginRegisterWorkQueueWithMMCSS(long wstr long ptr ptr) @@ -71,7 +71,7 @@ @ stdcall MFCreateStreamDescriptor(long long ptr ptr) @ stdcall MFCreateSystemTimeSource(ptr) @ stub MFCreateSystemUnderlyingClock -@ stdcall MFCreateTempFile(long long long ptr) +@ stub MFCreateTempFile @ stdcall MFCreateTrackedSample(ptr) @ stdcall MFCreateTransformActivate(ptr) @ stub MFCreateURLFromPath @@ -162,7 +162,7 @@ @ stdcall MFTEnumEx(int128 long ptr ptr ptr ptr) @ stdcall MFTGetInfo(int128 ptr ptr ptr ptr ptr ptr) @ stdcall MFTRegister(int128 int128 wstr long long ptr long ptr ptr) -@ stdcall MFTRegisterLocal(ptr ptr wstr long long ptr long ptr) +@ stdcall MFTRegisterLocal(ptr ptr wstr long long ptr long ptr) @ stdcall MFTRegisterLocalByCLSID(ptr ptr wstr long long ptr long ptr) @ stdcall MFTUnregister(int128) @ stdcall MFTUnregisterLocal(ptr) diff --git a/dlls/mfplat/mfplat_private.h b/dlls/mfplat/mfplat_private.h index 8418c8eb2ef..b646d9e7cbb 100644 --- wine/dlls/mfplat/mfplat_private.h +++ wine/dlls/mfplat/mfplat_private.h @@ -128,13 +128,11 @@ static inline const char *debugstr_propvar(const PROPVARIANT *v) case VT_NULL: return wine_dbg_sprintf("%p {VT_NULL}", v); case VT_UI4: - return wine_dbg_sprintf("%p {VT_UI4: %ld}", v, v->ulVal); + return wine_dbg_sprintf("%p {VT_UI4: %d}", v, v->ulVal); case VT_UI8: return wine_dbg_sprintf("%p {VT_UI8: %s}", v, wine_dbgstr_longlong(v->uhVal.QuadPart)); case VT_I8: return wine_dbg_sprintf("%p {VT_I8: %s}", v, wine_dbgstr_longlong(v->hVal.QuadPart)); - case VT_R4: - return wine_dbg_sprintf("%p {VT_R4: %.8e}", v, v->fltVal); case VT_R8: return wine_dbg_sprintf("%p {VT_R8: %lf}", v, v->dblVal); case VT_CLSID: @@ -180,7 +178,7 @@ static inline const char *debugstr_fourcc(DWORD format) return wine_dbg_sprintf("%s", wine_dbgstr_an(formats[i].name, -1)); } - return wine_dbg_sprintf("%#lx", format); + return wine_dbg_sprintf("%#x", format); } return wine_dbgstr_an((char *)&format, 4); diff --git a/dlls/mfplat/quartz_parser.c b/dlls/mfplat/quartz_parser.c new file mode 100644 index 00000000000..e9a3b00016d --- /dev/null +++ wine/dlls/mfplat/quartz_parser.c @@ -0,0 +1,1945 @@ +/* + * DirectShow parser filters + * + * Copyright 2010 Maarten Lankhorst for CodeWeavers + * Copyright 2010 Aric Stewart for CodeWeavers + * Copyright 2019-2020 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" +#include "gst_guids.h" + +#include "amvideo.h" + +#include +#include "dvdmedia.h" +#include "mmreg.h" +#include "ks.h" +#include "initguid.h" +#include "wmcodecdsp.h" +#include "ksmedia.h" + +WINE_DEFAULT_DEBUG_CHANNEL(quartz); + +static const GUID MEDIASUBTYPE_CVID = {mmioFOURCC('c','v','i','d'), 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; +static const GUID MEDIASUBTYPE_MP3 = {WAVE_FORMAT_MPEGLAYER3, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; + +struct parser +{ + struct strmbase_filter filter; + IAMStreamSelect IAMStreamSelect_iface; + + struct strmbase_sink sink; + IAsyncReader *reader; + + struct parser_source **sources; + unsigned int source_count; + BOOL enum_sink_first; + + struct wg_parser *wg_parser; + + /* FIXME: It would be nice to avoid duplicating these with strmbase. + * However, synchronization is tricky; we need access to be protected by a + * separate lock. */ + bool streaming, sink_connected; + + HANDLE read_thread; + + BOOL (*init_gst)(struct parser *filter); + HRESULT (*source_query_accept)(struct parser_source *pin, const AM_MEDIA_TYPE *mt); + HRESULT (*source_get_media_type)(struct parser_source *pin, unsigned int index, AM_MEDIA_TYPE *mt); +}; + +struct parser_source +{ + struct strmbase_source pin; + IQualityControl IQualityControl_iface; + + struct wg_parser_stream *wg_stream; + + SourceSeeking seek; + + CRITICAL_SECTION flushing_cs; + CONDITION_VARIABLE eos_cv; + HANDLE thread; + + /* This variable is read and written by both the streaming thread and + * application threads. However, it is only written by the application + * thread when the streaming thread is not running, or when it is blocked + * by flushing_cs. */ + bool need_segment; + + bool eos; +}; + +static inline struct parser *impl_from_strmbase_filter(struct strmbase_filter *iface) +{ + return CONTAINING_RECORD(iface, struct parser, filter); +} + +static const IMediaSeekingVtbl GST_Seeking_Vtbl; +static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl; + +static struct parser_source *create_pin(struct parser *filter, + struct wg_parser_stream *stream, const WCHAR *name); +static HRESULT GST_RemoveOutputPins(struct parser *This); +static HRESULT WINAPI GST_ChangeCurrent(IMediaSeeking *iface); +static HRESULT WINAPI GST_ChangeStop(IMediaSeeking *iface); +static HRESULT WINAPI GST_ChangeRate(IMediaSeeking *iface); + +static bool amt_from_wg_format_audio(AM_MEDIA_TYPE *mt, const struct wg_format *format) +{ + mt->majortype = MEDIATYPE_Audio; + mt->formattype = FORMAT_WaveFormatEx; + + switch (format->u.audio.format) + { + case WG_AUDIO_FORMAT_UNKNOWN: + return false; + + case WG_AUDIO_FORMAT_MPEG1_LAYER1: + case WG_AUDIO_FORMAT_MPEG1_LAYER2: + { + MPEG1WAVEFORMAT *wave_format; + + if (!(wave_format = CoTaskMemAlloc(sizeof(*wave_format)))) + return false; + memset(wave_format, 0, sizeof(*wave_format)); + + mt->subtype = MEDIASUBTYPE_MPEG1AudioPayload; + mt->cbFormat = sizeof(*wave_format); + mt->pbFormat = (BYTE *)wave_format; + wave_format->wfx.wFormatTag = WAVE_FORMAT_MPEG; + wave_format->wfx.nChannels = format->u.audio.channels; + wave_format->wfx.nSamplesPerSec = format->u.audio.rate; + wave_format->wfx.cbSize = sizeof(*wave_format) - sizeof(WAVEFORMATEX); + wave_format->fwHeadLayer = (format->u.audio.format == WG_AUDIO_FORMAT_MPEG1_LAYER1 ? 1 : 2); + return true; + } + + case WG_AUDIO_FORMAT_MPEG1_LAYER3: + { + MPEGLAYER3WAVEFORMAT *wave_format; + + if (!(wave_format = CoTaskMemAlloc(sizeof(*wave_format)))) + return false; + memset(wave_format, 0, sizeof(*wave_format)); + + mt->subtype = MEDIASUBTYPE_MP3; + mt->cbFormat = sizeof(*wave_format); + mt->pbFormat = (BYTE *)wave_format; + wave_format->wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; + wave_format->wfx.nChannels = format->u.audio.channels; + wave_format->wfx.nSamplesPerSec = format->u.audio.rate; + wave_format->wfx.cbSize = sizeof(*wave_format) - sizeof(WAVEFORMATEX); + /* FIXME: We can't get most of the MPEG data from the caps. We may have + * to manually parse the header. */ + wave_format->wID = MPEGLAYER3_ID_MPEG; + wave_format->fdwFlags = MPEGLAYER3_FLAG_PADDING_ON; + wave_format->nFramesPerBlock = 1; + wave_format->nCodecDelay = 1393; + return true; + } + + case WG_AUDIO_FORMAT_U8: + case WG_AUDIO_FORMAT_S16LE: + case WG_AUDIO_FORMAT_S24LE: + case WG_AUDIO_FORMAT_S32LE: + case WG_AUDIO_FORMAT_F32LE: + case WG_AUDIO_FORMAT_F64LE: + { + static const struct + { + bool is_float; + WORD depth; + } + format_table[] = + { + {0}, + {false, 8}, + {false, 16}, + {false, 24}, + {false, 32}, + {true, 32}, + {true, 64}, + }; + + bool is_float; + WORD depth; + + assert(format->u.audio.format < ARRAY_SIZE(format_table)); + is_float = format_table[format->u.audio.format].is_float; + depth = format_table[format->u.audio.format].depth; + + if (is_float || format->u.audio.channels > 2) + { + WAVEFORMATEXTENSIBLE *wave_format; + + if (!(wave_format = CoTaskMemAlloc(sizeof(*wave_format)))) + return false; + memset(wave_format, 0, sizeof(*wave_format)); + + mt->subtype = is_float ? MEDIASUBTYPE_IEEE_FLOAT : MEDIASUBTYPE_PCM; + mt->bFixedSizeSamples = TRUE; + mt->pbFormat = (BYTE *)wave_format; + mt->cbFormat = sizeof(*wave_format); + wave_format->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + wave_format->Format.nChannels = format->u.audio.channels; + wave_format->Format.nSamplesPerSec = format->u.audio.rate; + wave_format->Format.nAvgBytesPerSec = format->u.audio.rate * format->u.audio.channels * depth / 8; + wave_format->Format.nBlockAlign = format->u.audio.channels * depth / 8; + wave_format->Format.wBitsPerSample = depth; + wave_format->Format.cbSize = sizeof(*wave_format) - sizeof(WAVEFORMATEX); + wave_format->Samples.wValidBitsPerSample = depth; + wave_format->dwChannelMask = format->u.audio.channel_mask; + wave_format->SubFormat = is_float ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; + mt->lSampleSize = wave_format->Format.nBlockAlign; + } + else + { + WAVEFORMATEX *wave_format; + + if (!(wave_format = CoTaskMemAlloc(sizeof(*wave_format)))) + return false; + memset(wave_format, 0, sizeof(*wave_format)); + + mt->subtype = MEDIASUBTYPE_PCM; + mt->bFixedSizeSamples = TRUE; + mt->pbFormat = (BYTE *)wave_format; + mt->cbFormat = sizeof(*wave_format); + wave_format->wFormatTag = WAVE_FORMAT_PCM; + wave_format->nChannels = format->u.audio.channels; + wave_format->nSamplesPerSec = format->u.audio.rate; + wave_format->nAvgBytesPerSec = format->u.audio.rate * format->u.audio.channels * depth / 8; + wave_format->nBlockAlign = format->u.audio.channels * depth / 8; + wave_format->wBitsPerSample = depth; + wave_format->cbSize = 0; + mt->lSampleSize = wave_format->nBlockAlign; + } + return true; + } + } + + assert(0); + return false; +} + +#define ALIGN(n, alignment) (((n) + (alignment) - 1) & ~((alignment) - 1)) + +unsigned int wg_format_get_max_size(const struct wg_format *format) +{ + switch (format->major_type) + { + case WG_MAJOR_TYPE_VIDEO: + { + unsigned int width = format->u.video.width, height = format->u.video.height; + + switch (format->u.video.format) + { + case WG_VIDEO_FORMAT_BGRA: + case WG_VIDEO_FORMAT_BGRx: + case WG_VIDEO_FORMAT_AYUV: + return width * height * 4; + + case WG_VIDEO_FORMAT_BGR: + return ALIGN(width * 3, 4) * height; + + case WG_VIDEO_FORMAT_RGB15: + case WG_VIDEO_FORMAT_RGB16: + case WG_VIDEO_FORMAT_UYVY: + case WG_VIDEO_FORMAT_YUY2: + case WG_VIDEO_FORMAT_YVYU: + return ALIGN(width * 2, 4) * height; + + case WG_VIDEO_FORMAT_I420: + case WG_VIDEO_FORMAT_YV12: + return ALIGN(width, 4) * ALIGN(height, 2) /* Y plane */ + + 2 * ALIGN((width + 1) / 2, 4) * ((height + 1) / 2); /* U and V planes */ + + case WG_VIDEO_FORMAT_NV12: + return ALIGN(width, 4) * ALIGN(height, 2) /* Y plane */ + + ALIGN(width, 4) * ((height + 1) / 2); /* U/V plane */ + + case WG_VIDEO_FORMAT_CINEPAK: + /* Both ffmpeg's encoder and a Cinepak file seen in the wild report + * 24 bpp. ffmpeg sets biSizeImage as below; others may be smaller, + * but as long as every sample fits into our allocator, we're fine. */ + return width * height * 3; + + case WG_VIDEO_FORMAT_UNKNOWN: + FIXME("Cannot guess maximum sample size for unknown video format.\n"); + return 0; + } + break; + } + + case WG_MAJOR_TYPE_AUDIO: + { + unsigned int rate = format->u.audio.rate, channels = format->u.audio.channels; + + /* Actually we don't know how large of a sample GStreamer will give + * us. Hopefully 1 second is enough... */ + + switch (format->u.audio.format) + { + case WG_AUDIO_FORMAT_U8: + return rate * channels; + + case WG_AUDIO_FORMAT_S16LE: + return rate * channels * 2; + + case WG_AUDIO_FORMAT_S24LE: + return rate * channels * 3; + + case WG_AUDIO_FORMAT_S32LE: + case WG_AUDIO_FORMAT_F32LE: + return rate * channels * 4; + + case WG_AUDIO_FORMAT_F64LE: + return rate * channels * 8; + + case WG_AUDIO_FORMAT_MPEG1_LAYER1: + return 56000; + + case WG_AUDIO_FORMAT_MPEG1_LAYER2: + return 48000; + + case WG_AUDIO_FORMAT_MPEG1_LAYER3: + return 40000; + + case WG_AUDIO_FORMAT_UNKNOWN: + FIXME("Cannot guess maximum sample size for unknown audio format.\n"); + return 0; + } + break; + } + + case WG_MAJOR_TYPE_UNKNOWN: + FIXME("Cannot guess maximum sample size for unknown format.\n"); + return 0; + } + + assert(0); + return 0; +} + +static bool amt_from_wg_format_video(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool wm) +{ + static const struct + { + const GUID *subtype; + DWORD compression; + WORD depth; + } + format_table[] = + { + {0}, + {&MEDIASUBTYPE_ARGB32, BI_RGB, 32}, + {&MEDIASUBTYPE_RGB32, BI_RGB, 32}, + {&MEDIASUBTYPE_RGB24, BI_RGB, 24}, + {&MEDIASUBTYPE_RGB555, BI_RGB, 16}, + {&MEDIASUBTYPE_RGB565, BI_BITFIELDS, 16}, + {&MEDIASUBTYPE_AYUV, mmioFOURCC('A','Y','U','V'), 32}, + {&MEDIASUBTYPE_I420, mmioFOURCC('I','4','2','0'), 12}, + {&MEDIASUBTYPE_NV12, mmioFOURCC('N','V','1','2'), 12}, + {&MEDIASUBTYPE_UYVY, mmioFOURCC('U','Y','V','Y'), 16}, + {&MEDIASUBTYPE_YUY2, mmioFOURCC('Y','U','Y','2'), 16}, + {&MEDIASUBTYPE_YV12, mmioFOURCC('Y','V','1','2'), 12}, + {&MEDIASUBTYPE_YVYU, mmioFOURCC('Y','V','Y','U'), 16}, + {&MEDIASUBTYPE_CVID, mmioFOURCC('C','V','I','D'), 24}, + }; + + VIDEOINFO *video_format; + uint32_t frame_time; + + if (format->u.video.format == WG_VIDEO_FORMAT_UNKNOWN) + return false; + + if (!(video_format = CoTaskMemAlloc(sizeof(*video_format)))) + return false; + + assert(format->u.video.format < ARRAY_SIZE(format_table)); + + mt->majortype = MEDIATYPE_Video; + mt->subtype = *format_table[format->u.video.format].subtype; + if (wm) + mt->bFixedSizeSamples = TRUE; + else + mt->bTemporalCompression = TRUE; + mt->lSampleSize = 1; + mt->formattype = FORMAT_VideoInfo; + mt->cbFormat = sizeof(VIDEOINFOHEADER); + mt->pbFormat = (BYTE *)video_format; + + memset(video_format, 0, sizeof(*video_format)); + + if (wm) + { + SetRect(&video_format->rcSource, 0, 0, format->u.video.width, format->u.video.height); + video_format->rcTarget = video_format->rcSource; + } + if ((frame_time = MulDiv(10000000, format->u.video.fps_d, format->u.video.fps_n)) != -1) + video_format->AvgTimePerFrame = frame_time; + video_format->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + video_format->bmiHeader.biWidth = format->u.video.width; + video_format->bmiHeader.biHeight = format->u.video.height; + video_format->bmiHeader.biPlanes = 1; + video_format->bmiHeader.biBitCount = format_table[format->u.video.format].depth; + video_format->bmiHeader.biCompression = format_table[format->u.video.format].compression; + video_format->bmiHeader.biSizeImage = wg_format_get_max_size(format); + + if (format->u.video.format == WG_VIDEO_FORMAT_RGB16) + { + mt->cbFormat = offsetof(VIDEOINFO, dwBitMasks[3]); + video_format->dwBitMasks[iRED] = 0xf800; + video_format->dwBitMasks[iGREEN] = 0x07e0; + video_format->dwBitMasks[iBLUE] = 0x001f; + } + + return true; +} + +bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool wm) +{ + memset(mt, 0, sizeof(*mt)); + + switch (format->major_type) + { + case WG_MAJOR_TYPE_UNKNOWN: + return false; + + case WG_MAJOR_TYPE_AUDIO: + return amt_from_wg_format_audio(mt, format); + + case WG_MAJOR_TYPE_VIDEO: + return amt_from_wg_format_video(mt, format, wm); + } + + assert(0); + return false; +} + +static bool amt_to_wg_format_audio(const AM_MEDIA_TYPE *mt, struct wg_format *format) +{ + static const struct + { + const GUID *subtype; + WORD depth; + enum wg_audio_format format; + } + format_map[] = + { + {&MEDIASUBTYPE_PCM, 8, WG_AUDIO_FORMAT_U8}, + {&MEDIASUBTYPE_PCM, 16, WG_AUDIO_FORMAT_S16LE}, + {&MEDIASUBTYPE_PCM, 24, WG_AUDIO_FORMAT_S24LE}, + {&MEDIASUBTYPE_PCM, 32, WG_AUDIO_FORMAT_S32LE}, + {&MEDIASUBTYPE_IEEE_FLOAT, 32, WG_AUDIO_FORMAT_F32LE}, + {&MEDIASUBTYPE_IEEE_FLOAT, 64, WG_AUDIO_FORMAT_F64LE}, + }; + + const WAVEFORMATEX *audio_format = (const WAVEFORMATEX *)mt->pbFormat; + unsigned int i; + + if (!IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx)) + { + FIXME("Unknown format type %s.\n", debugstr_guid(&mt->formattype)); + return false; + } + if (mt->cbFormat < sizeof(WAVEFORMATEX) || !mt->pbFormat) + { + ERR("Unexpected format size %u.\n", mt->cbFormat); + return false; + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.channels = audio_format->nChannels; + format->u.audio.rate = audio_format->nSamplesPerSec; + + if (audio_format->wFormatTag == WAVE_FORMAT_EXTENSIBLE) + { + const WAVEFORMATEXTENSIBLE *ext_format = (const WAVEFORMATEXTENSIBLE *)mt->pbFormat; + + format->u.audio.channel_mask = ext_format->dwChannelMask; + } + else + { + if (audio_format->nChannels == 1) + format->u.audio.channel_mask = KSAUDIO_SPEAKER_MONO; + else if (audio_format->nChannels == 2) + format->u.audio.channel_mask = KSAUDIO_SPEAKER_STEREO; + else + { + ERR("Unexpected channel count %u.\n", audio_format->nChannels); + return false; + } + } + + for (i = 0; i < ARRAY_SIZE(format_map); ++i) + { + if (IsEqualGUID(&mt->subtype, format_map[i].subtype) + && audio_format->wBitsPerSample == format_map[i].depth) + { + format->u.audio.format = format_map[i].format; + return true; + } + } + + FIXME("Unknown subtype %s, depth %u.\n", debugstr_guid(&mt->subtype), audio_format->wBitsPerSample); + return false; +} + +static bool amt_to_wg_format_audio_mpeg1(const AM_MEDIA_TYPE *mt, struct wg_format *format) +{ + const MPEG1WAVEFORMAT *audio_format = (const MPEG1WAVEFORMAT *)mt->pbFormat; + + if (!IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx)) + { + FIXME("Unknown format type %s.\n", debugstr_guid(&mt->formattype)); + return false; + } + if (mt->cbFormat < sizeof(*audio_format) || !mt->pbFormat) + { + ERR("Unexpected format size %u.\n", mt->cbFormat); + return false; + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.channels = audio_format->wfx.nChannels; + format->u.audio.rate = audio_format->wfx.nSamplesPerSec; + if (audio_format->fwHeadLayer == 1) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER1; + else if (audio_format->fwHeadLayer == 2) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER2; + else if (audio_format->fwHeadLayer == 3) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER3; + else + return false; + return true; +} + +static bool amt_to_wg_format_audio_mpeg1_layer3(const AM_MEDIA_TYPE *mt, struct wg_format *format) +{ + const MPEGLAYER3WAVEFORMAT *audio_format = (const MPEGLAYER3WAVEFORMAT *)mt->pbFormat; + + if (!IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx)) + { + FIXME("Unknown format type %s.\n", debugstr_guid(&mt->formattype)); + return false; + } + if (mt->cbFormat < sizeof(*audio_format) || !mt->pbFormat) + { + ERR("Unexpected format size %u.\n", mt->cbFormat); + return false; + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.channels = audio_format->wfx.nChannels; + format->u.audio.rate = audio_format->wfx.nSamplesPerSec; + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER3; + return true; +} + +static bool amt_to_wg_format_video(const AM_MEDIA_TYPE *mt, struct wg_format *format) +{ + static const struct + { + const GUID *subtype; + enum wg_video_format format; + } + format_map[] = + { + {&MEDIASUBTYPE_ARGB32, WG_VIDEO_FORMAT_BGRA}, + {&MEDIASUBTYPE_RGB32, WG_VIDEO_FORMAT_BGRx}, + {&MEDIASUBTYPE_RGB24, WG_VIDEO_FORMAT_BGR}, + {&MEDIASUBTYPE_RGB555, WG_VIDEO_FORMAT_RGB15}, + {&MEDIASUBTYPE_RGB565, WG_VIDEO_FORMAT_RGB16}, + {&MEDIASUBTYPE_AYUV, WG_VIDEO_FORMAT_AYUV}, + {&MEDIASUBTYPE_I420, WG_VIDEO_FORMAT_I420}, + {&MEDIASUBTYPE_NV12, WG_VIDEO_FORMAT_NV12}, + {&MEDIASUBTYPE_UYVY, WG_VIDEO_FORMAT_UYVY}, + {&MEDIASUBTYPE_YUY2, WG_VIDEO_FORMAT_YUY2}, + {&MEDIASUBTYPE_YV12, WG_VIDEO_FORMAT_YV12}, + {&MEDIASUBTYPE_YVYU, WG_VIDEO_FORMAT_YVYU}, + {&MEDIASUBTYPE_CVID, WG_VIDEO_FORMAT_CINEPAK}, + }; + + const VIDEOINFOHEADER *video_format = (const VIDEOINFOHEADER *)mt->pbFormat; + unsigned int i; + + if (!IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo)) + { + FIXME("Unknown format type %s.\n", debugstr_guid(&mt->formattype)); + return false; + } + if (mt->cbFormat < sizeof(VIDEOINFOHEADER) || !mt->pbFormat) + { + ERR("Unexpected format size %u.\n", mt->cbFormat); + return false; + } + + format->major_type = WG_MAJOR_TYPE_VIDEO; + format->u.video.width = video_format->bmiHeader.biWidth; + format->u.video.height = video_format->bmiHeader.biHeight; + format->u.video.fps_n = 10000000; + format->u.video.fps_d = video_format->AvgTimePerFrame; + + for (i = 0; i < ARRAY_SIZE(format_map); ++i) + { + if (IsEqualGUID(&mt->subtype, format_map[i].subtype)) + { + format->u.video.format = format_map[i].format; + return true; + } + } + + FIXME("Unknown subtype %s.\n", debugstr_guid(&mt->subtype)); + return false; +} + +bool amt_to_wg_format(const AM_MEDIA_TYPE *mt, struct wg_format *format) +{ + memset(format, 0, sizeof(*format)); + + if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Video)) + return amt_to_wg_format_video(mt, format); + if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Audio)) + { + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MPEG1AudioPayload)) + return amt_to_wg_format_audio_mpeg1(mt, format); + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MP3)) + return amt_to_wg_format_audio_mpeg1_layer3(mt, format); + return amt_to_wg_format_audio(mt, format); + } + + FIXME("Unknown major type %s.\n", debugstr_guid(&mt->majortype)); + return false; +} + +/* + * scale_uint64() is based on gst_util_scale_int() from GStreamer, which is + * covered by the following license: + * + * GStreamer + * Copyright (C) 1999,2000 Erik Walthinsen + * 2000 Wim Taymans + * 2002 Thomas Vander Stichele + * 2004 Wim Taymans + * 2015 Jan Schmidt + * + * gstutils.c: Utility functions + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +static uint64_t scale_uint64(uint64_t value, uint32_t numerator, uint32_t denominator) +{ + ULARGE_INTEGER i, high, low; + + if (!value) + return 0; + + i.QuadPart = value; + low.QuadPart = (ULONGLONG)i.u.LowPart * numerator; + high.QuadPart = (ULONGLONG)i.u.HighPart * numerator + low.u.HighPart; + low.u.HighPart = 0; + + if (high.u.HighPart >= denominator) + return ULLONG_MAX; + + low.QuadPart += (high.QuadPart % denominator) << 32; + return ((high.QuadPart / denominator) << 32) + (low.QuadPart / denominator); +} + +/* Fill and send a single IMediaSample. */ +static HRESULT send_sample(struct parser_source *pin, IMediaSample *sample, + const struct wg_parser_buffer *buffer, uint32_t offset, uint32_t size, DWORD bytes_per_second) +{ + HRESULT hr; + BYTE *ptr = NULL; + + TRACE("offset %u, size %u, sample size %u\n", offset, size, IMediaSample_GetSize(sample)); + + hr = IMediaSample_SetActualDataLength(sample, size); + if(FAILED(hr)){ + WARN("SetActualDataLength failed: %08x\n", hr); + return hr; + } + + IMediaSample_GetPointer(sample, &ptr); + + if (!wg_parser_stream_copy_buffer(pin->wg_stream, ptr, offset, size)) + { + /* The GStreamer pin has been flushed. */ + return S_OK; + } + + if (buffer->has_pts) + { + REFERENCE_TIME start_pts = buffer->pts; + + if (offset) + start_pts += scale_uint64(offset, 10000000, bytes_per_second); + start_pts -= pin->seek.llCurrent; + start_pts *= pin->seek.dRate; + + if (buffer->has_duration) + { + REFERENCE_TIME end_pts = buffer->pts + buffer->duration; + + if (offset + size < buffer->size) + end_pts = buffer->pts + scale_uint64(offset + size, 10000000, bytes_per_second); + end_pts -= pin->seek.llCurrent; + end_pts *= pin->seek.dRate; + + IMediaSample_SetTime(sample, &start_pts, &end_pts); + IMediaSample_SetMediaTime(sample, &start_pts, &end_pts); + } + else + { + IMediaSample_SetTime(sample, &start_pts, NULL); + IMediaSample_SetMediaTime(sample, NULL, NULL); + } + } + else + { + IMediaSample_SetTime(sample, NULL, NULL); + IMediaSample_SetMediaTime(sample, NULL, NULL); + } + + IMediaSample_SetDiscontinuity(sample, !offset && buffer->discontinuity); + IMediaSample_SetPreroll(sample, buffer->preroll); + IMediaSample_SetSyncPoint(sample, !buffer->delta); + + if (!pin->pin.pin.peer) + hr = VFW_E_NOT_CONNECTED; + else + hr = IMemInputPin_Receive(pin->pin.pMemInputPin, sample); + + TRACE("sending sample returned: %08x\n", hr); + + return hr; +} + +/* Send a single GStreamer buffer (splitting it into multiple IMediaSamples if + * necessary). */ +static void send_buffer(struct parser_source *pin, const struct wg_parser_buffer *buffer) +{ + HRESULT hr; + IMediaSample *sample; + + if (pin->need_segment) + { + if (FAILED(hr = IPin_NewSegment(pin->pin.pin.peer, + pin->seek.llCurrent, pin->seek.llStop, pin->seek.dRate))) + WARN("Failed to deliver new segment, hr %#x.\n", hr); + pin->need_segment = false; + } + + if (IsEqualGUID(&pin->pin.pin.mt.formattype, &FORMAT_WaveFormatEx) + && (IsEqualGUID(&pin->pin.pin.mt.subtype, &MEDIASUBTYPE_PCM) + || IsEqualGUID(&pin->pin.pin.mt.subtype, &MEDIASUBTYPE_IEEE_FLOAT))) + { + WAVEFORMATEX *format = (WAVEFORMATEX *)pin->pin.pin.mt.pbFormat; + uint32_t offset = 0; + + while (offset < buffer->size) + { + uint32_t advance; + + hr = BaseOutputPinImpl_GetDeliveryBuffer(&pin->pin, &sample, NULL, NULL, 0); + + if (FAILED(hr)) + { + if (hr != VFW_E_NOT_CONNECTED) + ERR("Could not get a delivery buffer (%x), returning GST_FLOW_FLUSHING\n", hr); + break; + } + + advance = min(IMediaSample_GetSize(sample), buffer->size - offset); + + hr = send_sample(pin, sample, buffer, offset, advance, format->nAvgBytesPerSec); + + IMediaSample_Release(sample); + + if (FAILED(hr)) + break; + + offset += advance; + } + } + else + { + hr = BaseOutputPinImpl_GetDeliveryBuffer(&pin->pin, &sample, NULL, NULL, 0); + + if (FAILED(hr)) + { + if (hr != VFW_E_NOT_CONNECTED) + ERR("Could not get a delivery buffer (%x), returning GST_FLOW_FLUSHING\n", hr); + } + else + { + hr = send_sample(pin, sample, buffer, 0, buffer->size, 0); + + IMediaSample_Release(sample); + } + } + + wg_parser_stream_release_buffer(pin->wg_stream); +} + +static DWORD CALLBACK stream_thread(void *arg) +{ + struct parser_source *pin = arg; + struct parser *filter = impl_from_strmbase_filter(pin->pin.pin.filter); + + TRACE("Starting streaming thread for pin %p.\n", pin); + + while (filter->streaming) + { + struct wg_parser_buffer buffer; + + EnterCriticalSection(&pin->flushing_cs); + + if (pin->eos) + { + SleepConditionVariableCS(&pin->eos_cv, &pin->flushing_cs, INFINITE); + LeaveCriticalSection(&pin->flushing_cs); + continue; + } + + if (wg_parser_stream_get_buffer(pin->wg_stream, &buffer)) + { + send_buffer(pin, &buffer); + } + else + { + TRACE("Got EOS.\n"); + IPin_EndOfStream(pin->pin.pin.peer); + pin->eos = true; + } + + LeaveCriticalSection(&pin->flushing_cs); + } + + TRACE("Streaming stopped; exiting.\n"); + return 0; +} + +static DWORD CALLBACK read_thread(void *arg) +{ + struct parser *filter = arg; + LONGLONG file_size, unused; + size_t buffer_size = 4096; + void *data = NULL; + + if (!(data = malloc(buffer_size))) + return 0; + + IAsyncReader_Length(filter->reader, &file_size, &unused); + + TRACE("Starting read thread for filter %p.\n", filter); + + while (filter->sink_connected) + { + uint64_t offset; + uint32_t size; + HRESULT hr; + + if (!wg_parser_get_next_read_offset(filter->wg_parser, &offset, &size)) + continue; + + if (offset >= file_size) + size = 0; + else if (offset + size >= file_size) + size = file_size - offset; + + if (!array_reserve(&data, &buffer_size, size, 1)) + { + free(data); + return 0; + } + + hr = IAsyncReader_SyncRead(filter->reader, offset, size, data); + if (FAILED(hr)) + ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); + + wg_parser_push_data(filter->wg_parser, SUCCEEDED(hr) ? WG_READ_SUCCESS : WG_READ_FAILURE, data, size); + } + + free(data); + TRACE("Streaming stopped; exiting.\n"); + return 0; +} + +static inline struct parser_source *impl_from_IMediaSeeking(IMediaSeeking *iface) +{ + return CONTAINING_RECORD(iface, struct parser_source, seek.IMediaSeeking_iface); +} + +static struct strmbase_pin *parser_get_pin(struct strmbase_filter *base, unsigned int index) +{ + struct parser *filter = impl_from_strmbase_filter(base); + + if (filter->enum_sink_first) + { + if (!index) + return &filter->sink.pin; + else if (index <= filter->source_count) + return &filter->sources[index - 1]->pin.pin; + } + else + { + if (index < filter->source_count) + return &filter->sources[index]->pin.pin; + else if (index == filter->source_count) + return &filter->sink.pin; + } + return NULL; +} + +static void parser_destroy(struct strmbase_filter *iface) +{ + struct parser *filter = impl_from_strmbase_filter(iface); + HRESULT hr; + + /* Don't need to clean up output pins, disconnecting input pin will do that */ + if (filter->sink.pin.peer) + { + hr = IPin_Disconnect(filter->sink.pin.peer); + assert(hr == S_OK); + hr = IPin_Disconnect(&filter->sink.pin.IPin_iface); + assert(hr == S_OK); + } + + if (filter->reader) + IAsyncReader_Release(filter->reader); + filter->reader = NULL; + + wg_parser_destroy(filter->wg_parser); + + strmbase_sink_cleanup(&filter->sink); + strmbase_filter_cleanup(&filter->filter); + free(filter); +} + +static HRESULT parser_init_stream(struct strmbase_filter *iface) +{ + struct parser *filter = impl_from_strmbase_filter(iface); + DWORD stop_flags = AM_SEEKING_NoPositioning; + const SourceSeeking *seeking; + unsigned int i; + + if (!filter->sink_connected) + return S_OK; + + filter->streaming = true; + + /* DirectShow retains the old seek positions, but resets to them every time + * it transitions from stopped -> paused. */ + + seeking = &filter->sources[0]->seek; + if (seeking->llStop) + stop_flags = AM_SEEKING_AbsolutePositioning; + wg_parser_stream_seek(filter->sources[0]->wg_stream, seeking->dRate, + seeking->llCurrent, seeking->llStop, AM_SEEKING_AbsolutePositioning, stop_flags); + + for (i = 0; i < filter->source_count; ++i) + { + struct parser_source *pin = filter->sources[i]; + HRESULT hr; + + if (!pin->pin.pin.peer) + continue; + + if (FAILED(hr = IMemAllocator_Commit(pin->pin.pAllocator))) + ERR("Failed to commit allocator, hr %#x.\n", hr); + + pin->need_segment = true; + pin->eos = false; + + pin->thread = CreateThread(NULL, 0, stream_thread, pin, 0, NULL); + } + + return S_OK; +} + +static HRESULT parser_cleanup_stream(struct strmbase_filter *iface) +{ + struct parser *filter = impl_from_strmbase_filter(iface); + unsigned int i; + + if (!filter->sink_connected) + return S_OK; + + filter->streaming = false; + + for (i = 0; i < filter->source_count; ++i) + { + struct parser_source *pin = filter->sources[i]; + + if (!pin->pin.pin.peer) + continue; + + IMemAllocator_Decommit(pin->pin.pAllocator); + + WakeConditionVariable(&pin->eos_cv); + WaitForSingleObject(pin->thread, INFINITE); + CloseHandle(pin->thread); + pin->thread = NULL; + } + + return S_OK; +} + +static const struct strmbase_filter_ops filter_ops = +{ + .filter_get_pin = parser_get_pin, + .filter_destroy = parser_destroy, + .filter_init_stream = parser_init_stream, + .filter_cleanup_stream = parser_cleanup_stream, +}; + +static inline struct parser *impl_from_strmbase_sink(struct strmbase_sink *iface) +{ + return CONTAINING_RECORD(iface, struct parser, sink); +} + +static HRESULT sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) +{ + if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Stream)) + return S_OK; + return S_FALSE; +} + +static HRESULT parser_sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *pmt) +{ + struct parser *filter = impl_from_strmbase_sink(iface); + LONGLONG file_size, unused; + HRESULT hr = S_OK; + unsigned int i; + + filter->reader = NULL; + if (FAILED(hr = IPin_QueryInterface(peer, &IID_IAsyncReader, (void **)&filter->reader))) + return hr; + + IAsyncReader_Length(filter->reader, &file_size, &unused); + + filter->sink_connected = true; + filter->read_thread = CreateThread(NULL, 0, read_thread, filter, 0, NULL); + + if (FAILED(hr = wg_parser_connect(filter->wg_parser, file_size))) + goto err; + + if (!filter->init_gst(filter)) + { + hr = E_FAIL; + goto err; + } + + for (i = 0; i < filter->source_count; ++i) + { + struct parser_source *pin = filter->sources[i]; + + pin->seek.llDuration = pin->seek.llStop = wg_parser_stream_get_duration(pin->wg_stream); + pin->seek.llCurrent = 0; + } + + return S_OK; +err: + GST_RemoveOutputPins(filter); + IAsyncReader_Release(filter->reader); + filter->reader = NULL; + return hr; +} + +static void parser_sink_disconnect(struct strmbase_sink *iface) +{ + struct parser *filter = impl_from_strmbase_sink(iface); + + GST_RemoveOutputPins(filter); + + IAsyncReader_Release(filter->reader); + filter->reader = NULL; +} + +static const struct strmbase_sink_ops sink_ops = +{ + .base.pin_query_accept = sink_query_accept, + .sink_connect = parser_sink_connect, + .sink_disconnect = parser_sink_disconnect, +}; + +static BOOL decodebin_parser_filter_init_gst(struct parser *filter) +{ + struct wg_parser *parser = filter->wg_parser; + const char *sgi = getenv("SteamGameId"); + const WCHAR *format; + unsigned int i, stream_count; + WCHAR source_name[20]; + + /* King of Fighters XIII requests the WMV decoder filter pins by name + * to connect them to a Sample Grabber filter. + */ + format = (sgi && !strcmp(sgi, "222940")) ? L"out%u" : L"Stream %02u"; + + stream_count = wg_parser_get_stream_count(parser); + for (i = 0; i < stream_count; ++i) + { + swprintf(source_name, ARRAY_SIZE(source_name), format, i); + if (!create_pin(filter, wg_parser_get_stream(parser, i), source_name)) + return FALSE; + } + + return TRUE; +} + +static HRESULT decodebin_parser_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + + /* At least make sure we can convert it to wg_format. */ + return amt_to_wg_format(mt, &format) ? S_OK : S_FALSE; +} + +static HRESULT decodebin_parser_source_get_media_type(struct parser_source *pin, + unsigned int index, AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + + static const enum wg_video_format video_formats[] = + { + /* Try to prefer YUV formats over RGB ones. Most decoders output in the + * YUV color space, and it's generally much less expensive for + * videoconvert to do YUV -> YUV transformations. */ + WG_VIDEO_FORMAT_AYUV, + WG_VIDEO_FORMAT_I420, + WG_VIDEO_FORMAT_YV12, + WG_VIDEO_FORMAT_YUY2, + WG_VIDEO_FORMAT_UYVY, + WG_VIDEO_FORMAT_YVYU, + WG_VIDEO_FORMAT_NV12, + WG_VIDEO_FORMAT_BGRA, + WG_VIDEO_FORMAT_BGRx, + WG_VIDEO_FORMAT_BGR, + WG_VIDEO_FORMAT_RGB16, + WG_VIDEO_FORMAT_RGB15, + }; + + wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + + memset(mt, 0, sizeof(AM_MEDIA_TYPE)); + + if (amt_from_wg_format(mt, &format, false)) + { + if (!index--) + return S_OK; + FreeMediaType(mt); + } + + if (format.major_type == WG_MAJOR_TYPE_VIDEO && index < ARRAY_SIZE(video_formats)) + { + format.u.video.format = video_formats[index]; + if (!amt_from_wg_format(mt, &format, false)) + return E_OUTOFMEMORY; + return S_OK; + } + else if (format.major_type == WG_MAJOR_TYPE_AUDIO && !index) + { + format.u.audio.format = WG_AUDIO_FORMAT_S16LE; + if (!amt_from_wg_format(mt, &format, false)) + return E_OUTOFMEMORY; + return S_OK; + } + + return VFW_S_NO_MORE_ITEMS; +} + +static BOOL parser_init_gstreamer(void) +{ + if (!init_gstreamer()) + return FALSE; + return TRUE; +} + +HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out) +{ + struct parser *object; + + if (!parser_init_gstreamer()) + return E_FAIL; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (!(object->wg_parser = wg_parser_create(WG_PARSER_DECODEBIN, true))) + { + free(object); + return E_OUTOFMEMORY; + } + + strmbase_filter_init(&object->filter, outer, &CLSID_decodebin_parser, &filter_ops); + strmbase_sink_init(&object->sink, &object->filter, L"input pin", &sink_ops, NULL); + + object->init_gst = decodebin_parser_filter_init_gst; + object->source_query_accept = decodebin_parser_source_query_accept; + object->source_get_media_type = decodebin_parser_source_get_media_type; + + TRACE("Created GStreamer demuxer %p.\n", object); + *out = &object->filter.IUnknown_inner; + return S_OK; +} + +static struct parser *impl_from_IAMStreamSelect(IAMStreamSelect *iface) +{ + return CONTAINING_RECORD(iface, struct parser, IAMStreamSelect_iface); +} + +static HRESULT WINAPI stream_select_QueryInterface(IAMStreamSelect *iface, REFIID iid, void **out) +{ + struct parser *filter = impl_from_IAMStreamSelect(iface); + return IUnknown_QueryInterface(filter->filter.outer_unk, iid, out); +} + +static ULONG WINAPI stream_select_AddRef(IAMStreamSelect *iface) +{ + struct parser *filter = impl_from_IAMStreamSelect(iface); + return IUnknown_AddRef(filter->filter.outer_unk); +} + +static ULONG WINAPI stream_select_Release(IAMStreamSelect *iface) +{ + struct parser *filter = impl_from_IAMStreamSelect(iface); + return IUnknown_Release(filter->filter.outer_unk); +} + +static HRESULT WINAPI stream_select_Count(IAMStreamSelect *iface, DWORD *count) +{ + FIXME("iface %p, count %p, stub!\n", iface, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_select_Info(IAMStreamSelect *iface, LONG index, + AM_MEDIA_TYPE **mt, DWORD *flags, LCID *lcid, DWORD *group, WCHAR **name, + IUnknown **object, IUnknown **unknown) +{ + FIXME("iface %p, index %d, mt %p, flags %p, lcid %p, group %p, name %p, object %p, unknown %p, stub!\n", + iface, index, mt, flags, lcid, group, name, object, unknown); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_select_Enable(IAMStreamSelect *iface, LONG index, DWORD flags) +{ + FIXME("iface %p, index %d, flags %#x, stub!\n", iface, index, flags); + return E_NOTIMPL; +} + +static const IAMStreamSelectVtbl stream_select_vtbl = +{ + stream_select_QueryInterface, + stream_select_AddRef, + stream_select_Release, + stream_select_Count, + stream_select_Info, + stream_select_Enable, +}; + +static HRESULT WINAPI GST_ChangeCurrent(IMediaSeeking *iface) +{ + struct parser_source *This = impl_from_IMediaSeeking(iface); + TRACE("(%p)\n", This); + return S_OK; +} + +static HRESULT WINAPI GST_ChangeStop(IMediaSeeking *iface) +{ + struct parser_source *This = impl_from_IMediaSeeking(iface); + TRACE("(%p)\n", This); + return S_OK; +} + +static HRESULT WINAPI GST_ChangeRate(IMediaSeeking *iface) +{ + struct parser_source *pin = impl_from_IMediaSeeking(iface); + + wg_parser_stream_seek(pin->wg_stream, pin->seek.dRate, 0, 0, + AM_SEEKING_NoPositioning, AM_SEEKING_NoPositioning); + return S_OK; +} + +static HRESULT WINAPI GST_Seeking_QueryInterface(IMediaSeeking *iface, REFIID riid, void **ppv) +{ + struct parser_source *This = impl_from_IMediaSeeking(iface); + return IPin_QueryInterface(&This->pin.pin.IPin_iface, riid, ppv); +} + +static ULONG WINAPI GST_Seeking_AddRef(IMediaSeeking *iface) +{ + struct parser_source *This = impl_from_IMediaSeeking(iface); + return IPin_AddRef(&This->pin.pin.IPin_iface); +} + +static ULONG WINAPI GST_Seeking_Release(IMediaSeeking *iface) +{ + struct parser_source *This = impl_from_IMediaSeeking(iface); + return IPin_Release(&This->pin.pin.IPin_iface); +} + +static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, + LONGLONG *current, DWORD current_flags, LONGLONG *stop, DWORD stop_flags) +{ + struct parser_source *pin = impl_from_IMediaSeeking(iface); + struct parser *filter = impl_from_strmbase_filter(pin->pin.pin.filter); + int i; + + TRACE("pin %p, current %s, current_flags %#x, stop %s, stop_flags %#x.\n", + pin, current ? debugstr_time(*current) : "", current_flags, + stop ? debugstr_time(*stop) : "", stop_flags); + + if (pin->pin.pin.filter->state == State_Stopped) + { + SourceSeekingImpl_SetPositions(iface, current, current_flags, stop, stop_flags); + return S_OK; + } + + if (!(current_flags & AM_SEEKING_NoFlush)) + { + for (i = 0; i < filter->source_count; ++i) + { + if (filter->sources[i]->pin.pin.peer) + IPin_BeginFlush(filter->sources[i]->pin.pin.peer); + } + + if (filter->reader) + IAsyncReader_BeginFlush(filter->reader); + } + + /* Acquire the flushing locks. This blocks the streaming threads, and + * ensures the seek is serialized between flushes. */ + for (i = 0; i < filter->source_count; ++i) + { + struct parser_source *flush_pin = filter->sources[i]; + + if (flush_pin->pin.pin.peer) + EnterCriticalSection(&flush_pin->flushing_cs); + } + + SourceSeekingImpl_SetPositions(iface, current, current_flags, stop, stop_flags); + + wg_parser_stream_seek(pin->wg_stream, pin->seek.dRate, + pin->seek.llCurrent, pin->seek.llStop, current_flags, stop_flags); + + if (!(current_flags & AM_SEEKING_NoFlush)) + { + for (i = 0; i < filter->source_count; ++i) + { + struct parser_source *flush_pin = filter->sources[i]; + + if (flush_pin->pin.pin.peer) + IPin_EndFlush(flush_pin->pin.pin.peer); + } + + if (filter->reader) + IAsyncReader_EndFlush(filter->reader); + } + + /* Release the flushing locks. */ + for (i = filter->source_count - 1; i >= 0; --i) + { + struct parser_source *flush_pin = filter->sources[i]; + + flush_pin->need_segment = true; + flush_pin->eos = false; + + if (flush_pin->pin.pin.peer) + { + LeaveCriticalSection(&flush_pin->flushing_cs); + WakeConditionVariable(&flush_pin->eos_cv); + } + } + + return S_OK; +} + +static const IMediaSeekingVtbl GST_Seeking_Vtbl = +{ + GST_Seeking_QueryInterface, + GST_Seeking_AddRef, + GST_Seeking_Release, + SourceSeekingImpl_GetCapabilities, + SourceSeekingImpl_CheckCapabilities, + SourceSeekingImpl_IsFormatSupported, + SourceSeekingImpl_QueryPreferredFormat, + SourceSeekingImpl_GetTimeFormat, + SourceSeekingImpl_IsUsingTimeFormat, + SourceSeekingImpl_SetTimeFormat, + SourceSeekingImpl_GetDuration, + SourceSeekingImpl_GetStopPosition, + SourceSeekingImpl_GetCurrentPosition, + SourceSeekingImpl_ConvertTimeFormat, + GST_Seeking_SetPositions, + SourceSeekingImpl_GetPositions, + SourceSeekingImpl_GetAvailable, + SourceSeekingImpl_SetRate, + SourceSeekingImpl_GetRate, + SourceSeekingImpl_GetPreroll +}; + +static inline struct parser_source *impl_from_IQualityControl( IQualityControl *iface ) +{ + return CONTAINING_RECORD(iface, struct parser_source, IQualityControl_iface); +} + +static HRESULT WINAPI GST_QualityControl_QueryInterface(IQualityControl *iface, REFIID riid, void **ppv) +{ + struct parser_source *pin = impl_from_IQualityControl(iface); + return IPin_QueryInterface(&pin->pin.pin.IPin_iface, riid, ppv); +} + +static ULONG WINAPI GST_QualityControl_AddRef(IQualityControl *iface) +{ + struct parser_source *pin = impl_from_IQualityControl(iface); + return IPin_AddRef(&pin->pin.pin.IPin_iface); +} + +static ULONG WINAPI GST_QualityControl_Release(IQualityControl *iface) +{ + struct parser_source *pin = impl_from_IQualityControl(iface); + return IPin_Release(&pin->pin.pin.IPin_iface); +} + +static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality q) +{ + struct parser_source *pin = impl_from_IQualityControl(iface); + uint64_t timestamp; + int64_t diff; + + TRACE("pin %p, sender %p, type %s, proportion %u, late %s, timestamp %s.\n", + pin, sender, q.Type == Famine ? "Famine" : "Flood", q.Proportion, + debugstr_time(q.Late), debugstr_time(q.TimeStamp)); + + /* DirectShow filters sometimes pass negative timestamps (Audiosurf uses the + * current time instead of the time of the last buffer). GstClockTime is + * unsigned, so clamp it to 0. */ + timestamp = max(q.TimeStamp, 0); + + /* The documentation specifies that timestamp + diff must be nonnegative. */ + diff = q.Late; + if (diff < 0 && timestamp < (uint64_t)-diff) + diff = -timestamp; + + /* DirectShow "Proportion" describes what percentage of buffers the upstream + * filter should keep (i.e. dropping the rest). If frames are late, the + * proportion will be less than 1. For example, a proportion of 500 means + * that the element should drop half of its frames, essentially because + * frames are taking twice as long as they should to arrive. + * + * GStreamer "proportion" is the inverse of this; it describes how much + * faster the upstream element should produce frames. I.e. if frames are + * taking twice as long as they should to arrive, we want the frames to be + * decoded twice as fast, and so we pass 2.0 to GStreamer. */ + + if (!q.Proportion) + { + WARN("Ignoring quality message with zero proportion.\n"); + return S_OK; + } + + /* GST_QOS_TYPE_OVERFLOW is also used for buffers that arrive on time, but + * DirectShow filters might use Famine, so check that there actually is an + * underrun. */ + wg_parser_stream_notify_qos(pin->wg_stream, q.Type == Famine && q.Proportion < 1000, + 1000.0 / q.Proportion, diff, timestamp); + + return S_OK; +} + +static HRESULT WINAPI GST_QualityControl_SetSink(IQualityControl *iface, IQualityControl *tonotify) +{ + struct parser_source *pin = impl_from_IQualityControl(iface); + TRACE("(%p)->(%p)\n", pin, pin); + /* Do nothing */ + return S_OK; +} + +static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl = { + GST_QualityControl_QueryInterface, + GST_QualityControl_AddRef, + GST_QualityControl_Release, + GST_QualityControl_Notify, + GST_QualityControl_SetSink +}; + +static inline struct parser_source *impl_source_from_IPin(IPin *iface) +{ + return CONTAINING_RECORD(iface, struct parser_source, pin.pin.IPin_iface); +} + +static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out) +{ + struct parser_source *pin = impl_source_from_IPin(&iface->IPin_iface); + + if (IsEqualGUID(iid, &IID_IMediaSeeking)) + *out = &pin->seek.IMediaSeeking_iface; + else if (IsEqualGUID(iid, &IID_IQualityControl)) + *out = &pin->IQualityControl_iface; + else + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static HRESULT source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) +{ + struct parser_source *pin = impl_source_from_IPin(&iface->IPin_iface); + struct parser *filter = impl_from_strmbase_filter(iface->filter); + return filter->source_query_accept(pin, mt); +} + +static HRESULT source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt) +{ + struct parser_source *pin = impl_source_from_IPin(&iface->IPin_iface); + struct parser *filter = impl_from_strmbase_filter(iface->filter); + return filter->source_get_media_type(pin, index, mt); +} + +static HRESULT WINAPI GSTOutPin_DecideBufferSize(struct strmbase_source *iface, + IMemAllocator *allocator, ALLOCATOR_PROPERTIES *props) +{ + struct parser_source *pin = impl_source_from_IPin(&iface->pin.IPin_iface); + unsigned int buffer_size = 16384; + ALLOCATOR_PROPERTIES ret_props; + struct wg_format format; + bool ret; + + if (IsEqualGUID(&pin->pin.pin.mt.formattype, &FORMAT_VideoInfo)) + { + VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)pin->pin.pin.mt.pbFormat; + buffer_size = format->bmiHeader.biSizeImage; + } + else if (IsEqualGUID(&pin->pin.pin.mt.formattype, &FORMAT_WaveFormatEx) + && (IsEqualGUID(&pin->pin.pin.mt.subtype, &MEDIASUBTYPE_PCM) + || IsEqualGUID(&pin->pin.pin.mt.subtype, &MEDIASUBTYPE_IEEE_FLOAT))) + { + WAVEFORMATEX *format = (WAVEFORMATEX *)pin->pin.pin.mt.pbFormat; + buffer_size = format->nAvgBytesPerSec; + } + + ret = amt_to_wg_format(&pin->pin.pin.mt, &format); + assert(ret); + wg_parser_stream_enable(pin->wg_stream, &format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); + + /* We do need to drop any buffers that might have been sent with the old + * caps, but this will be handled in parser_init_stream(). */ + + props->cBuffers = max(props->cBuffers, 1); + props->cbBuffer = max(props->cbBuffer, buffer_size); + props->cbAlign = max(props->cbAlign, 1); + return IMemAllocator_SetProperties(allocator, props, &ret_props); +} + +static void source_disconnect(struct strmbase_source *iface) +{ + struct parser_source *pin = impl_source_from_IPin(&iface->pin.IPin_iface); + + wg_parser_stream_disable(pin->wg_stream); +} + +static void free_source_pin(struct parser_source *pin) +{ + if (pin->pin.pin.peer) + { + if (SUCCEEDED(IMemAllocator_Decommit(pin->pin.pAllocator))) + IPin_Disconnect(pin->pin.pin.peer); + IPin_Disconnect(&pin->pin.pin.IPin_iface); + } + + pin->flushing_cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&pin->flushing_cs); + + strmbase_seeking_cleanup(&pin->seek); + strmbase_source_cleanup(&pin->pin); + free(pin); +} + +static const struct strmbase_source_ops source_ops = +{ + .base.pin_query_interface = source_query_interface, + .base.pin_query_accept = source_query_accept, + .base.pin_get_media_type = source_get_media_type, + .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection, + .pfnDecideAllocator = BaseOutputPinImpl_DecideAllocator, + .pfnDecideBufferSize = GSTOutPin_DecideBufferSize, + .source_disconnect = source_disconnect, +}; + +static struct parser_source *create_pin(struct parser *filter, + struct wg_parser_stream *stream, const WCHAR *name) +{ + struct parser_source *pin, **new_array; + + if (!(new_array = realloc(filter->sources, (filter->source_count + 1) * sizeof(*filter->sources)))) + return NULL; + filter->sources = new_array; + + if (!(pin = calloc(1, sizeof(*pin)))) + return NULL; + + pin->wg_stream = stream; + strmbase_source_init(&pin->pin, &filter->filter, name, &source_ops); + pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl; + strmbase_seeking_init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop, + GST_ChangeCurrent, GST_ChangeRate); + BaseFilterImpl_IncrementPinVersion(&filter->filter); + + InitializeCriticalSection(&pin->flushing_cs); + pin->flushing_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": pin.flushing_cs"); + InitializeConditionVariable(&pin->eos_cv); + + filter->sources[filter->source_count++] = pin; + return pin; +} + +static HRESULT GST_RemoveOutputPins(struct parser *This) +{ + unsigned int i; + + TRACE("(%p)\n", This); + + if (!This->sink_connected) + return S_OK; + + wg_parser_disconnect(This->wg_parser); + + /* read_thread() needs to stay alive to service any read requests GStreamer + * sends, so we can only shut it down after GStreamer stops. */ + This->sink_connected = false; + WaitForSingleObject(This->read_thread, INFINITE); + CloseHandle(This->read_thread); + + for (i = 0; i < This->source_count; ++i) + { + if (This->sources[i]) + free_source_pin(This->sources[i]); + } + + This->source_count = 0; + free(This->sources); + This->sources = NULL; + + BaseFilterImpl_IncrementPinVersion(&This->filter); + return S_OK; +} + +static BOOL compare_media_types(const AM_MEDIA_TYPE *a, const AM_MEDIA_TYPE *b) +{ + return IsEqualGUID(&a->majortype, &b->majortype) + && IsEqualGUID(&a->subtype, &b->subtype) + && IsEqualGUID(&a->formattype, &b->formattype) + && a->cbFormat == b->cbFormat + && !memcmp(a->pbFormat, b->pbFormat, a->cbFormat); +} + +static HRESULT wave_parser_sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) +{ + if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Stream)) + return S_FALSE; + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_WAVE)) + return S_OK; + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_AU) || IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_AIFF)) + FIXME("AU and AIFF files are not yet supported.\n"); + return S_FALSE; +} + +static const struct strmbase_sink_ops wave_parser_sink_ops = +{ + .base.pin_query_accept = wave_parser_sink_query_accept, + .sink_connect = parser_sink_connect, + .sink_disconnect = parser_sink_disconnect, +}; + +static BOOL wave_parser_filter_init_gst(struct parser *filter) +{ + struct wg_parser *parser = filter->wg_parser; + + if (!create_pin(filter, wg_parser_get_stream(parser, 0), L"output")) + return FALSE; + + return TRUE; +} + +static HRESULT wave_parser_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + AM_MEDIA_TYPE pad_mt; + HRESULT hr; + + wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + if (!amt_from_wg_format(&pad_mt, &format, false)) + return E_OUTOFMEMORY; + hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; + FreeMediaType(&pad_mt); + return hr; +} + +static HRESULT wave_parser_source_get_media_type(struct parser_source *pin, + unsigned int index, AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + + if (index > 0) + return VFW_S_NO_MORE_ITEMS; + wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + if (!amt_from_wg_format(mt, &format, false)) + return E_OUTOFMEMORY; + return S_OK; +} + +HRESULT wave_parser_create(IUnknown *outer, IUnknown **out) +{ + struct parser *object; + + if (!parser_init_gstreamer()) + return E_FAIL; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (!(object->wg_parser = wg_parser_create(WG_PARSER_WAVPARSE, false))) + { + free(object); + return E_OUTOFMEMORY; + } + + strmbase_filter_init(&object->filter, outer, &CLSID_WAVEParser, &filter_ops); + strmbase_sink_init(&object->sink, &object->filter, L"input pin", &wave_parser_sink_ops, NULL); + object->init_gst = wave_parser_filter_init_gst; + object->source_query_accept = wave_parser_source_query_accept; + object->source_get_media_type = wave_parser_source_get_media_type; + + TRACE("Created WAVE parser %p.\n", object); + *out = &object->filter.IUnknown_inner; + return S_OK; +} + +static HRESULT avi_splitter_sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) +{ + if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Stream) + && IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_Avi)) + return S_OK; + return S_FALSE; +} + +static const struct strmbase_sink_ops avi_splitter_sink_ops = +{ + .base.pin_query_accept = avi_splitter_sink_query_accept, + .sink_connect = parser_sink_connect, + .sink_disconnect = parser_sink_disconnect, +}; + +static BOOL avi_splitter_filter_init_gst(struct parser *filter) +{ + struct wg_parser *parser = filter->wg_parser; + uint32_t i, stream_count; + WCHAR source_name[20]; + + stream_count = wg_parser_get_stream_count(parser); + for (i = 0; i < stream_count; ++i) + { + swprintf(source_name, ARRAY_SIZE(source_name), L"Stream %02u", i); + if (!create_pin(filter, wg_parser_get_stream(parser, i), source_name)) + return FALSE; + } + + return TRUE; +} + +static HRESULT avi_splitter_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + AM_MEDIA_TYPE pad_mt; + HRESULT hr; + + wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + if (!amt_from_wg_format(&pad_mt, &format, false)) + return E_OUTOFMEMORY; + hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; + FreeMediaType(&pad_mt); + return hr; +} + +static HRESULT avi_splitter_source_get_media_type(struct parser_source *pin, + unsigned int index, AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + + if (index > 0) + return VFW_S_NO_MORE_ITEMS; + wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + if (!amt_from_wg_format(mt, &format, false)) + return E_OUTOFMEMORY; + return S_OK; +} + +HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out) +{ + struct parser *object; + + if (!parser_init_gstreamer()) + return E_FAIL; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (!(object->wg_parser = wg_parser_create(WG_PARSER_AVIDEMUX, false))) + { + free(object); + return E_OUTOFMEMORY; + } + + strmbase_filter_init(&object->filter, outer, &CLSID_AviSplitter, &filter_ops); + strmbase_sink_init(&object->sink, &object->filter, L"input pin", &avi_splitter_sink_ops, NULL); + object->init_gst = avi_splitter_filter_init_gst; + object->source_query_accept = avi_splitter_source_query_accept; + object->source_get_media_type = avi_splitter_source_get_media_type; + + TRACE("Created AVI splitter %p.\n", object); + *out = &object->filter.IUnknown_inner; + return S_OK; +} + +static HRESULT mpeg_splitter_sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) +{ + if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Stream)) + return S_FALSE; + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MPEG1Audio)) + return S_OK; + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MPEG1Video) + || IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MPEG1System) + || IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MPEG1VideoCD)) + FIXME("Unsupported subtype %s.\n", wine_dbgstr_guid(&mt->subtype)); + return S_FALSE; +} + +static const struct strmbase_sink_ops mpeg_splitter_sink_ops = +{ + .base.pin_query_accept = mpeg_splitter_sink_query_accept, + .sink_connect = parser_sink_connect, + .sink_disconnect = parser_sink_disconnect, +}; + +static BOOL mpeg_splitter_filter_init_gst(struct parser *filter) +{ + struct wg_parser *parser = filter->wg_parser; + + if (!create_pin(filter, wg_parser_get_stream(parser, 0), L"Audio")) + return FALSE; + + return TRUE; +} + +static HRESULT mpeg_splitter_source_query_accept(struct parser_source *pin, const AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + AM_MEDIA_TYPE pad_mt; + HRESULT hr; + + wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + if (!amt_from_wg_format(&pad_mt, &format, false)) + return E_OUTOFMEMORY; + hr = compare_media_types(mt, &pad_mt) ? S_OK : S_FALSE; + FreeMediaType(&pad_mt); + return hr; +} + +static HRESULT mpeg_splitter_source_get_media_type(struct parser_source *pin, + unsigned int index, AM_MEDIA_TYPE *mt) +{ + struct wg_format format; + + if (index > 0) + return VFW_S_NO_MORE_ITEMS; + wg_parser_stream_get_preferred_format(pin->wg_stream, &format); + if (!amt_from_wg_format(mt, &format, false)) + return E_OUTOFMEMORY; + return S_OK; +} + +static HRESULT mpeg_splitter_query_interface(struct strmbase_filter *iface, REFIID iid, void **out) +{ + struct parser *filter = impl_from_strmbase_filter(iface); + + if (IsEqualGUID(iid, &IID_IAMStreamSelect)) + { + *out = &filter->IAMStreamSelect_iface; + IUnknown_AddRef((IUnknown *)*out); + return S_OK; + } + + return E_NOINTERFACE; +} + +static const struct strmbase_filter_ops mpeg_splitter_ops = +{ + .filter_query_interface = mpeg_splitter_query_interface, + .filter_get_pin = parser_get_pin, + .filter_destroy = parser_destroy, + .filter_init_stream = parser_init_stream, + .filter_cleanup_stream = parser_cleanup_stream, +}; + +HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out) +{ + struct parser *object; + + if (!parser_init_gstreamer()) + return E_FAIL; + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + if (!(object->wg_parser = wg_parser_create(WG_PARSER_MPEGAUDIOPARSE, false))) + { + free(object); + return E_OUTOFMEMORY; + } + + strmbase_filter_init(&object->filter, outer, &CLSID_MPEG1Splitter, &mpeg_splitter_ops); + strmbase_sink_init(&object->sink, &object->filter, L"Input", &mpeg_splitter_sink_ops, NULL); + object->IAMStreamSelect_iface.lpVtbl = &stream_select_vtbl; + + object->init_gst = mpeg_splitter_filter_init_gst; + object->source_query_accept = mpeg_splitter_source_query_accept; + object->source_get_media_type = mpeg_splitter_source_get_media_type; + object->enum_sink_first = TRUE; + + TRACE("Created MPEG-1 splitter %p.\n", object); + *out = &object->filter.IUnknown_inner; + return S_OK; +} diff --git a/dlls/mfplat/queue.c b/dlls/mfplat/queue.c index 6ee0df37dce..8279929b46e 100644 --- wine/dlls/mfplat/queue.c +++ wine/dlls/mfplat/queue.c @@ -16,7 +16,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + #define COBJMACROS +#define NONAMELESSUNION + +#include "wine/debug.h" +#include "wine/list.h" #include "mfplat_private.h" #include "rtworkq.h" @@ -41,7 +47,7 @@ HRESULT WINAPI MFPutWorkItem(DWORD queue, IMFAsyncCallback *callback, IUnknown * IRtwqAsyncResult *result; HRESULT hr; - TRACE("%#lx, %p, %p.\n", queue, callback, state); + TRACE("%#x, %p, %p.\n", queue, callback, state); if (FAILED(hr = RtwqCreateAsyncResult(NULL, (IRtwqAsyncCallback *)callback, state, &result))) return hr; @@ -61,7 +67,7 @@ HRESULT WINAPI MFPutWorkItem2(DWORD queue, LONG priority, IMFAsyncCallback *call IRtwqAsyncResult *result; HRESULT hr; - TRACE("%#lx, %ld, %p, %p.\n", queue, priority, callback, state); + TRACE("%#x, %d, %p, %p.\n", queue, priority, callback, state); if (FAILED(hr = RtwqCreateAsyncResult(NULL, (IRtwqAsyncCallback *)callback, state, &result))) return hr; @@ -78,7 +84,7 @@ HRESULT WINAPI MFPutWorkItem2(DWORD queue, LONG priority, IMFAsyncCallback *call */ HRESULT WINAPI MFPutWorkItemEx(DWORD queue, IMFAsyncResult *result) { - TRACE("%#lx, %p\n", queue, result); + TRACE("%#x, %p\n", queue, result); return RtwqPutWorkItem(queue, 0, (IRtwqAsyncResult *)result); } @@ -88,7 +94,7 @@ HRESULT WINAPI MFPutWorkItemEx(DWORD queue, IMFAsyncResult *result) */ HRESULT WINAPI MFPutWorkItemEx2(DWORD queue, LONG priority, IMFAsyncResult *result) { - TRACE("%#lx, %ld, %p\n", queue, priority, result); + TRACE("%#x, %d, %p\n", queue, priority, result); return RtwqPutWorkItem(queue, priority, (IRtwqAsyncResult *)result); } diff --git a/dlls/mfplat/rsrc.rc b/dlls/mfplat/rsrc.rc new file mode 100644 index 00000000000..592bcb01138 --- /dev/null +++ wine/dlls/mfplat/rsrc.rc @@ -0,0 +1,28 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define WINE_FILEDESCRIPTION_STR "Wine GStreamer" +#define WINE_FILENAME_STR "winegstreamer.dll" +#define WINE_FILEVERSION 0,0,1,0 +#define WINE_FILEVERSION_STR "0.0.1.0" +#define WINE_PRODUCTVERSION 0,0,1,0 +#define WINE_PRODUCTVERSION_STR "1.0.1.0" +#define WINE_EXTRAVALUES VALUE "OLESelfRegister","" + +#include "wine/wine_common_ver.rc" + +/* @makedep: winegstreamer.rgs */ +1 WINE_REGISTRY winegstreamer.rgs diff --git a/dlls/mfplat/sample.c b/dlls/mfplat/sample.c index 8ef80eb5f24..04c68c87199 100644 --- wine/dlls/mfplat/sample.c +++ wine/dlls/mfplat/sample.c @@ -25,6 +25,7 @@ #include "initguid.h" #include "dxva2api.h" +#include "wine/debug.h" #include "wine/list.h" WINE_DEFAULT_DEBUG_CHANNEL(mfplat); @@ -150,7 +151,7 @@ static ULONG WINAPI sample_AddRef(IMFSample *iface) struct sample *sample = impl_from_IMFSample(iface); ULONG refcount = InterlockedIncrement(&sample->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -171,7 +172,7 @@ static ULONG WINAPI sample_Release(IMFSample *iface) struct sample *sample = impl_from_IMFSample(iface); ULONG refcount = InterlockedDecrement(&sample->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) release_sample_object(sample); @@ -194,14 +195,14 @@ static ULONG WINAPI sample_tracked_Release(IMFSample *iface) /* Call could fail if queue system is not initialized, it's not critical. */ if (FAILED(hr = RtwqInvokeCallback(tracked_result))) - WARN("Failed to invoke tracking callback, hr %#lx.\n", hr); + WARN("Failed to invoke tracking callback, hr %#x.\n", hr); IRtwqAsyncResult_Release(tracked_result); } LeaveCriticalSection(&sample->attributes.cs); refcount = InterlockedDecrement(&sample->attributes.ref); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) release_sample_object(sample); @@ -497,7 +498,7 @@ static HRESULT WINAPI sample_SetSampleFlags(IMFSample *iface, DWORD flags) { struct sample *sample = impl_from_IMFSample(iface); - TRACE("%p, %#lx.\n", iface, flags); + TRACE("%p, %#x.\n", iface, flags); EnterCriticalSection(&sample->attributes.cs); sample->flags = flags; @@ -589,7 +590,7 @@ static HRESULT WINAPI sample_GetBufferByIndex(IMFSample *iface, DWORD index, IMF struct sample *sample = impl_from_IMFSample(iface); HRESULT hr = S_OK; - TRACE("%p, %lu, %p.\n", iface, index, buffer); + TRACE("%p, %u, %p.\n", iface, index, buffer); EnterCriticalSection(&sample->attributes.cs); if (index < sample->buffer_count) @@ -741,7 +742,7 @@ static HRESULT WINAPI sample_RemoveBufferByIndex(IMFSample *iface, DWORD index) struct sample *sample = impl_from_IMFSample(iface); HRESULT hr = S_OK; - TRACE("%p, %lu.\n", iface, index); + TRACE("%p, %u.\n", iface, index); EnterCriticalSection(&sample->attributes.cs); if (index < sample->buffer_count) @@ -1097,7 +1098,7 @@ static ULONG WINAPI sample_allocator_AddRef(IMFVideoSampleAllocatorEx *iface) struct sample_allocator *allocator = impl_from_IMFVideoSampleAllocatorEx(iface); ULONG refcount = InterlockedIncrement(&allocator->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -1167,7 +1168,7 @@ static ULONG WINAPI sample_allocator_Release(IMFVideoSampleAllocatorEx *iface) struct sample_allocator *allocator = impl_from_IMFVideoSampleAllocatorEx(iface); ULONG refcount = InterlockedDecrement(&allocator->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -1265,7 +1266,7 @@ static HRESULT sample_allocator_get_surface_service(struct sample_allocator *all if (FAILED(hr = IDirect3DDeviceManager9_GetVideoService(allocator->d3d9_device_manager, service->hdevice, &IID_IDirectXVideoProcessorService, (void **)&service->dxva_service))) { - WARN("Failed to get DXVA processor service, hr %#lx.\n", hr); + WARN("Failed to get DXVA processor service, hr %#x.\n", hr); IDirect3DDeviceManager9_CloseDeviceHandle(allocator->d3d9_device_manager, service->hdevice); } } @@ -1277,7 +1278,7 @@ static HRESULT sample_allocator_get_surface_service(struct sample_allocator *all if (FAILED(hr = IMFDXGIDeviceManager_GetVideoService(allocator->dxgi_device_manager, service->hdevice, &IID_ID3D11Device, (void **)&service->d3d11_device))) { - WARN("Failed to get D3D11 device, hr %#lx.\n", hr); + WARN("Failed to get D3D11 device, hr %#x.\n", hr); IMFDXGIDeviceManager_CloseDeviceHandle(allocator->dxgi_device_manager, service->hdevice); } } @@ -1487,7 +1488,7 @@ static HRESULT WINAPI sample_allocator_InitializeSampleAllocator(IMFVideoSampleA struct sample_allocator *allocator = impl_from_IMFVideoSampleAllocatorEx(iface); HRESULT hr; - TRACE("%p, %lu, %p.\n", iface, sample_count, media_type); + TRACE("%p, %u, %p.\n", iface, sample_count, media_type); if (!sample_count) return E_INVALIDARG; @@ -1584,7 +1585,7 @@ static HRESULT WINAPI sample_allocator_InitializeSampleAllocatorEx(IMFVideoSampl struct sample_allocator *allocator = impl_from_IMFVideoSampleAllocatorEx(iface); HRESULT hr; - TRACE("%p, %lu, %lu, %p, %p.\n", iface, initial_sample_count, max_sample_count, attributes, media_type); + TRACE("%p, %u, %u, %p, %p.\n", iface, initial_sample_count, max_sample_count, attributes, media_type); EnterCriticalSection(&allocator->cs); diff --git a/dlls/mfplat/tests/Makefile.in b/dlls/mfplat/tests/Makefile.in index ae9cc378933..d5ef14e88f0 100644 --- wine/dlls/mfplat/tests/Makefile.in +++ wine/dlls/mfplat/tests/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES TESTDLL = mfplat.dll IMPORTS = ole32 mfplat user32 d3d9 dxva2 mfuuid propsys uuid strmiids diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 8d21f2ed60e..20577453fe3 100644 --- wine/dlls/mfplat/tests/mfplat.c +++ wine/dlls/mfplat/tests/mfplat.c @@ -72,7 +72,7 @@ static void _expect_ref(IUnknown *obj, ULONG ref, int line) ULONG rc; IUnknown_AddRef(obj); rc = IUnknown_Release(obj); - ok_(__FILE__,line)(rc == ref, "Unexpected refcount %ld, expected %ld.\n", rc, ref); + ok_(__FILE__,line)(rc == ref, "Unexpected refcount %d, expected %d.\n", rc, ref); } static ULONG get_refcount(void *iface) @@ -92,7 +92,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -112,7 +112,7 @@ static void check_service_interface_(unsigned int line, void *iface_ptr, REFGUID hr = IMFGetService_GetService(gs, service, iid, (void **)&unk); IMFGetService_Release(gs); } - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -143,7 +143,7 @@ static void init_d3d11_resource_readback(ID3D11Resource *resource, ID3D11Resourc if (FAILED(hr = ID3D11DeviceContext_Map(rb->immediate_context, rb->resource, sub_resource_idx, D3D11_MAP_READ, 0, &rb->map_desc))) { - trace("Failed to map resource, hr %#lx.\n", hr); + trace("Failed to map resource, hr %#x.\n", hr); ID3D11Resource_Release(rb->resource); rb->resource = NULL; ID3D11DeviceContext_Release(rb->immediate_context); @@ -171,7 +171,7 @@ static void get_d3d11_texture2d_readback(ID3D11Texture2D *texture, unsigned int texture_desc.MiscFlags = 0; if (FAILED(hr = ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, (ID3D11Texture2D **)&rb_texture))) { - trace("Failed to create texture, hr %#lx.\n", hr); + trace("Failed to create texture, hr %#x.\n", hr); ID3D11Device_Release(device); return; } @@ -317,7 +317,7 @@ static WCHAR *load_resource(const WCHAR *name) file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %ld\n", + ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %d\n", wine_dbgstr_w(pathW), GetLastError()); res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); @@ -418,57 +418,57 @@ static void test_register(void) win_skip("Not enough permissions to register a transform.\n"); return; } - ok(ret == S_OK, "Failed to register dummy transform, hr %#lx.\n", ret); + ok(ret == S_OK, "Failed to register dummy transform, hr %#x.\n", ret); if(0) { /* NULL name crashes on windows */ ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, NULL, 0, 1, input, 1, output, NULL); - ok(ret == E_INVALIDARG, "Unexpected hr %#lx.\n", ret); + ok(ret == E_INVALIDARG, "got %x\n", ret); } ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, name, 0, 0, NULL, 0, NULL, NULL); - ok(ret == S_OK, "Failed to register dummy filter: %lx\n", ret); + ok(ret == S_OK, "Failed to register dummy filter: %x\n", ret); ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, name, 0, 1, NULL, 0, NULL, NULL); - ok(ret == S_OK, "Failed to register dummy filter: %lx\n", ret); + ok(ret == S_OK, "Failed to register dummy filter: %x\n", ret); ret = MFTRegister(DUMMY_CLSID, MFT_CATEGORY_OTHER, name, 0, 0, NULL, 1, NULL, NULL); - ok(ret == S_OK, "Failed to register dummy filter: %lx\n", ret); + ok(ret == S_OK, "Failed to register dummy filter: %x\n", ret); if(0) { /* NULL clsids/count crashes on windows (vista) */ count = 0; ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, NULL, NULL, NULL, &count); - ok(ret == E_POINTER, "Failed to enumerate filters: %lx\n", ret); + ok(ret == E_POINTER, "Failed to enumerate filters: %x\n", ret); ok(count == 0, "Expected count == 0\n"); clsids = NULL; ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, NULL, NULL, &clsids, NULL); - ok(ret == E_POINTER, "Failed to enumerate filters: %lx\n", ret); + ok(ret == E_POINTER, "Failed to enumerate filters: %x\n", ret); } hr = MFTGetInfo(DUMMY_CLSID, &mft_name, NULL, NULL, NULL, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!lstrcmpW(mft_name, L"Wine test"), "Unexpected name %s.\n", wine_dbgstr_w(mft_name)); CoTaskMemFree(mft_name); hr = MFTGetInfo(DUMMY_CLSID, NULL, NULL, NULL, NULL, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); in_count = out_count = 1; hr = MFTGetInfo(DUMMY_CLSID, NULL, NULL, &in_count, NULL, &out_count, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!in_count, "Unexpected count %u.\n", in_count); ok(!out_count, "Unexpected count %u.\n", out_count); hr = MFTGetInfo(DUMMY_CLSID, NULL, NULL, NULL, NULL, NULL, &attributes); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!attributes, "Unexpected attributes.\n"); IMFAttributes_Release(attributes); hr = MFTGetInfo(DUMMY_CLSID, &mft_name, &in_types, &in_count, &out_types, &out_count, &attributes); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!lstrcmpW(mft_name, L"Wine test"), "Unexpected name %s.\n", wine_dbgstr_w(mft_name)); ok(!!in_types, "Unexpected pointer.\n"); ok(!!out_types, "Unexpected pointer.\n"); @@ -485,7 +485,7 @@ if(0) ok(!!attributes, "Unexpected attributes.\n"); count = 1; hr = IMFAttributes_GetCount(attributes, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!count, "Unexpected count %u.\n", count); CoTaskMemFree(mft_name); CoTaskMemFree(in_types); @@ -495,7 +495,7 @@ if(0) count = 0; clsids = NULL; ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, NULL, NULL, &clsids, &count); - ok(ret == S_OK, "Failed to enumerate filters: %lx\n", ret); + ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); ok(count > 0, "Expected count > 0\n"); ok(clsids != NULL, "Expected clsids != NULL\n"); ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); @@ -504,7 +504,7 @@ if(0) count = 0; clsids = NULL; ret = MFTEnum(MFT_CATEGORY_OTHER, 0, input, NULL, NULL, &clsids, &count); - ok(ret == S_OK, "Failed to enumerate filters: %lx\n", ret); + ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); ok(count > 0, "Expected count > 0\n"); ok(clsids != NULL, "Expected clsids != NULL\n"); ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); @@ -513,7 +513,7 @@ if(0) count = 0; clsids = NULL; ret = MFTEnum(MFT_CATEGORY_OTHER, 0, NULL, output, NULL, &clsids, &count); - ok(ret == S_OK, "Failed to enumerate filters: %lx\n", ret); + ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); ok(count > 0, "Expected count > 0\n"); ok(clsids != NULL, "Expected clsids != NULL\n"); ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); @@ -522,7 +522,7 @@ if(0) count = 0; clsids = NULL; ret = MFTEnum(MFT_CATEGORY_OTHER, 0, input, output, NULL, &clsids, &count); - ok(ret == S_OK, "Failed to enumerate filters: %lx\n", ret); + ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); ok(count > 0, "Expected count > 0\n"); ok(clsids != NULL, "Expected clsids != NULL\n"); ok(check_clsid(clsids, count), "Filter was not part of enumeration\n"); @@ -532,17 +532,17 @@ if(0) count = 0; clsids = NULL; ret = MFTEnum(MFT_CATEGORY_OTHER, 0, output, input, NULL, &clsids, &count); - ok(ret == S_OK, "Failed to enumerate filters: %lx\n", ret); + ok(ret == S_OK, "Failed to enumerate filters: %x\n", ret); ok(!count, "got %d\n", count); ok(clsids == NULL, "Expected clsids == NULL\n"); ret = MFTUnregister(DUMMY_CLSID); ok(ret == S_OK || /* w7pro64 */ - broken(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)), "Unexpected hr %#lx.\n", ret); + broken(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)), "got %x\n", ret); ret = MFTUnregister(DUMMY_CLSID); - ok(ret == S_OK || broken(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)), "Unexpected hr %#lx.\n", ret); + ok(ret == S_OK || broken(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)), "got %x\n", ret); } static HRESULT WINAPI test_create_from_url_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) @@ -559,10 +559,10 @@ static HRESULT WINAPI test_create_from_url_callback_Invoke(IMFAsyncCallback *ifa object = NULL; hr = IMFSourceResolver_EndCreateObjectFromURL(resolver, result, &obj_type, &object); - ok(hr == S_OK, "Failed to create an object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create an object, hr %#x.\n", hr); hr = IMFAsyncResult_GetObject(result, &object2); - ok(hr == S_OK, "Failed to get result object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get result object, hr %#x.\n", hr); ok(object2 == object, "Unexpected object.\n"); if (object) @@ -596,12 +596,12 @@ static HRESULT WINAPI test_create_from_file_handler_callback_Invoke(IMFAsyncCall handler = (IMFSchemeHandler *)IMFAsyncResult_GetStateNoAddRef(result); hr = IMFSchemeHandler_EndCreateObject(handler, result, &obj_type, &object); - ok(hr == S_OK, "Failed to create an object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create an object, hr %#x.\n", hr); if (SUCCEEDED(hr)) { hr = IMFAsyncResult_GetObject(result, &object2); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); IUnknown_Release(object); } @@ -631,7 +631,7 @@ static HRESULT WINAPI source_events_callback_Invoke(IMFAsyncCallback *iface, IMF generator = (IMFMediaEventGenerator *)IMFAsyncResult_GetStateNoAddRef(result); hr = IMFMediaEventGenerator_EndGetEvent(generator, result, &callback->media_event); - ok(hr == S_OK, "Failed to create an object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create an object, hr %#x.\n", hr); SetEvent(callback->event); @@ -673,7 +673,7 @@ static BOOL get_event(IMFMediaEventGenerator *generator, MediaEventType expected { hr = IMFMediaEventGenerator_BeginGetEvent(generator, &callback->IMFAsyncCallback_iface, (IUnknown *)generator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); if (WaitForSingleObject(callback->event, 1000) == WAIT_TIMEOUT) { @@ -684,14 +684,14 @@ static BOOL get_event(IMFMediaEventGenerator *generator, MediaEventType expected Sleep(10); hr = IMFMediaEvent_GetType(callback->media_event, &event_type); - ok(hr == S_OK, "Failed to event type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to event type, hr %#x.\n", hr); if ((ret = (event_type == expected_event_type))) { if (value) { hr = IMFMediaEvent_GetValue(callback->media_event, value); - ok(hr == S_OK, "Failed to get value of event, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr); } break; @@ -743,16 +743,16 @@ static void test_source_resolver(void) callback2 = create_test_callback(&test_create_from_file_handler_callback_vtbl); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = pMFCreateSourceResolver(NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "got %#x\n", hr); hr = pMFCreateSourceResolver(&resolver); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = pMFCreateSourceResolver(&resolver2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); ok(resolver != resolver2, "Expected new instance\n"); IMFSourceResolver_Release(resolver2); @@ -760,20 +760,20 @@ static void test_source_resolver(void) filename = load_resource(L"test.mp4"); hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &stream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFSourceResolver_CreateObjectFromByteStream( resolver, NULL, NULL, MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, (IUnknown **)&mediasource); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "got 0x%08x\n", hr); hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, NULL, MF_RESOLUTION_MEDIASOURCE, NULL, NULL, (IUnknown **)&mediasource); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "got 0x%08x\n", hr); hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, NULL, MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "got 0x%08x\n", hr); IMFByteStream_Release(stream); @@ -782,16 +782,16 @@ static void test_source_resolver(void) hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"nonexisting.mp4", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, (IUnknown **)&stream); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#x.\n", hr); hr = IMFSourceResolver_CreateObjectFromURL(resolver, filename, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, (IUnknown **)&stream); - ok(hr == S_OK, "Failed to resolve url, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to resolve url, hr %#x.\n", hr); IMFByteStream_Release(stream); hr = IMFSourceResolver_BeginCreateObjectFromURL(resolver, filename, MF_RESOLUTION_BYTESTREAM, NULL, &cancel_cookie, &callback->IMFAsyncCallback_iface, (IUnknown *)resolver); - ok(hr == S_OK, "Create request failed, hr %#lx.\n", hr); + ok(hr == S_OK, "Create request failed, hr %#x.\n", hr); ok(cancel_cookie != NULL, "Unexpected cancel object.\n"); IUnknown_Release(cancel_cookie); @@ -804,18 +804,18 @@ static void test_source_resolver(void) hr = IMFSourceResolver_CreateObjectFromURL(resolver, pathW, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, (IUnknown **)&stream); - ok(hr == S_OK, "Failed to resolve url, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to resolve url, hr %#x.\n", hr); IMFByteStream_Release(stream); /* We have to create a new bytestream here, because all following * calls to CreateObjectFromByteStream will fail. */ hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &stream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFAttributes_SetString(attributes, &MF_BYTESTREAM_CONTENT_TYPE, L"video/mp4"); - ok(hr == S_OK, "Failed to set string value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set string value, hr %#x.\n", hr); IMFAttributes_Release(attributes); /* Start of gstreamer dependent tests */ @@ -823,14 +823,14 @@ static void test_source_resolver(void) hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, NULL, MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, (IUnknown **)&mediasource); if (strcmp(winetest_platform, "wine")) - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); if (FAILED(hr)) { IMFByteStream_Release(stream); IMFSourceResolver_Release(resolver); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); DeleteFileW(filename); return; @@ -842,98 +842,98 @@ static void test_source_resolver(void) check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, TRUE); hr = IMFMediaSource_QueryInterface(mediasource, &IID_IMFGetService, (void**)&get_service); - ok(hr == S_OK, "Failed to get service interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get service interface, hr %#x.\n", hr); hr = IMFGetService_GetService(get_service, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void**)&rate_support); - ok(hr == S_OK, "Failed to get rate support interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get rate support interface, hr %#x.\n", hr); hr = IMFRateSupport_GetFastestRate(rate_support, MFRATE_FORWARD, FALSE, &rate); - ok(hr == S_OK, "Failed to query fastest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query fastest rate, hr %#x.\n", hr); ok(rate == 1e6f, "Unexpected fastest rate %f.\n", rate); hr = IMFRateSupport_GetFastestRate(rate_support, MFRATE_FORWARD, TRUE, &rate); - ok(hr == S_OK, "Failed to query fastest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query fastest rate, hr %#x.\n", hr); ok(rate == 1e6f, "Unexpected fastest rate %f.\n", rate); hr = IMFRateSupport_GetFastestRate(rate_support, MFRATE_REVERSE, FALSE, &rate); - ok(hr == S_OK, "Failed to query fastest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query fastest rate, hr %#x.\n", hr); ok(rate == -1e6f, "Unexpected fastest rate %f.\n", rate); hr = IMFRateSupport_GetFastestRate(rate_support, MFRATE_REVERSE, TRUE, &rate); - ok(hr == S_OK, "Failed to query fastest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query fastest rate, hr %#x.\n", hr); ok(rate == -1e6f, "Unexpected fastest rate %f.\n", rate); hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_FORWARD, FALSE, &rate); - ok(hr == S_OK, "Failed to query slowest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query slowest rate, hr %#x.\n", hr); ok(rate == 0.0f, "Unexpected slowest rate %f.\n", rate); hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_FORWARD, TRUE, &rate); - ok(hr == S_OK, "Failed to query slowest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query slowest rate, hr %#x.\n", hr); ok(rate == 0.0f, "Unexpected slowest rate %f.\n", rate); hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_REVERSE, FALSE, &rate); - ok(hr == S_OK, "Failed to query slowest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query slowest rate, hr %#x.\n", hr); ok(rate == 0.0f, "Unexpected slowest rate %f.\n", rate); hr = IMFRateSupport_GetSlowestRate(rate_support, MFRATE_REVERSE, TRUE, &rate); - ok(hr == S_OK, "Failed to query slowest rate, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to query slowest rate, hr %#x.\n", hr); ok(rate == 0.0f, "Unexpected slowest rate %f.\n", rate); hr = IMFRateSupport_IsRateSupported(rate_support, FALSE, 0.0f, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFRateSupport_IsRateSupported(rate_support, FALSE, 0.0f, &rate); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(rate == 0.0f, "Unexpected rate %f.\n", rate); hr = IMFRateSupport_IsRateSupported(rate_support, FALSE, 1.0f, &rate); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(rate == 1.0f, "Unexpected rate %f.\n", rate); hr = IMFRateSupport_IsRateSupported(rate_support, FALSE, -1.0f, &rate); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(rate == -1.0f, "Unexpected rate %f.\n", rate); hr = IMFRateSupport_IsRateSupported(rate_support, FALSE, 1e6f + 1.0f, &rate); - ok(hr == MF_E_UNSUPPORTED_RATE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_UNSUPPORTED_RATE, "Unexpected hr %#x.\n", hr); ok(rate == 1e6f + 1.0f || broken(rate == 1e6f) /* Win7 */, "Unexpected %f.\n", rate); hr = IMFRateSupport_IsRateSupported(rate_support, FALSE, -1e6f, &rate); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(rate == -1e6f, "Unexpected rate %f.\n", rate); hr = IMFRateSupport_IsRateSupported(rate_support, FALSE, -1e6f - 1.0f, &rate); - ok(hr == MF_E_UNSUPPORTED_RATE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_UNSUPPORTED_RATE, "Unexpected hr %#x.\n", hr); ok(rate == -1e6f - 1.0f || broken(rate == -1e6f) /* Win7 */, "Unexpected rate %f.\n", rate); check_service_interface(mediasource, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, TRUE); hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor); - ok(hr == S_OK, "Failed to get presentation descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr); ok(descriptor != NULL, "got %p\n", descriptor); hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(descriptor, 0, &selected, &sd); - ok(hr == S_OK, "Failed to get stream descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get stream descriptor, hr %#x.\n", hr); hr = IMFStreamDescriptor_GetMediaTypeHandler(sd, &handler); - ok(hr == S_OK, "Failed to get type handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr); IMFStreamDescriptor_Release(sd); hr = IMFMediaTypeHandler_GetMajorType(handler, &guid); - ok(hr == S_OK, "Failed to get stream major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get stream major type, hr %#x.\n", hr); /* Check major/minor type for the test media. */ ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type %s.\n", debugstr_guid(&guid)); hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, &media_type); - ok(hr == S_OK, "Failed to get current media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get current media type, hr %#x.\n", hr); hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &guid); - ok(hr == S_OK, "Failed to get media sub type, hr %#lx.\n", hr); - todo_wine + ok(hr == S_OK, "Failed to get media sub type, hr %#x.\n", hr); +todo_wine ok(IsEqualGUID(&guid, &MFVideoFormat_M4S2), "Unexpected sub type %s.\n", debugstr_guid(&guid)); hr = IMFMediaType_GetUINT32(media_type, &MF_MT_VIDEO_ROTATION, &rotation); - ok(hr == S_OK || broken(hr == MF_E_ATTRIBUTENOTFOUND) /* Win7 */, "Failed to get rotation, hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == MF_E_ATTRIBUTENOTFOUND) /* Win7 */, "Failed to get rotation, hr %#x.\n", hr); if (hr == S_OK) ok(rotation == MFVideoRotationFormat_0, "Got wrong rotation %u.\n", rotation); IMFMediaType_Release(media_type); hr = IMFPresentationDescriptor_SelectStream(descriptor, 0); - ok(hr == S_OK, "Failed to select video stream, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to select video stream, hr %#x.\n", hr); var.vt = VT_EMPTY; hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); - ok(hr == S_OK, "Failed to start media source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr); video_stream = NULL; if (get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var)) @@ -943,39 +943,39 @@ static void test_source_resolver(void) } hr = IMFMediaSource_Pause(mediasource); - ok(hr == S_OK, "Failed to pause media source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr); if (get_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var)) ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); var.vt = VT_EMPTY; hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); - ok(hr == S_OK, "Failed to start media source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr); if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, &var)) ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); hr = IMFMediaSource_Pause(mediasource); - ok(hr == S_OK, "Failed to pause media source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr); if (get_event((IMFMediaEventGenerator *)mediasource, MESourcePaused, &var)) ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); var.vt = VT_I8; var.uhVal.QuadPart = 0; hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); - ok(hr == S_OK, "Failed to start media source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr); if (get_event((IMFMediaEventGenerator *)mediasource, MESourceSeeked, &var)) ok(var.vt == VT_I8, "Unexpected value type.\n"); hr = IMFMediaSource_Stop(mediasource); - ok(hr == S_OK, "Failed to pause media source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause media source, hr %#x.\n", hr); if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStopped, &var)) ok(var.vt == VT_EMPTY, "Unexpected value type.\n"); var.vt = VT_I8; var.uhVal.QuadPart = 0; hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var); - ok(hr == S_OK, "Failed to start media source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr); if (get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, &var)) ok(var.vt == VT_I8, "Unexpected value type.\n"); @@ -985,7 +985,7 @@ static void test_source_resolver(void) for (i = 0; i < sample_count; ++i) { hr = IMFMediaStream_RequestSample(video_stream, NULL); - ok(hr == S_OK, "Failed to request sample %u, hr %#lx.\n", i + 1, hr); + ok(hr == S_OK, "Failed to request sample %u, hr %#x.\n", i + 1, hr); if (hr != S_OK) break; } @@ -1007,15 +1007,15 @@ static void test_source_resolver(void) sample = (IMFSample *)var.punkVal; hr = IMFSample_GetBufferCount(sample, &buffer_count); - ok(hr == S_OK, "Failed to get buffer count, hr %#lx.\n", hr); - ok(buffer_count == 1, "Unexpected buffer count %lu.\n", buffer_count); + ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr); + ok(buffer_count == 1, "Unexpected buffer count %u.\n", buffer_count); hr = IMFSample_GetSampleDuration(sample, &duration); - ok(hr == S_OK, "Failed to get sample duration, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get sample duration, hr %#x.\n", hr); ok(duration == 40 * MILLI_TO_100_NANO, "Unexpected duration %s.\n", wine_dbgstr_longlong(duration)); hr = IMFSample_GetSampleTime(sample, &time); - ok(hr == S_OK, "Failed to get sample time, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get sample time, hr %#x.\n", hr); ok(time == i * 40 * MILLI_TO_100_NANO, "Unexpected time %s.\n", wine_dbgstr_longlong(time)); IMFSample_Release(sample); @@ -1028,16 +1028,16 @@ static void test_source_resolver(void) /* MEEndOfStream isn't queued until after a one request beyond the last frame is submitted */ Sleep(100); hr = IMFMediaEventGenerator_GetEvent((IMFMediaEventGenerator *)video_stream, MF_EVENT_FLAG_NO_WAIT, &event); - ok (hr == MF_E_NO_EVENTS_AVAILABLE, "Unexpected hr %#lx.\n", hr); + ok (hr == MF_E_NO_EVENTS_AVAILABLE, "Unexpected hr %#x.\n", hr); hr = IMFMediaStream_RequestSample(video_stream, NULL); - ok (hr == S_OK || hr == MF_E_END_OF_STREAM, "Unexpected hr %#lx.\n", hr); + ok (hr == S_OK || hr == MF_E_END_OF_STREAM, "Unexpected hr %#x.\n", hr); get_event((IMFMediaEventGenerator *)video_stream, MEEndOfStream, NULL); } hr = IMFMediaStream_RequestSample(video_stream, NULL); - ok(hr == MF_E_END_OF_STREAM, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_END_OF_STREAM, "Unexpected hr %#x.\n", hr); get_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL); @@ -1046,10 +1046,10 @@ static void test_source_resolver(void) IMFPresentationDescriptor_Release(descriptor); hr = IMFMediaSource_Shutdown(mediasource); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); IMFRateSupport_Release(rate_support); IMFGetService_Release(get_service); @@ -1058,18 +1058,18 @@ static void test_source_resolver(void) /* Create directly through scheme handler. */ hr = CoInitialize(NULL); - ok(SUCCEEDED(hr), "Failed to initialize, hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Failed to initialize, hr %#x.\n", hr); do_uninit = hr == S_OK; hr = CoCreateInstance(&CLSID_FileSchemePlugin, NULL, CLSCTX_INPROC_SERVER, &IID_IMFSchemeHandler, (void **)&scheme_handler); - ok(hr == S_OK, "Failed to create handler object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create handler object, hr %#x.\n", hr); callback2->event = callback->event; cancel_cookie = NULL; hr = IMFSchemeHandler_BeginCreateObject(scheme_handler, pathW, MF_RESOLUTION_MEDIASOURCE, NULL, &cancel_cookie, &callback2->IMFAsyncCallback_iface, (IUnknown *)scheme_handler); - ok(hr == S_OK, "Create request failed, hr %#lx.\n", hr); + ok(hr == S_OK, "Create request failed, hr %#x.\n", hr); ok(!!cancel_cookie, "Unexpected cancel object.\n"); IUnknown_Release(cancel_cookie); @@ -1085,7 +1085,7 @@ static void test_source_resolver(void) IMFSourceResolver_Release(resolver); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); IMFAsyncCallback_Release(&callback->IMFAsyncCallback_iface); IMFAsyncCallback_Release(&callback2->IMFAsyncCallback_iface); @@ -1154,9 +1154,8 @@ static void test_media_type(void) IMFMediaType *mediatype, *mediatype2; IMFVideoMediaType *video_type; IUnknown *unk, *unk2; + DWORD count, flags; BOOL compressed; - DWORD flags; - UINT count; HRESULT hr; GUID guid; @@ -1164,140 +1163,140 @@ if(0) { /* Crash on Windows Vista/7 */ hr = MFCreateMediaType(NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); } hr = MFCreateMediaType(&mediatype); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFMediaType_GetMajorType(mediatype, &guid); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); compressed = FALSE; hr = IMFMediaType_IsCompressedFormat(mediatype, &compressed); - ok(hr == S_OK, "Failed to get media type property, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get media type property, hr %#x.\n", hr); ok(compressed, "Unexpected value %d.\n", compressed); hr = IMFMediaType_SetUINT32(mediatype, &MF_MT_ALL_SAMPLES_INDEPENDENT, 0); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); compressed = FALSE; hr = IMFMediaType_IsCompressedFormat(mediatype, &compressed); - ok(hr == S_OK, "Failed to get media type property, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get media type property, hr %#x.\n", hr); ok(compressed, "Unexpected value %d.\n", compressed); hr = IMFMediaType_SetUINT32(mediatype, &MF_MT_COMPRESSED, 0); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); compressed = FALSE; hr = IMFMediaType_IsCompressedFormat(mediatype, &compressed); - ok(hr == S_OK, "Failed to get media type property, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get media type property, hr %#x.\n", hr); ok(compressed, "Unexpected value %d.\n", compressed); hr = IMFMediaType_SetUINT32(mediatype, &MF_MT_ALL_SAMPLES_INDEPENDENT, 1); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaType_SetUINT32(mediatype, &MF_MT_COMPRESSED, 1); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); compressed = TRUE; hr = IMFMediaType_IsCompressedFormat(mediatype, &compressed); - ok(hr == S_OK, "Failed to get media type property, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get media type property, hr %#x.\n", hr); ok(!compressed, "Unexpected value %d.\n", compressed); hr = IMFMediaType_DeleteItem(mediatype, &MF_MT_COMPRESSED); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set GUID value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set GUID value, hr %#x.\n", hr); hr = IMFMediaType_GetMajorType(mediatype, &guid); - ok(hr == S_OK, "Failed to get major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get major type, hr %#x.\n", hr); ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type.\n"); /* IsEqual() */ hr = MFCreateMediaType(&mediatype2); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); flags = 0xdeadbeef; hr = IMFMediaType_IsEqual(mediatype, mediatype2, &flags); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); - ok(flags == 0, "Unexpected flags %#lx.\n", flags); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + ok(flags == 0, "Unexpected flags %#x.\n", flags); /* Different major types. */ hr = IMFMediaType_SetGUID(mediatype2, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); flags = 0; hr = IMFMediaType_IsEqual(mediatype, mediatype2, &flags); - ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(flags == (MF_MEDIATYPE_EQUAL_FORMAT_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA), - "Unexpected flags %#lx.\n", flags); + "Unexpected flags %#x.\n", flags); /* Same major types, different subtypes. */ hr = IMFMediaType_SetGUID(mediatype2, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); flags = 0; hr = IMFMediaType_IsEqual(mediatype, mediatype2, &flags); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(flags == (MF_MEDIATYPE_EQUAL_MAJOR_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_DATA - | MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA), "Unexpected flags %#lx.\n", flags); + | MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA), "Unexpected flags %#x.\n", flags); /* Different user data. */ hr = IMFMediaType_SetBlob(mediatype, &MF_MT_USER_DATA, (const UINT8 *)&flags, sizeof(flags)); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); flags = 0; hr = IMFMediaType_IsEqual(mediatype, mediatype2, &flags); - ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(flags == (MF_MEDIATYPE_EQUAL_MAJOR_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_DATA), - "Unexpected flags %#lx.\n", flags); + "Unexpected flags %#x.\n", flags); hr = IMFMediaType_DeleteItem(mediatype, &MF_MT_USER_DATA); - ok(hr == S_OK, "Failed to delete item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to delete item, hr %#x.\n", hr); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_SUBTYPE, &MFVideoFormat_RGB32); - ok(hr == S_OK, "Failed to set subtype, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set subtype, hr %#x.\n", hr); flags = 0; hr = IMFMediaType_IsEqual(mediatype, mediatype2, &flags); - ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(flags == (MF_MEDIATYPE_EQUAL_MAJOR_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_DATA | MF_MEDIATYPE_EQUAL_FORMAT_USER_DATA), - "Unexpected flags %#lx.\n", flags); + "Unexpected flags %#x.\n", flags); IMFMediaType_Release(mediatype2); IMFMediaType_Release(mediatype); /* IMFVideoMediaType */ hr = MFCreateMediaType(&mediatype); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(mediatype, &IID_IMFVideoMediaType, FALSE); hr = IMFMediaType_QueryInterface(mediatype, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set GUID value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set GUID value, hr %#x.\n", hr); hr = IMFMediaType_QueryInterface(mediatype, &IID_IMFVideoMediaType, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk2 == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IMFAttributes, (void **)&unk2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk2 == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IMFMediaType, (void **)&unk2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk2 == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk2); @@ -1307,20 +1306,20 @@ if(0) if (pMFCreateVideoMediaTypeFromSubtype) { hr = pMFCreateVideoMediaTypeFromSubtype(&MFVideoFormat_RGB555, &video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(video_type, &IID_IMFMediaType, TRUE); check_interface(video_type, &IID_IMFVideoMediaType, TRUE); /* Major and subtype are set on creation. */ hr = IMFVideoMediaType_GetCount(video_type, &count); - ok(count == 2, "Unexpected attribute count %#lx.\n", hr); + ok(count == 2, "Unexpected attribute count %#x.\n", hr); hr = IMFVideoMediaType_DeleteAllItems(video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoMediaType_GetCount(video_type, &count); - ok(!count, "Unexpected attribute count %#lx.\n", hr); + ok(!count, "Unexpected attribute count %#x.\n", hr); check_interface(video_type, &IID_IMFVideoMediaType, FALSE); @@ -1331,33 +1330,33 @@ if(0) /* IMFAudioMediaType */ hr = MFCreateMediaType(&mediatype); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(mediatype, &IID_IMFAudioMediaType, FALSE); hr = IMFMediaType_QueryInterface(mediatype, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set GUID value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set GUID value, hr %#x.\n", hr); hr = IMFMediaType_QueryInterface(mediatype, &IID_IMFAudioMediaType, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk2 == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IMFAttributes, (void **)&unk2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk2 == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IMFMediaType, (void **)&unk2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk2 == (IUnknown *)mediatype, "Unexpected pointer.\n"); IUnknown_Release(unk2); @@ -1380,50 +1379,50 @@ static void test_MFCreateMediaEvent(void) value.vt = VT_UNKNOWN; hr = MFCreateMediaEvent(MEError, &GUID_NULL, E_FAIL, &value, &mediaevent); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); PropVariantClear(&value); hr = IMFMediaEvent_GetType(mediaevent, &type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(type == MEError, "got %#lx\n", type); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(type == MEError, "got %#x\n", type); hr = IMFMediaEvent_GetExtendedType(mediaevent, &extended_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(IsEqualGUID(&extended_type, &GUID_NULL), "got %s\n", wine_dbgstr_guid(&extended_type)); hr = IMFMediaEvent_GetStatus(mediaevent, &status); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(status == E_FAIL, "Unexpected hr %#lx.\n", status); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(status == E_FAIL, "got 0x%08x\n", status); PropVariantInit(&value); hr = IMFMediaEvent_GetValue(mediaevent, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(value.vt == VT_UNKNOWN, "got %#x\n", value.vt); PropVariantClear(&value); IMFMediaEvent_Release(mediaevent); hr = MFCreateMediaEvent(MEUnknown, &DUMMY_GUID1, S_OK, NULL, &mediaevent); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFMediaEvent_GetType(mediaevent, &type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(type == MEUnknown, "got %#lx\n", type); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(type == MEUnknown, "got %#x\n", type); hr = IMFMediaEvent_GetExtendedType(mediaevent, &extended_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(IsEqualGUID(&extended_type, &DUMMY_GUID1), "got %s\n", wine_dbgstr_guid(&extended_type)); hr = IMFMediaEvent_GetStatus(mediaevent, &status); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(status == S_OK, "Unexpected hr %#lx.\n", status); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(status == S_OK, "got 0x%08x\n", status); PropVariantInit(&value); hr = IMFMediaEvent_GetValue(mediaevent, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(value.vt == VT_EMPTY, "got %#x\n", value.vt); PropVariantClear(&value); @@ -1435,7 +1434,7 @@ static void check_attr_count(IMFAttributes* obj, UINT32 expected, int line) { UINT32 count = expected + 1; HRESULT hr = IMFAttributes_GetCount(obj, &count); - ok_(__FILE__, line)(hr == S_OK, "Failed to get attributes count, hr %#lx.\n", hr); + ok_(__FILE__, line)(hr == S_OK, "Failed to get attributes count, hr %#x.\n", hr); ok_(__FILE__, line)(count == expected, "Unexpected count %u, expected %u.\n", count, expected); } @@ -1446,7 +1445,7 @@ static void check_attr_type(IMFAttributes *obj, const GUID *key, MF_ATTRIBUTE_TY HRESULT hr; hr = IMFAttributes_GetItemType(obj, key, &type); - ok_(__FILE__, line)(hr == S_OK, "Failed to get item type, hr %#lx.\n", hr); + ok_(__FILE__, line)(hr == S_OK, "Failed to get item type, hr %#x.\n", hr); ok_(__FILE__, line)(type == expected, "Unexpected item type %d, expected %d.\n", type, expected); } @@ -1470,71 +1469,71 @@ static void test_attributes(void) GUID key; hr = MFCreateAttributes( &attributes, 3 ); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFAttributes_GetItemType(attributes, &GUID_NULL, &type); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 0); hr = IMFAttributes_SetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 123); - ok(hr == S_OK, "Failed to set UINT32 value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set UINT32 value, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 1); CHECK_ATTR_TYPE(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, MF_ATTRIBUTE_UINT32); value = 0xdeadbeef; hr = IMFAttributes_GetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &value); - ok(hr == S_OK, "Failed to get UINT32 value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get UINT32 value, hr %#x.\n", hr); ok(value == 123, "Unexpected value %u, expected: 123.\n", value); value64 = 0xdeadbeef; hr = IMFAttributes_GetUINT64(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &value64); - ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#x.\n", hr); ok(value64 == 0xdeadbeef, "Unexpected value.\n"); hr = IMFAttributes_SetUINT64(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, 65536); - ok(hr == S_OK, "Failed to set UINT64 value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set UINT64 value, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 1); CHECK_ATTR_TYPE(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, MF_ATTRIBUTE_UINT64); hr = IMFAttributes_GetUINT64(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &value64); - ok(hr == S_OK, "Failed to get UINT64 value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get UINT64 value, hr %#x.\n", hr); ok(value64 == 65536, "Unexpected value.\n"); value = 0xdeadbeef; hr = IMFAttributes_GetUINT32(attributes, &MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, &value); - ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#x.\n", hr); ok(value == 0xdeadbeef, "Unexpected value.\n"); IMFAttributes_Release(attributes); hr = MFCreateAttributes(&attributes, 0); - ok(hr == S_OK, "Failed to create attributes object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create attributes object, hr %#x.\n", hr); PropVariantInit(&propvar); propvar.vt = MF_ATTRIBUTE_UINT32; U(propvar).ulVal = 123; hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID1, &propvar); - ok(hr == S_OK, "Failed to set item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set item, hr %#x.\n", hr); PropVariantInit(&ret_propvar); ret_propvar.vt = MF_ATTRIBUTE_UINT32; U(ret_propvar).ulVal = 0xdeadbeef; hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, &ret_propvar); - ok(hr == S_OK, "Failed to get item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item, hr %#x.\n", hr); ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "Unexpected item value.\n"); PropVariantClear(&ret_propvar); CHECK_ATTR_COUNT(attributes, 1); hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, NULL); - ok(hr == S_OK, "Item check failed, hr %#lx.\n", hr); + ok(hr == S_OK, "Item check failed, hr %#x.\n", hr); hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID2, NULL); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); PropVariantInit(&ret_propvar); ret_propvar.vt = MF_ATTRIBUTE_STRING; U(ret_propvar).pwszVal = NULL; hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, &ret_propvar); - ok(hr == S_OK, "Failed to get item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item, hr %#x.\n", hr); ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "Unexpected item value.\n"); PropVariantClear(&ret_propvar); @@ -1544,12 +1543,12 @@ static void test_attributes(void) propvar.vt = MF_ATTRIBUTE_UINT64; U(propvar).uhVal.QuadPart = 65536; hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID1, &propvar); - ok(hr == S_OK, "Failed to set item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set item, hr %#x.\n", hr); PropVariantInit(&ret_propvar); ret_propvar.vt = MF_ATTRIBUTE_UINT32; U(ret_propvar).ulVal = 0xdeadbeef; hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, &ret_propvar); - ok(hr == S_OK, "Failed to get item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item, hr %#x.\n", hr); ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "Unexpected item value.\n"); PropVariantClear(&ret_propvar); PropVariantClear(&propvar); @@ -1559,12 +1558,12 @@ static void test_attributes(void) propvar.vt = VT_I4; U(propvar).lVal = 123; hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID2, &propvar); - ok(hr == MF_E_INVALIDTYPE, "Failed to set item, hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDTYPE, "Failed to set item, hr %#x.\n", hr); PropVariantInit(&ret_propvar); ret_propvar.vt = MF_ATTRIBUTE_UINT32; U(ret_propvar).lVal = 0xdeadbeef; hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID2, &ret_propvar); - ok(hr == S_OK, "Failed to get item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item, hr %#x.\n", hr); PropVariantClear(&propvar); ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "Unexpected item value.\n"); PropVariantClear(&ret_propvar); @@ -1573,18 +1572,18 @@ static void test_attributes(void) propvar.vt = MF_ATTRIBUTE_UINT32; U(propvar).ulVal = 123; hr = IMFAttributes_SetItem(attributes, &DUMMY_GUID3, &propvar); - ok(hr == S_OK, "Failed to set item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set item, hr %#x.\n", hr); hr = IMFAttributes_DeleteItem(attributes, &DUMMY_GUID2); - ok(hr == S_OK, "Failed to delete item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to delete item, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 2); hr = IMFAttributes_DeleteItem(attributes, &DUMMY_GUID2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 2); hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID3, &ret_propvar); - ok(hr == S_OK, "Failed to get item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item, hr %#x.\n", hr); ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "Unexpected item value.\n"); PropVariantClear(&ret_propvar); PropVariantClear(&propvar); @@ -1593,358 +1592,363 @@ static void test_attributes(void) U(propvar).uhVal.QuadPart = 65536; hr = IMFAttributes_GetItem(attributes, &DUMMY_GUID1, &ret_propvar); - ok(hr == S_OK, "Failed to get item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item, hr %#x.\n", hr); ok(!PropVariantCompareEx(&propvar, &ret_propvar, 0, 0), "Unexpected item value.\n"); PropVariantClear(&ret_propvar); PropVariantClear(&propvar); /* Item ordering is not consistent across Windows version. */ hr = IMFAttributes_GetItemByIndex(attributes, 0, &key, &ret_propvar); - ok(hr == S_OK, "Failed to get item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item, hr %#x.\n", hr); PropVariantClear(&ret_propvar); hr = IMFAttributes_GetItemByIndex(attributes, 100, &key, &ret_propvar); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); PropVariantClear(&ret_propvar); hr = IMFAttributes_SetDouble(attributes, &GUID_NULL, 22.0); - ok(hr == S_OK, "Failed to set double value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set double value, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 3); CHECK_ATTR_TYPE(attributes, &GUID_NULL, MF_ATTRIBUTE_DOUBLE); double_value = 0xdeadbeef; hr = IMFAttributes_GetDouble(attributes, &GUID_NULL, &double_value); - ok(hr == S_OK, "Failed to get double value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get double value, hr %#x.\n", hr); ok(double_value == 22.0, "Unexpected value: %f, expected: 22.0.\n", double_value); propvar.vt = MF_ATTRIBUTE_UINT64; U(propvar).uhVal.QuadPart = 22; hr = IMFAttributes_CompareItem(attributes, &GUID_NULL, &propvar, &result); - ok(hr == S_OK, "Failed to compare items, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare items, hr %#x.\n", hr); ok(!result, "Unexpected result.\n"); propvar.vt = MF_ATTRIBUTE_DOUBLE; U(propvar).dblVal = 22.0; hr = IMFAttributes_CompareItem(attributes, &GUID_NULL, &propvar, &result); - ok(hr == S_OK, "Failed to compare items, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare items, hr %#x.\n", hr); ok(result, "Unexpected result.\n"); hr = IMFAttributes_SetString(attributes, &DUMMY_GUID1, stringW); - ok(hr == S_OK, "Failed to set string attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set string attribute, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 3); CHECK_ATTR_TYPE(attributes, &DUMMY_GUID1, MF_ATTRIBUTE_STRING); hr = IMFAttributes_GetStringLength(attributes, &DUMMY_GUID1, &string_length); - ok(hr == S_OK, "Failed to get string length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get string length, hr %#x.\n", hr); ok(string_length == lstrlenW(stringW), "Unexpected length %u.\n", string_length); + hr = IMFAttributes_GetAllocatedString(attributes, &DUMMY_GUID1, &string, NULL); + ok(hr == S_OK, "Failed to get allocated string, hr %#lx.\n", hr); + ok(!lstrcmpW(string, stringW), "Unexpected string %s.\n", wine_dbgstr_w(string)); + CoTaskMemFree(string); + string_length = 0xdeadbeef; hr = IMFAttributes_GetAllocatedString(attributes, &DUMMY_GUID1, &string, &string_length); - ok(hr == S_OK, "Failed to get allocated string, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get allocated string, hr %#x.\n", hr); ok(!lstrcmpW(string, stringW), "Unexpected string %s.\n", wine_dbgstr_w(string)); ok(string_length == lstrlenW(stringW), "Unexpected length %u.\n", string_length); CoTaskMemFree(string); string_length = 0xdeadbeef; hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, ARRAY_SIZE(bufferW), &string_length); - ok(hr == S_OK, "Failed to get string value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get string value, hr %#x.\n", hr); ok(!lstrcmpW(bufferW, stringW), "Unexpected string %s.\n", wine_dbgstr_w(bufferW)); ok(string_length == lstrlenW(stringW), "Unexpected length %u.\n", string_length); memset(bufferW, 0, sizeof(bufferW)); hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, ARRAY_SIZE(bufferW), NULL); - ok(hr == S_OK, "Failed to get string value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get string value, hr %#x.\n", hr); ok(!lstrcmpW(bufferW, stringW), "Unexpected string %s.\n", wine_dbgstr_w(bufferW)); memset(bufferW, 0, sizeof(bufferW)); string_length = 0; hr = IMFAttributes_GetString(attributes, &DUMMY_GUID1, bufferW, 1, &string_length); - ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Unexpected hr %#lx.\n", hr); + ok(hr == STRSAFE_E_INSUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr); ok(!bufferW[0], "Unexpected string %s.\n", wine_dbgstr_w(bufferW)); ok(string_length, "Unexpected length.\n"); string_length = 0xdeadbeef; hr = IMFAttributes_GetStringLength(attributes, &GUID_NULL, &string_length); - ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#x.\n", hr); ok(string_length == 0xdeadbeef, "Unexpected length %u.\n", string_length); /* VT_UNKNOWN */ hr = IMFAttributes_SetUnknown(attributes, &DUMMY_GUID2, (IUnknown *)attributes); - ok(hr == S_OK, "Failed to set value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set value, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 4); CHECK_ATTR_TYPE(attributes, &DUMMY_GUID2, MF_ATTRIBUTE_IUNKNOWN); hr = IMFAttributes_GetUnknown(attributes, &DUMMY_GUID2, &IID_IUnknown, (void **)&unk_value); - ok(hr == S_OK, "Failed to get value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get value, hr %#x.\n", hr); IUnknown_Release(unk_value); hr = IMFAttributes_GetUnknown(attributes, &DUMMY_GUID2, &IID_IMFAttributes, (void **)&unk_value); - ok(hr == S_OK, "Failed to get value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get value, hr %#x.\n", hr); IUnknown_Release(unk_value); hr = IMFAttributes_GetUnknown(attributes, &DUMMY_GUID2, &IID_IStream, (void **)&unk_value); - ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_SetUnknown(attributes, &DUMMY_CLSID, NULL); - ok(hr == S_OK, "Failed to set value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set value, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 5); unk_value = NULL; hr = IMFAttributes_GetUnknown(attributes, &DUMMY_CLSID, &IID_IUnknown, (void **)&unk_value); - ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDTYPE, "Unexpected hr %#x.\n", hr); /* CopyAllItems() */ hr = MFCreateAttributes(&attributes1, 0); - ok(hr == S_OK, "Failed to create attributes object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create attributes object, hr %#x.\n", hr); hr = IMFAttributes_CopyAllItems(attributes, attributes1); - ok(hr == S_OK, "Failed to copy items, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy items, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 5); CHECK_ATTR_COUNT(attributes1, 5); hr = IMFAttributes_DeleteAllItems(attributes1); - ok(hr == S_OK, "Failed to delete items, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to delete items, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes1, 0); propvar.vt = MF_ATTRIBUTE_UINT64; U(propvar).uhVal.QuadPart = 22; hr = IMFAttributes_CompareItem(attributes, &GUID_NULL, &propvar, &result); - ok(hr == S_OK, "Failed to compare items, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare items, hr %#x.\n", hr); ok(!result, "Unexpected result.\n"); hr = IMFAttributes_CopyAllItems(attributes1, attributes); - ok(hr == S_OK, "Failed to copy items, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy items, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 0); /* Blob */ hr = IMFAttributes_SetBlob(attributes, &DUMMY_GUID1, blob, sizeof(blob)); - ok(hr == S_OK, "Failed to set blob attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set blob attribute, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 1); CHECK_ATTR_TYPE(attributes, &DUMMY_GUID1, MF_ATTRIBUTE_BLOB); hr = IMFAttributes_GetBlobSize(attributes, &DUMMY_GUID1, &size); - ok(hr == S_OK, "Failed to get blob size, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get blob size, hr %#x.\n", hr); ok(size == sizeof(blob), "Unexpected blob size %u.\n", size); hr = IMFAttributes_GetBlobSize(attributes, &DUMMY_GUID2, &size); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); size = 0; hr = IMFAttributes_GetBlob(attributes, &DUMMY_GUID1, blob_value, sizeof(blob_value), &size); - ok(hr == S_OK, "Failed to get blob, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get blob, hr %#x.\n", hr); ok(size == sizeof(blob), "Unexpected blob size %u.\n", size); ok(!memcmp(blob_value, blob, size), "Unexpected blob.\n"); hr = IMFAttributes_GetBlob(attributes, &DUMMY_GUID2, blob_value, sizeof(blob_value), &size); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); memset(blob_value, 0, sizeof(blob_value)); size = 0; hr = IMFAttributes_GetAllocatedBlob(attributes, &DUMMY_GUID1, &blob_buf, &size); - ok(hr == S_OK, "Failed to get allocated blob, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get allocated blob, hr %#x.\n", hr); ok(size == sizeof(blob), "Unexpected blob size %u.\n", size); ok(!memcmp(blob_buf, blob, size), "Unexpected blob.\n"); CoTaskMemFree(blob_buf); hr = IMFAttributes_GetAllocatedBlob(attributes, &DUMMY_GUID2, &blob_buf, &size); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_GetBlob(attributes, &DUMMY_GUID1, blob_value, sizeof(blob) - 1, NULL); - ok(hr == E_NOT_SUFFICIENT_BUFFER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_NOT_SUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr); IMFAttributes_Release(attributes); IMFAttributes_Release(attributes1); /* Compare() */ hr = MFCreateAttributes(&attributes, 0); - ok(hr == S_OK, "Failed to create attributes object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create attributes object, hr %#x.\n", hr); hr = MFCreateAttributes(&attributes1, 0); - ok(hr == S_OK, "Failed to create attributes object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create attributes object, hr %#x.\n", hr); hr = IMFAttributes_Compare(attributes, attributes, MF_ATTRIBUTES_MATCH_SMALLER + 1, &result); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); for (match_type = MF_ATTRIBUTES_MATCH_OUR_ITEMS; match_type <= MF_ATTRIBUTES_MATCH_SMALLER; ++match_type) { result = FALSE; hr = IMFAttributes_Compare(attributes, attributes, match_type, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, match_type, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); } hr = IMFAttributes_SetUINT32(attributes, &DUMMY_GUID1, 1); - ok(hr == S_OK, "Failed to set value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set value, hr %#x.\n", hr); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_ALL_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_INTERSECTION, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_SMALLER, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); hr = IMFAttributes_SetUINT32(attributes1, &DUMMY_GUID1, 2); - ok(hr == S_OK, "Failed to set value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set value, hr %#x.\n", hr); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_ALL_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_INTERSECTION, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_SMALLER, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_ALL_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_INTERSECTION, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_SMALLER, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); hr = IMFAttributes_SetUINT32(attributes1, &DUMMY_GUID1, 1); - ok(hr == S_OK, "Failed to set value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set value, hr %#x.\n", hr); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_ALL_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_INTERSECTION, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_SMALLER, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_ALL_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_INTERSECTION, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_SMALLER, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); hr = IMFAttributes_SetUINT32(attributes1, &DUMMY_GUID2, 2); - ok(hr == S_OK, "Failed to set value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set value, hr %#x.\n", hr); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_ALL_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_INTERSECTION, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes, attributes1, MF_ATTRIBUTES_MATCH_SMALLER, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_ALL_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = TRUE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_OUR_ITEMS, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(!result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_INTERSECTION, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); result = FALSE; hr = IMFAttributes_Compare(attributes1, attributes, MF_ATTRIBUTES_MATCH_SMALLER, &result); - ok(hr == S_OK, "Failed to compare, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to compare, hr %#x.\n", hr); ok(result, "Unexpected result %d.\n", result); IMFAttributes_Release(attributes); @@ -1957,11 +1961,10 @@ static void test_MFCreateMFByteStreamOnStream(void) IMFByteStream *bytestream2; IStream *stream; IMFAttributes *attributes = NULL; - DWORD caps, written; + DWORD caps, written, count; IUnknown *unknown; ULONG ref, size; HRESULT hr; - UINT count; if(!pMFCreateMFByteStreamOnStream) { @@ -1970,34 +1973,34 @@ static void test_MFCreateMFByteStreamOnStream(void) } hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); caps = 0xffff0000; hr = IStream_Write(stream, &caps, sizeof(caps), &written); - ok(hr == S_OK, "Failed to write, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to write, hr %#x.\n", hr); hr = pMFCreateMFByteStreamOnStream(stream, &bytestream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFByteStream_QueryInterface(bytestream, &IID_IUnknown, (void **)&unknown); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok((void *)unknown == (void *)bytestream, "got %p\n", unknown); ref = IUnknown_Release(unknown); - ok(ref == 1, "got %lu\n", ref); + ok(ref == 1, "got %u\n", ref); hr = IUnknown_QueryInterface(unknown, &IID_IMFByteStream, (void **)&bytestream2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(bytestream2 == bytestream, "got %p\n", bytestream2); ref = IMFByteStream_Release(bytestream2); - ok(ref == 1, "got %lu\n", ref); + ok(ref == 1, "got %u\n", ref); hr = IMFByteStream_QueryInterface(bytestream, &IID_IMFAttributes, (void **)&attributes); ok(hr == S_OK || /* w7pro64 */ - broken(hr == E_NOINTERFACE), "Unexpected hr %#lx.\n", hr); + broken(hr == E_NOINTERFACE), "got 0x%08x\n", hr); if (hr != S_OK) { @@ -2009,22 +2012,22 @@ static void test_MFCreateMFByteStreamOnStream(void) ok(attributes != NULL, "got NULL\n"); hr = IMFAttributes_GetCount(attributes, &count); - ok(hr == S_OK, "Failed to get attributes count, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attributes count, hr %#x.\n", hr); ok(count == 0, "Unexpected attributes count %u.\n", count); hr = IMFAttributes_QueryInterface(attributes, &IID_IUnknown, (void **)&unknown); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok((void *)unknown == (void *)bytestream, "got %p\n", unknown); ref = IUnknown_Release(unknown); - ok(ref == 2, "got %lu\n", ref); + ok(ref == 2, "got %u\n", ref); hr = IMFAttributes_QueryInterface(attributes, &IID_IMFByteStream, (void **)&bytestream2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(bytestream2 == bytestream, "got %p\n", bytestream2); ref = IMFByteStream_Release(bytestream2); - ok(ref == 2, "got %lu\n", ref); + ok(ref == 2, "got %u\n", ref); check_interface(bytestream, &IID_IMFByteStreamBuffering, FALSE); check_interface(bytestream, &IID_IMFByteStreamCacheControl, FALSE); @@ -2032,22 +2035,22 @@ static void test_MFCreateMFByteStreamOnStream(void) check_interface(bytestream, &IID_IMFGetService, FALSE); hr = IMFByteStream_GetCapabilities(bytestream, &caps); - ok(hr == S_OK, "Failed to get stream capabilities, hr %#lx.\n", hr); - ok(caps == (MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_SEEKABLE), "Unexpected caps %#lx.\n", caps); + ok(hr == S_OK, "Failed to get stream capabilities, hr %#x.\n", hr); + ok(caps == (MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_SEEKABLE), "Unexpected caps %#x.\n", caps); hr = IMFByteStream_Close(bytestream); - ok(hr == S_OK, "Failed to close, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to close, hr %#x.\n", hr); hr = IMFByteStream_Close(bytestream); - ok(hr == S_OK, "Failed to close, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to close, hr %#x.\n", hr); hr = IMFByteStream_GetCapabilities(bytestream, &caps); - ok(hr == S_OK, "Failed to get stream capabilities, hr %#lx.\n", hr); - ok(caps == (MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_SEEKABLE), "Unexpected caps %#lx.\n", caps); + ok(hr == S_OK, "Failed to get stream capabilities, hr %#x.\n", hr); + ok(caps == (MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_SEEKABLE), "Unexpected caps %#x.\n", caps); caps = 0; hr = IMFByteStream_Read(bytestream, (BYTE *)&caps, sizeof(caps), &size); - ok(hr == S_OK, "Failed to read from stream, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to read from stream, hr %#x.\n", hr); ok(caps == 0xffff0000, "Unexpected content.\n"); IMFAttributes_Release(attributes); @@ -2063,21 +2066,20 @@ static void test_file_stream(void) IMFAttributes *attributes = NULL; MF_ATTRIBUTE_TYPE item_type; WCHAR pathW[MAX_PATH]; + DWORD caps, count; WCHAR *filename; HRESULT hr; WCHAR *str; - DWORD caps; - UINT count; BOOL eos; filename = load_resource(L"test.mp4"); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); check_interface(bytestream, &IID_IMFByteStreamBuffering, FALSE); check_interface(bytestream, &IID_IMFByteStreamCacheControl, FALSE); @@ -2085,108 +2087,108 @@ static void test_file_stream(void) check_interface(bytestream, &IID_IMFGetService, TRUE); hr = IMFByteStream_GetCapabilities(bytestream, &caps); - ok(hr == S_OK, "Failed to get stream capabilities, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get stream capabilities, hr %#x.\n", hr); if (is_win8_plus) { ok(caps == (MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_SEEKABLE | MFBYTESTREAM_DOES_NOT_USE_NETWORK), - "Unexpected caps %#lx.\n", caps); + "Unexpected caps %#x.\n", caps); } else - ok(caps == (MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_SEEKABLE), "Unexpected caps %#lx.\n", caps); + ok(caps == (MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_SEEKABLE), "Unexpected caps %#x.\n", caps); hr = IMFByteStream_QueryInterface(bytestream, &IID_IMFAttributes, (void **)&attributes); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(attributes != NULL, "got NULL\n"); hr = IMFAttributes_GetCount(attributes, &count); - ok(hr == S_OK, "Failed to get attributes count, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attributes count, hr %#x.\n", hr); ok(count == 2, "Unexpected attributes count %u.\n", count); /* Original file name. */ hr = IMFAttributes_GetAllocatedString(attributes, &MF_BYTESTREAM_ORIGIN_NAME, &str, &count); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(!lstrcmpW(str, filename), "Unexpected name %s.\n", wine_dbgstr_w(str)); CoTaskMemFree(str); /* Modification time. */ hr = IMFAttributes_GetItemType(attributes, &MF_BYTESTREAM_LAST_MODIFIED_TIME, &item_type); - ok(hr == S_OK, "Failed to get item type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item type, hr %#x.\n", hr); ok(item_type == MF_ATTRIBUTE_BLOB, "Unexpected item type.\n"); IMFAttributes_Release(attributes); /* Length. */ hr = IMFByteStream_GetLength(bytestream, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); bytestream_length = 0; hr = IMFByteStream_GetLength(bytestream, &bytestream_length); - ok(hr == S_OK, "Failed to get bytestream length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get bytestream length, hr %#x.\n", hr); ok(bytestream_length > 0, "Unexpected bytestream length %s.\n", wine_dbgstr_longlong(bytestream_length)); hr = IMFByteStream_SetCurrentPosition(bytestream, bytestream_length); - ok(hr == S_OK, "Failed to set bytestream position, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set bytestream position, hr %#x.\n", hr); hr = IMFByteStream_IsEndOfStream(bytestream, &eos); - ok(hr == S_OK, "Failed query end of stream, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed query end of stream, hr %#x.\n", hr); ok(eos == TRUE, "Unexpected IsEndOfStream result, %u.\n", eos); hr = IMFByteStream_SetCurrentPosition(bytestream, 2 * bytestream_length); - ok(hr == S_OK, "Failed to set bytestream position, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set bytestream position, hr %#x.\n", hr); hr = IMFByteStream_GetCurrentPosition(bytestream, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFByteStream_GetCurrentPosition(bytestream, &position); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(position == 2 * bytestream_length, "Unexpected position.\n"); hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); IMFByteStream_Release(bytestream2); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream2); - ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr); hr = MFCreateFile(MF_ACCESSMODE_READWRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream2); - ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr); IMFByteStream_Release(bytestream); hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "got 0x%08x\n", hr); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2); - ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2); - ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream2); - ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr); IMFByteStream_Release(bytestream); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); /* Opening the file again fails even though MF_FILEFLAGS_ALLOW_WRITE_SHARING is set. */ hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream2); - ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#x.\n", hr); IMFByteStream_Release(bytestream); @@ -2194,15 +2196,15 @@ static void test_file_stream(void) lstrcpyW(pathW, fileschemeW); lstrcatW(pathW, filename); hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, pathW, &bytestream); - ok(FAILED(hr), "Unexpected hr %#lx.\n", hr); + ok(FAILED(hr), "Unexpected hr %#x.\n", hr); hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, filename, &bytestream); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); ok(DeleteFileW(filename), "failed to delete file\n"); IMFByteStream_Release(bytestream); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); DeleteFileW(newfilename); } @@ -2215,151 +2217,115 @@ static void test_system_memory_buffer(void) BYTE *data, *data2; hr = MFCreateMemoryBuffer(1024, NULL); - ok(hr == E_INVALIDARG || hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG || hr == E_POINTER, "got 0x%08x\n", hr); hr = MFCreateMemoryBuffer(0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); if(buffer) { hr = IMFMediaBuffer_GetMaxLength(buffer, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length == 0, "got %lu\n", length); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(length == 0, "got %u\n", length); IMFMediaBuffer_Release(buffer); } hr = MFCreateMemoryBuffer(1024, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); check_interface(buffer, &IID_IMFGetService, FALSE); hr = IMFMediaBuffer_GetMaxLength(buffer, NULL); - ok(hr == E_INVALIDARG || hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG || hr == E_POINTER, "got 0x%08x\n", hr); hr = IMFMediaBuffer_GetMaxLength(buffer, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length == 1024, "got %lu\n", length); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(length == 1024, "got %u\n", length); hr = IMFMediaBuffer_SetCurrentLength(buffer, 1025); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); hr = IMFMediaBuffer_SetCurrentLength(buffer, 10); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer, NULL); - ok(hr == E_INVALIDARG || hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG || hr == E_POINTER, "got 0x%08x\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length == 10, "got %lu\n", length); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(length == 10, "got %u\n", length); length = 0; max = 0; hr = IMFMediaBuffer_Lock(buffer, NULL, &length, &max); - ok(hr == E_INVALIDARG || hr == E_POINTER, "Unexpected hr %#lx.\n", hr); - ok(length == 0, "got %lu\n", length); - ok(max == 0, "got %lu\n", length); + ok(hr == E_INVALIDARG || hr == E_POINTER, "got 0x%08x\n", hr); + ok(length == 0, "got %u\n", length); + ok(max == 0, "got %u\n", length); hr = IMFMediaBuffer_Lock(buffer, &data, &max, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length == 10, "got %lu\n", length); - ok(max == 1024, "got %lu\n", max); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(length == 10, "got %u\n", length); + ok(max == 1024, "got %u\n", max); /* Attempt to lock the buffer twice */ hr = IMFMediaBuffer_Lock(buffer, &data2, &max, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(data == data2, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(data == data2, "got 0x%08x\n", hr); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); /* Extra Unlock */ hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); IMFMediaBuffer_Release(buffer); -} - -static void test_system_memory_aligned_buffer(void) -{ - static const DWORD alignments[] = - { - MF_16_BYTE_ALIGNMENT, - MF_32_BYTE_ALIGNMENT, - MF_64_BYTE_ALIGNMENT, - MF_128_BYTE_ALIGNMENT, - MF_256_BYTE_ALIGNMENT, - MF_512_BYTE_ALIGNMENT, - }; - IMFMediaBuffer *buffer; - DWORD length, max; - unsigned int i; - BYTE *data; - HRESULT hr; + /* Aligned buffer. */ hr = MFCreateAlignedMemoryBuffer(16, MF_8_BYTE_ALIGNMENT, NULL); - ok(FAILED(hr), "Unexpected hr %#lx.\n", hr); + ok(FAILED(hr), "Unexpected hr %#x.\n", hr); hr = MFCreateAlignedMemoryBuffer(201, MF_8_BYTE_ALIGNMENT, &buffer); - ok(hr == S_OK, "Failed to create memory buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create memory buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); - ok(hr == S_OK, "Failed to get current length, hr %#lx.\n", hr); - ok(length == 0, "Unexpected current length %lu.\n", length); + ok(hr == S_OK, "Failed to get current length, hr %#x.\n", hr); + ok(length == 0, "Unexpected current length %u.\n", length); hr = IMFMediaBuffer_SetCurrentLength(buffer, 1); - ok(hr == S_OK, "Failed to set current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current length, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); - ok(hr == S_OK, "Failed to get current length, hr %#lx.\n", hr); - ok(length == 1, "Unexpected current length %lu.\n", length); + ok(hr == S_OK, "Failed to get current length, hr %#x.\n", hr); + ok(length == 1, "Unexpected current length %u.\n", length); hr = IMFMediaBuffer_GetMaxLength(buffer, &length); - ok(hr == S_OK, "Failed to get max length, hr %#lx.\n", hr); - ok(length == 201, "Unexpected max length %lu.\n", length); + ok(hr == S_OK, "Failed to get max length, hr %#x.\n", hr); + ok(length == 201, "Unexpected max length %u.\n", length); hr = IMFMediaBuffer_SetCurrentLength(buffer, 202); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_GetMaxLength(buffer, &length); - ok(hr == S_OK, "Failed to get max length, hr %#lx.\n", hr); - ok(length == 201, "Unexpected max length %lu.\n", length); + ok(hr == S_OK, "Failed to get max length, hr %#x.\n", hr); + ok(length == 201, "Unexpected max length %u.\n", length); hr = IMFMediaBuffer_SetCurrentLength(buffer, 10); - ok(hr == S_OK, "Failed to set current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current length, hr %#x.\n", hr); hr = IMFMediaBuffer_Lock(buffer, &data, &max, &length); - ok(hr == S_OK, "Failed to lock, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock, hr %#x.\n", hr); ok(max == 201 && length == 10, "Unexpected length.\n"); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock, hr %#x.\n", hr); IMFMediaBuffer_Release(buffer); - - for (i = 0; i < ARRAY_SIZE(alignments); ++i) - { - hr = MFCreateAlignedMemoryBuffer(200, alignments[i], &buffer); - ok(hr == S_OK, "Failed to create memory buffer, hr %#lx.\n", hr); - - hr = IMFMediaBuffer_Lock(buffer, &data, &max, &length); - ok(hr == S_OK, "Failed to lock, hr %#lx.\n", hr); - ok(max == 200 && !length, "Unexpected length.\n"); - ok(!((uintptr_t)data & alignments[i]), "Data at %p is misaligned.\n", data); - hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock, hr %#lx.\n", hr); - - IMFMediaBuffer_Release(buffer); - } - - hr = MFCreateAlignedMemoryBuffer(200, 0, &buffer); - ok(hr == S_OK, "Failed to create memory buffer, hr %#lx.\n", hr); - IMFMediaBuffer_Release(buffer); } static void test_sample(void) @@ -2374,101 +2340,101 @@ static void test_sample(void) BYTE *data; hr = MFCreateSample( &sample ); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMFSample_QueryInterface(sample, &IID_IMFAttributes, (void **)&attributes); - ok(hr == S_OK, "Failed to get attributes interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attributes interface, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 0); hr = IMFSample_GetBufferCount(sample, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetBufferCount(sample, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(count == 0, "got %ld\n", count); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(count == 0, "got %d\n", count); hr = IMFSample_GetSampleFlags(sample, &flags); - ok(hr == S_OK, "Failed to get sample flags, hr %#lx.\n", hr); - ok(!flags, "Unexpected flags %#lx.\n", flags); + ok(hr == S_OK, "Failed to get sample flags, hr %#x.\n", hr); + ok(!flags, "Unexpected flags %#x.\n", flags); hr = IMFSample_SetSampleFlags(sample, 0x123); - ok(hr == S_OK, "Failed to set sample flags, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set sample flags, hr %#x.\n", hr); hr = IMFSample_GetSampleFlags(sample, &flags); - ok(hr == S_OK, "Failed to get sample flags, hr %#lx.\n", hr); - ok(flags == 0x123, "Unexpected flags %#lx.\n", flags); + ok(hr == S_OK, "Failed to get sample flags, hr %#x.\n", hr); + ok(flags == 0x123, "Unexpected flags %#x.\n", flags); hr = IMFSample_GetSampleTime(sample, &time); - ok(hr == MF_E_NO_SAMPLE_TIMESTAMP, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NO_SAMPLE_TIMESTAMP, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetSampleDuration(sample, &time); - ok(hr == MF_E_NO_SAMPLE_DURATION, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NO_SAMPLE_DURATION, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFSample_RemoveBufferByIndex(sample, 0); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFSample_RemoveAllBuffers(sample); - ok(hr == S_OK, "Failed to remove all, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to remove all, hr %#x.\n", hr); hr = IMFSample_GetTotalLength(sample, &length); - ok(hr == S_OK, "Failed to get total length, hr %#lx.\n", hr); - ok(!length, "Unexpected total length %lu.\n", length); + ok(hr == S_OK, "Failed to get total length, hr %#x.\n", hr); + ok(!length, "Unexpected total length %u.\n", length); hr = MFCreateMemoryBuffer(16, &buffer); - ok(hr == S_OK, "Failed to create buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create buffer, hr %#x.\n", hr); hr = IMFSample_AddBuffer(sample, buffer); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); hr = IMFSample_AddBuffer(sample, buffer); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); hr = IMFSample_GetBufferCount(sample, &count); - ok(hr == S_OK, "Failed to get buffer count, hr %#lx.\n", hr); - ok(count == 2, "Unexpected buffer count %lu.\n", count); + ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr); + ok(count == 2, "Unexpected buffer count %u.\n", count); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer2); - ok(hr == S_OK, "Failed to get buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get buffer, hr %#x.\n", hr); ok(buffer2 == buffer, "Unexpected object.\n"); IMFMediaBuffer_Release(buffer2); hr = IMFSample_GetTotalLength(sample, &length); - ok(hr == S_OK, "Failed to get total length, hr %#lx.\n", hr); - ok(!length, "Unexpected total length %lu.\n", length); + ok(hr == S_OK, "Failed to get total length, hr %#x.\n", hr); + ok(!length, "Unexpected total length %u.\n", length); hr = IMFMediaBuffer_SetCurrentLength(buffer, 2); - ok(hr == S_OK, "Failed to set current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current length, hr %#x.\n", hr); hr = IMFSample_GetTotalLength(sample, &length); - ok(hr == S_OK, "Failed to get total length, hr %#lx.\n", hr); - ok(length == 4, "Unexpected total length %lu.\n", length); + ok(hr == S_OK, "Failed to get total length, hr %#x.\n", hr); + ok(length == 4, "Unexpected total length %u.\n", length); hr = IMFSample_RemoveBufferByIndex(sample, 1); - ok(hr == S_OK, "Failed to remove buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to remove buffer, hr %#x.\n", hr); hr = IMFSample_GetTotalLength(sample, &length); - ok(hr == S_OK, "Failed to get total length, hr %#lx.\n", hr); - ok(length == 2, "Unexpected total length %lu.\n", length); + ok(hr == S_OK, "Failed to get total length, hr %#x.\n", hr); + ok(length == 2, "Unexpected total length %u.\n", length); IMFMediaBuffer_Release(buffer); /* Duration */ hr = IMFSample_SetSampleDuration(sample, 10); - ok(hr == S_OK, "Failed to set duration, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set duration, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 0); hr = IMFSample_GetSampleDuration(sample, &time); - ok(hr == S_OK, "Failed to get sample duration, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get sample duration, hr %#x.\n", hr); ok(time == 10, "Unexpected duration.\n"); /* Timestamp */ hr = IMFSample_SetSampleTime(sample, 1); - ok(hr == S_OK, "Failed to set timestamp, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set timestamp, hr %#x.\n", hr); CHECK_ATTR_COUNT(attributes, 0); hr = IMFSample_GetSampleTime(sample, &time); - ok(hr == S_OK, "Failed to get sample time, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get sample time, hr %#x.\n", hr); ok(time == 1, "Unexpected timestamp.\n"); IMFAttributes_Release(attributes); @@ -2476,165 +2442,165 @@ static void test_sample(void) /* CopyToBuffer() */ hr = MFCreateSample(&sample); - ok(hr == S_OK, "Failed to create a sample, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a sample, hr %#x.\n", hr); hr = MFCreateMemoryBuffer(16, &buffer2); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); /* Sample with no buffers. */ hr = IMFMediaBuffer_SetCurrentLength(buffer2, 1); - ok(hr == S_OK, "Failed to set current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current length, hr %#x.\n", hr); hr = IMFSample_CopyToBuffer(sample, buffer2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer2, &length); - ok(hr == S_OK, "Failed to get current length, hr %#lx.\n", hr); - ok(!length, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Failed to get current length, hr %#x.\n", hr); + ok(!length, "Unexpected length %u.\n", length); /* Single buffer, larger destination. */ hr = MFCreateMemoryBuffer(8, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); *(DWORD *)data = 0x11111111; hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock, hr %#x.\n", hr); hr = IMFMediaBuffer_SetCurrentLength(buffer, 4); - ok(hr == S_OK, "Failed to set current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current length, hr %#x.\n", hr); hr = IMFSample_AddBuffer(sample, buffer); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); /* Existing content is overwritten. */ hr = IMFMediaBuffer_SetCurrentLength(buffer2, 8); - ok(hr == S_OK, "Failed to set length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set length, hr %#x.\n", hr); hr = IMFSample_CopyToBuffer(sample, buffer2); - ok(hr == S_OK, "Failed to copy to buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy to buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer2, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(length == 4, "Unexpected buffer length %lu.\n", length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(length == 4, "Unexpected buffer length %u.\n", length); /* Multiple buffers, matching total size. */ hr = IMFSample_AddBuffer(sample, buffer); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); hr = IMFSample_GetBufferCount(sample, &count); - ok(hr == S_OK, "Failed to get buffer count, hr %#lx.\n", hr); - ok(count == 2, "Unexpected buffer count %lu.\n", count); + ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr); + ok(count == 2, "Unexpected buffer count %u.\n", count); hr = IMFMediaBuffer_SetCurrentLength(buffer, 8); - ok(hr == S_OK, "Failed to set current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current length, hr %#x.\n", hr); hr = IMFSample_CopyToBuffer(sample, buffer2); - ok(hr == S_OK, "Failed to copy to buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy to buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer2, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(length == 16, "Unexpected buffer length %lu.\n", length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(length == 16, "Unexpected buffer length %u.\n", length); hr = IMFSample_AddBuffer(sample, buffer); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_SetCurrentLength(buffer2, 1); - ok(hr == S_OK, "Failed to set buffer length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set buffer length, hr %#x.\n", hr); hr = IMFMediaBuffer_Lock(buffer2, &data, NULL, NULL); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); *(DWORD *)data = test_pattern; hr = IMFMediaBuffer_Unlock(buffer2); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMFSample_CopyToBuffer(sample, buffer2); - ok(hr == MF_E_BUFFERTOOSMALL, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_BUFFERTOOSMALL, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_Lock(buffer2, &data, NULL, NULL); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); - ok(!memcmp(data, &test_pattern, sizeof(test_pattern)), "Unexpected contents, %#lx\n", *(DWORD *)data); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); + ok(!memcmp(data, &test_pattern, sizeof(test_pattern)), "Unexpected contents, %#x\n", *(DWORD *)data); hr = IMFMediaBuffer_Unlock(buffer2); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer2, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(!length, "Unexpected buffer length %lu.\n", length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(!length, "Unexpected buffer length %u.\n", length); IMFMediaBuffer_Release(buffer2); IMFSample_Release(sample); /* ConvertToContiguousBuffer() */ hr = MFCreateSample(&sample); - ok(hr == S_OK, "Failed to create a sample, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a sample, hr %#x.\n", hr); hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer); - ok(hr == E_UNEXPECTED, "Unexpected hr %#lx.\n", hr); + ok(hr == E_UNEXPECTED, "Unexpected hr %#x.\n", hr); hr = MFCreateMemoryBuffer(16, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); hr = IMFSample_AddBuffer(sample, buffer); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer2); - ok(hr == S_OK, "Failed to convert, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr); ok(buffer2 == buffer, "Unexpected buffer instance.\n"); IMFMediaBuffer_Release(buffer2); hr = IMFSample_ConvertToContiguousBuffer(sample, NULL); - ok(hr == S_OK, "Failed to convert, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr); hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer2); - ok(hr == S_OK, "Failed to convert, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr); ok(buffer2 == buffer, "Unexpected buffer instance.\n"); IMFMediaBuffer_Release(buffer2); hr = IMFMediaBuffer_SetCurrentLength(buffer, 3); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFCreateMemoryBuffer(16, &buffer2); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_SetCurrentLength(buffer2, 4); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFSample_AddBuffer(sample, buffer2); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); IMFMediaBuffer_Release(buffer2); hr = IMFSample_GetBufferCount(sample, &count); - ok(hr == S_OK, "Failed to get buffer count, hr %#lx.\n", hr); - ok(count == 2, "Unexpected buffer count %lu.\n", count); + ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr); + ok(count == 2, "Unexpected buffer count %u.\n", count); hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer3); - ok(hr == S_OK, "Failed to convert, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr); hr = IMFMediaBuffer_GetMaxLength(buffer3, &length); - ok(hr == S_OK, "Failed to get maximum length, hr %#lx.\n", hr); - ok(length == 7, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Failed to get maximum length, hr %#x.\n", hr); + ok(length == 7, "Unexpected length %u.\n", length); hr = IMFMediaBuffer_GetCurrentLength(buffer3, &length); - ok(hr == S_OK, "Failed to get maximum length, hr %#lx.\n", hr); - ok(length == 7, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Failed to get maximum length, hr %#x.\n", hr); + ok(length == 7, "Unexpected length %u.\n", length); IMFMediaBuffer_Release(buffer3); hr = IMFSample_GetBufferCount(sample, &count); - ok(hr == S_OK, "Failed to get buffer count, hr %#lx.\n", hr); - ok(count == 1, "Unexpected buffer count %lu.\n", count); + ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr); + ok(count == 1, "Unexpected buffer count %u.\n", count); hr = IMFSample_AddBuffer(sample, buffer); - ok(hr == S_OK, "Failed to add buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr); hr = IMFSample_GetBufferCount(sample, &count); - ok(hr == S_OK, "Failed to get buffer count, hr %#lx.\n", hr); - ok(count == 2, "Unexpected buffer count %lu.\n", count); + ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr); + ok(count == 2, "Unexpected buffer count %u.\n", count); hr = IMFSample_ConvertToContiguousBuffer(sample, NULL); - ok(hr == S_OK, "Failed to convert, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr); hr = IMFSample_GetBufferCount(sample, &count); - ok(hr == S_OK, "Failed to get buffer count, hr %#lx.\n", hr); - ok(count == 1, "Unexpected buffer count %lu.\n", count); + ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr); + ok(count == 1, "Unexpected buffer count %u.\n", count); IMFMediaBuffer_Release(buffer); @@ -2658,23 +2624,23 @@ static HRESULT WINAPI testcallback_Invoke(IMFAsyncCallback *iface, IMFAsyncResul if (is_win8_plus) { hr = IMFMediaEventQueue_GetEvent(queue, MF_EVENT_FLAG_NO_WAIT, &event); - ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Failed to get event, hr %#lx.\n", hr); + ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Failed to get event, hr %#x.\n", hr); hr = IMFMediaEventQueue_GetEvent(queue, 0, &event); - ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Failed to get event, hr %#lx.\n", hr); + ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Failed to get event, hr %#x.\n", hr); hr = IMFMediaEventQueue_EndGetEvent(queue, result, &event); - ok(hr == S_OK, "Failed to finalize GetEvent, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to finalize GetEvent, hr %#x.\n", hr); hr = IMFMediaEventQueue_EndGetEvent(queue, result, &event2); - ok(hr == E_FAIL, "Unexpected result, hr %#lx.\n", hr); + ok(hr == E_FAIL, "Unexpected result, hr %#x.\n", hr); if (event) IMFMediaEvent_Release(event); } hr = IMFAsyncResult_GetObject(result, &obj); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); IMFMediaEventQueue_Release(queue); @@ -2708,42 +2674,42 @@ static void test_MFCreateAsyncResult(void) callback = create_test_callback(NULL); hr = MFCreateAsyncResult(NULL, NULL, NULL, NULL); - ok(FAILED(hr), "Unexpected hr %#lx.\n", hr); + ok(FAILED(hr), "Unexpected hr %#x.\n", hr); hr = MFCreateAsyncResult(NULL, NULL, NULL, &result); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); data = (MFASYNCRESULT *)result; ok(data->pCallback == NULL, "Unexpected callback value.\n"); - ok(data->hrStatusResult == S_OK, "Unexpected status %#lx.\n", data->hrStatusResult); - ok(data->dwBytesTransferred == 0, "Unexpected byte length %lu.\n", data->dwBytesTransferred); + ok(data->hrStatusResult == S_OK, "Unexpected status %#x.\n", data->hrStatusResult); + ok(data->dwBytesTransferred == 0, "Unexpected byte length %u.\n", data->dwBytesTransferred); ok(data->hEvent == NULL, "Unexpected event.\n"); hr = IMFAsyncResult_GetState(result, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); state = (void *)0xdeadbeef; hr = IMFAsyncResult_GetState(result, &state); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); ok(state == (void *)0xdeadbeef, "Unexpected state.\n"); hr = IMFAsyncResult_GetStatus(result); - ok(hr == S_OK, "Unexpected status %#lx.\n", hr); + ok(hr == S_OK, "Unexpected status %#x.\n", hr); data->hrStatusResult = 123; hr = IMFAsyncResult_GetStatus(result); - ok(hr == 123, "Unexpected status %#lx.\n", hr); + ok(hr == 123, "Unexpected status %#x.\n", hr); hr = IMFAsyncResult_SetStatus(result, E_FAIL); - ok(hr == S_OK, "Failed to set status, hr %#lx.\n", hr); - ok(data->hrStatusResult == E_FAIL, "Unexpected status %#lx.\n", hr); + ok(hr == S_OK, "Failed to set status, hr %#x.\n", hr); + ok(data->hrStatusResult == E_FAIL, "Unexpected status %#x.\n", hr); hr = IMFAsyncResult_GetObject(result, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); object = (void *)0xdeadbeef; hr = IMFAsyncResult_GetObject(result, &object); - ok(hr == E_POINTER, "Failed to get object, hr %#lx.\n", hr); + ok(hr == E_POINTER, "Failed to get object, hr %#x.\n", hr); ok(object == (void *)0xdeadbeef, "Unexpected object.\n"); state = IMFAsyncResult_GetStateNoAddRef(result); @@ -2751,17 +2717,17 @@ static void test_MFCreateAsyncResult(void) /* Object. */ hr = MFCreateAsyncResult((IUnknown *)result, &callback->IMFAsyncCallback_iface, NULL, &result2); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); data = (MFASYNCRESULT *)result2; ok(data->pCallback == &callback->IMFAsyncCallback_iface, "Unexpected callback value.\n"); - ok(data->hrStatusResult == S_OK, "Unexpected status %#lx.\n", data->hrStatusResult); - ok(data->dwBytesTransferred == 0, "Unexpected byte length %lu.\n", data->dwBytesTransferred); + ok(data->hrStatusResult == S_OK, "Unexpected status %#x.\n", data->hrStatusResult); + ok(data->dwBytesTransferred == 0, "Unexpected byte length %u.\n", data->dwBytesTransferred); ok(data->hEvent == NULL, "Unexpected event.\n"); object = NULL; hr = IMFAsyncResult_GetObject(result2, &object); - ok(hr == S_OK, "Failed to get object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get object, hr %#x.\n", hr); ok(object == (IUnknown *)result, "Unexpected object.\n"); IUnknown_Release(object); @@ -2769,17 +2735,17 @@ static void test_MFCreateAsyncResult(void) /* State object. */ hr = MFCreateAsyncResult(NULL, &callback->IMFAsyncCallback_iface, (IUnknown *)result, &result2); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); data = (MFASYNCRESULT *)result2; ok(data->pCallback == &callback->IMFAsyncCallback_iface, "Unexpected callback value.\n"); - ok(data->hrStatusResult == S_OK, "Unexpected status %#lx.\n", data->hrStatusResult); - ok(data->dwBytesTransferred == 0, "Unexpected byte length %lu.\n", data->dwBytesTransferred); + ok(data->hrStatusResult == S_OK, "Unexpected status %#x.\n", data->hrStatusResult); + ok(data->dwBytesTransferred == 0, "Unexpected byte length %u.\n", data->dwBytesTransferred); ok(data->hEvent == NULL, "Unexpected event.\n"); state = NULL; hr = IMFAsyncResult_GetState(result2, &state); - ok(hr == S_OK, "Failed to get state object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get state object, hr %#x.\n", hr); ok(state == (IUnknown *)result, "Unexpected state.\n"); IUnknown_Release(state); @@ -2787,13 +2753,13 @@ static void test_MFCreateAsyncResult(void) ok(state == (IUnknown *)result, "Unexpected state.\n"); refcount = IMFAsyncResult_Release(result2); - ok(!refcount, "Unexpected refcount %lu.\n", refcount); + ok(!refcount, "Unexpected refcount %u.\n", refcount); refcount = IMFAsyncResult_Release(result); - ok(!refcount, "Unexpected refcount %lu.\n", refcount); + ok(!refcount, "Unexpected refcount %u.\n", refcount); /* Event handle is closed on release. */ hr = MFCreateAsyncResult(NULL, NULL, NULL, &result); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); data = (MFASYNCRESULT *)result; data->hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL); @@ -2802,12 +2768,12 @@ static void test_MFCreateAsyncResult(void) ok(ret, "Failed to get handle info.\n"); refcount = IMFAsyncResult_Release(result); - ok(!refcount, "Unexpected refcount %lu.\n", refcount); + ok(!refcount, "Unexpected refcount %u.\n", refcount); ret = GetHandleInformation(event, &flags); ok(!ret, "Expected handle to be closed.\n"); hr = MFCreateAsyncResult(NULL, &callback->IMFAsyncCallback_iface, NULL, &result); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); data = (MFASYNCRESULT *)result; data->hEvent = event = CreateEventA(NULL, FALSE, FALSE, NULL); @@ -2816,7 +2782,7 @@ static void test_MFCreateAsyncResult(void) ok(ret, "Failed to get handle info.\n"); refcount = IMFAsyncResult_Release(result); - ok(!refcount, "Unexpected refcount %lu.\n", refcount); + ok(!refcount, "Unexpected refcount %u.\n", refcount); ret = GetHandleInformation(event, &flags); ok(!ret, "Expected handle to be closed.\n"); @@ -2829,63 +2795,63 @@ static void test_startup(void) HRESULT hr; hr = MFStartup(MAKELONG(MF_API_VERSION, 0xdead), MFSTARTUP_FULL); - ok(hr == MF_E_BAD_STARTUP_VERSION, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_BAD_STARTUP_VERSION, "Unexpected hr %#x.\n", hr); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); hr = MFAllocateWorkQueue(&queue); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); hr = MFAllocateWorkQueue(&queue); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); /* Already shut down, has no effect. */ hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); hr = MFAllocateWorkQueue(&queue); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); /* Platform lock. */ hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); hr = MFAllocateWorkQueue(&queue); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); /* Unlocking implies shutdown. */ hr = MFUnlockPlatform(); - ok(hr == S_OK, "Failed to unlock, %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock, %#x.\n", hr); hr = MFAllocateWorkQueue(&queue); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = MFLockPlatform(); - ok(hr == S_OK, "Failed to lock, %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock, %#x.\n", hr); hr = MFAllocateWorkQueue(&queue); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); } static void test_allocate_queue(void) @@ -2894,37 +2860,37 @@ static void test_allocate_queue(void) HRESULT hr; hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); hr = MFAllocateWorkQueue(&queue); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); ok(queue & MFASYNC_CALLBACK_QUEUE_PRIVATE_MASK, "Unexpected queue id.\n"); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); hr = MFUnlockWorkQueue(queue); - ok(FAILED(hr), "Unexpected hr %#lx.\n", hr); + ok(FAILED(hr), "Unexpected hr %#x.\n", hr); hr = MFAllocateWorkQueue(&queue2); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); ok(queue2 & MFASYNC_CALLBACK_QUEUE_PRIVATE_MASK, "Unexpected queue id.\n"); hr = MFUnlockWorkQueue(queue2); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); /* Unlock in system queue range. */ hr = MFUnlockWorkQueue(MFASYNC_CALLBACK_QUEUE_STANDARD); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFUnlockWorkQueue(MFASYNC_CALLBACK_QUEUE_UNDEFINED); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFUnlockWorkQueue(0x20); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); } static void test_MFCopyImage(void) @@ -2942,21 +2908,21 @@ static void test_MFCopyImage(void) memset(src, 0x11, sizeof(src)); hr = pMFCopyImage(dest, 8, src, 8, 4, 1); - ok(hr == S_OK, "Failed to copy image %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy image %#x.\n", hr); ok(!memcmp(dest, src, 4) && dest[4] == 0xaa, "Unexpected buffer contents.\n"); memset(dest, 0xaa, sizeof(dest)); memset(src, 0x11, sizeof(src)); hr = pMFCopyImage(dest, 8, src, 8, 16, 1); - ok(hr == S_OK, "Failed to copy image %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy image %#x.\n", hr); ok(!memcmp(dest, src, 16), "Unexpected buffer contents.\n"); memset(dest, 0xaa, sizeof(dest)); memset(src, 0x11, sizeof(src)); hr = pMFCopyImage(dest, 8, src, 8, 8, 2); - ok(hr == S_OK, "Failed to copy image %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy image %#x.\n", hr); ok(!memcmp(dest, src, 16), "Unexpected buffer contents.\n"); } @@ -2968,96 +2934,96 @@ static void test_MFCreateCollection(void) HRESULT hr; hr = MFCreateCollection(NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = MFCreateCollection(&collection); - ok(hr == S_OK, "Failed to create collection, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create collection, hr %#x.\n", hr); hr = IMFCollection_GetElementCount(collection, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); count = 1; hr = IMFCollection_GetElementCount(collection, &count); - ok(hr == S_OK, "Failed to get element count, hr %#lx.\n", hr); - ok(count == 0, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get element count, hr %#x.\n", hr); + ok(count == 0, "Unexpected count %u.\n", count); hr = IMFCollection_GetElement(collection, 0, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); element = (void *)0xdeadbeef; hr = IMFCollection_GetElement(collection, 0, &element); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); ok(element == (void *)0xdeadbeef, "Unexpected pointer.\n"); hr = IMFCollection_RemoveElement(collection, 0, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); element = (void *)0xdeadbeef; hr = IMFCollection_RemoveElement(collection, 0, &element); - ok(hr == E_INVALIDARG, "Failed to remove element, hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Failed to remove element, hr %#x.\n", hr); ok(element == (void *)0xdeadbeef, "Unexpected pointer.\n"); hr = IMFCollection_RemoveAllElements(collection); - ok(hr == S_OK, "Failed to clear, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to clear, hr %#x.\n", hr); hr = IMFCollection_AddElement(collection, (IUnknown *)collection); - ok(hr == S_OK, "Failed to add element, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add element, hr %#x.\n", hr); count = 0; hr = IMFCollection_GetElementCount(collection, &count); - ok(hr == S_OK, "Failed to get element count, hr %#lx.\n", hr); - ok(count == 1, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get element count, hr %#x.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); hr = IMFCollection_AddElement(collection, NULL); - ok(hr == S_OK, "Failed to add element, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add element, hr %#x.\n", hr); count = 0; hr = IMFCollection_GetElementCount(collection, &count); - ok(hr == S_OK, "Failed to get element count, hr %#lx.\n", hr); - ok(count == 2, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get element count, hr %#x.\n", hr); + ok(count == 2, "Unexpected count %u.\n", count); hr = IMFCollection_InsertElementAt(collection, 10, (IUnknown *)collection); - ok(hr == S_OK, "Failed to insert element, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to insert element, hr %#x.\n", hr); count = 0; hr = IMFCollection_GetElementCount(collection, &count); - ok(hr == S_OK, "Failed to get element count, hr %#lx.\n", hr); - ok(count == 11, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get element count, hr %#x.\n", hr); + ok(count == 11, "Unexpected count %u.\n", count); hr = IMFCollection_GetElement(collection, 0, &element); - ok(hr == S_OK, "Failed to get element, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get element, hr %#x.\n", hr); ok(element == (IUnknown *)collection, "Unexpected element.\n"); IUnknown_Release(element); hr = IMFCollection_GetElement(collection, 1, &element); - ok(hr == E_UNEXPECTED, "Unexpected hr %#lx.\n", hr); + ok(hr == E_UNEXPECTED, "Unexpected hr %#x.\n", hr); ok(!element, "Unexpected element.\n"); hr = IMFCollection_GetElement(collection, 2, &element); - ok(hr == E_UNEXPECTED, "Unexpected hr %#lx.\n", hr); + ok(hr == E_UNEXPECTED, "Unexpected hr %#x.\n", hr); ok(!element, "Unexpected element.\n"); hr = IMFCollection_GetElement(collection, 10, &element); - ok(hr == S_OK, "Failed to get element, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get element, hr %#x.\n", hr); ok(element == (IUnknown *)collection, "Unexpected element.\n"); IUnknown_Release(element); hr = IMFCollection_InsertElementAt(collection, 0, NULL); - ok(hr == S_OK, "Failed to insert element, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to insert element, hr %#x.\n", hr); hr = IMFCollection_GetElement(collection, 0, &element); - ok(hr == E_UNEXPECTED, "Unexpected hr %#lx.\n", hr); + ok(hr == E_UNEXPECTED, "Unexpected hr %#x.\n", hr); hr = IMFCollection_RemoveAllElements(collection); - ok(hr == S_OK, "Failed to clear, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to clear, hr %#x.\n", hr); count = 1; hr = IMFCollection_GetElementCount(collection, &count); - ok(hr == S_OK, "Failed to get element count, hr %#lx.\n", hr); - ok(count == 0, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get element count, hr %#x.\n", hr); + ok(count == 0, "Unexpected count %u.\n", count); hr = IMFCollection_InsertElementAt(collection, 0, NULL); - ok(hr == S_OK, "Failed to insert element, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to insert element, hr %#x.\n", hr); IMFCollection_Release(collection); } @@ -3082,16 +3048,16 @@ static void test_scheduled_items(void) callback = create_test_callback(NULL); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); hr = MFScheduleWorkItem(&callback->IMFAsyncCallback_iface, NULL, -5000, &key); - ok(hr == S_OK, "Failed to schedule item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to schedule item, hr %#x.\n", hr); hr = MFCancelWorkItem(key); - ok(hr == S_OK, "Failed to cancel item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to cancel item, hr %#x.\n", hr); hr = MFCancelWorkItem(key); - ok(hr == MF_E_NOT_FOUND || broken(hr == S_OK) /* < win10 */, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NOT_FOUND || broken(hr == S_OK) /* < win10 */, "Unexpected hr %#x.\n", hr); if (!pMFPutWaitingWorkItem) { @@ -3100,30 +3066,30 @@ static void test_scheduled_items(void) } hr = MFCreateAsyncResult(NULL, &callback->IMFAsyncCallback_iface, NULL, &result); - ok(hr == S_OK, "Failed to create result, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create result, hr %#x.\n", hr); hr = pMFPutWaitingWorkItem(NULL, 0, result, &key); - ok(hr == S_OK, "Failed to add waiting item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add waiting item, hr %#x.\n", hr); hr = pMFPutWaitingWorkItem(NULL, 0, result, &key2); - ok(hr == S_OK, "Failed to add waiting item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to add waiting item, hr %#x.\n", hr); hr = MFCancelWorkItem(key); - ok(hr == S_OK, "Failed to cancel item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to cancel item, hr %#x.\n", hr); hr = MFCancelWorkItem(key2); - ok(hr == S_OK, "Failed to cancel item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to cancel item, hr %#x.\n", hr); IMFAsyncResult_Release(result); hr = MFScheduleWorkItem(&callback->IMFAsyncCallback_iface, NULL, -5000, &key); - ok(hr == S_OK, "Failed to schedule item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to schedule item, hr %#x.\n", hr); hr = MFCancelWorkItem(key); - ok(hr == S_OK, "Failed to cancel item, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to cancel item, hr %#x.\n", hr); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); IMFAsyncCallback_Release(&callback->IMFAsyncCallback_iface); } @@ -3150,7 +3116,7 @@ static void test_serial_queue(void) } hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(queue_ids); ++i) { @@ -3159,30 +3125,30 @@ static void test_serial_queue(void) hr = pMFAllocateSerialWorkQueue(queue_ids[i], &serial_queue); ok(hr == S_OK || broken(broken_types && hr == E_INVALIDARG) /* Win8 */, - "%u: failed to allocate a queue, hr %#lx.\n", i, hr); + "%u: failed to allocate a queue, hr %#x.\n", i, hr); if (SUCCEEDED(hr)) { hr = MFUnlockWorkQueue(serial_queue); - ok(hr == S_OK, "%u: failed to unlock the queue, hr %#lx.\n", i, hr); + ok(hr == S_OK, "%u: failed to unlock the queue, hr %#x.\n", i, hr); } } /* Chain them together. */ hr = pMFAllocateSerialWorkQueue(MFASYNC_CALLBACK_QUEUE_STANDARD, &serial_queue); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); hr = pMFAllocateSerialWorkQueue(serial_queue, &queue); - ok(hr == S_OK, "Failed to allocate a queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to allocate a queue, hr %#x.\n", hr); hr = MFUnlockWorkQueue(serial_queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); } static LONG periodic_counter; @@ -3197,36 +3163,36 @@ static void test_periodic_callback(void) HRESULT hr; hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); period = 0; hr = MFGetTimerPeriodicity(&period); - ok(hr == S_OK, "Failed to get timer perdiod, hr %#lx.\n", hr); - ok(period == 10, "Unexpected period %lu.\n", period); + ok(hr == S_OK, "Failed to get timer perdiod, hr %#x.\n", hr); + ok(period == 10, "Unexpected period %u.\n", period); if (!pMFAddPeriodicCallback) { win_skip("Periodic callbacks are not supported.\n"); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); return; } - ok(periodic_counter == 0, "Unexpected counter value %lu.\n", periodic_counter); + ok(periodic_counter == 0, "Unexpected counter value %u.\n", periodic_counter); hr = pMFAddPeriodicCallback(periodic_callback, NULL, &key); - ok(hr == S_OK, "Failed to add periodic callback, hr %#lx.\n", hr); - ok(key != 0, "Unexpected key %#lx.\n", key); + ok(hr == S_OK, "Failed to add periodic callback, hr %#x.\n", hr); + ok(key != 0, "Unexpected key %#x.\n", key); Sleep(10 * period); hr = pMFRemovePeriodicCallback(key); - ok(hr == S_OK, "Failed to remove callback, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to remove callback, hr %#x.\n", hr); - ok(periodic_counter > 0, "Unexpected counter value %lu.\n", periodic_counter); + ok(periodic_counter > 0, "Unexpected counter value %u.\n", periodic_counter); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); } static void test_event_queue(void) @@ -3242,108 +3208,108 @@ static void test_event_queue(void) callback2 = create_test_callback(NULL); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); hr = MFCreateEventQueue(&queue); - ok(hr == S_OK, "Failed to create event queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create event queue, hr %#x.\n", hr); hr = IMFMediaEventQueue_GetEvent(queue, MF_EVENT_FLAG_NO_WAIT, &event); - ok(hr == MF_E_NO_EVENTS_AVAILABLE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NO_EVENTS_AVAILABLE, "Unexpected hr %#x.\n", hr); hr = MFCreateMediaEvent(MEError, &GUID_NULL, E_FAIL, NULL, &event); - ok(hr == S_OK, "Failed to create event object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create event object, hr %#x.\n", hr); if (is_win8_plus) { hr = IMFMediaEventQueue_QueueEvent(queue, event); - ok(hr == S_OK, "Failed to queue event, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to queue event, hr %#x.\n", hr); hr = IMFMediaEventQueue_GetEvent(queue, MF_EVENT_FLAG_NO_WAIT, &event2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(event2 == event, "Unexpected event object.\n"); IMFMediaEvent_Release(event2); hr = IMFMediaEventQueue_QueueEvent(queue, event); - ok(hr == S_OK, "Failed to queue event, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to queue event, hr %#x.\n", hr); hr = IMFMediaEventQueue_GetEvent(queue, 0, &event2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMFMediaEvent_Release(event2); } /* Async case. */ hr = IMFMediaEventQueue_BeginGetEvent(queue, NULL, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFMediaEventQueue_BeginGetEvent(queue, &callback->IMFAsyncCallback_iface, (IUnknown *)queue); - ok(hr == S_OK, "Failed to Begin*, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to Begin*, hr %#x.\n", hr); /* Same callback, same state. */ hr = IMFMediaEventQueue_BeginGetEvent(queue, &callback->IMFAsyncCallback_iface, (IUnknown *)queue); - ok(hr == MF_S_MULTIPLE_BEGIN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_S_MULTIPLE_BEGIN, "Unexpected hr %#x.\n", hr); /* Same callback, different state. */ hr = IMFMediaEventQueue_BeginGetEvent(queue, &callback->IMFAsyncCallback_iface, (IUnknown *)&callback->IMFAsyncCallback_iface); - ok(hr == MF_E_MULTIPLE_BEGIN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_MULTIPLE_BEGIN, "Unexpected hr %#x.\n", hr); /* Different callback, same state. */ hr = IMFMediaEventQueue_BeginGetEvent(queue, &callback2->IMFAsyncCallback_iface, (IUnknown *)queue); - ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Unexpected hr %#x.\n", hr); /* Different callback, different state. */ hr = IMFMediaEventQueue_BeginGetEvent(queue, &callback2->IMFAsyncCallback_iface, (IUnknown *)&callback->IMFAsyncCallback_iface); - ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_MULTIPLE_SUBSCRIBERS, "Unexpected hr %#x.\n", hr); callback->event = CreateEventA(NULL, FALSE, FALSE, NULL); hr = IMFMediaEventQueue_QueueEvent(queue, event); - ok(hr == S_OK, "Failed to queue event, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to queue event, hr %#x.\n", hr); ret = WaitForSingleObject(callback->event, 500); - ok(ret == WAIT_OBJECT_0, "Unexpected return value %#lx.\n", ret); + ok(ret == WAIT_OBJECT_0, "Unexpected return value %#x.\n", ret); CloseHandle(callback->event); IMFMediaEvent_Release(event); hr = MFCreateAsyncResult(NULL, &callback->IMFAsyncCallback_iface, NULL, &result); - ok(hr == S_OK, "Failed to create result, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create result, hr %#x.\n", hr); hr = IMFMediaEventQueue_EndGetEvent(queue, result, &event); - ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + ok(hr == E_FAIL, "Unexpected hr %#x.\n", hr); /* Shutdown behavior. */ hr = IMFMediaEventQueue_Shutdown(queue); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); hr = IMFMediaEventQueue_GetEvent(queue, MF_EVENT_FLAG_NO_WAIT, &event); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = MFCreateMediaEvent(MEError, &GUID_NULL, E_FAIL, NULL, &event); - ok(hr == S_OK, "Failed to create event object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create event object, hr %#x.\n", hr); hr = IMFMediaEventQueue_QueueEvent(queue, event); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); IMFMediaEvent_Release(event); hr = IMFMediaEventQueue_QueueEventParamUnk(queue, MEError, &GUID_NULL, E_FAIL, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEventQueue_QueueEventParamVar(queue, MEError, &GUID_NULL, E_FAIL, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEventQueue_BeginGetEvent(queue, &callback->IMFAsyncCallback_iface, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); hr = IMFMediaEventQueue_BeginGetEvent(queue, NULL, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFMediaEventQueue_EndGetEvent(queue, result, &event); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); IMFAsyncResult_Release(result); /* Already shut down. */ hr = IMFMediaEventQueue_Shutdown(queue); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); IMFMediaEventQueue_Release(queue); IMFAsyncCallback_Release(&callback->IMFAsyncCallback_iface); @@ -3352,20 +3318,20 @@ static void test_event_queue(void) callback = create_test_callback(NULL); hr = MFCreateEventQueue(&queue); - ok(hr == S_OK, "Failed to create event queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create event queue, hr %#x.\n", hr); hr = IMFMediaEventQueue_BeginGetEvent(queue, &callback->IMFAsyncCallback_iface, NULL); - ok(hr == S_OK, "Failed to Begin*, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to Begin*, hr %#x.\n", hr); EXPECT_REF(&callback->IMFAsyncCallback_iface, 2); IMFMediaEventQueue_Release(queue); ret = get_refcount(&callback->IMFAsyncCallback_iface); ok(ret == 1 || broken(ret == 2) /* Vista */, - "Unexpected refcount %ld, expected 1.\n", ret); + "Unexpected refcount %d, expected 1.\n", ret); IMFAsyncCallback_Release(&callback->IMFAsyncCallback_iface); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); } static void test_presentation_descriptor(void) @@ -3380,58 +3346,58 @@ static void test_presentation_descriptor(void) HRESULT hr; hr = MFCreateMediaType(&media_type); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(stream_desc); ++i) { hr = MFCreateStreamDescriptor(0, 1, &media_type, &stream_desc[i]); - ok(hr == S_OK, "Failed to create descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create descriptor, hr %#x.\n", hr); } hr = MFCreatePresentationDescriptor(ARRAY_SIZE(stream_desc), stream_desc, &pd); - ok(hr == S_OK, "Failed to create presentation descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create presentation descriptor, hr %#x.\n", hr); hr = IMFPresentationDescriptor_GetStreamDescriptorCount(pd, &count); - ok(count == ARRAY_SIZE(stream_desc), "Unexpected count %lu.\n", count); + ok(count == ARRAY_SIZE(stream_desc), "Unexpected count %u.\n", count); for (i = 0; i < count; ++i) { hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(pd, i, &selected, &stream_desc2); - ok(hr == S_OK, "Failed to get stream descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get stream descriptor, hr %#x.\n", hr); ok(!selected, "Unexpected selected state.\n"); ok(stream_desc[i] == stream_desc2, "Unexpected object.\n"); IMFStreamDescriptor_Release(stream_desc2); } hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(pd, 10, &selected, &stream_desc2); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFPresentationDescriptor_SelectStream(pd, 10); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFPresentationDescriptor_SelectStream(pd, 0); - ok(hr == S_OK, "Failed to select a stream, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to select a stream, hr %#x.\n", hr); hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(pd, 0, &selected, &stream_desc2); - ok(hr == S_OK, "Failed to get stream descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get stream descriptor, hr %#x.\n", hr); ok(!!selected, "Unexpected selected state.\n"); IMFStreamDescriptor_Release(stream_desc2); hr = IMFPresentationDescriptor_SetUINT64(pd, &MF_PD_TOTAL_FILE_SIZE, 1); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFPresentationDescriptor_Clone(pd, &pd2); - ok(hr == S_OK, "Failed to clone, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to clone, hr %#x.\n", hr); hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(pd2, 0, &selected, &stream_desc2); - ok(hr == S_OK, "Failed to get stream descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get stream descriptor, hr %#x.\n", hr); ok(!!selected, "Unexpected selected state.\n"); ok(stream_desc2 == stream_desc[0], "Unexpected stream descriptor.\n"); IMFStreamDescriptor_Release(stream_desc2); value = 0; hr = IMFPresentationDescriptor_GetUINT64(pd2, &MF_PD_TOTAL_FILE_SIZE, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == 1, "Unexpected attribute value.\n"); IMFPresentationDescriptor_Release(pd2); @@ -3444,11 +3410,11 @@ static void test_presentation_descriptor(void) /* Partially initialized array. */ hr = MFCreateStreamDescriptor(0, 1, &media_type, &stream_desc[1]); - ok(hr == S_OK, "Failed to create descriptor, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create descriptor, hr %#x.\n", hr); stream_desc[0] = NULL; hr = MFCreatePresentationDescriptor(ARRAY_SIZE(stream_desc), stream_desc, &pd); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); IMFStreamDescriptor_Release(stream_desc[1]); IMFMediaType_Release(media_type); @@ -3502,24 +3468,24 @@ static void test_system_time_source(void) HRESULT hr; hr = MFCreateSystemTimeSource(&time_source); - ok(hr == S_OK, "Failed to create time source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create time source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetClockCharacteristics(time_source, &value); - ok(hr == S_OK, "Failed to get flags, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get flags, hr %#x.\n", hr); ok(value == (MFCLOCK_CHARACTERISTICS_FLAG_FREQUENCY_10MHZ | MFCLOCK_CHARACTERISTICS_FLAG_IS_SYSTEM_CLOCK), - "Unexpected flags %#lx.\n", value); + "Unexpected flags %#x.\n", value); value = 1; hr = IMFPresentationTimeSource_GetContinuityKey(time_source, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(value == 0, "Unexpected value %lu.\n", value); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(value == 0, "Unexpected value %u.\n", value); hr = IMFPresentationTimeSource_GetState(time_source, 0, &state); - ok(hr == S_OK, "Failed to get state, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get state, hr %#x.\n", hr); ok(state == MFCLOCK_STATE_INVALID, "Unexpected state %d.\n", state); hr = IMFPresentationTimeSource_QueryInterface(time_source, &IID_IMFClockStateSink, (void **)&statesink); - ok(hr == S_OK, "Failed to get state sink, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get state sink, hr %#x.\n", hr); /* State changes. */ for (i = 0; i < ARRAY_SIZE(clock_state_change); ++i) @@ -3541,9 +3507,9 @@ static void test_system_time_source(void) default: ; } - ok(hr == (clock_state_change[i].is_invalid ? MF_E_INVALIDREQUEST : S_OK), "%u: unexpected hr %#lx.\n", i, hr); + ok(hr == (clock_state_change[i].is_invalid ? MF_E_INVALIDREQUEST : S_OK), "%u: unexpected hr %#x.\n", i, hr); hr = IMFPresentationTimeSource_GetState(time_source, 0, &state); - ok(hr == S_OK, "%u: failed to get state, hr %#lx.\n", i, hr); + ok(hr == S_OK, "%u: failed to get state, hr %#x.\n", i, hr); ok(state == clock_state_change[i].state, "%u: unexpected state %d.\n", i, state); } @@ -3551,32 +3517,32 @@ static void test_system_time_source(void) /* Properties. */ hr = IMFPresentationTimeSource_GetProperties(time_source, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetProperties(time_source, &props); - ok(hr == S_OK, "Failed to get clock properties, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get clock properties, hr %#x.\n", hr); ok(props.qwCorrelationRate == 0, "Unexpected correlation rate %s.\n", wine_dbgstr_longlong(props.qwCorrelationRate)); ok(IsEqualGUID(&props.guidClockId, &GUID_NULL), "Unexpected clock id %s.\n", wine_dbgstr_guid(&props.guidClockId)); - ok(props.dwClockFlags == 0, "Unexpected flags %#lx.\n", props.dwClockFlags); + ok(props.dwClockFlags == 0, "Unexpected flags %#x.\n", props.dwClockFlags); ok(props.qwClockFrequency == MFCLOCK_FREQUENCY_HNS, "Unexpected frequency %s.\n", wine_dbgstr_longlong(props.qwClockFrequency)); - ok(props.dwClockTolerance == MFCLOCK_TOLERANCE_UNKNOWN, "Unexpected tolerance %lu.\n", props.dwClockTolerance); - ok(props.dwClockJitter == 1, "Unexpected jitter %lu.\n", props.dwClockJitter); + ok(props.dwClockTolerance == MFCLOCK_TOLERANCE_UNKNOWN, "Unexpected tolerance %u.\n", props.dwClockTolerance); + ok(props.dwClockJitter == 1, "Unexpected jitter %u.\n", props.dwClockJitter); /* Underlying clock. */ hr = MFCreateSystemTimeSource(&time_source2); - ok(hr == S_OK, "Failed to create time source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create time source, hr %#x.\n", hr); EXPECT_REF(time_source2, 1); hr = IMFPresentationTimeSource_GetUnderlyingClock(time_source2, &clock2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(time_source2, 1); EXPECT_REF(clock2, 2); EXPECT_REF(time_source, 1); hr = IMFPresentationTimeSource_GetUnderlyingClock(time_source, &clock); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(time_source, 1); EXPECT_REF(clock, 2); @@ -3586,209 +3552,184 @@ static void test_system_time_source(void) IMFClock_Release(clock2); hr = IMFClock_GetClockCharacteristics(clock, &value); - ok(hr == S_OK, "Failed to get clock flags, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get clock flags, hr %#x.\n", hr); ok(value == (MFCLOCK_CHARACTERISTICS_FLAG_FREQUENCY_10MHZ | MFCLOCK_CHARACTERISTICS_FLAG_ALWAYS_RUNNING | - MFCLOCK_CHARACTERISTICS_FLAG_IS_SYSTEM_CLOCK), "Unexpected flags %#lx.\n", value); + MFCLOCK_CHARACTERISTICS_FLAG_IS_SYSTEM_CLOCK), "Unexpected flags %#x.\n", value); hr = IMFClock_GetContinuityKey(clock, &value); - ok(hr == S_OK, "Failed to get clock key, hr %#lx.\n", hr); - ok(value == 0, "Unexpected key value %lu.\n", value); + ok(hr == S_OK, "Failed to get clock key, hr %#x.\n", hr); + ok(value == 0, "Unexpected key value %u.\n", value); hr = IMFClock_GetState(clock, 0, &state); - ok(hr == S_OK, "Failed to get clock state, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get clock state, hr %#x.\n", hr); ok(state == MFCLOCK_STATE_RUNNING, "Unexpected state %d.\n", state); hr = IMFClock_GetProperties(clock, &props); - ok(hr == S_OK, "Failed to get clock properties, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get clock properties, hr %#x.\n", hr); ok(props.qwCorrelationRate == 0, "Unexpected correlation rate %s.\n", wine_dbgstr_longlong(props.qwCorrelationRate)); ok(IsEqualGUID(&props.guidClockId, &GUID_NULL), "Unexpected clock id %s.\n", wine_dbgstr_guid(&props.guidClockId)); - ok(props.dwClockFlags == 0, "Unexpected flags %#lx.\n", props.dwClockFlags); + ok(props.dwClockFlags == 0, "Unexpected flags %#x.\n", props.dwClockFlags); ok(props.qwClockFrequency == MFCLOCK_FREQUENCY_HNS, "Unexpected frequency %s.\n", wine_dbgstr_longlong(props.qwClockFrequency)); - ok(props.dwClockTolerance == MFCLOCK_TOLERANCE_UNKNOWN, "Unexpected tolerance %lu.\n", props.dwClockTolerance); - ok(props.dwClockJitter == 1, "Unexpected jitter %lu.\n", props.dwClockJitter); + ok(props.dwClockTolerance == MFCLOCK_TOLERANCE_UNKNOWN, "Unexpected tolerance %u.\n", props.dwClockTolerance); + ok(props.dwClockJitter == 1, "Unexpected jitter %u.\n", props.dwClockJitter); hr = IMFClock_GetCorrelatedTime(clock, 0, &time, &systime); - ok(hr == S_OK, "Failed to get clock time, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get clock time, hr %#x.\n", hr); ok(time == systime, "Unexpected time %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); IMFClock_Release(clock); /* Test returned time regarding specified rate and offset. */ hr = IMFPresentationTimeSource_QueryInterface(time_source, &IID_IMFClockStateSink, (void **)&statesink); - ok(hr == S_OK, "Failed to get sink interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get sink interface, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetState(time_source, 0, &state); - ok(hr == S_OK, "Failed to get state %#lx.\n", hr); + ok(hr == S_OK, "Failed to get state %#x.\n", hr); ok(state == MFCLOCK_STATE_STOPPED, "Unexpected state %d.\n", state); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 0, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 0, 0); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 0, 1); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime + 1, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockPause(statesink, 2); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 3, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockRestart(statesink, 5); - ok(hr == S_OK, "Failed to restart source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to restart source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime - 2, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockPause(statesink, 0); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == -2, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStop(statesink, 123); - ok(hr == S_OK, "Failed to stop source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to stop source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 0, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); /* Increased rate. */ hr = IMFClockStateSink_OnClockSetRate(statesink, 0, 2.0f); - ok(hr == S_OK, "Failed to set rate, hr %#lx.\n", hr); - - hr = IMFClockStateSink_OnClockStart(statesink, 0, 0); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); - - hr = IMFClockStateSink_OnClockSetRate(statesink, 5, 2.0f); - ok(hr == S_OK, "Failed to set rate, hr %#lx.\n", hr); - - hr = IMFClockStateSink_OnClockPause(statesink, 6); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); - - hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); - ok(time == 12 && !!systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), - wine_dbgstr_longlong(systime)); - - hr = IMFClockStateSink_OnClockRestart(statesink, 7); - ok(hr == S_OK, "Failed to restart source, hr %#lx.\n", hr); - - hr = IMFClockStateSink_OnClockPause(statesink, 8); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); - - hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); - ok(time == 14 && !!systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), - wine_dbgstr_longlong(systime)); + ok(hr == S_OK, "Failed to set rate, hr %#x.\n", hr); hr = IMFClockStateSink_OnClockStart(statesink, 0, 0); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 2 * systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(2 * systime)); hr = IMFClockStateSink_OnClockStart(statesink, 0, 10); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 2 * systime + 10, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(2 * systime)); hr = IMFClockStateSink_OnClockPause(statesink, 2); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 10 + 2 * 2, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockRestart(statesink, 5); - ok(hr == S_OK, "Failed to restart source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to restart source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 2 * systime + 14 - 5 * 2, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockPause(statesink, 0); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 4, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStop(statesink, 123); - ok(hr == S_OK, "Failed to stop source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to stop source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 0, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 10, 0); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 2 * systime - 2 * 10, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(2 * systime)); hr = IMFClockStateSink_OnClockStop(statesink, 123); - ok(hr == S_OK, "Failed to stop source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to stop source, hr %#x.\n", hr); hr = IMFClockStateSink_OnClockStart(statesink, 10, 20); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 2 * systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(2 * systime)); hr = IMFClockStateSink_OnClockPause(statesink, 2); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 2 * 2, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockRestart(statesink, 5); - ok(hr == S_OK, "Failed to restart source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to restart source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == 2 * systime + 4 - 5 * 2, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockPause(statesink, 0); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == -6, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); @@ -3797,105 +3738,105 @@ static void test_system_time_source(void) /* PRESENTATION_CURRENT_POSITION */ hr = MFCreateSystemTimeSource(&time_source); - ok(hr == S_OK, "Failed to create time source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create time source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_QueryInterface(time_source, &IID_IMFClockStateSink, (void **)&statesink); - ok(hr == S_OK, "Failed to get sink interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get sink interface, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(!time && systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); /* INVALID -> RUNNING */ hr = IMFClockStateSink_OnClockStart(statesink, 10, PRESENTATION_CURRENT_POSITION); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime - 10, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); /* RUNNING -> RUNNING */ hr = IMFClockStateSink_OnClockStart(statesink, 20, PRESENTATION_CURRENT_POSITION); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime - 10, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 0, PRESENTATION_CURRENT_POSITION); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime - 10, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 0, 0); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 30, PRESENTATION_CURRENT_POSITION); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); /* STOPPED -> RUNNING */ hr = IMFClockStateSink_OnClockStop(statesink, 567); - ok(hr == S_OK, "Failed to stop source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to stop source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(!time && systime != 0, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 30, PRESENTATION_CURRENT_POSITION); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime - 30, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); /* PAUSED -> RUNNING */ hr = IMFClockStateSink_OnClockPause(statesink, 8); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == (-30 + 8) && systime != 0, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 40, PRESENTATION_CURRENT_POSITION); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime + (-30 + 8 - 40), "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockPause(statesink, 7); - ok(hr == S_OK, "Failed to pause source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to pause source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == (-30 + 8 - 40 + 7) && systime != 0, "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); hr = IMFClockStateSink_OnClockStart(statesink, 50, 7); - ok(hr == S_OK, "Failed to start source, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start source, hr %#x.\n", hr); hr = IMFPresentationTimeSource_GetCorrelatedTime(time_source, 0, &time, &systime); - ok(hr == S_OK, "Failed to get time %#lx.\n", hr); + ok(hr == S_OK, "Failed to get time %#x.\n", hr); ok(time == systime + (-50 + 7), "Unexpected time stamp %s, %s.\n", wine_dbgstr_longlong(time), wine_dbgstr_longlong(systime)); @@ -3913,30 +3854,30 @@ static void test_MFInvokeCallback(void) DWORD ret; hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); callback = create_test_callback(NULL); hr = MFCreateAsyncResult(NULL, &callback->IMFAsyncCallback_iface, NULL, &result); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); data = (MFASYNCRESULT *)result; data->hEvent = CreateEventA(NULL, FALSE, FALSE, NULL); ok(data->hEvent != NULL, "Failed to create event.\n"); hr = MFInvokeCallback(result); - ok(hr == S_OK, "Failed to invoke, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to invoke, hr %#x.\n", hr); ret = WaitForSingleObject(data->hEvent, 100); - ok(ret == WAIT_TIMEOUT, "Expected timeout, ret %#lx.\n", ret); + ok(ret == WAIT_TIMEOUT, "Expected timeout, ret %#x.\n", ret); refcount = IMFAsyncResult_Release(result); - ok(!refcount, "Unexpected refcount %lu.\n", refcount); + ok(!refcount, "Unexpected refcount %u.\n", refcount); IMFAsyncCallback_Release(&callback->IMFAsyncCallback_iface); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); } static void test_stream_descriptor(void) @@ -3950,41 +3891,41 @@ static void test_stream_descriptor(void) HRESULT hr; hr = MFCreateStreamDescriptor(123, 0, NULL, &stream_desc); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(media_types); ++i) { hr = MFCreateMediaType(&media_types[i]); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); } hr = MFCreateStreamDescriptor(123, 0, media_types, &stream_desc); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = MFCreateStreamDescriptor(123, ARRAY_SIZE(media_types), media_types, &stream_desc); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFStreamDescriptor_GetStreamIdentifier(stream_desc, &id); - ok(hr == S_OK, "Failed to get descriptor id, hr %#lx.\n", hr); - ok(id == 123, "Unexpected id %#lx.\n", id); + ok(hr == S_OK, "Failed to get descriptor id, hr %#x.\n", hr); + ok(id == 123, "Unexpected id %#x.\n", id); hr = IMFStreamDescriptor_GetMediaTypeHandler(stream_desc, &type_handler); - ok(hr == S_OK, "Failed to get type handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr); hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, &count); - ok(hr == S_OK, "Failed to get type count, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get type count, hr %#x.\n", hr); ok(count == ARRAY_SIZE(media_types), "Unexpected type count.\n"); hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, &media_type); - ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); hr = IMFMediaTypeHandler_GetMajorType(type_handler, &major_type); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(media_types); ++i) { hr = IMFMediaTypeHandler_GetMediaTypeByIndex(type_handler, i, &media_type); - ok(hr == S_OK, "Failed to get media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get media type, hr %#x.\n", hr); ok(media_type == media_types[i], "Unexpected object.\n"); if (SUCCEEDED(hr)) @@ -3992,88 +3933,88 @@ static void test_stream_descriptor(void) } hr = IMFMediaTypeHandler_GetMediaTypeByIndex(type_handler, 2, &media_type); - ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#x.\n", hr); /* IsMediaTypeSupported() */ hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, NULL, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, NULL, &media_type2); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = MFCreateMediaType(&media_type); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); hr = MFCreateMediaType(&media_type3); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type, &media_type2); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type); - ok(hr == S_OK, "Failed to set current type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current type, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type, &media_type2); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); hr = IMFMediaTypeHandler_GetMajorType(type_handler, &major_type); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); hr = IMFMediaTypeHandler_GetMajorType(type_handler, &major_type); - ok(hr == S_OK, "Failed to get major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get major type, hr %#x.\n", hr); ok(IsEqualGUID(&major_type, &MFMediaType_Audio), "Unexpected major type.\n"); /* Mismatching major types. */ hr = IMFMediaType_SetGUID(media_type3, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); /* Subtype missing. */ hr = IMFMediaType_SetGUID(media_type3, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFAudioFormat_PCM); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); hr = IMFMediaType_SetGUID(media_type3, &MF_MT_SUBTYPE, &MFAudioFormat_PCM); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); /* Mismatching subtype. */ hr = IMFMediaType_SetGUID(media_type3, &MF_MT_SUBTYPE, &MFAudioFormat_MP3); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, &count); - ok(hr == S_OK, "Failed to get type count, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get type count, hr %#x.\n", hr); ok(count == ARRAY_SIZE(media_types), "Unexpected type count.\n"); IMFMediaTypeHandler_Release(type_handler); @@ -4081,60 +4022,60 @@ static void test_stream_descriptor(void) /* IsMediaTypeSupported() for unset current type. */ hr = MFCreateStreamDescriptor(123, ARRAY_SIZE(media_types), media_types, &stream_desc); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFStreamDescriptor_GetMediaTypeHandler(stream_desc, &type_handler); - ok(hr == S_OK, "Failed to get type handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr); hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, NULL); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); /* Initialize one from initial type set. */ hr = IMFMediaType_CopyAllItems(media_type3, (IMFAttributes *)media_types[0]); - ok(hr == S_OK, "Failed to copy attributes, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy attributes, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); hr = IMFMediaType_SetGUID(media_type3, &MF_MT_SUBTYPE, &MFAudioFormat_PCM); - ok(hr == S_OK, "Failed to copy attributes, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy attributes, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); hr = IMFMediaType_SetGUID(media_type3, &MF_MT_SUBTYPE, &MFAudioFormat_MP3); - ok(hr == S_OK, "Failed to copy attributes, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy attributes, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); /* Now set current type that's not compatible. */ hr = IMFMediaType_SetGUID(media_type3, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to copy attributes, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy attributes, hr %#x.\n", hr); hr = IMFMediaType_SetGUID(media_type3, &MF_MT_SUBTYPE, &MFVideoFormat_RGB8); - ok(hr == S_OK, "Failed to copy attributes, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy attributes, hr %#x.\n", hr); hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type3); - ok(hr == S_OK, "Failed to set current type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current type, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type3, &media_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); hr = IMFMediaType_CopyAllItems(media_types[0], (IMFAttributes *)media_type); - ok(hr == S_OK, "Failed to copy attributes, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to copy attributes, hr %#x.\n", hr); media_type2 = (void *)0xdeadbeef; hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type, &media_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!media_type2, "Unexpected pointer.\n"); IMFMediaType_Release(media_type); @@ -4146,32 +4087,32 @@ static void test_stream_descriptor(void) /* Major type is returned for first entry. */ hr = MFCreateMediaType(&media_types[0]); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFCreateMediaType(&media_types[1]); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(media_types[0], &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(media_types[1], &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFCreateStreamDescriptor(0, 2, media_types, &stream_desc); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFStreamDescriptor_GetMediaTypeHandler(stream_desc, &type_handler); - ok(hr == S_OK, "Failed to get type handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr); hr = IMFMediaTypeHandler_GetMajorType(type_handler, &major_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(IsEqualGUID(&major_type, &MFMediaType_Audio), "Unexpected major type %s.\n", wine_dbgstr_guid(&major_type)); hr = IMFMediaType_SetGUID(media_types[0], &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(media_types[1], &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaTypeHandler_GetMajorType(type_handler, &major_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(IsEqualGUID(&major_type, &MFMediaType_Video), "Unexpected major type %s.\n", wine_dbgstr_guid(&major_type)); IMFMediaType_Release(media_types[0]); @@ -4181,106 +4122,107 @@ static void test_stream_descriptor(void) IMFStreamDescriptor_Release(stream_desc); } -static const struct image_size_test -{ - const GUID *subtype; - UINT32 width; - UINT32 height; - UINT32 size; - UINT32 plane_size; /* Matches image size when 0. */ -} -image_size_tests[] = -{ - { &MFVideoFormat_RGB8, 3, 5, 20 }, - { &MFVideoFormat_RGB8, 1, 1, 4 }, - { &MFVideoFormat_RGB555, 3, 5, 40 }, - { &MFVideoFormat_RGB555, 1, 1, 4 }, - { &MFVideoFormat_RGB565, 3, 5, 40 }, - { &MFVideoFormat_RGB565, 1, 1, 4 }, - { &MFVideoFormat_RGB24, 3, 5, 60 }, - { &MFVideoFormat_RGB24, 1, 1, 4 }, - { &MFVideoFormat_RGB32, 3, 5, 60 }, - { &MFVideoFormat_RGB32, 1, 1, 4 }, - { &MFVideoFormat_ARGB32, 3, 5, 60 }, - { &MFVideoFormat_ARGB32, 1, 1, 4 }, - { &MFVideoFormat_A2R10G10B10, 3, 5, 60 }, - { &MFVideoFormat_A2R10G10B10, 1, 1, 4 }, - { &MFVideoFormat_A16B16G16R16F, 3, 5, 120 }, - { &MFVideoFormat_A16B16G16R16F, 1, 1, 8 }, - - /* YUV */ - { &MFVideoFormat_NV12, 1, 3, 9, 4 }, - { &MFVideoFormat_NV12, 1, 2, 6, 3 }, - { &MFVideoFormat_NV12, 2, 2, 6, 6 }, - { &MFVideoFormat_NV12, 3, 2, 12, 9 }, - { &MFVideoFormat_NV12, 4, 2, 12 }, - { &MFVideoFormat_NV12, 320, 240, 115200 }, - { &MFVideoFormat_AYUV, 1, 1, 4 }, - { &MFVideoFormat_AYUV, 2, 1, 8 }, - { &MFVideoFormat_AYUV, 1, 2, 8 }, - { &MFVideoFormat_AYUV, 4, 3, 48 }, - { &MFVideoFormat_AYUV, 320, 240, 307200 }, - { &MFVideoFormat_IMC1, 1, 1, 4 }, - { &MFVideoFormat_IMC1, 2, 1, 4 }, - { &MFVideoFormat_IMC1, 1, 2, 8 }, - { &MFVideoFormat_IMC1, 4, 3, 24 }, - { &MFVideoFormat_IMC1, 320, 240, 153600 }, - { &MFVideoFormat_IMC3, 1, 1, 4 }, - { &MFVideoFormat_IMC3, 2, 1, 4 }, - { &MFVideoFormat_IMC3, 1, 2, 8 }, - { &MFVideoFormat_IMC3, 4, 3, 24 }, - { &MFVideoFormat_IMC3, 320, 240, 153600 }, - { &MFVideoFormat_IMC2, 1, 3, 9, 4 }, - { &MFVideoFormat_IMC2, 1, 2, 6, 3 }, - { &MFVideoFormat_IMC2, 2, 2, 6, 6 }, - { &MFVideoFormat_IMC2, 3, 2, 12, 9 }, - { &MFVideoFormat_IMC2, 4, 2, 12 }, - { &MFVideoFormat_IMC2, 320, 240, 115200 }, - { &MFVideoFormat_IMC4, 1, 3, 9, 4 }, - { &MFVideoFormat_IMC4, 1, 2, 6, 3 }, - { &MFVideoFormat_IMC4, 2, 2, 6, 6 }, - { &MFVideoFormat_IMC4, 3, 2, 12, 9 }, - { &MFVideoFormat_IMC4, 4, 2, 12 }, - { &MFVideoFormat_IMC4, 320, 240, 115200 }, - { &MFVideoFormat_YV12, 1, 1, 3, 1 }, - { &MFVideoFormat_YV12, 2, 1, 3 }, - { &MFVideoFormat_YV12, 1, 2, 6, 3 }, - { &MFVideoFormat_YV12, 4, 3, 18 }, - { &MFVideoFormat_YV12, 320, 240, 115200 }, - - { &MFVideoFormat_I420, 1, 1, 3, 1 }, - { &MFVideoFormat_I420, 2, 1, 3 }, - { &MFVideoFormat_I420, 1, 2, 6, 3 }, - { &MFVideoFormat_I420, 4, 3, 18 }, - { &MFVideoFormat_I420, 320, 240, 115200 }, - - { &MFVideoFormat_IYUV, 1, 1, 3, 1 }, - { &MFVideoFormat_IYUV, 2, 1, 3 }, - { &MFVideoFormat_IYUV, 1, 2, 6, 3 }, - { &MFVideoFormat_IYUV, 4, 3, 18 }, - { &MFVideoFormat_IYUV, 320, 240, 115200 }, - - { &MFVideoFormat_YUY2, 2, 1, 4 }, - { &MFVideoFormat_YUY2, 4, 3, 24 }, - { &MFVideoFormat_YUY2, 128, 128, 32768 }, - { &MFVideoFormat_YUY2, 320, 240, 153600 }, - - { &MFVideoFormat_UYVY, 2, 1, 4 }, - { &MFVideoFormat_UYVY, 4, 3, 24 }, - { &MFVideoFormat_UYVY, 128, 128, 32768 }, - { &MFVideoFormat_UYVY, 320, 240, 153600 }, -}; - static void test_MFCalculateImageSize(void) { - DWORD plane_size; + static const struct image_size_test + { + const GUID *subtype; + UINT32 width; + UINT32 height; + UINT32 size; + UINT32 plane_size; /* Matches image size when 0. */ + } + image_size_tests[] = + { + { &MFVideoFormat_RGB8, 3, 5, 20 }, + { &MFVideoFormat_RGB8, 1, 1, 4 }, + { &MFVideoFormat_RGB555, 3, 5, 40 }, + { &MFVideoFormat_RGB555, 1, 1, 4 }, + { &MFVideoFormat_RGB565, 3, 5, 40 }, + { &MFVideoFormat_RGB565, 1, 1, 4 }, + { &MFVideoFormat_RGB24, 3, 5, 60 }, + { &MFVideoFormat_RGB24, 1, 1, 4 }, + { &MFVideoFormat_RGB32, 3, 5, 60 }, + { &MFVideoFormat_RGB32, 1, 1, 4 }, + { &MFVideoFormat_ARGB32, 3, 5, 60 }, + { &MFVideoFormat_ARGB32, 1, 1, 4 }, + { &MFVideoFormat_A2R10G10B10, 3, 5, 60 }, + { &MFVideoFormat_A2R10G10B10, 1, 1, 4 }, + { &MFVideoFormat_A16B16G16R16F, 3, 5, 120 }, + { &MFVideoFormat_A16B16G16R16F, 1, 1, 8 }, + + /* YUV */ + { &MFVideoFormat_NV12, 1, 3, 9, 4 }, + { &MFVideoFormat_NV12, 1, 2, 6, 3 }, + { &MFVideoFormat_NV12, 2, 2, 6, 6 }, + { &MFVideoFormat_NV12, 3, 2, 12, 9 }, + { &MFVideoFormat_NV12, 4, 2, 12 }, + { &MFVideoFormat_NV12, 320, 240, 115200 }, + { &MFVideoFormat_AYUV, 1, 1, 4 }, + { &MFVideoFormat_AYUV, 2, 1, 8 }, + { &MFVideoFormat_AYUV, 1, 2, 8 }, + { &MFVideoFormat_AYUV, 4, 3, 48 }, + { &MFVideoFormat_AYUV, 320, 240, 307200 }, + { &MFVideoFormat_IMC1, 1, 1, 4 }, + { &MFVideoFormat_IMC1, 2, 1, 4 }, + { &MFVideoFormat_IMC1, 1, 2, 8 }, + { &MFVideoFormat_IMC1, 4, 3, 24 }, + { &MFVideoFormat_IMC1, 320, 240, 153600 }, + { &MFVideoFormat_IMC3, 1, 1, 4 }, + { &MFVideoFormat_IMC3, 2, 1, 4 }, + { &MFVideoFormat_IMC3, 1, 2, 8 }, + { &MFVideoFormat_IMC3, 4, 3, 24 }, + { &MFVideoFormat_IMC3, 320, 240, 153600 }, + { &MFVideoFormat_IMC2, 1, 3, 9, 4 }, + { &MFVideoFormat_IMC2, 1, 2, 6, 3 }, + { &MFVideoFormat_IMC2, 2, 2, 6, 6 }, + { &MFVideoFormat_IMC2, 3, 2, 12, 9 }, + { &MFVideoFormat_IMC2, 4, 2, 12 }, + { &MFVideoFormat_IMC2, 320, 240, 115200 }, + { &MFVideoFormat_IMC4, 1, 3, 9, 4 }, + { &MFVideoFormat_IMC4, 1, 2, 6, 3 }, + { &MFVideoFormat_IMC4, 2, 2, 6, 6 }, + { &MFVideoFormat_IMC4, 3, 2, 12, 9 }, + { &MFVideoFormat_IMC4, 4, 2, 12 }, + { &MFVideoFormat_IMC4, 320, 240, 115200 }, + { &MFVideoFormat_YV12, 1, 1, 3, 1 }, + { &MFVideoFormat_YV12, 2, 1, 3 }, + { &MFVideoFormat_YV12, 1, 2, 6, 3 }, + { &MFVideoFormat_YV12, 4, 3, 18 }, + { &MFVideoFormat_YV12, 320, 240, 115200 }, + + { &MFVideoFormat_I420, 1, 1, 3, 1 }, + { &MFVideoFormat_I420, 2, 1, 3 }, + { &MFVideoFormat_I420, 1, 2, 6, 3 }, + { &MFVideoFormat_I420, 4, 3, 18 }, + { &MFVideoFormat_I420, 320, 240, 115200 }, + + { &MFVideoFormat_IYUV, 1, 1, 3, 1 }, + { &MFVideoFormat_IYUV, 2, 1, 3 }, + { &MFVideoFormat_IYUV, 1, 2, 6, 3 }, + { &MFVideoFormat_IYUV, 4, 3, 18 }, + { &MFVideoFormat_IYUV, 320, 240, 115200 }, + + { &MFVideoFormat_YUY2, 2, 1, 4 }, + { &MFVideoFormat_YUY2, 4, 3, 24 }, + { &MFVideoFormat_YUY2, 128, 128, 32768 }, + { &MFVideoFormat_YUY2, 320, 240, 153600 }, + + { &MFVideoFormat_UYVY, 2, 1, 4 }, + { &MFVideoFormat_UYVY, 4, 3, 24 }, + { &MFVideoFormat_UYVY, 128, 128, 32768 }, + { &MFVideoFormat_UYVY, 320, 240, 153600 }, + }; unsigned int i; UINT32 size; HRESULT hr; + if (!pMFGetPlaneSize) + win_skip("MFGetPlaneSize() is not available.\n"); + size = 1; hr = MFCalculateImageSize(&IID_IUnknown, 1, 1, &size); - ok(hr == E_INVALIDARG || broken(hr == S_OK) /* Vista */, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG || broken(hr == S_OK) /* Vista */, "Unexpected hr %#x.\n", hr); ok(size == 0, "Unexpected size %u.\n", size); for (i = 0; i < ARRAY_SIZE(image_size_tests); ++i) @@ -4292,49 +4234,21 @@ static void test_MFCalculateImageSize(void) IsEqualGUID(ptr->subtype, &MFVideoFormat_A2R10G10B10); hr = MFCalculateImageSize(ptr->subtype, ptr->width, ptr->height, &size); - ok(hr == S_OK || (is_broken && hr == E_INVALIDARG), "%u: failed to calculate image size, hr %#lx.\n", i, hr); + ok(hr == S_OK || (is_broken && hr == E_INVALIDARG), "%u: failed to calculate image size, hr %#x.\n", i, hr); ok(size == ptr->size, "%u: unexpected image size %u, expected %u. Size %u x %u, format %s.\n", i, size, ptr->size, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->subtype->Data1, 4)); if (pMFGetPlaneSize) { - unsigned int expected = ptr->plane_size ? ptr->plane_size : ptr->size; + unsigned int plane_size = ptr->plane_size ? ptr->plane_size : ptr->size; - hr = pMFGetPlaneSize(ptr->subtype->Data1, ptr->width, ptr->height, &plane_size); - ok(hr == S_OK, "%u: failed to get plane size, hr %#lx.\n", i, hr); - ok(plane_size == expected, "%u: unexpected plane size %lu, expected %u.\n", i, plane_size, expected); + hr = pMFGetPlaneSize(ptr->subtype->Data1, ptr->width, ptr->height, &size); + ok(hr == S_OK, "%u: failed to get plane size, hr %#x.\n", i, hr); + ok(size == plane_size, "%u: unexpected plane size %u, expected %u.\n", i, size, plane_size); } } } -static void test_MFGetPlaneSize(void) -{ - unsigned int i; - DWORD size; - HRESULT hr; - - if (!pMFGetPlaneSize) - { - win_skip("MFGetPlaneSize() is not available.\n"); - return; - } - - size = 1; - hr = pMFGetPlaneSize(0xdeadbeef, 64, 64, &size); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(size == 0, "Unexpected size %lu.\n", size); - - for (i = 0; i < ARRAY_SIZE(image_size_tests); ++i) - { - const struct image_size_test *ptr = &image_size_tests[i]; - unsigned int plane_size = ptr->plane_size ? ptr->plane_size : ptr->size; - - hr = pMFGetPlaneSize(ptr->subtype->Data1, ptr->width, ptr->height, &size); - ok(hr == S_OK, "%u: failed to get plane size, hr %#lx.\n", i, hr); - ok(size == plane_size, "%u: unexpected plane size %lu, expected %u.\n", i, size, plane_size); - } -} - static void test_MFCompareFullToPartialMediaType(void) { IMFMediaType *full_type, *partial_type; @@ -4342,31 +4256,31 @@ static void test_MFCompareFullToPartialMediaType(void) BOOL ret; hr = MFCreateMediaType(&full_type); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); hr = MFCreateMediaType(&partial_type); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); ret = MFCompareFullToPartialMediaType(full_type, partial_type); ok(!ret, "Unexpected result %d.\n", ret); hr = IMFMediaType_SetGUID(full_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); hr = IMFMediaType_SetGUID(partial_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); ret = MFCompareFullToPartialMediaType(full_type, partial_type); ok(ret, "Unexpected result %d.\n", ret); hr = IMFMediaType_SetGUID(full_type, &MF_MT_SUBTYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); ret = MFCompareFullToPartialMediaType(full_type, partial_type); ok(ret, "Unexpected result %d.\n", ret); hr = IMFMediaType_SetGUID(partial_type, &MF_MT_SUBTYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set major type, hr %#x.\n", hr); ret = MFCompareFullToPartialMediaType(full_type, partial_type); ok(!ret, "Unexpected result %d.\n", ret); @@ -4389,35 +4303,35 @@ static void test_attributes_serialization(void) GUID guid; hr = MFCreateAttributes(&attributes, 0); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); hr = MFCreateAttributes(&dest, 0); - ok(hr == S_OK, "Failed to create object, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create object, hr %#x.\n", hr); hr = MFGetAttributesAsBlobSize(attributes, &size); - ok(hr == S_OK, "Failed to get blob size, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get blob size, hr %#x.\n", hr); ok(size == 8, "Got size %u.\n", size); buffer = malloc(size); hr = MFGetAttributesAsBlob(attributes, buffer, size); - ok(hr == S_OK, "Failed to serialize, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to serialize, hr %#x.\n", hr); hr = MFGetAttributesAsBlob(attributes, buffer, size - 1); - ok(hr == MF_E_BUFFERTOOSMALL, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_BUFFERTOOSMALL, "Unexpected hr %#x.\n", hr); hr = MFInitAttributesFromBlob(dest, buffer, size - 1); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_SetUINT32(dest, &MF_MT_MAJOR_TYPE, 1); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = MFInitAttributesFromBlob(dest, buffer, size); - ok(hr == S_OK, "Failed to deserialize, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to deserialize, hr %#x.\n", hr); /* Previous items are cleared. */ hr = IMFAttributes_GetCount(dest, &count); - ok(hr == S_OK, "Failed to get attribute count, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute count, hr %#x.\n", hr); ok(count == 0, "Unexpected count %u.\n", count); free(buffer); @@ -4432,36 +4346,36 @@ static void test_attributes_serialization(void) IMFAttributes_SetBlob(attributes, &DUMMY_GUID1, blob, sizeof(blob)); hr = MFGetAttributesAsBlobSize(attributes, &size); - ok(hr == S_OK, "Failed to get blob size, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get blob size, hr %#x.\n", hr); ok(size > 8, "Got unexpected size %u.\n", size); buffer = malloc(size); hr = MFGetAttributesAsBlob(attributes, buffer, size); - ok(hr == S_OK, "Failed to serialize, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to serialize, hr %#x.\n", hr); hr = MFInitAttributesFromBlob(dest, buffer, size); - ok(hr == S_OK, "Failed to deserialize, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to deserialize, hr %#x.\n", hr); free(buffer); hr = IMFAttributes_GetUINT32(dest, &MF_MT_MAJOR_TYPE, &value32); - ok(hr == S_OK, "Failed to get get uint32 value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get get uint32 value, hr %#x.\n", hr); ok(value32 == 456, "Unexpected value %u.\n", value32); hr = IMFAttributes_GetUINT64(dest, &MF_MT_SUBTYPE, &value64); - ok(hr == S_OK, "Failed to get get uint64 value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get get uint64 value, hr %#x.\n", hr); ok(value64 == 123, "Unexpected value.\n"); hr = IMFAttributes_GetDouble(dest, &IID_IUnknown, &value_dbl); - ok(hr == S_OK, "Failed to get get double value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get get double value, hr %#x.\n", hr); ok(value_dbl == 0.5, "Unexpected value.\n"); hr = IMFAttributes_GetUnknown(dest, &IID_IMFAttributes, &IID_IUnknown, (void **)&obj); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_GetGUID(dest, &GUID_NULL, &guid); - ok(hr == S_OK, "Failed to get guid value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get guid value, hr %#x.\n", hr); ok(IsEqualGUID(&guid, &IID_IUnknown), "Unexpected guid.\n"); hr = IMFAttributes_GetAllocatedString(dest, &DUMMY_CLSID, &str, &size); - ok(hr == S_OK, "Failed to get string value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get string value, hr %#x.\n", hr); ok(!lstrcmpW(str, L"Text"), "Unexpected string.\n"); CoTaskMemFree(str); hr = IMFAttributes_GetAllocatedBlob(dest, &DUMMY_GUID1, &buffer, &size); - ok(hr == S_OK, "Failed to get blob value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get blob value, hr %#x.\n", hr); ok(!memcmp(buffer, blob, sizeof(blob)), "Unexpected blob.\n"); CoTaskMemFree(buffer); @@ -4477,49 +4391,49 @@ static void test_wrapped_media_type(void) GUID guid; hr = MFCreateMediaType(&mediatype); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); hr = MFUnwrapMediaType(mediatype, &mediatype2); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetUINT32(mediatype, &GUID_NULL, 1); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaType_SetUINT32(mediatype, &DUMMY_GUID1, 2); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set GUID value, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set GUID value, hr %#x.\n", hr); hr = MFWrapMediaType(mediatype, &MFMediaType_Audio, &IID_IUnknown, &mediatype2); - ok(hr == S_OK, "Failed to create wrapped media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create wrapped media type, hr %#x.\n", hr); hr = IMFMediaType_GetGUID(mediatype2, &MF_MT_MAJOR_TYPE, &guid); - ok(hr == S_OK, "Failed to get major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get major type, hr %#x.\n", hr); ok(IsEqualGUID(&guid, &MFMediaType_Audio), "Unexpected major type.\n"); hr = IMFMediaType_GetGUID(mediatype2, &MF_MT_SUBTYPE, &guid); - ok(hr == S_OK, "Failed to get subtype, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get subtype, hr %#x.\n", hr); ok(IsEqualGUID(&guid, &IID_IUnknown), "Unexpected major type.\n"); hr = IMFMediaType_GetCount(mediatype2, &count); - ok(hr == S_OK, "Failed to get item count, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item count, hr %#x.\n", hr); ok(count == 3, "Unexpected count %u.\n", count); hr = IMFMediaType_GetItemType(mediatype2, &MF_MT_WRAPPED_TYPE, &type); - ok(hr == S_OK, "Failed to get item type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get item type, hr %#x.\n", hr); ok(type == MF_ATTRIBUTE_BLOB, "Unexpected item type.\n"); IMFMediaType_Release(mediatype); hr = MFUnwrapMediaType(mediatype2, &mediatype); - ok(hr == S_OK, "Failed to unwrap, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unwrap, hr %#x.\n", hr); hr = IMFMediaType_GetGUID(mediatype, &MF_MT_MAJOR_TYPE, &guid); - ok(hr == S_OK, "Failed to get major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get major type, hr %#x.\n", hr); ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type.\n"); hr = IMFMediaType_GetGUID(mediatype, &MF_MT_SUBTYPE, &guid); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); IMFMediaType_Release(mediatype); IMFMediaType_Release(mediatype2); @@ -4544,36 +4458,36 @@ static void test_MFCreateWaveFormatExFromMFMediaType(void) HRESULT hr; hr = MFCreateMediaType(&mediatype); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); hr = MFCreateWaveFormatExFromMFMediaType(mediatype, &format, &size, MFWaveFormatExConvertFlag_Normal); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = MFCreateWaveFormatExFromMFMediaType(mediatype, &format, &size, MFWaveFormatExConvertFlag_Normal); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_SUBTYPE, &MFMediaType_Video); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(wave_fmt_tests); ++i) { hr = IMFMediaType_SetGUID(mediatype, &MF_MT_SUBTYPE, wave_fmt_tests[i].subtype); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = MFCreateWaveFormatExFromMFMediaType(mediatype, &format, &size, MFWaveFormatExConvertFlag_Normal); - ok(hr == S_OK, "Failed to create format, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create format, hr %#x.\n", hr); ok(format != NULL, "Expected format structure.\n"); ok(size == sizeof(*format), "Unexpected size %u.\n", size); ok(format->wFormatTag == wave_fmt_tests[i].format_tag, "Expected tag %u, got %u.\n", wave_fmt_tests[i].format_tag, format->wFormatTag); ok(format->nChannels == 0, "Unexpected number of channels, %u.\n", format->nChannels); - ok(format->nSamplesPerSec == 0, "Unexpected sample rate, %lu.\n", format->nSamplesPerSec); - ok(format->nAvgBytesPerSec == 0, "Unexpected average data rate rate, %lu.\n", format->nAvgBytesPerSec); + ok(format->nSamplesPerSec == 0, "Unexpected sample rate, %u.\n", format->nSamplesPerSec); + ok(format->nAvgBytesPerSec == 0, "Unexpected average data rate rate, %u.\n", format->nAvgBytesPerSec); ok(format->nBlockAlign == 0, "Unexpected alignment, %u.\n", format->nBlockAlign); ok(format->wBitsPerSample == 0, "Unexpected sample size, %u.\n", format->wBitsPerSample); ok(format->cbSize == 0, "Unexpected size field, %u.\n", format->cbSize); @@ -4581,13 +4495,13 @@ static void test_MFCreateWaveFormatExFromMFMediaType(void) hr = MFCreateWaveFormatExFromMFMediaType(mediatype, (WAVEFORMATEX **)&format_ext, &size, MFWaveFormatExConvertFlag_ForceExtensible); - ok(hr == S_OK, "Failed to create format, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create format, hr %#x.\n", hr); ok(format_ext != NULL, "Expected format structure.\n"); ok(size == sizeof(*format_ext), "Unexpected size %u.\n", size); ok(format_ext->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "Unexpected tag.\n"); ok(format_ext->Format.nChannels == 0, "Unexpected number of channels, %u.\n", format_ext->Format.nChannels); - ok(format_ext->Format.nSamplesPerSec == 0, "Unexpected sample rate, %lu.\n", format_ext->Format.nSamplesPerSec); - ok(format_ext->Format.nAvgBytesPerSec == 0, "Unexpected average data rate rate, %lu.\n", + ok(format_ext->Format.nSamplesPerSec == 0, "Unexpected sample rate, %u.\n", format_ext->Format.nSamplesPerSec); + ok(format_ext->Format.nAvgBytesPerSec == 0, "Unexpected average data rate rate, %u.\n", format_ext->Format.nAvgBytesPerSec); ok(format_ext->Format.nBlockAlign == 0, "Unexpected alignment, %u.\n", format_ext->Format.nBlockAlign); ok(format_ext->Format.wBitsPerSample == 0, "Unexpected sample size, %u.\n", format_ext->Format.wBitsPerSample); @@ -4596,7 +4510,7 @@ static void test_MFCreateWaveFormatExFromMFMediaType(void) CoTaskMemFree(format_ext); hr = MFCreateWaveFormatExFromMFMediaType(mediatype, &format, &size, MFWaveFormatExConvertFlag_ForceExtensible + 1); - ok(hr == S_OK, "Failed to create format, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create format, hr %#x.\n", hr); ok(size == sizeof(*format), "Unexpected size %u.\n", size); CoTaskMemFree(format); } @@ -4616,10 +4530,10 @@ static HRESULT WINAPI test_create_file_callback_Invoke(IMFAsyncCallback *iface, ok((IUnknown *)iface == IMFAsyncResult_GetStateNoAddRef(result), "Unexpected result state.\n"); hr = IMFAsyncResult_GetObject(result, &object); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = MFEndCreateFile(result, &stream); - ok(hr == S_OK, "Failed to get file stream, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get file stream, hr %#x.\n", hr); IMFByteStream_Release(stream); SetEvent(callback->event); @@ -4647,7 +4561,7 @@ static void test_async_create_file(void) callback = create_test_callback(&test_create_file_callback_vtbl); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Fail to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Fail to start up, hr %#x.\n", hr); callback->event = CreateEventA(NULL, FALSE, FALSE, NULL); @@ -4656,7 +4570,7 @@ static void test_async_create_file(void) hr = MFBeginCreateFile(MF_ACCESSMODE_READWRITE, MF_OPENMODE_DELETE_IF_EXIST, MF_FILEFLAGS_NONE, fileW, &callback->IMFAsyncCallback_iface, (IUnknown *)&callback->IMFAsyncCallback_iface, &cancel_cookie); - ok(hr == S_OK, "Async create request failed, hr %#lx.\n", hr); + ok(hr == S_OK, "Async create request failed, hr %#x.\n", hr); ok(cancel_cookie != NULL, "Unexpected cancellation object.\n"); WaitForSingleObject(callback->event, INFINITE); @@ -4666,7 +4580,7 @@ static void test_async_create_file(void) CloseHandle(callback->event); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); IMFAsyncCallback_Release(&callback->IMFAsyncCallback_iface); @@ -4927,34 +4841,34 @@ static void test_local_handlers(void) } hr = pMFRegisterLocalSchemeHandler(NULL, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = pMFRegisterLocalSchemeHandler(localW, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = pMFRegisterLocalSchemeHandler(NULL, &local_activate); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = pMFRegisterLocalSchemeHandler(localW, &local_activate); - ok(hr == S_OK, "Failed to register scheme handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register scheme handler, hr %#x.\n", hr); hr = pMFRegisterLocalSchemeHandler(localW, &local_activate); - ok(hr == S_OK, "Failed to register scheme handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register scheme handler, hr %#x.\n", hr); hr = pMFRegisterLocalByteStreamHandler(NULL, NULL, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = pMFRegisterLocalByteStreamHandler(NULL, NULL, &local_activate); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = pMFRegisterLocalByteStreamHandler(NULL, localW, &local_activate); - ok(hr == S_OK, "Failed to register stream handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register stream handler, hr %#x.\n", hr); hr = pMFRegisterLocalByteStreamHandler(localW, NULL, &local_activate); - ok(hr == S_OK, "Failed to register stream handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register stream handler, hr %#x.\n", hr); hr = pMFRegisterLocalByteStreamHandler(localW, localW, &local_activate); - ok(hr == S_OK, "Failed to register stream handler, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register stream handler, hr %#x.\n", hr); } static void test_create_property_store(void) @@ -4968,13 +4882,13 @@ static void test_create_property_store(void) HRESULT hr; hr = CreatePropertyStore(NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = CreatePropertyStore(&store); - ok(hr == S_OK, "Failed to create property store, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create property store, hr %#x.\n", hr); hr = CreatePropertyStore(&store2); - ok(hr == S_OK, "Failed to create property store, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create property store, hr %#x.\n", hr); ok(store2 != store, "Expected different store objects.\n"); IPropertyStore_Release(store2); @@ -4982,77 +4896,77 @@ static void test_create_property_store(void) check_interface(store, &IID_IPersistSerializedPropStorage, FALSE); hr = IPropertyStore_GetCount(store, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); count = 0xdeadbeef; hr = IPropertyStore_GetCount(store, &count); - ok(hr == S_OK, "Failed to get count, hr %#lx.\n", hr); - ok(!count, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get count, hr %#x.\n", hr); + ok(!count, "Unexpected count %u.\n", count); hr = IPropertyStore_Commit(store); - ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr); hr = IPropertyStore_GetAt(store, 0, &key); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IPropertyStore_GetValue(store, NULL, &value); - ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); hr = IPropertyStore_GetValue(store, &test_pkey, NULL); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IPropertyStore_GetValue(store, &test_pkey, &value); - ok(hr == S_FALSE, "Unexpected hr %#lx.\n", hr); + ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); memset(&value, 0, sizeof(PROPVARIANT)); value.vt = VT_I4; value.lVal = 0xdeadbeef; hr = IPropertyStore_SetValue(store, &test_pkey, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); if (0) { /* crashes on Windows */ hr = IPropertyStore_SetValue(store, NULL, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); } hr = IPropertyStore_GetCount(store, &count); - ok(hr == S_OK, "Failed to get count, hr %#lx.\n", hr); - ok(count == 1, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get count, hr %#x.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); hr = IPropertyStore_Commit(store); - ok(hr == E_NOTIMPL, "Unexpected hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr); hr = IPropertyStore_GetAt(store, 0, &key); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!memcmp(&key, &test_pkey, sizeof(PROPERTYKEY)), "Keys didn't match.\n"); hr = IPropertyStore_GetAt(store, 1, &key); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); memset(&value, 0xcc, sizeof(PROPVARIANT)); hr = IPropertyStore_GetValue(store, &test_pkey, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(value.vt == VT_I4, "Unexpected type %u.\n", value.vt); - ok(value.lVal == 0xdeadbeef, "Unexpected value %#lx.\n", value.lVal); + ok(value.lVal == 0xdeadbeef, "Unexpected value %#x.\n", value.lVal); memset(&value, 0, sizeof(PROPVARIANT)); hr = IPropertyStore_SetValue(store, &test_pkey, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IPropertyStore_GetCount(store, &count); - ok(hr == S_OK, "Failed to get count, hr %#lx.\n", hr); - ok(count == 1, "Unexpected count %lu.\n", count); + ok(hr == S_OK, "Failed to get count, hr %#x.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); memset(&value, 0xcc, sizeof(PROPVARIANT)); hr = IPropertyStore_GetValue(store, &test_pkey, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(value.vt == VT_EMPTY, "Unexpected type %u.\n", value.vt); - ok(!value.lVal, "Unexpected value %#lx.\n", value.lVal); + ok(!value.lVal, "Unexpected value %#x.\n", value.lVal); refcount = IPropertyStore_Release(store); - ok(!refcount, "Unexpected refcount %lu.\n", refcount); + ok(!refcount, "Unexpected refcount %u.\n", refcount); } struct test_thread_param @@ -5098,184 +5012,184 @@ static void test_dxgi_device_manager(void) } hr = pMFCreateDXGIDeviceManager(NULL, &manager); - ok(hr == E_POINTER, "MFCreateDXGIDeviceManager should failed: %#lx.\n", hr); + ok(hr == E_POINTER, "MFCreateDXGIDeviceManager should failed: %#x.\n", hr); token = 0; hr = pMFCreateDXGIDeviceManager(&token, NULL); - ok(hr == E_POINTER, "MFCreateDXGIDeviceManager should failed: %#lx.\n", hr); + ok(hr == E_POINTER, "MFCreateDXGIDeviceManager should failed: %#x.\n", hr); ok(!token, "got wrong token: %u.\n", token); hr = pMFCreateDXGIDeviceManager(&token, &manager); - ok(hr == S_OK, "MFCreateDXGIDeviceManager failed: %#lx.\n", hr); + ok(hr == S_OK, "MFCreateDXGIDeviceManager failed: %#x.\n", hr); EXPECT_REF(manager, 1); ok(!!token, "got wrong token: %u.\n", token); Sleep(50); token2 = 0; hr = pMFCreateDXGIDeviceManager(&token2, &manager2); - ok(hr == S_OK, "MFCreateDXGIDeviceManager failed: %#lx.\n", hr); + ok(hr == S_OK, "MFCreateDXGIDeviceManager failed: %#x.\n", hr); EXPECT_REF(manager2, 1); ok(token2 && token2 != token, "got wrong token: %u, %u.\n", token2, token); ok(manager != manager2, "got wrong pointer: %p.\n", manager2); EXPECT_REF(manager, 1); hr = IMFDXGIDeviceManager_GetVideoService(manager, NULL, &IID_ID3D11Device, (void **)&unk); - ok(hr == MF_E_DXGI_DEVICE_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_DXGI_DEVICE_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle); - ok(hr == MF_E_DXGI_DEVICE_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_DXGI_DEVICE_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, 0); - ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr); + ok(hr == E_HANDLE, "Unexpected hr %#x.\n", hr); hr = pD3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_VIDEO_SUPPORT, NULL, 0, D3D11_SDK_VERSION, &d3d11_dev, NULL, NULL); - ok(hr == S_OK, "D3D11CreateDevice failed: %#lx.\n", hr); + ok(hr == S_OK, "D3D11CreateDevice failed: %#x.\n", hr); EXPECT_REF(d3d11_dev, 1); hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)d3d11_dev, token - 1); - ok(hr == E_INVALIDARG, "IMFDXGIDeviceManager_ResetDevice should failed: %#lx.\n", hr); + ok(hr == E_INVALIDARG, "IMFDXGIDeviceManager_ResetDevice should failed: %#x.\n", hr); EXPECT_REF(d3d11_dev, 1); hr = IMFDXGIDeviceManager_ResetDevice(manager, NULL, token); - ok(hr == E_INVALIDARG, "IMFDXGIDeviceManager_ResetDevice should failed: %#lx.\n", hr); + ok(hr == E_INVALIDARG, "IMFDXGIDeviceManager_ResetDevice should failed: %#x.\n", hr); hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)d3d11_dev, token); - ok(hr == S_OK, "IMFDXGIDeviceManager_ResetDevice failed: %#lx.\n", hr); + ok(hr == S_OK, "IMFDXGIDeviceManager_ResetDevice failed: %#x.\n", hr); EXPECT_REF(manager, 1); EXPECT_REF(d3d11_dev, 2); hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)manager2, token); - ok(hr == E_INVALIDARG, "IMFDXGIDeviceManager_ResetDevice should failed: %#lx.\n", hr); + ok(hr == E_INVALIDARG, "IMFDXGIDeviceManager_ResetDevice should failed: %#x.\n", hr); EXPECT_REF(manager2, 1); EXPECT_REF(d3d11_dev, 2); hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)d3d11_dev, token); - ok(hr == S_OK, "IMFDXGIDeviceManager_ResetDevice failed: %#lx.\n", hr); + ok(hr == S_OK, "IMFDXGIDeviceManager_ResetDevice failed: %#x.\n", hr); EXPECT_REF(manager, 1); EXPECT_REF(d3d11_dev, 2); /* GetVideoService() on device change. */ handle = NULL; hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!handle, "Unexpected handle value %p.\n", handle); hr = pD3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &d3d11_dev2, NULL, NULL); - ok(hr == S_OK, "D3D11CreateDevice failed: %#lx.\n", hr); + ok(hr == S_OK, "D3D11CreateDevice failed: %#x.\n", hr); EXPECT_REF(d3d11_dev2, 1); hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)d3d11_dev2, token); - ok(hr == S_OK, "IMFDXGIDeviceManager_ResetDevice failed: %#lx.\n", hr); + ok(hr == S_OK, "IMFDXGIDeviceManager_ResetDevice failed: %#x.\n", hr); EXPECT_REF(manager, 1); EXPECT_REF(d3d11_dev2, 2); EXPECT_REF(d3d11_dev, 1); hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_ID3D11Device, (void **)&unk); - ok(hr == MF_E_DXGI_NEW_VIDEO_DEVICE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_DXGI_NEW_VIDEO_DEVICE, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); handle = NULL; hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!handle, "Unexpected handle value %p.\n", handle); hr = IMFDXGIDeviceManager_GetVideoService(manager, NULL, &IID_ID3D11Device, (void **)&unk); - ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr); + ok(hr == E_HANDLE, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_ID3D11Device, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IUnknown_Release(unk); hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IUnknown_Release(unk); hr = IMFDXGIDeviceManager_GetVideoService(manager, handle, &IID_IDXGIDevice, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IUnknown_Release(unk); handle1 = NULL; hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(handle != handle1, "Unexpected handle.\n"); hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* Already closed. */ hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle); - ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr); + ok(hr == E_HANDLE, "Unexpected hr %#x.\n", hr); handle = NULL; hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_TestDevice(manager, handle1); - ok(hr == E_HANDLE, "Unexpected hr %#lx.\n", hr); + ok(hr == E_HANDLE, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_LockDevice(manager, handle, &IID_ID3D11Device, (void **)&device, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(device == d3d11_dev2, "Unexpected device pointer.\n"); ID3D11Device_Release(device); hr = IMFDXGIDeviceManager_UnlockDevice(manager, handle, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_UnlockDevice(manager, handle, FALSE); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_UnlockDevice(manager, UlongToHandle(100), FALSE); - ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + ok(hr == E_FAIL, "Unexpected hr %#x.\n", hr); /* Locked with one handle, unlock with another. */ hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_LockDevice(manager, handle, &IID_ID3D11Device, (void **)&device, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_UnlockDevice(manager, handle1, FALSE); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); ID3D11Device_Release(device); /* Closing unlocks the device. */ hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_LockDevice(manager, handle1, &IID_ID3D11Device, (void **)&device, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ID3D11Device_Release(device); hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* Open two handles. */ hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_OpenDeviceHandle(manager, &handle1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_LockDevice(manager, handle, &IID_ID3D11Device, (void **)&device, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ID3D11Device_Release(device); hr = IMFDXGIDeviceManager_LockDevice(manager, handle1, &IID_ID3D11Device, (void **)&device, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ID3D11Device_Release(device); hr = IMFDXGIDeviceManager_UnlockDevice(manager, handle, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_UnlockDevice(manager, handle, FALSE); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); param.manager = manager; param.handle = handle; @@ -5283,18 +5197,18 @@ static void test_dxgi_device_manager(void) thread = CreateThread(NULL, 0, test_device_manager_thread, ¶m, 0, NULL); ok(!WaitForSingleObject(thread, 1000), "Wait for a test thread failed.\n"); GetExitCodeThread(thread, (DWORD *)&hr); - ok(hr == MF_E_DXGI_VIDEO_DEVICE_LOCKED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_DXGI_VIDEO_DEVICE_LOCKED, "Unexpected hr %#x.\n", hr); CloseHandle(thread); hr = IMFDXGIDeviceManager_UnlockDevice(manager, handle1, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_UnlockDevice(manager, handle1, FALSE); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); /* Lock on main thread, unlock on another. */ hr = IMFDXGIDeviceManager_LockDevice(manager, handle, &IID_ID3D11Device, (void **)&device, FALSE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ID3D11Device_Release(device); param.manager = manager; @@ -5303,14 +5217,14 @@ static void test_dxgi_device_manager(void) thread = CreateThread(NULL, 0, test_device_manager_thread, ¶m, 0, NULL); ok(!WaitForSingleObject(thread, 1000), "Wait for a test thread failed.\n"); GetExitCodeThread(thread, (DWORD *)&hr); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); CloseHandle(thread); hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle1); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIDeviceManager_CloseDeviceHandle(manager, handle); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMFDXGIDeviceManager_Release(manager); EXPECT_REF(d3d11_dev2, 1); @@ -5332,10 +5246,10 @@ static void test_MFCreateTransformActivate(void) } hr = pMFCreateTransformActivate(&activate); - ok(hr == S_OK, "Failed to create activator, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create activator, hr %#x.\n", hr); hr = IMFActivate_GetCount(activate, &count); - ok(hr == S_OK, "Failed to get count, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get count, hr %#x.\n", hr); ok(!count, "Unexpected attribute count %u.\n", count); IMFActivate_Release(activate); @@ -5404,49 +5318,49 @@ static void test_MFTRegisterLocal(void) input_types[0].guidMajorType = MFMediaType_Audio; input_types[0].guidSubtype = MFAudioFormat_PCM; hr = pMFTRegisterLocal(&test_factory, &MFT_CATEGORY_OTHER, L"Local MFT name", 0, 1, input_types, 0, NULL); - ok(hr == S_OK, "Failed to register MFT, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register MFT, hr %#x.\n", hr); hr = pMFTRegisterLocal(&test_factory, &MFT_CATEGORY_OTHER, L"Local MFT name", 0, 1, input_types, 0, NULL); - ok(hr == S_OK, "Failed to register MFT, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register MFT, hr %#x.\n", hr); hr = pMFTEnumEx(MFT_CATEGORY_OTHER, MFT_ENUM_FLAG_LOCALMFT, NULL, NULL, &activate, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(count > 0, "Unexpected count %u.\n", count); CoTaskMemFree(activate); hr = pMFTUnregisterLocal(&test_factory); - ok(hr == S_OK, "Failed to unregister MFT, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unregister MFT, hr %#x.\n", hr); hr = pMFTEnumEx(MFT_CATEGORY_OTHER, MFT_ENUM_FLAG_LOCALMFT, NULL, NULL, &activate, &count2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(count2 < count, "Unexpected count %u.\n", count2); CoTaskMemFree(activate); hr = pMFTUnregisterLocal(&test_factory); - ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Unexpected hr %#x.\n", hr); hr = pMFTUnregisterLocal(NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = pMFTRegisterLocalByCLSID(&MFT_CATEGORY_OTHER, &MFT_CATEGORY_OTHER, L"Local MFT name 2", 0, 1, input_types, 0, NULL); - ok(hr == S_OK, "Failed to register MFT, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register MFT, hr %#x.\n", hr); hr = MFTGetInfo(MFT_CATEGORY_OTHER, &name, &in_types, &count, &out_types, &count2, &attributes); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#x.\n", hr); hr = pMFTUnregisterLocal(NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = pMFTUnregisterLocalByCLSID(MFT_CATEGORY_OTHER); - ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "Unexpected hr %#x.\n", hr); hr = pMFTRegisterLocalByCLSID(&MFT_CATEGORY_OTHER, &MFT_CATEGORY_OTHER, L"Local MFT name 2", 0, 1, input_types, 0, NULL); - ok(hr == S_OK, "Failed to register MFT, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to register MFT, hr %#x.\n", hr); hr = pMFTUnregisterLocalByCLSID(MFT_CATEGORY_OTHER); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); } static void test_queue_com(void) @@ -5515,16 +5429,16 @@ static HRESULT WINAPI test_queue_com_state_callback_Invoke(IMFAsyncCallback *ifa HRESULT hr; hr = pCoGetApartmentType(&com_type, &qualifier); - ok(SUCCEEDED(hr), "Failed to get apartment type, hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Failed to get apartment type, hr %#x.\n", hr); if (SUCCEEDED(hr)) { todo_wine { if (callback->param == MFASYNC_CALLBACK_QUEUE_LONG_FUNCTION) ok(com_type == APTTYPE_MAINSTA && qualifier == APTTYPEQUALIFIER_NONE, - "%#lx: unexpected type %u, qualifier %u.\n", callback->param, com_type, qualifier); + "%#x: unexpected type %u, qualifier %u.\n", callback->param, com_type, qualifier); else ok(com_type == APTTYPE_MTA && qualifier == APTTYPEQUALIFIER_NONE, - "%#lx: unexpected type %u, qualifier %u.\n", callback->param, com_type, qualifier); + "%#x: unexpected type %u, qualifier %u.\n", callback->param, com_type, qualifier); } } @@ -5551,13 +5465,13 @@ static void test_queue_com_state(const char *name) callback->event = CreateEventA(NULL, FALSE, FALSE, NULL); hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); if (name[0] == 's') { callback->param = name[1] - '0'; hr = MFPutWorkItem(callback->param, &callback->IMFAsyncCallback_iface, NULL); - ok(SUCCEEDED(hr), "Failed to queue work item, hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Failed to queue work item, hr %#x.\n", hr); WaitForSingleObject(callback->event, INFINITE); } else if (name[0] == 'u') @@ -5566,24 +5480,24 @@ static void test_queue_com_state(const char *name) hr = pMFAllocateWorkQueueEx(queue_type, &queue); ok(hr == S_OK || broken(queue_type == MF_MULTITHREADED_WORKQUEUE && hr == E_INVALIDARG) /* Win7 */, - "Failed to allocate a queue of type %lu, hr %#lx.\n", queue_type, hr); + "Failed to allocate a queue of type %u, hr %#x.\n", queue_type, hr); if (SUCCEEDED(hr)) { callback->param = queue; hr = MFPutWorkItem(queue, &callback->IMFAsyncCallback_iface, NULL); - ok(SUCCEEDED(hr), "Failed to queue work item, hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Failed to queue work item, hr %#x.\n", hr); WaitForSingleObject(callback->event, INFINITE); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Failed to unlock the queue, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock the queue, hr %#x.\n", hr); } } CloseHandle(callback->event); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); IMFAsyncCallback_Release(&callback->IMFAsyncCallback_iface); } @@ -5658,13 +5572,13 @@ static void test_MFGetStrideForBitmapInfoHeader(void) } hr = pMFGetStrideForBitmapInfoHeader(MAKEFOURCC('H','2','6','4'), 1, &stride); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(stride_tests); ++i) { hr = pMFGetStrideForBitmapInfoHeader(stride_tests[i].subtype->Data1, stride_tests[i].width, &stride); - ok(hr == S_OK, "%u: failed to get stride, hr %#lx.\n", i, hr); - ok(stride == stride_tests[i].stride, "%u: format %s, unexpected stride %ld, expected %ld.\n", i, + ok(hr == S_OK, "%u: failed to get stride, hr %#x.\n", i, hr); + ok(stride == stride_tests[i].stride, "%u: format %s, unexpected stride %d, expected %d.\n", i, wine_dbgstr_an((char *)&stride_tests[i].subtype->Data1, 4), stride, stride_tests[i].stride); } } @@ -5725,15 +5639,12 @@ static void test_MFCreate2DMediaBuffer(void) { 1, 4, D3DFMT_A8R8G8B8, 16, 64 }, { 4, 1, D3DFMT_A8R8G8B8, 16, 64 }, }; - static const char two_aas[] = { 0xaa, 0xaa }; - static const char eight_bbs[] = { 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb }; - DWORD max_length, length, length2; + unsigned int max_length, length, length2; BYTE *buffer_start, *data, *data2; - LONG pitch, pitch2, stride; + int i, j, k, pitch, pitch2, stride; IMF2DBuffer2 *_2dbuffer2; IMF2DBuffer *_2dbuffer; IMFMediaBuffer *buffer; - int i, j, k; HRESULT hr; BOOL ret; @@ -5744,174 +5655,160 @@ static void test_MFCreate2DMediaBuffer(void) } hr = pMFCreate2DMediaBuffer(2, 3, MAKEFOURCC('H','2','6','4'), FALSE, &buffer); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); hr = pMFCreate2DMediaBuffer(2, 3, MAKEFOURCC('N','V','1','2'), FALSE, NULL); - ok(FAILED(hr), "Unexpected hr %#lx.\n", hr); + ok(FAILED(hr), "Unexpected hr %#x.\n", hr); /* YUV formats can't be bottom-up. */ hr = pMFCreate2DMediaBuffer(2, 3, MAKEFOURCC('N','V','1','2'), TRUE, &buffer); - ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); hr = pMFCreate2DMediaBuffer(2, 3, MAKEFOURCC('N','V','1','2'), FALSE, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); check_interface(buffer, &IID_IMFGetService, TRUE); check_interface(buffer, &IID_IMF2DBuffer, TRUE); /* Full backing buffer size, with 64 bytes per row alignment. */ hr = IMFMediaBuffer_GetMaxLength(buffer, &max_length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(max_length > 0, "Unexpected length %lu.\n", max_length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(max_length > 0, "Unexpected length %u.\n", max_length); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); - ok(hr == S_OK, "Failed to get current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get current length, hr %#x.\n", hr); ok(!length, "Unexpected length.\n"); hr = IMFMediaBuffer_SetCurrentLength(buffer, 10); - ok(hr == S_OK, "Failed to set current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set current length, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); - ok(hr == S_OK, "Failed to get current length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get current length, hr %#x.\n", hr); ok(length == 10, "Unexpected length.\n"); /* Linear lock/unlock. */ hr = IMFMediaBuffer_Lock(buffer, NULL, &max_length, &length); - ok(FAILED(hr), "Unexpected hr %#lx.\n", hr); + ok(FAILED(hr), "Unexpected hr %#x.\n", hr); /* Linear locking call returns plane size.*/ hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &length); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); ok(max_length == length, "Unexpected length.\n"); - memset(data, 0xaa, length); - length = 0; pMFGetPlaneSize(MAKEFOURCC('N','V','1','2'), 2, 3, &length); - ok(max_length == length && length == 9, "Unexpected length %lu.\n", length); + ok(max_length == length && length == 9, "Unexpected length %u.\n", length); /* Already locked */ hr = IMFMediaBuffer_Lock(buffer, &data2, NULL, NULL); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); ok(data2 == data, "Unexpected pointer.\n"); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2dbuffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); hr = IMF2DBuffer_GetContiguousLength(_2dbuffer, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetContiguousLength(_2dbuffer, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(length == 9, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(length == 9, "Unexpected length %u.\n", length); hr = IMF2DBuffer_IsContiguousFormat(_2dbuffer, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); /* 2D lock. */ hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - ok(hr == MF_E_UNEXPECTED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_UNEXPECTED, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetScanline0AndPitch(_2dbuffer, &data, &pitch); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMF2DBuffer_GetScanline0AndPitch(_2dbuffer, &data, &pitch); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2dbuffer, NULL, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2dbuffer, NULL, &pitch); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); ok(!!data, "Expected data pointer.\n"); - ok(pitch == 64, "Unexpected pitch %ld.\n", pitch); - - for (i = 0; i < 4; i++) - ok(memcmp(&data[64 * i], two_aas, sizeof(two_aas)) == 0, "Invalid data instead of 0xaa.\n"); - memset(data, 0xbb, 194); + ok(pitch == 64, "Unexpected pitch %d.\n", pitch); hr = IMF2DBuffer_Lock2D(_2dbuffer, &data2, &pitch); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); ok(data == data2, "Expected data pointer.\n"); hr = IMF2DBuffer_GetScanline0AndPitch(_2dbuffer, NULL, &pitch); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetScanline0AndPitch(_2dbuffer, &data, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); /* Active 2D lock */ hr = IMFMediaBuffer_Lock(buffer, &data2, NULL, NULL); - ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_Lock(buffer, &data2, NULL, NULL); - ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); - - ok(memcmp(data, eight_bbs, sizeof(eight_bbs)) == 0, "Invalid data instead of 0xbb.\n"); - - hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer2, (void **)&_2dbuffer2); - ok(hr == S_OK || broken(hr == E_NOINTERFACE), "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == E_NOINTERFACE), "Failed to get interface, hr %#x.\n", hr); if (SUCCEEDED(hr)) { hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data2, &pitch, &buffer_start, &length); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); /* Flags are ignored. */ hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data2, &pitch, &buffer_start, &length); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data2, &pitch, &buffer_start, &length); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data2, &pitch, NULL, &length); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data2, &pitch, &buffer_start, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); IMF2DBuffer2_Release(_2dbuffer2); } @@ -5927,44 +5824,44 @@ static void test_MFCreate2DMediaBuffer(void) const struct _2d_buffer_test *ptr = &_2d_buffer_tests[i]; hr = pMFCreate2DMediaBuffer(ptr->width, ptr->height, ptr->fourcc, FALSE, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_GetMaxLength(buffer, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); if (ptr->max_length) - ok(length == ptr->max_length, "%u: unexpected maximum length %lu for %u x %u, format %s.\n", + ok(length == ptr->max_length, "%u: unexpected maximum length %u for %u x %u, format %s.\n", i, length, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2dbuffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); hr = IMF2DBuffer_GetContiguousLength(_2dbuffer, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(length == ptr->contiguous_length, "%d: unexpected contiguous length %lu for %u x %u, format %s.\n", + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(length == ptr->contiguous_length, "%d: unexpected contiguous length %u for %u x %u, format %s.\n", i, length, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); hr = IMFMediaBuffer_Lock(buffer, &data, &length2, NULL); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); - ok(length2 == ptr->contiguous_length, "%d: unexpected linear buffer length %lu for %u x %u, format %s.\n", + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); + ok(length2 == ptr->contiguous_length, "%d: unexpected linear buffer length %u for %u x %u, format %s.\n", i, length2, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); memset(data, 0xff, length2); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); hr = pMFGetPlaneSize(ptr->fourcc, ptr->width, ptr->height, &length2); - ok(hr == S_OK, "Failed to get plane size, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get plane size, hr %#x.\n", hr); if (ptr->plane_multiplier) length2 *= ptr->plane_multiplier; - ok(length2 == length, "%d: contiguous length %lu does not match plane size %lu, %u x %u, format %s.\n", i, length, + ok(length2 == length, "%d: contiguous length %u does not match plane size %u, %u x %u, format %s.\n", i, length, length2, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to lock buffer, hr %#x.\n", hr); hr = IMF2DBuffer_GetScanline0AndPitch(_2dbuffer, &data2, &pitch2); - ok(hr == S_OK, "Failed to get scanline, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get scanline, hr %#x.\n", hr); ok(data2 == data, "Unexpected data pointer.\n"); ok(pitch == pitch2, "Unexpected pitch.\n"); @@ -5974,7 +5871,7 @@ static void test_MFCreate2DMediaBuffer(void) ok(data[j * pitch + k] == 0xff, "Unexpected byte %02x at test %d row %d column %d.\n", data[j * pitch + k], i, j, k); hr = pMFGetStrideForBitmapInfoHeader(ptr->fourcc, ptr->width, &stride); - ok(hr == S_OK, "Failed to get stride, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get stride, hr %#x.\n", hr); /* secondary planes */ switch (ptr->fourcc) @@ -6007,42 +5904,20 @@ static void test_MFCreate2DMediaBuffer(void) } hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to unlock buffer, hr %#x.\n", hr); - ok(pitch == ptr->pitch, "%d: unexpected pitch %ld, expected %d, %u x %u, format %s.\n", i, pitch, ptr->pitch, + ok(pitch == ptr->pitch, "%d: unexpected pitch %d, expected %d, %u x %u, format %s.\n", i, pitch, ptr->pitch, ptr->width, ptr->height, wine_dbgstr_an((char *)&ptr->fourcc, 4)); ret = TRUE; hr = IMF2DBuffer_IsContiguousFormat(_2dbuffer, &ret); - ok(hr == S_OK, "Failed to get format flag, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get format flag, hr %#x.\n", hr); ok(!ret, "%d: unexpected format flag %d.\n", i, ret); IMF2DBuffer_Release(_2dbuffer); IMFMediaBuffer_Release(buffer); } - - /* Alignment tests */ - for (i = 0; i < ARRAY_SIZE(_2d_buffer_tests); ++i) - { - const struct _2d_buffer_test *ptr = &_2d_buffer_tests[i]; - - hr = pMFCreate2DMediaBuffer(ptr->width, ptr->height, ptr->fourcc, FALSE, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); - - hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2dbuffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); - - hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - ok(hr == S_OK, "Failed to lock buffer, hr %#lx.\n", hr); - ok(((uintptr_t)data & MF_64_BYTE_ALIGNMENT) == 0, "Misaligned data at %p.\n", data); - - hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Failed to unlock buffer, hr %#lx.\n", hr); - - IMF2DBuffer_Release(_2dbuffer); - IMFMediaBuffer_Release(buffer); - } } static void test_MFCreateMediaBufferFromMediaType(void) @@ -6057,21 +5932,18 @@ static void test_MFCreateMediaBufferFromMediaType(void) unsigned int buffer_length; } audio_tests[] = { - { 0, 0, 0, 4, 0, 20 }, - { 0, 16, 0, 4, 0, 20 }, - { 0, 0, 32, 4, 0, 36 }, - { 0, 64, 32, 4, 0, 64 }, - { 1, 0, 0, 4, 16, 36 }, - { 2, 0, 0, 4, 16, 52 }, - { 2, 0, 64, 4, 16, 68 }, - { 2, 0, 128, 4, 16,132 }, + { 0, 0, 0, 4, 0, 20 }, + { 0, 16, 0, 4, 0, 20 }, + { 0, 0, 32, 4, 0, 36 }, + { 0, 64, 32, 4, 0, 64 }, + { 1, 0, 0, 4, 16, 36 }, + { 2, 0, 0, 4, 16, 52 }, }; - IMFMediaType *media_type, *media_type2; - unsigned int i, alignment; IMFMediaBuffer *buffer; - DWORD length, max; - BYTE *data; + UINT32 length; HRESULT hr; + IMFMediaType *media_type; + unsigned int i; if (!pMFCreateMediaBufferFromMediaType) { @@ -6080,73 +5952,40 @@ static void test_MFCreateMediaBufferFromMediaType(void) } hr = pMFCreateMediaBufferFromMediaType(NULL, 0, 0, 0, &buffer); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = MFCreateMediaType(&media_type); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); - - hr = MFCreateMediaType(&media_type2); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); - - hr = IMFMediaType_CopyAllItems(media_type, (IMFAttributes *)media_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(audio_tests); ++i) { const struct audio_buffer_test *ptr = &audio_tests[i]; hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, ptr->block_alignment); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, ptr->bytes_per_second); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = pMFCreateMediaBufferFromMediaType(media_type, ptr->duration * 10000000, ptr->min_length, ptr->min_alignment, &buffer); - ok(hr == S_OK || broken(FAILED(hr)) /* Win8 */, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK || broken(FAILED(hr)) /* Win8 */, "Unexpected hr %#x.\n", hr); if (FAILED(hr)) break; check_interface(buffer, &IID_IMFGetService, FALSE); hr = IMFMediaBuffer_GetMaxLength(buffer, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(ptr->buffer_length == length, "%d: unexpected buffer length %lu, expected %u.\n", i, length, ptr->buffer_length); - - alignment = ptr->min_alignment ? ptr->min_alignment - 1 : MF_16_BYTE_ALIGNMENT; - hr = IMFMediaBuffer_Lock(buffer, &data, &max, &length); - ok(hr == S_OK, "Failed to lock, hr %#lx.\n", hr); - ok(ptr->buffer_length == max && !length, "Unexpected length.\n"); - ok(!((uintptr_t)data & alignment), "%u: data at %p is misaligned.\n", i, data); - hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock, hr %#lx.\n", hr); - - IMFMediaBuffer_Release(buffer); - - /* Only major type is set. */ - hr = pMFCreateMediaBufferFromMediaType(media_type2, ptr->duration * 10000000, ptr->min_length, - ptr->min_alignment, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - - hr = IMFMediaBuffer_GetMaxLength(buffer, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(ptr->min_length == length, "%u: unexpected buffer length %lu, expected %u.\n", i, length, ptr->min_length); - - hr = IMFMediaBuffer_Lock(buffer, &data, &max, &length); - ok(hr == S_OK, "Failed to lock, hr %#lx.\n", hr); - ok(ptr->min_length == max && !length, "Unexpected length.\n"); - ok(!((uintptr_t)data & alignment), "%u: data at %p is misaligned.\n", i, data); - hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Failed to unlock, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(ptr->buffer_length == length, "%d: unexpected buffer length %u, expected %u.\n", i, length, ptr->buffer_length); IMFMediaBuffer_Release(buffer); } IMFMediaType_Release(media_type); - IMFMediaType_Release(media_type2); } static void validate_media_type(IMFMediaType *mediatype, const WAVEFORMATEX *format) @@ -6156,11 +5995,11 @@ static void validate_media_type(IMFMediaType *mediatype, const WAVEFORMATEX *for HRESULT hr; hr = IMFMediaType_GetMajorType(mediatype, &guid); - ok(hr == S_OK, "Failed to get major type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get major type, hr %#x.\n", hr); ok(IsEqualGUID(&guid, &MFMediaType_Audio), "Unexpected major type %s.\n", wine_dbgstr_guid(&guid)); hr = IMFMediaType_GetGUID(mediatype, &MF_MT_SUBTYPE, &guid); - ok(hr == S_OK, "Failed to get subtype, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get subtype, hr %#x.\n", hr); if (format->wFormatTag == WAVE_FORMAT_EXTENSIBLE) { @@ -6170,14 +6009,14 @@ static void validate_media_type(IMFMediaType *mediatype, const WAVEFORMATEX *for if (fex->dwChannelMask) { hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_CHANNEL_MASK, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == fex->dwChannelMask, "Unexpected CHANNEL_MASK %#x.\n", value); } if (format->wBitsPerSample && fex->Samples.wValidBitsPerSample) { hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_VALID_BITS_PER_SAMPLE, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == fex->Samples.wValidBitsPerSample, "Unexpected VALID_BITS_PER_SAMPLE %#x.\n", value); } } @@ -6188,42 +6027,42 @@ static void validate_media_type(IMFMediaType *mediatype, const WAVEFORMATEX *for ok(IsEqualGUID(&guid, &subtype), "Unexpected subtype %s.\n", wine_dbgstr_guid(&guid)); hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_PREFER_WAVEFORMATEX, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value, "Unexpected value.\n"); } if (format->nChannels) { hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_NUM_CHANNELS, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == format->nChannels, "Unexpected NUM_CHANNELS %u.\n", value); } if (format->nSamplesPerSec) { hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == format->nSamplesPerSec, "Unexpected SAMPLES_PER_SECOND %u.\n", value); } if (format->nAvgBytesPerSec) { hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == format->nAvgBytesPerSec, "Unexpected AVG_BYTES_PER_SECOND %u.\n", value); } if (format->nBlockAlign) { hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == format->nBlockAlign, "Unexpected BLOCK_ALIGNMENT %u.\n", value); } if (format->wBitsPerSample) { hr = IMFMediaType_GetUINT32(mediatype, &MF_MT_AUDIO_BITS_PER_SAMPLE, &value); - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value == format->wBitsPerSample, "Unexpected BITS_PER_SAMPLE %u.\n", value); } @@ -6232,7 +6071,7 @@ static void validate_media_type(IMFMediaType *mediatype, const WAVEFORMATEX *for if (IsEqualGUID(&guid, &MFAudioFormat_Float) || IsEqualGUID(&guid, &MFAudioFormat_PCM)) { - ok(hr == S_OK, "Failed to get attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get attribute, hr %#x.\n", hr); ok(value, "Unexpected ALL_SAMPLES_INDEPENDENT value.\n"); } else @@ -6278,12 +6117,12 @@ static void test_MFInitMediaTypeFromWaveFormatEx(void) HRESULT hr; hr = MFCreateMediaType(&mediatype); - ok(hr == S_OK, "Failed to create mediatype, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create mediatype, hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(waveformatex_tests); ++i) { hr = MFInitMediaTypeFromWaveFormatEx(mediatype, &waveformatex_tests[i], sizeof(waveformatex_tests[i])); - ok(hr == S_OK, "%d: format %#x, failed to initialize media type, hr %#lx.\n", i, waveformatex_tests[i].wFormatTag, hr); + ok(hr == S_OK, "%d: format %#x, failed to initialize media type, hr %#x.\n", i, waveformatex_tests[i].wFormatTag, hr); validate_media_type(mediatype, &waveformatex_tests[i]); @@ -6296,10 +6135,10 @@ static void test_MFInitMediaTypeFromWaveFormatEx(void) waveformatext.SubFormat.Data1 = waveformatex_tests[i].wFormatTag; hr = MFInitMediaTypeFromWaveFormatEx(mediatype, &waveformatext.Format, sizeof(waveformatext)); - ok(hr == S_OK, "Failed to initialize media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to initialize media type, hr %#x.\n", hr); hr = IMFMediaType_GetItem(mediatype, &MF_MT_USER_DATA, NULL); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); validate_media_type(mediatype, &waveformatext.Format); } @@ -6319,11 +6158,11 @@ static void test_MFInitMediaTypeFromWaveFormatEx(void) mp3format.nCodecDelay = 0; hr = MFInitMediaTypeFromWaveFormatEx(mediatype, (WAVEFORMATEX *)&mp3format, sizeof(mp3format)); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); validate_media_type(mediatype, &mp3format.wfx); hr = IMFMediaType_GetBlob(mediatype, &MF_MT_USER_DATA, buff, sizeof(buff), &size); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(size == mp3format.wfx.cbSize, "Unexpected size %u.\n", size); ok(!memcmp(buff, (WAVEFORMATEX *)&mp3format + 1, size), "Unexpected user data.\n"); @@ -6338,10 +6177,10 @@ static void test_MFCreateMFVideoFormatFromMFMediaType(void) HRESULT hr; hr = MFCreateMediaType(&media_type); - ok(hr == S_OK, "Failed to create media type, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr); hr = MFCreateMFVideoFormatFromMFMediaType(media_type, &video_format, &size); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!video_format, "Unexpected format.\n"); ok(video_format->dwSize == size && size == sizeof(*video_format), "Unexpected size %u.\n", size); CoTaskMemFree(video_format); @@ -6382,19 +6221,19 @@ static void test_MFCreateDXSurfaceBuffer(void) } hr = IDirect3DDevice9_GetSwapChain(device, 0, &swapchain); - ok(SUCCEEDED(hr), "Failed to get the implicit swapchain (%08lx)\n", hr); + ok(SUCCEEDED(hr), "Failed to get the implicit swapchain (%08x)\n", hr); hr = IDirect3DSwapChain9_GetBackBuffer(swapchain, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer); - ok(SUCCEEDED(hr), "Failed to get the back buffer (%08lx)\n", hr); + ok(SUCCEEDED(hr), "Failed to get the back buffer (%08x)\n", hr); ok(backbuffer != NULL, "The back buffer is NULL\n"); IDirect3DSwapChain9_Release(swapchain); hr = pMFCreateDXSurfaceBuffer(&IID_IUnknown, (IUnknown *)backbuffer, FALSE, &buffer); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = pMFCreateDXSurfaceBuffer(&IID_IDirect3DSurface9, (IUnknown *)backbuffer, FALSE, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); check_interface(buffer, &IID_IMF2DBuffer, TRUE); check_interface(buffer, &IID_IMF2DBuffer2, TRUE); @@ -6402,116 +6241,116 @@ static void test_MFCreateDXSurfaceBuffer(void) /* Surface is accessible. */ hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFGetService, (void **)&gs); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFGetService_GetService(gs, &MR_BUFFER_SERVICE, &IID_IDirect3DSurface9, (void **)&surface); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(surface == backbuffer, "Unexpected surface pointer.\n"); IDirect3DSurface9_Release(surface); IMFGetService_Release(gs); max_length = 0; hr = IMFMediaBuffer_GetMaxLength(buffer, &max_length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!!max_length, "Unexpected length %lu.\n", max_length); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!!max_length, "Unexpected length %u.\n", max_length); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(!length, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(!length, "Unexpected length %u.\n", length); hr = IMFMediaBuffer_SetCurrentLength(buffer, 2 * max_length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer, &length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(length == 2 * max_length, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(length == 2 * max_length, "Unexpected length %u.\n", length); hr = IMFMediaBuffer_Lock(buffer, &data, NULL, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(length == max_length, "Unexpected length.\n"); /* Unlock twice. */ hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); /* Lock twice. */ hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_Lock(buffer, &data2, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(data == data2, "Unexpected pointer.\n"); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2dbuffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* Unlocked. */ hr = IMF2DBuffer_GetScanline0AndPitch(_2dbuffer, &data, &pitch); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetScanline0AndPitch(_2dbuffer, &data, &pitch); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_Lock(buffer, &data2, NULL, NULL); - ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2dbuffer, &data, &pitch); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2dbuffer); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_IsContiguousFormat(_2dbuffer, &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!value, "Unexpected return value %d.\n", value); hr = IMF2DBuffer_GetContiguousLength(_2dbuffer, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetContiguousLength(_2dbuffer, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length == max_length, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(length == max_length, "Unexpected length %u.\n", length); IMF2DBuffer_Release(_2dbuffer); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer2, (void **)&_2dbuffer2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Read, &data, &pitch, &data2, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(data == data2, "Unexpected scanline pointer.\n"); memset(data, 0xab, 4); IMF2DBuffer2_Unlock2D(_2dbuffer2); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_Write, &data, &pitch, &data2, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(data[0] == 0xab, "Unexpected leading byte.\n"); IMF2DBuffer2_Unlock2D(_2dbuffer2); hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(data[0] == 0xab, "Unexpected leading byte.\n"); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer2_Lock2DSize(_2dbuffer2, MF2DBuffer_LockFlags_ReadWrite, &data, &pitch, &data2, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMF2DBuffer2_Unlock2D(_2dbuffer2); IMF2DBuffer2_Release(_2dbuffer2); @@ -6539,14 +6378,14 @@ static void test_MFCreateTrackedSample(void) } hr = pMFCreateTrackedSample(&tracked_sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* It's actually a sample. */ hr = IMFTrackedSample_QueryInterface(tracked_sample, &IID_IMFSample, (void **)&sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFTrackedSample_QueryInterface(tracked_sample, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(unk == (IUnknown *)sample, "Unexpected pointer.\n"); IUnknown_Release(unk); @@ -6584,12 +6423,12 @@ static void test_MFFrameRateToAverageTimePerFrame(void) avgtime = 1; hr = MFFrameRateToAverageTimePerFrame(0, 0, &avgtime); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!avgtime, "Unexpected frame time.\n"); avgtime = 1; hr = MFFrameRateToAverageTimePerFrame(0, 1001, &avgtime); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!avgtime, "Unexpected frame time.\n"); for (i = 0; i < ARRAY_SIZE(frame_rate_tests); ++i) @@ -6597,59 +6436,12 @@ static void test_MFFrameRateToAverageTimePerFrame(void) avgtime = 0; hr = MFFrameRateToAverageTimePerFrame(frame_rate_tests[i].numerator, frame_rate_tests[i].denominator, &avgtime); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(avgtime == frame_rate_tests[i].avgtime, "%u: unexpected frame time %s, expected %s.\n", i, wine_dbgstr_longlong(avgtime), wine_dbgstr_longlong(frame_rate_tests[i].avgtime)); } } -static void test_MFAverageTimePerFrameToFrameRate(void) -{ - static const struct frame_rate_test - { - unsigned int numerator; - unsigned int denominator; - UINT64 avgtime; - } frame_rate_tests[] = - { - { 60000, 1001, 166833 }, - { 30000, 1001, 333667 }, - { 24000, 1001, 417188 }, - { 60, 1, 166667 }, - { 30, 1, 333333 }, - { 50, 1, 200000 }, - { 25, 1, 400000 }, - { 24, 1, 416667 }, - - { 1000000, 25641, 256410 }, - { 10000000, 83333, 83333 }, - { 1, 10, 100000000 }, - { 1, 10, 100000001 }, - { 1, 10, 200000000 }, - { 1, 1, 10000000 }, - { 1, 2, 20000000 }, - { 5, 1, 2000000 }, - { 10, 1, 1000000 }, - }; - unsigned int i, numerator, denominator; - HRESULT hr; - - numerator = denominator = 1; - hr = MFAverageTimePerFrameToFrameRate(0, &numerator, &denominator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!numerator && !denominator, "Unexpected output %u/%u.\n", numerator, denominator); - - for (i = 0; i < ARRAY_SIZE(frame_rate_tests); ++i) - { - numerator = denominator = 12345; - hr = MFAverageTimePerFrameToFrameRate(frame_rate_tests[i].avgtime, &numerator, &denominator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(numerator == frame_rate_tests[i].numerator && denominator == frame_rate_tests[i].denominator, - "%u: unexpected %u/%u, expected %u/%u.\n", i, numerator, denominator, frame_rate_tests[i].numerator, - frame_rate_tests[i].denominator); - } -} - static void test_MFMapDXGIFormatToDX9Format(void) { static const struct format_pair @@ -6716,7 +6508,7 @@ static void test_MFMapDXGIFormatToDX9Format(void) for (i = 0; i < ARRAY_SIZE(formats_map); ++i) { format = pMFMapDXGIFormatToDX9Format(formats_map[i].dxgi_format); - ok(format == formats_map[i].d3d9_format, "Unexpected d3d9 format %#lx, dxgi format %#x.\n", format, formats_map[i].dxgi_format); + ok(format == formats_map[i].d3d9_format, "Unexpected d3d9 format %#x, dxgi format %#x.\n", format, formats_map[i].dxgi_format); } } @@ -6780,7 +6572,7 @@ static void test_MFMapDX9FormatToDXGIFormat(void) for (i = 0; i < ARRAY_SIZE(formats_map); ++i) { format = pMFMapDX9FormatToDXGIFormat(formats_map[i].d3d9_format); - ok(format == formats_map[i].dxgi_format, "Unexpected DXGI format %#x, d3d9 format %#lx.\n", + ok(format == formats_map[i].dxgi_format, "Unexpected DXGI format %#x, d3d9 format %#x.\n", format, formats_map[i].d3d9_format); } } @@ -6829,13 +6621,13 @@ static IMFMediaType * create_video_type(const GUID *subtype) HRESULT hr; hr = MFCreateMediaType(&video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(video_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetGUID(video_type, &MF_MT_SUBTYPE, subtype); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); return video_type; } @@ -6936,10 +6728,10 @@ static void test_d3d11_surface_buffer(void) desc.SampleDesc.Quality = 0; hr = ID3D11Device_CreateTexture2D(device, &desc, NULL, &texture); - ok(hr == S_OK, "Failed to create a texture, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a texture, hr %#x.\n", hr); hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D11Texture2D, (IUnknown *)texture, 0, FALSE, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); check_interface(buffer, &IID_IMF2DBuffer, TRUE); check_interface(buffer, &IID_IMF2DBuffer2, TRUE); @@ -6948,150 +6740,150 @@ static void test_d3d11_surface_buffer(void) max_length = 0; hr = IMFMediaBuffer_GetMaxLength(buffer, &max_length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!!max_length, "Unexpected length %lu.\n", max_length); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!!max_length, "Unexpected length %u.\n", max_length); hr = IMFMediaBuffer_GetCurrentLength(buffer, &cur_length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(!cur_length, "Unexpected length %lu.\n", cur_length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(!cur_length, "Unexpected length %u.\n", cur_length); hr = IMFMediaBuffer_SetCurrentLength(buffer, 2 * max_length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); hr = IMFMediaBuffer_GetCurrentLength(buffer, &cur_length); - ok(hr == S_OK, "Failed to get length, hr %#lx.\n", hr); - ok(cur_length == 2 * max_length, "Unexpected length %lu.\n", cur_length); + ok(hr == S_OK, "Failed to get length, hr %#x.\n", hr); + ok(cur_length == 2 * max_length, "Unexpected length %u.\n", cur_length); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetContiguousLength(_2d_buffer, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetContiguousLength(_2d_buffer, &length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(length == max_length, "Unexpected length %lu.\n", length); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(length == max_length, "Unexpected length %u.\n", length); IMF2DBuffer_Release(_2d_buffer); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFDXGIBuffer, (void **)&dxgi_buffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); EXPECT_REF(texture, 2); hr = IMFDXGIBuffer_GetResource(dxgi_buffer, &IID_ID3D11Texture2D, (void **)&obj); - ok(hr == S_OK, "Failed to get resource, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get resource, hr %#x.\n", hr); EXPECT_REF(texture, 3); ok(obj == (IUnknown *)texture, "Unexpected resource pointer.\n"); IUnknown_Release(obj); hr = IMFDXGIBuffer_GetSubresourceIndex(dxgi_buffer, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = IMFDXGIBuffer_GetSubresourceIndex(dxgi_buffer, &index); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(index == 0, "Unexpected subresource index.\n"); hr = IMFDXGIBuffer_SetUnknown(dxgi_buffer, &IID_IMFDXGIBuffer, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIBuffer_SetUnknown(dxgi_buffer, &IID_IMFDXGIBuffer, (void *)device); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIBuffer_SetUnknown(dxgi_buffer, &IID_IMFDXGIBuffer, (void *)device); - ok(hr == HRESULT_FROM_WIN32(ERROR_OBJECT_ALREADY_EXISTS), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_OBJECT_ALREADY_EXISTS), "Unexpected hr %#x.\n", hr); hr = ID3D11Texture2D_GetPrivateData(texture, &IID_IMFDXGIBuffer, &size, &data); - ok(hr == DXGI_ERROR_NOT_FOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == DXGI_ERROR_NOT_FOUND, "Unexpected hr %#x.\n", hr); hr = IMFDXGIBuffer_GetUnknown(dxgi_buffer, &IID_IMFDXGIBuffer, &IID_ID3D11Device, (void **)&obj); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(obj == (IUnknown *)device, "Unexpected pointer.\n"); IUnknown_Release(obj); hr = IMFDXGIBuffer_SetUnknown(dxgi_buffer, &IID_IMFDXGIBuffer, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFDXGIBuffer_GetUnknown(dxgi_buffer, &IID_IMFDXGIBuffer, &IID_IUnknown, (void **)&obj); - ok(hr == MF_E_NOT_FOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NOT_FOUND, "Unexpected hr %#x.\n", hr); IMFDXGIBuffer_Release(dxgi_buffer); /* Texture updates. */ color = get_d3d11_texture_color(texture, 0, 0); - ok(!color, "Unexpected texture color %#lx.\n", color); + ok(!color, "Unexpected texture color %#x.\n", color); max_length = cur_length = 0; data = NULL; hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(max_length && max_length == cur_length, "Unexpected length %lu.\n", max_length); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(max_length && max_length == cur_length, "Unexpected length %u.\n", max_length); if (data) *(DWORD *)data = ~0u; color = get_d3d11_texture_color(texture, 0, 0); - ok(!color, "Unexpected texture color %#lx.\n", color); + ok(!color, "Unexpected texture color %#x.\n", color); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); color = get_d3d11_texture_color(texture, 0, 0); - ok(color == ~0u, "Unexpected texture color %#lx.\n", color); + ok(color == ~0u, "Unexpected texture color %#x.\n", color); hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(*(DWORD *)data == ~0u, "Unexpected buffer %#lx.\n", *(DWORD *)data); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(*(DWORD *)data == ~0u, "Unexpected buffer %#x.\n", *(DWORD *)data); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* Lock2D()/Unlock2D() */ hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %ld.\n", pitch); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %ld.\n", pitch); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(data2 == data && pitch2 == pitch, "Unexpected data/pitch.\n"); hr = IMFMediaBuffer_Lock(buffer, &data, &max_length, &cur_length); - ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Unlock2D(_2d_buffer); - ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_WAS_UNLOCKED), "Unexpected hr %#x.\n", hr); IMF2DBuffer_Release(_2d_buffer); IMFMediaBuffer_Release(buffer); /* Bottom up. */ hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D11Texture2D, (IUnknown *)texture, 0, TRUE, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %ld.\n", pitch); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!!data && pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); hr = IMF2DBuffer_GetScanline0AndPitch(_2d_buffer, &data2, &pitch2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(data2 == data && pitch2 == pitch, "Unexpected data/pitch.\n"); hr = IMF2DBuffer_Unlock2D(_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMF2DBuffer_Release(_2d_buffer); IMFMediaBuffer_Release(buffer); @@ -7100,13 +6892,13 @@ static void test_d3d11_surface_buffer(void) /* Subresource index 1. */ hr = ID3D11Device_CreateTexture2D(device, &desc, NULL, &texture); - ok(hr == S_OK, "Failed to create a texture, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a texture, hr %#x.\n", hr); hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D11Texture2D, (IUnknown *)texture, 1, FALSE, &buffer); - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMF2DBuffer, (void **)&_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* Pitch reflects top level. */ memset(buff, 0, sizeof(buff)); @@ -7114,12 +6906,12 @@ static void test_d3d11_surface_buffer(void) update_d3d11_texture(texture, 1, buff, 64 * 4); hr = IMF2DBuffer_Lock2D(_2d_buffer, &data, &pitch); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(pitch == desc.Width * 4, "Unexpected pitch %ld.\n", pitch); - ok(*(DWORD *)data == 0xff00ff00, "Unexpected color %#lx.\n", *(DWORD *)data); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(pitch == desc.Width * 4, "Unexpected pitch %d.\n", pitch); + ok(*(DWORD *)data == 0xff00ff00, "Unexpected color %#x.\n", *(DWORD *)data); hr = IMF2DBuffer_Unlock2D(_2d_buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMF2DBuffer_Release(_2d_buffer); IMFMediaBuffer_Release(buffer); @@ -7166,16 +6958,16 @@ static void test_d3d12_surface_buffer(void) hr = ID3D12Device_CreateCommittedResource(device, &heap_props, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_RENDER_TARGET, NULL, &IID_ID3D12Resource, (void **)&resource); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = pMFCreateDXGISurfaceBuffer(&IID_ID3D12Resource, (IUnknown *)resource, 0, FALSE, &buffer); if (hr == E_INVALIDARG) { - todo_wine +todo_wine win_skip("D3D12 resource buffers are not supported.\n"); goto notsupported; } - ok(hr == S_OK, "Failed to create a buffer, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr); if (SUCCEEDED(hr)) { @@ -7185,10 +6977,10 @@ if (SUCCEEDED(hr)) check_interface(buffer, &IID_IMFGetService, FALSE); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFDXGIBuffer, (void **)&dxgi_buffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); hr = IMFDXGIBuffer_GetResource(dxgi_buffer, &IID_ID3D12Resource, (void **)&obj); - ok(hr == S_OK, "Failed to get resource, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get resource, hr %#x.\n", hr); ok(obj == (IUnknown *)resource, "Unexpected resource pointer.\n"); IUnknown_Release(obj); @@ -7209,11 +7001,11 @@ static void test_sample_allocator_sysmem(void) IMFVideoSampleAllocatorCallback *allocator_cb; IMFVideoSampleAllocatorEx *allocatorex; IMFVideoSampleAllocator *allocator; + unsigned int buffer_count; IMFSample *sample, *sample2; IMFAttributes *attributes; IMFMediaBuffer *buffer; LONG refcount, count; - DWORD buffer_count; IUnknown *unk; HRESULT hr; @@ -7221,7 +7013,7 @@ static void test_sample_allocator_sysmem(void) return; hr = pMFCreateVideoSampleAllocatorEx(&IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(unk, &IID_IMFVideoSampleAllocator, TRUE); check_interface(unk, &IID_IMFVideoSampleAllocatorEx, TRUE); @@ -7230,123 +7022,123 @@ static void test_sample_allocator_sysmem(void) IUnknown_Release(unk); hr = pMFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocator, (void **)&allocator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_QueryInterface(allocator, &IID_IMFVideoSampleAllocatorCallback, (void **)&allocator_cb); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorCallback_SetCallback(allocator_cb, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorCallback_SetCallback(allocator_cb, &test_notify); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorCallback_SetCallback(allocator_cb, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, NULL); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); count = 10; hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!count, "Unexpected count %ld.\n", count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!count, "Unexpected count %d.\n", count); hr = IMFVideoSampleAllocator_UninitializeSampleAllocator(allocator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample); - ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_SetDirectXManager(allocator, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFCreateMediaType(&media_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 2, media_type); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); video_type = create_video_type(&MFVideoFormat_RGB32); video_type2 = create_video_type(&MFVideoFormat_RGB32); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 2, video_type); - ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr); /* Frame size is required. */ hr = IMFMediaType_SetUINT64(video_type, &MF_MT_FRAME_SIZE, (UINT64) 320 << 32 | 240); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetUINT64(video_type2, &MF_MT_FRAME_SIZE, (UINT64) 320 << 32 | 240); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 0, video_type); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); EXPECT_REF(video_type, 1); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 1, video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(video_type, 2); hr = IMFMediaType_SetUINT64(video_type2, &IID_IUnknown, (UINT64) 320 << 32 | 240); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); /* Setting identical type does not replace it. */ hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 1, video_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(video_type, 2); EXPECT_REF(video_type2, 1); hr = IMFMediaType_SetUINT64(video_type2, &MF_MT_FRAME_SIZE, (UINT64) 64 << 32 | 64); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 1, video_type2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(video_type2, 2); EXPECT_REF(video_type, 1); /* Modify referenced type. */ hr = IMFMediaType_SetUINT64(video_type2, &MF_MT_FRAME_SIZE, (UINT64) 320 << 32 | 64); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 1, video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(video_type, 2); EXPECT_REF(video_type2, 1); count = 0; hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(count == 1, "Unexpected count %ld.\n", count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(count == 1, "Unexpected count %d.\n", count); sample = NULL; hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); refcount = get_refcount(sample); hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!count, "Unexpected count %ld.\n", count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!count, "Unexpected count %d.\n", count); hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample2); - ok(hr == MF_E_SAMPLEALLOCATOR_EMPTY, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SAMPLEALLOCATOR_EMPTY, "Unexpected hr %#x.\n", hr); /* Reinitialize with active sample. */ hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 2, video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(refcount == get_refcount(sample), "Unexpected refcount %lu.\n", get_refcount(sample)); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(refcount == get_refcount(sample), "Unexpected refcount %u.\n", get_refcount(sample)); EXPECT_REF(video_type, 2); hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine - ok(!count, "Unexpected count %ld.\n", count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); +todo_wine + ok(!count, "Unexpected count %d.\n", count); check_interface(sample, &IID_IMFTrackedSample, TRUE); check_interface(sample, &IID_IMFDesiredSample, FALSE); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(buffer, &IID_IMF2DBuffer, TRUE); check_interface(buffer, &IID_IMF2DBuffer2, TRUE); @@ -7356,72 +7148,72 @@ static void test_sample_allocator_sysmem(void) IMFMediaBuffer_Release(buffer); hr = IMFSample_GetBufferCount(sample, &buffer_count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(buffer_count == 1, "Unexpected buffer count %lu.\n", buffer_count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(buffer_count == 1, "Unexpected buffer count %u.\n", buffer_count); IMFSample_Release(sample); hr = IMFVideoSampleAllocator_UninitializeSampleAllocator(allocator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); +todo_wine EXPECT_REF(video_type, 2); hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(!count, "Unexpected count %ld.\n", count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!count, "Unexpected count %d.\n", count); hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample); - ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); IMFVideoSampleAllocatorCallback_Release(allocator_cb); IMFVideoSampleAllocator_Release(allocator); /* IMFVideoSampleAllocatorEx */ hr = MFCreateAttributes(&attributes, 0); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = pMFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocatorEx, (void **)&allocatorex); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorEx_QueryInterface(allocatorex, &IID_IMFVideoSampleAllocatorCallback, (void **)&allocator_cb); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorEx_InitializeSampleAllocatorEx(allocatorex, 1, 0, NULL, video_type); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_SetUINT32(attributes, &MF_SA_BUFFERS_PER_SAMPLE, 2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorEx_AllocateSample(allocatorex, &sample); - ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); EXPECT_REF(attributes, 1); hr = IMFVideoSampleAllocatorEx_InitializeSampleAllocatorEx(allocatorex, 0, 0, attributes, video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(attributes, 2); count = 0; hr = IMFVideoSampleAllocatorCallback_GetFreeSampleCount(allocator_cb, &count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(count == 1, "Unexpected count %ld.\n", count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(count == 1, "Unexpected count %d.\n", count); hr = IMFVideoSampleAllocatorEx_AllocateSample(allocatorex, &sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetBufferCount(sample, &buffer_count); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(buffer_count == 2, "Unexpected buffer count %lu.\n", buffer_count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(buffer_count == 2, "Unexpected buffer count %u.\n", buffer_count); hr = IMFVideoSampleAllocatorEx_AllocateSample(allocatorex, &sample2); - ok(hr == MF_E_SAMPLEALLOCATOR_EMPTY, "Unexpected hr %#lx.\n", hr); + ok(hr == MF_E_SAMPLEALLOCATOR_EMPTY, "Unexpected hr %#x.\n", hr); /* Reinitialize with already allocated samples. */ hr = IMFVideoSampleAllocatorEx_InitializeSampleAllocatorEx(allocatorex, 0, 0, NULL, video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(attributes, 1); hr = IMFVideoSampleAllocatorEx_AllocateSample(allocatorex, &sample2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMFSample_Release(sample2); IMFSample_Release(sample); @@ -7457,34 +7249,34 @@ static void test_sample_allocator_d3d9(void) } hr = DXVA2CreateDirect3DDeviceManager9(&token, &d3d9_manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IDirect3DDeviceManager9_ResetDevice(d3d9_manager, d3d9_device, token); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = pMFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocator, (void **)&allocator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_SetDirectXManager(allocator, (IUnknown *)d3d9_manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); video_type = create_video_type(&MFVideoFormat_RGB32); /* Frame size is required. */ hr = IMFMediaType_SetUINT64(video_type, &MF_MT_FRAME_SIZE, (UINT64) 64 << 32 | 64); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 1, video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(sample, &IID_IMFTrackedSample, TRUE); check_interface(sample, &IID_IMFDesiredSample, FALSE); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(buffer, &IID_IMF2DBuffer, TRUE); check_interface(buffer, &IID_IMF2DBuffer2, TRUE); @@ -7543,31 +7335,31 @@ static void test_sample_allocator_d3d11(void) } hr = pMFCreateDXGIDeviceManager(&token, &manager); - ok(hr == S_OK, "Failed to create device manager, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create device manager, hr %#x.\n", hr); hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)device, token); - ok(hr == S_OK, "Failed to set a device, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set a device, hr %#x.\n", hr); hr = pMFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocator, (void **)&allocator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(manager, 1); hr = IMFVideoSampleAllocator_SetDirectXManager(allocator, (IUnknown *)manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(manager, 2); video_type = create_video_type(&MFVideoFormat_RGB32); hr = IMFMediaType_SetUINT64(video_type, &MF_MT_FRAME_SIZE, (UINT64) 64 << 32 | 64); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 1, video_type); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(buffer, &IID_IMF2DBuffer, TRUE); check_interface(buffer, &IID_IMF2DBuffer2, TRUE); @@ -7575,10 +7367,10 @@ static void test_sample_allocator_d3d11(void) check_interface(buffer, &IID_IMFGetService, FALSE); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFDXGIBuffer, (void **)&dxgi_buffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); hr = IMFDXGIBuffer_GetResource(dxgi_buffer, &IID_ID3D11Texture2D, (void **)&texture); - ok(hr == S_OK, "Failed to get resource, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get resource, hr %#x.\n", hr); ID3D11Texture2D_GetDesc(texture, &desc); ok(desc.Width == 64, "Unexpected width %u.\n", desc.Width); @@ -7598,10 +7390,10 @@ static void test_sample_allocator_d3d11(void) IMFDXGIBuffer_Release(dxgi_buffer); hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_Unlock(buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); IMFSample_Release(sample); @@ -7609,42 +7401,42 @@ static void test_sample_allocator_d3d11(void) /* MF_SA_D3D11_USAGE */ hr = MFCreateAttributes(&attributes, 1); - ok(hr == S_OK, "Failed to create attributes, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create attributes, hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(usage); ++i) { hr = pMFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocatorEx, (void **)&allocatorex); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorEx_SetDirectXManager(allocatorex, (IUnknown *)manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_SetUINT32(attributes, &MF_SA_D3D11_USAGE, usage[i]); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFVideoSampleAllocatorEx_InitializeSampleAllocatorEx(allocatorex, 0, 0, attributes, video_type); if (usage[i] == D3D11_USAGE_IMMUTABLE || usage[i] > D3D11_USAGE_STAGING) { - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); IMFVideoSampleAllocatorEx_Release(allocatorex); continue; } - ok(hr == S_OK, "%u: Unexpected hr %#lx.\n", usage[i], hr); + ok(hr == S_OK, "%u: Unexpected hr %#x.\n", usage[i], hr); hr = IMFAttributes_SetUINT32(attributes, &MF_SA_D3D11_USAGE, D3D11_USAGE_DEFAULT); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); hr = IMFVideoSampleAllocatorEx_AllocateSample(allocatorex, &sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFDXGIBuffer, (void **)&dxgi_buffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); hr = IMFDXGIBuffer_GetResource(dxgi_buffer, &IID_ID3D11Texture2D, (void **)&texture); - ok(hr == S_OK, "Failed to get resource, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get resource, hr %#x.\n", hr); ID3D11Texture2D_GetDesc(texture, &desc); ok(desc.Usage == usage[i], "Unexpected usage %u.\n", desc.Usage); @@ -7680,50 +7472,50 @@ static void test_sample_allocator_d3d11(void) for (i = 0; i < ARRAY_SIZE(sharing); ++i) { hr = pMFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocatorEx, (void **)&allocatorex); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocatorEx_SetDirectXManager(allocatorex, (IUnknown *)manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_DeleteAllItems(attributes); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFAttributes_SetUINT32(attributes, &MF_SA_D3D11_USAGE, D3D11_USAGE_DEFAULT); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); if (sharing[i] & D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX) { hr = IMFAttributes_SetUINT32(attributes, &MF_SA_D3D11_SHARED, TRUE); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); } if (sharing[i] & D3D11_RESOURCE_MISC_SHARED) { hr = IMFAttributes_SetUINT32(attributes, &MF_SA_D3D11_SHARED_WITHOUT_MUTEX, TRUE); - ok(hr == S_OK, "Failed to set attribute, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr); } hr = IMFVideoSampleAllocatorEx_InitializeSampleAllocatorEx(allocatorex, 0, 0, attributes, video_type); if (sharing[i] == (D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX | D3D11_RESOURCE_MISC_SHARED)) { - todo_wine - ok(hr == E_INVALIDARG, "%u: Unexpected hr %#lx.\n", i, hr); + todo_wine + ok(hr == E_INVALIDARG, "%u: Unexpected hr %#x.\n", i, hr); IMFVideoSampleAllocatorEx_Release(allocatorex); continue; } - ok(hr == S_OK, "%u: Unexpected hr %#lx.\n", i, hr); + ok(hr == S_OK, "%u: Unexpected hr %#x.\n", i, hr); hr = IMFVideoSampleAllocatorEx_AllocateSample(allocatorex, &sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFDXGIBuffer, (void **)&dxgi_buffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); hr = IMFDXGIBuffer_GetResource(dxgi_buffer, &IID_ID3D11Texture2D, (void **)&texture); - ok(hr == S_OK, "Failed to get resource, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get resource, hr %#x.\n", hr); ID3D11Texture2D_GetDesc(texture, &desc); ok(desc.MiscFlags == sharing[i], "%u: unexpected misc flags %#x.\n", i, desc.MiscFlags); @@ -7766,7 +7558,7 @@ static void test_sample_allocator_d3d12(void) } hr = pMFCreateDXGIDeviceManager(&token, &manager); - ok(hr == S_OK, "Failed to create device manager, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create device manager, hr %#x.\n", hr); hr = IMFDXGIDeviceManager_ResetDevice(manager, (IUnknown *)device, token); if (FAILED(hr)) @@ -7774,32 +7566,32 @@ static void test_sample_allocator_d3d12(void) win_skip("Device manager does not support D3D12 devices.\n"); goto done; } - ok(hr == S_OK, "Failed to set a device, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to set a device, hr %#x.\n", hr); hr = pMFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocator, (void **)&allocator); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(manager, 1); hr = IMFVideoSampleAllocator_SetDirectXManager(allocator, (IUnknown *)manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(manager, 2); video_type = create_video_type(&MFVideoFormat_RGB32); hr = IMFMediaType_SetUINT64(video_type, &MF_MT_FRAME_SIZE, (UINT64) 64 << 32 | 64); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFMediaType_SetUINT32(video_type, &MF_MT_D3D_RESOURCE_VERSION, MF_D3D12_RESOURCE); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFVideoSampleAllocator_InitializeSampleAllocator(allocator, 1, video_type); - todo_wine - ok(hr == S_OK || broken(hr == MF_E_UNEXPECTED) /* Some Win10 versions fail. */, "Unexpected hr %#lx.\n", hr); +todo_wine + ok(hr == S_OK || broken(hr == MF_E_UNEXPECTED) /* Some Win10 versions fail. */, "Unexpected hr %#x.\n", hr); if (FAILED(hr)) goto done; hr = IMFVideoSampleAllocator_AllocateSample(allocator, &sample); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = IMFSample_GetBufferByIndex(sample, 0, &buffer); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); check_interface(buffer, &IID_IMF2DBuffer, TRUE); check_interface(buffer, &IID_IMF2DBuffer2, TRUE); @@ -7807,10 +7599,10 @@ static void test_sample_allocator_d3d12(void) check_interface(buffer, &IID_IMFGetService, FALSE); hr = IMFMediaBuffer_QueryInterface(buffer, &IID_IMFDXGIBuffer, (void **)&dxgi_buffer); - ok(hr == S_OK, "Failed to get interface, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); hr = IMFDXGIBuffer_GetResource(dxgi_buffer, &IID_ID3D12Resource, (void **)&resource); - ok(hr == S_OK, "Failed to get resource, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to get resource, hr %#x.\n", hr); resource->lpVtbl->GetDesc(resource, &desc); ok(desc.Width == 64, "Unexpected width.\n"); @@ -7824,7 +7616,7 @@ static void test_sample_allocator_d3d12(void) ok(!desc.Flags, "Unexpected flags %#x.\n", desc.Flags); hr = ID3D12Resource_GetHeapProperties(resource, &heap_props, &heap_flags); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(heap_props.Type == D3D12_HEAP_TYPE_DEFAULT, "Unexpected heap type %u.\n", heap_props.Type); ok(heap_props.CPUPageProperty == D3D12_CPU_PAGE_PROPERTY_UNKNOWN, "Unexpected page property %u.\n", heap_props.CPUPageProperty); @@ -7854,17 +7646,17 @@ static void test_MFLockSharedWorkQueue(void) } hr = MFStartup(MF_VERSION, MFSTARTUP_FULL); - ok(hr == S_OK, "Failed to start up, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to start up, hr %#x.\n", hr); hr = pMFLockSharedWorkQueue(NULL, 0, &taskid, &queue); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); hr = pMFLockSharedWorkQueue(NULL, 0, NULL, &queue); - ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); taskid = 0; hr = pMFLockSharedWorkQueue(L"", 0, &taskid, &queue); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); queue = 0; hr = pMFLockSharedWorkQueue(L"", 0, NULL, &queue); @@ -7872,17 +7664,17 @@ static void test_MFLockSharedWorkQueue(void) queue2 = 0; hr = pMFLockSharedWorkQueue(L"", 0, NULL, &queue2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(queue == queue2, "Unexpected queue %#lx.\n", queue2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(queue == queue2, "Unexpected queue %#x.\n", queue2); hr = MFUnlockWorkQueue(queue2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFUnlockWorkQueue(queue); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); hr = MFShutdown(); - ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr); } static void test_MFllMulDiv(void) @@ -7935,25 +7727,25 @@ static void test_shared_dxgi_device_manager(void) } hr = pMFUnlockDXGIDeviceManager(); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); manager = NULL; hr = pMFLockDXGIDeviceManager(NULL, &manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!!manager, "Unexpected instance.\n"); hr = pMFLockDXGIDeviceManager(&token, &manager); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(manager, 3); hr = pMFUnlockDXGIDeviceManager(); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); EXPECT_REF(manager, 2); hr = pMFUnlockDXGIDeviceManager(); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); } static void check_video_format(const MFVIDEOFORMAT *format, unsigned int width, unsigned int height, @@ -7983,8 +7775,8 @@ static void check_video_format(const MFVIDEOFORMAT *format, unsigned int width, guid.Data1 = d3dformat; ok(format->dwSize == sizeof(*format), "Unexpected format size.\n"); - ok(format->videoInfo.dwWidth == width, "Unexpected width %lu.\n", format->videoInfo.dwWidth); - ok(format->videoInfo.dwHeight == height, "Unexpected height %lu.\n", format->videoInfo.dwHeight); + ok(format->videoInfo.dwWidth == width, "Unexpected width %u.\n", format->videoInfo.dwWidth); + ok(format->videoInfo.dwHeight == height, "Unexpected height %u.\n", format->videoInfo.dwHeight); ok(format->videoInfo.PixelAspectRatio.Numerator == 1 && format->videoInfo.PixelAspectRatio.Denominator == 1, "Unexpected PAR.\n"); ok(format->videoInfo.SourceChromaSubsampling == MFVideoChromaSubsampling_Unknown, "Unexpected chroma subsampling.\n"); @@ -7998,7 +7790,7 @@ static void check_video_format(const MFVIDEOFORMAT *format, unsigned int width, ok(format->videoInfo.SourceLighting == MFVideoLighting_office, "Unexpected source lighting %u.\n", format->videoInfo.SourceLighting); ok(format->videoInfo.FramesPerSecond.Numerator == 60 && - format->videoInfo.FramesPerSecond.Denominator == 1, "Unexpected frame rate %lu/%lu.\n", + format->videoInfo.FramesPerSecond.Denominator == 1, "Unexpected frame rate %u/%u.\n", format->videoInfo.FramesPerSecond.Numerator, format->videoInfo.FramesPerSecond.Denominator); ok(format->videoInfo.NominalRange == MFNominalRange_Normal, "Unexpected nominal range %u.\n", format->videoInfo.NominalRange); @@ -8013,8 +7805,8 @@ static void check_video_format(const MFVIDEOFORMAT *format, unsigned int width, ok(format->compressedInfo.AvgBitrate == 0, "Unexpected bitrate.\n"); ok(format->compressedInfo.AvgBitErrorRate == 0, "Unexpected error bitrate.\n"); ok(format->compressedInfo.MaxKeyFrameSpacing == 0, "Unexpected MaxKeyFrameSpacing.\n"); - ok(format->surfaceInfo.Format == d3dformat, "Unexpected format %lu.\n", format->surfaceInfo.Format); - ok(format->surfaceInfo.PaletteEntries == 0, "Unexpected palette size %lu.\n", format->surfaceInfo.PaletteEntries); + ok(format->surfaceInfo.Format == d3dformat, "Unexpected format %u.\n", format->surfaceInfo.Format); + ok(format->surfaceInfo.PaletteEntries == 0, "Unexpected palette size %u.\n", format->surfaceInfo.PaletteEntries); } static void test_MFInitVideoFormat_RGB(void) @@ -8047,13 +7839,13 @@ static void test_MFInitVideoFormat_RGB(void) } hr = pMFInitVideoFormat_RGB(NULL, 64, 32, 0); - ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(formats); ++i) { memset(&format, 0, sizeof(format)); hr = pMFInitVideoFormat_RGB(&format, 64, 32, formats[i]); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); if (SUCCEEDED(hr)) check_video_format(&format, 64, 32, formats[i]); } @@ -8090,7 +7882,6 @@ START_TEST(mfplat) test_file_stream(); test_MFCreateMFByteStreamOnStream(); test_system_memory_buffer(); - test_system_memory_aligned_buffer(); test_source_resolver(); test_MFCreateAsyncResult(); test_allocate_queue(); @@ -8107,7 +7898,6 @@ START_TEST(mfplat) test_MFInvokeCallback(); test_stream_descriptor(); test_MFCalculateImageSize(); - test_MFGetPlaneSize(); test_MFCompareFullToPartialMediaType(); test_attributes_serialization(); test_wrapped_media_type(); @@ -8127,7 +7917,6 @@ START_TEST(mfplat) test_MFCreateDXSurfaceBuffer(); test_MFCreateTrackedSample(); test_MFFrameRateToAverageTimePerFrame(); - test_MFAverageTimePerFrameToFrameRate(); test_MFMapDXGIFormatToDX9Format(); test_d3d11_surface_buffer(); test_d3d12_surface_buffer(); diff --git a/dlls/mfplat/unix_private.h b/dlls/mfplat/unix_private.h new file mode 100644 index 00000000000..88566ab1db5 --- /dev/null +++ wine/dlls/mfplat/unix_private.h @@ -0,0 +1,37 @@ +/* + * winegstreamer Unix library interface + * + * Copyright 2020-2021 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_WINEGSTREAMER_UNIX_PRIVATE_H +#define __WINE_WINEGSTREAMER_UNIX_PRIVATE_H + +#include "unixlib.h" + +extern bool init_gstreamer(void) DECLSPEC_HIDDEN; +extern GstElement *create_element(const char *name, const char *plugin_set) DECLSPEC_HIDDEN; +extern GstCaps *wg_format_to_caps(const struct wg_format *format) DECLSPEC_HIDDEN; +extern void wg_format_from_caps(struct wg_format *format, const GstCaps *caps) DECLSPEC_HIDDEN; +extern bool wg_format_compare(const struct wg_format *a, const struct wg_format *b) DECLSPEC_HIDDEN; + +extern NTSTATUS wg_transform_create(void *args) DECLSPEC_HIDDEN; +extern NTSTATUS wg_transform_destroy(void *args) DECLSPEC_HIDDEN; +extern NTSTATUS wg_transform_push_data(void *args) DECLSPEC_HIDDEN; +extern NTSTATUS wg_transform_read_data(void *args) DECLSPEC_HIDDEN; + +#endif /* __WINE_WINEGSTREAMER_UNIX_PRIVATE_H */ diff --git a/dlls/mfplat/unixlib.h b/dlls/mfplat/unixlib.h new file mode 100644 index 00000000000..e39cf54fd08 --- /dev/null +++ wine/dlls/mfplat/unixlib.h @@ -0,0 +1,354 @@ +/* + * winegstreamer Unix library interface + * + * Copyright 2020-2021 Zebediah Figura for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_WINEGSTREAMER_UNIXLIB_H +#define __WINE_WINEGSTREAMER_UNIXLIB_H + +#include +#include +#include "windef.h" +#include "winternl.h" +#include "wtypes.h" +#include "mmreg.h" + +#include "wine/unixlib.h" + +struct wg_format +{ + enum wg_major_type + { + WG_MAJOR_TYPE_UNKNOWN, + WG_MAJOR_TYPE_VIDEO, + WG_MAJOR_TYPE_AUDIO, + } major_type; + + union + { + struct + { + enum wg_video_format + { + WG_VIDEO_FORMAT_UNKNOWN, + + WG_VIDEO_FORMAT_BGRA, + WG_VIDEO_FORMAT_BGRx, + WG_VIDEO_FORMAT_BGR, + WG_VIDEO_FORMAT_RGB15, + WG_VIDEO_FORMAT_RGB16, + + WG_VIDEO_FORMAT_AYUV, + WG_VIDEO_FORMAT_I420, + WG_VIDEO_FORMAT_NV12, + WG_VIDEO_FORMAT_UYVY, + WG_VIDEO_FORMAT_YUY2, + WG_VIDEO_FORMAT_YV12, + WG_VIDEO_FORMAT_YVYU, + + WG_VIDEO_FORMAT_CINEPAK, + } format; + int32_t width, height; + uint32_t fps_n, fps_d; + } video; + struct + { + enum wg_audio_format + { + WG_AUDIO_FORMAT_UNKNOWN, + + WG_AUDIO_FORMAT_U8, + WG_AUDIO_FORMAT_S16LE, + WG_AUDIO_FORMAT_S24LE, + WG_AUDIO_FORMAT_S32LE, + WG_AUDIO_FORMAT_F32LE, + WG_AUDIO_FORMAT_F64LE, + + WG_AUDIO_FORMAT_MPEG1_LAYER1, + WG_AUDIO_FORMAT_MPEG1_LAYER2, + WG_AUDIO_FORMAT_MPEG1_LAYER3, + } format; + + uint32_t channels; + uint32_t channel_mask; /* In WinMM format. */ + uint32_t rate; + } audio; + } u; +}; + +struct wg_encoded_format +{ + enum wg_encoded_type + { + WG_ENCODED_TYPE_UNKNOWN, + WG_ENCODED_TYPE_WMA, + WG_ENCODED_TYPE_XMA, + WG_ENCODED_TYPE_AAC, + WG_ENCODED_TYPE_H264, + } encoded_type; + + union + { + struct + { + uint32_t version; + uint32_t bitrate; + uint32_t rate; + uint32_t depth; + uint32_t channels; + uint32_t block_align; + uint32_t codec_data_len; + unsigned char codec_data[64]; + } xwma; + struct + { + uint32_t payload_type; + uint32_t profile_level_indication; + uint32_t codec_data_len; + unsigned char codec_data[64]; + } aac; + struct + { + int32_t width, height; + uint32_t fps_n, fps_d; + uint32_t profile; + uint32_t level; + } h264; + } u; +}; + +struct wg_rect +{ + uint32_t left; + uint32_t right; + uint32_t top; + uint32_t bottom; +}; + +struct wg_parser_buffer +{ + /* pts and duration are in 100-nanosecond units. */ + UINT64 pts, duration; + UINT32 size; + bool discontinuity, preroll, delta, has_pts, has_duration; +}; +C_ASSERT(sizeof(struct wg_parser_buffer) == 32); + +enum wg_read_result +{ + WG_READ_SUCCESS, + WG_READ_FAILURE, + WG_READ_FLUSHING, + WG_READ_EOS, +}; + +enum wg_parser_type +{ + WG_PARSER_DECODEBIN, + WG_PARSER_AVIDEMUX, + WG_PARSER_MPEGAUDIOPARSE, + WG_PARSER_WAVPARSE, + WG_PARSER_AUDIOCONV, + WG_PARSER_VIDEOCONV, +}; + +struct wg_parser_create_params +{ + struct wg_parser *parser; + enum wg_parser_type type; + bool unlimited_buffering; +}; + +struct wg_parser_connect_params +{ + struct wg_parser *parser; + UINT64 file_size; +}; + +struct wg_parser_connect_unseekable_params +{ + struct wg_parser *parser; + const struct wg_format *in_format; + UINT32 stream_count; + const struct wg_format *out_formats; + const struct wg_rect *apertures; +}; + +struct wg_parser_get_next_read_offset_params +{ + struct wg_parser *parser; + UINT32 size; + UINT64 offset; +}; + +struct wg_parser_push_data_params +{ + struct wg_parser *parser; + enum wg_read_result result; + const void *data; + UINT32 size; +}; + +struct wg_parser_get_stream_count_params +{ + struct wg_parser *parser; + UINT32 count; +}; + +struct wg_parser_get_stream_params +{ + struct wg_parser *parser; + UINT32 index; + struct wg_parser_stream *stream; +}; + +struct wg_parser_stream_get_preferred_format_params +{ + struct wg_parser_stream *stream; + struct wg_format *format; +}; + +#define STREAM_ENABLE_FLAG_FLIP_RGB 0x1 + +struct wg_parser_stream_enable_params +{ + struct wg_parser_stream *stream; + const struct wg_format *format; + const struct wg_rect *aperture; + uint32_t flags; +}; + +struct wg_parser_stream_get_buffer_params +{ + struct wg_parser_stream *stream; + struct wg_parser_buffer *buffer; +}; + +struct wg_parser_stream_copy_buffer_params +{ + struct wg_parser_stream *stream; + void *data; + UINT32 offset; + UINT32 size; +}; + +struct wg_parser_stream_notify_qos_params +{ + struct wg_parser_stream *stream; + bool underflow; + DOUBLE proportion; + INT64 diff; + UINT64 timestamp; +}; + +struct wg_parser_stream_get_duration_params +{ + struct wg_parser_stream *stream; + UINT64 duration; +}; + +struct wg_parser_stream_get_language_params +{ + struct wg_parser_stream *stream; + char *buffer; + UINT32 size; +}; + +struct wg_parser_stream_seek_params +{ + struct wg_parser_stream *stream; + DOUBLE rate; + UINT64 start_pos, stop_pos; + DWORD start_flags, stop_flags; +}; + +struct wg_transform_create_params +{ + struct wg_transform *transform; + const struct wg_encoded_format *input_format; + const struct wg_format *output_format; +}; + +struct wg_transform_push_data_params +{ + struct wg_transform *transform; + const void *data; + UINT32 size; +}; + +enum wg_sample_flags +{ + WG_SAMPLE_FLAG_INCOMPLETE = 1, + WG_SAMPLE_FLAG_HAS_PTS = 2, + WG_SAMPLE_FLAG_HAS_DURATION = 4, +}; + +struct wg_sample +{ + UINT32 flags; + BYTE *data; + UINT32 size; + /* pts and duration are in 100-nanosecond units. */ + ULONGLONG pts, duration; + struct wg_format *format; +}; + +struct wg_transform_read_data_params +{ + struct wg_transform *transform; + struct wg_sample *sample; +}; + +enum unix_funcs +{ + unix_wg_parser_create, + unix_wg_parser_destroy, + + unix_wg_parser_connect, + unix_wg_parser_connect_unseekable, + unix_wg_parser_disconnect, + + unix_wg_parser_get_next_read_offset, + unix_wg_parser_push_data, + + unix_wg_parser_get_stream_count, + unix_wg_parser_get_stream, + + unix_wg_parser_stream_get_preferred_format, + unix_wg_parser_stream_enable, + unix_wg_parser_stream_disable, + + unix_wg_parser_stream_get_buffer, + unix_wg_parser_stream_copy_buffer, + unix_wg_parser_stream_release_buffer, + unix_wg_parser_stream_notify_qos, + + unix_wg_parser_stream_get_duration, + unix_wg_parser_stream_get_language, + unix_wg_parser_stream_seek, + + unix_wg_parser_stream_drain, + + unix_wg_transform_create, + unix_wg_transform_destroy, + + unix_wg_transform_push_data, + unix_wg_transform_read_data, +}; + +#endif /* __WINE_WINEGSTREAMER_UNIXLIB_H */ diff --git a/dlls/mfplat/wg_parser.c b/dlls/mfplat/wg_parser.c new file mode 100644 index 00000000000..cbd037e42c8 --- /dev/null +++ wine/dlls/mfplat/wg_parser.c @@ -0,0 +1,2584 @@ +/* + * GStreamer parser backend + * + * Copyright 2010 Maarten Lankhorst for CodeWeavers + * Copyright 2010 Aric Stewart for CodeWeavers + * Copyright 2019-2020 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#if 0 +#pragma makedep unix +#endif + +#include "config.h" + +#include +#include +#include + +#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_30 +#include +#include +#include + +#include "winternl.h" +#include "dshow.h" + +#include "unix_private.h" + +typedef enum +{ + GST_AUTOPLUG_SELECT_TRY, + GST_AUTOPLUG_SELECT_EXPOSE, + GST_AUTOPLUG_SELECT_SKIP, +} GstAutoplugSelectResult; + +/* GStreamer callbacks may be called on threads not created by Wine, and + * therefore cannot access the Wine TEB. This means that we must use GStreamer + * debug logging instead of Wine debug logging. In order to be safe we forbid + * any use of Wine debug logging in this entire file. */ + +GST_DEBUG_CATEGORY(wine); +#define GST_CAT_DEFAULT wine + +typedef BOOL (*init_gst_cb)(struct wg_parser *parser); + +struct wg_parser +{ + init_gst_cb init_gst; + + struct wg_parser_stream **streams; + unsigned int stream_count, expected_stream_count; + + GstElement *container, *decodebin; + GstBus *bus; + GstPad *my_src, *their_sink; + + guint64 file_size, start_offset, next_offset, stop_offset; + guint64 next_pull_offset; + + pthread_t push_thread; + + pthread_mutex_t mutex; + + pthread_cond_t init_cond; + bool no_more_pads, has_duration, error, pull_mode, seekable; + + pthread_cond_t read_cond, read_done_cond; + struct + { + GstBuffer *buffer; + uint64_t offset; + uint32_t size; + bool done; + GstFlowReturn ret; + } read_request; + + bool sink_connected, draining; + + bool unlimited_buffering; + struct wg_format input_format; + + bool use_mediaconv; +}; + +struct wg_parser_stream +{ + struct wg_parser *parser; + + GstPad *their_src, *post_sink, *post_src, *my_sink; + GstElement *flip, *box; + GstSegment segment; + struct wg_format preferred_format, current_format; + struct wg_rect aperture; + + pthread_cond_t event_cond, event_empty_cond; + GstBuffer *buffer; + GstMapInfo map_info; + + bool flushing, eos, enabled, has_caps; + + uint64_t duration; + gchar *language_code; +}; + +static enum wg_audio_format wg_audio_format_from_gst(GstAudioFormat format) +{ + switch (format) + { + case GST_AUDIO_FORMAT_U8: + return WG_AUDIO_FORMAT_U8; + case GST_AUDIO_FORMAT_S16LE: + return WG_AUDIO_FORMAT_S16LE; + case GST_AUDIO_FORMAT_S24LE: + return WG_AUDIO_FORMAT_S24LE; + case GST_AUDIO_FORMAT_S32LE: + return WG_AUDIO_FORMAT_S32LE; + case GST_AUDIO_FORMAT_F32LE: + return WG_AUDIO_FORMAT_F32LE; + case GST_AUDIO_FORMAT_F64LE: + return WG_AUDIO_FORMAT_F64LE; + default: + return WG_AUDIO_FORMAT_UNKNOWN; + } +} + +static uint32_t wg_channel_position_from_gst(GstAudioChannelPosition position) +{ + static const uint32_t position_map[] = + { + SPEAKER_FRONT_LEFT, + SPEAKER_FRONT_RIGHT, + SPEAKER_FRONT_CENTER, + SPEAKER_LOW_FREQUENCY, + SPEAKER_BACK_LEFT, + SPEAKER_BACK_RIGHT, + SPEAKER_FRONT_LEFT_OF_CENTER, + SPEAKER_FRONT_RIGHT_OF_CENTER, + SPEAKER_BACK_CENTER, + 0, + SPEAKER_SIDE_LEFT, + SPEAKER_SIDE_RIGHT, + SPEAKER_TOP_FRONT_LEFT, + SPEAKER_TOP_FRONT_RIGHT, + SPEAKER_TOP_FRONT_CENTER, + SPEAKER_TOP_CENTER, + SPEAKER_TOP_BACK_LEFT, + SPEAKER_TOP_BACK_RIGHT, + 0, + 0, + SPEAKER_TOP_BACK_CENTER, + }; + + if (position == GST_AUDIO_CHANNEL_POSITION_MONO) + return SPEAKER_FRONT_CENTER; + + if (position >= 0 && position < ARRAY_SIZE(position_map)) + return position_map[position]; + return 0; +} + +static uint32_t wg_channel_mask_from_gst(const GstAudioInfo *info) +{ + uint32_t mask = 0, position; + unsigned int i; + + for (i = 0; i < GST_AUDIO_INFO_CHANNELS(info); ++i) + { + if (!(position = wg_channel_position_from_gst(GST_AUDIO_INFO_POSITION(info, i)))) + { + GST_WARNING("Unsupported channel %#x.", GST_AUDIO_INFO_POSITION(info, i)); + return 0; + } + /* Make sure it's also in WinMM order. WinMM mandates that channels be + * ordered, as it were, from least to most significant SPEAKER_* bit. + * Hence we fail if the current channel was already specified, or if any + * higher bit was already specified. */ + if (mask & ~(position - 1)) + { + GST_WARNING("Unsupported channel order."); + return 0; + } + mask |= position; + } + return mask; +} + +static void wg_format_from_audio_info(struct wg_format *format, const GstAudioInfo *info) +{ + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.format = wg_audio_format_from_gst(GST_AUDIO_INFO_FORMAT(info)); + format->u.audio.channels = GST_AUDIO_INFO_CHANNELS(info); + format->u.audio.channel_mask = wg_channel_mask_from_gst(info); + format->u.audio.rate = GST_AUDIO_INFO_RATE(info); +} + +static enum wg_video_format wg_video_format_from_gst(GstVideoFormat format) +{ + switch (format) + { + case GST_VIDEO_FORMAT_BGRA: + return WG_VIDEO_FORMAT_BGRA; + case GST_VIDEO_FORMAT_BGRx: + return WG_VIDEO_FORMAT_BGRx; + case GST_VIDEO_FORMAT_BGR: + return WG_VIDEO_FORMAT_BGR; + case GST_VIDEO_FORMAT_RGB15: + return WG_VIDEO_FORMAT_RGB15; + case GST_VIDEO_FORMAT_RGB16: + return WG_VIDEO_FORMAT_RGB16; + case GST_VIDEO_FORMAT_AYUV: + return WG_VIDEO_FORMAT_AYUV; + case GST_VIDEO_FORMAT_I420: + return WG_VIDEO_FORMAT_I420; + case GST_VIDEO_FORMAT_NV12: + return WG_VIDEO_FORMAT_NV12; + case GST_VIDEO_FORMAT_UYVY: + return WG_VIDEO_FORMAT_UYVY; + case GST_VIDEO_FORMAT_YUY2: + return WG_VIDEO_FORMAT_YUY2; + case GST_VIDEO_FORMAT_YV12: + return WG_VIDEO_FORMAT_YV12; + case GST_VIDEO_FORMAT_YVYU: + return WG_VIDEO_FORMAT_YVYU; + default: + return WG_VIDEO_FORMAT_UNKNOWN; + } +} + +static void wg_format_from_video_info(struct wg_format *format, const GstVideoInfo *info) +{ + format->major_type = WG_MAJOR_TYPE_VIDEO; + format->u.video.format = wg_video_format_from_gst(GST_VIDEO_INFO_FORMAT(info)); + format->u.video.width = GST_VIDEO_INFO_WIDTH(info); + format->u.video.height = GST_VIDEO_INFO_HEIGHT(info); + format->u.video.fps_n = GST_VIDEO_INFO_FPS_N(info); + format->u.video.fps_d = GST_VIDEO_INFO_FPS_D(info); +} + +static void wg_format_from_caps_audio_mpeg(struct wg_format *format, const GstCaps *caps) +{ + const GstStructure *structure = gst_caps_get_structure(caps, 0); + gint layer, channels, rate; + + if (!gst_structure_get_int(structure, "layer", &layer)) + { + GST_WARNING("Missing \"layer\" value."); + return; + } + if (!gst_structure_get_int(structure, "channels", &channels)) + { + GST_WARNING("Missing \"channels\" value."); + return; + } + if (!gst_structure_get_int(structure, "rate", &rate)) + { + GST_WARNING("Missing \"rate\" value."); + return; + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + + if (layer == 1) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER1; + else if (layer == 2) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER2; + else if (layer == 3) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER3; + + format->u.audio.channels = channels; + format->u.audio.rate = rate; +} + +static void wg_format_from_caps_video_cinepak(struct wg_format *format, const GstCaps *caps) +{ + const GstStructure *structure = gst_caps_get_structure(caps, 0); + gint width, height, fps_n, fps_d; + + if (!gst_structure_get_int(structure, "width", &width)) + { + GST_WARNING("Missing \"width\" value."); + return; + } + if (!gst_structure_get_int(structure, "height", &height)) + { + GST_WARNING("Missing \"height\" value."); + return; + } + if (!gst_structure_get_fraction(structure, "framerate", &fps_n, &fps_d)) + { + fps_n = 0; + fps_d = 1; + } + + format->major_type = WG_MAJOR_TYPE_VIDEO; + format->u.video.format = WG_VIDEO_FORMAT_CINEPAK; + format->u.video.width = width; + format->u.video.height = height; + format->u.video.fps_n = fps_n; + format->u.video.fps_d = fps_d; +} + +void wg_format_from_caps(struct wg_format *format, const GstCaps *caps) +{ + const GstStructure *structure = gst_caps_get_structure(caps, 0); + const char *name = gst_structure_get_name(structure); + + memset(format, 0, sizeof(*format)); + + if (!strcmp(name, "audio/x-raw")) + { + GstAudioInfo info; + + if (gst_audio_info_from_caps(&info, caps)) + wg_format_from_audio_info(format, &info); + } + else if (!strcmp(name, "video/x-raw")) + { + GstVideoInfo info; + + if (gst_video_info_from_caps(&info, caps)) + wg_format_from_video_info(format, &info); + } + else if (!strcmp(name, "audio/mpeg")) + { + wg_format_from_caps_audio_mpeg(format, caps); + } + else if (!strcmp(name, "video/x-cinepak")) + { + wg_format_from_caps_video_cinepak(format, caps); + } + else + { + gchar *str = gst_caps_to_string(caps); + + GST_FIXME("Unhandled caps %s.", str); + g_free(str); + } +} + +static GstAudioFormat wg_audio_format_to_gst(enum wg_audio_format format) +{ + switch (format) + { + case WG_AUDIO_FORMAT_U8: return GST_AUDIO_FORMAT_U8; + case WG_AUDIO_FORMAT_S16LE: return GST_AUDIO_FORMAT_S16LE; + case WG_AUDIO_FORMAT_S24LE: return GST_AUDIO_FORMAT_S24LE; + case WG_AUDIO_FORMAT_S32LE: return GST_AUDIO_FORMAT_S32LE; + case WG_AUDIO_FORMAT_F32LE: return GST_AUDIO_FORMAT_F32LE; + case WG_AUDIO_FORMAT_F64LE: return GST_AUDIO_FORMAT_F64LE; + default: return GST_AUDIO_FORMAT_UNKNOWN; + } +} + +static void wg_channel_mask_to_gst(GstAudioChannelPosition *positions, uint32_t mask, uint32_t channel_count) +{ + const uint32_t orig_mask = mask; + unsigned int i; + DWORD bit; + + static const GstAudioChannelPosition position_map[] = + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE1, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_TOP_CENTER, + GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER, + GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT, + }; + + for (i = 0; i < channel_count; ++i) + { + positions[i] = GST_AUDIO_CHANNEL_POSITION_NONE; + if (BitScanForward(&bit, mask)) + { + if (bit < ARRAY_SIZE(position_map)) + positions[i] = position_map[bit]; + else + GST_WARNING("Invalid channel mask %#x.\n", orig_mask); + mask &= ~(1 << bit); + } + else + { + GST_WARNING("Incomplete channel mask %#x.\n", orig_mask); + } + } +} + +static GstCaps *wg_format_to_caps_audio(const struct wg_format *format) +{ + GstAudioChannelPosition positions[32]; + GstAudioFormat audio_format; + GstAudioInfo info; + + if ((audio_format = wg_audio_format_to_gst(format->u.audio.format)) == GST_AUDIO_FORMAT_UNKNOWN) + return NULL; + + wg_channel_mask_to_gst(positions, format->u.audio.channel_mask, format->u.audio.channels); + gst_audio_info_set_format(&info, audio_format, format->u.audio.rate, format->u.audio.channels, positions); + return gst_audio_info_to_caps(&info); +} + +static GstVideoFormat wg_video_format_to_gst(enum wg_video_format format) +{ + switch (format) + { + case WG_VIDEO_FORMAT_BGRA: return GST_VIDEO_FORMAT_BGRA; + case WG_VIDEO_FORMAT_BGRx: return GST_VIDEO_FORMAT_BGRx; + case WG_VIDEO_FORMAT_BGR: return GST_VIDEO_FORMAT_BGR; + case WG_VIDEO_FORMAT_RGB15: return GST_VIDEO_FORMAT_RGB15; + case WG_VIDEO_FORMAT_RGB16: return GST_VIDEO_FORMAT_RGB16; + case WG_VIDEO_FORMAT_AYUV: return GST_VIDEO_FORMAT_AYUV; + case WG_VIDEO_FORMAT_I420: return GST_VIDEO_FORMAT_I420; + case WG_VIDEO_FORMAT_NV12: return GST_VIDEO_FORMAT_NV12; + case WG_VIDEO_FORMAT_UYVY: return GST_VIDEO_FORMAT_UYVY; + case WG_VIDEO_FORMAT_YUY2: return GST_VIDEO_FORMAT_YUY2; + case WG_VIDEO_FORMAT_YV12: return GST_VIDEO_FORMAT_YV12; + case WG_VIDEO_FORMAT_YVYU: return GST_VIDEO_FORMAT_YVYU; + default: return GST_VIDEO_FORMAT_UNKNOWN; + } +} + +static GstCaps *wg_format_to_caps_video(const struct wg_format *format) +{ + GstVideoFormat video_format; + GstVideoInfo info; + unsigned int i; + GstCaps *caps; + + if ((video_format = wg_video_format_to_gst(format->u.video.format)) == GST_VIDEO_FORMAT_UNKNOWN) + return NULL; + + gst_video_info_set_format(&info, video_format, format->u.video.width, abs(format->u.video.height)); + if ((caps = gst_video_info_to_caps(&info))) + { + /* Clear some fields that shouldn't prevent us from connecting. */ + for (i = 0; i < gst_caps_get_size(caps); ++i) + { + gst_structure_remove_fields(gst_caps_get_structure(caps, i), + "framerate", "pixel-aspect-ratio", "colorimetry", "chroma-site", NULL); + } + } + return caps; +} + +GstCaps *wg_format_to_caps(const struct wg_format *format) +{ + switch (format->major_type) + { + case WG_MAJOR_TYPE_UNKNOWN: + return NULL; + case WG_MAJOR_TYPE_AUDIO: + return wg_format_to_caps_audio(format); + case WG_MAJOR_TYPE_VIDEO: + return wg_format_to_caps_video(format); + } + assert(0); + return NULL; +} + +bool wg_format_compare(const struct wg_format *a, const struct wg_format *b) +{ + if (a->major_type != b->major_type) + return false; + + switch (a->major_type) + { + case WG_MAJOR_TYPE_UNKNOWN: + return false; + + case WG_MAJOR_TYPE_AUDIO: + return a->u.audio.format == b->u.audio.format + && a->u.audio.channels == b->u.audio.channels + && a->u.audio.rate == b->u.audio.rate; + + case WG_MAJOR_TYPE_VIDEO: + /* Do not compare FPS. */ + return a->u.video.format == b->u.video.format + && a->u.video.width == b->u.video.width + && abs(a->u.video.height) == abs(b->u.video.height); + } + + assert(0); + return false; +} + +static NTSTATUS wg_parser_get_stream_count(void *args) +{ + struct wg_parser_get_stream_count_params *params = args; + + params->count = params->parser->stream_count; + return S_OK; +} + +static NTSTATUS wg_parser_get_stream(void *args) +{ + struct wg_parser_get_stream_params *params = args; + + params->stream = params->parser->streams[params->index]; + return S_OK; +} + +static NTSTATUS wg_parser_get_next_read_offset(void *args) +{ + struct wg_parser_get_next_read_offset_params *params = args; + struct wg_parser *parser = params->parser; + + pthread_mutex_lock(&parser->mutex); + + while (parser->sink_connected && (!parser->read_request.size || parser->read_request.done)) + pthread_cond_wait(&parser->read_cond, &parser->mutex); + + if (!parser->sink_connected) + { + pthread_mutex_unlock(&parser->mutex); + return VFW_E_WRONG_STATE; + } + + params->offset = parser->read_request.offset; + params->size = parser->read_request.size; + + pthread_mutex_unlock(&parser->mutex); + return S_OK; +} + +static GstFlowReturn wg_read_result_to_gst(enum wg_read_result result) +{ + switch (result) + { + case WG_READ_SUCCESS: return GST_FLOW_OK; + case WG_READ_FAILURE: return GST_FLOW_ERROR; + case WG_READ_FLUSHING: return GST_FLOW_FLUSHING; + case WG_READ_EOS: return GST_FLOW_EOS; + } + return GST_FLOW_ERROR; +} + +static NTSTATUS wg_parser_push_data(void *args) +{ + const struct wg_parser_push_data_params *params = args; + struct wg_parser *parser = params->parser; + enum wg_read_result result = params->result; + const void *data = params->data; + uint32_t size = params->size; + + pthread_mutex_lock(&parser->mutex); + + if (result != WG_READ_SUCCESS) + { + parser->read_request.ret = wg_read_result_to_gst(result); + } + else if (data) + { + if (size) + { + GstMapInfo map_info; + + /* Note that we don't allocate the buffer until we have a size. + * midiparse passes a NULL buffer and a size of UINT_MAX, in an + * apparent attempt to read the whole input stream at once. */ + if (!parser->read_request.buffer) + parser->read_request.buffer = gst_buffer_new_and_alloc(size); + gst_buffer_map(parser->read_request.buffer, &map_info, GST_MAP_WRITE); + memcpy(map_info.data, data, size); + gst_buffer_unmap(parser->read_request.buffer, &map_info); + parser->read_request.ret = GST_FLOW_OK; + } + else + { + parser->read_request.ret = GST_FLOW_EOS; + } + } + else + { + parser->read_request.ret = GST_FLOW_ERROR; + } + parser->read_request.done = true; + parser->read_request.size = 0; + + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&parser->read_done_cond); + + return S_OK; +} + +static NTSTATUS wg_parser_stream_get_preferred_format(void *args) +{ + const struct wg_parser_stream_get_preferred_format_params *params = args; + + if (params->stream->has_caps) + *params->format = params->stream->preferred_format; + + return S_OK; +} + +static NTSTATUS wg_parser_stream_enable(void *args) +{ + const struct wg_parser_stream_enable_params *params = args; + struct wg_parser_stream *stream = params->stream; + const struct wg_format *format = params->format; + const struct wg_rect *aperture = params->aperture; + + if (!stream->parser->seekable) + return S_OK; + + stream->current_format = *format; + stream->enabled = true; + + if (format->major_type == WG_MAJOR_TYPE_VIDEO) + { + if (params->flags & STREAM_ENABLE_FLAG_FLIP_RGB) + { + bool flip = (format->u.video.height < 0); + + switch (format->u.video.format) + { + case WG_VIDEO_FORMAT_BGRA: + case WG_VIDEO_FORMAT_BGRx: + case WG_VIDEO_FORMAT_BGR: + case WG_VIDEO_FORMAT_RGB15: + case WG_VIDEO_FORMAT_RGB16: + flip = !flip; + break; + + case WG_VIDEO_FORMAT_AYUV: + case WG_VIDEO_FORMAT_I420: + case WG_VIDEO_FORMAT_NV12: + case WG_VIDEO_FORMAT_UYVY: + case WG_VIDEO_FORMAT_YUY2: + case WG_VIDEO_FORMAT_YV12: + case WG_VIDEO_FORMAT_YVYU: + case WG_VIDEO_FORMAT_UNKNOWN: + case WG_VIDEO_FORMAT_CINEPAK: + break; + } + + gst_util_set_object_arg(G_OBJECT(stream->flip), "method", flip ? "vertical-flip" : "none"); + } + + if (aperture) + { + if (!stream->box && (stream->aperture.left || stream->aperture.top || + (stream->aperture.right && stream->aperture.right != stream->current_format.u.video.width) || + (stream->aperture.bottom && stream->aperture.bottom != stream->current_format.u.video.height))) + { + fprintf(stderr, "winegstreamer: failed to create videobox, are %u-bit GStreamer \"good\" plugins installed?\n", + 8 * (int)sizeof(void *)); + return E_FAIL; + } + + if (aperture->left) + g_object_set(G_OBJECT(stream->box), "left", -aperture->left, NULL); + if (aperture->top) + g_object_set(G_OBJECT(stream->box), "top", -aperture->top, NULL); + if (aperture->right) + g_object_set(G_OBJECT(stream->box), "right", aperture->right - format->u.video.width, NULL); + if (aperture->bottom) + g_object_set(G_OBJECT(stream->box), "bottom", aperture->bottom - format->u.video.height, NULL); + } + } + + gst_pad_push_event(stream->my_sink, gst_event_new_reconfigure()); + return S_OK; +} + +static NTSTATUS wg_parser_stream_disable(void *args) +{ + struct wg_parser_stream *stream = args; + + stream->enabled = false; + return S_OK; +} + +static NTSTATUS wg_parser_stream_get_buffer(void *args) +{ + const struct wg_parser_stream_get_buffer_params *params = args; + struct wg_parser_buffer *wg_buffer = params->buffer; + struct wg_parser_stream *stream = params->stream; + struct wg_parser *parser = stream->parser; + GstBuffer *buffer; + + pthread_mutex_lock(&parser->mutex); + + while (!stream->eos && !stream->buffer) + pthread_cond_wait(&stream->event_cond, &parser->mutex); + + /* Note that we can both have a buffer and stream->eos, in which case we + * must return the buffer. */ + if ((buffer = stream->buffer)) + { + /* FIXME: Should we use gst_segment_to_stream_time_full()? Under what + * circumstances is the stream time not equal to the buffer PTS? Note + * that this will need modification to wg_parser_stream_notify_qos() as + * well. */ + + if ((wg_buffer->has_pts = GST_BUFFER_PTS_IS_VALID(buffer))) + wg_buffer->pts = GST_BUFFER_PTS(buffer) / 100; + if ((wg_buffer->has_duration = GST_BUFFER_DURATION_IS_VALID(buffer))) + wg_buffer->duration = GST_BUFFER_DURATION(buffer) / 100; + wg_buffer->discontinuity = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DISCONT); + wg_buffer->preroll = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_LIVE); + wg_buffer->delta = GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT); + wg_buffer->size = gst_buffer_get_size(buffer); + + pthread_mutex_unlock(&parser->mutex); + return S_OK; + } + + pthread_mutex_unlock(&parser->mutex); + return S_FALSE; +} + +static NTSTATUS wg_parser_stream_copy_buffer(void *args) +{ + const struct wg_parser_stream_copy_buffer_params *params = args; + struct wg_parser_stream *stream = params->stream; + struct wg_parser *parser = stream->parser; + uint32_t offset = params->offset; + uint32_t size = params->size; + + pthread_mutex_lock(&parser->mutex); + + if (!stream->buffer) + { + pthread_mutex_unlock(&parser->mutex); + return VFW_E_WRONG_STATE; + } + + assert(offset < stream->map_info.size); + assert(offset + size <= stream->map_info.size); + memcpy(params->data, stream->map_info.data + offset, size); + + pthread_mutex_unlock(&parser->mutex); + return S_OK; +} + +static NTSTATUS wg_parser_stream_release_buffer(void *args) +{ + struct wg_parser_stream *stream = args; + struct wg_parser *parser = stream->parser; + + pthread_mutex_lock(&parser->mutex); + + assert(stream->buffer); + + gst_buffer_unmap(stream->buffer, &stream->map_info); + gst_buffer_unref(stream->buffer); + stream->buffer = NULL; + + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&stream->event_empty_cond); + + return S_OK; +} + +static NTSTATUS wg_parser_stream_get_duration(void *args) +{ + struct wg_parser_stream_get_duration_params *params = args; + + params->duration = params->stream->duration; + return S_OK; +} + +static NTSTATUS wg_parser_stream_get_language(void *args) +{ + struct wg_parser_stream_get_language_params *params = args; + if (params->stream->language_code) + lstrcpynA(params->buffer, params->stream->language_code, params->size); + return params->stream->language_code ? S_OK : E_FAIL; +} + +static NTSTATUS wg_parser_stream_seek(void *args) +{ + GstSeekType start_type = GST_SEEK_TYPE_SET, stop_type = GST_SEEK_TYPE_SET; + const struct wg_parser_stream_seek_params *params = args; + DWORD start_flags = params->start_flags; + DWORD stop_flags = params->stop_flags; + GstSeekFlags flags = 0; + + if (!params->stream->parser->seekable) + return E_FAIL; + + if (start_flags & AM_SEEKING_SeekToKeyFrame) + flags |= GST_SEEK_FLAG_KEY_UNIT; + if (start_flags & AM_SEEKING_Segment) + flags |= GST_SEEK_FLAG_SEGMENT; + if (!(start_flags & AM_SEEKING_NoFlush)) + flags |= GST_SEEK_FLAG_FLUSH; + + if ((start_flags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning) + start_type = GST_SEEK_TYPE_NONE; + if ((stop_flags & AM_SEEKING_PositioningBitsMask) == AM_SEEKING_NoPositioning) + stop_type = GST_SEEK_TYPE_NONE; + + if (!gst_pad_push_event(params->stream->my_sink, gst_event_new_seek(params->rate, GST_FORMAT_TIME, + flags, start_type, params->start_pos * 100, stop_type, params->stop_pos * 100))) + GST_ERROR("Failed to seek.\n"); + + return S_OK; +} + +static NTSTATUS wg_parser_stream_drain(void *args) +{ + struct wg_parser_stream *stream = args; + struct wg_parser *parser = stream->parser; + bool ret; + + pthread_mutex_lock(&parser->mutex); + + /* Sanity check making sure caller didn't try to drain an already-EOS or unselected stream. + There's no reason for a caller to do this, but it could be an accident in which case we + should indicate that the stream is drained instead of locking-up. */ + if (!stream->enabled || stream->eos) + { + pthread_mutex_unlock(&parser->mutex); + return true; + } + + parser->draining = true; + pthread_cond_signal(&parser->read_done_cond); + + /* We must wait for either an event to occur or the drain to complete. + Since drains are blocking, we assign this responsibility to the thread + pulling data, as the pipeline will not need to pull more data until + the drain completes. If one input buffer yields more than one output + buffer, the chain callback blocks on the wg_parser_stream_buffer_release + for the first buffer, which would never be called if the drain function + hadn't completed. */ + while (parser->draining && !stream->buffer) + pthread_cond_wait(&stream->event_cond, &parser->mutex); + + ret = !stream->buffer; + parser->draining = false; + + pthread_mutex_unlock(&stream->parser->mutex); + + return ret; +} + +static NTSTATUS wg_parser_stream_notify_qos(void *args) +{ + const struct wg_parser_stream_notify_qos_params *params = args; + struct wg_parser_stream *stream = params->stream; + GstClockTime stream_time; + GstEvent *event; + + /* We return timestamps in stream time, i.e. relative to the start of the + * file (or other medium), but gst_event_new_qos() expects the timestamp in + * running time. */ + stream_time = gst_segment_to_running_time(&stream->segment, GST_FORMAT_TIME, params->timestamp * 100); + if (stream_time == -1) + { + /* This can happen legitimately if the sample falls outside of the + * segment bounds. GStreamer elements shouldn't present the sample in + * that case, but DirectShow doesn't care. */ + GST_LOG("Ignoring QoS event.\n"); + return S_OK; + } + + if (!(event = gst_event_new_qos(params->underflow ? GST_QOS_TYPE_UNDERFLOW : GST_QOS_TYPE_OVERFLOW, + params->proportion, params->diff * 100, stream_time))) + GST_ERROR("Failed to create QOS event.\n"); + gst_pad_push_event(stream->my_sink, event); + + return S_OK; +} + +static GstAutoplugSelectResult autoplug_select_cb(GstElement *bin, GstPad *pad, + GstCaps *caps, GstElementFactory *fact, gpointer user) +{ + const char *name = gst_element_factory_get_longname(fact); + + GST_INFO("Using \"%s\".", name); + + if (strstr(name, "Player protection")) + { + GST_WARNING("Blacklisted a/52 decoder because it only works in Totem."); + return GST_AUTOPLUG_SELECT_SKIP; + } + if (!strcmp(name, "Fluendo Hardware Accelerated Video Decoder")) + { + GST_WARNING("Disabled video acceleration since it breaks in wine."); + return GST_AUTOPLUG_SELECT_SKIP; + } + return GST_AUTOPLUG_SELECT_TRY; +} + +static gint find_videoconv_cb(gconstpointer a, gconstpointer b) +{ + const GValue *val_a = a, *val_b = b; + GstElementFactory *factory_a = g_value_get_object(val_a), *factory_b = g_value_get_object(val_b); + const char *name_a = gst_element_factory_get_longname(factory_a), *name_b = gst_element_factory_get_longname(factory_b); + + if (!strcmp(name_a, "Proton video converter")) + return -1; + if (!strcmp(name_b, "Proton video converter")) + return 1; + return 0; +} + +static GValueArray *autoplug_sort_cb(GstElement *bin, GstPad *pad, + GstCaps *caps, GValueArray *factories, gpointer user) +{ + struct wg_parser *parser = user; + GValueArray *ret = g_value_array_copy(factories); + + if (!parser->use_mediaconv) + return NULL; + + GST_DEBUG("parser %p.", parser); + + g_value_array_sort(ret, find_videoconv_cb); + return ret; +} + +static void no_more_pads_cb(GstElement *element, gpointer user) +{ + struct wg_parser *parser = user; + + GST_DEBUG("parser %p.", parser); + + pthread_mutex_lock(&parser->mutex); + parser->no_more_pads = true; + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&parser->init_cond); +} + +static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) +{ + struct wg_parser_stream *stream = gst_pad_get_element_private(pad); + struct wg_parser *parser = stream->parser; + + GST_LOG("stream %p, type \"%s\".", stream, GST_EVENT_TYPE_NAME(event)); + + switch (event->type) + { + case GST_EVENT_SEGMENT: + if (stream->enabled) + { + const GstSegment *segment; + + gst_event_parse_segment(event, &segment); + + if (segment->format != GST_FORMAT_TIME) + { + GST_FIXME("Unhandled format \"%s\".", gst_format_get_name(segment->format)); + break; + } + + gst_segment_copy_into(segment, &stream->segment); + } + break; + + case GST_EVENT_EOS: + pthread_mutex_lock(&parser->mutex); + stream->eos = true; + pthread_mutex_unlock(&parser->mutex); + if (stream->enabled) + pthread_cond_signal(&stream->event_cond); + else + pthread_cond_signal(&parser->init_cond); + break; + + case GST_EVENT_FLUSH_START: + if (stream->enabled) + { + pthread_mutex_lock(&parser->mutex); + + stream->flushing = true; + pthread_cond_signal(&stream->event_empty_cond); + + if (stream->buffer) + { + gst_buffer_unmap(stream->buffer, &stream->map_info); + gst_buffer_unref(stream->buffer); + stream->buffer = NULL; + } + + pthread_mutex_unlock(&parser->mutex); + } + break; + + case GST_EVENT_FLUSH_STOP: + { + gboolean reset_time; + + gst_event_parse_flush_stop(event, &reset_time); + + if (reset_time) + gst_segment_init(&stream->segment, GST_FORMAT_UNDEFINED); + + pthread_mutex_lock(&parser->mutex); + + stream->eos = false; + if (stream->enabled) + stream->flushing = false; + + pthread_mutex_unlock(&parser->mutex); + break; + } + + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps(event, &caps); + pthread_mutex_lock(&parser->mutex); + wg_format_from_caps(&stream->preferred_format, caps); + stream->has_caps = true; + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&parser->init_cond); + break; + } + + default: + GST_WARNING("Ignoring \"%s\" event.", GST_EVENT_TYPE_NAME(event)); + } + gst_event_unref(event); + return TRUE; +} + +static GstFlowReturn sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *buffer) +{ + struct wg_parser_stream *stream = gst_pad_get_element_private(pad); + struct wg_parser *parser = stream->parser; + + GST_LOG("stream %p, buffer %p.", stream, buffer); + + if (!stream->enabled) + { + gst_buffer_unref(buffer); + return GST_FLOW_OK; + } + + /* Allow this buffer to be flushed by GStreamer. We are effectively + * implementing a queue object here. */ + + pthread_mutex_lock(&parser->mutex); + + while (!stream->flushing && stream->buffer) + pthread_cond_wait(&stream->event_empty_cond, &parser->mutex); + if (stream->flushing) + { + pthread_mutex_unlock(&parser->mutex); + GST_DEBUG("Stream is flushing; discarding buffer."); + gst_buffer_unref(buffer); + return GST_FLOW_FLUSHING; + } + + if (!gst_buffer_map(buffer, &stream->map_info, GST_MAP_READ)) + { + pthread_mutex_unlock(&parser->mutex); + GST_ERROR("Failed to map buffer.\n"); + gst_buffer_unref(buffer); + return GST_FLOW_ERROR; + } + + stream->buffer = buffer; + + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&stream->event_cond); + + /* The chain callback is given a reference to the buffer. Transfer that + * reference to the stream object, which will release it in + * wg_parser_stream_release_buffer(). */ + + GST_LOG("Buffer queued."); + return GST_FLOW_OK; +} + +static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) +{ + struct wg_parser_stream *stream = gst_pad_get_element_private(pad); + + GST_LOG("stream %p, type \"%s\".", stream, gst_query_type_get_name(query->type)); + + switch (query->type) + { + case GST_QUERY_CAPS: + { + GstCaps *caps, *filter, *temp; + gchar *str; + + gst_query_parse_caps(query, &filter); + + if (stream->enabled) + caps = wg_format_to_caps(&stream->current_format); + else + caps = gst_caps_new_any(); + if (!caps) + return FALSE; + + str = gst_caps_to_string(caps); + GST_LOG("Stream caps are \"%s\".", str); + g_free(str); + + if (filter) + { + temp = gst_caps_intersect(caps, filter); + gst_caps_unref(caps); + caps = temp; + } + + gst_query_set_caps_result(query, caps); + gst_caps_unref(caps); + return TRUE; + } + + case GST_QUERY_ACCEPT_CAPS: + { + struct wg_format format; + gboolean ret = TRUE; + GstCaps *caps; + + if (!stream->enabled) + { + gst_query_set_accept_caps_result(query, TRUE); + return TRUE; + } + + gst_query_parse_accept_caps(query, &caps); + wg_format_from_caps(&format, caps); + ret = wg_format_compare(&format, &stream->current_format); + if (!ret && gst_debug_category_get_threshold(GST_CAT_DEFAULT) >= GST_LEVEL_WARNING) + { + gchar *str = gst_caps_to_string(caps); + GST_WARNING("Rejecting caps \"%s\".", str); + g_free(str); + } + gst_query_set_accept_caps_result(query, ret); + return TRUE; + } + + default: + return gst_pad_query_default (pad, parent, query); + } +} + +GstElement *create_element(const char *name, const char *plugin_set) +{ + GstElement *element; + + if (!(element = gst_element_factory_make(name, NULL))) + fprintf(stderr, "winegstreamer: failed to create %s, are %u-bit GStreamer \"%s\" plugins installed?\n", + name, 8 * (unsigned int)sizeof(void *), plugin_set); + return element; +} + +static struct wg_parser_stream *create_stream(struct wg_parser *parser) +{ + struct wg_parser_stream *stream, **new_array; + unsigned int i; + char pad_name[19]; + + for (i = 0; i < parser->expected_stream_count; i++) + { + if (!parser->streams[i]->parser) + { + stream = parser->streams[i]; + break; + } + } + + if (i == parser->expected_stream_count) + { + if (!(new_array = realloc(parser->streams, (parser->stream_count + 1) * sizeof(*parser->streams)))) + return NULL; + parser->streams = new_array; + + if (!(stream = calloc(1, sizeof(*stream)))) + return NULL; + } + + gst_segment_init(&stream->segment, GST_FORMAT_UNDEFINED); + + stream->parser = parser; + pthread_cond_init(&stream->event_cond, NULL); + pthread_cond_init(&stream->event_empty_cond, NULL); + + sprintf(pad_name, "wine_sink_%u", parser->stream_count); + stream->my_sink = gst_pad_new(pad_name, GST_PAD_SINK); + gst_pad_set_element_private(stream->my_sink, stream); + gst_pad_set_chain_function(stream->my_sink, sink_chain_cb); + gst_pad_set_event_function(stream->my_sink, sink_event_cb); + gst_pad_set_query_function(stream->my_sink, sink_query_cb); + + parser->streams[parser->stream_count++] = stream; + return stream; +} + +static void free_stream(struct wg_parser_stream *stream) +{ + if (stream->their_src) + { + if (stream->post_sink) + { + gst_pad_unlink(stream->their_src, stream->post_sink); + gst_pad_unlink(stream->post_src, stream->my_sink); + gst_object_unref(stream->post_src); + gst_object_unref(stream->post_sink); + stream->post_src = stream->post_sink = NULL; + } + else + gst_pad_unlink(stream->their_src, stream->my_sink); + gst_object_unref(stream->their_src); + } + gst_object_unref(stream->my_sink); + + pthread_cond_destroy(&stream->event_cond); + pthread_cond_destroy(&stream->event_empty_cond); + + if (stream->language_code) + g_free(stream->language_code); + + free(stream); +} + +static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user) +{ + struct wg_parser *parser = user; + struct wg_parser_stream *stream; + const char *name; + GstCaps *caps; + int ret; + + GST_LOG("parser %p, element %p, pad %p.", parser, element, pad); + + if (gst_pad_is_linked(pad)) + return; + + caps = gst_pad_query_caps(pad, NULL); + name = gst_structure_get_name(gst_caps_get_structure(caps, 0)); + + if (!(stream = create_stream(parser))) + goto out; + + if (!strcmp(name, "video/x-raw")) + { + GstElement *capssetter, *deinterlace, *vconv, *flip, *box, *vconv2; + + /* Hack?: Flatten down the colorimetry to default values, without + * actually modifying the video at all. + * + * We want to do color matrix conversions when converting from YUV to + * RGB or vice versa. We do *not* want to do color matrix conversions + * when converting YUV <-> YUV or RGB <-> RGB, because these are slow + * (it essentially means always using the slow path, never going through + * liborc). However, we have two videoconvert elements, and it's + * basically impossible to know what conversions each is going to do + * until caps are negotiated (without depending on some implementation + * details, and even then it'snot exactly trivial). And setting + * matrix-mode after caps are negotiated has no effect. + * + * Nor can we just retain colorimetry information the way we retain + * other caps values, because videoconvert automatically clears it if + * not doing passthrough. I think that this would only happen if we have + * to do a double conversion, but that is possible. Not likely, but I + * don't want to have to be the one to find out that there's still a + * game broken. + * + * [Note that we'd actually kind of like to retain colorimetry + * information, just in case it does ever become relevant to pass that + * on to the next DirectShow filter. Hence I think the correct solution + * for upstream is to get videoconvert to Not Do That.] + * + * So as a fallback solution, we force an identity transformation of + * the caps to those with a "default" color matrix—i.e. transform the + * caps, but not the data. We do this by *pre*pending a capssetter to + * the front of the chain, and we remove the matrix-mode setting for the + * videoconvert elements. + */ + if (!(capssetter = gst_element_factory_make("capssetter", NULL))) + { + GST_ERROR("Failed to create capssetter, are %u-bit GStreamer \"good\" plugins installed?\n", + 8 * (int)sizeof(void *)); + goto out; + } + gst_util_set_object_arg(G_OBJECT(capssetter), "join", "true"); + /* Actually, this is invalid, but it causes videoconvert to use default + * colorimetry as a result. Yes, this is depending on undocumented + * implementation details. It's a hack. + * + * Sadly there doesn't seem to be a way to get capssetter to clear + * certain fields while leaving others untouched. */ + gst_util_set_object_arg(G_OBJECT(capssetter), "caps", "video/x-raw,colorimetry=0:0:0:0"); + + /* DirectShow can express interlaced video, but downstream filters can't + * necessarily consume it. In particular, the video renderer can't. */ + if (!(deinterlace = create_element("deinterlace", "good"))) + goto out; + + /* decodebin considers many YUV formats to be "raw", but some quartz + * filters can't handle those. Also, videoflip can't handle all "raw" + * formats either. Add a videoconvert to swap color spaces. */ + if (!(vconv = create_element("videoconvert", "base"))) + goto out; + + /* Let GStreamer choose a default number of threads. */ + gst_util_set_object_arg(G_OBJECT(vconv), "n-threads", "0"); + + /* GStreamer outputs RGB video top-down, but DirectShow expects bottom-up. */ + if (!(flip = create_element("videoflip", "good"))) + goto out; + + box = gst_element_factory_make("videobox", NULL); + + /* videoflip does not support 15 and 16-bit RGB so add a second videoconvert + * to do the final conversion. */ + if (!(vconv2 = create_element("videoconvert", "base"))) + goto out; + + /* Let GStreamer choose a default number of threads. */ + gst_util_set_object_arg(G_OBJECT(vconv2), "n-threads", "0"); + + if (!parser->seekable) + { + if (!box && (stream->aperture.left || stream->aperture.top || + (stream->aperture.right && stream->aperture.right != stream->current_format.u.video.width) || + (stream->aperture.bottom && stream->aperture.bottom != stream->current_format.u.video.height))) + { + fprintf(stderr, "winegstreamer: failed to create videobox, are %u-bit GStreamer \"good\" plugins installed?\n", + 8 * (int)sizeof(void *)); + goto out; + } + if (stream->aperture.left) + g_object_set(G_OBJECT(box), "left", -stream->aperture.left, NULL); + if (stream->aperture.bottom) + g_object_set(G_OBJECT(box), "top", -stream->aperture.top, NULL); + if (stream->aperture.right) + g_object_set(G_OBJECT(box), "right", stream->aperture.right - stream->current_format.u.video.width, NULL); + if (stream->aperture.bottom) + g_object_set(G_OBJECT(box), "bottom", stream->aperture.bottom - stream->current_format.u.video.height, NULL); + } + + /* The bin takes ownership of these elements. */ + gst_bin_add(GST_BIN(parser->container), capssetter); + gst_element_sync_state_with_parent(capssetter); + gst_bin_add(GST_BIN(parser->container), deinterlace); + gst_element_sync_state_with_parent(deinterlace); + gst_bin_add(GST_BIN(parser->container), vconv); + gst_element_sync_state_with_parent(vconv); + gst_bin_add(GST_BIN(parser->container), flip); + gst_element_sync_state_with_parent(flip); + if (box) + { + gst_bin_add(GST_BIN(parser->container), box); + gst_element_sync_state_with_parent(box); + } + gst_bin_add(GST_BIN(parser->container), vconv2); + gst_element_sync_state_with_parent(vconv2); + + gst_element_link(capssetter, deinterlace); + gst_element_link(deinterlace, vconv); + gst_element_link(vconv, flip); + if (box) + { + gst_element_link(flip, box); + gst_element_link(box, vconv2); + } + else + { + gst_element_link(flip, vconv2); + } + + stream->post_sink = gst_element_get_static_pad(capssetter, "sink"); + stream->post_src = gst_element_get_static_pad(vconv2, "src"); + stream->flip = flip; + stream->box = box; + } + else if (!strcmp(name, "audio/x-raw")) + { + GstElement *convert; + + /* Currently our dsound can't handle 64-bit formats or all + * surround-sound configurations. Native dsound can't always handle + * 64-bit formats either. Add an audioconvert to allow changing bit + * depth and channel count. */ + if (!(convert = create_element("audioconvert", "base"))) + goto out; + + gst_bin_add(GST_BIN(parser->container), convert); + gst_element_sync_state_with_parent(convert); + + stream->post_sink = gst_element_get_static_pad(convert, "sink"); + stream->post_src = gst_element_get_static_pad(convert, "src"); + } + + if (stream->post_sink) + { + if ((ret = gst_pad_link(pad, stream->post_sink)) < 0) + { + GST_ERROR("Failed to link decodebin source pad to post-processing elements, error %s.", + gst_pad_link_get_name(ret)); + gst_object_unref(stream->post_sink); + stream->post_sink = NULL; + goto out; + } + + if ((ret = gst_pad_link(stream->post_src, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link post-processing elements to our sink pad, error %s.", + gst_pad_link_get_name(ret)); + gst_object_unref(stream->post_src); + stream->post_src = NULL; + gst_object_unref(stream->post_sink); + stream->post_sink = NULL; + goto out; + } + } + else if ((ret = gst_pad_link(pad, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link decodebin source pad to our sink pad, error %s.", + gst_pad_link_get_name(ret)); + goto out; + } + + gst_pad_set_active(stream->my_sink, 1); + gst_object_ref(stream->their_src = pad); +out: + gst_caps_unref(caps); +} + +static void pad_removed_cb(GstElement *element, GstPad *pad, gpointer user) +{ + struct wg_parser *parser = user; + unsigned int i; + char *name; + + GST_LOG("parser %p, element %p, pad %p.", parser, element, pad); + + for (i = 0; i < parser->stream_count; ++i) + { + struct wg_parser_stream *stream = parser->streams[i]; + + if (stream->their_src == pad) + { + if (stream->post_sink) + gst_pad_unlink(stream->their_src, stream->post_sink); + else + gst_pad_unlink(stream->their_src, stream->my_sink); + gst_object_unref(stream->their_src); + stream->their_src = NULL; + return; + } + } + + name = gst_pad_get_name(pad); + GST_WARNING("No pin matching pad \"%s\" found.", name); + g_free(name); +} + +static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent, + guint64 offset, guint size, GstBuffer **buffer) +{ + struct wg_parser *parser = gst_pad_get_element_private(pad); + GstFlowReturn ret; + unsigned int i; + + GST_LOG("pad %p, offset %" G_GINT64_MODIFIER "u, size %u, buffer %p.", pad, offset, size, *buffer); + + if (offset == GST_BUFFER_OFFSET_NONE) + offset = parser->next_pull_offset; + parser->next_pull_offset = offset + size; + + if (!size) + { + /* asfreader occasionally asks for zero bytes. gst_buffer_map() will + * return NULL in this case. Avoid confusing the read thread by asking + * it for zero bytes. */ + if (!*buffer) + *buffer = gst_buffer_new_and_alloc(0); + gst_buffer_set_size(*buffer, 0); + GST_LOG("Returning empty buffer."); + return GST_FLOW_OK; + } + + pthread_mutex_lock(&parser->mutex); + + if (parser->draining) + { + gst_pad_peer_query(parser->my_src, gst_query_new_drain()); + parser->draining = false; + for (i = 0; i < parser->stream_count; i++) + pthread_cond_signal(&parser->streams[i]->event_cond); + } + + assert(!parser->read_request.size); + parser->read_request.buffer = *buffer; + parser->read_request.offset = offset; + parser->read_request.size = size; + parser->read_request.done = false; + pthread_cond_signal(&parser->read_cond); + + /* Note that we don't unblock this wait on GST_EVENT_FLUSH_START. We expect + * the upstream pin to flush if necessary. We should never be blocked on + * read_thread() not running. */ + + while (!parser->read_request.done) + { + pthread_cond_wait(&parser->read_done_cond, &parser->mutex); + if (parser->draining) + { + gst_pad_peer_query(parser->my_src, gst_query_new_drain()); + parser->draining = false; + for (i = 0; i < parser->stream_count; i++) + pthread_cond_signal(&parser->streams[i]->event_cond); + } + } + + *buffer = parser->read_request.buffer; + ret = parser->read_request.ret; + + pthread_mutex_unlock(&parser->mutex); + + GST_LOG("Request returned %s.", gst_flow_get_name(ret)); + + return ret; +} + +static gboolean src_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) +{ + struct wg_parser *parser = gst_pad_get_element_private(pad); + GstFormat format; + + GST_LOG("parser %p, type %s.", parser, GST_QUERY_TYPE_NAME(query)); + + switch (GST_QUERY_TYPE(query)) + { + case GST_QUERY_DURATION: + gst_query_parse_duration(query, &format, NULL); + if (format == GST_FORMAT_PERCENT) + { + gst_query_set_duration(query, GST_FORMAT_PERCENT, GST_FORMAT_PERCENT_MAX); + return TRUE; + } + else if (format == GST_FORMAT_BYTES && parser->seekable) + { + gst_query_set_duration(query, GST_FORMAT_BYTES, parser->file_size); + return TRUE; + } + return FALSE; + + case GST_QUERY_SEEKING: + gst_query_parse_seeking (query, &format, NULL, NULL, NULL); + if (format != GST_FORMAT_BYTES) + { + GST_WARNING("Cannot seek using format \"%s\".", gst_format_get_name(format)); + return FALSE; + } + if (!parser->seekable) + return FALSE; + gst_query_set_seeking(query, GST_FORMAT_BYTES, 1, 0, parser->file_size); + return TRUE; + + case GST_QUERY_SCHEDULING: + gst_query_set_scheduling(query, parser->seekable ? GST_SCHEDULING_FLAG_SEEKABLE : GST_SCHEDULING_FLAG_SEQUENTIAL, 1, -1, 0); + gst_query_add_scheduling_mode(query, GST_PAD_MODE_PUSH); + gst_query_add_scheduling_mode(query, GST_PAD_MODE_PULL); + return TRUE; + + case GST_QUERY_CAPS: + { + GstCaps *caps, *filter, *temp; + + gst_query_parse_caps(query, &filter); + + if (parser->input_format.major_type) + caps = wg_format_to_caps(&parser->input_format); + else + caps = gst_caps_new_any(); + if (!caps) + return FALSE; + + if (filter) + { + temp = gst_caps_intersect(caps, filter); + gst_caps_unref(caps); + caps = temp; + } + + gst_query_set_caps_result(query, caps); + gst_caps_unref(caps); + return TRUE; + } + + default: + GST_WARNING("Unhandled query type %s.", GST_QUERY_TYPE_NAME(query)); + return FALSE; + } +} + +static void *push_data(void *arg) +{ + struct wg_parser *parser = arg; + ULONG alloc_size = 16384; + GstCaps *caps = NULL; + GstSegment *segment; + GstBuffer *buffer; + unsigned int i; + guint max_size; + + GST_DEBUG("Starting push thread."); + + if (parser->input_format.major_type) + caps = wg_format_to_caps(&parser->input_format); + + if (parser->input_format.major_type == WG_MAJOR_TYPE_VIDEO) + { + GstVideoInfo info; + gst_video_info_from_caps(&info, caps); + alloc_size = info.size; + } + + max_size = parser->stop_offset ? parser->stop_offset : parser->file_size; + + gst_pad_push_event(parser->my_src, gst_event_new_stream_start("wg_stream")); + + if (caps) gst_pad_push_event(parser->my_src, gst_event_new_caps(caps)); + + segment = gst_segment_new(); + gst_segment_init(segment, GST_FORMAT_BYTES); + gst_pad_push_event(parser->my_src, gst_event_new_segment(segment)); + + for (;;) + { + ULONG size; + int ret; + + if (parser->seekable && parser->next_offset >= max_size) + break; + size = parser->seekable ? min(alloc_size, max_size - parser->next_offset) : alloc_size; + + buffer = NULL; + if ((ret = src_getrange_cb(parser->my_src, NULL, parser->next_offset, size, &buffer) < 0)) + { + /* When we are in unseekable push mode, the pushing pad is responsible for handling flushing. */ + if (!parser->seekable && ret == GST_FLOW_FLUSHING) + { + gst_pad_push_event(parser->my_src, gst_event_new_seek(1.0f, + GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_NONE, 0, GST_SEEK_TYPE_NONE, 0)); + continue; + } + + if (!parser->seekable && ret == GST_FLOW_EOS) + { + gst_pad_push_event(parser->my_src, gst_event_new_eos()); + pthread_mutex_lock(&parser->mutex); + for (i = 0; i < parser->stream_count; i++) + { + if (!parser->streams[i]->enabled) + continue; + while (!parser->streams[i]->flushing && !parser->streams[i]->eos) + pthread_cond_wait(&parser->streams[i]->event_empty_cond, &parser->mutex); + parser->streams[i]->eos = false; + } + + pthread_mutex_unlock(&parser->mutex); + + segment = gst_segment_new(); + gst_segment_init(segment, GST_FORMAT_BYTES); + gst_pad_push_event(parser->my_src, gst_event_new_segment(segment)); + continue; + } + + GST_ERROR("Failed to read data, ret %s.", gst_flow_get_name(ret)); + break; + } + + parser->next_offset += gst_buffer_get_size(buffer); + + buffer->duration = buffer->pts = -1; + if ((ret = gst_pad_push(parser->my_src, buffer)) < 0) + { + GST_ERROR("Failed to push data, ret %s.", gst_flow_get_name(ret)); + break; + } + } + + gst_pad_push_event(parser->my_src, gst_event_new_eos()); + + GST_DEBUG("Stopping push thread."); + + return NULL; +} + +static gboolean activate_push(GstPad *pad, gboolean activate) +{ + struct wg_parser *parser = gst_pad_get_element_private(pad); + + if (!activate) + { + if (parser->push_thread) + { + pthread_join(parser->push_thread, NULL); + parser->push_thread = 0; + } + } + else if (!parser->push_thread) + { + int ret; + + if ((ret = pthread_create(&parser->push_thread, NULL, push_data, parser))) + { + GST_ERROR("Failed to create push thread: %s", strerror(errno)); + parser->push_thread = 0; + return FALSE; + } + } + return TRUE; +} + +static gboolean src_activate_mode_cb(GstPad *pad, GstObject *parent, GstPadMode mode, gboolean activate) +{ + struct wg_parser *parser = gst_pad_get_element_private(pad); + + GST_DEBUG("%s source pad for parser %p in %s mode.", + activate ? "Activating" : "Deactivating", parser, gst_pad_mode_get_name(mode)); + + parser->pull_mode = false; + + switch (mode) + { + case GST_PAD_MODE_PULL: + parser->pull_mode = activate; + return TRUE; + case GST_PAD_MODE_PUSH: + return activate_push(pad, activate); + case GST_PAD_MODE_NONE: + break; + } + return FALSE; +} + +static BOOL decodebin_parser_init_gst(struct wg_parser *parser); + +static GstBusSyncReply bus_handler_cb(GstBus *bus, GstMessage *msg, gpointer user) +{ + struct wg_parser *parser = user; + const GstStructure *structure; + gchar *dbg_info = NULL; + GError *err = NULL; + + GST_DEBUG("parser %p, message type %s.", parser, GST_MESSAGE_TYPE_NAME(msg)); + + switch (msg->type) + { + case GST_MESSAGE_ERROR: + gst_message_parse_error(msg, &err, &dbg_info); + fprintf(stderr, "winegstreamer error: %s: %s\n", GST_OBJECT_NAME(msg->src), err->message); + fprintf(stderr, "winegstreamer error: %s: %s\n", GST_OBJECT_NAME(msg->src), dbg_info); + g_error_free(err); + g_free(dbg_info); + pthread_mutex_lock(&parser->mutex); + parser->error = true; + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&parser->init_cond); + break; + + case GST_MESSAGE_WARNING: + gst_message_parse_warning(msg, &err, &dbg_info); + fprintf(stderr, "winegstreamer warning: %s: %s\n", GST_OBJECT_NAME(msg->src), err->message); + fprintf(stderr, "winegstreamer warning: %s: %s\n", GST_OBJECT_NAME(msg->src), dbg_info); + g_error_free(err); + g_free(dbg_info); + break; + + case GST_MESSAGE_DURATION_CHANGED: + pthread_mutex_lock(&parser->mutex); + parser->has_duration = true; + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&parser->init_cond); + break; + + case GST_MESSAGE_ELEMENT: + structure = gst_message_get_structure(msg); + if (gst_structure_has_name(structure, "missing-plugin")) + { + pthread_mutex_lock(&parser->mutex); + if (!parser->use_mediaconv && parser->init_gst == decodebin_parser_init_gst) + { + GST_WARNING("Autoplugged element failed to initialise, trying again with protonvideoconvert."); + parser->error = true; + pthread_cond_signal(&parser->init_cond); + } + pthread_mutex_unlock(&parser->mutex); + } + break; + + default: + break; + } + gst_message_unref(msg); + return GST_BUS_DROP; +} + +static gboolean src_perform_seek(struct wg_parser *parser, GstEvent *event) +{ + BOOL thread = !!parser->push_thread; + GstSeekType cur_type, stop_type; + GstFormat seek_format; + GstEvent *flush_event; + GstSeekFlags flags; + gint64 cur, stop; + GstSegment *seg; + guint32 seqnum; + gdouble rate; + + gst_event_parse_seek(event, &rate, &seek_format, &flags, + &cur_type, &cur, &stop_type, &stop); + + if (seek_format != GST_FORMAT_BYTES) + { + GST_FIXME("Unhandled format \"%s\".", gst_format_get_name(seek_format)); + return FALSE; + } + + seqnum = gst_event_get_seqnum(event); + + /* send flush start */ + if (flags & GST_SEEK_FLAG_FLUSH) + { + flush_event = gst_event_new_flush_start(); + gst_event_set_seqnum(flush_event, seqnum); + gst_pad_push_event(parser->my_src, flush_event); + if (thread) + gst_pad_set_active(parser->my_src, 1); + } + + parser->next_offset = parser->start_offset = cur; + + /* and prepare to continue streaming */ + if (flags & GST_SEEK_FLAG_FLUSH) + { + flush_event = gst_event_new_flush_stop(TRUE); + gst_event_set_seqnum(flush_event, seqnum); + gst_pad_push_event(parser->my_src, flush_event); + if (thread) + { + gst_pad_set_active(parser->my_src, 1); + seg = gst_segment_new(); + gst_segment_init(seg, GST_FORMAT_BYTES); + gst_pad_push_event(parser->my_src, gst_event_new_segment(seg)); + } + } + + return TRUE; +} + +static gboolean src_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) +{ + struct wg_parser *parser = gst_pad_get_element_private(pad); + gboolean ret = TRUE; + + GST_LOG("parser %p, type \"%s\".", parser, GST_EVENT_TYPE_NAME(event)); + + switch (event->type) + { + case GST_EVENT_SEEK: + ret = src_perform_seek(parser, event); + break; + + case GST_EVENT_FLUSH_START: + case GST_EVENT_FLUSH_STOP: + case GST_EVENT_QOS: + case GST_EVENT_RECONFIGURE: + break; + + default: + GST_WARNING("Ignoring \"%s\" event.", GST_EVENT_TYPE_NAME(event)); + ret = FALSE; + break; + } + gst_event_unref(event); + return ret; +} + +static gchar *query_language(GstPad *pad) +{ + GstTagList *tag_list; + GstEvent *tag_event; + gchar *ret = NULL; + + if ((tag_event = gst_pad_get_sticky_event(pad, GST_EVENT_TAG, 0))) + { + gst_event_parse_tag(tag_event, &tag_list); + gst_tag_list_get_string(tag_list, "language-code", &ret); + gst_event_unref(tag_event); + } + + return ret; +} + +static HRESULT wg_parser_connect_inner(struct wg_parser *parser) +{ + GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("wine_src", + GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); + + parser->sink_connected = true; + + if (!parser->bus) + { + parser->bus = gst_bus_new(); + gst_bus_set_sync_handler(parser->bus, bus_handler_cb, parser, NULL); + } + + parser->container = gst_bin_new(NULL); + gst_element_set_bus(parser->container, parser->bus); + + parser->my_src = gst_pad_new_from_static_template(&src_template, "wine-src"); + gst_pad_set_getrange_function(parser->my_src, src_getrange_cb); + gst_pad_set_query_function(parser->my_src, src_query_cb); + gst_pad_set_activatemode_function(parser->my_src, src_activate_mode_cb); + gst_pad_set_event_function(parser->my_src, src_event_cb); + gst_pad_set_element_private(parser->my_src, parser); + + parser->start_offset = parser->next_offset = parser->stop_offset = 0; + parser->next_pull_offset = 0; + parser->error = false; + + return S_OK; +} + +static NTSTATUS wg_parser_connect(void *args) +{ + const struct wg_parser_connect_params *params = args; + struct wg_parser *parser = params->parser; + bool use_mediaconv = false; + unsigned int i; + HRESULT hr; + int ret; + + parser->seekable = true; + parser->file_size = params->file_size; + + if ((hr = wg_parser_connect_inner(parser))) + return hr; + + if (!parser->init_gst(parser)) + goto out; + + gst_element_set_state(parser->container, GST_STATE_PAUSED); + if (!parser->pull_mode) + gst_pad_set_active(parser->my_src, 1); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); + + if (ret == GST_STATE_CHANGE_FAILURE) + { + if (!parser->use_mediaconv && parser->init_gst == decodebin_parser_init_gst && parser->pull_mode) + { + GST_WARNING("Failed to play media, trying again with protonvideoconvert."); + use_mediaconv = true; + } + else + GST_ERROR("Failed to play stream.\n"); + goto out; + } + + pthread_mutex_lock(&parser->mutex); + + while (!parser->no_more_pads && !parser->error) + pthread_cond_wait(&parser->init_cond, &parser->mutex); + if (parser->error) + { + if (!parser->use_mediaconv && parser->init_gst == decodebin_parser_init_gst) + use_mediaconv = true; + pthread_mutex_unlock(&parser->mutex); + goto out; + } + + for (i = 0; i < parser->stream_count; ++i) + { + struct wg_parser_stream *stream = parser->streams[i]; + gint64 duration; + + while (!stream->has_caps && !parser->error) + pthread_cond_wait(&parser->init_cond, &parser->mutex); + + /* GStreamer doesn't actually provide any guarantees about when duration + * is available, even for seekable streams. It's basically built for + * applications that don't care, e.g. movie players that can display + * a duration once it's available, and update it visually if a better + * estimate is found. This doesn't really match well with DirectShow or + * Media Foundation, which both expect duration to be available + * immediately on connecting, so we have to use some complex heuristics + * to try to actually get a usable duration. + * + * Some elements (avidemux, wavparse, qtdemux) record duration almost + * immediately, before fixing caps. Such elements don't send + * duration-changed messages. Therefore always try querying duration + * after caps have been found. + * + * Some elements (mpegaudioparse) send duration-changed. In the case of + * a mp3 stream without seek tables it will not be sent immediately, but + * only after enough frames have been parsed to form an estimate. They + * may send it multiple times with increasingly accurate estimates, but + * unfortunately we have no way of knowing whether another estimate will + * be sent, so we always take the first one. We assume that if the + * duration is not immediately available then the element will always + * send duration-changed. + */ + + for (;;) + { + if (parser->error) + { + pthread_mutex_unlock(&parser->mutex); + goto out; + } + if (gst_pad_query_duration(stream->their_src, GST_FORMAT_TIME, &duration)) + { + stream->duration = duration / 100; + break; + } + + if (stream->eos) + { + stream->duration = 0; + GST_WARNING("Failed to query duration.\n"); + break; + } + + /* Elements based on GstBaseParse send duration-changed before + * actually updating the duration in GStreamer versions prior + * to 1.17.1. See . So after + * receiving duration-changed we have to continue polling until + * the query succeeds. */ + if (parser->has_duration) + { + pthread_mutex_unlock(&parser->mutex); + g_usleep(10000); + pthread_mutex_lock(&parser->mutex); + } + else + { + pthread_cond_wait(&parser->init_cond, &parser->mutex); + } + } + stream->language_code = query_language(stream->their_src); + } + + pthread_mutex_unlock(&parser->mutex); + + parser->next_offset = 0; + return S_OK; + +out: + if (parser->container) + gst_element_set_state(parser->container, GST_STATE_NULL); + if (parser->their_sink) + { + gst_pad_unlink(parser->my_src, parser->their_sink); + gst_object_unref(parser->their_sink); + parser->my_src = parser->their_sink = NULL; + } + + for (i = 0; i < parser->stream_count; ++i) + free_stream(parser->streams[i]); + parser->stream_count = 0; + free(parser->streams); + parser->streams = NULL; + + if (parser->container) + { + gst_element_set_bus(parser->container, NULL); + gst_object_unref(parser->container); + parser->container = NULL; + } + + pthread_mutex_lock(&parser->mutex); + parser->sink_connected = false; + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&parser->read_cond); + + if (use_mediaconv) + { + parser->use_mediaconv = true; + hr = wg_parser_connect(args); + parser->use_mediaconv = false; + return hr; + } + + return E_FAIL; +} + +static NTSTATUS wg_parser_connect_unseekable(void *args) +{ + const struct wg_parser_connect_unseekable_params *params = args; + const struct wg_format *out_formats = params->out_formats; + const struct wg_format *in_format = params->in_format; + const struct wg_rect *apertures = params->apertures; + uint32_t stream_count = params->stream_count; + struct wg_parser *parser = params->parser; + unsigned int i; + HRESULT hr; + + parser->seekable = false; + /* since typefind is not available here, we must have an input_format */ + parser->input_format = *in_format; + + if ((hr = wg_parser_connect_inner(parser))) + return hr; + + parser->stop_offset = -1; + + parser->expected_stream_count = stream_count; + parser->streams = calloc(stream_count, sizeof(*parser->streams)); + + for (i = 0; i < stream_count; i++) + { + parser->streams[i] = calloc(1, sizeof(*parser->streams[i])); + parser->streams[i]->current_format = out_formats[i]; + if (apertures) + parser->streams[i]->aperture = apertures[i]; + parser->streams[i]->enabled = true; + } + + if (!parser->init_gst(parser)) + return E_FAIL; + + if (parser->stream_count < parser->expected_stream_count) + return E_FAIL; + + return S_OK; +} + +static NTSTATUS wg_parser_disconnect(void *args) +{ + struct wg_parser *parser = args; + unsigned int i; + + /* Unblock all of our streams. */ + pthread_mutex_lock(&parser->mutex); + parser->no_more_pads = true; + pthread_cond_signal(&parser->init_cond); + for (i = 0; i < parser->stream_count; ++i) + { + parser->streams[i]->flushing = true; + pthread_cond_signal(&parser->streams[i]->event_cond); + pthread_cond_signal(&parser->streams[i]->event_empty_cond); + } + pthread_mutex_unlock(&parser->mutex); + + gst_element_set_state(parser->container, GST_STATE_NULL); + if (!parser->pull_mode) + gst_pad_set_active(parser->my_src, 0); + gst_pad_unlink(parser->my_src, parser->their_sink); + gst_object_unref(parser->my_src); + gst_object_unref(parser->their_sink); + parser->my_src = parser->their_sink = NULL; + + pthread_mutex_lock(&parser->mutex); + parser->sink_connected = false; + pthread_mutex_unlock(&parser->mutex); + pthread_cond_signal(&parser->read_cond); + + for (i = 0; i < parser->stream_count; ++i) + free_stream(parser->streams[i]); + + parser->stream_count = 0; + free(parser->streams); + parser->streams = NULL; + + gst_element_set_bus(parser->container, NULL); + gst_object_unref(parser->container); + parser->container = NULL; + + return S_OK; +} + +static BOOL decodebin_parser_init_gst(struct wg_parser *parser) +{ + GstElement *element; + int ret; + + if (!(element = create_element("decodebin", "base"))) + return FALSE; + + if (parser->input_format.major_type) + g_object_set(G_OBJECT(element), "sink-caps", wg_format_to_caps(&parser->input_format), NULL); + + gst_bin_add(GST_BIN(parser->container), element); + parser->decodebin = element; + + if (parser->unlimited_buffering) + { + g_object_set(parser->decodebin, "max-size-buffers", G_MAXUINT, NULL); + g_object_set(parser->decodebin, "max-size-time", G_MAXUINT64, NULL); + g_object_set(parser->decodebin, "max-size-bytes", G_MAXUINT, NULL); + } + + g_signal_connect(element, "pad-added", G_CALLBACK(pad_added_cb), parser); + g_signal_connect(element, "pad-removed", G_CALLBACK(pad_removed_cb), parser); + g_signal_connect(element, "autoplug-select", G_CALLBACK(autoplug_select_cb), parser); + g_signal_connect(element, "autoplug-sort", G_CALLBACK(autoplug_sort_cb), parser); + g_signal_connect(element, "no-more-pads", G_CALLBACK(no_more_pads_cb), parser); + + parser->their_sink = gst_element_get_static_pad(element, "sink"); + + pthread_mutex_lock(&parser->mutex); + parser->no_more_pads = false; + pthread_mutex_unlock(&parser->mutex); + + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link pads, error %d.\n", ret); + return FALSE; + } + + return TRUE; +} + +static BOOL avi_parser_init_gst(struct wg_parser *parser) +{ + GstElement *element; + int ret; + + if (!(element = create_element("avidemux", "good"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), element); + + g_signal_connect(element, "pad-added", G_CALLBACK(pad_added_cb), parser); + g_signal_connect(element, "pad-removed", G_CALLBACK(pad_removed_cb), parser); + g_signal_connect(element, "no-more-pads", G_CALLBACK(no_more_pads_cb), parser); + + parser->their_sink = gst_element_get_static_pad(element, "sink"); + + pthread_mutex_lock(&parser->mutex); + parser->no_more_pads = false; + pthread_mutex_unlock(&parser->mutex); + + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link pads, error %d.\n", ret); + return FALSE; + } + + return TRUE; +} + +static BOOL mpeg_audio_parser_init_gst(struct wg_parser *parser) +{ + struct wg_parser_stream *stream; + GstElement *element; + int ret; + + if (!(element = create_element("mpegaudioparse", "good"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), element); + + parser->their_sink = gst_element_get_static_pad(element, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.\n", ret); + return FALSE; + } + + if (!(stream = create_stream(parser))) + return FALSE; + + gst_object_ref(stream->their_src = gst_element_get_static_pad(element, "src")); + if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.\n", ret); + return FALSE; + } + gst_pad_set_active(stream->my_sink, 1); + + parser->no_more_pads = true; + + return TRUE; +} + +static BOOL wave_parser_init_gst(struct wg_parser *parser) +{ + struct wg_parser_stream *stream; + GstElement *element; + int ret; + + if (!(element = create_element("wavparse", "good"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), element); + + parser->their_sink = gst_element_get_static_pad(element, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.\n", ret); + return FALSE; + } + + if (!(stream = create_stream(parser))) + return FALSE; + + stream->their_src = gst_element_get_static_pad(element, "src"); + gst_object_ref(stream->their_src); + if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.\n", ret); + return FALSE; + } + gst_pad_set_active(stream->my_sink, 1); + + parser->no_more_pads = true; + + return TRUE; +} + +static BOOL audio_convert_init_gst(struct wg_parser *parser) +{ + struct wg_parser_stream *stream; + GstElement *convert, *resampler; + int ret; + + if (parser->seekable) + return FALSE; + + if (parser->expected_stream_count != 1) + return FALSE; + + if (parser->input_format.major_type != WG_MAJOR_TYPE_AUDIO) + return FALSE; + + if (!(convert = create_element("audioconvert", "base"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), convert); + + if (!(resampler = create_element("audioresample", "base"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), resampler); + + gst_element_link(convert, resampler); + + parser->their_sink = gst_element_get_static_pad(convert, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.\n", ret); + return FALSE; + } + + if (!(stream = create_stream(parser))) + return FALSE; + + stream->their_src = gst_element_get_static_pad(resampler, "src"); + gst_object_ref(stream->their_src); + if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.\n", ret); + return FALSE; + } + gst_pad_set_active(stream->my_sink, 1); + + parser->no_more_pads = true; + + gst_element_set_state(parser->container, GST_STATE_PAUSED); + gst_pad_set_active(parser->my_src, 1); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); + if (ret == GST_STATE_CHANGE_FAILURE) + { + GST_ERROR("Failed to play stream.\n"); + return FALSE; + } + + return TRUE; +} + +static BOOL video_convert_init_gst(struct wg_parser *parser) +{ + struct wg_parser_stream *stream; + GstElement *convert; + int ret; + + if (parser->seekable) + return FALSE; + + if (parser->expected_stream_count != 1) + return FALSE; + + if (parser->input_format.major_type != WG_MAJOR_TYPE_VIDEO) + return FALSE; + + if (!(convert = create_element("videoconvert", "base"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), convert); + + parser->their_sink = gst_element_get_static_pad(convert, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.\n", ret); + return FALSE; + } + + if (!(stream = create_stream(parser))) + return FALSE; + + stream->their_src = gst_element_get_static_pad(convert, "src"); + gst_object_ref(stream->their_src); + if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.\n", ret); + return FALSE; + } + gst_pad_set_active(stream->my_sink, 1); + + parser->no_more_pads = true; + + gst_element_set_state(parser->container, GST_STATE_PAUSED); + gst_pad_set_active(parser->my_src, 1); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); + if (ret == GST_STATE_CHANGE_FAILURE) + { + GST_ERROR("Failed to play stream.\n"); + return FALSE; + } + + return TRUE; +} + +static void init_gstreamer_once(void) +{ + char arg0[] = "wine"; + char arg1[] = "--gst-disable-registry-fork"; + char *args[] = {arg0, arg1, NULL}; + int argc = ARRAY_SIZE(args) - 1; + char **argv = args; + GError *err; + const char *e; + + if ((e = getenv("WINE_GST_REGISTRY_DIR"))) + { + char gst_reg[PATH_MAX]; +#if defined(__x86_64__) + const char *arch = "/registry.x86_64.bin"; +#elif defined(__i386__) + const char *arch = "/registry.i386.bin"; +#else +#error Bad arch +#endif + strcpy(gst_reg, e); + strcat(gst_reg, arch); + setenv("GST_REGISTRY_1_0", gst_reg, 1); + } + + if (!gst_init_check(&argc, &argv, &err)) + { + fprintf(stderr, "winegstreamer: failed to initialize GStreamer: %s\n", err->message); + g_error_free(err); + return; + } + + GST_DEBUG_CATEGORY_INIT(wine, "WINE", GST_DEBUG_FG_RED, "Wine GStreamer support"); + + GST_INFO("GStreamer library version %s; wine built with %d.%d.%d.\n", + gst_version_string(), GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO); +} + +bool init_gstreamer(void) +{ + static pthread_once_t init_once = PTHREAD_ONCE_INIT; + + if (pthread_once(&init_once, init_gstreamer_once)) + return false; + + return true; +} + +static NTSTATUS wg_parser_create(void *args) +{ + static const init_gst_cb init_funcs[] = + { + [WG_PARSER_DECODEBIN] = decodebin_parser_init_gst, + [WG_PARSER_AVIDEMUX] = avi_parser_init_gst, + [WG_PARSER_MPEGAUDIOPARSE] = mpeg_audio_parser_init_gst, + [WG_PARSER_WAVPARSE] = wave_parser_init_gst, + [WG_PARSER_AUDIOCONV] = audio_convert_init_gst, + [WG_PARSER_VIDEOCONV] = video_convert_init_gst, + }; + + struct wg_parser_create_params *params = args; + struct wg_parser *parser; + + if (!init_gstreamer()) + return E_FAIL; + + if (!(parser = calloc(1, sizeof(*parser)))) + return E_OUTOFMEMORY; + + pthread_mutex_init(&parser->mutex, NULL); + pthread_cond_init(&parser->init_cond, NULL); + pthread_cond_init(&parser->read_cond, NULL); + pthread_cond_init(&parser->read_done_cond, NULL); + parser->init_gst = init_funcs[params->type]; + parser->unlimited_buffering = params->unlimited_buffering; + + GST_DEBUG("Created winegstreamer parser %p.\n", parser); + params->parser = parser; + return S_OK; +} + +static NTSTATUS wg_parser_destroy(void *args) +{ + struct wg_parser *parser = args; + + if (parser->bus) + { + gst_bus_set_sync_handler(parser->bus, NULL, NULL, NULL); + gst_object_unref(parser->bus); + } + + pthread_mutex_destroy(&parser->mutex); + pthread_cond_destroy(&parser->init_cond); + pthread_cond_destroy(&parser->read_cond); + pthread_cond_destroy(&parser->read_done_cond); + + free(parser); + return S_OK; +} + +const unixlib_entry_t __wine_unix_call_funcs[] = +{ +#define X(name) [unix_ ## name] = name + X(wg_parser_create), + X(wg_parser_destroy), + + X(wg_parser_connect), + X(wg_parser_connect_unseekable), + X(wg_parser_disconnect), + + X(wg_parser_get_next_read_offset), + X(wg_parser_push_data), + + X(wg_parser_get_stream_count), + X(wg_parser_get_stream), + + X(wg_parser_stream_get_preferred_format), + X(wg_parser_stream_enable), + X(wg_parser_stream_disable), + + X(wg_parser_stream_get_buffer), + X(wg_parser_stream_copy_buffer), + X(wg_parser_stream_release_buffer), + X(wg_parser_stream_notify_qos), + + X(wg_parser_stream_get_duration), + X(wg_parser_stream_get_language), + X(wg_parser_stream_seek), + + X(wg_parser_stream_drain), + + X(wg_transform_create), + X(wg_transform_destroy), + + X(wg_transform_push_data), + X(wg_transform_read_data), +}; diff --git a/dlls/mfplat/wg_transform.c b/dlls/mfplat/wg_transform.c new file mode 100644 index 00000000000..b080894dbe4 --- /dev/null +++ wine/dlls/mfplat/wg_transform.c @@ -0,0 +1,630 @@ +/* + * GStreamer transform backend + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#if 0 +#pragma makedep unix +#endif + +#include "config.h" + +#include +#include +#include + +#include +#include +#include + +#include "winternl.h" +#include "dshow.h" +#include "mferror.h" + +#include "unix_private.h" + +#include "wine/list.h" + +GST_DEBUG_CATEGORY_EXTERN(wine); +#define GST_CAT_DEFAULT wine + +struct wg_transform_sample +{ + struct list entry; + GstSample *sample; +}; + +struct wg_transform +{ + GstElement *container; + GstPad *my_src, *my_sink; + GstPad *their_sink, *their_src; + pthread_mutex_t mutex; + struct list samples; + GstCaps *sink_caps; +}; + +static GstCaps *wg_format_to_caps_xwma(const struct wg_encoded_format *format) +{ + GstBuffer *buffer; + GstCaps *caps; + + if (format->encoded_type == WG_ENCODED_TYPE_WMA) + { + caps = gst_caps_new_empty_simple("audio/x-wma"); + if (format->u.xwma.version) + gst_caps_set_simple(caps, "wmaversion", G_TYPE_INT, format->u.xwma.version, NULL); + } + else + { + caps = gst_caps_new_empty_simple("audio/x-xma"); + if (format->u.xwma.version) + gst_caps_set_simple(caps, "xmaversion", G_TYPE_INT, format->u.xwma.version, NULL); + } + + if (format->u.xwma.bitrate) + gst_caps_set_simple(caps, "bitrate", G_TYPE_INT, format->u.xwma.bitrate, NULL); + if (format->u.xwma.rate) + gst_caps_set_simple(caps, "rate", G_TYPE_INT, format->u.xwma.rate, NULL); + if (format->u.xwma.depth) + gst_caps_set_simple(caps, "depth", G_TYPE_INT, format->u.xwma.depth, NULL); + if (format->u.xwma.channels) + gst_caps_set_simple(caps, "channels", G_TYPE_INT, format->u.xwma.channels, NULL); + if (format->u.xwma.block_align) + gst_caps_set_simple(caps, "block_align", G_TYPE_INT, format->u.xwma.block_align, NULL); + + if (format->u.xwma.codec_data_len) + { + buffer = gst_buffer_new_and_alloc(format->u.xwma.codec_data_len); + gst_buffer_fill(buffer, 0, format->u.xwma.codec_data, format->u.xwma.codec_data_len); + gst_caps_set_simple(caps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); + gst_buffer_unref(buffer); + } + + return caps; +} + +static GstCaps *wg_format_to_caps_aac(const struct wg_encoded_format *format) +{ + const char *profile, *level, *stream_format; + GstBuffer *buffer; + GstCaps *caps; + + caps = gst_caps_new_empty_simple("audio/mpeg"); + gst_caps_set_simple(caps, "mpegversion", G_TYPE_INT, 4, NULL); + + switch (format->u.aac.payload_type) + { + case 0: stream_format = "raw"; break; + case 1: stream_format = "adts"; break; + case 2: stream_format = "adif"; break; + case 3: stream_format = "loas"; break; + default: stream_format = "raw"; break; + } + if (stream_format) + gst_caps_set_simple(caps, "stream-format", G_TYPE_STRING, stream_format, NULL); + + switch (format->u.aac.profile_level_indication) + { + case 0x29: profile = "lc"; level = "2"; break; + case 0x2A: profile = "lc"; level = "4"; break; + case 0x2B: profile = "lc"; level = "5"; break; + default: + GST_FIXME("Unrecognized profile-level-indication %u\n", format->u.aac.profile_level_indication); + /* fallthrough */ + case 0x00: case 0xFE: profile = level = NULL; break; /* unspecified */ + } + if (profile) + gst_caps_set_simple(caps, "profile", G_TYPE_STRING, profile, NULL); + if (level) + gst_caps_set_simple(caps, "level", G_TYPE_STRING, level, NULL); + + if (format->u.aac.codec_data_len) + { + buffer = gst_buffer_new_and_alloc(format->u.aac.codec_data_len); + gst_buffer_fill(buffer, 0, format->u.aac.codec_data, format->u.aac.codec_data_len); + gst_caps_set_simple(caps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); + gst_buffer_unref(buffer); + } + + return caps; +} + +static GstCaps *wg_format_to_caps_h264(const struct wg_encoded_format *format) +{ + const char *profile, *level; + GstCaps *caps; + + caps = gst_caps_new_empty_simple("video/x-h264"); + gst_caps_set_simple(caps, "stream-format", G_TYPE_STRING, "byte-stream", NULL); + gst_caps_set_simple(caps, "alignment", G_TYPE_STRING, "au", NULL); + + if (format->u.h264.width) + gst_caps_set_simple(caps, "width", G_TYPE_INT, format->u.h264.width, NULL); + if (format->u.h264.height) + gst_caps_set_simple(caps, "height", G_TYPE_INT, format->u.h264.height, NULL); + if (format->u.h264.fps_n || format->u.h264.fps_d) + gst_caps_set_simple(caps, "framerate", GST_TYPE_FRACTION, format->u.h264.fps_n, format->u.h264.fps_d, NULL); + + switch (format->u.h264.profile) + { + case /* eAVEncH264VProfile_Main */ 77: profile = "main"; break; + case /* eAVEncH264VProfile_High */ 100: profile = "high"; break; + case /* eAVEncH264VProfile_444 */ 244: profile = "high-4:4:4"; break; + default: + GST_ERROR("Unrecognized H.264 profile attribute %u.", format->u.h264.profile); + /* fallthrough */ + case 0: profile = NULL; + } + if (profile) + gst_caps_set_simple(caps, "profile", G_TYPE_STRING, profile, NULL); + + switch (format->u.h264.level) + { + case /* eAVEncH264VLevel1 */ 10: level = "1"; break; + case /* eAVEncH264VLevel1_1 */ 11: level = "1.1"; break; + case /* eAVEncH264VLevel1_2 */ 12: level = "1.2"; break; + case /* eAVEncH264VLevel1_3 */ 13: level = "1.3"; break; + case /* eAVEncH264VLevel2 */ 20: level = "2"; break; + case /* eAVEncH264VLevel2_1 */ 21: level = "2.1"; break; + case /* eAVEncH264VLevel2_2 */ 22: level = "2.2"; break; + case /* eAVEncH264VLevel3 */ 30: level = "3"; break; + case /* eAVEncH264VLevel3_1 */ 31: level = "3.1"; break; + case /* eAVEncH264VLevel3_2 */ 32: level = "3.2"; break; + case /* eAVEncH264VLevel4 */ 40: level = "4"; break; + case /* eAVEncH264VLevel4_1 */ 41: level = "4.1"; break; + case /* eAVEncH264VLevel4_2 */ 42: level = "4.2"; break; + case /* eAVEncH264VLevel5 */ 50: level = "5"; break; + case /* eAVEncH264VLevel5_1 */ 51: level = "5.1"; break; + case /* eAVEncH264VLevel5_2 */ 52: level = "5.2"; break; + default: + GST_ERROR("Unrecognized H.264 level attribute %u.", format->u.h264.level); + /* fallthrough */ + case 0: level = NULL; + } + if (level) + gst_caps_set_simple(caps, "level", G_TYPE_STRING, level, NULL); + + return caps; +} + +static GstCaps *wg_encoded_format_to_caps(const struct wg_encoded_format *format) +{ + switch (format->encoded_type) + { + case WG_ENCODED_TYPE_UNKNOWN: + return NULL; + case WG_ENCODED_TYPE_WMA: + case WG_ENCODED_TYPE_XMA: + return wg_format_to_caps_xwma(format); + case WG_ENCODED_TYPE_AAC: + return wg_format_to_caps_aac(format); + case WG_ENCODED_TYPE_H264: + return wg_format_to_caps_h264(format); + } + assert(0); + return NULL; +} + +static GstFlowReturn transform_sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *buffer) +{ + struct wg_transform *transform = gst_pad_get_element_private(pad); + struct wg_transform_sample *sample; + + GST_INFO("transform %p, buffer %p.", transform, buffer); + + if (!(sample = malloc(sizeof(*sample)))) + GST_ERROR("Failed to allocate transform sample entry"); + else + { + pthread_mutex_lock(&transform->mutex); + if (!(sample->sample = gst_sample_new(buffer, transform->sink_caps, NULL, NULL))) + GST_ERROR("Failed to allocate transform sample"); + list_add_tail(&transform->samples, &sample->entry); + pthread_mutex_unlock(&transform->mutex); + } + + gst_buffer_unref(buffer); + return GST_FLOW_OK; +} + +static gboolean transform_sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) +{ + struct wg_transform *transform = gst_pad_get_element_private(pad); + + GST_INFO("transform %p, type \"%s\".", transform, GST_EVENT_TYPE_NAME(event)); + + switch (event->type) + { + case GST_EVENT_CAPS: + { + GstCaps *caps; + gchar *str; + + gst_event_parse_caps(event, &caps); + str = gst_caps_to_string(caps); + GST_WARNING("Got caps \"%s\".", str); + g_free(str); + + pthread_mutex_lock(&transform->mutex); + gst_caps_unref(transform->sink_caps); + transform->sink_caps = gst_caps_ref(caps); + pthread_mutex_unlock(&transform->mutex); + break; + } + default: + GST_WARNING("Ignoring \"%s\" event.", GST_EVENT_TYPE_NAME(event)); + } + + gst_event_unref(event); + return TRUE; +} + +NTSTATUS wg_transform_destroy(void *args) +{ + struct wg_transform *transform = args; + struct wg_transform_sample *sample, *next; + + if (transform->container) + gst_element_set_state(transform->container, GST_STATE_NULL); + + if (transform->their_src && transform->my_sink) + gst_pad_unlink(transform->their_src, transform->my_sink); + if (transform->their_sink && transform->my_src) + gst_pad_unlink(transform->my_src, transform->their_sink); + + if (transform->their_sink) + g_object_unref(transform->their_sink); + if (transform->their_src) + g_object_unref(transform->their_src); + + if (transform->container) + g_object_unref(transform->container); + + if (transform->my_sink) + g_object_unref(transform->my_sink); + if (transform->my_src) + g_object_unref(transform->my_src); + + LIST_FOR_EACH_ENTRY_SAFE(sample, next, &transform->samples, struct wg_transform_sample, entry) + { + gst_sample_unref(sample->sample); + list_remove(&sample->entry); + free(sample); + } + + free(transform); + return S_OK; +} + +static GstElement *try_create_transform(GstCaps *src_caps, GstCaps *sink_caps) +{ + GstElement *element = NULL; + GList *tmp, *transforms; + gchar *type; + + transforms = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ANY, + GST_RANK_MARGINAL); + + tmp = gst_element_factory_list_filter(transforms, src_caps, GST_PAD_SINK, FALSE); + gst_plugin_feature_list_free(transforms); + transforms = tmp; + + tmp = gst_element_factory_list_filter(transforms, sink_caps, GST_PAD_SRC, FALSE); + gst_plugin_feature_list_free(transforms); + transforms = tmp; + + transforms = g_list_sort(transforms, gst_plugin_feature_rank_compare_func); + for (tmp = transforms; tmp != NULL && element == NULL; tmp = tmp->next) + { + type = gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(tmp->data)); + element = gst_element_factory_create(GST_ELEMENT_FACTORY(tmp->data), NULL); + if (!element) + GST_WARNING("Failed to create %s element.", type); + } + gst_plugin_feature_list_free(transforms); + + if (element) + GST_INFO("Created %s element %p.", type, element); + else + { + gchar *src_str = gst_caps_to_string(src_caps), *sink_str = gst_caps_to_string(sink_caps); + GST_WARNING("Failed to create transform matching caps %s / %s.", src_str, sink_str); + g_free(sink_str); + g_free(src_str); + } + + return element; +} + +static bool transform_append_element(struct wg_transform *transform, GstElement *element, + GstElement **first, GstElement **last) +{ + gchar *name = gst_element_get_name(element); + + if (!gst_bin_add(GST_BIN(transform->container), element)) + { + GST_ERROR("Failed to add %s element to bin.", name); + g_free(name); + return false; + } + + if (*last && !gst_element_link(*last, element)) + { + GST_ERROR("Failed to link %s element.", name); + g_free(name); + return false; + } + + GST_INFO("Created %s element %p.", name, element); + g_free(name); + + if (!*first) + *first = element; + + *last = element; + return true; +} + +NTSTATUS wg_transform_create(void *args) +{ + struct wg_transform_create_params *params = args; + struct wg_encoded_format input_format = *params->input_format; + struct wg_format output_format = *params->output_format; + GstElement *first = NULL, *last = NULL, *element; + GstCaps *raw_caps, *src_caps, *sink_caps; + struct wg_transform *transform; + GstPadTemplate *template; + const gchar *media_type; + GstSegment *segment; + int i, ret; + + if (!init_gstreamer()) + return E_FAIL; + + if (!(transform = calloc(1, sizeof(*transform)))) + return E_OUTOFMEMORY; + + list_init(&transform->samples); + + src_caps = wg_encoded_format_to_caps(&input_format); + assert(src_caps); + sink_caps = wg_format_to_caps(&output_format); + assert(sink_caps); + media_type = gst_structure_get_name(gst_caps_get_structure(sink_caps, 0)); + raw_caps = gst_caps_new_empty_simple(media_type); + assert(raw_caps); + + transform->sink_caps = gst_caps_copy(sink_caps); + transform->container = gst_bin_new("wg_transform"); + assert(transform->container); + + if (!(element = try_create_transform(src_caps, raw_caps)) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + + switch (output_format.major_type) + { + case WG_MAJOR_TYPE_AUDIO: + if (!(element = create_element("audioconvert", "base")) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + if (!(element = create_element("audioresample", "base")) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + break; + case WG_MAJOR_TYPE_VIDEO: + if (!(element = create_element("videoconvert", "base")) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + for (i = 0; i < gst_caps_get_size(sink_caps); ++i) + gst_structure_remove_fields(gst_caps_get_structure(sink_caps, i), + "width", "height", NULL); + break; + default: + assert(0); + break; + } + + if (!(transform->their_sink = gst_element_get_static_pad(first, "sink"))) + { + GST_ERROR("Failed to find target sink pad."); + goto failed; + } + if (!(transform->their_src = gst_element_get_static_pad(last, "src"))) + { + GST_ERROR("Failed to find target src pad."); + goto failed; + } + + template = gst_pad_template_new("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps); + assert(template); + transform->my_src = gst_pad_new_from_template(template, "src"); + g_object_unref(template); + assert(transform->my_src); + + template = gst_pad_template_new("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps); + assert(template); + transform->my_sink = gst_pad_new_from_template(template, "sink"); + g_object_unref(template); + assert(transform->my_sink); + + gst_pad_set_element_private(transform->my_sink, transform); + gst_pad_set_event_function(transform->my_sink, transform_sink_event_cb); + gst_pad_set_chain_function(transform->my_sink, transform_sink_chain_cb); + + if ((ret = gst_pad_link(transform->my_src, transform->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.", ret); + goto failed; + } + if ((ret = gst_pad_link(transform->their_src, transform->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.", ret); + goto failed; + } + + if (!(ret = gst_pad_set_active(transform->my_sink, 1))) + GST_WARNING("Failed to activate my_sink."); + if (!(ret = gst_pad_set_active(transform->my_src, 1))) + GST_WARNING("Failed to activate my_src."); + + gst_element_set_state(transform->container, GST_STATE_PAUSED); + ret = gst_element_get_state(transform->container, NULL, NULL, -1); + if (ret == GST_STATE_CHANGE_FAILURE) + { + GST_ERROR("Failed to play stream.\n"); + goto failed; + } + + if (!gst_pad_push_event(transform->my_src, gst_event_new_stream_start("stream"))) + { + GST_ERROR("Failed to send stream-start."); + goto failed; + } + + if (!gst_pad_push_event(transform->my_src, gst_event_new_caps(src_caps)) || + !gst_pad_has_current_caps(transform->their_sink)) + { + GST_ERROR("Failed to set stream caps."); + goto failed; + } + + segment = gst_segment_new(); + gst_segment_init(segment, GST_FORMAT_TIME); + segment->start = 0; + segment->stop = -1; + ret = gst_pad_push_event(transform->my_src, gst_event_new_segment(segment)); + gst_segment_free(segment); + if (!ret) + { + GST_ERROR("Failed to start new segment."); + goto failed; + } + + GST_INFO("Created winegstreamer transform %p.", transform); + params->transform = transform; + +failed: + gst_caps_unref(raw_caps); + gst_caps_unref(src_caps); + gst_caps_unref(sink_caps); + + if (params->transform) + return S_OK; + + wg_transform_destroy(transform); + return E_FAIL; +} + +NTSTATUS wg_transform_push_data(void *args) +{ + struct wg_transform_push_data_params *params = args; + struct wg_transform *transform = params->transform; + GstBuffer *buffer; + GstFlowReturn ret; + + buffer = gst_buffer_new_and_alloc(params->size); + gst_buffer_fill(buffer, 0, params->data, params->size); + + ret = gst_pad_push(transform->my_src, buffer); + if (ret) + { + GST_ERROR("Failed to push buffer %d", ret); + return MF_E_NOTACCEPTING; + } + + GST_INFO("Pushed %u bytes", params->size); + return S_OK; +} + +NTSTATUS wg_transform_read_data(void *args) +{ + struct wg_transform_read_data_params *params = args; + struct wg_transform *transform = params->transform; + struct wg_sample *read_sample = params->sample; + struct wg_transform_sample *transform_sample; + struct wg_format buffer_format; + bool broken_timestamp = false; + GstBuffer *buffer; + struct list *head; + GstMapInfo info; + GstCaps *caps; + + pthread_mutex_lock(&transform->mutex); + if (!(head = list_head(&transform->samples))) + { + pthread_mutex_unlock(&transform->mutex); + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + transform_sample = LIST_ENTRY(head, struct wg_transform_sample, entry); + buffer = gst_sample_get_buffer(transform_sample->sample); + + if (read_sample->format) + { + if (!(caps = gst_sample_get_caps(transform_sample->sample))) + caps = transform->sink_caps; + wg_format_from_caps(&buffer_format, caps); + if (!wg_format_compare(read_sample->format, &buffer_format)) + { + *read_sample->format = buffer_format; + read_sample->size = gst_buffer_get_size(buffer); + pthread_mutex_unlock(&transform->mutex); + return MF_E_TRANSFORM_STREAM_CHANGE; + } + + if (buffer_format.major_type == WG_MAJOR_TYPE_VIDEO + && buffer_format.u.video.fps_n <= 1 + && buffer_format.u.video.fps_d <= 1) + broken_timestamp = true; + } + + gst_buffer_map(buffer, &info, GST_MAP_READ); + if (read_sample->size > info.size) + read_sample->size = info.size; + memcpy(read_sample->data, info.data, read_sample->size); + gst_buffer_unmap(buffer, &info); + + if (buffer->pts != GST_CLOCK_TIME_NONE && !broken_timestamp) + { + read_sample->flags |= WG_SAMPLE_FLAG_HAS_PTS; + read_sample->pts = buffer->pts / 100; + } + if (buffer->duration != GST_CLOCK_TIME_NONE && !broken_timestamp) + { + read_sample->flags |= WG_SAMPLE_FLAG_HAS_DURATION; + read_sample->duration = buffer->duration / 100; + } + + if (info.size > read_sample->size) + { + read_sample->flags |= WG_SAMPLE_FLAG_INCOMPLETE; + gst_buffer_resize(buffer, read_sample->size, -1); + } + else + { + gst_sample_unref(transform_sample->sample); + list_remove(&transform_sample->entry); + free(transform_sample); + } + pthread_mutex_unlock(&transform->mutex); + + GST_INFO("Read %u bytes, flags %#x", read_sample->size, read_sample->flags); + return S_OK; +} diff --git a/dlls/mfplat/winegstreamer.rgs b/dlls/mfplat/winegstreamer.rgs new file mode 100644 index 00000000000..923ba673f8c --- /dev/null +++ wine/dlls/mfplat/winegstreamer.rgs @@ -0,0 +1,14 @@ +HKCR +{ + NoRemove 'Media Type' + { + '{e436eb83-524f-11ce-9f53-0020af0ba770}' + { + ForceRemove '{ffffffff-128f-4dd1-ad22-becfa66ce7aa}' + { + val '0' = s '0,1,00,0' + val 'Source Filter' = s '{e436ebb5-524f-11ce-9f53-0020af0ba770}' + } + } + } +} diff --git a/dlls/mfplat/winegstreamer.spec b/dlls/mfplat/winegstreamer.spec new file mode 100644 index 00000000000..bc6a390f8b1 --- /dev/null +++ wine/dlls/mfplat/winegstreamer.spec @@ -0,0 +1,6 @@ +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() +@ stdcall winegstreamer_create_wm_async_reader(ptr) +@ stdcall winegstreamer_create_wm_sync_reader(ptr) diff --git a/dlls/mfplat/winegstreamer_classes.idl b/dlls/mfplat/winegstreamer_classes.idl new file mode 100644 index 00000000000..5762430a5cd --- /dev/null +++ wine/dlls/mfplat/winegstreamer_classes.idl @@ -0,0 +1,93 @@ +/* + * COM classes for winegstreamer + * + * Copyright 2019 Nikolay Sivov + * Copyright 2019 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma makedep register + +[ + helpstring("AVI Splitter"), + threading(both), + uuid(1b544c20-fd0b-11ce-8c63-00aa0044b51e) +] +coclass AviSplitter {} + +[ + helpstring("MPEG-I Stream Splitter"), + threading(both), + uuid(336475d0-942a-11ce-a870-00aa002feab5) +] +coclass MPEG1Splitter {} + +[ + helpstring("Wave Parser"), + threading(both), + uuid(d51bd5a1-7548-11cf-a520-0080c77ef58a) +] +coclass WAVEParser {} + +[ + helpstring("GStreamer parser using decodebin"), + threading(both), + uuid(f9d8d64e-a144-47dc-8ee0-f53498372c29) +] +coclass decodebin_parser {} + +[ + threading(both), + uuid(88753b26-5b24-49bd-b2e7-0c445c78c982) +] +coclass VideoProcessorMFT {} + +[ + helpstring("Generic Decodebin Byte Stream Handler"), + threading(both), + uuid(317df618-5e5a-468a-9f15-d827a9a08162) +] +coclass GStreamerByteStreamHandler {} + +[ + threading(both), + uuid(6a170414-aad9-4693-b806-3a0c47c570d6) +] +coclass WINEAudioConverter { } + +[ + threading(both), + uuid(2eeb4adf-4578-4d10-bca7-bb955f56320a) +] +coclass CWMADecMediaObject {}; + +[ + threading(both), + uuid(62ce7e72-4c71-4d20-b15d-452831a87d9d) +] +coclass CMSH264DecoderMFT { } + +[ + threading(both), + uuid(32d186a7-218f-4c75-8876-dd77273a8999) +] +coclass CMSAACDecMFT { } + +[ + threading(both), + uuid(98230571-0087-4204-b020-3282538e57d3) +] +coclass CColorConvertDMO { } diff --git a/dlls/mfplat/wm_asyncreader.c b/dlls/mfplat/wm_asyncreader.c new file mode 100644 index 00000000000..a7ad6a6c45c --- /dev/null +++ wine/dlls/mfplat/wm_asyncreader.c @@ -0,0 +1,1590 @@ +/* + * Copyright 2012 Austin English + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wmvcore); + +struct async_reader +{ + struct wm_reader reader; + + IWMReader IWMReader_iface; + IWMReaderAdvanced6 IWMReaderAdvanced6_iface; + IWMReaderAccelerator IWMReaderAccelerator_iface; + IWMReaderNetworkConfig2 IWMReaderNetworkConfig2_iface; + IWMReaderStreamClock IWMReaderStreamClock_iface; + IWMReaderTypeNegotiation IWMReaderTypeNegotiation_iface; + IReferenceClock IReferenceClock_iface; + + IWMReaderCallback *callback; + void *context; + + LARGE_INTEGER clock_frequency; + HANDLE stream_thread; + CRITICAL_SECTION stream_cs; + CONDITION_VARIABLE stream_cv; + + bool running; + + bool user_clock; + QWORD user_time; +}; + +static REFERENCE_TIME get_current_time(const struct async_reader *reader) +{ + LARGE_INTEGER time; + + QueryPerformanceCounter(&time); + return (time.QuadPart * 1000) / reader->clock_frequency.QuadPart * 10000; +} + +static void open_stream(struct async_reader *reader, IWMReaderCallback *callback, void *context) +{ + static const DWORD zero; + HRESULT hr; + + IWMReaderCallback_AddRef(reader->callback = callback); + reader->context = context; + IWMReaderCallback_OnStatus(callback, WMT_OPENED, S_OK, WMT_TYPE_DWORD, (BYTE *)&zero, context); + + if (FAILED(hr = IWMReaderCallback_QueryInterface(callback, + &IID_IWMReaderCallbackAdvanced, (void **)&reader->reader.callback_advanced))) + reader->reader.callback_advanced = NULL; + TRACE("Querying for IWMReaderCallbackAdvanced returned %#x.\n", hr); +} + +static DWORD WINAPI stream_thread(void *arg) +{ + struct async_reader *reader = arg; + IWMReaderCallback *callback = reader->callback; + REFERENCE_TIME start_time; + static const DWORD zero; + QWORD pts, duration; + WORD stream_number; + INSSBuffer *sample; + DWORD flags; + HRESULT hr; + + start_time = get_current_time(reader); + + EnterCriticalSection(&reader->stream_cs); + + while (reader->running) + { + hr = wm_reader_get_stream_sample(&reader->reader, 0, &sample, &pts, &duration, &flags, &stream_number); + + if (hr == S_OK) + { + struct wm_stream *stream = wm_reader_get_stream_by_stream_number(&reader->reader, stream_number); + + if (reader->user_clock) + { + QWORD user_time = reader->user_time; + + if (pts > user_time && reader->reader.callback_advanced) + IWMReaderCallbackAdvanced_OnTime(reader->reader.callback_advanced, user_time, reader->context); + while (pts > reader->user_time && reader->running) + SleepConditionVariableCS(&reader->stream_cv, &reader->stream_cs, INFINITE); + if (!reader->running) + { + INSSBuffer_Release(sample); + goto out; + } + } + else + { + for (;;) + { + REFERENCE_TIME current_time = get_current_time(reader); + + if (pts <= current_time - start_time) + break; + + SleepConditionVariableCS(&reader->stream_cv, &reader->stream_cs, + (pts - (current_time - start_time)) / 10000); + + if (!reader->running) + { + INSSBuffer_Release(sample); + goto out; + } + } + } + + if (stream->read_compressed) + hr = IWMReaderCallbackAdvanced_OnStreamSample(reader->reader.callback_advanced, + stream_number, pts, duration, flags, sample, reader->context); + else + hr = IWMReaderCallback_OnSample(callback, stream_number - 1, pts, duration, + flags, sample, reader->context); + TRACE("Callback returned %#x.\n", hr); + INSSBuffer_Release(sample); + } + else if (hr == NS_E_NO_MORE_SAMPLES) + { + IWMReaderCallback_OnStatus(callback, WMT_END_OF_STREAMING, S_OK, + WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); + IWMReaderCallback_OnStatus(callback, WMT_EOF, S_OK, + WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); + + if (reader->user_clock && reader->reader.callback_advanced) + { + /* We can only get here if user_time is greater than the PTS + * of all samples, in which case we cannot have sent this + * notification already. */ + IWMReaderCallbackAdvanced_OnTime(reader->reader.callback_advanced, + reader->user_time, reader->context); + } + + TRACE("Reached end of stream; exiting.\n"); + LeaveCriticalSection(&reader->stream_cs); + return 0; + } + else + { + ERR("Failed to get sample, hr %#x.\n", hr); + LeaveCriticalSection(&reader->stream_cs); + return 0; + } + } + +out: + LeaveCriticalSection(&reader->stream_cs); + + TRACE("Reader is stopping; exiting.\n"); + return 0; +} + +static void stop_streaming(struct async_reader *reader) +{ + if (reader->stream_thread) + { + EnterCriticalSection(&reader->stream_cs); + reader->running = false; + LeaveCriticalSection(&reader->stream_cs); + WakeConditionVariable(&reader->stream_cv); + WaitForSingleObject(reader->stream_thread, INFINITE); + CloseHandle(reader->stream_thread); + reader->stream_thread = NULL; + } +} + +static struct async_reader *impl_from_IWMReader(IWMReader *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, IWMReader_iface); +} + +static HRESULT WINAPI WMReader_QueryInterface(IWMReader *iface, REFIID iid, void **out) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + return IWMProfile3_QueryInterface(&reader->reader.IWMProfile3_iface, iid, out); +} + +static ULONG WINAPI WMReader_AddRef(IWMReader *iface) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + return IWMProfile3_AddRef(&reader->reader.IWMProfile3_iface); +} + +static ULONG WINAPI WMReader_Release(IWMReader *iface) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + return IWMProfile3_Release(&reader->reader.IWMProfile3_iface); +} + +static HRESULT WINAPI WMReader_Open(IWMReader *iface, const WCHAR *url, + IWMReaderCallback *callback, void *context) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + HRESULT hr; + + TRACE("reader %p, url %s, callback %p, context %p.\n", + reader, debugstr_w(url), callback, context); + + EnterCriticalSection(&reader->reader.cs); + + if (SUCCEEDED(hr = wm_reader_open_file(&reader->reader, url))) + open_stream(reader, callback, context); + + LeaveCriticalSection(&reader->reader.cs); + return hr; +} + +static HRESULT WINAPI WMReader_Close(IWMReader *iface) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + static const DWORD zero; + HRESULT hr; + + TRACE("reader %p.\n", reader); + + EnterCriticalSection(&reader->reader.cs); + + stop_streaming(reader); + + hr = wm_reader_close(&reader->reader); + if (reader->callback) + { + IWMReaderCallback_OnStatus(reader->callback, WMT_CLOSED, S_OK, + WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); + IWMReaderCallback_Release(reader->callback); + } + reader->callback = NULL; + + LeaveCriticalSection(&reader->reader.cs); + + return hr; +} + +static HRESULT WINAPI WMReader_GetOutputCount(IWMReader *iface, DWORD *count) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + TRACE("reader %p, count %p.\n", reader, count); + + EnterCriticalSection(&reader->reader.cs); + *count = reader->reader.stream_count; + LeaveCriticalSection(&reader->reader.cs); + return S_OK; +} + +static HRESULT WINAPI WMReader_GetOutputProps(IWMReader *iface, DWORD output, IWMOutputMediaProps **props) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + TRACE("reader %p, output %u, props %p.\n", reader, output, props); + + return wm_reader_get_output_props(&reader->reader, output, props); +} + +static HRESULT WINAPI WMReader_SetOutputProps(IWMReader *iface, DWORD output, IWMOutputMediaProps *props) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + TRACE("reader %p, output %u, props %p.\n", reader, output, props); + + return wm_reader_set_output_props(&reader->reader, output, props); +} + +static HRESULT WINAPI WMReader_GetOutputFormatCount(IWMReader *iface, DWORD output, DWORD *count) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + TRACE("reader %p, output %u, count %p.\n", reader, output, count); + + return wm_reader_get_output_format_count(&reader->reader, output, count); +} + +static HRESULT WINAPI WMReader_GetOutputFormat(IWMReader *iface, DWORD output, + DWORD index, IWMOutputMediaProps **props) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + + TRACE("reader %p, output %u, index %u, props %p.\n", reader, output, index, props); + + return wm_reader_get_output_format(&reader->reader, output, index, props); +} + +static HRESULT WINAPI WMReader_Start(IWMReader *iface, + QWORD start, QWORD duration, float rate, void *context) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + static const DWORD zero; + + TRACE("reader %p, start %s, duration %s, rate %.8e, context %p.\n", + reader, debugstr_time(start), debugstr_time(duration), rate, context); + + if (rate != 1.0f) + FIXME("Ignoring rate %.8e.\n", rate); + + EnterCriticalSection(&reader->reader.cs); + + stop_streaming(reader); + + IWMReaderCallback_OnStatus(reader->callback, WMT_STARTED, S_OK, WMT_TYPE_DWORD, (BYTE *)&zero, context); + reader->context = context; + + wm_reader_seek(&reader->reader, start, duration); + + reader->running = true; + reader->user_time = 0; + + if (!(reader->stream_thread = CreateThread(NULL, 0, stream_thread, reader, 0, NULL))) + { + LeaveCriticalSection(&reader->reader.cs); + return E_OUTOFMEMORY; + } + + LeaveCriticalSection(&reader->reader.cs); + WakeConditionVariable(&reader->stream_cv); + + return S_OK; +} + +static HRESULT WINAPI WMReader_Stop(IWMReader *iface) +{ + struct async_reader *reader = impl_from_IWMReader(iface); + static const DWORD zero; + + TRACE("reader %p.\n", reader); + + EnterCriticalSection(&reader->reader.cs); + + if (!reader->reader.wg_parser) + { + LeaveCriticalSection(&reader->reader.cs); + WARN("No stream is open; returning E_UNEXPECTED.\n"); + return E_UNEXPECTED; + } + + stop_streaming(reader); + IWMReaderCallback_OnStatus(reader->callback, WMT_STOPPED, S_OK, + WMT_TYPE_DWORD, (BYTE *)&zero, reader->context); + LeaveCriticalSection(&reader->reader.cs); + return S_OK; +} + +static HRESULT WINAPI WMReader_Pause(IWMReader *iface) +{ + struct async_reader *This = impl_from_IWMReader(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReader_Resume(IWMReader *iface) +{ + struct async_reader *This = impl_from_IWMReader(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static const IWMReaderVtbl WMReaderVtbl = { + WMReader_QueryInterface, + WMReader_AddRef, + WMReader_Release, + WMReader_Open, + WMReader_Close, + WMReader_GetOutputCount, + WMReader_GetOutputProps, + WMReader_SetOutputProps, + WMReader_GetOutputFormatCount, + WMReader_GetOutputFormat, + WMReader_Start, + WMReader_Stop, + WMReader_Pause, + WMReader_Resume +}; + +static struct async_reader *impl_from_IWMReaderAdvanced6(IWMReaderAdvanced6 *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, IWMReaderAdvanced6_iface); +} + +static HRESULT WINAPI WMReaderAdvanced_QueryInterface(IWMReaderAdvanced6 *iface, REFIID riid, void **ppv) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + return IWMReader_QueryInterface(&This->IWMReader_iface, riid, ppv); +} + +static ULONG WINAPI WMReaderAdvanced_AddRef(IWMReaderAdvanced6 *iface) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + return IWMReader_AddRef(&This->IWMReader_iface); +} + +static ULONG WINAPI WMReaderAdvanced_Release(IWMReaderAdvanced6 *iface) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + return IWMReader_Release(&This->IWMReader_iface); +} + +static HRESULT WINAPI WMReaderAdvanced_SetUserProvidedClock(IWMReaderAdvanced6 *iface, BOOL user_clock) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, user_clock %d.\n", reader, user_clock); + + EnterCriticalSection(&reader->stream_cs); + reader->user_clock = !!user_clock; + LeaveCriticalSection(&reader->stream_cs); + return S_OK; +} + +static HRESULT WINAPI WMReaderAdvanced_GetUserProvidedClock(IWMReaderAdvanced6 *iface, BOOL *user_clock) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, user_clock); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_DeliverTime(IWMReaderAdvanced6 *iface, QWORD time) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, time %s.\n", reader, debugstr_time(time)); + + EnterCriticalSection(&reader->stream_cs); + + if (!reader->user_clock) + { + LeaveCriticalSection(&reader->stream_cs); + WARN("Not using a user-provided clock; returning E_UNEXPECTED.\n"); + return E_UNEXPECTED; + } + + reader->user_time = time; + + LeaveCriticalSection(&reader->stream_cs); + WakeConditionVariable(&reader->stream_cv); + return S_OK; +} + +static HRESULT WINAPI WMReaderAdvanced_SetManualStreamSelection(IWMReaderAdvanced6 *iface, BOOL selection) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%x)\n", This, selection); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_GetManualStreamSelection(IWMReaderAdvanced6 *iface, BOOL *selection) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, selection); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_SetStreamsSelected(IWMReaderAdvanced6 *iface, + WORD count, WORD *stream_numbers, WMT_STREAM_SELECTION *selections) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, count %u, stream_numbers %p, selections %p.\n", + reader, count, stream_numbers, selections); + + return wm_reader_set_streams_selected(&reader->reader, count, stream_numbers, selections); +} + +static HRESULT WINAPI WMReaderAdvanced_GetStreamSelected(IWMReaderAdvanced6 *iface, + WORD stream_number, WMT_STREAM_SELECTION *selection) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, stream_number %u, selection %p.\n", reader, stream_number, selection); + + return wm_reader_get_stream_selection(&reader->reader, stream_number, selection); +} + +static HRESULT WINAPI WMReaderAdvanced_SetReceiveSelectionCallbacks(IWMReaderAdvanced6 *iface, BOOL get_callbacks) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%x)\n", This, get_callbacks); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_GetReceiveSelectionCallbacks(IWMReaderAdvanced6 *iface, BOOL *get_callbacks) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, get_callbacks); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_SetReceiveStreamSamples(IWMReaderAdvanced6 *iface, + WORD stream_number, BOOL compressed) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, stream_number %u, compressed %d.\n", reader, stream_number, compressed); + + return wm_reader_set_read_compressed(&reader->reader, stream_number, compressed); +} + +static HRESULT WINAPI WMReaderAdvanced_GetReceiveStreamSamples(IWMReaderAdvanced6 *iface, WORD stream_num, + BOOL *receive_stream_samples) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, stream_num, receive_stream_samples); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_SetAllocateForOutput(IWMReaderAdvanced6 *iface, + DWORD output, BOOL allocate) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, output %u, allocate %d.\n", reader, output, allocate); + + return wm_reader_set_allocate_for_output(&reader->reader, output, allocate); +} + +static HRESULT WINAPI WMReaderAdvanced_GetAllocateForOutput(IWMReaderAdvanced6 *iface, DWORD output_num, BOOL *allocate) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, output_num, allocate); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_SetAllocateForStream(IWMReaderAdvanced6 *iface, + WORD stream_number, BOOL allocate) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, stream_number %u, allocate %d.\n", reader, stream_number, allocate); + + return wm_reader_set_allocate_for_stream(&reader->reader, stream_number, allocate); +} + +static HRESULT WINAPI WMReaderAdvanced_GetAllocateForStream(IWMReaderAdvanced6 *iface, WORD output_num, BOOL *allocate) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, output_num, allocate); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_GetStatistics(IWMReaderAdvanced6 *iface, WM_READER_STATISTICS *statistics) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, statistics); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_SetClientInfo(IWMReaderAdvanced6 *iface, WM_READER_CLIENTINFO *client_info) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, client_info); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_GetMaxOutputSampleSize(IWMReaderAdvanced6 *iface, DWORD output, DWORD *max) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, output, max); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced_GetMaxStreamSampleSize(IWMReaderAdvanced6 *iface, + WORD stream_number, DWORD *size) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + + TRACE("reader %p, stream_number %u, size %p.\n", reader, stream_number, size); + + return wm_reader_get_max_stream_size(&reader->reader, stream_number, size); +} + +static HRESULT WINAPI WMReaderAdvanced_NotifyLateDelivery(IWMReaderAdvanced6 *iface, QWORD lateness) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%s)\n", This, wine_dbgstr_longlong(lateness)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_SetPlayMode(IWMReaderAdvanced6 *iface, WMT_PLAY_MODE mode) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d)\n", This, mode); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_GetPlayMode(IWMReaderAdvanced6 *iface, WMT_PLAY_MODE *mode) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, mode); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_GetBufferProgress(IWMReaderAdvanced6 *iface, DWORD *percent, QWORD *buffering) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p %p)\n", This, percent, buffering); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_GetDownloadProgress(IWMReaderAdvanced6 *iface, DWORD *percent, + QWORD *bytes_downloaded, QWORD *download) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p %p %p)\n", This, percent, bytes_downloaded, download); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_GetSaveAsProgress(IWMReaderAdvanced6 *iface, DWORD *percent) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, percent); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_SaveFileAs(IWMReaderAdvanced6 *iface, const WCHAR *filename) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(filename)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_GetProtocolName(IWMReaderAdvanced6 *iface, WCHAR *protocol, DWORD *protocol_len) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p %p)\n", This, protocol, protocol_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_StartAtMarker(IWMReaderAdvanced6 *iface, WORD marker_index, + QWORD duration, float rate, void *context) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %s %f %p)\n", This, marker_index, wine_dbgstr_longlong(duration), rate, context); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_GetOutputSetting(IWMReaderAdvanced6 *iface, DWORD output_num, + const WCHAR *name, WMT_ATTR_DATATYPE *type, BYTE *value, WORD *length) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %s %p %p %p)\n", This, output_num, debugstr_w(name), type, value, length); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_SetOutputSetting(IWMReaderAdvanced6 *iface, DWORD output_num, + const WCHAR *name, WMT_ATTR_DATATYPE type, const BYTE *value, WORD length) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %s %d %p %d)\n", This, output_num, debugstr_w(name), type, value, length); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_Preroll(IWMReaderAdvanced6 *iface, QWORD start, QWORD duration, float rate) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%s %s %f)\n", This, wine_dbgstr_longlong(start), wine_dbgstr_longlong(duration), rate); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_SetLogClientID(IWMReaderAdvanced6 *iface, BOOL log_client_id) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%x)\n", This, log_client_id); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_GetLogClientID(IWMReaderAdvanced6 *iface, BOOL *log_client_id) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, log_client_id); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_StopBuffering(IWMReaderAdvanced6 *iface) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced2_OpenStream(IWMReaderAdvanced6 *iface, + IStream *stream, IWMReaderCallback *callback, void *context) +{ + struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); + HRESULT hr; + + TRACE("reader %p, stream %p, callback %p, context %p.\n", reader, stream, callback, context); + + EnterCriticalSection(&reader->reader.cs); + + if (SUCCEEDED(hr = wm_reader_open_stream(&reader->reader, stream))) + open_stream(reader, callback, context); + + LeaveCriticalSection(&reader->reader.cs); + return hr; +} + +static HRESULT WINAPI WMReaderAdvanced3_StopNetStreaming(IWMReaderAdvanced6 *iface) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced3_StartAtPosition(IWMReaderAdvanced6 *iface, WORD stream_num, + void *offset_start, void *duration, WMT_OFFSET_FORMAT format, float rate, void *context) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p %p %d %f %p)\n", This, stream_num, offset_start, duration, format, rate, context); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_GetLanguageCount(IWMReaderAdvanced6 *iface, DWORD output_num, WORD *language_count) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, output_num, language_count); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_GetLanguage(IWMReaderAdvanced6 *iface, DWORD output_num, + WORD language, WCHAR *language_string, WORD *language_string_len) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %x %p %p)\n", This, output_num, language, language_string, language_string_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_GetMaxSpeedFactor(IWMReaderAdvanced6 *iface, double *factor) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, factor); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_IsUsingFastCache(IWMReaderAdvanced6 *iface, BOOL *using_fast_cache) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, using_fast_cache); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_AddLogParam(IWMReaderAdvanced6 *iface, const WCHAR *namespace, + const WCHAR *name, const WCHAR *value) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(namespace), debugstr_w(name), debugstr_w(value)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_SendLogParams(IWMReaderAdvanced6 *iface) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_CanSaveFileAs(IWMReaderAdvanced6 *iface, BOOL *can_save) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p)\n", This, can_save); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_CancelSaveFileAs(IWMReaderAdvanced6 *iface) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced4_GetURL(IWMReaderAdvanced6 *iface, WCHAR *url, DWORD *url_len) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p %p)\n", This, url, url_len); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced5_SetPlayerHook(IWMReaderAdvanced6 *iface, DWORD output_num, IWMPlayerHook *hook) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, output_num, hook); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMReaderAdvanced6_SetProtectStreamSamples(IWMReaderAdvanced6 *iface, BYTE *cert, + DWORD cert_size, DWORD cert_type, DWORD flags, BYTE *initialization_vector, DWORD *initialization_vector_size) +{ + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p %d %d %x %p %p)\n", This, cert, cert_size, cert_type, flags, initialization_vector, + initialization_vector_size); + return E_NOTIMPL; +} + +static const IWMReaderAdvanced6Vtbl WMReaderAdvanced6Vtbl = { + WMReaderAdvanced_QueryInterface, + WMReaderAdvanced_AddRef, + WMReaderAdvanced_Release, + WMReaderAdvanced_SetUserProvidedClock, + WMReaderAdvanced_GetUserProvidedClock, + WMReaderAdvanced_DeliverTime, + WMReaderAdvanced_SetManualStreamSelection, + WMReaderAdvanced_GetManualStreamSelection, + WMReaderAdvanced_SetStreamsSelected, + WMReaderAdvanced_GetStreamSelected, + WMReaderAdvanced_SetReceiveSelectionCallbacks, + WMReaderAdvanced_GetReceiveSelectionCallbacks, + WMReaderAdvanced_SetReceiveStreamSamples, + WMReaderAdvanced_GetReceiveStreamSamples, + WMReaderAdvanced_SetAllocateForOutput, + WMReaderAdvanced_GetAllocateForOutput, + WMReaderAdvanced_SetAllocateForStream, + WMReaderAdvanced_GetAllocateForStream, + WMReaderAdvanced_GetStatistics, + WMReaderAdvanced_SetClientInfo, + WMReaderAdvanced_GetMaxOutputSampleSize, + WMReaderAdvanced_GetMaxStreamSampleSize, + WMReaderAdvanced_NotifyLateDelivery, + WMReaderAdvanced2_SetPlayMode, + WMReaderAdvanced2_GetPlayMode, + WMReaderAdvanced2_GetBufferProgress, + WMReaderAdvanced2_GetDownloadProgress, + WMReaderAdvanced2_GetSaveAsProgress, + WMReaderAdvanced2_SaveFileAs, + WMReaderAdvanced2_GetProtocolName, + WMReaderAdvanced2_StartAtMarker, + WMReaderAdvanced2_GetOutputSetting, + WMReaderAdvanced2_SetOutputSetting, + WMReaderAdvanced2_Preroll, + WMReaderAdvanced2_SetLogClientID, + WMReaderAdvanced2_GetLogClientID, + WMReaderAdvanced2_StopBuffering, + WMReaderAdvanced2_OpenStream, + WMReaderAdvanced3_StopNetStreaming, + WMReaderAdvanced3_StartAtPosition, + WMReaderAdvanced4_GetLanguageCount, + WMReaderAdvanced4_GetLanguage, + WMReaderAdvanced4_GetMaxSpeedFactor, + WMReaderAdvanced4_IsUsingFastCache, + WMReaderAdvanced4_AddLogParam, + WMReaderAdvanced4_SendLogParams, + WMReaderAdvanced4_CanSaveFileAs, + WMReaderAdvanced4_CancelSaveFileAs, + WMReaderAdvanced4_GetURL, + WMReaderAdvanced5_SetPlayerHook, + WMReaderAdvanced6_SetProtectStreamSamples +}; + +static struct async_reader *impl_from_IWMReaderAccelerator(IWMReaderAccelerator *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, IWMReaderAccelerator_iface); +} + +static HRESULT WINAPI reader_accl_QueryInterface(IWMReaderAccelerator *iface, REFIID riid, void **object) +{ + struct async_reader *This = impl_from_IWMReaderAccelerator(iface); + return IWMReader_QueryInterface(&This->IWMReader_iface, riid, object); +} + +static ULONG WINAPI reader_accl_AddRef(IWMReaderAccelerator *iface) +{ + struct async_reader *This = impl_from_IWMReaderAccelerator(iface); + return IWMReader_AddRef(&This->IWMReader_iface); +} + +static ULONG WINAPI reader_accl_Release(IWMReaderAccelerator *iface) +{ + struct async_reader *This = impl_from_IWMReaderAccelerator(iface); + return IWMReader_Release(&This->IWMReader_iface); +} + +static HRESULT WINAPI reader_accl_GetCodecInterface(IWMReaderAccelerator *iface, DWORD output, REFIID riid, void **codec) +{ + struct async_reader *This = impl_from_IWMReaderAccelerator(iface); + + FIXME("%p, %d, %s, %p\n", This, output, debugstr_guid(riid), codec); + + return E_NOTIMPL; +} + +static HRESULT WINAPI reader_accl_Notify(IWMReaderAccelerator *iface, DWORD output, WM_MEDIA_TYPE *subtype) +{ + struct async_reader *This = impl_from_IWMReaderAccelerator(iface); + + FIXME("%p, %d, %p\n", This, output, subtype); + + return E_NOTIMPL; +} + +static const IWMReaderAcceleratorVtbl WMReaderAcceleratorVtbl = { + reader_accl_QueryInterface, + reader_accl_AddRef, + reader_accl_Release, + reader_accl_GetCodecInterface, + reader_accl_Notify +}; + +static struct async_reader *impl_from_IWMReaderNetworkConfig2(IWMReaderNetworkConfig2 *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, IWMReaderNetworkConfig2_iface); +} + +static HRESULT WINAPI networkconfig_QueryInterface(IWMReaderNetworkConfig2 *iface, REFIID riid, void **ppv) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + return IWMReader_QueryInterface(&This->IWMReader_iface, riid, ppv); +} + +static ULONG WINAPI networkconfig_AddRef(IWMReaderNetworkConfig2 *iface) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + return IWMReader_AddRef(&This->IWMReader_iface); +} + +static ULONG WINAPI networkconfig_Release(IWMReaderNetworkConfig2 *iface) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + return IWMReader_Release(&This->IWMReader_iface); +} + +static HRESULT WINAPI networkconfig_GetBufferingTime(IWMReaderNetworkConfig2 *iface, QWORD *buffering_time) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, buffering_time); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetBufferingTime(IWMReaderNetworkConfig2 *iface, QWORD buffering_time) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s\n", This, wine_dbgstr_longlong(buffering_time)); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetUDPPortRanges(IWMReaderNetworkConfig2 *iface, WM_PORT_NUMBER_RANGE *array, + DWORD *ranges) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p, %p\n", This, array, ranges); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetUDPPortRanges(IWMReaderNetworkConfig2 *iface, WM_PORT_NUMBER_RANGE *array, + DWORD ranges) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p, %u\n", This, array, ranges); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetProxySettings(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + WMT_PROXY_SETTINGS *proxy) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %p\n", This, debugstr_w(protocol), proxy); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetProxySettings(IWMReaderNetworkConfig2 *iface, LPCWSTR protocol, + WMT_PROXY_SETTINGS proxy) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %d\n", This, debugstr_w(protocol), proxy); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetProxyHostName(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + WCHAR *hostname, DWORD *size) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %p, %p\n", This, debugstr_w(protocol), hostname, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetProxyHostName(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + const WCHAR *hostname) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %s\n", This, debugstr_w(protocol), debugstr_w(hostname)); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetProxyPort(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + DWORD *port) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %p\n", This, debugstr_w(protocol), port); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetProxyPort(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + DWORD port) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %u\n", This, debugstr_w(protocol), port); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetProxyExceptionList(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + WCHAR *exceptions, DWORD *count) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %p, %p\n", This, debugstr_w(protocol), exceptions, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetProxyExceptionList(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + const WCHAR *exceptions) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %s\n", This, debugstr_w(protocol), debugstr_w(exceptions)); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetProxyBypassForLocal(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + BOOL *bypass) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %p\n", This, debugstr_w(protocol), bypass); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetProxyBypassForLocal(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, + BOOL bypass) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %d\n", This, debugstr_w(protocol), bypass); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetForceRerunAutoProxyDetection(IWMReaderNetworkConfig2 *iface, + BOOL *detection) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, detection); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetForceRerunAutoProxyDetection(IWMReaderNetworkConfig2 *iface, + BOOL detection) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %d\n", This, detection); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableMulticast(IWMReaderNetworkConfig2 *iface, BOOL *multicast) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, multicast); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableMulticast(IWMReaderNetworkConfig2 *iface, BOOL multicast) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %d\n", This, multicast); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableHTTP(IWMReaderNetworkConfig2 *iface, BOOL *enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableHTTP(IWMReaderNetworkConfig2 *iface, BOOL enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %d\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableUDP(IWMReaderNetworkConfig2 *iface, BOOL *enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableUDP(IWMReaderNetworkConfig2 *iface, BOOL enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %d\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableTCP(IWMReaderNetworkConfig2 *iface, BOOL *enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableTCP(IWMReaderNetworkConfig2 *iface, BOOL enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %d\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_ResetProtocolRollover(IWMReaderNetworkConfig2 *iface) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetConnectionBandwidth(IWMReaderNetworkConfig2 *iface, DWORD *bandwidth) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, bandwidth); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetConnectionBandwidth(IWMReaderNetworkConfig2 *iface, DWORD bandwidth) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u\n", This, bandwidth); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetNumProtocolsSupported(IWMReaderNetworkConfig2 *iface, DWORD *protocols) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, protocols); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetSupportedProtocolName(IWMReaderNetworkConfig2 *iface, DWORD protocol_num, + WCHAR *protocol, DWORD *size) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u, %p %p\n", This, protocol_num, protocol, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_AddLoggingUrl(IWMReaderNetworkConfig2 *iface, const WCHAR *url) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s\n", This, debugstr_w(url)); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetLoggingUrl(IWMReaderNetworkConfig2 *iface, DWORD index, WCHAR *url, + DWORD *size) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u, %p, %p\n", This, index, url, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetLoggingUrlCount(IWMReaderNetworkConfig2 *iface, DWORD *count) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_ResetLoggingUrlList(IWMReaderNetworkConfig2 *iface) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableContentCaching(IWMReaderNetworkConfig2 *iface, BOOL *enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableContentCaching(IWMReaderNetworkConfig2 *iface, BOOL enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %d\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableFastCache(IWMReaderNetworkConfig2 *iface, BOOL *enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableFastCache(IWMReaderNetworkConfig2 *iface, BOOL enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %d\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetAcceleratedStreamingDuration(IWMReaderNetworkConfig2 *iface, + QWORD *duration) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, duration); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetAcceleratedStreamingDuration(IWMReaderNetworkConfig2 *iface, + QWORD duration) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s\n", This, wine_dbgstr_longlong(duration)); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetAutoReconnectLimit(IWMReaderNetworkConfig2 *iface, DWORD *limit) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, limit); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetAutoReconnectLimit(IWMReaderNetworkConfig2 *iface, DWORD limit) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u\n", This, limit); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableResends(IWMReaderNetworkConfig2 *iface, BOOL *enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableResends(IWMReaderNetworkConfig2 *iface, BOOL enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetEnableThinning(IWMReaderNetworkConfig2 *iface, BOOL *enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_SetEnableThinning(IWMReaderNetworkConfig2 *iface, BOOL enable) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u\n", This, enable); + return E_NOTIMPL; +} + +static HRESULT WINAPI networkconfig_GetMaxNetPacketSize(IWMReaderNetworkConfig2 *iface, DWORD *packet_size) +{ + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p\n", This, packet_size); + return E_NOTIMPL; +} + +static const IWMReaderNetworkConfig2Vtbl WMReaderNetworkConfig2Vtbl = +{ + networkconfig_QueryInterface, + networkconfig_AddRef, + networkconfig_Release, + networkconfig_GetBufferingTime, + networkconfig_SetBufferingTime, + networkconfig_GetUDPPortRanges, + networkconfig_SetUDPPortRanges, + networkconfig_GetProxySettings, + networkconfig_SetProxySettings, + networkconfig_GetProxyHostName, + networkconfig_SetProxyHostName, + networkconfig_GetProxyPort, + networkconfig_SetProxyPort, + networkconfig_GetProxyExceptionList, + networkconfig_SetProxyExceptionList, + networkconfig_GetProxyBypassForLocal, + networkconfig_SetProxyBypassForLocal, + networkconfig_GetForceRerunAutoProxyDetection, + networkconfig_SetForceRerunAutoProxyDetection, + networkconfig_GetEnableMulticast, + networkconfig_SetEnableMulticast, + networkconfig_GetEnableHTTP, + networkconfig_SetEnableHTTP, + networkconfig_GetEnableUDP, + networkconfig_SetEnableUDP, + networkconfig_GetEnableTCP, + networkconfig_SetEnableTCP, + networkconfig_ResetProtocolRollover, + networkconfig_GetConnectionBandwidth, + networkconfig_SetConnectionBandwidth, + networkconfig_GetNumProtocolsSupported, + networkconfig_GetSupportedProtocolName, + networkconfig_AddLoggingUrl, + networkconfig_GetLoggingUrl, + networkconfig_GetLoggingUrlCount, + networkconfig_ResetLoggingUrlList, + networkconfig_GetEnableContentCaching, + networkconfig_SetEnableContentCaching, + networkconfig_GetEnableFastCache, + networkconfig_SetEnableFastCache, + networkconfig_GetAcceleratedStreamingDuration, + networkconfig_SetAcceleratedStreamingDuration, + networkconfig_GetAutoReconnectLimit, + networkconfig_SetAutoReconnectLimit, + networkconfig_GetEnableResends, + networkconfig_SetEnableResends, + networkconfig_GetEnableThinning, + networkconfig_SetEnableThinning, + networkconfig_GetMaxNetPacketSize +}; + +static struct async_reader *impl_from_IWMReaderStreamClock(IWMReaderStreamClock *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, IWMReaderStreamClock_iface); +} + +static HRESULT WINAPI readclock_QueryInterface(IWMReaderStreamClock *iface, REFIID riid, void **ppv) +{ + struct async_reader *This = impl_from_IWMReaderStreamClock(iface); + return IWMReader_QueryInterface(&This->IWMReader_iface, riid, ppv); +} + +static ULONG WINAPI readclock_AddRef(IWMReaderStreamClock *iface) +{ + struct async_reader *This = impl_from_IWMReaderStreamClock(iface); + return IWMReader_AddRef(&This->IWMReader_iface); +} + +static ULONG WINAPI readclock_Release(IWMReaderStreamClock *iface) +{ + struct async_reader *This = impl_from_IWMReaderStreamClock(iface); + return IWMReader_Release(&This->IWMReader_iface); +} + +static HRESULT WINAPI readclock_GetTime(IWMReaderStreamClock *iface, QWORD *now) +{ + struct async_reader *This = impl_from_IWMReaderStreamClock(iface); + FIXME("%p, %p\n", This, now); + return E_NOTIMPL; +} + +static HRESULT WINAPI readclock_SetTimer(IWMReaderStreamClock *iface, QWORD when, void *param, DWORD *id) +{ + struct async_reader *This = impl_from_IWMReaderStreamClock(iface); + FIXME("%p, %s, %p, %p\n", This, wine_dbgstr_longlong(when), param, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI readclock_KillTimer(IWMReaderStreamClock *iface, DWORD id) +{ + struct async_reader *This = impl_from_IWMReaderStreamClock(iface); + FIXME("%p, %d\n", This, id); + return E_NOTIMPL; +} + +static const IWMReaderStreamClockVtbl WMReaderStreamClockVtbl = +{ + readclock_QueryInterface, + readclock_AddRef, + readclock_Release, + readclock_GetTime, + readclock_SetTimer, + readclock_KillTimer +}; + +static struct async_reader *impl_from_IWMReaderTypeNegotiation(IWMReaderTypeNegotiation *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, IWMReaderTypeNegotiation_iface); +} + +static HRESULT WINAPI negotiation_QueryInterface(IWMReaderTypeNegotiation *iface, REFIID riid, void **ppv) +{ + struct async_reader *This = impl_from_IWMReaderTypeNegotiation(iface); + return IWMReader_QueryInterface(&This->IWMReader_iface, riid, ppv); +} + +static ULONG WINAPI negotiation_AddRef(IWMReaderTypeNegotiation *iface) +{ + struct async_reader *This = impl_from_IWMReaderTypeNegotiation(iface); + return IWMReader_AddRef(&This->IWMReader_iface); +} + +static ULONG WINAPI negotiation_Release(IWMReaderTypeNegotiation *iface) +{ + struct async_reader *This = impl_from_IWMReaderTypeNegotiation(iface); + return IWMReader_Release(&This->IWMReader_iface); +} + +static HRESULT WINAPI negotiation_TryOutputProps(IWMReaderTypeNegotiation *iface, DWORD output, IWMOutputMediaProps *props) +{ + struct async_reader *This = impl_from_IWMReaderTypeNegotiation(iface); + FIXME("%p, %d, %p\n", This, output, props); + return E_NOTIMPL; +} + +static const IWMReaderTypeNegotiationVtbl WMReaderTypeNegotiationVtbl = +{ + negotiation_QueryInterface, + negotiation_AddRef, + negotiation_Release, + negotiation_TryOutputProps +}; + +static struct async_reader *impl_from_IReferenceClock(IReferenceClock *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, IReferenceClock_iface); +} + +static HRESULT WINAPI refclock_QueryInterface(IReferenceClock *iface, REFIID riid, void **ppv) +{ + struct async_reader *This = impl_from_IReferenceClock(iface); + return IWMReader_QueryInterface(&This->IWMReader_iface, riid, ppv); +} + +static ULONG WINAPI refclock_AddRef(IReferenceClock *iface) +{ + struct async_reader *This = impl_from_IReferenceClock(iface); + return IWMReader_AddRef(&This->IWMReader_iface); +} + +static ULONG WINAPI refclock_Release(IReferenceClock *iface) +{ + struct async_reader *This = impl_from_IReferenceClock(iface); + return IWMReader_Release(&This->IWMReader_iface); +} + +static HRESULT WINAPI refclock_GetTime(IReferenceClock *iface, REFERENCE_TIME *time) +{ + struct async_reader *This = impl_from_IReferenceClock(iface); + FIXME("%p, %p\n", This, time); + return E_NOTIMPL; +} + +static HRESULT WINAPI refclock_AdviseTime(IReferenceClock *iface, REFERENCE_TIME basetime, + REFERENCE_TIME streamtime, HEVENT event, DWORD_PTR *cookie) +{ + struct async_reader *This = impl_from_IReferenceClock(iface); + FIXME("%p, %s, %s, %lu, %p\n", This, wine_dbgstr_longlong(basetime), + wine_dbgstr_longlong(streamtime), event, cookie); + return E_NOTIMPL; +} + +static HRESULT WINAPI refclock_AdvisePeriodic(IReferenceClock *iface, REFERENCE_TIME starttime, + REFERENCE_TIME period, HSEMAPHORE semaphore, DWORD_PTR *cookie) +{ + struct async_reader *This = impl_from_IReferenceClock(iface); + FIXME("%p, %s, %s, %lu, %p\n", This, wine_dbgstr_longlong(starttime), + wine_dbgstr_longlong(period), semaphore, cookie); + return E_NOTIMPL; +} + +static HRESULT WINAPI refclock_Unadvise(IReferenceClock *iface, DWORD_PTR cookie) +{ + struct async_reader *This = impl_from_IReferenceClock(iface); + FIXME("%p, %lu\n", This, cookie); + return E_NOTIMPL; +} + +static const IReferenceClockVtbl ReferenceClockVtbl = +{ + refclock_QueryInterface, + refclock_AddRef, + refclock_Release, + refclock_GetTime, + refclock_AdviseTime, + refclock_AdvisePeriodic, + refclock_Unadvise +}; + +static struct async_reader *impl_from_wm_reader(struct wm_reader *iface) +{ + return CONTAINING_RECORD(iface, struct async_reader, reader); +} + +static void *async_reader_query_interface(struct wm_reader *iface, REFIID iid) +{ + struct async_reader *reader = impl_from_wm_reader(iface); + + TRACE("reader %p, iid %s.\n", reader, debugstr_guid(iid)); + + if (IsEqualIID(iid, &IID_IReferenceClock)) + return &reader->IReferenceClock_iface; + + if (IsEqualIID(iid, &IID_IWMReader)) + return &reader->IWMReader_iface; + + if (IsEqualIID(iid, &IID_IWMReaderAccelerator)) + return &reader->IWMReaderAccelerator_iface; + + if (IsEqualIID(iid, &IID_IWMReaderAdvanced) + || IsEqualIID(iid, &IID_IWMReaderAdvanced2) + || IsEqualIID(iid, &IID_IWMReaderAdvanced3) + || IsEqualIID(iid, &IID_IWMReaderAdvanced4) + || IsEqualIID(iid, &IID_IWMReaderAdvanced5) + || IsEqualIID(iid, &IID_IWMReaderAdvanced6)) + return &reader->IWMReaderAdvanced6_iface; + + if (IsEqualIID(iid, &IID_IWMReaderNetworkConfig) + || IsEqualIID(iid, &IID_IWMReaderNetworkConfig2)) + return &reader->IWMReaderNetworkConfig2_iface; + + if (IsEqualIID(iid, &IID_IWMReaderStreamClock)) + return &reader->IWMReaderStreamClock_iface; + + if (IsEqualIID(iid, &IID_IWMReaderTypeNegotiation)) + return &reader->IWMReaderTypeNegotiation_iface; + + return NULL; +} + +static void async_reader_destroy(struct wm_reader *iface) +{ + struct async_reader *reader = impl_from_wm_reader(iface); + + TRACE("reader %p.\n", reader); + + if (reader->stream_thread) + { + WaitForSingleObject(reader->stream_thread, INFINITE); + CloseHandle(reader->stream_thread); + } + + reader->stream_cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&reader->stream_cs); + + wm_reader_close(&reader->reader); + + if (reader->callback) + IWMReaderCallback_Release(reader->callback); + + wm_reader_cleanup(&reader->reader); + free(reader); +} + +static const struct wm_reader_ops async_reader_ops = +{ + .query_interface = async_reader_query_interface, + .destroy = async_reader_destroy, +}; + +HRESULT WINAPI winegstreamer_create_wm_async_reader(IWMReader **reader) +{ + struct async_reader *object; + + TRACE("reader %p.\n", reader); + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + wm_reader_init(&object->reader, &async_reader_ops); + + object->IReferenceClock_iface.lpVtbl = &ReferenceClockVtbl; + object->IWMReader_iface.lpVtbl = &WMReaderVtbl; + object->IWMReaderAdvanced6_iface.lpVtbl = &WMReaderAdvanced6Vtbl; + object->IWMReaderAccelerator_iface.lpVtbl = &WMReaderAcceleratorVtbl; + object->IWMReaderNetworkConfig2_iface.lpVtbl = &WMReaderNetworkConfig2Vtbl; + object->IWMReaderStreamClock_iface.lpVtbl = &WMReaderStreamClockVtbl; + object->IWMReaderTypeNegotiation_iface.lpVtbl = &WMReaderTypeNegotiationVtbl; + + InitializeCriticalSection(&object->stream_cs); + object->stream_cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": async_reader.stream_cs"); + + QueryPerformanceFrequency(&object->clock_frequency); + + TRACE("Created async reader %p.\n", object); + *reader = (IWMReader *)&object->IWMReader_iface; + return S_OK; +} diff --git a/dlls/mfplat/wm_reader.c b/dlls/mfplat/wm_reader.c new file mode 100644 index 00000000000..cb667c957b4 --- /dev/null +++ wine/dlls/mfplat/wm_reader.c @@ -0,0 +1,2170 @@ +/* + * Copyright 2012 Austin English + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wmvcore); + +static struct wm_stream *get_stream_by_output_number(struct wm_reader *reader, DWORD output) +{ + if (output < reader->stream_count) + return &reader->streams[output]; + WARN("Invalid output number %u.\n", output); + return NULL; +} + +struct output_props +{ + IWMOutputMediaProps IWMOutputMediaProps_iface; + LONG refcount; + + AM_MEDIA_TYPE mt; +}; + +static inline struct output_props *impl_from_IWMOutputMediaProps(IWMOutputMediaProps *iface) +{ + return CONTAINING_RECORD(iface, struct output_props, IWMOutputMediaProps_iface); +} + +static HRESULT WINAPI output_props_QueryInterface(IWMOutputMediaProps *iface, REFIID iid, void **out) +{ + struct output_props *props = impl_from_IWMOutputMediaProps(iface); + + TRACE("props %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IWMOutputMediaProps)) + *out = &props->IWMOutputMediaProps_iface; + else + { + *out = NULL; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI output_props_AddRef(IWMOutputMediaProps *iface) +{ + struct output_props *props = impl_from_IWMOutputMediaProps(iface); + ULONG refcount = InterlockedIncrement(&props->refcount); + + TRACE("%p increasing refcount to %u.\n", props, refcount); + + return refcount; +} + +static ULONG WINAPI output_props_Release(IWMOutputMediaProps *iface) +{ + struct output_props *props = impl_from_IWMOutputMediaProps(iface); + ULONG refcount = InterlockedDecrement(&props->refcount); + + TRACE("%p decreasing refcount to %u.\n", props, refcount); + + if (!refcount) + free(props); + + return refcount; +} + +static HRESULT WINAPI output_props_GetType(IWMOutputMediaProps *iface, GUID *major_type) +{ + const struct output_props *props = impl_from_IWMOutputMediaProps(iface); + + TRACE("iface %p, major_type %p.\n", iface, major_type); + + *major_type = props->mt.majortype; + return S_OK; +} + +static HRESULT WINAPI output_props_GetMediaType(IWMOutputMediaProps *iface, WM_MEDIA_TYPE *mt, DWORD *size) +{ + const struct output_props *props = impl_from_IWMOutputMediaProps(iface); + const DWORD req_size = *size; + + TRACE("iface %p, mt %p, size %p.\n", iface, mt, size); + + *size = sizeof(*mt) + props->mt.cbFormat; + if (!mt) + return S_OK; + if (req_size < *size) + return ASF_E_BUFFERTOOSMALL; + + strmbase_dump_media_type(&props->mt); + + memcpy(mt, &props->mt, sizeof(*mt)); + memcpy(mt + 1, props->mt.pbFormat, props->mt.cbFormat); + mt->pbFormat = (BYTE *)(mt + 1); + return S_OK; +} + +static HRESULT WINAPI output_props_SetMediaType(IWMOutputMediaProps *iface, WM_MEDIA_TYPE *mt) +{ + FIXME("iface %p, mt %p, stub!\n", iface, mt); + return E_NOTIMPL; +} + +static HRESULT WINAPI output_props_GetStreamGroupName(IWMOutputMediaProps *iface, WCHAR *name, WORD *len) +{ + FIXME("iface %p, name %p, len %p, stub!\n", iface, name, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI output_props_GetConnectionName(IWMOutputMediaProps *iface, WCHAR *name, WORD *len) +{ + FIXME("iface %p, name %p, len %p, stub!\n", iface, name, len); + return E_NOTIMPL; +} + +static const struct IWMOutputMediaPropsVtbl output_props_vtbl = +{ + output_props_QueryInterface, + output_props_AddRef, + output_props_Release, + output_props_GetType, + output_props_GetMediaType, + output_props_SetMediaType, + output_props_GetStreamGroupName, + output_props_GetConnectionName, +}; + +static struct output_props *unsafe_impl_from_IWMOutputMediaProps(IWMOutputMediaProps *iface) +{ + if (!iface) + return NULL; + assert(iface->lpVtbl == &output_props_vtbl); + return impl_from_IWMOutputMediaProps(iface); +} + +static IWMOutputMediaProps *output_props_create(const struct wg_format *format) +{ + struct output_props *object; + + if (!(object = calloc(1, sizeof(*object)))) + return NULL; + object->IWMOutputMediaProps_iface.lpVtbl = &output_props_vtbl; + object->refcount = 1; + + if (!amt_from_wg_format(&object->mt, format, true)) + { + free(object); + return NULL; + } + + TRACE("Created output properties %p.\n", object); + return &object->IWMOutputMediaProps_iface; +} + +struct buffer +{ + INSSBuffer INSSBuffer_iface; + LONG refcount; + + DWORD size, capacity; + BYTE data[1]; +}; + +static struct buffer *impl_from_INSSBuffer(INSSBuffer *iface) +{ + return CONTAINING_RECORD(iface, struct buffer, INSSBuffer_iface); +} + +static HRESULT WINAPI buffer_QueryInterface(INSSBuffer *iface, REFIID iid, void **out) +{ + struct buffer *buffer = impl_from_INSSBuffer(iface); + + TRACE("buffer %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_INSSBuffer)) + *out = &buffer->INSSBuffer_iface; + else + { + *out = NULL; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI buffer_AddRef(INSSBuffer *iface) +{ + struct buffer *buffer = impl_from_INSSBuffer(iface); + ULONG refcount = InterlockedIncrement(&buffer->refcount); + + TRACE("%p increasing refcount to %u.\n", buffer, refcount); + + return refcount; +} + +static ULONG WINAPI buffer_Release(INSSBuffer *iface) +{ + struct buffer *buffer = impl_from_INSSBuffer(iface); + ULONG refcount = InterlockedDecrement(&buffer->refcount); + + TRACE("%p decreasing refcount to %u.\n", buffer, refcount); + + if (!refcount) + free(buffer); + + return refcount; +} + +static HRESULT WINAPI buffer_GetLength(INSSBuffer *iface, DWORD *size) +{ + FIXME("iface %p, size %p, stub!\n", iface, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI buffer_SetLength(INSSBuffer *iface, DWORD size) +{ + struct buffer *buffer = impl_from_INSSBuffer(iface); + + TRACE("iface %p, size %u.\n", buffer, size); + + if (size > buffer->capacity) + return E_INVALIDARG; + + buffer->size = size; + return S_OK; +} + +static HRESULT WINAPI buffer_GetMaxLength(INSSBuffer *iface, DWORD *size) +{ + struct buffer *buffer = impl_from_INSSBuffer(iface); + + TRACE("buffer %p, size %p.\n", buffer, size); + + *size = buffer->capacity; + return S_OK; +} + +static HRESULT WINAPI buffer_GetBuffer(INSSBuffer *iface, BYTE **data) +{ + struct buffer *buffer = impl_from_INSSBuffer(iface); + + TRACE("buffer %p, data %p.\n", buffer, data); + + *data = buffer->data; + return S_OK; +} + +static HRESULT WINAPI buffer_GetBufferAndLength(INSSBuffer *iface, BYTE **data, DWORD *size) +{ + struct buffer *buffer = impl_from_INSSBuffer(iface); + + TRACE("buffer %p, data %p, size %p.\n", buffer, data, size); + + *size = buffer->size; + *data = buffer->data; + return S_OK; +} + +static const INSSBufferVtbl buffer_vtbl = +{ + buffer_QueryInterface, + buffer_AddRef, + buffer_Release, + buffer_GetLength, + buffer_SetLength, + buffer_GetMaxLength, + buffer_GetBuffer, + buffer_GetBufferAndLength, +}; + +struct stream_config +{ + IWMStreamConfig IWMStreamConfig_iface; + IWMMediaProps IWMMediaProps_iface; + LONG refcount; + + const struct wm_stream *stream; +}; + +static struct stream_config *impl_from_IWMStreamConfig(IWMStreamConfig *iface) +{ + return CONTAINING_RECORD(iface, struct stream_config, IWMStreamConfig_iface); +} + +static HRESULT WINAPI stream_config_QueryInterface(IWMStreamConfig *iface, REFIID iid, void **out) +{ + struct stream_config *config = impl_from_IWMStreamConfig(iface); + + TRACE("config %p, iid %s, out %p.\n", config, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IWMStreamConfig)) + *out = &config->IWMStreamConfig_iface; + else if (IsEqualGUID(iid, &IID_IWMMediaProps)) + *out = &config->IWMMediaProps_iface; + else + { + *out = NULL; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI stream_config_AddRef(IWMStreamConfig *iface) +{ + struct stream_config *config = impl_from_IWMStreamConfig(iface); + ULONG refcount = InterlockedIncrement(&config->refcount); + + TRACE("%p increasing refcount to %u.\n", config, refcount); + + return refcount; +} + +static ULONG WINAPI stream_config_Release(IWMStreamConfig *iface) +{ + struct stream_config *config = impl_from_IWMStreamConfig(iface); + ULONG refcount = InterlockedDecrement(&config->refcount); + + TRACE("%p decreasing refcount to %u.\n", config, refcount); + + if (!refcount) + { + IWMProfile3_Release(&config->stream->reader->IWMProfile3_iface); + free(config); + } + + return refcount; +} + +static HRESULT WINAPI stream_config_GetStreamType(IWMStreamConfig *iface, GUID *type) +{ + struct stream_config *config = impl_from_IWMStreamConfig(iface); + struct wm_reader *reader = config->stream->reader; + AM_MEDIA_TYPE mt; + + TRACE("config %p, type %p.\n", config, type); + + EnterCriticalSection(&reader->cs); + + if (!amt_from_wg_format(&mt, &config->stream->format, true)) + { + LeaveCriticalSection(&reader->cs); + return E_OUTOFMEMORY; + } + + *type = mt.majortype; + FreeMediaType(&mt); + + LeaveCriticalSection(&reader->cs); + + return S_OK; +} + +static HRESULT WINAPI stream_config_GetStreamNumber(IWMStreamConfig *iface, WORD *number) +{ + struct stream_config *config = impl_from_IWMStreamConfig(iface); + + TRACE("config %p, number %p.\n", config, number); + + *number = config->stream->index + 1; + return S_OK; +} + +static HRESULT WINAPI stream_config_SetStreamNumber(IWMStreamConfig *iface, WORD number) +{ + FIXME("iface %p, number %u, stub!\n", iface, number); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_GetStreamName(IWMStreamConfig *iface, WCHAR *name, WORD *len) +{ + FIXME("iface %p, name %p, len %p, stub!\n", iface, name, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_SetStreamName(IWMStreamConfig *iface, const WCHAR *name) +{ + FIXME("iface %p, name %s, stub!\n", iface, debugstr_w(name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_GetConnectionName(IWMStreamConfig *iface, WCHAR *name, WORD *len) +{ + FIXME("iface %p, name %p, len %p, stub!\n", iface, name, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_SetConnectionName(IWMStreamConfig *iface, const WCHAR *name) +{ + FIXME("iface %p, name %s, stub!\n", iface, debugstr_w(name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_GetBitrate(IWMStreamConfig *iface, DWORD *bitrate) +{ + FIXME("iface %p, bitrate %p, stub!\n", iface, bitrate); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_SetBitrate(IWMStreamConfig *iface, DWORD bitrate) +{ + FIXME("iface %p, bitrate %u, stub!\n", iface, bitrate); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_GetBufferWindow(IWMStreamConfig *iface, DWORD *window) +{ + FIXME("iface %p, window %p, stub!\n", iface, window); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_config_SetBufferWindow(IWMStreamConfig *iface, DWORD window) +{ + FIXME("iface %p, window %u, stub!\n", iface, window); + return E_NOTIMPL; +} + +static const IWMStreamConfigVtbl stream_config_vtbl = +{ + stream_config_QueryInterface, + stream_config_AddRef, + stream_config_Release, + stream_config_GetStreamType, + stream_config_GetStreamNumber, + stream_config_SetStreamNumber, + stream_config_GetStreamName, + stream_config_SetStreamName, + stream_config_GetConnectionName, + stream_config_SetConnectionName, + stream_config_GetBitrate, + stream_config_SetBitrate, + stream_config_GetBufferWindow, + stream_config_SetBufferWindow, +}; + +static struct stream_config *impl_from_IWMMediaProps(IWMMediaProps *iface) +{ + return CONTAINING_RECORD(iface, struct stream_config, IWMMediaProps_iface); +} + +static HRESULT WINAPI stream_props_QueryInterface(IWMMediaProps *iface, REFIID iid, void **out) +{ + struct stream_config *config = impl_from_IWMMediaProps(iface); + return IWMStreamConfig_QueryInterface(&config->IWMStreamConfig_iface, iid, out); +} + +static ULONG WINAPI stream_props_AddRef(IWMMediaProps *iface) +{ + struct stream_config *config = impl_from_IWMMediaProps(iface); + return IWMStreamConfig_AddRef(&config->IWMStreamConfig_iface); +} + +static ULONG WINAPI stream_props_Release(IWMMediaProps *iface) +{ + struct stream_config *config = impl_from_IWMMediaProps(iface); + return IWMStreamConfig_Release(&config->IWMStreamConfig_iface); +} + +static HRESULT WINAPI stream_props_GetType(IWMMediaProps *iface, GUID *major_type) +{ + FIXME("iface %p, major_type %p, stub!\n", iface, major_type); + return E_NOTIMPL; +} + +static HRESULT WINAPI stream_props_GetMediaType(IWMMediaProps *iface, WM_MEDIA_TYPE *mt, DWORD *size) +{ + struct stream_config *config = impl_from_IWMMediaProps(iface); + const DWORD req_size = *size; + AM_MEDIA_TYPE stream_mt; + + TRACE("iface %p, mt %p, size %p.\n", iface, mt, size); + + if (!amt_from_wg_format(&stream_mt, &config->stream->format, true)) + return E_OUTOFMEMORY; + + *size = sizeof(stream_mt) + stream_mt.cbFormat; + if (!mt) + return S_OK; + if (req_size < *size) + return ASF_E_BUFFERTOOSMALL; + + strmbase_dump_media_type(&stream_mt); + + memcpy(mt, &stream_mt, sizeof(*mt)); + memcpy(mt + 1, stream_mt.pbFormat, stream_mt.cbFormat); + mt->pbFormat = (BYTE *)(mt + 1); + return S_OK; +} + +static HRESULT WINAPI stream_props_SetMediaType(IWMMediaProps *iface, WM_MEDIA_TYPE *mt) +{ + FIXME("iface %p, mt %p, stub!\n", iface, mt); + return E_NOTIMPL; +} + +static const IWMMediaPropsVtbl stream_props_vtbl = +{ + stream_props_QueryInterface, + stream_props_AddRef, + stream_props_Release, + stream_props_GetType, + stream_props_GetMediaType, + stream_props_SetMediaType, +}; + +static DWORD CALLBACK read_thread(void *arg) +{ + struct wm_reader *reader = arg; + IStream *stream = reader->source_stream; + HANDLE file = reader->file; + size_t buffer_size = 4096; + uint64_t file_size; + void *data; + + if (!(data = malloc(buffer_size))) + return 0; + + if (file) + { + LARGE_INTEGER size; + + GetFileSizeEx(file, &size); + file_size = size.QuadPart; + } + else + { + STATSTG stat; + + IStream_Stat(stream, &stat, STATFLAG_NONAME); + file_size = stat.cbSize.QuadPart; + } + + TRACE("Starting read thread for reader %p.\n", reader); + + while (!reader->read_thread_shutdown) + { + LARGE_INTEGER large_offset; + uint64_t offset; + ULONG ret_size; + uint32_t size; + HRESULT hr; + + if (!wg_parser_get_next_read_offset(reader->wg_parser, &offset, &size)) + continue; + + if (offset >= file_size) + size = 0; + else if (offset + size >= file_size) + size = file_size - offset; + + if (!size) + { + wg_parser_push_data(reader->wg_parser, WG_READ_SUCCESS, data, 0); + continue; + } + + if (!array_reserve(&data, &buffer_size, size, 1)) + { + free(data); + return 0; + } + + ret_size = 0; + + large_offset.QuadPart = offset; + if (file) + { + if (!SetFilePointerEx(file, large_offset, NULL, FILE_BEGIN) + || !ReadFile(file, data, size, &ret_size, NULL)) + { + ERR("Failed to read %u bytes at offset %I64u, error %u.\n", size, offset, GetLastError()); + wg_parser_push_data(reader->wg_parser, WG_READ_FAILURE, NULL, 0); + continue; + } + } + else + { + if (SUCCEEDED(hr = IStream_Seek(stream, large_offset, STREAM_SEEK_SET, NULL))) + hr = IStream_Read(stream, data, size, &ret_size); + if (FAILED(hr)) + { + ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); + wg_parser_push_data(reader->wg_parser, WG_READ_FAILURE, NULL, 0); + continue; + } + } + + if (ret_size != size) + ERR("Unexpected short read: requested %u bytes, got %u.\n", size, ret_size); + wg_parser_push_data(reader->wg_parser, WG_READ_SUCCESS, data, ret_size); + } + + free(data); + TRACE("Reader is shutting down; exiting.\n"); + return 0; +} + +static struct wm_reader *impl_from_IWMProfile3(IWMProfile3 *iface) +{ + return CONTAINING_RECORD(iface, struct wm_reader, IWMProfile3_iface); +} + +static HRESULT WINAPI profile_QueryInterface(IWMProfile3 *iface, REFIID iid, void **out) +{ + struct wm_reader *reader = impl_from_IWMProfile3(iface); + + TRACE("reader %p, iid %s, out %p.\n", reader, debugstr_guid(iid), out); + + if (IsEqualIID(iid, &IID_IWMHeaderInfo) + || IsEqualIID(iid, &IID_IWMHeaderInfo2) + || IsEqualIID(iid, &IID_IWMHeaderInfo3)) + { + *out = &reader->IWMHeaderInfo3_iface; + } + else if (IsEqualIID(iid, &IID_IWMLanguageList)) + { + *out = &reader->IWMLanguageList_iface; + } + else if (IsEqualIID(iid, &IID_IWMPacketSize) + || IsEqualIID(iid, &IID_IWMPacketSize2)) + { + *out = &reader->IWMPacketSize2_iface; + } + else if (IsEqualIID(iid, &IID_IUnknown) + || IsEqualIID(iid, &IID_IWMProfile) + || IsEqualIID(iid, &IID_IWMProfile2) + || IsEqualIID(iid, &IID_IWMProfile3)) + { + *out = &reader->IWMProfile3_iface; + } + else if (IsEqualIID(iid, &IID_IWMReaderPlaylistBurn)) + { + *out = &reader->IWMReaderPlaylistBurn_iface; + } + else if (IsEqualIID(iid, &IID_IWMReaderTimecode)) + { + *out = &reader->IWMReaderTimecode_iface; + } + else if (!(*out = reader->ops->query_interface(reader, iid))) + { + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI profile_AddRef(IWMProfile3 *iface) +{ + struct wm_reader *reader = impl_from_IWMProfile3(iface); + ULONG refcount = InterlockedIncrement(&reader->refcount); + + TRACE("%p increasing refcount to %u.\n", reader, refcount); + + return refcount; +} + +static ULONG WINAPI profile_Release(IWMProfile3 *iface) +{ + struct wm_reader *reader = impl_from_IWMProfile3(iface); + ULONG refcount = InterlockedDecrement(&reader->refcount); + + TRACE("%p decreasing refcount to %u.\n", reader, refcount); + + if (!refcount) + reader->ops->destroy(reader); + + return refcount; +} + +static HRESULT WINAPI profile_GetVersion(IWMProfile3 *iface, WMT_VERSION *version) +{ + FIXME("iface %p, version %p, stub!\n", iface, version); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetName(IWMProfile3 *iface, WCHAR *name, DWORD *length) +{ + FIXME("iface %p, name %p, length %p, stub!\n", iface, name, length); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_SetName(IWMProfile3 *iface, const WCHAR *name) +{ + FIXME("iface %p, name %s, stub!\n", iface, debugstr_w(name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetDescription(IWMProfile3 *iface, WCHAR *description, DWORD *length) +{ + FIXME("iface %p, description %p, length %p, stub!\n", iface, description, length); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_SetDescription(IWMProfile3 *iface, const WCHAR *description) +{ + FIXME("iface %p, description %s, stub!\n", iface, debugstr_w(description)); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetStreamCount(IWMProfile3 *iface, DWORD *count) +{ + struct wm_reader *reader = impl_from_IWMProfile3(iface); + + TRACE("reader %p, count %p.\n", reader, count); + + if (!count) + return E_INVALIDARG; + + EnterCriticalSection(&reader->cs); + *count = reader->stream_count; + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +static HRESULT WINAPI profile_GetStream(IWMProfile3 *iface, DWORD index, IWMStreamConfig **config) +{ + struct wm_reader *reader = impl_from_IWMProfile3(iface); + struct stream_config *object; + + TRACE("reader %p, index %u, config %p.\n", reader, index, config); + + EnterCriticalSection(&reader->cs); + + if (index >= reader->stream_count) + { + LeaveCriticalSection(&reader->cs); + WARN("Index %u exceeds stream count %u; returning E_INVALIDARG.\n", index, reader->stream_count); + return E_INVALIDARG; + } + + if (!(object = calloc(1, sizeof(*object)))) + { + LeaveCriticalSection(&reader->cs); + return E_OUTOFMEMORY; + } + + object->IWMStreamConfig_iface.lpVtbl = &stream_config_vtbl; + object->IWMMediaProps_iface.lpVtbl = &stream_props_vtbl; + object->refcount = 1; + object->stream = &reader->streams[index]; + IWMProfile3_AddRef(&reader->IWMProfile3_iface); + + LeaveCriticalSection(&reader->cs); + + TRACE("Created stream config %p.\n", object); + *config = &object->IWMStreamConfig_iface; + return S_OK; +} + +static HRESULT WINAPI profile_GetStreamByNumber(IWMProfile3 *iface, WORD stream_number, IWMStreamConfig **config) +{ + FIXME("iface %p, stream_number %u, config %p, stub!\n", iface, stream_number, config); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_RemoveStream(IWMProfile3 *iface, IWMStreamConfig *config) +{ + FIXME("iface %p, config %p, stub!\n", iface, config); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_RemoveStreamByNumber(IWMProfile3 *iface, WORD stream_number) +{ + FIXME("iface %p, stream_number %u, stub!\n", iface, stream_number); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_AddStream(IWMProfile3 *iface, IWMStreamConfig *config) +{ + FIXME("iface %p, config %p, stub!\n", iface, config); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_ReconfigStream(IWMProfile3 *iface, IWMStreamConfig *config) +{ + FIXME("iface %p, config %p, stub!\n", iface, config); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_CreateNewStream(IWMProfile3 *iface, REFGUID type, IWMStreamConfig **config) +{ + FIXME("iface %p, type %s, config %p, stub!\n", iface, debugstr_guid(type), config); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetMutualExclusionCount(IWMProfile3 *iface, DWORD *count) +{ + FIXME("iface %p, count %p, stub!\n", iface, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetMutualExclusion(IWMProfile3 *iface, DWORD index, IWMMutualExclusion **excl) +{ + FIXME("iface %p, index %u, excl %p, stub!\n", iface, index, excl); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_RemoveMutualExclusion(IWMProfile3 *iface, IWMMutualExclusion *excl) +{ + FIXME("iface %p, excl %p, stub!\n", iface, excl); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_AddMutualExclusion(IWMProfile3 *iface, IWMMutualExclusion *excl) +{ + FIXME("iface %p, excl %p, stub!\n", iface, excl); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_CreateNewMutualExclusion(IWMProfile3 *iface, IWMMutualExclusion **excl) +{ + FIXME("iface %p, excl %p, stub!\n", iface, excl); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetProfileID(IWMProfile3 *iface, GUID *id) +{ + FIXME("iface %p, id %p, stub!\n", iface, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetStorageFormat(IWMProfile3 *iface, WMT_STORAGE_FORMAT *format) +{ + FIXME("iface %p, format %p, stub!\n", iface, format); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_SetStorageFormat(IWMProfile3 *iface, WMT_STORAGE_FORMAT format) +{ + FIXME("iface %p, format %#x, stub!\n", iface, format); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetBandwidthSharingCount(IWMProfile3 *iface, DWORD *count) +{ + FIXME("iface %p, count %p, stub!\n", iface, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetBandwidthSharing(IWMProfile3 *iface, DWORD index, IWMBandwidthSharing **sharing) +{ + FIXME("iface %p, index %d, sharing %p, stub!\n", iface, index, sharing); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_RemoveBandwidthSharing( IWMProfile3 *iface, IWMBandwidthSharing *sharing) +{ + FIXME("iface %p, sharing %p, stub!\n", iface, sharing); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_AddBandwidthSharing(IWMProfile3 *iface, IWMBandwidthSharing *sharing) +{ + FIXME("iface %p, sharing %p, stub!\n", iface, sharing); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_CreateNewBandwidthSharing( IWMProfile3 *iface, IWMBandwidthSharing **sharing) +{ + FIXME("iface %p, sharing %p, stub!\n", iface, sharing); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetStreamPrioritization(IWMProfile3 *iface, IWMStreamPrioritization **stream) +{ + FIXME("iface %p, stream %p, stub!\n", iface, stream); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_SetStreamPrioritization(IWMProfile3 *iface, IWMStreamPrioritization *stream) +{ + FIXME("iface %p, stream %p, stub!\n", iface, stream); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_RemoveStreamPrioritization(IWMProfile3 *iface) +{ + FIXME("iface %p, stub!\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_CreateNewStreamPrioritization(IWMProfile3 *iface, IWMStreamPrioritization **stream) +{ + FIXME("iface %p, stream %p, stub!\n", iface, stream); + return E_NOTIMPL; +} + +static HRESULT WINAPI profile_GetExpectedPacketCount(IWMProfile3 *iface, QWORD duration, QWORD *count) +{ + FIXME("iface %p, duration %s, count %p, stub!\n", iface, debugstr_time(duration), count); + return E_NOTIMPL; +} + +static const IWMProfile3Vtbl profile_vtbl = +{ + profile_QueryInterface, + profile_AddRef, + profile_Release, + profile_GetVersion, + profile_GetName, + profile_SetName, + profile_GetDescription, + profile_SetDescription, + profile_GetStreamCount, + profile_GetStream, + profile_GetStreamByNumber, + profile_RemoveStream, + profile_RemoveStreamByNumber, + profile_AddStream, + profile_ReconfigStream, + profile_CreateNewStream, + profile_GetMutualExclusionCount, + profile_GetMutualExclusion, + profile_RemoveMutualExclusion, + profile_AddMutualExclusion, + profile_CreateNewMutualExclusion, + profile_GetProfileID, + profile_GetStorageFormat, + profile_SetStorageFormat, + profile_GetBandwidthSharingCount, + profile_GetBandwidthSharing, + profile_RemoveBandwidthSharing, + profile_AddBandwidthSharing, + profile_CreateNewBandwidthSharing, + profile_GetStreamPrioritization, + profile_SetStreamPrioritization, + profile_RemoveStreamPrioritization, + profile_CreateNewStreamPrioritization, + profile_GetExpectedPacketCount, +}; + +static struct wm_reader *impl_from_IWMHeaderInfo3(IWMHeaderInfo3 *iface) +{ + return CONTAINING_RECORD(iface, struct wm_reader, IWMHeaderInfo3_iface); +} + +static HRESULT WINAPI header_info_QueryInterface(IWMHeaderInfo3 *iface, REFIID iid, void **out) +{ + struct wm_reader *reader = impl_from_IWMHeaderInfo3(iface); + + return IWMProfile3_QueryInterface(&reader->IWMProfile3_iface, iid, out); +} + +static ULONG WINAPI header_info_AddRef(IWMHeaderInfo3 *iface) +{ + struct wm_reader *reader = impl_from_IWMHeaderInfo3(iface); + + return IWMProfile3_AddRef(&reader->IWMProfile3_iface); +} + +static ULONG WINAPI header_info_Release(IWMHeaderInfo3 *iface) +{ + struct wm_reader *reader = impl_from_IWMHeaderInfo3(iface); + + return IWMProfile3_Release(&reader->IWMProfile3_iface); +} + +static HRESULT WINAPI header_info_GetAttributeCount(IWMHeaderInfo3 *iface, WORD stream_number, WORD *count) +{ + FIXME("iface %p, stream_number %u, count %p, stub!\n", iface, stream_number, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetAttributeByIndex(IWMHeaderInfo3 *iface, WORD index, WORD *stream_number, + WCHAR *name, WORD *name_len, WMT_ATTR_DATATYPE *type, BYTE *value, WORD *size) +{ + FIXME("iface %p, index %u, stream_number %p, name %p, name_len %p, type %p, value %p, size %p, stub!\n", + iface, index, stream_number, name, name_len, type, value, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetAttributeByName(IWMHeaderInfo3 *iface, WORD *stream_number, + const WCHAR *name, WMT_ATTR_DATATYPE *type, BYTE *value, WORD *size) +{ + struct wm_reader *reader = impl_from_IWMHeaderInfo3(iface); + const WORD req_size = *size; + + TRACE("reader %p, stream_number %p, name %s, type %p, value %p, size %u.\n", + reader, stream_number, debugstr_w(name), type, value, *size); + + if (!stream_number) + return E_INVALIDARG; + + if (!wcscmp(name, L"Duration")) + { + QWORD duration; + + if (*stream_number) + { + WARN("Requesting duration for stream %u, returning ASF_E_NOTFOUND.\n", *stream_number); + return ASF_E_NOTFOUND; + } + + *size = sizeof(QWORD); + if (!value) + { + *type = WMT_TYPE_QWORD; + return S_OK; + } + if (req_size < *size) + return ASF_E_BUFFERTOOSMALL; + + *type = WMT_TYPE_QWORD; + EnterCriticalSection(&reader->cs); + duration = wg_parser_stream_get_duration(wg_parser_get_stream(reader->wg_parser, 0)); + LeaveCriticalSection(&reader->cs); + TRACE("Returning duration %s.\n", debugstr_time(duration)); + memcpy(value, &duration, sizeof(QWORD)); + return S_OK; + } + else if (!wcscmp(name, L"Seekable")) + { + if (*stream_number) + { + WARN("Requesting duration for stream %u, returning ASF_E_NOTFOUND.\n", *stream_number); + return ASF_E_NOTFOUND; + } + + *size = sizeof(BOOL); + if (!value) + { + *type = WMT_TYPE_BOOL; + return S_OK; + } + if (req_size < *size) + return ASF_E_BUFFERTOOSMALL; + + *type = WMT_TYPE_BOOL; + *(BOOL *)value = TRUE; + return S_OK; + } + else + { + FIXME("Unknown attribute %s.\n", debugstr_w(name)); + return ASF_E_NOTFOUND; + } +} + +static HRESULT WINAPI header_info_SetAttribute(IWMHeaderInfo3 *iface, WORD stream_number, + const WCHAR *name, WMT_ATTR_DATATYPE type, const BYTE *value, WORD size) +{ + FIXME("iface %p, stream_number %u, name %s, type %#x, value %p, size %u, stub!\n", + iface, stream_number, debugstr_w(name), type, value, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetMarkerCount(IWMHeaderInfo3 *iface, WORD *count) +{ + FIXME("iface %p, count %p, stub!\n", iface, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetMarker(IWMHeaderInfo3 *iface, + WORD index, WCHAR *name, WORD *len, QWORD *time) +{ + FIXME("iface %p, index %u, name %p, len %p, time %p, stub!\n", iface, index, name, len, time); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_AddMarker(IWMHeaderInfo3 *iface, const WCHAR *name, QWORD time) +{ + FIXME("iface %p, name %s, time %s, stub!\n", iface, debugstr_w(name), debugstr_time(time)); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_RemoveMarker(IWMHeaderInfo3 *iface, WORD index) +{ + FIXME("iface %p, index %u, stub!\n", iface, index); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetScriptCount(IWMHeaderInfo3 *iface, WORD *count) +{ + FIXME("iface %p, count %p, stub!\n", iface, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetScript(IWMHeaderInfo3 *iface, WORD index, WCHAR *type, + WORD *type_len, WCHAR *command, WORD *command_len, QWORD *time) +{ + FIXME("iface %p, index %u, type %p, type_len %p, command %p, command_len %p, time %p, stub!\n", + iface, index, type, type_len, command, command_len, time); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_AddScript(IWMHeaderInfo3 *iface, + const WCHAR *type, const WCHAR *command, QWORD time) +{ + FIXME("iface %p, type %s, command %s, time %s, stub!\n", + iface, debugstr_w(type), debugstr_w(command), debugstr_time(time)); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_RemoveScript(IWMHeaderInfo3 *iface, WORD index) +{ + FIXME("iface %p, index %u, stub!\n", iface, index); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetCodecInfoCount(IWMHeaderInfo3 *iface, DWORD *count) +{ + FIXME("iface %p, count %p, stub!\n", iface, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetCodecInfo(IWMHeaderInfo3 *iface, DWORD index, WORD *name_len, + WCHAR *name, WORD *desc_len, WCHAR *desc, WMT_CODEC_INFO_TYPE *type, WORD *size, BYTE *info) +{ + FIXME("iface %p, index %u, name_len %p, name %p, desc_len %p, desc %p, type %p, size %p, info %p, stub!\n", + iface, index, name_len, name, desc_len, desc, type, size, info); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetAttributeCountEx(IWMHeaderInfo3 *iface, WORD stream_number, WORD *count) +{ + FIXME("iface %p, stream_number %u, count %p, stub!\n", iface, stream_number, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetAttributeIndices(IWMHeaderInfo3 *iface, WORD stream_number, + const WCHAR *name, WORD *lang_index, WORD *indices, WORD *count) +{ + FIXME("iface %p, stream_number %u, name %s, lang_index %p, indices %p, count %p, stub!\n", + iface, stream_number, debugstr_w(name), lang_index, indices, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_GetAttributeByIndexEx(IWMHeaderInfo3 *iface, + WORD stream_number, WORD index, WCHAR *name, WORD *name_len, + WMT_ATTR_DATATYPE *type, WORD *lang_index, BYTE *value, DWORD *size) +{ + FIXME("iface %p, stream_number %u, index %u, name %p, name_len %p," + " type %p, lang_index %p, value %p, size %p, stub!\n", + iface, stream_number, index, name, name_len, type, lang_index, value, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_ModifyAttribute(IWMHeaderInfo3 *iface, WORD stream_number, + WORD index, WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD size) +{ + FIXME("iface %p, stream_number %u, index %u, type %#x, lang_index %u, value %p, size %u, stub!\n", + iface, stream_number, index, type, lang_index, value, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_AddAttribute(IWMHeaderInfo3 *iface, + WORD stream_number, const WCHAR *name, WORD *index, + WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD size) +{ + FIXME("iface %p, stream_number %u, name %s, index %p, type %#x, lang_index %u, value %p, size %u, stub!\n", + iface, stream_number, debugstr_w(name), index, type, lang_index, value, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_DeleteAttribute(IWMHeaderInfo3 *iface, WORD stream_number, WORD index) +{ + FIXME("iface %p, stream_number %u, index %u, stub!\n", iface, stream_number, index); + return E_NOTIMPL; +} + +static HRESULT WINAPI header_info_AddCodecInfo(IWMHeaderInfo3 *iface, const WCHAR *name, + const WCHAR *desc, WMT_CODEC_INFO_TYPE type, WORD size, BYTE *info) +{ + FIXME("iface %p, name %s, desc %s, type %#x, size %u, info %p, stub!\n", + info, debugstr_w(name), debugstr_w(desc), type, size, info); + return E_NOTIMPL; +} + +static const IWMHeaderInfo3Vtbl header_info_vtbl = +{ + header_info_QueryInterface, + header_info_AddRef, + header_info_Release, + header_info_GetAttributeCount, + header_info_GetAttributeByIndex, + header_info_GetAttributeByName, + header_info_SetAttribute, + header_info_GetMarkerCount, + header_info_GetMarker, + header_info_AddMarker, + header_info_RemoveMarker, + header_info_GetScriptCount, + header_info_GetScript, + header_info_AddScript, + header_info_RemoveScript, + header_info_GetCodecInfoCount, + header_info_GetCodecInfo, + header_info_GetAttributeCountEx, + header_info_GetAttributeIndices, + header_info_GetAttributeByIndexEx, + header_info_ModifyAttribute, + header_info_AddAttribute, + header_info_DeleteAttribute, + header_info_AddCodecInfo, +}; + +static struct wm_reader *impl_from_IWMLanguageList(IWMLanguageList *iface) +{ + return CONTAINING_RECORD(iface, struct wm_reader, IWMLanguageList_iface); +} + +static HRESULT WINAPI language_list_QueryInterface(IWMLanguageList *iface, REFIID iid, void **out) +{ + struct wm_reader *reader = impl_from_IWMLanguageList(iface); + + return IWMProfile3_QueryInterface(&reader->IWMProfile3_iface, iid, out); +} + +static ULONG WINAPI language_list_AddRef(IWMLanguageList *iface) +{ + struct wm_reader *reader = impl_from_IWMLanguageList(iface); + + return IWMProfile3_AddRef(&reader->IWMProfile3_iface); +} + +static ULONG WINAPI language_list_Release(IWMLanguageList *iface) +{ + struct wm_reader *reader = impl_from_IWMLanguageList(iface); + + return IWMProfile3_Release(&reader->IWMProfile3_iface); +} + +static HRESULT WINAPI language_list_GetLanguageCount(IWMLanguageList *iface, WORD *count) +{ + FIXME("iface %p, count %p, stub!\n", iface, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI language_list_GetLanguageDetails(IWMLanguageList *iface, + WORD index, WCHAR *lang, WORD *len) +{ + FIXME("iface %p, index %u, lang %p, len %p, stub!\n", iface, index, lang, len); + return E_NOTIMPL; +} + +static HRESULT WINAPI language_list_AddLanguageByRFC1766String(IWMLanguageList *iface, + const WCHAR *lang, WORD *index) +{ + FIXME("iface %p, lang %s, index %p, stub!\n", iface, debugstr_w(lang), index); + return E_NOTIMPL; +} + +static const IWMLanguageListVtbl language_list_vtbl = +{ + language_list_QueryInterface, + language_list_AddRef, + language_list_Release, + language_list_GetLanguageCount, + language_list_GetLanguageDetails, + language_list_AddLanguageByRFC1766String, +}; + +static struct wm_reader *impl_from_IWMPacketSize2(IWMPacketSize2 *iface) +{ + return CONTAINING_RECORD(iface, struct wm_reader, IWMPacketSize2_iface); +} + +static HRESULT WINAPI packet_size_QueryInterface(IWMPacketSize2 *iface, REFIID iid, void **out) +{ + struct wm_reader *reader = impl_from_IWMPacketSize2(iface); + + return IWMProfile3_QueryInterface(&reader->IWMProfile3_iface, iid, out); +} + +static ULONG WINAPI packet_size_AddRef(IWMPacketSize2 *iface) +{ + struct wm_reader *reader = impl_from_IWMPacketSize2(iface); + + return IWMProfile3_AddRef(&reader->IWMProfile3_iface); +} + +static ULONG WINAPI packet_size_Release(IWMPacketSize2 *iface) +{ + struct wm_reader *reader = impl_from_IWMPacketSize2(iface); + + return IWMProfile3_Release(&reader->IWMProfile3_iface); +} + +static HRESULT WINAPI packet_size_GetMaxPacketSize(IWMPacketSize2 *iface, DWORD *size) +{ + FIXME("iface %p, size %p, stub!\n", iface, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI packet_size_SetMaxPacketSize(IWMPacketSize2 *iface, DWORD size) +{ + FIXME("iface %p, size %u, stub!\n", iface, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI packet_size_GetMinPacketSize(IWMPacketSize2 *iface, DWORD *size) +{ + FIXME("iface %p, size %p, stub!\n", iface, size); + return E_NOTIMPL; +} + +static HRESULT WINAPI packet_size_SetMinPacketSize(IWMPacketSize2 *iface, DWORD size) +{ + FIXME("iface %p, size %u, stub!\n", iface, size); + return E_NOTIMPL; +} + +static const IWMPacketSize2Vtbl packet_size_vtbl = +{ + packet_size_QueryInterface, + packet_size_AddRef, + packet_size_Release, + packet_size_GetMaxPacketSize, + packet_size_SetMaxPacketSize, + packet_size_GetMinPacketSize, + packet_size_SetMinPacketSize, +}; + +static struct wm_reader *impl_from_IWMReaderPlaylistBurn(IWMReaderPlaylistBurn *iface) +{ + return CONTAINING_RECORD(iface, struct wm_reader, IWMReaderPlaylistBurn_iface); +} + +static HRESULT WINAPI playlist_QueryInterface(IWMReaderPlaylistBurn *iface, REFIID iid, void **out) +{ + struct wm_reader *reader = impl_from_IWMReaderPlaylistBurn(iface); + + return IWMProfile3_QueryInterface(&reader->IWMProfile3_iface, iid, out); +} + +static ULONG WINAPI playlist_AddRef(IWMReaderPlaylistBurn *iface) +{ + struct wm_reader *reader = impl_from_IWMReaderPlaylistBurn(iface); + + return IWMProfile3_AddRef(&reader->IWMProfile3_iface); +} + +static ULONG WINAPI playlist_Release(IWMReaderPlaylistBurn *iface) +{ + struct wm_reader *reader = impl_from_IWMReaderPlaylistBurn(iface); + + return IWMProfile3_Release(&reader->IWMProfile3_iface); +} + +static HRESULT WINAPI playlist_InitPlaylistBurn(IWMReaderPlaylistBurn *iface, DWORD count, + const WCHAR **filenames, IWMStatusCallback *callback, void *context) +{ + FIXME("iface %p, count %u, filenames %p, callback %p, context %p, stub!\n", + iface, count, filenames, callback, context); + return E_NOTIMPL; +} + +static HRESULT WINAPI playlist_GetInitResults(IWMReaderPlaylistBurn *iface, DWORD count, HRESULT *hrs) +{ + FIXME("iface %p, count %u, hrs %p, stub!\n", iface, count, hrs); + return E_NOTIMPL; +} + +static HRESULT WINAPI playlist_Cancel(IWMReaderPlaylistBurn *iface) +{ + FIXME("iface %p, stub!\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI playlist_EndPlaylistBurn(IWMReaderPlaylistBurn *iface, HRESULT hr) +{ + FIXME("iface %p, hr %#x, stub!\n", iface, hr); + return E_NOTIMPL; +} + +static const IWMReaderPlaylistBurnVtbl playlist_vtbl = +{ + playlist_QueryInterface, + playlist_AddRef, + playlist_Release, + playlist_InitPlaylistBurn, + playlist_GetInitResults, + playlist_Cancel, + playlist_EndPlaylistBurn, +}; + +static struct wm_reader *impl_from_IWMReaderTimecode(IWMReaderTimecode *iface) +{ + return CONTAINING_RECORD(iface, struct wm_reader, IWMReaderTimecode_iface); +} + +static HRESULT WINAPI timecode_QueryInterface(IWMReaderTimecode *iface, REFIID iid, void **out) +{ + struct wm_reader *reader = impl_from_IWMReaderTimecode(iface); + + return IWMProfile3_QueryInterface(&reader->IWMProfile3_iface, iid, out); +} + +static ULONG WINAPI timecode_AddRef(IWMReaderTimecode *iface) +{ + struct wm_reader *reader = impl_from_IWMReaderTimecode(iface); + + return IWMProfile3_AddRef(&reader->IWMProfile3_iface); +} + +static ULONG WINAPI timecode_Release(IWMReaderTimecode *iface) +{ + struct wm_reader *reader = impl_from_IWMReaderTimecode(iface); + + return IWMProfile3_Release(&reader->IWMProfile3_iface); +} + +static HRESULT WINAPI timecode_GetTimecodeRangeCount(IWMReaderTimecode *iface, + WORD stream_number, WORD *count) +{ + FIXME("iface %p, stream_number %u, count %p, stub!\n", iface, stream_number, count); + return E_NOTIMPL; +} + +static HRESULT WINAPI timecode_GetTimecodeRangeBounds(IWMReaderTimecode *iface, + WORD stream_number, WORD index, DWORD *start, DWORD *end) +{ + FIXME("iface %p, stream_number %u, index %u, start %p, end %p, stub!\n", + iface, stream_number, index, start, end); + return E_NOTIMPL; +} + +static const IWMReaderTimecodeVtbl timecode_vtbl = +{ + timecode_QueryInterface, + timecode_AddRef, + timecode_Release, + timecode_GetTimecodeRangeCount, + timecode_GetTimecodeRangeBounds, +}; + +static HRESULT init_stream(struct wm_reader *reader, QWORD file_size) +{ + struct wg_parser *wg_parser; + HRESULT hr; + WORD i; + + if (!(wg_parser = wg_parser_create(WG_PARSER_DECODEBIN, true))) + return E_OUTOFMEMORY; + + reader->wg_parser = wg_parser; + reader->read_thread_shutdown = false; + if (!(reader->read_thread = CreateThread(NULL, 0, read_thread, reader, 0, NULL))) + { + hr = E_OUTOFMEMORY; + goto out_destroy_parser; + } + + if (FAILED(hr = wg_parser_connect(reader->wg_parser, file_size))) + { + ERR("Failed to connect parser, hr %#x.\n", hr); + goto out_shutdown_thread; + } + + reader->stream_count = wg_parser_get_stream_count(reader->wg_parser); + + if (!(reader->streams = calloc(reader->stream_count, sizeof(*reader->streams)))) + { + hr = E_OUTOFMEMORY; + goto out_disconnect_parser; + } + + for (i = 0; i < reader->stream_count; ++i) + { + struct wm_stream *stream = &reader->streams[i]; + + stream->wg_stream = wg_parser_get_stream(reader->wg_parser, reader->stream_count - i - 1); + stream->reader = reader; + stream->index = i; + stream->selection = WMT_ON; + wg_parser_stream_get_preferred_format(stream->wg_stream, &stream->format); + if (stream->format.major_type == WG_MAJOR_TYPE_AUDIO) + { + /* R.U.S.E enumerates available audio types, picks the first one it + * likes, and then sets the wrong stream to that type. libav might + * give us WG_AUDIO_FORMAT_F32LE by default, which will result in + * the game incorrectly interpreting float data as integer. + * Therefore just match native and always set our default format to + * S16LE. */ + stream->format.u.audio.format = WG_AUDIO_FORMAT_S16LE; + } + else if (stream->format.major_type == WG_MAJOR_TYPE_VIDEO) + { + /* Call of Juarez: Bound in Blood breaks if I420 is enumerated. + * Some native decoders output I420, but the msmpeg4v3 decoder + * never does. + * + * Shadowgrounds provides wmv3 video and assumes that the initial + * video type will be BGR. */ + stream->format.u.video.format = WG_VIDEO_FORMAT_BGR; + { + /* HACK: Persona 4 Golden tries to read compressed samples, and + * then autoplug them via quartz to a filter that only accepts + * BGRx. This is not trivial to implement. Return BGRx from the + * wmvcore reader for now. */ + + const char *id = getenv("SteamGameId"); + + if (id && !strcmp(id, "1113000")) + stream->format.u.video.format = WG_VIDEO_FORMAT_BGRx; + } + } + wg_parser_stream_enable(stream->wg_stream, &stream->format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); + } + + /* We probably discarded events because streams weren't enabled yet. + * Now that they're all enabled seek back to the start again. */ + wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, 0, 0, + AM_SEEKING_AbsolutePositioning, AM_SEEKING_NoPositioning); + + return S_OK; + +out_disconnect_parser: + wg_parser_disconnect(reader->wg_parser); + +out_shutdown_thread: + reader->read_thread_shutdown = true; + WaitForSingleObject(reader->read_thread, INFINITE); + CloseHandle(reader->read_thread); + reader->read_thread = NULL; + +out_destroy_parser: + wg_parser_destroy(reader->wg_parser); + reader->wg_parser = NULL; + + return hr; +} + +HRESULT wm_reader_open_stream(struct wm_reader *reader, IStream *stream) +{ + STATSTG stat; + HRESULT hr; + + if (FAILED(hr = IStream_Stat(stream, &stat, STATFLAG_NONAME))) + { + ERR("Failed to stat stream, hr %#x.\n", hr); + return hr; + } + + EnterCriticalSection(&reader->cs); + + IStream_AddRef(reader->source_stream = stream); + if (FAILED(hr = init_stream(reader, stat.cbSize.QuadPart))) + { + IStream_Release(stream); + reader->source_stream = NULL; + } + + LeaveCriticalSection(&reader->cs); + return hr; +} + +HRESULT wm_reader_open_file(struct wm_reader *reader, const WCHAR *filename) +{ + LARGE_INTEGER size; + HANDLE file; + HRESULT hr; + + if ((file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) + { + ERR("Failed to open %s, error %u.\n", debugstr_w(filename), GetLastError()); + return HRESULT_FROM_WIN32(GetLastError()); + } + + if (!GetFileSizeEx(file, &size)) + { + ERR("Failed to get the size of %s, error %u.\n", debugstr_w(filename), GetLastError()); + CloseHandle(file); + return HRESULT_FROM_WIN32(GetLastError()); + } + + EnterCriticalSection(&reader->cs); + + reader->file = file; + + if (FAILED(hr = init_stream(reader, size.QuadPart))) + reader->file = NULL; + + LeaveCriticalSection(&reader->cs); + return hr; +} + +HRESULT wm_reader_close(struct wm_reader *reader) +{ + EnterCriticalSection(&reader->cs); + + if (!reader->wg_parser) + { + LeaveCriticalSection(&reader->cs); + return NS_E_INVALID_REQUEST; + } + + wg_parser_disconnect(reader->wg_parser); + + reader->read_thread_shutdown = true; + WaitForSingleObject(reader->read_thread, INFINITE); + CloseHandle(reader->read_thread); + reader->read_thread = NULL; + + if (reader->callback_advanced) + IWMReaderCallbackAdvanced_Release(reader->callback_advanced); + reader->callback_advanced = NULL; + + wg_parser_destroy(reader->wg_parser); + reader->wg_parser = NULL; + + if (reader->source_stream) + IStream_Release(reader->source_stream); + reader->source_stream = NULL; + if (reader->file) + CloseHandle(reader->file); + reader->file = NULL; + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +struct wm_stream *wm_reader_get_stream_by_stream_number(struct wm_reader *reader, WORD stream_number) +{ + if (stream_number && stream_number <= reader->stream_count) + return &reader->streams[stream_number - 1]; + WARN("Invalid stream number %u.\n", stream_number); + return NULL; +} + +HRESULT wm_reader_get_output_props(struct wm_reader *reader, DWORD output, IWMOutputMediaProps **props) +{ + struct wm_stream *stream; + + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + *props = output_props_create(&stream->format); + LeaveCriticalSection(&reader->cs); + return *props ? S_OK : E_OUTOFMEMORY; +} + +static const enum wg_video_format video_formats[] = +{ + /* Try to prefer YUV formats over RGB ones. Most decoders output in the + * YUV color space, and it's generally much less expensive for + * videoconvert to do YUV -> YUV transformations. */ + WG_VIDEO_FORMAT_NV12, + WG_VIDEO_FORMAT_YV12, + WG_VIDEO_FORMAT_YUY2, + WG_VIDEO_FORMAT_UYVY, + WG_VIDEO_FORMAT_YVYU, + WG_VIDEO_FORMAT_BGRx, + WG_VIDEO_FORMAT_BGR, + WG_VIDEO_FORMAT_RGB16, + WG_VIDEO_FORMAT_RGB15, +}; + +HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output, DWORD *count) +{ + struct wm_stream *stream; + struct wg_format format; + + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + switch (format.major_type) + { + case WG_MAJOR_TYPE_VIDEO: + *count = ARRAY_SIZE(video_formats); + break; + + case WG_MAJOR_TYPE_AUDIO: + case WG_MAJOR_TYPE_UNKNOWN: + *count = 1; + break; + } + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, + DWORD index, IWMOutputMediaProps **props) +{ + struct wm_stream *stream; + struct wg_format format; + + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + wg_parser_stream_get_preferred_format(stream->wg_stream, &format); + + switch (format.major_type) + { + case WG_MAJOR_TYPE_VIDEO: + if (index >= ARRAY_SIZE(video_formats)) + { + LeaveCriticalSection(&reader->cs); + return NS_E_INVALID_OUTPUT_FORMAT; + } + format.u.video.format = video_formats[index]; + break; + + case WG_MAJOR_TYPE_AUDIO: + if (index) + { + LeaveCriticalSection(&reader->cs); + return NS_E_INVALID_OUTPUT_FORMAT; + } + format.u.audio.format = WG_AUDIO_FORMAT_S16LE; + break; + + case WG_MAJOR_TYPE_UNKNOWN: + break; + } + + LeaveCriticalSection(&reader->cs); + + *props = output_props_create(&format); + return *props ? S_OK : E_OUTOFMEMORY; +} + +HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output, + IWMOutputMediaProps *props_iface) +{ + struct output_props *props = unsafe_impl_from_IWMOutputMediaProps(props_iface); + struct wg_format format, pref_format; + struct wm_stream *stream; + + strmbase_dump_media_type(&props->mt); + + if (!amt_to_wg_format(&props->mt, &format)) + { + ERR("Failed to convert media type to winegstreamer format.\n"); + return E_FAIL; + } + + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + wg_parser_stream_get_preferred_format(stream->wg_stream, &pref_format); + if (pref_format.major_type != format.major_type) + { + /* R.U.S.E sets the type of the wrong stream, apparently by accident. */ + LeaveCriticalSection(&reader->cs); + WARN("Major types don't match; returning NS_E_INCOMPATIBLE_FORMAT.\n"); + return NS_E_INCOMPATIBLE_FORMAT; + } + + stream->format = format; + wg_parser_stream_enable(stream->wg_stream, &format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); + + /* Re-decode any buffers that might have been generated with the old format. + * + * FIXME: Seeking in-place will cause some buffers to be dropped. + * Unfortunately, we can't really store the last received PTS and seek there + * either: since seeks are inexact and we aren't guaranteed to receive + * samples in order, some buffers might be duplicated or dropped anyway. + * In order to really seamlessly allow for format changes, we need + * cooperation from each individual GStreamer stream, to be able to tell + * upstream exactly which buffers they need resent... + * + * In all likelihood this function is being called not mid-stream but rather + * while setting the stream up, before consuming any events. Accordingly + * let's just seek back to the beginning. */ + wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, reader->start_time, 0, + AM_SEEKING_AbsolutePositioning, AM_SEEKING_NoPositioning); + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +static const char *get_major_type_string(enum wg_major_type type) +{ + switch (type) + { + case WG_MAJOR_TYPE_AUDIO: + return "audio"; + case WG_MAJOR_TYPE_VIDEO: + return "video"; + case WG_MAJOR_TYPE_UNKNOWN: + return "unknown"; + } + assert(0); + return NULL; +} + +/* Find the earliest buffer by PTS. + * + * Native seems to behave similarly to this with the async reader, although our + * unit tests show that it's not entirely consistent—some frames are received + * slightly out of order. It's possible that one stream is being manually offset + * to account for decoding latency. + * + * The behaviour with the synchronous reader, when stream 0 is requested, seems + * consistent with this hypothesis, but with a much larger offset—the video + * stream seems to be "behind" by about 150 ms. + * + * The main reason for doing this is that the video and audio stream probably + * don't have quite the same "frame rate", and we don't want to force one stream + * to decode faster just to keep up with the other. Delivering samples in PTS + * order should avoid that problem. */ +static WORD get_earliest_buffer(struct wm_reader *reader, struct wg_parser_buffer *ret_buffer) +{ + struct wg_parser_buffer buffer; + QWORD earliest_pts = UI64_MAX; + WORD stream_number = 0; + WORD i; + + for (i = 0; i < reader->stream_count; ++i) + { + struct wm_stream *stream = &reader->streams[i]; + + if (stream->selection == WMT_OFF) + continue; + + if (!wg_parser_stream_get_buffer(stream->wg_stream, &buffer)) + continue; + + if (buffer.has_pts && buffer.pts < earliest_pts) + { + stream_number = i + 1; + earliest_pts = buffer.pts; + *ret_buffer = buffer; + } + } + + return stream_number; +} + +HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number, + INSSBuffer **ret_sample, QWORD *pts, QWORD *duration, DWORD *flags, WORD *ret_stream_number) +{ + IWMReaderCallbackAdvanced *callback_advanced = reader->callback_advanced; + struct wg_parser_stream *wg_stream; + struct wg_parser_buffer wg_buffer; + struct wm_stream *stream; + DWORD size, capacity; + INSSBuffer *sample; + HRESULT hr; + BYTE *data; + + for (;;) + { + if (!stream_number) + { + if (!(stream_number = get_earliest_buffer(reader, &wg_buffer))) + { + /* All streams are disabled or EOS. */ + return NS_E_NO_MORE_SAMPLES; + } + + stream = wm_reader_get_stream_by_stream_number(reader, stream_number); + wg_stream = stream->wg_stream; + } + else + { + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + WARN("Invalid stream number %u; returning E_INVALIDARG.\n", stream_number); + return E_INVALIDARG; + } + wg_stream = stream->wg_stream; + + if (stream->selection == WMT_OFF) + { + WARN("Stream %u is deselected; returning NS_E_INVALID_REQUEST.\n", stream_number); + return NS_E_INVALID_REQUEST; + } + + if (stream->eos) + return NS_E_NO_MORE_SAMPLES; + + if (!wg_parser_stream_get_buffer(wg_stream, &wg_buffer)) + { + stream->eos = true; + TRACE("End of stream.\n"); + return NS_E_NO_MORE_SAMPLES; + } + } + + TRACE("Got buffer for '%s' stream %p.\n", get_major_type_string(stream->format.major_type), stream); + + if (callback_advanced && stream->read_compressed && stream->allocate_stream) + { + if (FAILED(hr = IWMReaderCallbackAdvanced_AllocateForStream(callback_advanced, + stream->index + 1, wg_buffer.size, &sample, NULL))) + { + ERR("Failed to allocate stream sample of %u bytes, hr %#x.\n", wg_buffer.size, hr); + wg_parser_stream_release_buffer(wg_stream); + return hr; + } + } + else if (callback_advanced && !stream->read_compressed && stream->allocate_output) + { + if (FAILED(hr = IWMReaderCallbackAdvanced_AllocateForOutput(callback_advanced, + stream->index, wg_buffer.size, &sample, NULL))) + { + ERR("Failed to allocate output sample of %u bytes, hr %#x.\n", wg_buffer.size, hr); + wg_parser_stream_release_buffer(wg_stream); + return hr; + } + } + else + { + struct buffer *object; + + /* FIXME: Should these be pooled? */ + if (!(object = calloc(1, offsetof(struct buffer, data[wg_buffer.size])))) + { + wg_parser_stream_release_buffer(wg_stream); + return E_OUTOFMEMORY; + } + + object->INSSBuffer_iface.lpVtbl = &buffer_vtbl; + object->refcount = 1; + object->capacity = wg_buffer.size; + + TRACE("Created buffer %p.\n", object); + sample = &object->INSSBuffer_iface; + } + + if (FAILED(hr = INSSBuffer_GetBufferAndLength(sample, &data, &size))) + ERR("Failed to get data pointer, hr %#x.\n", hr); + if (FAILED(hr = INSSBuffer_GetMaxLength(sample, &capacity))) + ERR("Failed to get capacity, hr %#x.\n", hr); + if (wg_buffer.size > capacity) + ERR("Returned capacity %u is less than requested capacity %u.\n", capacity, wg_buffer.size); + + if (!wg_parser_stream_copy_buffer(wg_stream, data, 0, wg_buffer.size)) + { + /* The GStreamer pin has been flushed. */ + INSSBuffer_Release(sample); + continue; + } + + if (FAILED(hr = INSSBuffer_SetLength(sample, wg_buffer.size))) + ERR("Failed to set size %u, hr %#x.\n", wg_buffer.size, hr); + + wg_parser_stream_release_buffer(wg_stream); + + if (!wg_buffer.has_pts) + FIXME("Missing PTS.\n"); + if (!wg_buffer.has_duration) + FIXME("Missing duration.\n"); + + *pts = wg_buffer.pts; + *duration = wg_buffer.duration; + *flags = 0; + if (wg_buffer.discontinuity) + *flags |= WM_SF_DISCONTINUITY; + if (!wg_buffer.delta) + *flags |= WM_SF_CLEANPOINT; + + *ret_sample = sample; + *ret_stream_number = stream_number; + return S_OK; + } +} + +void wm_reader_seek(struct wm_reader *reader, QWORD start, LONGLONG duration) +{ + WORD i; + + EnterCriticalSection(&reader->cs); + + reader->start_time = start; + + wg_parser_stream_seek(reader->streams[0].wg_stream, 1.0, start, start + duration, + AM_SEEKING_AbsolutePositioning, duration ? AM_SEEKING_AbsolutePositioning : AM_SEEKING_NoPositioning); + + for (i = 0; i < reader->stream_count; ++i) + reader->streams[i].eos = false; + + LeaveCriticalSection(&reader->cs); +} + +HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count, + const WORD *stream_numbers, const WMT_STREAM_SELECTION *selections) +{ + struct wm_stream *stream; + WORD i; + + if (!count) + return E_INVALIDARG; + + EnterCriticalSection(&reader->cs); + + for (i = 0; i < count; ++i) + { + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_numbers[i]))) + { + LeaveCriticalSection(&reader->cs); + WARN("Invalid stream number %u; returning NS_E_INVALID_REQUEST.\n", stream_numbers[i]); + return NS_E_INVALID_REQUEST; + } + } + + for (i = 0; i < count; ++i) + { + stream = wm_reader_get_stream_by_stream_number(reader, stream_numbers[i]); + stream->selection = selections[i]; + if (selections[i] == WMT_OFF) + { + TRACE("Disabling stream %u.\n", stream_numbers[i]); + wg_parser_stream_disable(stream->wg_stream); + } + else if (selections[i] == WMT_ON) + { + if (selections[i] != WMT_ON) + FIXME("Ignoring selection %#x for stream %u; treating as enabled.\n", + selections[i], stream_numbers[i]); + TRACE("Enabling stream %u.\n", stream_numbers[i]); + wg_parser_stream_enable(stream->wg_stream, &stream->format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); + } + } + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +HRESULT wm_reader_get_stream_selection(struct wm_reader *reader, + WORD stream_number, WMT_STREAM_SELECTION *selection) +{ + struct wm_stream *stream; + + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + *selection = stream->selection; + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +HRESULT wm_reader_set_allocate_for_output(struct wm_reader *reader, DWORD output, BOOL allocate) +{ + struct wm_stream *stream; + + EnterCriticalSection(&reader->cs); + + if (!(stream = get_stream_by_output_number(reader, output))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + stream->allocate_output = !!allocate; + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +HRESULT wm_reader_set_allocate_for_stream(struct wm_reader *reader, WORD stream_number, BOOL allocate) +{ + struct wm_stream *stream; + + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + stream->allocate_stream = !!allocate; + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +HRESULT wm_reader_set_read_compressed(struct wm_reader *reader, WORD stream_number, BOOL compressed) +{ + struct wm_stream *stream; + + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + stream->read_compressed = compressed; + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +HRESULT wm_reader_get_max_stream_size(struct wm_reader *reader, WORD stream_number, DWORD *size) +{ + struct wm_stream *stream; + + EnterCriticalSection(&reader->cs); + + if (!(stream = wm_reader_get_stream_by_stream_number(reader, stream_number))) + { + LeaveCriticalSection(&reader->cs); + return E_INVALIDARG; + } + + *size = wg_format_get_max_size(&stream->format); + + LeaveCriticalSection(&reader->cs); + return S_OK; +} + +void wm_reader_init(struct wm_reader *reader, const struct wm_reader_ops *ops) +{ + reader->IWMHeaderInfo3_iface.lpVtbl = &header_info_vtbl; + reader->IWMLanguageList_iface.lpVtbl = &language_list_vtbl; + reader->IWMPacketSize2_iface.lpVtbl = &packet_size_vtbl; + reader->IWMProfile3_iface.lpVtbl = &profile_vtbl; + reader->IWMReaderPlaylistBurn_iface.lpVtbl = &playlist_vtbl; + reader->IWMReaderTimecode_iface.lpVtbl = &timecode_vtbl; + reader->refcount = 1; + reader->ops = ops; + + InitializeCriticalSection(&reader->cs); + reader->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": wm_reader.cs"); +} + +void wm_reader_cleanup(struct wm_reader *reader) +{ + reader->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&reader->cs); +} diff --git a/dlls/mfplat/wm_syncreader.c b/dlls/mfplat/wm_syncreader.c new file mode 100644 index 00000000000..b03aa69d030 --- /dev/null +++ wine/dlls/mfplat/wm_syncreader.c @@ -0,0 +1,407 @@ +/* + * Copyright 2012 Austin English + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(wmvcore); + +struct sync_reader +{ + struct wm_reader reader; + + IWMSyncReader2 IWMSyncReader2_iface; +}; + +static struct sync_reader *impl_from_IWMSyncReader2(IWMSyncReader2 *iface) +{ + return CONTAINING_RECORD(iface, struct sync_reader, IWMSyncReader2_iface); +} + +static HRESULT WINAPI WMSyncReader_QueryInterface(IWMSyncReader2 *iface, REFIID iid, void **out) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + return IWMProfile3_QueryInterface(&reader->reader.IWMProfile3_iface, iid, out); +} + +static ULONG WINAPI WMSyncReader_AddRef(IWMSyncReader2 *iface) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + return IWMProfile3_AddRef(&reader->reader.IWMProfile3_iface); +} + +static ULONG WINAPI WMSyncReader_Release(IWMSyncReader2 *iface) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + return IWMProfile3_Release(&reader->reader.IWMProfile3_iface); +} + +static HRESULT WINAPI WMSyncReader_Close(IWMSyncReader2 *iface) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p.\n", reader); + + return wm_reader_close(&reader->reader); +} + +static HRESULT WINAPI WMSyncReader_GetMaxOutputSampleSize(IWMSyncReader2 *iface, DWORD output, DWORD *max) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %p): stub!\n", This, output, max); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader_GetMaxStreamSampleSize(IWMSyncReader2 *iface, WORD stream, DWORD *max) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %p): stub!\n", This, stream, max); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader_GetNextSample(IWMSyncReader2 *iface, + WORD stream_number, INSSBuffer **sample, QWORD *pts, QWORD *duration, + DWORD *flags, DWORD *output_number, WORD *ret_stream_number) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + HRESULT hr = NS_E_NO_MORE_SAMPLES; + + TRACE("reader %p, stream_number %u, sample %p, pts %p, duration %p," + " flags %p, output_number %p, ret_stream_number %p.\n", + reader, stream_number, sample, pts, duration, flags, output_number, ret_stream_number); + + if (!stream_number && !output_number && !ret_stream_number) + return E_INVALIDARG; + + EnterCriticalSection(&reader->reader.cs); + + hr = wm_reader_get_stream_sample(&reader->reader, stream_number, sample, pts, duration, flags, &stream_number); + if (output_number && hr == S_OK) + *output_number = stream_number - 1; + if (ret_stream_number && (hr == S_OK || stream_number)) + *ret_stream_number = stream_number; + + LeaveCriticalSection(&reader->reader.cs); + return hr; +} + +static HRESULT WINAPI WMSyncReader_GetOutputCount(IWMSyncReader2 *iface, DWORD *count) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, count %p.\n", reader, count); + + EnterCriticalSection(&reader->reader.cs); + *count = reader->reader.stream_count; + LeaveCriticalSection(&reader->reader.cs); + return S_OK; +} + +static HRESULT WINAPI WMSyncReader_GetOutputFormat(IWMSyncReader2 *iface, + DWORD output, DWORD index, IWMOutputMediaProps **props) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, output %u, index %u, props %p.\n", reader, output, index, props); + + return wm_reader_get_output_format(&reader->reader, output, index, props); +} + +static HRESULT WINAPI WMSyncReader_GetOutputFormatCount(IWMSyncReader2 *iface, DWORD output, DWORD *count) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, output %u, count %p.\n", reader, output, count); + + return wm_reader_get_output_format_count(&reader->reader, output, count); +} + +static HRESULT WINAPI WMSyncReader_GetOutputNumberForStream(IWMSyncReader2 *iface, + WORD stream_number, DWORD *output) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, stream_number %u, output %p.\n", reader, stream_number, output); + + *output = stream_number - 1; + return S_OK; +} + +static HRESULT WINAPI WMSyncReader_GetOutputProps(IWMSyncReader2 *iface, + DWORD output, IWMOutputMediaProps **props) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, output %u, props %p.\n", reader, output, props); + + return wm_reader_get_output_props(&reader->reader, output, props); +} + +static HRESULT WINAPI WMSyncReader_GetOutputSetting(IWMSyncReader2 *iface, DWORD output_num, const WCHAR *name, + WMT_ATTR_DATATYPE *type, BYTE *value, WORD *length) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%u %s %p %p %p): stub!\n", This, output_num, debugstr_w(name), type, value, length); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader_GetReadStreamSamples(IWMSyncReader2 *iface, WORD stream_num, BOOL *compressed) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %p): stub!\n", This, stream_num, compressed); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader_GetStreamNumberForOutput(IWMSyncReader2 *iface, + DWORD output, WORD *stream_number) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, output %u, stream_number %p.\n", reader, output, stream_number); + + *stream_number = output + 1; + return S_OK; +} + +static HRESULT WINAPI WMSyncReader_GetStreamSelected(IWMSyncReader2 *iface, + WORD stream_number, WMT_STREAM_SELECTION *selection) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, stream_number %u, selection %p.\n", reader, stream_number, selection); + + return wm_reader_get_stream_selection(&reader->reader, stream_number, selection); +} + +static HRESULT WINAPI WMSyncReader_Open(IWMSyncReader2 *iface, const WCHAR *filename) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, filename %s.\n", reader, debugstr_w(filename)); + + return wm_reader_open_file(&reader->reader, filename); +} + +static HRESULT WINAPI WMSyncReader_OpenStream(IWMSyncReader2 *iface, IStream *stream) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, stream %p.\n", reader, stream); + + return wm_reader_open_stream(&reader->reader, stream); +} + +static HRESULT WINAPI WMSyncReader_SetOutputProps(IWMSyncReader2 *iface, DWORD output, IWMOutputMediaProps *props) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, output %u, props %p.\n", reader, output, props); + + return wm_reader_set_output_props(&reader->reader, output, props); +} + +static HRESULT WINAPI WMSyncReader_SetOutputSetting(IWMSyncReader2 *iface, DWORD output, + const WCHAR *name, WMT_ATTR_DATATYPE type, const BYTE *value, WORD size) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, output %u, name %s, type %#x, value %p, size %u.\n", + reader, output, debugstr_w(name), type, value, size); + + if (!wcscmp(name, L"VideoSampleDurations")) + { + FIXME("Ignoring VideoSampleDurations setting.\n"); + return S_OK; + } + else + { + FIXME("Unknown setting %s; returning E_NOTIMPL.\n", debugstr_w(name)); + return E_NOTIMPL; + } +} + +static HRESULT WINAPI WMSyncReader_SetRange(IWMSyncReader2 *iface, QWORD start, LONGLONG duration) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, start %I64u, duration %I64d.\n", reader, start, duration); + + wm_reader_seek(&reader->reader, start, duration); + return S_OK; +} + +static HRESULT WINAPI WMSyncReader_SetRangeByFrame(IWMSyncReader2 *iface, WORD stream_num, QWORD frame_num, + LONGLONG frames) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %s %s): stub!\n", This, stream_num, wine_dbgstr_longlong(frame_num), wine_dbgstr_longlong(frames)); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader_SetReadStreamSamples(IWMSyncReader2 *iface, WORD stream_number, BOOL compressed) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, stream_index %u, compressed %d.\n", reader, stream_number, compressed); + + return wm_reader_set_read_compressed(&reader->reader, stream_number, compressed); +} + +static HRESULT WINAPI WMSyncReader_SetStreamsSelected(IWMSyncReader2 *iface, + WORD count, WORD *stream_numbers, WMT_STREAM_SELECTION *selections) +{ + struct sync_reader *reader = impl_from_IWMSyncReader2(iface); + + TRACE("reader %p, count %u, stream_numbers %p, selections %p.\n", + reader, count, stream_numbers, selections); + + return wm_reader_set_streams_selected(&reader->reader, count, stream_numbers, selections); +} + +static HRESULT WINAPI WMSyncReader2_SetRangeByTimecode(IWMSyncReader2 *iface, WORD stream_num, + WMT_TIMECODE_EXTENSION_DATA *start, WMT_TIMECODE_EXTENSION_DATA *end) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%u %p %p): stub!\n", This, stream_num, start, end); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader2_SetRangeByFrameEx(IWMSyncReader2 *iface, WORD stream_num, QWORD frame_num, + LONGLONG frames_to_read, QWORD *starttime) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%u %s %s %p): stub!\n", This, stream_num, wine_dbgstr_longlong(frame_num), + wine_dbgstr_longlong(frames_to_read), starttime); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader2_SetAllocateForOutput(IWMSyncReader2 *iface, DWORD output_num, IWMReaderAllocatorEx *allocator) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %p): stub!\n", This, output_num, allocator); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader2_GetAllocateForOutput(IWMSyncReader2 *iface, DWORD output_num, IWMReaderAllocatorEx **allocator) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %p): stub!\n", This, output_num, allocator); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader2_SetAllocateForStream(IWMSyncReader2 *iface, DWORD stream_num, IWMReaderAllocatorEx *allocator) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %p): stub!\n", This, stream_num, allocator); + return E_NOTIMPL; +} + +static HRESULT WINAPI WMSyncReader2_GetAllocateForStream(IWMSyncReader2 *iface, DWORD stream_num, IWMReaderAllocatorEx **allocator) +{ + struct sync_reader *This = impl_from_IWMSyncReader2(iface); + FIXME("(%p)->(%d %p): stub!\n", This, stream_num, allocator); + return E_NOTIMPL; +} + +static const IWMSyncReader2Vtbl WMSyncReader2Vtbl = { + WMSyncReader_QueryInterface, + WMSyncReader_AddRef, + WMSyncReader_Release, + WMSyncReader_Open, + WMSyncReader_Close, + WMSyncReader_SetRange, + WMSyncReader_SetRangeByFrame, + WMSyncReader_GetNextSample, + WMSyncReader_SetStreamsSelected, + WMSyncReader_GetStreamSelected, + WMSyncReader_SetReadStreamSamples, + WMSyncReader_GetReadStreamSamples, + WMSyncReader_GetOutputSetting, + WMSyncReader_SetOutputSetting, + WMSyncReader_GetOutputCount, + WMSyncReader_GetOutputProps, + WMSyncReader_SetOutputProps, + WMSyncReader_GetOutputFormatCount, + WMSyncReader_GetOutputFormat, + WMSyncReader_GetOutputNumberForStream, + WMSyncReader_GetStreamNumberForOutput, + WMSyncReader_GetMaxOutputSampleSize, + WMSyncReader_GetMaxStreamSampleSize, + WMSyncReader_OpenStream, + WMSyncReader2_SetRangeByTimecode, + WMSyncReader2_SetRangeByFrameEx, + WMSyncReader2_SetAllocateForOutput, + WMSyncReader2_GetAllocateForOutput, + WMSyncReader2_SetAllocateForStream, + WMSyncReader2_GetAllocateForStream +}; + +static struct sync_reader *impl_from_wm_reader(struct wm_reader *iface) +{ + return CONTAINING_RECORD(iface, struct sync_reader, reader); +} + +static void *sync_reader_query_interface(struct wm_reader *iface, REFIID iid) +{ + struct sync_reader *reader = impl_from_wm_reader(iface); + + TRACE("reader %p, iid %s.\n", reader, debugstr_guid(iid)); + + if (IsEqualIID(iid, &IID_IWMSyncReader) + || IsEqualIID(iid, &IID_IWMSyncReader2)) + return &reader->IWMSyncReader2_iface; + + return NULL; +} + +static void sync_reader_destroy(struct wm_reader *iface) +{ + struct sync_reader *reader = impl_from_wm_reader(iface); + + TRACE("reader %p.\n", reader); + + wm_reader_close(&reader->reader); + wm_reader_cleanup(&reader->reader); + free(reader); +} + +static const struct wm_reader_ops sync_reader_ops = +{ + .query_interface = sync_reader_query_interface, + .destroy = sync_reader_destroy, +}; + +HRESULT WINAPI winegstreamer_create_wm_sync_reader(IWMSyncReader **reader) +{ + struct sync_reader *object; + + TRACE("reader %p.\n", reader); + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + wm_reader_init(&object->reader, &sync_reader_ops); + + object->IWMSyncReader2_iface.lpVtbl = &WMSyncReader2Vtbl; + + TRACE("Created sync reader %p.\n", object); + *reader = (IWMSyncReader *)&object->IWMSyncReader2_iface; + return S_OK; +} diff --git a/dlls/mfplat/wma_decoder.c b/dlls/mfplat/wma_decoder.c new file mode 100644 index 00000000000..021d0beb935 --- /dev/null +++ wine/dlls/mfplat/wma_decoder.c @@ -0,0 +1,861 @@ +/* WMA Decoder Transform + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" +#include "mfobjects.h" +#include "mftransform.h" +#include "wmcodecdsp.h" + +#include "wine/debug.h" +#include "wine/heap.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +DEFINE_MEDIATYPE_GUID(MFAudioFormat_XMAudio2, 0x0166); + +static const GUID *wma_decoder_input_types[] = +{ + &MEDIASUBTYPE_MSAUDIO1, + &MFAudioFormat_WMAudioV8, + &MFAudioFormat_WMAudioV9, + &MFAudioFormat_WMAudio_Lossless, + &MFAudioFormat_XMAudio2, +}; +static const GUID *wma_decoder_output_types[] = +{ + &MFAudioFormat_Float, + &MFAudioFormat_PCM, +}; + +struct wma_decoder +{ + IUnknown IUnknown_inner; + IMFTransform IMFTransform_iface; + IMediaObject IMediaObject_iface; + IUnknown *outer; + LONG refcount; + IMFMediaType *input_type; + IMFMediaType *output_type; + + IMFSample *input_sample; + struct wg_transform *wg_transform; +}; + +static inline struct wma_decoder *impl_from_IUnknown(IUnknown *iface) +{ + return CONTAINING_RECORD(iface, struct wma_decoder, IUnknown_inner); +} + +static HRESULT WINAPI wma_unknown_QueryInterface(IUnknown *iface, REFIID iid, void **out) +{ + struct wma_decoder *decoder = impl_from_IUnknown(iface); + + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown)) + *out = &decoder->IUnknown_inner; + else if (IsEqualGUID(iid, &IID_IMFTransform)) + *out = &decoder->IMFTransform_iface; + else if (IsEqualGUID(iid, &IID_IMediaObject)) + *out = &decoder->IMediaObject_iface; + else + { + *out = NULL; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI wma_unknown_AddRef(IUnknown *iface) +{ + struct wma_decoder *decoder = impl_from_IUnknown(iface); + ULONG refcount = InterlockedIncrement(&decoder->refcount); + + TRACE("iface %p increasing refcount to %u.\n", decoder, refcount); + + return refcount; +} + +static ULONG WINAPI wma_unknown_Release(IUnknown *iface) +{ + struct wma_decoder *decoder = impl_from_IUnknown(iface); + ULONG refcount = InterlockedDecrement(&decoder->refcount); + + TRACE("iface %p decreasing refcount to %u.\n", decoder, refcount); + + if (!refcount) + { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + if (decoder->input_type) + IMFMediaType_Release(decoder->input_type); + if (decoder->output_type) + IMFMediaType_Release(decoder->output_type); + free(decoder); + } + + return refcount; +} + +static const IUnknownVtbl wma_unknown_vtbl = +{ + wma_unknown_QueryInterface, + wma_unknown_AddRef, + wma_unknown_Release, +}; + +static struct wma_decoder *impl_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct wma_decoder, IMFTransform_iface); +} + +static HRESULT try_create_wg_transform(struct wma_decoder *decoder) +{ + struct wg_encoded_format input_format; + struct wg_format output_format; + + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + decoder->wg_transform = NULL; + + mf_media_type_to_wg_encoded_format(decoder->input_type, &input_format); + if (input_format.encoded_type == WG_ENCODED_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + + mf_media_type_to_wg_format(decoder->output_type, &output_format); + if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + + decoder->wg_transform = wg_transform_create(&input_format, &output_format); + if (decoder->wg_transform) + return S_OK; + + WARN("Failed to create wg_transform.\n"); + return E_FAIL; +} + +static HRESULT WINAPI wma_decoder_QueryInterface(IMFTransform *iface, REFIID iid, void **out) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + return IUnknown_QueryInterface(decoder->outer, iid, out); +} + +static ULONG WINAPI wma_decoder_AddRef(IMFTransform *iface) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + return IUnknown_AddRef(decoder->outer); +} + +static ULONG WINAPI wma_decoder_Release(IMFTransform *iface) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + return IUnknown_Release(decoder->outer); +} + +static HRESULT WINAPI wma_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, + DWORD *input_maximum, DWORD *output_minimum, DWORD *output_maximum) +{ + FIXME("iface %p, input_minimum %p, input_maximum %p, output_minimum %p, output_maximum %p stub!\n", + iface, input_minimum, input_maximum, output_minimum, output_maximum); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + FIXME("iface %p, inputs %p, outputs %p stub!\n", iface, inputs, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + FIXME("iface %p, input_size %u, inputs %p, output_size %u, outputs %p stub!\n", iface, + input_size, inputs, output_size, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + UINT32 block_alignment; + HRESULT hr; + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_alignment))) + return hr; + + info->hnsMaxLatency = 0; + info->dwFlags = 0; + info->cbSize = block_alignment; + info->cbMaxLookahead = 0; + info->cbAlignment = 1; + + return S_OK; +} + +static HRESULT WINAPI wma_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + UINT32 channel_count, block_alignment; + HRESULT hr; + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->output_type, &MF_MT_AUDIO_NUM_CHANNELS, &channel_count))) + return hr; + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->output_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_alignment))) + return hr; + + info->dwFlags = 0; + info->cbSize = 1024 * block_alignment * channel_count; + info->cbAlignment = 1; + + return S_OK; +} + +static HRESULT WINAPI wma_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("iface %p, attributes %p stub!\n", iface, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + FIXME("iface %p, id %u stub!\n", iface, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + FIXME("iface %p, streams %u, ids %p stub!\n", iface, streams, ids); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + FIXME("iface %p, id %u, index %u, type %p stub!\n", iface, id, index, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + UINT32 channel_count, sample_size, sample_rate, block_alignment; + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaType *media_type; + const GUID *output_type; + HRESULT hr; + + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); + + if (!decoder->input_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *type = NULL; + + if (index >= ARRAY_SIZE(wma_decoder_output_types)) + return MF_E_NO_MORE_TYPES; + output_type = wma_decoder_output_types[index]; + + if (FAILED(hr = MFCreateMediaType(&media_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio))) + goto done; + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, output_type))) + goto done; + + if (IsEqualGUID(output_type, &MFAudioFormat_Float)) + sample_size = 32; + else if (IsEqualGUID(output_type, &MFAudioFormat_PCM)) + sample_size = 16; + else + { + FIXME("Subtype %s not implemented!\n", debugstr_guid(output_type)); + hr = E_NOTIMPL; + goto done; + } + + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, sample_size))) + goto done; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_NUM_CHANNELS, &channel_count))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_NUM_CHANNELS, channel_count))) + goto done; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &sample_rate))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, sample_rate))) + goto done; + + block_alignment = sample_size * channel_count / 8; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, block_alignment))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, sample_rate * block_alignment))) + goto done; + + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, 1))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, 1))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_PREFER_WAVEFORMATEX, 1))) + goto done; + +done: + if (SUCCEEDED(hr)) + IMFMediaType_AddRef((*type = media_type)); + + IMFMediaType_Release(media_type); + return hr; +} + +static HRESULT WINAPI wma_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + MF_ATTRIBUTE_TYPE item_type; + GUID major, subtype; + HRESULT hr; + ULONG i; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (!IsEqualGUID(&major, &MFMediaType_Audio)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(wma_decoder_input_types); ++i) + if (IsEqualGUID(&subtype, wma_decoder_input_types[i])) + break; + if (i == ARRAY_SIZE(wma_decoder_input_types)) + return MF_E_INVALIDMEDIATYPE; + + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_USER_DATA, &item_type)) || + item_type != MF_ATTRIBUTE_BLOB) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_NUM_CHANNELS, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + + if (!decoder->input_type && FAILED(hr = MFCreateMediaType(&decoder->input_type))) + return hr; + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + if (FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *)decoder->input_type))) + { + IMFMediaType_Release(decoder->input_type); + decoder->input_type = NULL; + } + + return hr; +} + +static HRESULT WINAPI wma_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + MF_ATTRIBUTE_TYPE item_type; + ULONG i, sample_size; + GUID major, subtype; + HRESULT hr; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (!IsEqualGUID(&major, &MFMediaType_Audio)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(wma_decoder_output_types); ++i) + if (IsEqualGUID(&subtype, wma_decoder_output_types[i])) + break; + if (i == ARRAY_SIZE(wma_decoder_output_types)) + return MF_E_INVALIDMEDIATYPE; + + if (IsEqualGUID(&subtype, &MFAudioFormat_Float)) + sample_size = 32; + else if (IsEqualGUID(&subtype, &MFAudioFormat_PCM)) + sample_size = 16; + else + { + FIXME("Subtype %s not implemented!\n", debugstr_guid(&subtype)); + hr = E_NOTIMPL; + return hr; + } + + if (FAILED(IMFMediaType_SetUINT32(decoder->input_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, sample_size))) + return MF_E_INVALIDMEDIATYPE; + + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_NUM_CHANNELS, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + + if (!decoder->output_type && FAILED(hr = MFCreateMediaType(&decoder->output_type))) + return hr; + + if (FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *)decoder->output_type))) + goto failed; + + if (FAILED(hr = try_create_wg_transform(decoder))) + goto failed; + + return S_OK; + +failed: + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + return hr; +} + +static HRESULT WINAPI wma_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("iface %p, id %u, flags %p stub!\n", iface, id, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("iface %p, flags %p stub!\n", iface, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("iface %p, lower %s, upper %s stub!\n", iface, wine_dbgstr_longlong(lower), + wine_dbgstr_longlong(upper)); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + FIXME("iface %p, id %u, event %p stub!\n", iface, id, event); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + FIXME("iface %p, message %#x, param %p stub!\n", iface, message, (void *)param); + return S_OK; +} + +static HRESULT WINAPI wma_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaBuffer *media_buffer; + MFT_INPUT_STREAM_INFO info; + UINT32 buffer_size; + BYTE *buffer; + HRESULT hr; + + TRACE("iface %p, id %u, sample %p, flags %#x.\n", iface, id, sample, flags); + + if (FAILED(hr = IMFTransform_GetInputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (decoder->input_sample) + return MF_E_NOTACCEPTING; + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_GetCurrentLength(media_buffer, &buffer_size))) + return hr; + + if (!(buffer_size = (buffer_size / info.cbSize) * info.cbSize)) + return S_OK; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, NULL))) + goto done; + + if (SUCCEEDED(hr = wg_transform_push_data(decoder->wg_transform, buffer, buffer_size))) + IMFSample_AddRef((decoder->input_sample = sample)); + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static HRESULT WINAPI wma_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct wma_decoder *decoder = impl_from_IMFTransform(iface); + struct wg_sample wg_sample = {0}; + IMFMediaBuffer *media_buffer; + MFT_OUTPUT_STREAM_INFO info; + HRESULT hr; + + TRACE("iface %p, flags %#x, count %u, samples %p, status %p.\n", iface, flags, count, samples, status); + + if (count > 1) + { + FIXME("Not implemented count %u\n", count); + return E_NOTIMPL; + } + + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *status = 0; + samples[0].dwStatus = 0; + if (!samples[0].pSample) + { + samples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &wg_sample.data, &wg_sample.size, NULL))) + goto done; + + if (wg_sample.size < info.cbSize) + hr = MF_E_BUFFERTOOSMALL; + else if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, &wg_sample))) + { + if (wg_sample.flags & WG_SAMPLE_FLAG_INCOMPLETE) + samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_INCOMPLETE; + } + else + { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); + decoder->input_sample = NULL; + } + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_SetCurrentLength(media_buffer, wg_sample.size); + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static const IMFTransformVtbl mf_transform_vtbl = +{ + wma_decoder_QueryInterface, + wma_decoder_AddRef, + wma_decoder_Release, + wma_decoder_GetStreamLimits, + wma_decoder_GetStreamCount, + wma_decoder_GetStreamIDs, + wma_decoder_GetInputStreamInfo, + wma_decoder_GetOutputStreamInfo, + wma_decoder_GetAttributes, + wma_decoder_GetInputStreamAttributes, + wma_decoder_GetOutputStreamAttributes, + wma_decoder_DeleteInputStream, + wma_decoder_AddInputStreams, + wma_decoder_GetInputAvailableType, + wma_decoder_GetOutputAvailableType, + wma_decoder_SetInputType, + wma_decoder_SetOutputType, + wma_decoder_GetInputCurrentType, + wma_decoder_GetOutputCurrentType, + wma_decoder_GetInputStatus, + wma_decoder_GetOutputStatus, + wma_decoder_SetOutputBounds, + wma_decoder_ProcessEvent, + wma_decoder_ProcessMessage, + wma_decoder_ProcessInput, + wma_decoder_ProcessOutput, +}; + +static inline struct wma_decoder *impl_from_IMediaObject(IMediaObject *iface) +{ + return CONTAINING_RECORD(iface, struct wma_decoder, IMediaObject_iface); +} + +static HRESULT WINAPI wma_media_object_QueryInterface(IMediaObject *iface, REFIID iid, void **obj) +{ + struct wma_decoder *decoder = impl_from_IMediaObject(iface); + return IUnknown_QueryInterface(decoder->outer, iid, obj); +} + +static ULONG WINAPI wma_media_object_AddRef(IMediaObject *iface) +{ + struct wma_decoder *decoder = impl_from_IMediaObject(iface); + return IUnknown_AddRef(decoder->outer); +} + +static ULONG WINAPI wma_media_object_Release(IMediaObject *iface) +{ + struct wma_decoder *decoder = impl_from_IMediaObject(iface); + return IUnknown_Release(decoder->outer); +} + +static HRESULT WINAPI wma_media_object_GetStreamCount(IMediaObject *iface, DWORD *input, DWORD *output) +{ + FIXME("iface %p, input %p, output %p stub!\n", iface, input, output); + *input = *output = 1; + return S_OK; +} + +static HRESULT WINAPI wma_media_object_GetInputStreamInfo(IMediaObject *iface, DWORD index, DWORD *flags) +{ + FIXME("iface %p, index %u, flags %p stub!\n", iface, index, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetOutputStreamInfo(IMediaObject *iface, DWORD index, DWORD *flags) +{ + FIXME("iface %p, index %u, flags %p stub!\n", iface, index, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetInputType(IMediaObject *iface, DWORD index, + DWORD type_index, DMO_MEDIA_TYPE *type) +{ + FIXME("iface %p, index %u, type_index %u, type %p stub!\n", iface, index, type_index, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetOutputType(IMediaObject *iface, DWORD index, + DWORD type_index, DMO_MEDIA_TYPE *type) +{ + FIXME("iface %p, index %u, type_index %u, type %p stub!\n", iface, index, type_index, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_SetInputType(IMediaObject *iface, DWORD index, + const DMO_MEDIA_TYPE *type, DWORD flags) +{ + FIXME("iface %p, index %u, type %p, flags %#x stub!\n", iface, index, type, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_SetOutputType(IMediaObject *iface, DWORD index, + const DMO_MEDIA_TYPE *type, DWORD flags) +{ + FIXME("iface %p, index %u, type %p, flags %#x stub!\n", iface, index, type, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetInputCurrentType(IMediaObject *iface, DWORD index, DMO_MEDIA_TYPE *type) +{ + FIXME("iface %p, index %u, type %p stub!\n", iface, index, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetOutputCurrentType(IMediaObject *iface, DWORD index, DMO_MEDIA_TYPE *type) +{ + FIXME("iface %p, index %u, type %p stub!\n", iface, index, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetInputSizeInfo(IMediaObject *iface, DWORD index, + DWORD *size, DWORD *lookahead, DWORD *alignment) +{ + FIXME("iface %p, index %u, size %p, lookahead %p, alignment %p stub!\n", iface, index, size, + lookahead, alignment); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetOutputSizeInfo(IMediaObject *iface, DWORD index, + DWORD *size, DWORD *alignment) +{ + FIXME("iface %p, index %u, size %p, alignment %p stub!\n", iface, index, size, alignment); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetInputMaxLatency(IMediaObject *iface, DWORD index, REFERENCE_TIME *latency) +{ + FIXME("iface %p, index %u, latency %p stub!\n", iface, index, latency); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_SetInputMaxLatency(IMediaObject *iface, DWORD index, REFERENCE_TIME latency) +{ + FIXME("iface %p, index %u, latency %s stub!\n", iface, index, wine_dbgstr_longlong(latency)); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_Flush(IMediaObject *iface) +{ + FIXME("iface %p stub!\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_Discontinuity(IMediaObject *iface, DWORD index) +{ + FIXME("iface %p, index %u stub!\n", iface, index); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_AllocateStreamingResources(IMediaObject *iface) +{ + FIXME("iface %p stub!\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_FreeStreamingResources(IMediaObject *iface) +{ + FIXME("iface %p stub!\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_GetInputStatus(IMediaObject *iface, DWORD index, DWORD *flags) +{ + FIXME("iface %p, index %u, flags %p stub!\n", iface, index, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_ProcessInput(IMediaObject *iface, DWORD index, + IMediaBuffer *buffer, DWORD flags, REFERENCE_TIME timestamp, REFERENCE_TIME timelength) +{ + FIXME("iface %p, index %u, buffer %p, flags %#x, timestamp %s, timelength %s stub!\n", iface, + index, buffer, flags, wine_dbgstr_longlong(timestamp), wine_dbgstr_longlong(timelength)); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_ProcessOutput(IMediaObject *iface, DWORD flags, DWORD count, + DMO_OUTPUT_DATA_BUFFER *buffers, DWORD *status) +{ + FIXME("iface %p, flags %#x, count %u, buffers %p, status %p stub!\n", iface, flags, count, buffers, status); + return E_NOTIMPL; +} + +static HRESULT WINAPI wma_media_object_Lock(IMediaObject *iface, LONG lock) +{ + FIXME("iface %p, lock %d stub!\n", iface, lock); + return E_NOTIMPL; +} + +static const IMediaObjectVtbl wma_media_object_vtbl = +{ + wma_media_object_QueryInterface, + wma_media_object_AddRef, + wma_media_object_Release, + wma_media_object_GetStreamCount, + wma_media_object_GetInputStreamInfo, + wma_media_object_GetOutputStreamInfo, + wma_media_object_GetInputType, + wma_media_object_GetOutputType, + wma_media_object_SetInputType, + wma_media_object_SetOutputType, + wma_media_object_GetInputCurrentType, + wma_media_object_GetOutputCurrentType, + wma_media_object_GetInputSizeInfo, + wma_media_object_GetOutputSizeInfo, + wma_media_object_GetInputMaxLatency, + wma_media_object_SetInputMaxLatency, + wma_media_object_Flush, + wma_media_object_Discontinuity, + wma_media_object_AllocateStreamingResources, + wma_media_object_FreeStreamingResources, + wma_media_object_GetInputStatus, + wma_media_object_ProcessInput, + wma_media_object_ProcessOutput, + wma_media_object_Lock, +}; + +HRESULT wma_decoder_create(IUnknown *outer, IUnknown **out) +{ + struct wma_decoder *decoder; + + TRACE("outer %p, out %p.\n", outer, out); + + if (!(decoder = calloc(1, sizeof(*decoder)))) + return E_OUTOFMEMORY; + + decoder->IUnknown_inner.lpVtbl = &wma_unknown_vtbl; + decoder->IMFTransform_iface.lpVtbl = &mf_transform_vtbl; + decoder->IMediaObject_iface.lpVtbl = &wma_media_object_vtbl; + decoder->refcount = 1; + decoder->outer = outer ? outer : &decoder->IUnknown_inner; + + *out = &decoder->IUnknown_inner; + TRACE("Created decoder %p\n", *out); + return S_OK; +} diff --git a/dlls/qcap/Makefile.in b/dlls/qcap/Makefile.in index b61a4a05ab2..634bcca2ff4 100644 --- wine/dlls/qcap/Makefile.in +++ wine/dlls/qcap/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES MODULE = qcap.dll UNIXLIB = qcap.so IMPORTS = strmbase strmiids uuid ole32 oleaut32 diff --git a/dlls/qcap/audiorecord.c b/dlls/qcap/audiorecord.c index a6f27cf4f26..c77a214b06b 100644 --- wine/dlls/qcap/audiorecord.c +++ wine/dlls/qcap/audiorecord.c @@ -115,7 +115,13 @@ static HRESULT WINAPI PPB_Load(IPersistPropertyBag *iface, IPropertyBag *pPropBa hr = IPropertyBag_Read(pPropBag, L"WaveInID", &var, pErrorLog); if (SUCCEEDED(hr)) { - FIXME("FIXME: implement opening waveIn device %ld\n", V_I4(&var)); + char sgi[64]; + FIXME("FIXME: implement opening waveIn device %d\n", V_I4(&var)); + if (GetEnvironmentVariableA("SteamGameId", sgi, sizeof(sgi)) && !strcmp(sgi, "470220")) + { + FIXME("HACK: returning error.\n"); + return E_FAIL; + } } return hr; diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index 2a347bd2027..e8a452fc7f5 100644 --- wine/dlls/qcap/avico.c +++ wine/dlls/qcap/avico.c @@ -142,7 +142,7 @@ static HRESULT avi_compressor_init_stream(struct strmbase_filter *iface) if (filter->source.pAllocator && FAILED(hr = IMemAllocator_Commit(filter->source.pAllocator))) { - ERR("Failed to commit allocator, hr %#lx.\n", hr); + ERR("Failed to commit allocator, hr %#x.\n", hr); return hr; } @@ -216,7 +216,7 @@ static HRESULT WINAPI AVICompressorPropertyBag_Load(IPersistPropertyBag *iface, V_VT(&v) = VT_BSTR; hres = IPropertyBag_Read(pPropBag, L"FccHandler", &v, NULL); if(FAILED(hres)) { - ERR("Failed to read FccHandler value, hr %#lx.\n", hres); + WARN("Could not read FccHandler: %08x\n", hres); return hres; } @@ -309,7 +309,7 @@ static HRESULT WINAPI AVICompressorIn_Receive(struct strmbase_sink *base, IMedia BOOL is_preroll; BOOL sync_point; BYTE *ptr, *buf; - LRESULT res; + DWORD res; HRESULT hres; TRACE("(%p)->(%p)\n", base, pSample); @@ -336,7 +336,7 @@ static HRESULT WINAPI AVICompressorIn_Receive(struct strmbase_sink *base, IMedia hres = IMediaSample_GetTime(pSample, &start, &stop); if(FAILED(hres)) { - WARN("Failed to get sample time, hr %#lx.\n", hres); + WARN("GetTime failed: %08x\n", hres); return hres; } @@ -346,18 +346,13 @@ static HRESULT WINAPI AVICompressorIn_Receive(struct strmbase_sink *base, IMedia hres = IMediaSample_GetPointer(pSample, &ptr); if(FAILED(hres)) { - ERR("Failed to get input buffer pointer, hr %#lx.\n", hres); + WARN("GetPointer failed: %08x\n", hres); return hres; } - if (FAILED(hres = IMemAllocator_GetBuffer(This->source.pAllocator, &out_sample, &start, &stop, 0))) - { - ERR("Failed to get sample, hr %#lx.\n", hres); + hres = BaseOutputPinImpl_GetDeliveryBuffer(&This->source, &out_sample, &start, &stop, 0); + if(FAILED(hres)) return hres; - } - - if (FAILED(hres = IMediaSample_SetTime(out_sample, &start, &stop))) - ERR("Failed to set time, hr %#lx.\n", hres); hres = IMediaSample_GetPointer(out_sample, &buf); if(FAILED(hres)) @@ -371,7 +366,7 @@ static HRESULT WINAPI AVICompressorIn_Receive(struct strmbase_sink *base, IMedia res = ICCompress(This->hic, sync_point ? ICCOMPRESS_KEYFRAME : 0, &This->videoinfo->bmiHeader, buf, &src_videoinfo->bmiHeader, ptr, 0, &comp_flags, This->frame_cnt, 0, 0, NULL, NULL); if(res != ICERR_OK) { - ERR("Failed to compress frame, error %Id.\n", res); + WARN("ICCompress failed: %d\n", res); IMediaSample_Release(out_sample); return E_FAIL; } @@ -388,7 +383,7 @@ static HRESULT WINAPI AVICompressorIn_Receive(struct strmbase_sink *base, IMedia hres = IMemInputPin_Receive(meminput, out_sample); if(FAILED(hres)) - WARN("Failed to deliver sample, hr %#lx.\n", hres); + WARN("Deliver failed: %08x\n", hres); IMediaSample_Release(out_sample); This->frame_cnt++; @@ -480,10 +475,7 @@ HRESULT avi_compressor_create(IUnknown *outer, IUnknown **out) object->IPersistPropertyBag_iface.lpVtbl = &PersistPropertyBagVtbl; strmbase_sink_init(&object->sink, &object->filter, L"In", &sink_ops, NULL); - wcscpy(object->sink.pin.name, L"Input"); - strmbase_source_init(&object->source, &object->filter, L"Out", &source_ops); - wcscpy(object->source.pin.name, L"Output"); TRACE("Created AVI compressor %p.\n", object); *out = &object->filter.IUnknown_inner; diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c index 2e8c2a96681..fe4add83b7c 100644 --- wine/dlls/qcap/avimux.c +++ wine/dlls/qcap/avimux.c @@ -684,7 +684,7 @@ static ULONG WINAPI ConfigAviMux_Release(IConfigAviMux *iface) static HRESULT WINAPI ConfigAviMux_SetMasterStream(IConfigAviMux *iface, LONG iStream) { AviMux *This = impl_from_IConfigAviMux(iface); - FIXME("filter %p, index %ld, stub!\n", This, iStream); + FIXME("(%p)->(%d)\n", This, iStream); return E_NOTIMPL; } @@ -925,7 +925,7 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG * DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags) { AviMux *This = impl_from_IMediaSeeking(iface); - FIXME("(%p)->(%p %#lx %p %#lx)\n", This, pCurrent, dwCurrentFlags, pStop, dwStopFlags); + FIXME("(%p)->(%p %x %p %x)\n", This, pCurrent, dwCurrentFlags, pStop, dwStopFlags); return E_NOTIMPL; } @@ -1177,12 +1177,9 @@ static HRESULT WINAPI AviMuxOut_DecideAllocator(struct strmbase_source *base, TRACE("(%p)->(%p %p)\n", base, pPin, pAlloc); - if (FAILED(hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, - CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)pAlloc))) - { - ERR("Failed to create allocator, hr %#lx.\n", hr); + hr = BaseOutputPinImpl_InitAllocator(base, pAlloc); + if(FAILED(hr)) return hr; - } hr = IMemInputPin_GetAllocatorRequirements(pPin, &req); if(FAILED(hr)) @@ -1232,14 +1229,13 @@ static ULONG WINAPI AviMuxOut_QualityControl_Release(IQualityControl *iface) } static HRESULT WINAPI AviMuxOut_QualityControl_Notify(IQualityControl *iface, - IBaseFilter *sender, Quality q) + IBaseFilter *pSelf, Quality q) { - AviMux *filter = impl_from_out_IQualityControl(iface); - - FIXME("filter %p, sender %p, type %#x, proportion %ld, late %s, timestamp %s, stub!\n", - filter, sender, q.Type, q.Proportion, - wine_dbgstr_longlong(q.Late), wine_dbgstr_longlong(q.TimeStamp)); - + AviMux *This = impl_from_out_IQualityControl(iface); + FIXME("(%p)->(%p { 0x%x %u %s %s })\n", This, pSelf, + q.Type, q.Proportion, + wine_dbgstr_longlong(q.Late), + wine_dbgstr_longlong(q.TimeStamp)); return E_NOTIMPL; } @@ -1519,14 +1515,14 @@ static ULONG WINAPI AviMuxIn_AMStreamControl_Release(IAMStreamControl *iface) static HRESULT WINAPI AviMuxIn_AMStreamControl_StartAt(IAMStreamControl *iface, const REFERENCE_TIME *start, DWORD cookie) { - FIXME("iface %p, start %p, cookie %#lx, stub!\n", iface, start, cookie); + FIXME("iface %p, start %p, cookie %#x, stub!\n", iface, start, cookie); return E_NOTIMPL; } static HRESULT WINAPI AviMuxIn_AMStreamControl_StopAt(IAMStreamControl *iface, const REFERENCE_TIME *stop, BOOL send_extra, DWORD cookie) { - FIXME("iface %p, stop %p, send_extra %d, cookie %#lx, stub!\n", iface, stop, send_extra, cookie); + FIXME("iface %p, stop %p, send_extra %d, cookie %#x, stub!\n", iface, stop, send_extra, cookie); return E_NOTIMPL; } @@ -1640,7 +1636,7 @@ static HRESULT WINAPI AviMuxIn_MemInputPin_ReceiveMultiple(IMemInputPin *iface, AviMuxIn *avimuxin = AviMuxIn_from_IMemInputPin(iface); HRESULT hr = S_OK; - TRACE("pin %p, pSamples %p, nSamples %ld, nSamplesProcessed %p.\n", + TRACE("pin %p, pSamples %p, nSamples %d, nSamplesProcessed %p.\n", avimuxin, pSamples, nSamples, nSamplesProcessed); for(*nSamplesProcessed=0; *nSamplesProcessedref); - TRACE("%p increasing refcount to %lu.\n", This, ref); - + TRACE("(%p/%p)->() AddRef from %d\n", This, iface, ref - 1); return ref; } static ULONG WINAPI fnCaptureGraphBuilder2_Release(ICaptureGraphBuilder2 * iface) { CaptureGraphImpl *This = impl_from_ICaptureGraphBuilder2(iface); - ULONG ref = InterlockedDecrement(&This->ref); + DWORD ref = InterlockedDecrement(&This->ref); - TRACE("%p decreasing refcount to %lu.\n", This, ref); + TRACE("(%p/%p)->() Release from %d\n", This, iface, ref + 1); if (!ref) { @@ -225,7 +224,7 @@ static BOOL pin_matches(IPin *pin, PIN_DIRECTION dir, const GUID *category, IPin *peer; if (FAILED(hr = IPin_QueryDirection(pin, &candidate_dir))) - ERR("Failed to query direction, hr %#lx.\n", hr); + ERR("Failed to query direction, hr %#x.\n", hr); if (dir != candidate_dir) return FALSE; @@ -273,7 +272,7 @@ static HRESULT find_interface_recurse(PIN_DIRECTION dir, const GUID *category, if (FAILED(hr = IBaseFilter_EnumPins(filter, &enumpins))) { - ERR("Failed to enumerate pins, hr %#lx.\n", hr); + ERR("Failed to enumerate pins, hr %#x.\n", hr); return hr; } @@ -443,7 +442,7 @@ static HRESULT match_smart_tee_pin(CaptureGraphImpl *This, } } if (FAILED(hr)) { - TRACE("adding SmartTee failed with hr=0x%08lx\n", hr); + TRACE("adding SmartTee failed with hr=0x%08x\n", hr); hr = E_INVALIDARG; goto end; } @@ -468,7 +467,7 @@ end: IPin_Release(peer); if (smartTee) IBaseFilter_Release(smartTee); - TRACE("for %s returning hr=0x%08lx, *source_out=%p\n", IsEqualIID(pCategory, &PIN_CATEGORY_CAPTURE) ? "capture" : "preview", hr, source_out ? *source_out : 0); + TRACE("for %s returning hr=0x%08x, *source_out=%p\n", IsEqualIID(pCategory, &PIN_CATEGORY_CAPTURE) ? "capture" : "preview", hr, source_out ? *source_out : 0); return hr; } diff --git a/dlls/qcap/filewriter.c b/dlls/qcap/filewriter.c index bc63abcb8cb..e49e6039604 100644 --- wine/dlls/qcap/filewriter.c +++ wine/dlls/qcap/filewriter.c @@ -68,27 +68,26 @@ static HRESULT WINAPI file_writer_sink_receive(struct strmbase_sink *iface, IMed struct file_writer *filter = impl_from_strmbase_pin(&iface->pin); REFERENCE_TIME start, stop; LARGE_INTEGER offset; - DWORD size, ret_size; HRESULT hr; + DWORD size; BYTE *data; if ((hr = IMediaSample_GetTime(sample, &start, &stop)) != S_OK) - ERR("Failed to get sample time, hr %#lx.\n", hr); - size = stop - start; + ERR("Failed to get sample time, hr %#x.\n", hr); if ((hr = IMediaSample_GetPointer(sample, &data)) != S_OK) - ERR("Failed to get sample pointer, hr %#lx.\n", hr); + ERR("Failed to get sample pointer, hr %#x.\n", hr); offset.QuadPart = start; if (!SetFilePointerEx(filter->file, offset, NULL, FILE_BEGIN) - || !WriteFile(filter->file, data, size, &ret_size, NULL)) + || !WriteFile(filter->file, data, stop - start, &size, NULL)) { - ERR("Failed to write file, error %lu.\n", GetLastError()); + ERR("Failed to write file, error %u.\n", GetLastError()); return HRESULT_FROM_WIN32(hr); } - if (ret_size != size) - ERR("Short write, %lu/%lu.\n", ret_size, size); + if (size != stop - start) + ERR("Short write, %u/%u.\n", size, (DWORD)(stop - start)); return S_OK; } @@ -176,7 +175,7 @@ static HRESULT file_writer_init_stream(struct strmbase_filter *iface) if ((file = CreateFileW(filter->filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL)) == INVALID_HANDLE_VALUE) { - ERR("Failed to create %s, error %lu.\n", debugstr_w(filter->filename), GetLastError()); + ERR("Failed to create %s, error %u.\n", debugstr_w(filter->filename), GetLastError()); return HRESULT_FROM_WIN32(GetLastError()); } filter->file = file; diff --git a/dlls/qcap/tests/Makefile.in b/dlls/qcap/tests/Makefile.in index 6e2fb2d4d2a..3fc00bf05ff 100644 --- wine/dlls/qcap/tests/Makefile.in +++ wine/dlls/qcap/tests/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES TESTDLL = qcap.dll IMPORTS = strmbase strmiids uuid oleaut32 ole32 advapi32 msvfw32 diff --git a/dlls/qcap/tests/audiorecord.c b/dlls/qcap/tests/audiorecord.c index 5705925a50d..350ae986b44 100644 --- wine/dlls/qcap/tests/audiorecord.c +++ wine/dlls/qcap/tests/audiorecord.c @@ -39,7 +39,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -110,53 +110,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_AudioRecord, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_AudioRecord, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static HRESULT WINAPI property_bag_QueryInterface(IPropertyBag *iface, REFIID iid, void **out) @@ -216,27 +216,27 @@ static void test_property_bag(IMoniker *mon) ULONG ref; hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&devenum_bag); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); VariantInit(&var); hr = IPropertyBag_Read(devenum_bag, L"WaveInId", &var, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ppb_id = V_I4(&var); hr = CoCreateInstance(&CLSID_AudioRecord, NULL, CLSCTX_INPROC_SERVER, &IID_IPersistPropertyBag, (void **)&ppb); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPersistPropertyBag_InitNew(ppb); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ppb_got_read = 0; hr = IPersistPropertyBag_Load(ppb, &property_bag, NULL); - ok(hr == S_OK || broken(hr == E_FAIL) /* 8+, intermittent */, "Got hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == E_FAIL) /* 8+, intermittent */, "Got hr %#x.\n", hr); ok(ppb_got_read == 1, "Got %u calls to Read().\n", ppb_got_read); ref = IPersistPropertyBag_Release(ppb); - ok(!ref, "Got unexpected refcount %ld.\n", ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); VariantClear(&var); IPropertyBag_Release(devenum_bag); @@ -248,49 +248,49 @@ static void test_unconnected_filter_state(IBaseFilter *filter) HRESULT hr; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - todo_wine ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - todo_wine ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); } @@ -308,7 +308,7 @@ START_TEST(audiorecord) hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, &IID_ICreateDevEnum, (void **)&devenum); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ICreateDevEnum_CreateClassEnumerator(devenum, &CLSID_AudioInputDeviceCategory, &enummon, 0); if (hr == S_FALSE) { @@ -317,27 +317,27 @@ START_TEST(audiorecord) CoUninitialize(); return; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_aggregation(); while (IEnumMoniker_Next(enummon, 1, &mon, NULL) == S_OK) { hr = IMoniker_GetDisplayName(mon, NULL, NULL, &name); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); trace("Testing device %s.\n", wine_dbgstr_w(name)); CoTaskMemFree(name); test_property_bag(mon); hr = IMoniker_BindToObject(mon, NULL, NULL, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_interfaces(filter); test_unconnected_filter_state(filter); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMoniker_Release(mon); } diff --git a/dlls/qcap/tests/avico.c b/dlls/qcap/tests/avico.c index abd4fa8e5e7..332ca5a8e7d 100644 --- wine/dlls/qcap/tests/avico.c +++ wine/dlls/qcap/tests/avico.c @@ -35,7 +35,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -138,53 +138,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_AVICo, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_AVICo, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(IBaseFilter *filter) @@ -195,110 +195,110 @@ static void test_enum_pins(IBaseFilter *filter) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 3); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); @@ -312,28 +312,28 @@ static void test_find_pin(IBaseFilter *filter) HRESULT hr; hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Output", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); IEnumPins_Release(enum_pins); } @@ -347,42 +347,42 @@ static void test_pin_info(IBaseFilter *filter) IPin *pin; hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); - ok(!lstrcmpW(info.achName, L"Input"), "Got name %s.\n", wine_dbgstr_w(info.achName)); + todo_wine ok(!lstrcmpW(info.achName, L"Input"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!lstrcmpW(id, L"In"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); - ok(!lstrcmpW(info.achName, L"Output"), "Got name %s.\n", wine_dbgstr_w(info.achName)); + todo_wine ok(!lstrcmpW(info.achName, L"Output"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!lstrcmpW(id, L"Out"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); @@ -392,7 +392,7 @@ static void test_pin_info(IBaseFilter *filter) static LRESULT CALLBACK driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, LPARAM lparam1, LPARAM lparam2) { - if (winetest_debug > 1) trace("msg %#x, lparam1 %#Ix, lparam2 %#Ix.\n", msg, lparam1, lparam2); + if (winetest_debug > 1) trace("msg %#x, lparam1 %#lx, lparam2 %#lx.\n", msg, lparam1, lparam2); switch (msg) { @@ -478,27 +478,27 @@ static void test_property_bag(IMoniker *mon) ULONG ref; hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&devenum_bag); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); VariantInit(&var); hr = IPropertyBag_Read(devenum_bag, L"FccHandler", &var, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ppb_handler = V_BSTR(&var); hr = CoCreateInstance(&CLSID_AVICo, NULL, CLSCTX_INPROC_SERVER, &IID_IPersistPropertyBag, (void **)&ppb); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPersistPropertyBag_InitNew(ppb); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ppb_got_read = 0; hr = IPersistPropertyBag_Load(ppb, &property_bag, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ppb_got_read == 1, "Got %u calls to Read().\n", ppb_got_read); ref = IPersistPropertyBag_Release(ppb); - ok(!ref, "Got unexpected refcount %ld.\n", ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); VariantClear(&var); IPropertyBag_Release(devenum_bag); @@ -520,10 +520,10 @@ static void test_media_types(IBaseFilter *filter) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); @@ -532,11 +532,11 @@ static void test_media_types(IBaseFilter *filter) mt.cbFormat = sizeof(VIDEOINFOHEADER); mt.pbFormat = (BYTE *)&vih; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); vih.bmiHeader.biBitCount = 32; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); vih.bmiHeader.biBitCount = 16; mt.bFixedSizeSamples = TRUE; @@ -544,22 +544,22 @@ static void test_media_types(IBaseFilter *filter) mt.lSampleSize = 123; mt.subtype = MEDIASUBTYPE_RGB565; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_WAVE; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.formattype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.formattype = FORMAT_None; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.formattype = FORMAT_VideoInfo; mt.majortype = MEDIATYPE_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; IPin_Release(pin); @@ -567,10 +567,10 @@ static void test_media_types(IBaseFilter *filter) IBaseFilter_FindPin(filter, L"Out", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); @@ -587,29 +587,29 @@ static void test_enum_media_types(IBaseFilter *filter) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum1); IEnumMediaTypes_Release(enum2); @@ -618,29 +618,29 @@ static void test_enum_media_types(IBaseFilter *filter) IBaseFilter_FindPin(filter, L"Out", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum1); IEnumMediaTypes_Release(enum2); @@ -653,49 +653,49 @@ static void test_unconnected_filter_state(IBaseFilter *filter) HRESULT hr; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); } @@ -719,18 +719,18 @@ START_TEST(avico) hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, &IID_ICreateDevEnum, (void **)&devenum); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ICreateDevEnum_CreateClassEnumerator(devenum, &CLSID_VideoCompressorCategory, &enummon, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (IEnumMoniker_Next(enummon, 1, &mon, NULL) == S_OK) { hr = IMoniker_GetDisplayName(mon, NULL, NULL, &name); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (!lstrcmpW(name, test_display_name)) { hr = IMoniker_BindToObject(mon, NULL, NULL, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_aggregation(); test_interfaces(filter); @@ -742,7 +742,7 @@ START_TEST(avico) test_unconnected_filter_state(filter); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } if (!memcmp(name, test_display_name, 11 * sizeof(WCHAR))) diff --git a/dlls/qcap/tests/avimux.c b/dlls/qcap/tests/avimux.c index 8d11c5cbf04..70575281cee 100644 --- wine/dlls/qcap/tests/avimux.c +++ wine/dlls/qcap/tests/avimux.c @@ -30,7 +30,7 @@ static IBaseFilter *create_avi_mux(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_AviDest, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -51,7 +51,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -159,53 +159,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_AviDest, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_AviDest, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -217,116 +217,116 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 3); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -338,27 +338,27 @@ static void test_find_pin(void) ULONG ref; hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"AVI Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"Input 01", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -372,63 +372,63 @@ static void test_pin_info(void) IPin *pin; hr = IBaseFilter_FindPin(filter, L"AVI Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); ok(!lstrcmpW(info.achName, L"AVI Out"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!lstrcmpW(id, L"AVI Out"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Input 01", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); ok(!lstrcmpW(info.achName, L"Input 01"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!lstrcmpW(id, L"Input 01"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_media_types(void) @@ -445,53 +445,53 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"AVI Out", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Stream), "Got major type %s\n", wine_dbgstr_guid(&pmt->majortype)); ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_Avi), "Got subtype %s\n", wine_dbgstr_guid(&pmt->subtype)); ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples); ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); - ok(pmt->lSampleSize == 1, "Got sample size %lu.\n", pmt->lSampleSize); + ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); ok(IsEqualGUID(&pmt->formattype, &GUID_NULL), "Got format type %s.\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); - ok(!pmt->cbFormat, "Got format size %lu.\n", pmt->cbFormat); - ok(!pmt->pbFormat, "Got format block %lu.\n", pmt->cbFormat); + ok(!pmt->cbFormat, "Got format size %u.\n", pmt->cbFormat); + ok(!pmt->pbFormat, "Got format block %u.\n", pmt->cbFormat); hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->bFixedSizeSamples = FALSE; pmt->bTemporalCompression = TRUE; pmt->lSampleSize = 123; pmt->formattype = FORMAT_VideoInfo; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->majortype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Stream; pmt->subtype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_RGB8; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_Avi; CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); @@ -499,10 +499,10 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"Input 01", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); @@ -512,46 +512,46 @@ static void test_media_types(void) mt.pbFormat = (BYTE *)&wfx; wfx.nBlockAlign = 1; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_RGB8; mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = TRUE; mt.lSampleSize = 123; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Interleaved; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; mt.formattype = FORMAT_VideoInfo; mt.cbFormat = sizeof(vih); mt.pbFormat = (BYTE *)&vih; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Audio; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Interleaved; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_enum_media_types(void) @@ -566,61 +566,61 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"AVI Out", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(mts[0]); IEnumMediaTypes_Release(enum1); @@ -630,36 +630,36 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"Input 01", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_seeking(void) @@ -693,109 +693,109 @@ static void test_seeking(void) IBaseFilter_QueryInterface(filter, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(caps == (AM_SEEKING_CanGetCurrentPos | AM_SEEKING_CanGetDuration), "Got caps %#lx.\n", caps); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(caps == (AM_SEEKING_CanGetCurrentPos | AM_SEEKING_CanGetDuration), "Got caps %#x.\n", caps); caps = AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanGetCurrentPos, "Got caps %#lx.\n", caps); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanGetCurrentPos, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanDoSegments | AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(caps == AM_SEEKING_CanGetCurrentPos, "Got caps %#lx.\n", caps); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(caps == AM_SEEKING_CanGetCurrentPos, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanDoSegments; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(!caps, "Got caps %#lx.\n", caps); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(!caps, "Got caps %#x.\n", caps); for (i = 0; i < ARRAY_SIZE(format_tests); ++i) { hr = IMediaSeeking_IsFormatSupported(seeking, format_tests[i].guid); - todo_wine ok(hr == format_tests[i].hr, "Got hr %#lx for format %s.\n", hr, wine_dbgstr_guid(format_tests[i].guid)); + todo_wine ok(hr == format_tests[i].hr, "Got hr %#x for format %s.\n", hr, wine_dbgstr_guid(format_tests[i].guid)); } hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_BYTE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_SAMPLE); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_BYTE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &TIME_FORMAT_BYTE), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_BYTE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_BYTE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 0x123456789a, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, &TIME_FORMAT_BYTE); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); current = 0x123; stop = 0x321; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_NoPositioning, &stop, AM_SEEKING_NoPositioning); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPositions(seeking, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPositions(seeking, NULL, &stop); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPositions(seeking, ¤t, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetDuration(seeking, &time); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) ok(!time, "Got duration %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) ok(!time, "Got duration %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IMediaSeeking_Release(seeking); ref = IBaseFilter_Release(filter); - ok(!ref, "Got unexpected refcount %ld.\n", ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -806,53 +806,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(avimux) diff --git a/dlls/qcap/tests/capturegraph.c b/dlls/qcap/tests/capturegraph.c index 1fade929331..cdd9a27828a 100644 --- wine/dlls/qcap/tests/capturegraph.c +++ wine/dlls/qcap/tests/capturegraph.c @@ -29,7 +29,7 @@ static ICaptureGraphBuilder2 *create_capture_graph(void) ICaptureGraphBuilder2 *ret; HRESULT hr = CoCreateInstance(&CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, &IID_ICaptureGraphBuilder2, (void **)&ret); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create capture graph builder, hr %#x.\n", hr); return ret; } @@ -149,10 +149,10 @@ static HRESULT WINAPI property_set_Get(IKsPropertySet *iface, REFGUID set, DWORD if (winetest_debug > 1) trace("%s->Get()\n", debugstr_w(pin->pin.pin.name)); ok(IsEqualGUID(set, &ROPSETID_Pin), "Got set %s.\n", debugstr_guid(set)); - ok(id == AMPROPERTY_PIN_CATEGORY, "Got id %#lx.\n", id); + ok(id == AMPROPERTY_PIN_CATEGORY, "Got id %#x.\n", id); ok(!instance_data, "Got instance data %p.\n", instance_data); - ok(!instance_size, "Got instance size %lu.\n", instance_size); - ok(property_size == sizeof(GUID), "Got property size %lu.\n", property_size); + ok(!instance_size, "Got instance size %u.\n", instance_size); + ok(property_size == sizeof(GUID), "Got property size %u.\n", property_size); ok(!!ret_size, "Expected non-NULL return size.\n"); memcpy(property_data, &pin->category, sizeof(GUID)); return S_OK; @@ -368,7 +368,7 @@ static void test_find_interface(void) CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (void **)&graph); hr = ICaptureGraphBuilder2_SetFiltergraph(capture_graph, graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testfilter_init(&filter1); IGraphBuilder_AddFilter(graph, &filter1.filter.IBaseFilter_iface, L"filter1"); @@ -378,21 +378,21 @@ static void test_find_interface(void) IGraphBuilder_AddFilter(graph, &filter3.filter.IBaseFilter_iface, L"filter3"); hr = IGraphBuilder_ConnectDirect(graph, &filter1.source1.pin.pin.IPin_iface, &filter2.sink1.pin.pin.IPin_iface, &mt1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IGraphBuilder_ConnectDirect(graph, &filter2.source1.pin.pin.IPin_iface, &filter3.sink1.pin.pin.IPin_iface, &mt2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Test search order without any restrictions applied. */ hr = ICaptureGraphBuilder2_FindInterface(capture_graph, NULL, &bogus_majortype, NULL, &testiid, (void **)&unk); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "got hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(tests_from_filter2); ++i) { hr = ICaptureGraphBuilder2_FindInterface(capture_graph, NULL, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Test %u: got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr); ok(unk == tests_from_filter2[i].iface, "Test %u: got wrong interface %p.\n", i, unk); IUnknown_Release(unk); *tests_from_filter2[i].expose = FALSE; @@ -400,7 +400,7 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, NULL, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); reset_interfaces(&filter1); reset_interfaces(&filter2); @@ -410,7 +410,7 @@ static void test_find_interface(void) { hr = ICaptureGraphBuilder2_FindInterface(capture_graph, NULL, &bogus_majortype, &filter1.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Test %u: got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr); ok(unk == tests_from_filter1[i].iface, "Test %u: got wrong interface %p.\n", i, unk); IUnknown_Release(unk); *tests_from_filter1[i].expose = FALSE; @@ -418,7 +418,7 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, NULL, &bogus_majortype, &filter1.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); /* Test with upstream/downstream flags. */ @@ -430,7 +430,7 @@ static void test_find_interface(void) { hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &LOOK_UPSTREAM_ONLY, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Test %u: got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr); ok(unk == look_upstream_tests[i].iface, "Test %u: got wrong interface %p.\n", i, unk); IUnknown_Release(unk); *look_upstream_tests[i].expose = FALSE; @@ -438,7 +438,7 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &LOOK_UPSTREAM_ONLY, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); reset_interfaces(&filter1); reset_interfaces(&filter2); @@ -448,7 +448,7 @@ static void test_find_interface(void) { hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &LOOK_DOWNSTREAM_ONLY, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Test %u: got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr); ok(unk == look_downstream_tests[i].iface, "Test %u: got wrong interface %p.\n", i, unk); IUnknown_Release(unk); *look_downstream_tests[i].expose = FALSE; @@ -456,7 +456,7 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &LOOK_DOWNSTREAM_ONLY, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); /* Test with a category flag. */ @@ -466,20 +466,20 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x\n", hr); ok(unk == (IUnknown *)&filter2.filter.IBaseFilter_iface, "Got wrong interface %p.\n", unk); IUnknown_Release(unk); filter2.filter_has_iface = FALSE; hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); filter2.source1.IKsPropertySet_iface.lpVtbl = &property_set_vtbl; filter2.source1.category = PIN_CATEGORY_CAPTURE; hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk == (IUnknown *)&filter2.source1.pin.pin.IPin_iface, "Got wrong interface %p.\n", unk); IUnknown_Release(unk); filter2.source1.has_iface = FALSE; @@ -492,7 +492,7 @@ static void test_find_interface(void) { hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Test %u: got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr); ok(unk == category_tests[i].iface, "Test %u: got wrong interface %p.\n", i, unk); IUnknown_Release(unk); *category_tests[i].expose = FALSE; @@ -500,7 +500,7 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); /* Test with a media type. */ @@ -512,22 +512,22 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x\n", hr); ok(unk == (IUnknown *)&filter2.filter.IBaseFilter_iface, "Got wrong interface %p.\n", unk); IUnknown_Release(unk); filter2.filter_has_iface = FALSE; hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, &bogus_majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, &mt2.majortype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, &testtype, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk == (IUnknown *)&filter2.source1.pin.pin.IPin_iface, "Got wrong interface %p.\n", unk); IUnknown_Release(unk); filter2.source1.has_iface = FALSE; @@ -538,7 +538,7 @@ static void test_find_interface(void) { hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == S_OK, "Test %u: got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: got hr %#x.\n", i, hr); ok(unk == category_tests[i].iface, "Test %u: got wrong interface %p.\n", i, unk); IUnknown_Release(unk); *category_tests[i].expose = FALSE; @@ -546,18 +546,18 @@ static void test_find_interface(void) hr = ICaptureGraphBuilder2_FindInterface(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, &filter2.filter.IBaseFilter_iface, &testiid, (void **)&unk); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); ref = ICaptureGraphBuilder2_Release(capture_graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IGraphBuilder_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&filter1.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&filter2.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&filter3.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -578,7 +578,7 @@ static void test_find_pin(void) CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (void **)&graph); hr = ICaptureGraphBuilder2_SetFiltergraph(capture_graph, graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testfilter_init(&filter1); testfilter_init(&filter2); @@ -587,51 +587,51 @@ static void test_find_pin(void) hr = IGraphBuilder_ConnectDirect(graph, &filter1.source1.pin.pin.IPin_iface, &filter2.sink1.pin.pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_INPUT, NULL, NULL, FALSE, 0, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == &filter1.sink1.pin.pin.IPin_iface, "Got wrong pin.\n"); IPin_Release(pin); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_INPUT, NULL, NULL, FALSE, 1, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == &filter1.sink2.pin.pin.IPin_iface, "Got wrong pin.\n"); IPin_Release(pin); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_INPUT, NULL, NULL, FALSE, 2, &pin); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_OUTPUT, NULL, NULL, FALSE, 0, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == &filter1.source1.pin.pin.IPin_iface, "Got wrong pin.\n"); IPin_Release(pin); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_OUTPUT, NULL, NULL, FALSE, 1, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == &filter1.source2.pin.pin.IPin_iface, "Got wrong pin.\n"); IPin_Release(pin); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_OUTPUT, NULL, NULL, FALSE, 2, &pin); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); /* Test the unconnected flag. */ hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_OUTPUT, NULL, NULL, TRUE, 0, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == &filter1.source2.pin.pin.IPin_iface, "Got wrong pin.\n"); IPin_Release(pin); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_OUTPUT, NULL, NULL, TRUE, 1, &pin); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); /* Test categories. */ @@ -640,31 +640,31 @@ static void test_find_pin(void) hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_OUTPUT, &PIN_CATEGORY_CAPTURE, NULL, FALSE, 0, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == &filter1.source1.pin.pin.IPin_iface, "Got wrong pin.\n"); IPin_Release(pin); hr = ICaptureGraphBuilder2_FindPin(capture_graph, (IUnknown *)&filter1.filter.IBaseFilter_iface, PINDIR_OUTPUT, &PIN_CATEGORY_CAPTURE, NULL, FALSE, 1, &pin); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); ref = ICaptureGraphBuilder2_Release(capture_graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IGraphBuilder_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&filter1.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&filter2.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void disconnect_pins(IGraphBuilder *graph, struct testsource *pin) { HRESULT hr; hr = IGraphBuilder_Disconnect(graph, pin->pin.pin.peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IGraphBuilder_Disconnect(graph, &pin->pin.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void check_smart_tee_pin_(int line, IPin *pin, const WCHAR *name) @@ -694,7 +694,7 @@ static void test_render_stream(void) CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (void **)&graph); hr = ICaptureGraphBuilder2_SetFiltergraph(capture_graph, graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testfilter_init(&source); testfilter_init(&transform); @@ -711,7 +711,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); @@ -719,7 +719,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); todo_wine ok(source.source2.pin.pin.peer == &transform.sink2.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -727,14 +727,14 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); todo_wine disconnect_pins(graph, &source.source2); todo_wine disconnect_pins(graph, &transform.source2); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&transform.source2.pin.pin.IPin_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source2.pin.pin.peer == &sink.sink2.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -742,20 +742,20 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); disconnect_pins(graph, &transform.source2); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &transform.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); todo_wine ok(source.source2.pin.pin.peer == &transform.sink2.pin.pin.IPin_iface, "Got wrong connection.\n"); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); todo_wine ok(source.source2.pin.pin.peer == &transform.sink2.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -766,7 +766,7 @@ static void test_render_stream(void) /* Test from a source pin. */ hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.source1.pin.pin.IPin_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); todo_wine ok(transform.source2.pin.pin.peer == &sink.sink2.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -777,7 +777,7 @@ static void test_render_stream(void) source.source_type = bad_type; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); source.source_type = source_type; disconnect_pins(graph, &transform.source1); @@ -791,7 +791,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, &identity.filter.IBaseFilter_iface, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &identity.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(identity.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -803,7 +803,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, &identity.filter.IBaseFilter_iface, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); ok(!source.source1.pin.pin.peer, "Pin should not be connected.\n"); ok(!identity.source1.pin.pin.peer, "Pin should not be connected.\n"); ok(!transform.source1.pin.pin.peer, "Pin should not be connected.\n"); @@ -813,7 +813,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, &identity.filter.IBaseFilter_iface, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &identity.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(identity.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -825,7 +825,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, &identity.filter.IBaseFilter_iface, &sink.filter.IBaseFilter_iface); - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &identity.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(!identity.source1.pin.pin.peer, "Pin should not be connected.\n"); @@ -836,7 +836,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, &bad_type, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!source.source1.pin.pin.peer, "Pin should not be connected.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); ok(!sink.sink1.pin.pin.peer, "Pin should not be connected.\n"); @@ -844,7 +844,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, &sink1_type, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!source.source1.pin.pin.peer, "Pin should not be connected.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); ok(!sink.sink1.pin.pin.peer, "Pin should not be connected.\n"); @@ -855,7 +855,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, &sink1_type, (IUnknown *)&source.filter.IBaseFilter_iface, &identity.filter.IBaseFilter_iface, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!source.source1.pin.pin.peer, "Pin should not be connected.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); ok(!sink.sink1.pin.pin.peer, "Pin should not be connected.\n"); @@ -863,7 +863,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, &source_type, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); @@ -871,7 +871,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, NULL, &sink1_type, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source2.pin.pin.peer == &sink.sink2.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -885,7 +885,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CC, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); ok(!source.source1.pin.pin.peer, "Pin should not be connected.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); ok(!sink.sink1.pin.pin.peer, "Pin should not be connected.\n"); @@ -894,7 +894,7 @@ static void test_render_stream(void) source.source1.IKsPropertySet_iface.lpVtbl = &property_set_vtbl; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CC, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); ok(!source.source1.pin.pin.peer, "Pin should not be connected.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); ok(!sink.sink1.pin.pin.peer, "Pin should not be connected.\n"); @@ -903,7 +903,7 @@ static void test_render_stream(void) source.source1.category = PIN_CATEGORY_CC; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CC, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(!source.source2.pin.pin.peer, "Pin should not be connected.\n"); @@ -913,7 +913,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CC, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(!transform.source1.pin.pin.peer, "Pin should not be connected.\n"); @@ -921,14 +921,14 @@ static void test_render_stream(void) transform.source1.category = PIN_CATEGORY_CC; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CC, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); todo_wine ok(!transform.source1.pin.pin.peer, "Pin should not be connected.\n"); todo_wine ok(!sink.sink1.pin.pin.peer, "Pin should not be connected.\n"); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CC, NULL, (IUnknown *)&source.source1.pin.pin.IPin_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); disconnect_pins(graph, &source.source1); @@ -937,53 +937,53 @@ static void test_render_stream(void) source.source1.IKsPropertySet_iface.lpVtbl = transform.source1.IKsPropertySet_iface.lpVtbl = NULL; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); source.source1.IKsPropertySet_iface.lpVtbl = &property_set_vtbl; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); source.source1.category = PIN_CATEGORY_PREVIEW; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); ok(!source.source1.pin.pin.peer, "Pin should not be connected.\n"); todo_wine ok(!sink.sink1.pin.pin.peer, "Pin should not be connected.\n"); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); disconnect_pins(graph, &transform.source1); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); todo_wine disconnect_pins(graph, &source.source1); source.source1.category = PIN_CATEGORY_CAPTURE; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_smart_tee_pin(source.source1.pin.pin.peer, L"Input"); check_smart_tee_pin(transform.sink1.pin.pin.peer, L"Capture"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == VFW_S_NOPREVIEWPIN, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_NOPREVIEWPIN, "Got hr %#x.\n", hr); check_smart_tee_pin(source.source1.pin.pin.peer, L"Input"); check_smart_tee_pin(transform.sink1.pin.pin.peer, L"Capture"); check_smart_tee_pin(transform.sink2.pin.pin.peer, L"Preview"); @@ -996,18 +996,18 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CC, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == VFW_S_NOPREVIEWPIN, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_NOPREVIEWPIN, "Got hr %#x.\n", hr); check_smart_tee_pin(source.source1.pin.pin.peer, L"Input"); check_smart_tee_pin(transform.sink1.pin.pin.peer, L"Preview"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); disconnect_pins(graph, &source.source1); IGraphBuilder_RemoveFilter(graph, &transform.filter.IBaseFilter_iface); @@ -1018,7 +1018,7 @@ static void test_render_stream(void) source.source1.category = PIN_CATEGORY_CAPTURE; hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.source1.pin.pin.IPin_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_smart_tee_pin(source.source1.pin.pin.peer, L"Input"); check_smart_tee_pin(transform.sink1.pin.pin.peer, L"Capture"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -1033,7 +1033,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source1.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); disconnect_pins(graph, &source.source1); @@ -1041,7 +1041,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_PREVIEW, NULL, (IUnknown *)&source.filter.IBaseFilter_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source.source2.pin.pin.peer == &transform.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); disconnect_pins(graph, &source.source2); @@ -1049,7 +1049,7 @@ static void test_render_stream(void) hr = ICaptureGraphBuilder2_RenderStream(capture_graph, &PIN_CATEGORY_CAPTURE, NULL, (IUnknown *)&source.source1.pin.pin.IPin_iface, NULL, &sink.filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_smart_tee_pin(source.source1.pin.pin.peer, L"Input"); check_smart_tee_pin(transform.sink1.pin.pin.peer, L"Capture"); ok(transform.source1.pin.pin.peer == &sink.sink1.pin.pin.IPin_iface, "Got wrong connection.\n"); @@ -1057,15 +1057,15 @@ static void test_render_stream(void) disconnect_pins(graph, &transform.source1); ref = ICaptureGraphBuilder2_Release(capture_graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IGraphBuilder_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&transform.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&sink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(capturegraph) diff --git a/dlls/qcap/tests/filewriter.c b/dlls/qcap/tests/filewriter.c index 3713af1a43a..d6dbc3faded 100644 --- wine/dlls/qcap/tests/filewriter.c +++ wine/dlls/qcap/tests/filewriter.c @@ -28,7 +28,7 @@ static IBaseFilter *create_file_writer(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_FileWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -45,7 +45,7 @@ static WCHAR *set_filename(IBaseFilter *filter) IBaseFilter_QueryInterface(filter, &IID_IFileSinkFilter, (void **)&filesink); hr = IFileSinkFilter_SetFileName(filesink, filename, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IFileSinkFilter_Release(filesink); return filename; } @@ -67,7 +67,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -112,7 +112,7 @@ static void test_interfaces(void) IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got unexpected refcount %ld.\n", ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); } static const GUID test_iid = {0x33333333}; @@ -160,53 +160,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_FileWriter, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_FileWriter, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -218,85 +218,85 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -308,19 +308,19 @@ static void test_find_pin(void) ULONG ref; hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"in", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin2 == pin, "Expected pin %p, got %p.\n", pin, pin2); IPin_Release(pin2); IPin_Release(pin); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -334,38 +334,38 @@ static void test_pin_info(void) IPin *pin; hr = IBaseFilter_FindPin(filter, L"in", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"in"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"in"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_media_types(void) @@ -381,52 +381,52 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"in", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Audio; mt.subtype = MEDIASUBTYPE_PCM; mt.formattype = FORMAT_WaveFormatEx; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); filename = set_filename(filter); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); memset(&mt, 0, sizeof(AM_MEDIA_TYPE)); hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Audio; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_PCM; mt.formattype = FORMAT_WaveFormatEx; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ok(GetFileAttributesW(filename) == INVALID_FILE_ATTRIBUTES, "File should not exist.\n"); } @@ -442,36 +442,36 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"in", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -533,33 +533,33 @@ static void test_allocator(IMemInputPin *input, IMemAllocator *allocator) memset(&props, 0xcc, sizeof(props)); hr = IMemInputPin_GetAllocatorRequirements(input, &props); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { - ok(!props.cBuffers, "Got %ld buffers.\n", props.cBuffers); - ok(!props.cbBuffer, "Got size %ld.\n", props.cbBuffer); - ok(props.cbAlign == 512, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(!props.cBuffers, "Got %d buffers.\n", props.cBuffers); + ok(!props.cbBuffer, "Got size %d.\n", props.cbBuffer); + ok(props.cbAlign == 512, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); } hr = IMemInputPin_GetAllocator(input, &ret_allocator); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMemInputPin_NotifyAllocator(input, NULL, TRUE); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); props.cBuffers = 1; props.cbBuffer = 512; props.cbAlign = 512; props.cbPrefix = 0; hr = IMemAllocator_SetProperties(allocator, &props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_NotifyAllocator(input, allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); if (hr == S_OK) IMemAllocator_Release(ret_allocator); } @@ -570,50 +570,50 @@ static void test_filter_state(IMediaControl *control) HRESULT hr; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); } static void test_sample_processing(IMediaControl *control, IMemInputPin *input, @@ -628,53 +628,53 @@ static void test_sample_processing(IMediaControl *control, IMemInputPin *input, LONG size; hr = IMemInputPin_ReceiveCanBlock(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); size = IMediaSample_GetSize(sample); - ok(size == 512, "Got size %ld.\n", size); + ok(size == 512, "Got size %d.\n", size); memset(data, 0xcc, size); start = 0; stop = 512; hr = IMediaSample_SetTime(sample, &start, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); strcpy((char *)data, "abcdefghi"); hr = IMediaSample_SetActualDataLength(sample, 9); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(data, 0xcc, size); strcpy((char *)data, "123456"); hr = IMediaSample_SetActualDataLength(sample, 6); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); file = _wfopen(filename, L"rb"); ok(!!file, "Failed to open file: %s.\n", strerror(errno)); size = fread(buffer, 1, sizeof(buffer), file); - ok(size == 512, "Got size %ld.\n", size); + ok(size == 512, "Got size %d.\n", size); ok(!memcmp(buffer, "123456\0\xcc\xcc\xcc", 10), "Got data %s.\n", debugstr_an((char *)buffer, size)); fclose(file); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaSample_Release(sample); } @@ -689,14 +689,14 @@ static unsigned int check_ec_complete(IMediaEvent *eventsrc, DWORD timeout) { if (code == EC_COMPLETE) { - ok(param1 == S_OK, "Got param1 %#Ix.\n", param1); - ok(!param2, "Got param2 %#Ix.\n", param2); + ok(param1 == S_OK, "Got param1 %#lx.\n", param1); + ok(!param2, "Got param2 %#lx.\n", param2); ret++; } IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); timeout = 0; } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); return ret; } @@ -710,22 +710,22 @@ static void test_eos(IFilterGraph2 *graph, IMediaControl *control, IPin *pin) IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Expected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaEvent_Release(eventsrc); } @@ -755,47 +755,47 @@ static void test_connect_pin(void) CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&graph); IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); hr = IFilterGraph2_AddFilter(graph, filter, L"filewriter"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, L"source"); IBaseFilter_FindPin(filter, L"in", &pin); IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&meminput); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Stream; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(pin, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &source.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&mt, &req_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - todo_wine ok(hr == VFW_E_NO_ALLOCATOR, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NO_ALLOCATOR, "Got hr %#x.\n", hr); CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&allocator); @@ -806,33 +806,33 @@ static void test_connect_pin(void) test_eos(graph, control, pin); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source.source.pin.peer == pin, "Got peer %p.\n", source.source.pin.peer); IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMemInputPin_Release(meminput); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IMemAllocator_Release(allocator); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_misc_flags(void) @@ -844,11 +844,11 @@ static void test_misc_flags(void) IBaseFilter_QueryInterface(filter, &IID_IAMFilterMiscFlags, (void **)&misc_flags); flags = IAMFilterMiscFlags_GetMiscFlags(misc_flags); - ok(flags == AM_FILTER_MISC_FLAGS_IS_RENDERER, "Got flags %#lx.\n", flags); + ok(flags == AM_FILTER_MISC_FLAGS_IS_RENDERER, "Got flags %#x.\n", flags); IAMFilterMiscFlags_Release(misc_flags); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(filewriter) diff --git a/dlls/qcap/tests/qcap.c b/dlls/qcap/tests/qcap.c index a1e3e31bfff..d1b2cb810f4 100644 --- wine/dlls/qcap/tests/qcap.c +++ wine/dlls/qcap/tests/qcap.c @@ -499,7 +499,7 @@ static HRESULT WINAPI EnumPins_Next(IEnumPins *iface, test_filter *This = impl_from_IEnumPins(iface); check_calls_list("EnumPins_Next", ENUMPINS_NEXT, This->filter_type); - ok(cPins == 1, "cPins = %ld\n", cPins); + ok(cPins == 1, "cPins = %d\n", cPins); ok(ppPins != NULL, "ppPins == NULL\n"); ok(pcFetched != NULL, "pcFetched == NULL\n"); @@ -601,11 +601,11 @@ static HRESULT WINAPI Pin_ReceiveConnection(IPin *iface, wine_dbgstr_guid(&pmt->subtype)); ok(pmt->bFixedSizeSamples, "bFixedSizeSamples = %x\n", pmt->bFixedSizeSamples); ok(!pmt->bTemporalCompression, "bTemporalCompression = %x\n", pmt->bTemporalCompression); - ok(pmt->lSampleSize == 1, "lSampleSize = %ld\n", pmt->lSampleSize); + ok(pmt->lSampleSize == 1, "lSampleSize = %d\n", pmt->lSampleSize); ok(IsEqualIID(&pmt->formattype, &GUID_NULL), "formattype = %s\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "pUnk = %p\n", pmt->pUnk); - ok(!pmt->cbFormat, "cbFormat = %ld\n", pmt->cbFormat); + ok(!pmt->cbFormat, "cbFormat = %d\n", pmt->cbFormat); ok(!pmt->pbFormat, "pbFormat = %p\n", pmt->pbFormat); return S_OK; } @@ -758,10 +758,10 @@ static HRESULT WINAPI KsPropertySet_Get(IKsPropertySet *iface, REFGUID guidPropS check_calls_list("KsPropertySet_Get", KSPROPERTYSET_GET, This->filter_type); ok(IsEqualIID(guidPropSet, &ROPSETID_Pin), "guidPropSet = %s\n", wine_dbgstr_guid(guidPropSet)); - ok(dwPropID == 0, "dwPropID = %ld\n", dwPropID); + ok(dwPropID == 0, "dwPropID = %d\n", dwPropID); ok(pInstanceData == NULL, "pInstanceData != NULL\n"); ok(cbInstanceData == 0, "cbInstanceData != 0\n"); - ok(cbPropData == sizeof(GUID), "cbPropData = %ld\n", cbPropData); + ok(cbPropData == sizeof(GUID), "cbPropData = %d\n", cbPropData); *pcbReturned = sizeof(GUID); memcpy(pPropData, &PIN_CATEGORY_EDS, sizeof(GUID)); return S_OK; @@ -829,11 +829,11 @@ static HRESULT WINAPI MemInputPin_NotifyAllocator(IMemInputPin *iface, ok(bReadOnly, "bReadOnly = %x\n", bReadOnly); hr = IMemAllocator_GetProperties(pAllocator, &ap); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(ap.cBuffers == 32, "cBuffers = %ld\n", ap.cBuffers); - ok(ap.cbBuffer == 0, "cbBuffer = %ld\n", ap.cbBuffer); - ok(ap.cbAlign == 1, "cbAlign = %ld\n", ap.cbAlign); - ok(ap.cbPrefix == 0, "cbPrefix = %ld\n", ap.cbPrefix); + ok(hr == S_OK, "GetProperties returned %x\n", hr); + ok(ap.cBuffers == 32, "cBuffers = %d\n", ap.cBuffers); + ok(ap.cbBuffer == 0, "cbBuffer = %d\n", ap.cbBuffer); + ok(ap.cbAlign == 1, "cbAlign = %d\n", ap.cbAlign); + ok(ap.cbPrefix == 0, "cbPrefix = %d\n", ap.cbPrefix); return S_OK; } @@ -852,9 +852,9 @@ static HRESULT WINAPI MemInputPin_Receive(IMemInputPin *iface, IMediaSample *pSa HRESULT hr; hr = IMediaSample_GetTime(pSample, &off, &tmp); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); hr = IMediaSample_GetPointer(pSample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); li.QuadPart = off; IStream_Seek(avi_stream, li, STREAM_SEEK_SET, NULL); IStream_Write(avi_stream, data, IMediaSample_GetActualDataLength(pSample), NULL); @@ -1069,7 +1069,7 @@ static HRESULT WINAPI EnumMediaTypes_Next(IEnumMediaTypes *iface, ULONG cMediaTy test_filter *This = impl_from_IEnumMediaTypes(iface); check_calls_list("EnumMediaTypes_Next", ENUMMEDIATYPES_NEXT, This->filter_type); - ok(cMediaTypes == 1, "cMediaTypes = %ld\n", cMediaTypes); + ok(cMediaTypes == 1, "cMediaTypes = %d\n", cMediaTypes); ok(ppMediaTypes != NULL, "ppMediaTypes == NULL\n"); ok(pcFetched != NULL, "pcFetched == NULL\n"); @@ -1381,30 +1381,30 @@ static void test_AviMux(char *arg) hr = CoCreateInstance(&CLSID_AviDest, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void**)&avimux); ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG), - "Got hr %#lx.\n", hr); + "couldn't create AVI Mux filter, hr = %08x\n", hr); if(hr != S_OK) { win_skip("AVI Mux filter is not registered\n"); return; } hr = IBaseFilter_EnumPins(avimux, &ep); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "EnumPins returned %x\n", hr); hr = IEnumPins_Next(ep, 1, &avimux_out, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Next returned %x\n", hr); hr = IPin_QueryDirection(avimux_out, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryDirection returned %x\n", hr); ok(dir == PINDIR_OUTPUT, "dir = %d\n", dir); hr = IEnumPins_Next(ep, 1, &avimux_in, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Next returned %x\n", hr); hr = IPin_QueryDirection(avimux_in, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryDirection returned %x\n", hr); ok(dir == PINDIR_INPUT, "dir = %d\n", dir); IEnumPins_Release(ep); hr = IPin_ReceiveConnection(avimux_in, &source_filter.IPin_iface, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "ReceiveConnection returned %x\n", hr); current_calls_list = NULL; memset(&source_media_type, 0, sizeof(AM_MEDIA_TYPE)); @@ -1425,100 +1425,100 @@ static void test_AviMux(char *arg) videoinfo.bmiHeader.biSizeImage = 40000; videoinfo.bmiHeader.biClrImportant = 256; hr = IPin_ReceiveConnection(avimux_in, &source_filter.IPin_iface, &source_media_type); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "ReceiveConnection returned %x\n", hr); hr = IPin_ConnectedTo(avimux_in, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "ConnectedTo returned %x\n", hr); ok(pin == &source_filter.IPin_iface, "incorrect pin: %p, expected %p\n", pin, &source_filter.IPin_iface); hr = IPin_Connect(avimux_out, &source_filter.IPin_iface, NULL); - ok(hr == VFW_E_INVALID_DIRECTION, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_INVALID_DIRECTION, "Connect returned %x\n", hr); hr = IBaseFilter_JoinFilterGraph(avimux, (IFilterGraph*)&GraphBuilder, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "JoinFilterGraph returned %x\n", hr); SET_EXPECT(ReceiveConnection); SET_EXPECT(GetAllocatorRequirements); SET_EXPECT(NotifyAllocator); SET_EXPECT(Reconnect); hr = IPin_Connect(avimux_out, &sink_filter.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Connect returned %x\n", hr); CHECK_CALLED(ReceiveConnection); CHECK_CALLED(GetAllocatorRequirements); CHECK_CALLED(NotifyAllocator); CHECK_CALLED(Reconnect); hr = IPin_ConnectedTo(avimux_out, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "ConnectedTo returned %x\n", hr); ok(pin == &sink_filter.IPin_iface, "incorrect pin: %p, expected %p\n", pin, &source_filter.IPin_iface); hr = IPin_QueryInterface(avimux_in, &IID_IMemInputPin, (void**)&memin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface returned %x\n", hr); props.cBuffers = 0xdeadbee1; props.cbBuffer = 0xdeadbee2; props.cbAlign = 0xdeadbee3; props.cbPrefix = 0xdeadbee4; hr = IMemInputPin_GetAllocatorRequirements(memin, &props); - ok(hr==S_OK || broken(hr==E_INVALIDARG), "Got hr %#lx.\n", hr); + ok(hr==S_OK || broken(hr==E_INVALIDARG), "GetAllocatorRequirements returned %x\n", hr); if(hr == S_OK) { - ok(props.cBuffers == 0xdeadbee1, "cBuffers = %ld\n", props.cBuffers); - ok(props.cbBuffer == 0xdeadbee2, "cbBuffer = %ld\n", props.cbBuffer); - ok(props.cbAlign == 1, "cbAlign = %ld\n", props.cbAlign); - ok(props.cbPrefix == 8, "cbPrefix = %ld\n", props.cbPrefix); + ok(props.cBuffers == 0xdeadbee1, "cBuffers = %d\n", props.cBuffers); + ok(props.cbBuffer == 0xdeadbee2, "cbBuffer = %d\n", props.cbBuffer); + ok(props.cbAlign == 1, "cbAlign = %d\n", props.cbAlign); + ok(props.cbPrefix == 8, "cbPrefix = %d\n", props.cbPrefix); } hr = IMemInputPin_GetAllocator(memin, &memalloc); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetAllocator returned %x\n", hr); props.cBuffers = 0xdeadbee1; props.cbBuffer = 0xdeadbee2; props.cbAlign = 0xdeadbee3; props.cbPrefix = 0xdeadbee4; hr = IMemAllocator_GetProperties(memalloc, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.cBuffers == 0, "cBuffers = %ld\n", props.cBuffers); - ok(props.cbBuffer == 0, "cbBuffer = %ld\n", props.cbBuffer); - ok(props.cbAlign == 0, "cbAlign = %ld\n", props.cbAlign); - ok(props.cbPrefix == 0, "cbPrefix = %ld\n", props.cbPrefix); + ok(hr == S_OK, "GetProperties returned %x\n", hr); + ok(props.cBuffers == 0, "cBuffers = %d\n", props.cBuffers); + ok(props.cbBuffer == 0, "cbBuffer = %d\n", props.cbBuffer); + ok(props.cbAlign == 0, "cbAlign = %d\n", props.cbAlign); + ok(props.cbPrefix == 0, "cbPrefix = %d\n", props.cbPrefix); IMemAllocator_Release(memalloc); hr = IBaseFilter_QueryInterface(avimux, &IID_IConfigInterleaving, (void**)&ci); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IID_IConfigInterleaving) returned %x\n", hr); hr = IConfigInterleaving_put_Mode(ci, 5); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "put_Mode returned %x\n", hr); SET_EXPECT(Reconnect); hr = IConfigInterleaving_put_Mode(ci, INTERLEAVE_FULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "put_Mode returned %x\n", hr); CHECK_CALLED(Reconnect); IConfigInterleaving_Release(ci); hr = IBaseFilter_GetState(avimux, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetState returned %x\n", hr); ok(state == State_Stopped, "state = %d\n", state); SET_EXPECT(MemAllocator_GetProperties); hr = IMemInputPin_NotifyAllocator(memin, &MemAllocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "NotifyAllocator returned %x\n", hr); CHECK_CALLED(MemAllocator_GetProperties); hr = IMemInputPin_GetAllocator(memin, &memalloc); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetAllocator returned %x\n", hr); ok(memalloc != &MemAllocator, "memalloc == &MemAllocator\n"); IMemAllocator_Release(memalloc); hr = CreateStreamOnHGlobal(NULL, TRUE, &avi_stream); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got 0x%08x\n", hr); SET_EXPECT(MediaSeeking_GetPositions); SET_EXPECT(MemInputPin_QueryInterface_IStream); hr = IBaseFilter_Run(avimux, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Run returned %x\n", hr); CHECK_CALLED(MediaSeeking_GetPositions); hr = IBaseFilter_GetState(avimux, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetState returned %x\n", hr); ok(state == State_Running, "state = %d\n", state); SET_EXPECT(MediaSample_QueryInterface_MediaSample2); @@ -1533,7 +1533,7 @@ static void test_AviMux(char *arg) SET_EXPECT(MediaSample_GetMediaTime); start_time = end_time = 0; hr = IMemInputPin_Receive(memin, &MediaSample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Receive returned %x\n", hr); CHECK_CALLED(MediaSample_QueryInterface_MediaSample2); todo_wine CHECK_CALLED(MediaSample_IsDiscontinuity); todo_wine CHECK_CALLED(MediaSample_IsPreroll); @@ -1556,7 +1556,7 @@ static void test_AviMux(char *arg) SET_EXPECT(MediaSample_GetSize); SET_EXPECT(MediaSample_GetMediaTime); hr = IMemInputPin_Receive(memin, &MediaSample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Receive returned %x\n", hr); CHECK_CALLED(MediaSample_QueryInterface_MediaSample2); todo_wine CHECK_CALLED(MediaSample_IsDiscontinuity); todo_wine CHECK_CALLED(MediaSample_IsPreroll); @@ -1581,7 +1581,7 @@ static void test_AviMux(char *arg) start_time = 20000000; end_time = 21000000; hr = IMemInputPin_Receive(memin, &MediaSample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Receive returned %x\n", hr); CHECK_CALLED(MediaSample_QueryInterface_MediaSample2); todo_wine CHECK_CALLED(MediaSample_IsDiscontinuity); todo_wine CHECK_CALLED(MediaSample_IsPreroll); @@ -1595,20 +1595,20 @@ static void test_AviMux(char *arg) IMemInputPin_Release(memin); hr = IBaseFilter_Stop(avimux); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Stop returned %x\n", hr); CHECK_CALLED(MemInputPin_QueryInterface_IStream); hr = IBaseFilter_GetState(avimux, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetState returned %x\n", hr); ok(state == State_Stopped, "state = %d\n", state); hr = IPin_Disconnect(avimux_out); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Disconnect returned %x\n", hr); IPin_Release(avimux_in); IPin_Release(avimux_out); ref = IBaseFilter_Release(avimux); - ok(ref == 0, "Avi Mux filter was not destroyed (%ld)\n", ref); + ok(ref == 0, "Avi Mux filter was not destroyed (%d)\n", ref); if(arg && !strcmp(arg, "save")) { LARGE_INTEGER li; @@ -1622,12 +1622,12 @@ static void test_AviMux(char *arg) li.QuadPart = 0; hr = IStream_Seek(avi_stream, li, STREAM_SEEK_SET, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IStream_Seek failed: %x\n", hr); while(1) { hr = IStream_Read(avi_stream, buf, sizeof(buf), &read); if(FAILED(hr)) { - ok(0, "Got hr %#lx.\n", hr); + ok(0, "IStream_Read failed: %x\n", hr); break; } if(!read) @@ -1640,7 +1640,7 @@ static void test_AviMux(char *arg) } ref = IStream_Release(avi_stream); - ok(ref == 0, "IStream was not destroyed (%ld)\n", ref); + ok(ref == 0, "IStream was not destroyed (%d)\n", ref); } START_TEST(qcap) diff --git a/dlls/qcap/tests/smartteefilter.c b/dlls/qcap/tests/smartteefilter.c index a25889d2a4d..b6ba3ca75c9 100644 --- wine/dlls/qcap/tests/smartteefilter.c +++ wine/dlls/qcap/tests/smartteefilter.c @@ -30,7 +30,7 @@ static IBaseFilter *create_smart_tee(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_SmartTee, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -57,7 +57,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -135,7 +135,7 @@ static void test_interfaces(void) IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got unexpected refcount %ld.\n", ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); } static const GUID test_iid = {0x33333333}; @@ -183,53 +183,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_SmartTee, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_SmartTee, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -241,135 +241,135 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 4, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 3, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 3, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); IPin_Release(pins[2]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 4); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 3); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -381,35 +381,35 @@ static void test_find_pin(void) ULONG ref; hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin2 == pin, "Expected pin %p, got %p.\n", pin, pin2); IPin_Release(pin2); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Capture", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin2 == pin, "Expected pin %p, got %p.\n", pin, pin2); IPin_Release(pin2); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Preview", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin2 == pin, "Expected pin %p, got %p.\n", pin, pin2); IPin_Release(pin2); IPin_Release(pin); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -424,95 +424,95 @@ static void test_pin_info(void) IPin *pin; hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); ok(!lstrcmpW(info.achName, L"Input"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!lstrcmpW(id, L"Input"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, &count); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Capture", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); ok(!lstrcmpW(info.achName, L"Capture"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!lstrcmpW(id, L"Capture"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, &count); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Preview", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); ok(!lstrcmpW(info.achName, L"Preview"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!lstrcmpW(id, L"Preview"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, &count); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_enum_media_types(void) @@ -527,36 +527,36 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"Input", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -567,53 +567,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -688,28 +688,28 @@ static void test_sink_allocator(IPin *pin) IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); hr = IMemInputPin_GetAllocatorRequirements(input, &ret_props); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_NotifyAllocator(input, ret_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(ret_allocator); CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&req_allocator); hr = IMemInputPin_NotifyAllocator(input, req_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_allocator == req_allocator, "Allocators didn't match.\n"); IMemAllocator_Release(ret_allocator); hr = IMemAllocator_SetProperties(req_allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(req_allocator); IMemInputPin_Release(input); @@ -726,7 +726,7 @@ static HRESULT WINAPI testsource_AttemptConnection(struct strmbase_source *iface if (FAILED(hr = IPin_ReceiveConnection(peer, &iface->pin.IPin_iface, mt))) { - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); IPin_Release(peer); iface->pin.peer = NULL; FreeMediaType(&iface->pin.mt); @@ -785,12 +785,12 @@ static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample HRESULT hr; size = IMediaSample_GetSize(sample); - ok(size == 256, "Got size %lu.\n", size); + ok(size == 256, "Got size %u.\n", size); size = IMediaSample_GetActualDataLength(sample); - ok(size == 200, "Got valid size %lu.\n", size); + ok(size == 200, "Got valid size %u.\n", size); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < size; ++i) expect[i] = i; ok(!memcmp(data, expect, size), "Data didn't match.\n"); @@ -798,11 +798,11 @@ static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample hr = IMediaSample_GetTime(sample, &start, &stop); if (filter->preview) { - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); } else { - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == 30000, "Got start time %s.\n", wine_dbgstr_longlong(start)); ok(stop == 40000, "Got stop time %s.\n", wine_dbgstr_longlong(stop)); } @@ -810,21 +810,21 @@ static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample hr = IMediaSample_GetMediaTime(sample, &start, &stop); if (filter->preview) { - todo_wine ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); } else { - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == 10000, "Got start time %s.\n", wine_dbgstr_longlong(start)); ok(stop == 20000, "Got stop time %s.\n", wine_dbgstr_longlong(stop)); } hr = IMediaSample_IsDiscontinuity(sample); - todo_wine_if (filter->preview) ok(hr == filter->preview ? S_FALSE : S_OK, "Got hr %#lx.\n", hr); + todo_wine_if (filter->preview) ok(hr == filter->preview ? S_FALSE : S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsPreroll(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsSyncPoint(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetEvent(filter->sample_event); @@ -895,10 +895,10 @@ static void test_source_media_types(AM_MEDIA_TYPE req_mt, const AM_MEDIA_TYPE *s HRESULT hr; hr = IPin_EnumMediaTypes(source, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 3, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - todo_wine ok(count == 2, "Got %lu types.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + todo_wine ok(count == 2, "Got %u types.\n", count); ok(compare_media_types(mts[0], &req_mt), "Media types didn't match.\n"); if (count > 1) ok(compare_media_types(mts[1], source_mt), "Media types didn't match.\n"); @@ -908,42 +908,42 @@ static void test_source_media_types(AM_MEDIA_TYPE req_mt, const AM_MEDIA_TYPE *s IEnumMediaTypes_Release(enummt); hr = IPin_QueryAccept(source, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); req_mt.lSampleSize = 2; req_mt.bFixedSizeSamples = TRUE; hr = IPin_QueryAccept(source, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); req_mt.cbFormat = sizeof(count); req_mt.pbFormat = (BYTE *)&count; hr = IPin_QueryAccept(source, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.cbFormat = 0; req_mt.pbFormat = NULL; req_mt.majortype = MEDIATYPE_Audio; hr = IPin_QueryAccept(source, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.majortype = GUID_NULL; hr = IPin_QueryAccept(source, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Stream; req_mt.subtype = MEDIASUBTYPE_PCM; hr = IPin_QueryAccept(source, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IPin_QueryAccept(source, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_Avi; req_mt.formattype = FORMAT_WaveFormatEx; hr = IPin_QueryAccept(source, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.formattype = GUID_NULL; hr = IPin_QueryAccept(source, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.formattype = FORMAT_None; req_mt.majortype = MEDIATYPE_Audio; @@ -953,7 +953,7 @@ static void test_source_media_types(AM_MEDIA_TYPE req_mt, const AM_MEDIA_TYPE *s req_mt.pbFormat = (BYTE *)&count; req_mt.bTemporalCompression = TRUE; hr = IPin_QueryAccept(source, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void test_source_connection(AM_MEDIA_TYPE req_mt, IFilterGraph2 *graph, @@ -966,51 +966,51 @@ static void test_source_connection(AM_MEDIA_TYPE req_mt, IFilterGraph2 *graph, peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(source, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); /* Exact connection. */ hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(source, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsink->sink.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsink->sink.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsink->sink.pin.peer == source, "Got peer %p.\n", testsink->sink.pin.peer); IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); if (hr == S_OK) { IFilterGraph2_Disconnect(graph, source); @@ -1020,7 +1020,7 @@ static void test_source_connection(AM_MEDIA_TYPE req_mt, IFilterGraph2 *graph, req_mt.majortype = MEDIATYPE_Audio; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); if (hr == S_OK) { IFilterGraph2_Disconnect(graph, source); @@ -1030,61 +1030,61 @@ static void test_source_connection(AM_MEDIA_TYPE req_mt, IFilterGraph2 *graph, /* Connection with wildcards. */ hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink->sink.pin.mt, &sink_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface); req_mt.majortype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink->sink.pin.mt, &sink_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface); req_mt.subtype = MEDIASUBTYPE_RGB32; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink->sink.pin.mt, &sink_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface); req_mt.formattype = FORMAT_WaveFormatEx; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt = sink_mt; req_mt.formattype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink->sink.pin.mt, &sink_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface); req_mt.subtype = MEDIASUBTYPE_RGB32; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink->sink.pin.mt, &sink_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface); req_mt.majortype = MEDIATYPE_Audio; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); /* Test enumeration of sink media types. */ testsink->sink_mt = &req_mt; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, NULL); - todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); if (hr == S_OK) { IFilterGraph2_Disconnect(graph, source); @@ -1094,7 +1094,7 @@ static void test_source_connection(AM_MEDIA_TYPE req_mt, IFilterGraph2 *graph, req_mt = sink_mt; req_mt.lSampleSize = 3; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink->sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink->sink.pin.mt, &req_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink->sink.pin.IPin_iface); @@ -1138,56 +1138,56 @@ static void test_connect_pin(void) testsource.source_mt.formattype = FORMAT_VideoInfo; hr = IPin_EnumMediaTypes(sink, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); hr = IPin_EnumMediaTypes(capture, &enummt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IPin_EnumMediaTypes(preview, &enummt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IPin_QueryAccept(sink, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_QueryAccept(capture, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_QueryAccept(preview, &req_mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); /* Test sink connection. */ peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(sink, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(sink, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsource.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); hr = IPin_EnumMediaTypes(sink, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, mts, NULL); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); test_source_media_types(req_mt, &testsource.source_mt, capture); @@ -1196,39 +1196,39 @@ static void test_connect_pin(void) test_source_connection(req_mt, graph, control, &testsink, preview); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsource.source.pin.peer == sink, "Got peer %p.\n", testsource.source.pin.peer); IFilterGraph2_Disconnect(graph, &testsource.source.pin.IPin_iface); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(sink, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); IPin_Release(sink); IPin_Release(capture); IPin_Release(preview); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsource.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_streaming(void) @@ -1270,111 +1270,111 @@ static void test_streaming(void) IBaseFilter_FindPin(filter, L"Preview", &preview); hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, capture, &testsink1.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, preview, &testsink2.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_ReceiveCanBlock(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr != S_OK) { IMemAllocator_Commit(allocator); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); size = IMediaSample_GetSize(sample); - ok(size == 256, "Got size %ld.\n", size); + ok(size == 256, "Got size %d.\n", size); for (i = 0; i < 200; ++i) data[i] = i; hr = IMediaSample_SetActualDataLength(sample, 200); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = 10000; stop = 20000; hr = IMediaSample_SetMediaTime(sample, &start, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = 30000; stop = 40000; hr = IMediaSample_SetTime(sample, &start, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetDiscontinuity(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetPreroll(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetSyncPoint(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink1.sample_event, 1000), "Wait timed out.\n"); ok(!WaitForSingleObject(testsink2.sample_event, 1000), "Wait timed out.\n"); hr = IPin_NewSegment(sink, 10000, 20000, 1.0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink1.segment_event, 1000), "Wait timed out.\n"); ok(!WaitForSingleObject(testsink2.segment_event, 1000), "Wait timed out.\n"); hr = IPin_EndOfStream(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink1.eos_event, 1000), "Wait timed out.\n"); ok(!WaitForSingleObject(testsink2.eos_event, 1000), "Wait timed out.\n"); hr = IPin_EndOfStream(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink1.eos_event, 1000), "Wait timed out.\n"); ok(!WaitForSingleObject(testsink2.eos_event, 1000), "Wait timed out.\n"); ok(!testsink1.got_begin_flush, "Got %u calls to IPin::BeginFlush().\n", testsink1.got_begin_flush); ok(!testsink2.got_begin_flush, "Got %u calls to IPin::BeginFlush().\n", testsink2.got_begin_flush); hr = IPin_BeginFlush(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(testsink1.got_begin_flush == 1, "Got %u calls to IPin::BeginFlush().\n", testsink1.got_begin_flush); ok(testsink2.got_begin_flush == 1, "Got %u calls to IPin::BeginFlush().\n", testsink2.got_begin_flush); hr = IMemInputPin_Receive(input, sample); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(sink); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); /* No EOS events are sent downstream, however. */ ok(!testsink1.got_end_flush, "Got %u calls to IPin::EndFlush().\n", testsink1.got_end_flush); ok(!testsink2.got_end_flush, "Got %u calls to IPin::EndFlush().\n", testsink2.got_end_flush); hr = IPin_EndFlush(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(testsink1.got_end_flush == 1, "Got %u calls to IPin::EndFlush().\n", testsink1.got_end_flush); ok(testsink2.got_end_flush == 1, "Got %u calls to IPin::EndFlush().\n", testsink2.got_end_flush); hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink1.sample_event, 1000), "Wait timed out.\n"); ok(!WaitForSingleObject(testsink2.sample_event, 1000), "Wait timed out.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_Receive(input, sample); - todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* No EOS events are sent downstream, however. */ IMediaSample_Release(sample); @@ -1385,15 +1385,15 @@ static void test_streaming(void) IPin_Release(preview); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsource.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink1.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink2.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(smartteefilter) diff --git a/dlls/qcap/tests/videocapture.c b/dlls/qcap/tests/videocapture.c index 41b2cbc6a3f..c44070b0bd5 100644 --- wine/dlls/qcap/tests/videocapture.c +++ wine/dlls/qcap/tests/videocapture.c @@ -39,7 +39,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -51,78 +51,77 @@ static void test_media_types(IPin *pin) HRESULT hr; hr = IPin_EnumMediaTypes(pin, &enum_media_types); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (IEnumMediaTypes_Next(enum_media_types, 1, &pmt, NULL) == S_OK) { hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(pmt); } IEnumMediaTypes_Release(enum_media_types); hr = IPin_QueryAccept(pin, NULL); - todo_wine ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_POINTER, "Got hr %#x.\n", hr); memset(&mt, 0, sizeof(mt)); hr = IPin_QueryAccept(pin, &mt); - ok(hr != S_OK, "Got hr %#lx.\n", hr); + ok(hr != S_OK, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, &mt); - ok(hr != S_OK, "Got hr %#lx.\n", hr); + ok(hr != S_OK, "Got hr %#x.\n", hr); mt.formattype = FORMAT_VideoInfo; hr = IPin_QueryAccept(pin, &mt); - ok(hr != S_OK, "Got hr %#lx.\n", hr); + ok(hr != S_OK, "Got hr %#x.\n", hr); mt.formattype = FORMAT_None; hr = IPin_QueryAccept(pin, &mt); - ok(hr != S_OK, "Got hr %#lx.\n", hr); + ok(hr != S_OK, "Got hr %#x.\n", hr); } static void test_stream_config(IPin *pin) { VIDEOINFOHEADER *video_info, *video_info2; + LONG depth, compression, count, size, i; IEnumMediaTypes *enum_media_types; AM_MEDIA_TYPE *format, *format2; IAMStreamConfig *stream_config; VIDEO_STREAM_CONFIG_CAPS vscc; - LONG depth, compression; - int count, size, i; HRESULT hr; hr = IPin_QueryInterface(pin, &IID_IAMStreamConfig, (void **)&stream_config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAMStreamConfig_GetFormat(stream_config, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format->majortype, &MEDIATYPE_Video), "Got wrong majortype: %s.\n", debugstr_guid(&format->majortype)); hr = IAMStreamConfig_SetFormat(stream_config, format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* After setting the format, a single media type is enumerated. * This persists until the filter is released. */ IPin_EnumMediaTypes(pin, &enum_media_types); hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); DeleteMediaType(format2); hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum_media_types); format->majortype = MEDIATYPE_Audio; hr = IAMStreamConfig_SetFormat(stream_config, format); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); format->majortype = MEDIATYPE_Video; video_info = (VIDEOINFOHEADER *)format->pbFormat; video_info->bmiHeader.biWidth--; video_info->bmiHeader.biHeight--; hr = IAMStreamConfig_SetFormat(stream_config, format); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); depth = video_info->bmiHeader.biBitCount; compression = video_info->bmiHeader.biCompression; @@ -131,23 +130,23 @@ static void test_stream_config(IPin *pin) video_info->bmiHeader.biBitCount = 0; video_info->bmiHeader.biCompression = 0; hr = IAMStreamConfig_SetFormat(stream_config, format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAMStreamConfig_GetFormat(stream_config, &format2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format2->majortype, &MEDIATYPE_Video), "Got wrong majortype: %s.\n", debugstr_guid(&format2->majortype)); video_info2 = (VIDEOINFOHEADER *)format2->pbFormat; ok(video_info2->bmiHeader.biBitCount == depth, "Got wrong depth: %d.\n", video_info2->bmiHeader.biBitCount); ok(video_info2->bmiHeader.biCompression == compression, - "Got wrong compression: %ld.\n", video_info2->bmiHeader.biCompression); + "Got wrong compression: %d.\n", video_info2->bmiHeader.biCompression); FreeMediaType(format2); video_info->bmiHeader.biWidth = 10000000; video_info->bmiHeader.biHeight = 10000000; hr = IAMStreamConfig_SetFormat(stream_config, format); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); FreeMediaType(format); count = 0xdeadbeef; @@ -156,33 +155,33 @@ static void test_stream_config(IPin *pin) if (0) { hr = IAMStreamConfig_GetNumberOfCapabilities(stream_config, &count, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IAMStreamConfig_GetNumberOfCapabilities(stream_config, NULL, &size); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IAMStreamConfig_GetStreamCaps(stream_config, 0, NULL, (BYTE *)&vscc); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IAMStreamConfig_GetStreamCaps(stream_config, 0, &format, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); } hr = IAMStreamConfig_GetNumberOfCapabilities(stream_config, &count, &size); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count != 0xdeadbeef, "Got wrong count: %d.\n", count); ok(size == sizeof(VIDEO_STREAM_CONFIG_CAPS), "Got wrong size: %d.\n", size); hr = IAMStreamConfig_GetStreamCaps(stream_config, 100000, NULL, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IAMStreamConfig_GetStreamCaps(stream_config, 100000, &format, (BYTE *)&vscc); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); for (i = 0; i < count; ++i) { hr = IAMStreamConfig_GetStreamCaps(stream_config, i, &format, (BYTE *)&vscc); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format->majortype, &MEDIATYPE_Video), "Got wrong majortype: %s.\n", debugstr_guid(&MEDIATYPE_Video)); ok(IsEqualGUID(&vscc.guid, &FORMAT_VideoInfo) @@ -190,17 +189,17 @@ static void test_stream_config(IPin *pin) debugstr_guid(&vscc.guid)); hr = IAMStreamConfig_SetFormat(stream_config, format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAMStreamConfig_GetFormat(stream_config, &format2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(format, format2), "Media types didn't match.\n"); DeleteMediaType(format2); hr = IPin_EnumMediaTypes(pin, &enum_media_types); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum_media_types, 1, &format2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(format, format2), "Media types didn't match.\n"); DeleteMediaType(format2); IEnumMediaTypes_Release(enum_media_types); @@ -241,7 +240,7 @@ static void test_pins(IBaseFilter *filter) HRESULT hr; hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while ((hr = IEnumPins_Next(enum_pins, 1, &pin, NULL)) == S_OK) { @@ -288,67 +287,15 @@ static void test_misc_flags(IBaseFilter *filter) HRESULT hr; hr = IBaseFilter_QueryInterface(filter, &IID_IAMFilterMiscFlags, (void **)&misc_flags); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); flags = IAMFilterMiscFlags_GetMiscFlags(misc_flags); ok(flags == AM_FILTER_MISC_FLAGS_IS_SOURCE - || broken(!flags) /* win7 */, "Got wrong flags: %#lx.\n", flags); + || broken(!flags) /* win7 */, "Got wrong flags: %#x.\n", flags); IAMFilterMiscFlags_Release(misc_flags); } -static void test_unconnected_filter_state(IBaseFilter *filter) -{ - FILTER_STATE state; - HRESULT hr; - - hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %u.\n", state); - - hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %u.\n", state); - - hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %u.\n", state); - - hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %u.\n", state); - - hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %u.\n", state); - - hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %u.\n", state); - - hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %u.\n", state); -} - struct testfilter { struct strmbase_filter filter; @@ -420,81 +367,81 @@ static void test_filter_state(IMediaControl *control, IMemAllocator *allocator) HRESULT hr; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, AM_GBF_NOWAIT); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaSample_Release(sample); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, AM_GBF_NOWAIT); - todo_wine ok(hr == VFW_E_TIMEOUT, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_TIMEOUT, "Got hr %#x.\n", hr); if (hr == S_OK) IMediaSample_Release(sample); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); /* Test committing the allocator before the capture filter does. */ hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Decommit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void test_connect_pin(IBaseFilter *filter, IPin *source) @@ -516,20 +463,20 @@ static void test_connect_pin(IBaseFilter *filter, IPin *source) IFilterGraph2_AddFilter(graph, &testsink.filter.IBaseFilter_iface, L"sink"); IFilterGraph2_AddFilter(graph, filter, L"source"); hr = IPin_QueryInterface(source, &IID_IAMStreamConfig, (void **)&stream_config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(source, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IPin_EnumMediaTypes(source, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 2, mts, &count); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); CopyMediaType(&req_mt, mts[count - 1]); CopyMediaType(&default_mt, mts[0]); DeleteMediaType(mts[0]); @@ -538,50 +485,50 @@ static void test_connect_pin(IBaseFilter *filter, IPin *source) IEnumMediaTypes_Release(enummt); hr = IAMStreamConfig_GetFormat(stream_config, &mts[0]); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(mts[0], &default_mt), "Media types didn't match.\n"); DeleteMediaType(mts[0]); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!!testsink.sink.pAllocator, "Expected to be assigned an allocator.\n"); test_filter_state(control, testsink.sink.pAllocator); hr = IPin_ConnectedTo(source, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsink.sink.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); FreeMediaType(&mt); hr = IAMStreamConfig_GetFormat(stream_config, &mts[0]); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(mts[0], &req_mt), "Media types didn't match.\n"); DeleteMediaType(mts[0]); hr = IPin_EnumMediaTypes(source, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(mts[0], &default_mt), "Media types didn't match.\n"); DeleteMediaType(mts[0]); IEnumMediaTypes_Release(enummt); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsink.sink.pin.peer == source, "Got peer %p.\n", testsink.sink.pin.peer); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); hr = IAMStreamConfig_GetFormat(stream_config, &mts[0]); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(mts[0], &default_mt), "Media types didn't match.\n"); DeleteMediaType(mts[0]); @@ -590,9 +537,9 @@ static void test_connect_pin(IBaseFilter *filter, IPin *source) IAMStreamConfig_Release(stream_config); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_connection(IMoniker *moniker) @@ -604,10 +551,10 @@ static void test_connection(IMoniker *moniker) IPin *pin; hr = IMoniker_BindToObject(moniker, NULL, NULL, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (IEnumPins_Next(enum_pins, 1, &pin, NULL) == S_OK) { @@ -622,7 +569,7 @@ static void test_connection(IMoniker *moniker) IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(videocapture) @@ -639,7 +586,7 @@ START_TEST(videocapture) hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (void **)&dev_enum); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ICreateDevEnum_CreateClassEnumerator(dev_enum, &CLSID_VideoInputDeviceCategory, &class_enum, 0); if (hr == S_FALSE) @@ -649,18 +596,18 @@ START_TEST(videocapture) CoUninitialize(); return; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr=%#x.\n", hr); while (IEnumMoniker_Next(class_enum, 1, &moniker, NULL) == S_OK) { hr = IMoniker_GetDisplayName(moniker, NULL, NULL, &name); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); trace("Testing device %s.\n", wine_dbgstr_w(name)); CoTaskMemFree(name); if (FAILED(hr = IMoniker_BindToObject(moniker, NULL, NULL, &IID_IBaseFilter, (void **)&filter))) { - skip("Failed to open device %s, hr %#lx.\n", debugstr_w(name), hr); + skip("Failed to open device %s, hr %#x.\n", debugstr_w(name), hr); IMoniker_Release(moniker); continue; } @@ -668,10 +615,9 @@ START_TEST(videocapture) test_filter_interfaces(filter); test_pins(filter); test_misc_flags(filter); - test_unconnected_filter_state(filter); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); test_connection(moniker); diff --git a/dlls/qcap/v4l.c b/dlls/qcap/v4l.c index 577cc829329..ae663389d14 100644 --- wine/dlls/qcap/v4l.c +++ wine/dlls/qcap/v4l.c @@ -558,8 +558,8 @@ static NTSTATUS v4l_device_create( void *args ) } TRACE("Format: %d bpp - %dx%d.\n", device->current_caps->video_info.bmiHeader.biBitCount, - (int)device->current_caps->video_info.bmiHeader.biWidth, - (int)device->current_caps->video_info.bmiHeader.biHeight); + device->current_caps->video_info.bmiHeader.biWidth, + device->current_caps->video_info.bmiHeader.biHeight); *params->device = (ULONG_PTR)device; return S_OK; diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c index d842117e9a5..6b82af9d155 100644 --- wine/dlls/qcap/vfwcapture.c +++ wine/dlls/qcap/vfwcapture.c @@ -165,9 +165,9 @@ static DWORD WINAPI stream_thread(void *arg) LeaveCriticalSection(&filter->state_cs); - if (FAILED(hr = IMemAllocator_GetBuffer(filter->source.pAllocator, &sample, NULL, NULL, 0))) + if (FAILED(hr = BaseOutputPinImpl_GetDeliveryBuffer(&filter->source, &sample, NULL, NULL, 0))) { - ERR("Failed to get sample, hr %#lx.\n", hr); + ERR("Failed to get sample, hr %#x.\n", hr); break; } @@ -186,7 +186,7 @@ static DWORD WINAPI stream_thread(void *arg) IMediaSample_Release(sample); if (FAILED(hr)) { - ERR("IMemInputPin::Receive() returned %#lx.\n", hr); + ERR("IMemInputPin::Receive() returned %#x.\n", hr); break; } } @@ -199,11 +199,8 @@ static HRESULT vfw_capture_init_stream(struct strmbase_filter *iface) struct vfw_capture *filter = impl_from_strmbase_filter(iface); HRESULT hr; - if (!filter->source.pin.peer) - return S_OK; - if (FAILED(hr = IMemAllocator_Commit(filter->source.pAllocator))) - ERR("Failed to commit allocator, hr %#lx.\n", hr); + ERR("Failed to commit allocator, hr %#x.\n", hr); EnterCriticalSection(&filter->state_cs); filter->state = State_Paused; @@ -218,9 +215,6 @@ static HRESULT vfw_capture_start_stream(struct strmbase_filter *iface, REFERENCE { struct vfw_capture *filter = impl_from_strmbase_filter(iface); - if (!filter->source.pin.peer) - return S_OK; - EnterCriticalSection(&filter->state_cs); filter->state = State_Running; LeaveCriticalSection(&filter->state_cs); @@ -232,9 +226,6 @@ static HRESULT vfw_capture_stop_stream(struct strmbase_filter *iface) { struct vfw_capture *filter = impl_from_strmbase_filter(iface); - if (!filter->source.pin.peer) - return S_OK; - EnterCriticalSection(&filter->state_cs); filter->state = State_Paused; LeaveCriticalSection(&filter->state_cs); @@ -246,9 +237,6 @@ static HRESULT vfw_capture_cleanup_stream(struct strmbase_filter *iface) struct vfw_capture *filter = impl_from_strmbase_filter(iface); HRESULT hr; - if (!filter->source.pin.peer) - return S_OK; - EnterCriticalSection(&filter->state_cs); filter->state = State_Stopped; LeaveCriticalSection(&filter->state_cs); @@ -260,18 +248,14 @@ static HRESULT vfw_capture_cleanup_stream(struct strmbase_filter *iface) hr = IMemAllocator_Decommit(filter->source.pAllocator); if (hr != S_OK && hr != VFW_E_NOT_COMMITTED) - ERR("Failed to decommit allocator, hr %#lx.\n", hr); + ERR("Failed to decommit allocator, hr %#x.\n", hr); return S_OK; } static HRESULT vfw_capture_wait_state(struct strmbase_filter *iface, DWORD timeout) { - struct vfw_capture *filter = impl_from_strmbase_filter(iface); - - if (filter->source.pin.peer && filter->filter.state == State_Paused) - return VFW_S_CANT_CUE; - return S_OK; + return iface->state == State_Paused ? VFW_S_CANT_CUE : S_OK; } static const struct strmbase_filter_ops filter_ops = @@ -332,7 +316,7 @@ AMStreamConfig_SetFormat(IAMStreamConfig *iface, AM_MEDIA_TYPE *pmt) if (This->source.pin.peer) { hr = IPin_QueryAccept(This->source.pin.peer, pmt); - TRACE("QueryAccept() returned %#lx.\n", hr); + TRACE("Would accept: %d\n", hr); if (hr == S_FALSE) return VFW_E_INVALIDMEDIATYPE; } @@ -346,7 +330,7 @@ AMStreamConfig_SetFormat(IAMStreamConfig *iface, AM_MEDIA_TYPE *pmt) if (SUCCEEDED(hr)) TRACE("Reconnection completed, with new media format..\n"); } - TRACE("Returning %#lx.\n", hr); + TRACE("Returning: %d\n", hr); return hr; } @@ -481,7 +465,7 @@ static HRESULT WINAPI AMVideoProcAmp_GetRange(IAMVideoProcAmp *iface, LONG prope struct vfw_capture *filter = impl_from_IAMVideoProcAmp(iface); struct get_prop_range_params params = { filter->device, property, min, max, step, default_value, flags }; - TRACE("filter %p, property %#lx, min %p, max %p, step %p, default_value %p, flags %p.\n", + TRACE("filter %p, property %#x, min %p, max %p, step %p, default_value %p, flags %p.\n", filter, property, min, max, step, default_value, flags); return V4L_CALL( get_prop_range, ¶ms ); @@ -493,7 +477,7 @@ static HRESULT WINAPI AMVideoProcAmp_Set(IAMVideoProcAmp *iface, LONG property, struct vfw_capture *filter = impl_from_IAMVideoProcAmp(iface); struct set_prop_params params = { filter->device, property, value, flags }; - TRACE("filter %p, property %#lx, value %ld, flags %#lx.\n", filter, property, value, flags); + TRACE("filter %p, property %#x, value %d, flags %#x.\n", filter, property, value, flags); return V4L_CALL( set_prop, ¶ms ); } @@ -504,7 +488,7 @@ static HRESULT WINAPI AMVideoProcAmp_Get(IAMVideoProcAmp *iface, LONG property, struct vfw_capture *filter = impl_from_IAMVideoProcAmp(iface); struct get_prop_params params = { filter->device, property, value, flags }; - TRACE("filter %p, property %#lx, value %p, flags %p.\n", filter, property, value, flags); + TRACE("filter %p, property %#x, value %p, flags %p.\n", filter, property, value, flags); return V4L_CALL( get_prop, ¶ms ); } @@ -815,7 +799,7 @@ static HRESULT WINAPI video_control_SetMode(IAMVideoControl *iface, IPin *pin, L { struct vfw_capture *filter = impl_from_IAMVideoControl(iface); - FIXME("filter %p, pin %p, mode %ld, stub.\n", filter, pin, mode); + FIXME("filter %p, pin %p, mode %d: stub.\n", filter, pin, mode); return E_NOTIMPL; } @@ -844,7 +828,7 @@ static HRESULT WINAPI video_control_GetMaxAvailableFrameRate(IAMVideoControl *if { struct vfw_capture *filter = impl_from_IAMVideoControl(iface); - FIXME("filter %p, pin %p, index %ld, dimensions (%ldx%ld), frame rate %p, stub.\n", + FIXME("filter %p, pin %p, index %d, dimensions (%dx%d), frame rate %p: stub.\n", filter, pin, index, dimensions.cx, dimensions.cy, frame_rate); return E_NOTIMPL; @@ -855,7 +839,7 @@ static HRESULT WINAPI video_control_GetFrameRateList(IAMVideoControl *iface, IPi { struct vfw_capture *filter = impl_from_IAMVideoControl(iface); - FIXME("filter %p, pin %p, index %ld, dimensions (%ldx%ld), list size %p, frame rate %p, stub.\n", + FIXME("filter %p, pin %p, index %d, dimensions (%dx%d), list size %p, frame rate: %p: stub.\n", filter, pin, index, dimensions.cx, dimensions.cy, list_size, frame_rate); return E_NOTIMPL; diff --git a/dlls/quartz/Makefile.in b/dlls/quartz/Makefile.in index e7e1b43da79..81db98e639d 100644 --- wine/dlls/quartz/Makefile.in +++ wine/dlls/quartz/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES MODULE = quartz.dll IMPORTLIB = quartz IMPORTS = strmiids dxguid strmbase uuid dsound msacm32 msvfw32 ole32 oleaut32 rpcrt4 user32 gdi32 advapi32 diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c index 8e1b5e6b773..a07bdfef0ca 100644 --- wine/dlls/quartz/acmwrapper.c +++ wine/dlls/quartz/acmwrapper.c @@ -110,7 +110,7 @@ static HRESULT WINAPI acm_wrapper_sink_Receive(struct strmbase_sink *iface, IMed hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { - ERR("Failed to get input buffer pointer, hr %#lx.\n", hr); + ERR("Cannot get pointer to sample data (%x)\n", hr); return hr; } @@ -135,14 +135,17 @@ static HRESULT WINAPI acm_wrapper_sink_Receive(struct strmbase_sink *iface, IMed tMed = tStart; mtMed = mtStart; + TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream); + ash.pbSrc = pbSrcStream; ash.cbSrcLength = cbSrcStream; while(hr == S_OK && ash.cbSrcLength) { - if (FAILED(hr = IMemAllocator_GetBuffer(This->source.pAllocator, &pOutSample, NULL, NULL, 0))) + hr = BaseOutputPinImpl_GetDeliveryBuffer(&This->source, &pOutSample, NULL, NULL, 0); + if (FAILED(hr)) { - ERR("Failed to get sample, hr %#lx.\n", hr); + ERR("Unable to get delivery buffer (%x)\n", hr); return hr; } IMediaSample_SetPreroll(pOutSample, preroll); @@ -152,7 +155,7 @@ static HRESULT WINAPI acm_wrapper_sink_Receive(struct strmbase_sink *iface, IMed hr = IMediaSample_GetPointer(pOutSample, &pbDstStream); if (FAILED(hr)) { - ERR("Failed to get output buffer pointer, hr %#lx.\n", hr); + ERR("Unable to get pointer to buffer (%x)\n", hr); goto error; } cbDstStream = IMediaSample_GetSize(pOutSample); @@ -189,7 +192,7 @@ static HRESULT WINAPI acm_wrapper_sink_Receive(struct strmbase_sink *iface, IMed goto error; } - TRACE("used in %lu/%lu, used out %lu/%lu\n", ash.cbSrcLengthUsed, ash.cbSrcLength, ash.cbDstLengthUsed, ash.cbDstLength); + TRACE("used in %u/%u, used out %u/%u\n", ash.cbSrcLengthUsed, ash.cbSrcLength, ash.cbDstLengthUsed, ash.cbDstLength); hr = IMediaSample_SetActualDataLength(pOutSample, ash.cbDstLengthUsed); assert(hr == S_OK); @@ -197,7 +200,7 @@ static HRESULT WINAPI acm_wrapper_sink_Receive(struct strmbase_sink *iface, IMed /* Bug in acm codecs? It apparently uses the input, but doesn't necessarily output immediately */ if (!ash.cbSrcLengthUsed) { - WARN("Sample was skipped? Outputted: %lu\n", ash.cbDstLengthUsed); + WARN("Sample was skipped? Outputted: %u\n", ash.cbDstLengthUsed); ash.cbSrcLength = 0; goto error; } @@ -240,7 +243,7 @@ static HRESULT WINAPI acm_wrapper_sink_Receive(struct strmbase_sink *iface, IMed hr = IMemInputPin_Receive(This->source.pMemInputPin, pOutSample); if (hr != S_OK && hr != VFW_E_NOT_CONNECTED) { if (FAILED(hr)) - ERR("Failed to send sample, hr %#lx.\n", hr); + ERR("Error sending sample (%x)\n", hr); goto error; } @@ -416,7 +419,7 @@ static HRESULT WINAPI acm_wrapper_source_qc_Notify(IQualityControl *iface, IQualityControl *peer; HRESULT hr = S_OK; - TRACE("filter %p, sender %p, type %#x, proportion %ld, late %s, timestamp %s.\n", + TRACE("filter %p, sender %p, type %#x, proportion %u, late %s, timestamp %s.\n", filter, sender, q.Type, q.Proportion, debugstr_time(q.Late), debugstr_time(q.TimeStamp)); if (filter->source_qc_sink) @@ -489,7 +492,7 @@ static HRESULT acm_wrapper_init_stream(struct strmbase_filter *iface) HRESULT hr; if (filter->source.pin.peer && FAILED(hr = IMemAllocator_Commit(filter->source.pAllocator))) - ERR("Failed to commit allocator, hr %#lx.\n", hr); + ERR("Failed to commit allocator, hr %#x.\n", hr); return S_OK; } @@ -520,11 +523,8 @@ HRESULT acm_wrapper_create(IUnknown *outer, IUnknown **out) strmbase_filter_init(&object->filter, outer, &CLSID_ACMWrapper, &filter_ops); strmbase_sink_init(&object->sink, &object->filter, L"In", &sink_ops, NULL); - wcscpy(object->sink.pin.name, L"Input"); strmbase_source_init(&object->source, &object->filter, L"Out", &source_ops); - wcscpy(object->source.pin.name, L"Output"); - object->source_IQualityControl_iface.lpVtbl = &source_qc_vtbl; strmbase_passthrough_init(&object->passthrough, (IUnknown *)&object->source.pin.IPin_iface); ISeekingPassThru_Init(&object->passthrough.ISeekingPassThru_iface, FALSE, diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index 8cc729748c1..3d947e1b1bf 100644 --- wine/dlls/quartz/avidec.c +++ wine/dlls/quartz/avidec.c @@ -101,13 +101,14 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, struct avi_decompressor *This = impl_from_strmbase_filter(iface->pin.filter); VIDEOINFOHEADER *source_format; HRESULT hr; + DWORD res; IMediaSample* pOutSample = NULL; - LONG cbDstStream, cbSrcStream; + DWORD cbDstStream; LPBYTE pbDstStream; + DWORD cbSrcStream; LPBYTE pbSrcStream; LONGLONG tStart, tStop; DWORD flags = 0; - LRESULT res; /* We do not expect pin connection state to change while the filter is * running. This guarantee is necessary, since otherwise we would have to @@ -130,18 +131,20 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { - ERR("Failed to get input buffer pointer, hr %#lx.\n", hr); + ERR("Cannot get pointer to sample data (%x)\n", hr); return hr; } cbSrcStream = IMediaSample_GetActualDataLength(pSample); + TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream); + /* Update input size to match sample size */ This->pBihIn->biSizeImage = cbSrcStream; - if (FAILED(hr = IMemAllocator_GetBuffer(This->source.pAllocator, &pOutSample, NULL, NULL, 0))) - { - ERR("Failed to get sample, hr %#lx.\n", hr); + hr = BaseOutputPinImpl_GetDeliveryBuffer(&This->source, &pOutSample, NULL, NULL, 0); + if (FAILED(hr)) { + ERR("Unable to get delivery buffer (%x)\n", hr); return hr; } @@ -150,14 +153,14 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, hr = IMediaSample_GetPointer(pOutSample, &pbDstStream); if (FAILED(hr)) { - ERR("Failed to get output buffer pointer, hr %#lx.\n", hr); + ERR("Unable to get pointer to buffer (%x)\n", hr); IMediaSample_Release(pOutSample); return hr; } cbDstStream = IMediaSample_GetSize(pOutSample); if (cbDstStream < source_format->bmiHeader.biSizeImage) { - ERR("Sample size is too small (%ld < %lu).\n", cbDstStream, source_format->bmiHeader.biSizeImage); + ERR("Sample size is too small (%u < %u).\n", cbDstStream, source_format->bmiHeader.biSizeImage); IMediaSample_Release(pOutSample); return E_FAIL; } @@ -172,7 +175,7 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, res = ICDecompress(This->hvid, flags, This->pBihIn, pbSrcStream, &source_format->bmiHeader, pbDstStream); if (res != ICERR_OK) - ERR("Failed to decompress, error %Id.\n", res); + ERR("Error occurred during the decompression (%x)\n", res); /* Drop sample if it's intended to be dropped */ if (flags & ICDECOMPRESS_HURRYUP) { @@ -195,7 +198,7 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, hr = IMemInputPin_Receive(This->source.pMemInputPin, pOutSample); if (hr != S_OK && hr != VFW_E_NOT_CONNECTED) - ERR("Failed to send sample, hr %#lx.\n", hr); + ERR("Error sending sample (%x)\n", hr); IMediaSample_Release(pOutSample); return hr; @@ -225,7 +228,7 @@ static HRESULT avi_decompressor_sink_connect(struct strmbase_sink *iface, IPin * if (This->hvid) { DWORD bih_size; - LRESULT result; + DWORD result; /* Copy bitmap header from media type to 1 for input and 1 for output */ bih_size = bmi->biSize + bmi->biClrUsed * 4; @@ -239,7 +242,7 @@ static HRESULT avi_decompressor_sink_connect(struct strmbase_sink *iface, IPin * if ((result = ICDecompressQuery(This->hvid, This->pBihIn, NULL))) { - WARN("No decompressor found, error %Id.\n", result); + WARN("No decompressor found, error %d.\n", result); return VFW_E_TYPE_NOT_ACCEPTED; } @@ -342,12 +345,9 @@ static HRESULT avi_decompressor_source_get_media_type(struct strmbase_pin *iface if (index < ARRAY_SIZE(formats)) { - /* In theory we could allocate less than this, but gcc generates - * -Warray-bounds warnings if we access the structure through a - * VIDEOINFO pointer, even if we only access valid fields. */ - if (!(format = CoTaskMemAlloc(sizeof(*format)))) + if (!(format = CoTaskMemAlloc(offsetof(VIDEOINFO, dwBitMasks[3])))) return E_OUTOFMEMORY; - memset(format, 0, sizeof(*format)); + memset(format, 0, offsetof(VIDEOINFO, dwBitMasks[3])); format->rcSource = sink_format->rcSource; format->rcTarget = sink_format->rcTarget; @@ -479,7 +479,7 @@ static HRESULT WINAPI avi_decompressor_source_qc_Notify(IQualityControl *iface, { struct avi_decompressor *filter = impl_from_source_IQualityControl(iface); - TRACE("filter %p, sender %p, type %#x, proportion %ld, late %s, timestamp %s.\n", + TRACE("filter %p, sender %p, type %#x, proportion %u, late %s, timestamp %s.\n", filter, sender, q.Type, q.Proportion, debugstr_time(q.Late), debugstr_time(q.TimeStamp)); EnterCriticalSection(&filter->filter.stream_cs); @@ -555,12 +555,12 @@ static HRESULT avi_decompressor_init_stream(struct strmbase_filter *iface) source_format = (VIDEOINFOHEADER *)filter->sink.pin.mt.pbFormat; if ((res = ICDecompressBegin(filter->hvid, filter->pBihIn, &source_format->bmiHeader))) { - ERR("ICDecompressBegin() failed, error %Id.\n", res); + ERR("ICDecompressBegin() failed, error %ld.\n", res); return E_FAIL; } if (FAILED(hr = IMemAllocator_Commit(filter->source.pAllocator))) - ERR("Failed to commit allocator, hr %#lx.\n", hr); + ERR("Failed to commit allocator, hr %#x.\n", hr); return S_OK; } @@ -575,7 +575,7 @@ static HRESULT avi_decompressor_cleanup_stream(struct strmbase_filter *iface) if (filter->hvid && (res = ICDecompressEnd(filter->hvid))) { - ERR("ICDecompressEnd() failed, error %Id.\n", res); + ERR("ICDecompressEnd() failed, error %ld.\n", res); return E_FAIL; } @@ -602,11 +602,8 @@ HRESULT avi_dec_create(IUnknown *outer, IUnknown **out) strmbase_filter_init(&object->filter, outer, &CLSID_AVIDec, &filter_ops); strmbase_sink_init(&object->sink, &object->filter, L"In", &sink_ops, NULL); - wcscpy(object->sink.pin.name, L"XForm In"); strmbase_source_init(&object->source, &object->filter, L"Out", &source_ops); - wcscpy(object->source.pin.name, L"XForm Out"); - object->source_IQualityControl_iface.lpVtbl = &source_qc_vtbl; strmbase_passthrough_init(&object->passthrough, (IUnknown *)&object->source.pin.IPin_iface); ISeekingPassThru_Init(&object->passthrough.ISeekingPassThru_iface, FALSE, diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index 1abd4bdbcec..df40d1254ee 100644 --- wine/dlls/quartz/dsoundrender.c +++ wine/dlls/quartz/dsoundrender.c @@ -126,7 +126,7 @@ static void DSoundRender_UpdatePositions(struct dsound_render *This, DWORD *seqw adv = playpos - old_playpos; This->last_playpos = playpos; if (adv) { - TRACE("Moving from %lu to %lu: clearing %lu bytes.\n", old_playpos, playpos, adv); + TRACE("Moving from %u to %u: clearing %u bytes\n", old_playpos, playpos, adv); IDirectSoundBuffer_Lock(This->dsbuffer, old_playpos, adv, (void**)&buf1, &size1, (void**)&buf2, &size2, 0); memset(buf1, wfx->wBitsPerSample == 8 ? 128 : 0, size1); memset(buf2, wfx->wBitsPerSample == 8 ? 128 : 0, size2); @@ -190,19 +190,19 @@ static HRESULT DSoundRender_GetWritePos(struct dsound_render *This, past = min_writepos_t - write_at; if (past >= 0) { DWORD skipbytes = pos_from_time(This, past); - WARN("Skipping %lu bytes.\n", skipbytes); + WARN("Skipping %u bytes\n", skipbytes); *skip = skipbytes; *ret_writepos = min_writepos; } else { DWORD aheadbytes = pos_from_time(This, -past); - WARN("Advancing %lu bytes.\n", aheadbytes); + WARN("Advancing %u bytes\n", aheadbytes); *ret_writepos = (min_writepos + aheadbytes) % This->buf_size; } } else /* delta_t > 0 */ { DWORD aheadbytes; WARN("Delta too big %s/%s, too far ahead\n", debugstr_time(delta_t), debugstr_time(max_lag)); aheadbytes = pos_from_time(This, delta_t); - WARN("Advancing %lu bytes.\n", aheadbytes); + WARN("Advancing %u bytes\n", aheadbytes); if (delta_t >= DSoundRenderer_Max_Fill) return S_FALSE; *ret_writepos = (min_writepos + aheadbytes) % This->buf_size; @@ -254,13 +254,13 @@ static HRESULT DSoundRender_SendSampleData(struct dsound_render *This, if (This->sink.flushing || This->filter.state == State_Stopped) return This->filter.state == State_Paused ? S_OK : VFW_E_WRONG_STATE; if (ret != WAIT_TIMEOUT) - ERR("WaitForSingleObject() returned %ld.\n", ret); + ERR("%x\n", ret); continue; } tStart = -1; if (skip) - FIXME("Sample dropped %lu of %lu bytes.\n", skip, size); + FIXME("Sample dropped %u of %u bytes\n", skip, size); if (skip >= size) return S_OK; data += skip; @@ -268,7 +268,7 @@ static HRESULT DSoundRender_SendSampleData(struct dsound_render *This, hr = IDirectSoundBuffer_Lock(This->dsbuffer, writepos, min(free, size), (void**)&buf1, &size1, (void**)&buf2, &size2, 0); if (hr != DS_OK) { - ERR("Failed to lock sound buffer, hr %#lx.\n", hr); + ERR("Unable to lock sound buffer! (%x)\n", hr); break; } memcpy(buf1, data, size1); @@ -276,7 +276,7 @@ static HRESULT DSoundRender_SendSampleData(struct dsound_render *This, memcpy(buf2, data+size1, size2); IDirectSoundBuffer_Unlock(This->dsbuffer, buf1, size1, buf2, size2); This->writepos = (writepos + size1 + size2) % This->buf_size; - TRACE("Wrote %lu bytes at %lu, next at %lu - (%lu/%lu)\n", size1+size2, writepos, This->writepos, free, size); + TRACE("Wrote %u bytes at %u, next at %u - (%u/%u)\n", size1+size2, writepos, This->writepos, free, size); data += size1 + size2; size -= size1 + size2; } @@ -330,13 +330,13 @@ static HRESULT DSoundRender_DoRenderSample(struct dsound_render *This, IMediaSam hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { - ERR("Failed to get buffer pointer, hr %#lx.\n", hr); + ERR("Cannot get pointer to sample data (%x)\n", hr); return hr; } hr = IMediaSample_GetTime(pSample, &tStart, &tStop); if (FAILED(hr)) { - ERR("Failed to get sample time, hr %#lx.\n", hr); + ERR("Cannot get sample time (%x)\n", hr); tStart = tStop = -1; } @@ -347,6 +347,8 @@ static HRESULT DSoundRender_DoRenderSample(struct dsound_render *This, IMediaSam } cbSrcStream = IMediaSample_GetActualDataLength(pSample); + TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream); + return DSoundRender_SendSampleData(This, tStart, tStop, pbSrcStream, cbSrcStream); } @@ -414,17 +416,17 @@ static HRESULT dsound_render_sink_connect(struct strmbase_sink *iface, IPin *pee hr = IDirectSound8_CreateSoundBuffer(This->dsound, &buf_desc, &This->dsbuffer, NULL); This->writepos = This->buf_size; if (FAILED(hr)) - ERR("Failed to create sound buffer, hr %#lx.\n", hr); + ERR("Can't create sound buffer (%x)\n", hr); if (SUCCEEDED(hr)) { hr = IDirectSoundBuffer_SetVolume(This->dsbuffer, This->volume); if (FAILED(hr)) - ERR("Failed to set volume to %ld, hr %#lx.\n", This->volume, hr); + ERR("Can't set volume to %d (%x)\n", This->volume, hr); hr = IDirectSoundBuffer_SetPan(This->dsbuffer, This->pan); if (FAILED(hr)) - ERR("Failed to set pan to %ld, hr %#lx.\n", This->pan, hr); + ERR("Can't set pan to %d (%x)\n", This->pan, hr); hr = S_OK; } @@ -699,7 +701,7 @@ HRESULT WINAPI basic_audio_GetTypeInfoCount(IBasicAudio *iface, UINT *count) HRESULT WINAPI basic_audio_GetTypeInfo(IBasicAudio *iface, UINT index, LCID lcid, ITypeInfo **typeinfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); + TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo); return strmbase_get_typeinfo(IBasicAudio_tid, typeinfo); } @@ -709,7 +711,7 @@ HRESULT WINAPI basic_audio_GetIDsOfNames(IBasicAudio *iface, REFIID iid, ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", + TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n", iface, debugstr_guid(iid), names, count, lcid, ids); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicAudio_tid, &typeinfo))) @@ -726,7 +728,7 @@ static HRESULT WINAPI basic_audio_Invoke(IBasicAudio *iface, DISPID id, REFIID i ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", + TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicAudio_tid, &typeinfo))) @@ -741,7 +743,7 @@ static HRESULT WINAPI Basicaudio_put_Volume(IBasicAudio *iface, LONG lVolume) { struct dsound_render *This = impl_from_IBasicAudio(iface); - TRACE("filter %p, volume %ld.\n", This, lVolume); + TRACE("(%p/%p)->(%d)\n", This, iface, lVolume); if (lVolume > DSBVOLUME_MAX || lVolume < DSBVOLUME_MIN) return E_INVALIDARG; @@ -772,7 +774,7 @@ static HRESULT WINAPI Basicaudio_put_Balance(IBasicAudio *iface, LONG lBalance) { struct dsound_render *This = impl_from_IBasicAudio(iface); - TRACE("filter %p, balance %ld.\n", This, lBalance); + TRACE("(%p/%p)->(%d)\n", This, iface, lBalance); if (lBalance < DSBPAN_LEFT || lBalance > DSBPAN_RIGHT) return E_INVALIDARG; @@ -961,7 +963,7 @@ static HRESULT WINAPI dsound_render_qc_Notify(IQualityControl *iface, { struct dsound_render *filter = impl_from_IQualityControl(iface); - FIXME("filter %p, sender %p, type %#x, proportion %ld, late %s, timestamp %s, stub!\n", + FIXME("filter %p, sender %p, type %#x, proportion %u, late %s, timestamp %s, stub!\n", filter, sender, q.Type, q.Proportion, debugstr_time(q.Late), debugstr_time(q.TimeStamp)); return E_NOTIMPL; diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index 6ffae606df4..e5e7b482984 100644 --- wine/dlls/quartz/filesource.c +++ wine/dlls/quartz/filesource.c @@ -217,7 +217,7 @@ BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID if ((file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) { - WARN("Failed to open file %s, error %lu.\n", debugstr_w(filename), GetLastError()); + WARN("Failed to open file %s, error %u.\n", debugstr_w(filename), GetLastError()); return FALSE; } @@ -393,14 +393,14 @@ static DWORD CALLBACK io_thread(void *arg) EnterCriticalSection(&filter->sample_cs); req = CONTAINING_RECORD(ovl, struct request, ovl); - TRACE("Got sample %Iu.\n", req - filter->requests); + TRACE("Got sample %u.\n", req - filter->requests); assert(req >= filter->requests && req < filter->requests + filter->max_requests); if (ret) WakeConditionVariable(&filter->sample_cv); else { - ERR("GetQueuedCompletionStatus() returned failure, error %lu.\n", GetLastError()); + ERR("GetQueuedCompletionStatus() returned failure, error %u.\n", GetLastError()); req->sample = NULL; } @@ -624,6 +624,7 @@ static HRESULT WINAPI FileAsyncReaderPin_AttemptConnection(struct strmbase_sourc FreeMediaType(&This->pin.mt); } + TRACE(" -- %x\n", hr); return hr; } @@ -711,7 +712,7 @@ static HRESULT WINAPI FileAsyncReader_Request(IAsyncReader *iface, IMediaSample HRESULT hr; BYTE *data; - TRACE("filter %p, sample %p, cookie %#Ix.\n", filter, sample, cookie); + TRACE("filter %p, sample %p, cookie %#lx.\n", filter, sample, cookie); if (!sample) return E_POINTER; @@ -764,7 +765,7 @@ static HRESULT WINAPI FileAsyncReader_WaitForNext(IAsyncReader *iface, struct async_reader *filter = impl_from_IAsyncReader(iface); unsigned int i; - TRACE("filter %p, timeout %lu, sample %p, cookie %p.\n", filter, timeout, sample, cookie); + TRACE("filter %p, timeout %u, sample %p, cookie %p.\n", filter, timeout, sample, cookie); *sample = NULL; *cookie = 0; @@ -823,7 +824,7 @@ static BOOL sync_read(HANDLE file, LONGLONG offset, LONG length, BYTE *buffer, D if (ret || GetLastError() == ERROR_IO_PENDING) ret = GetOverlappedResult(file, &ovl, read_len, TRUE); - TRACE("Returning %lu bytes.\n", *read_len); + TRACE("Returning %u bytes.\n", *read_len); CloseHandle(ovl.hEvent); return ret; @@ -872,7 +873,7 @@ static HRESULT WINAPI FileAsyncReader_SyncRead(IAsyncReader *iface, HRESULT hr; BOOL ret; - TRACE("filter %p, offset %s, length %ld, buffer %p.\n", + TRACE("filter %p, offset %s, length %d, buffer %p.\n", filter, wine_dbgstr_longlong(offset), length, buffer); ret = sync_read(filter->file, offset, length, buffer, &read_len); diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index a99fdc80ba6..5f1b80d12cf 100644 --- wine/dlls/quartz/filtergraph.c +++ wine/dlls/quartz/filtergraph.c @@ -61,6 +61,7 @@ struct filter struct list entry; IBaseFilter *filter; IMediaSeeking *seeking; + IMediaPosition *position; WCHAR *name; BOOL sorting; }; @@ -98,7 +99,7 @@ struct filter_graph struct list filters; unsigned int name_index; - FILTER_STATE state; + OAFilterState state; TP_WORK *async_run_work; IReferenceClock *refClock; @@ -181,7 +182,7 @@ static ULONG WINAPI EnumFilters_AddRef(IEnumFilters *iface) struct enum_filters *enum_filters = impl_from_IEnumFilters(iface); ULONG ref = InterlockedIncrement(&enum_filters->ref); - TRACE("%p increasing refcount to %lu.\n", enum_filters, ref); + TRACE("%p increasing refcount to %u.\n", enum_filters, ref); return ref; } @@ -191,7 +192,7 @@ static ULONG WINAPI EnumFilters_Release(IEnumFilters *iface) struct enum_filters *enum_filters = impl_from_IEnumFilters(iface); ULONG ref = InterlockedDecrement(&enum_filters->ref); - TRACE("%p decreasing refcount to %lu.\n", enum_filters, ref); + TRACE("%p decreasing refcount to %u.\n", enum_filters, ref); if (!ref) { @@ -208,7 +209,7 @@ static HRESULT WINAPI EnumFilters_Next(IEnumFilters *iface, ULONG count, struct enum_filters *enum_filters = impl_from_IEnumFilters(iface); unsigned int i = 0; - TRACE("enum_filters %p, count %lu, filters %p, fetched %p.\n", + TRACE("enum_filters %p, count %u, filters %p, fetched %p.\n", enum_filters, count, filters, fetched); if (enum_filters->version != enum_filters->graph->version) @@ -238,7 +239,7 @@ static HRESULT WINAPI EnumFilters_Skip(IEnumFilters *iface, ULONG count) { struct enum_filters *enum_filters = impl_from_IEnumFilters(iface); - TRACE("enum_filters %p, count %lu.\n", enum_filters, count); + TRACE("enum_filters %p, count %u.\n", enum_filters, count); if (enum_filters->version != enum_filters->graph->version) return VFW_E_ENUM_OUT_OF_SYNC; @@ -418,24 +419,23 @@ static HRESULT WINAPI FilterGraphInner_QueryInterface(IUnknown *iface, REFIID ri static ULONG WINAPI FilterGraphInner_AddRef(IUnknown *iface) { - struct filter_graph *graph = impl_from_IUnknown(iface); - ULONG refcount = InterlockedIncrement(&graph->ref); + struct filter_graph *This = impl_from_IUnknown(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("%p increasing refcount to %lu.\n", graph, refcount); + TRACE("(%p)->(): new ref = %d\n", This, ref); - return refcount; + return ref; } static ULONG WINAPI FilterGraphInner_Release(IUnknown *iface) { struct filter_graph *This = impl_from_IUnknown(iface); - ULONG refcount = InterlockedDecrement(&This->ref); + ULONG ref = InterlockedDecrement(&This->ref); struct list *cursor; - TRACE("%p decreasing refcount to %lu.\n", This, refcount); + TRACE("(%p)->(): new ref = %d\n", This, ref); - if (!refcount) - { + if (ref == 0) { int i; This->ref = 1; /* guard against reentrancy (aggregation). */ @@ -477,7 +477,7 @@ static ULONG WINAPI FilterGraphInner_Release(IUnknown *iface) DeleteCriticalSection(&This->cs); free(This); } - return refcount; + return ref; } static struct filter_graph *impl_from_IFilterGraph2(IFilterGraph2 *iface) @@ -507,6 +507,13 @@ static IBaseFilter *find_filter_by_name(struct filter_graph *graph, const WCHAR { struct filter *filter; + /* King of Fighters XIII requests the WMV decoder filter by name to + * connect it to a Sample Grabber filter, return our custom decoder + * filter instance instead. + */ + if (!wcscmp(name, L"WMVideo Decoder DMO")) + name = L"GStreamer splitter filter"; + LIST_FOR_EACH_ENTRY(filter, &graph->filters, struct filter, entry) { if (!wcscmp(filter->name, name)) @@ -542,6 +549,7 @@ static BOOL has_output_pins(IBaseFilter *filter) static void update_seeking(struct filter *filter) { + IMediaPosition *position; IMediaSeeking *seeking; if (!filter->seeking) @@ -560,11 +568,19 @@ static void update_seeking(struct filter *filter) IMediaSeeking_Release(seeking); } } + + if (!filter->position) + { + /* Tokyo Xanadu eX+, same as above, same developer, destroys its filter when + * its IMediaPosition interface is released, so cache the interface instead + * of querying for it every time. */ + if (SUCCEEDED(IBaseFilter_QueryInterface(filter->filter, &IID_IMediaPosition, (void **)&position))) + filter->position = position; + } } static BOOL is_renderer(struct filter *filter) { - IMediaPosition *media_position; IAMFilterMiscFlags *flags; BOOL ret = FALSE; @@ -574,16 +590,11 @@ static BOOL is_renderer(struct filter *filter) ret = TRUE; IAMFilterMiscFlags_Release(flags); } - else if (SUCCEEDED(IBaseFilter_QueryInterface(filter->filter, &IID_IMediaPosition, (void **)&media_position))) - { - if (!has_output_pins(filter->filter)) - ret = TRUE; - IMediaPosition_Release(media_position); - } else { update_seeking(filter); - if (filter->seeking && !has_output_pins(filter->filter)) + if ((filter->seeking || filter->position) && + !has_output_pins(filter->filter)) ret = TRUE; } return ret; @@ -654,6 +665,7 @@ static HRESULT WINAPI FilterGraph2_AddFilter(IFilterGraph2 *iface, list_add_head(&graph->filters, &entry->entry); entry->sorting = FALSE; entry->seeking = NULL; + entry->position = NULL; ++graph->version; return duplicate_name ? VFW_S_DUPLICATE_NAME : hr; @@ -695,7 +707,7 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface, IBaseFilte { if (FAILED(hr = IPin_Disconnect(peer))) { - WARN("Failed to disconnect peer %p, hr %#lx.\n", peer, hr); + WARN("Failed to disconnect peer %p, hr %#x.\n", peer, hr); IPin_Release(peer); IPin_Release(ppin); IEnumPins_Release(penumpins); @@ -705,7 +717,7 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface, IBaseFilte if (FAILED(hr = IPin_Disconnect(ppin))) { - WARN("Failed to disconnect pin %p, hr %#lx.\n", ppin, hr); + WARN("Failed to disconnect pin %p, hr %#x.\n", ppin, hr); IPin_Release(ppin); IEnumPins_Release(penumpins); return hr; @@ -721,6 +733,8 @@ static HRESULT WINAPI FilterGraph2_RemoveFilter(IFilterGraph2 *iface, IBaseFilte { IBaseFilter_SetSyncSource(pFilter, NULL); IBaseFilter_Release(pFilter); + if (entry->position) + IMediaPosition_Release(entry->position); if (entry->seeking) IMediaSeeking_Release(entry->seeking); list_remove(&entry->entry); @@ -772,66 +786,80 @@ static HRESULT WINAPI FilterGraph2_FindFilterByName(IFilterGraph2 *iface, return VFW_E_NOT_FOUND; } -static HRESULT check_cyclic_connection(IPin *source, IPin *sink) +/* Don't allow a circular connection to form, return VFW_E_CIRCULAR_GRAPH if this would be the case. + * A circular connection will be formed if from the filter of the output pin, the input pin can be reached + */ +static HRESULT CheckCircularConnection(struct filter_graph *This, IPin *out, IPin *in) { - IPin *upstream_source, *upstream_sink; - PIN_INFO source_info, sink_info; - IEnumPins *enumpins; +#if 1 HRESULT hr; + PIN_INFO info_out, info_in; - hr = IPin_QueryPinInfo(sink, &sink_info); + hr = IPin_QueryPinInfo(out, &info_out); if (FAILED(hr)) - { - ERR("Failed to query pin, hr %#lx.\n", hr); return hr; - } - IBaseFilter_Release(sink_info.pFilter); - - hr = IPin_QueryPinInfo(source, &source_info); - if (FAILED(hr)) + if (info_out.dir != PINDIR_OUTPUT) { - ERR("Failed to query pin, hr %#lx.\n", hr); - return hr; - } - - if (sink_info.pFilter == source_info.pFilter) - { - WARN("Cyclic connection detected; returning VFW_E_CIRCULAR_GRAPH.\n"); - IBaseFilter_Release(source_info.pFilter); - return VFW_E_CIRCULAR_GRAPH; + IBaseFilter_Release(info_out.pFilter); + return VFW_E_CANNOT_CONNECT; } - hr = IBaseFilter_EnumPins(source_info.pFilter, &enumpins); + hr = IPin_QueryPinInfo(in, &info_in); + if (SUCCEEDED(hr)) + IBaseFilter_Release(info_in.pFilter); if (FAILED(hr)) + goto out; + if (info_in.dir != PINDIR_INPUT) { - ERR("Failed to enumerate pins, hr %#lx.\n", hr); - IBaseFilter_Release(source_info.pFilter); - return hr; + hr = VFW_E_CANNOT_CONNECT; + goto out; } - while ((hr = IEnumPins_Next(enumpins, 1, &upstream_sink, NULL)) == S_OK) + if (info_out.pFilter == info_in.pFilter) + hr = VFW_E_CIRCULAR_GRAPH; + else { - PIN_DIRECTION dir = PINDIR_OUTPUT; + IEnumPins *enumpins; + IPin *test; - IPin_QueryDirection(upstream_sink, &dir); - if (dir == PINDIR_INPUT && IPin_ConnectedTo(upstream_sink, &upstream_source) == S_OK) + hr = IBaseFilter_EnumPins(info_out.pFilter, &enumpins); + if (FAILED(hr)) + goto out; + + IEnumPins_Reset(enumpins); + while ((hr = IEnumPins_Next(enumpins, 1, &test, NULL)) == S_OK) { - hr = check_cyclic_connection(upstream_source, sink); - IPin_Release(upstream_source); - if (FAILED(hr)) + PIN_DIRECTION dir = PINDIR_OUTPUT; + IPin_QueryDirection(test, &dir); + if (dir == PINDIR_INPUT) { - IPin_Release(upstream_sink); - IEnumPins_Release(enumpins); - IBaseFilter_Release(source_info.pFilter); - return hr; + IPin *victim = NULL; + IPin_ConnectedTo(test, &victim); + if (victim) + { + hr = CheckCircularConnection(This, victim, in); + IPin_Release(victim); + if (FAILED(hr)) + { + IPin_Release(test); + break; + } + } } + IPin_Release(test); } - IPin_Release(upstream_sink); + IEnumPins_Release(enumpins); } - IEnumPins_Release(enumpins); - IBaseFilter_Release(source_info.pFilter); +out: + IBaseFilter_Release(info_out.pFilter); + if (FAILED(hr)) + ERR("Checking filtergraph returned %08x, something's not right!\n", hr); + return hr; +#else + /* Debugging filtergraphs not enabled */ return S_OK; +#endif } static struct filter *find_sorted_filter(struct filter_graph *graph, IBaseFilter *iface) @@ -857,7 +885,7 @@ static void sort_filter_recurse(struct filter_graph *graph, struct filter *filte TRACE("Sorting filter %p.\n", filter->filter); - /* Cyclic connections should be caught by check_cyclic_connection(). */ + /* Cyclic connections should be caught by CheckCircularConnection(). */ assert(!filter->sorting); filter->sorting = TRUE; @@ -937,13 +965,13 @@ static HRESULT WINAPI FilterGraph2_ConnectDirect(IFilterGraph2 *iface, IPin *ppi { if (dir == PINDIR_INPUT) { - hr = check_cyclic_connection(ppinOut, ppinIn); + hr = CheckCircularConnection(This, ppinOut, ppinIn); if (SUCCEEDED(hr)) hr = IPin_Connect(ppinOut, ppinIn, pmt); } else { - hr = check_cyclic_connection(ppinIn, ppinOut); + hr = CheckCircularConnection(This, ppinIn, ppinOut); if (SUCCEEDED(hr)) hr = IPin_Connect(ppinIn, ppinOut, pmt); } @@ -1265,7 +1293,7 @@ static HRESULT autoplug(struct filter_graph *graph, IPin *source, IPin *sink, if (callback && FAILED(hr = IAMGraphBuilderCallback_SelectedFilter(callback, moniker))) { - TRACE("Filter rejected by IAMGraphBuilderCallback::SelectedFilter(), hr %#lx.\n", hr); + TRACE("Filter rejected by IAMGraphBuilderCallback::SelectedFilter(), hr %#x.\n", hr); IMoniker_Release(moniker); continue; } @@ -1274,14 +1302,14 @@ static HRESULT autoplug(struct filter_graph *graph, IPin *source, IPin *sink, IMoniker_Release(moniker); if (FAILED(hr)) { - ERR("Failed to create filter for %s, hr %#lx.\n", debugstr_w(V_BSTR(&var)), hr); + ERR("Failed to create filter for %s, hr %#x.\n", debugstr_w(V_BSTR(&var)), hr); VariantClear(&var); continue; } if (callback && FAILED(hr = IAMGraphBuilderCallback_CreatedFilter(callback, filter))) { - TRACE("Filter rejected by IAMGraphBuilderCallback::CreatedFilter(), hr %#lx.\n", hr); + TRACE("Filter rejected by IAMGraphBuilderCallback::CreatedFilter(), hr %#x.\n", hr); IBaseFilter_Release(filter); continue; } @@ -1290,7 +1318,7 @@ static HRESULT autoplug(struct filter_graph *graph, IPin *source, IPin *sink, VariantClear(&var); if (FAILED(hr)) { - ERR("Failed to add filter, hr %#lx.\n", hr); + ERR("Failed to add filter, hr %#x.\n", hr); IBaseFilter_Release(filter); continue; } @@ -1348,89 +1376,10 @@ static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *source, I LeaveCriticalSection(&graph->cs); - TRACE("Returning %#lx.\n", hr); + TRACE("Returning %#x.\n", hr); return hr; } -/* CW HACK 19248 */ -static BOOL is_bethesda_game(void) -{ - static const WCHAR *exe_names[] = { L"oblivion.exe", L"fallout3.exe", L"morrowind.exe" }; - WCHAR name[MAX_PATH], *module_exe; - int i; - - if (!GetModuleFileNameW(NULL, name, sizeof(name))) - return FALSE; - - module_exe = wcsrchr(name, '\\'); - module_exe = module_exe ? module_exe + 1 : name; - - for (i = 0; i < ARRAY_SIZE(exe_names); i++) { - if (!_wcsicmp(module_exe, exe_names[i])) - return TRUE; - } - - return FALSE; -} - -static BOOL is_mac_os(void) -{ - const char *sysname; - void (CDECL *my_wine_get_host_version)(const char **sysname, const char **release); - - my_wine_get_host_version = (void *)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_host_version"); - if (!my_wine_get_host_version) - return FALSE; - - my_wine_get_host_version(&sysname, NULL); - - return !strcmp(sysname, "Darwin"); -} - -static BOOL needs_mp3_hack(void) -{ - static BOOL needs_hack, did_check = FALSE; - - if (!did_check) { - needs_hack = is_mac_os() && is_bethesda_game(); - did_check = TRUE; - } - - return needs_hack; -} - -static BOOL is_mp3_file(LPCWSTR filename) -{ - LPCWSTR ext = wcsrchr(filename, '.'); - if (!ext) - return FALSE; - - return !_wcsicmp(ext, L".mp3"); -} - -static BOOL is_fallout3_mp3_source(IPin *source) -{ - static const CLSID fallout_source_clsid = { 0xc553f2c0, 0x1529, 0x11d0, { 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea } }; - PIN_INFO pin_info; - CLSID clsid; - HRESULT hr; - - if (!source) - return FALSE; - - hr = IPin_QueryPinInfo(source, &pin_info); - if (FAILED(hr)) - return FALSE; - - hr = IBaseFilter_GetClassID(pin_info.pFilter, &clsid); - IBaseFilter_Release(pin_info.pFilter); - if (FAILED(hr)) - return FALSE; - - return IsEqualGUID(&clsid, &fallout_source_clsid); -} -/* End hack */ - static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface, IPin *source) { struct filter_graph *graph = impl_from_IFilterGraph2(iface); @@ -1444,11 +1393,7 @@ static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface, IPin *source) if (hr == VFW_E_CANNOT_CONNECT) hr = VFW_E_CANNOT_RENDER; - /* CW HACK 19248 */ - if (FAILED(hr) && needs_mp3_hack() && is_fallout3_mp3_source(source)) - hr = S_OK; - - TRACE("Returning %#lx.\n", hr); + TRACE("Returning %#x.\n", hr); return hr; } @@ -1501,13 +1446,8 @@ static HRESULT WINAPI FilterGraph2_RenderFile(IFilterGraph2 *iface, LPCWSTR lpcw if (!any) { if (FAILED(hr = IFilterGraph2_RemoveFilter(iface, preader))) - ERR("Failed to remove source filter, hr %#lx.\n", hr); - - /* CW HACK 19248 */ - if (needs_mp3_hack() && is_mp3_file(lpcwstrFile)) - hr = S_OK; - else - hr = VFW_E_CANNOT_RENDER; + ERR("Failed to remove source filter, hr %#x.\n", hr); + hr = VFW_E_CANNOT_RENDER; } else if (partial) { @@ -1520,7 +1460,7 @@ static HRESULT WINAPI FilterGraph2_RenderFile(IFilterGraph2 *iface, LPCWSTR lpcw } IBaseFilter_Release(preader); - TRACE("Returning %#lx.\n", hr); + TRACE("--> %08x\n", hr); return hr; } @@ -1543,13 +1483,13 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, if (FAILED(hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter))) { - WARN("Failed to create filter, hr %#lx.\n", hr); + WARN("Failed to create filter, hr %#x.\n", hr); return hr; } if (FAILED(hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource))) { - WARN("Failed to get IFileSourceFilter, hr %#lx.\n", hr); + WARN("Failed to get IFileSourceFilter, hr %#x.\n", hr); IBaseFilter_Release(filter); return hr; } @@ -1558,7 +1498,7 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, IFileSourceFilter_Release(filesource); if (FAILED(hr)) { - WARN("Failed to load file, hr %#lx.\n", hr); + WARN("Failed to load file, hr %#x.\n", hr); return hr; } @@ -1573,11 +1513,11 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, return S_OK; } -static HRESULT WINAPI FilterGraph2_SetLogFile(IFilterGraph2 *iface, DWORD_PTR file) +static HRESULT WINAPI FilterGraph2_SetLogFile(IFilterGraph2 *iface, DWORD_PTR hFile) { - struct filter_graph *graph = impl_from_IFilterGraph2(iface); + struct filter_graph *This = impl_from_IFilterGraph2(iface); - TRACE("graph %p, file %#Ix.\n", graph, file); + TRACE("(%p/%p)->(%08x): stub !!!\n", This, iface, (DWORD) hFile); return S_OK; } @@ -1612,13 +1552,13 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilterForMoniker(IFilterGraph2 *ifac hr = IMoniker_BindToObject(pMoniker, pCtx, NULL, &IID_IBaseFilter, (void**)&pfilter); if(FAILED(hr)) { - WARN("Failed to bind moniker, hr %#lx.\n", hr); + WARN("Unable to bind moniker to filter object (%x)\n", hr); return hr; } hr = IFilterGraph2_AddFilter(iface, pfilter, lpcwstrFilterName); if (FAILED(hr)) { - WARN("Failed to add filter, hr %#lx.\n", hr); + WARN("Unable to add filter (%x)\n", hr); IBaseFilter_Release(pfilter); return hr; } @@ -1660,10 +1600,10 @@ static HRESULT WINAPI FilterGraph2_RenderEx(IFilterGraph2 *iface, IPin *source, struct filter_graph *graph = impl_from_IFilterGraph2(iface); HRESULT hr; - TRACE("graph %p, source %p, flags %#lx, context %p.\n", graph, source, flags, context); + TRACE("graph %p, source %p, flags %#x, context %p.\n", graph, source, flags, context); if (flags & ~AM_RENDEREX_RENDERTOEXISTINGRENDERERS) - FIXME("Unknown flags %#lx.\n", flags); + FIXME("Unknown flags %#x.\n", flags); EnterCriticalSection(&graph->cs); hr = autoplug(graph, source, NULL, !!(flags & AM_RENDEREX_RENDERTOEXISTINGRENDERERS), 0); @@ -1671,7 +1611,7 @@ static HRESULT WINAPI FilterGraph2_RenderEx(IFilterGraph2 *iface, IPin *source, if (hr == VFW_E_CANNOT_CONNECT) hr = VFW_E_CANNOT_RENDER; - TRACE("Returning %#lx.\n", hr); + TRACE("Returning %#x.\n", hr); return hr; } @@ -1725,52 +1665,47 @@ static ULONG WINAPI MediaControl_Release(IMediaControl *iface) } -static HRESULT WINAPI MediaControl_GetTypeInfoCount(IMediaControl *iface, UINT *count) +/*** IDispatch methods ***/ +static HRESULT WINAPI MediaControl_GetTypeInfoCount(IMediaControl *iface, UINT *pctinfo) { - TRACE("iface %p, count %p.\n", iface, count); - *count = 1; + struct filter_graph *This = impl_from_IMediaControl(iface); + + TRACE("(%p/%p)->(%p): stub !!!\n", This, iface, pctinfo); + return S_OK; } -static HRESULT WINAPI MediaControl_GetTypeInfo(IMediaControl *iface, UINT index, - LCID lcid, ITypeInfo **typeinfo) +static HRESULT WINAPI MediaControl_GetTypeInfo(IMediaControl *iface, UINT iTInfo, LCID lcid, + ITypeInfo **ppTInfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); - return strmbase_get_typeinfo(IMediaControl_tid, typeinfo); + struct filter_graph *This = impl_from_IMediaControl(iface); + + TRACE("(%p/%p)->(%d, %d, %p): stub !!!\n", This, iface, iTInfo, lcid, ppTInfo); + + return S_OK; } -static HRESULT WINAPI MediaControl_GetIDsOfNames(IMediaControl *iface, REFIID iid, - LPOLESTR *names, UINT count, LCID lcid, DISPID *ids) +static HRESULT WINAPI MediaControl_GetIDsOfNames(IMediaControl *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { - ITypeInfo *typeinfo; - HRESULT hr; + struct filter_graph *This = impl_from_IMediaControl(iface); - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", - iface, debugstr_guid(iid), names, count, lcid, ids); + TRACE("(%p/%p)->(%s, %p, %d, %d, %p): stub !!!\n", This, iface, debugstr_guid(riid), rgszNames, + cNames, lcid, rgDispId); - if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaControl_tid, &typeinfo))) - { - hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, ids); - ITypeInfo_Release(typeinfo); - } - return hr; + return S_OK; } -static HRESULT WINAPI MediaControl_Invoke(IMediaControl *iface, DISPID id, REFIID iid, LCID lcid, - WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *error_arg) +static HRESULT WINAPI MediaControl_Invoke(IMediaControl *iface, DISPID dispIdMember, REFIID riid, + LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExepInfo, + UINT *puArgErr) { - ITypeInfo *typeinfo; - HRESULT hr; + struct filter_graph *This = impl_from_IMediaControl(iface); - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", - iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); + TRACE("(%p/%p)->(%d, %s, %d, %04x, %p, %p, %p, %p): stub !!!\n", This, iface, dispIdMember, + debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr); - if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaControl_tid, &typeinfo))) - { - hr = ITypeInfo_Invoke(typeinfo, iface, id, flags, params, result, excepinfo, error_arg); - ITypeInfo_Release(typeinfo); - } - return hr; + return S_OK; } static void update_render_count(struct filter_graph *graph) @@ -1830,11 +1765,11 @@ static HRESULT graph_start(struct filter_graph *graph, REFERENCE_TIME stream_sta HRESULT filter_hr = IBaseFilter_Run(filter->filter, stream_start); if (hr == S_OK) hr = filter_hr; - TRACE("Filter %p returned %#lx.\n", filter->filter, filter_hr); + TRACE("Filter %p returned %#x.\n", filter->filter, filter_hr); } if (FAILED(hr)) - WARN("Failed to start stream, hr %#lx.\n", hr); + WARN("Failed to start stream, hr %#x.\n", hr); return hr; } @@ -1929,7 +1864,7 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) HRESULT filter_hr = IBaseFilter_Pause(filter->filter); if (hr == S_OK) hr = filter_hr; - TRACE("Filter %p returned %#lx.\n", filter->filter, filter_hr); + TRACE("Filter %p returned %#x.\n", filter->filter, filter_hr); /* If a filter returns VFW_S_CANT_CUE, we shouldn't wait for a * paused state. */ @@ -1941,7 +1876,7 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) if (FAILED(hr)) { LeaveCriticalSection(&graph->cs); - WARN("Failed to pause, hr %#lx.\n", hr); + WARN("Failed to pause, hr %#x.\n", hr); return hr; } } @@ -1989,7 +1924,7 @@ static HRESULT WINAPI MediaControl_GetState(IMediaControl *iface, LONG timeout, { struct filter_graph *graph = impl_from_IMediaControl(iface); - TRACE("graph %p, timeout %ld, state %p.\n", graph, timeout, state); + TRACE("graph %p, timeout %u, state %p.\n", graph, timeout, state); if (timeout < 0) timeout = INFINITE; @@ -2040,13 +1975,13 @@ static void CALLBACK wait_pause_cb(TP_CALLBACK_INSTANCE *instance, void *context HRESULT hr; if ((hr = IMediaControl_GetState(control, INFINITE, &state)) != S_OK) - ERR("Failed to get paused state, hr %#lx.\n", hr); + ERR("Failed to get paused state, hr %#x.\n", hr); if (FAILED(hr = IMediaControl_Stop(control))) - ERR("Failed to stop, hr %#lx.\n", hr); + ERR("Failed to stop, hr %#x.\n", hr); if ((hr = IMediaControl_GetState(control, INFINITE, &state)) != S_OK) - ERR("Failed to get paused state, hr %#lx.\n", hr); + ERR("Failed to get paused state, hr %#x.\n", hr); IMediaControl_Release(control); } @@ -2058,7 +1993,7 @@ static void CALLBACK wait_stop_cb(TP_CALLBACK_INSTANCE *instance, void *context) HRESULT hr; if ((hr = IMediaControl_GetState(control, INFINITE, &state)) != S_OK) - ERR("Failed to get state, hr %#lx.\n", hr); + ERR("Failed to get state, hr %#x.\n", hr); IMediaControl_Release(control); } @@ -2145,6 +2080,9 @@ static HRESULT all_renderers_seek(struct filter_graph *This, fnFoundSeek FoundSe HRESULT hr, hr_return = S_OK; struct filter *filter; + TRACE("(%p)->(%p %08lx)\n", This, FoundSeek, arg); + /* Send a message to all renderers, they are responsible for broadcasting it further */ + LIST_FOR_EACH_ENTRY(filter, &This->filters, struct filter, entry) { update_seeking(filter); @@ -2336,7 +2274,7 @@ static HRESULT WINAPI MediaSeeking_GetDuration(IMediaSeeking *iface, LONGLONG *d LeaveCriticalSection(&graph->cs); - TRACE("Returning hr %#lx, duration %s (%s seconds).\n", hr, + TRACE("Returning hr %#x, duration %s (%s seconds).\n", hr, wine_dbgstr_longlong(*duration), debugstr_time(*duration)); return hr; } @@ -2444,7 +2382,7 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG * struct filter *filter; FILTER_STATE state; - TRACE("graph %p, current %s, current_flags %#lx, stop %s, stop_flags %#lx.\n", graph, + TRACE("graph %p, current %s, current_flags %#x, stop %s, stop_flags %#x.\n", graph, current_ptr ? wine_dbgstr_longlong(*current_ptr) : "", current_flags, stop_ptr ? wine_dbgstr_longlong(*stop_ptr): "", stop_flags); if (current_ptr) @@ -2456,11 +2394,11 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG * if ((current_flags & 0x7) != AM_SEEKING_AbsolutePositioning && (current_flags & 0x7) != AM_SEEKING_NoPositioning) - FIXME("Unhandled current_flags %#lx.\n", current_flags & 0x7); + FIXME("Unhandled current_flags %#x.\n", current_flags & 0x7); if ((stop_flags & 0x7) != AM_SEEKING_NoPositioning && (stop_flags & 0x7) != AM_SEEKING_AbsolutePositioning) - FIXME("Unhandled stop_flags %#lx.\n", stop_flags & 0x7); + FIXME("Unhandled stop_flags %#x.\n", stop_flags & 0x7); EnterCriticalSection(&graph->cs); @@ -2615,52 +2553,29 @@ static ULONG WINAPI MediaPosition_Release(IMediaPosition *iface) return IUnknown_Release(graph->outer_unk); } -static HRESULT WINAPI MediaPosition_GetTypeInfoCount(IMediaPosition *iface, UINT *count) +/*** IDispatch methods ***/ +static HRESULT WINAPI MediaPosition_GetTypeInfoCount(IMediaPosition *iface, UINT* pctinfo) { - TRACE("iface %p, count %p.\n", iface, count); - *count = 1; - return S_OK; + FIXME("(%p) stub!\n", iface); + return E_NOTIMPL; } -static HRESULT WINAPI MediaPosition_GetTypeInfo(IMediaPosition *iface, UINT index, - LCID lcid, ITypeInfo **typeinfo) +static HRESULT WINAPI MediaPosition_GetTypeInfo(IMediaPosition *iface, UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); - return strmbase_get_typeinfo(IMediaPosition_tid, typeinfo); + FIXME("(%p) stub!\n", iface); + return E_NOTIMPL; } -static HRESULT WINAPI MediaPosition_GetIDsOfNames(IMediaPosition *iface, REFIID iid, - LPOLESTR *names, UINT count, LCID lcid, DISPID *ids) +static HRESULT WINAPI MediaPosition_GetIDsOfNames(IMediaPosition* iface, REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) { - ITypeInfo *typeinfo; - HRESULT hr; - - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", - iface, debugstr_guid(iid), names, count, lcid, ids); - - if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaPosition_tid, &typeinfo))) - { - hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, ids); - ITypeInfo_Release(typeinfo); - } - return hr; + FIXME("(%p) stub!\n", iface); + return E_NOTIMPL; } -static HRESULT WINAPI MediaPosition_Invoke(IMediaPosition *iface, DISPID id, REFIID iid, LCID lcid, - WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *error_arg) +static HRESULT WINAPI MediaPosition_Invoke(IMediaPosition* iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { - ITypeInfo *typeinfo; - HRESULT hr; - - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", - iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); - - if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaPosition_tid, &typeinfo))) - { - hr = ITypeInfo_Invoke(typeinfo, iface, id, flags, params, result, excepinfo, error_arg); - ITypeInfo_Release(typeinfo); - } - return hr; + FIXME("(%p) stub!\n", iface); + return E_NOTIMPL; } static HRESULT ConvertFromREFTIME(IMediaSeeking *seek, REFTIME time_in, LONGLONG *time_out) @@ -2954,7 +2869,7 @@ static HRESULT WINAPI BasicAudio_GetTypeInfoCount(IBasicAudio *iface, UINT *coun static HRESULT WINAPI BasicAudio_GetTypeInfo(IBasicAudio *iface, UINT index, LCID lcid, ITypeInfo **typeinfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); + TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo); return strmbase_get_typeinfo(IBasicAudio_tid, typeinfo); } @@ -2964,7 +2879,7 @@ static HRESULT WINAPI BasicAudio_GetIDsOfNames(IBasicAudio *iface, REFIID iid, ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", + TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n", iface, debugstr_guid(iid), names, count, lcid, ids); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicAudio_tid, &typeinfo))) @@ -2981,7 +2896,7 @@ static HRESULT WINAPI BasicAudio_Invoke(IBasicAudio *iface, DISPID id, REFIID ii ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", + TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicAudio_tid, &typeinfo))) @@ -2999,7 +2914,7 @@ static HRESULT WINAPI BasicAudio_put_Volume(IBasicAudio *iface, LONG lVolume) IBasicAudio* pBasicAudio; HRESULT hr; - TRACE("graph %p, volume %ld.\n", This, lVolume); + TRACE("(%p/%p)->(%d)\n", This, iface, lVolume); EnterCriticalSection(&This->cs); @@ -3039,7 +2954,7 @@ static HRESULT WINAPI BasicAudio_put_Balance(IBasicAudio *iface, LONG lBalance) IBasicAudio* pBasicAudio; HRESULT hr; - TRACE("graph %p, balance %ld.\n", This, lBalance); + TRACE("(%p/%p)->(%d)\n", This, iface, lBalance); EnterCriticalSection(&This->cs); @@ -3121,7 +3036,7 @@ static HRESULT WINAPI BasicVideo_GetTypeInfoCount(IBasicVideo2 *iface, UINT *cou static HRESULT WINAPI BasicVideo_GetTypeInfo(IBasicVideo2 *iface, UINT index, LCID lcid, ITypeInfo **typeinfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); + TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo); return strmbase_get_typeinfo(IBasicVideo_tid, typeinfo); } @@ -3131,7 +3046,7 @@ static HRESULT WINAPI BasicVideo_GetIDsOfNames(IBasicVideo2 *iface, REFIID iid, ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", + TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n", iface, debugstr_guid(iid), names, count, lcid, ids); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo))) @@ -3148,7 +3063,7 @@ static HRESULT WINAPI BasicVideo_Invoke(IBasicVideo2 *iface, DISPID id, REFIID i ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", + TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo))) @@ -3266,7 +3181,7 @@ static HRESULT WINAPI BasicVideo_put_SourceLeft(IBasicVideo2 *iface, LONG Source IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, left %ld.\n", This, SourceLeft); + TRACE("(%p/%p)->(%d)\n", This, iface, SourceLeft); EnterCriticalSection(&This->cs); @@ -3306,7 +3221,7 @@ static HRESULT WINAPI BasicVideo_put_SourceWidth(IBasicVideo2 *iface, LONG Sourc IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, width %ld.\n", This, SourceWidth); + TRACE("(%p/%p)->(%d)\n", This, iface, SourceWidth); EnterCriticalSection(&This->cs); @@ -3346,7 +3261,7 @@ static HRESULT WINAPI BasicVideo_put_SourceTop(IBasicVideo2 *iface, LONG SourceT IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, top %ld.\n", This, SourceTop); + TRACE("(%p/%p)->(%d)\n", This, iface, SourceTop); EnterCriticalSection(&This->cs); @@ -3386,7 +3301,7 @@ static HRESULT WINAPI BasicVideo_put_SourceHeight(IBasicVideo2 *iface, LONG Sour IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, height %ld.\n", This, SourceHeight); + TRACE("(%p/%p)->(%d)\n", This, iface, SourceHeight); EnterCriticalSection(&This->cs); @@ -3426,7 +3341,7 @@ static HRESULT WINAPI BasicVideo_put_DestinationLeft(IBasicVideo2 *iface, LONG D IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, left %ld.\n", This, DestinationLeft); + TRACE("(%p/%p)->(%d)\n", This, iface, DestinationLeft); EnterCriticalSection(&This->cs); @@ -3466,7 +3381,7 @@ static HRESULT WINAPI BasicVideo_put_DestinationWidth(IBasicVideo2 *iface, LONG IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, width %ld.\n", This, DestinationWidth); + TRACE("(%p/%p)->(%d)\n", This, iface, DestinationWidth); EnterCriticalSection(&This->cs); @@ -3506,7 +3421,7 @@ static HRESULT WINAPI BasicVideo_put_DestinationTop(IBasicVideo2 *iface, LONG De IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, top %ld.\n", This, DestinationTop); + TRACE("(%p/%p)->(%d)\n", This, iface, DestinationTop); EnterCriticalSection(&This->cs); @@ -3546,7 +3461,7 @@ static HRESULT WINAPI BasicVideo_put_DestinationHeight(IBasicVideo2 *iface, LONG IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, height %ld.\n", This, DestinationHeight); + TRACE("(%p/%p)->(%d)\n", This, iface, DestinationHeight); EnterCriticalSection(&This->cs); @@ -3588,7 +3503,7 @@ static HRESULT WINAPI BasicVideo_SetSourcePosition(IBasicVideo2 *iface, LONG Lef IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, left %ld, top %ld, width %ld, height %ld.\n", This, Left, Top, Width, Height); + TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height); EnterCriticalSection(&This->cs); @@ -3650,7 +3565,7 @@ static HRESULT WINAPI BasicVideo_SetDestinationPosition(IBasicVideo2 *iface, LON IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, left %ld, top %ld, width %ld, height %ld.\n", This, Left, Top, Width, Height); + TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height); EnterCriticalSection(&This->cs); @@ -3732,8 +3647,7 @@ static HRESULT WINAPI BasicVideo_GetVideoPaletteEntries(IBasicVideo2 *iface, LON IBasicVideo *pBasicVideo; HRESULT hr; - TRACE("graph %p, start_index %ld, count %ld, ret_count %p, entries %p.\n", - This, StartIndex, Entries, pRetrieved, pPalette); + TRACE("(%p/%p)->(%d, %d, %p, %p)\n", This, iface, StartIndex, Entries, pRetrieved, pPalette); EnterCriticalSection(&This->cs); @@ -3906,7 +3820,7 @@ HRESULT WINAPI VideoWindow_GetTypeInfoCount(IVideoWindow *iface, UINT *count) HRESULT WINAPI VideoWindow_GetTypeInfo(IVideoWindow *iface, UINT index, LCID lcid, ITypeInfo **typeinfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); + TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo); return strmbase_get_typeinfo(IVideoWindow_tid, typeinfo); } @@ -3916,7 +3830,7 @@ HRESULT WINAPI VideoWindow_GetIDsOfNames(IVideoWindow *iface, REFIID iid, ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", + TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n", iface, debugstr_guid(iid), names, count, lcid, ids); if (SUCCEEDED(hr = strmbase_get_typeinfo(IVideoWindow_tid, &typeinfo))) @@ -3933,7 +3847,7 @@ static HRESULT WINAPI VideoWindow_Invoke(IVideoWindow *iface, DISPID id, REFIID ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", + TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); if (SUCCEEDED(hr = strmbase_get_typeinfo(IVideoWindow_tid, &typeinfo))) @@ -3991,7 +3905,7 @@ static HRESULT WINAPI VideoWindow_put_WindowStyle(IVideoWindow *iface, LONG Wind IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, style %#lx.\n", This, WindowStyle); + TRACE("(%p/%p)->(%d)\n", This, iface, WindowStyle); EnterCriticalSection(&This->cs); @@ -4031,7 +3945,7 @@ static HRESULT WINAPI VideoWindow_put_WindowStyleEx(IVideoWindow *iface, LONG Wi IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, style %#lx.\n", This, WindowStyleEx); + TRACE("(%p/%p)->(%d)\n", This, iface, WindowStyleEx); EnterCriticalSection(&This->cs); @@ -4071,7 +3985,7 @@ static HRESULT WINAPI VideoWindow_put_AutoShow(IVideoWindow *iface, LONG AutoSho IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, show %#lx.\n", This, AutoShow); + TRACE("(%p/%p)->(%d)\n", This, iface, AutoShow); EnterCriticalSection(&This->cs); @@ -4111,7 +4025,7 @@ static HRESULT WINAPI VideoWindow_put_WindowState(IVideoWindow *iface, LONG Wind IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, state %ld.\n", This, WindowState); + TRACE("(%p/%p)->(%d)\n", This, iface, WindowState); EnterCriticalSection(&This->cs); @@ -4151,7 +4065,7 @@ static HRESULT WINAPI VideoWindow_put_BackgroundPalette(IVideoWindow *iface, LON IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, palette %ld.\n", This, BackgroundPalette); + TRACE("(%p/%p)->(%d)\n", This, iface, BackgroundPalette); EnterCriticalSection(&This->cs); @@ -4192,7 +4106,7 @@ static HRESULT WINAPI VideoWindow_put_Visible(IVideoWindow *iface, LONG Visible) IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, visible %ld.\n", This, Visible); + TRACE("(%p/%p)->(%d)\n", This, iface, Visible); EnterCriticalSection(&This->cs); @@ -4232,7 +4146,7 @@ static HRESULT WINAPI VideoWindow_put_Left(IVideoWindow *iface, LONG Left) IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, left %ld.\n", This, Left); + TRACE("(%p/%p)->(%d)\n", This, iface, Left); EnterCriticalSection(&This->cs); @@ -4272,7 +4186,7 @@ static HRESULT WINAPI VideoWindow_put_Width(IVideoWindow *iface, LONG Width) IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, width %ld.\n", This, Width); + TRACE("(%p/%p)->(%d)\n", This, iface, Width); EnterCriticalSection(&This->cs); @@ -4312,7 +4226,7 @@ static HRESULT WINAPI VideoWindow_put_Top(IVideoWindow *iface, LONG Top) IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, top %ld.\n", This, Top); + TRACE("(%p/%p)->(%d)\n", This, iface, Top); EnterCriticalSection(&This->cs); @@ -4352,7 +4266,7 @@ static HRESULT WINAPI VideoWindow_put_Height(IVideoWindow *iface, LONG Height) IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, height %ld.\n", This, Height); + TRACE("(%p/%p)->(%d)\n", This, iface, Height); EnterCriticalSection(&This->cs); @@ -4392,7 +4306,7 @@ static HRESULT WINAPI VideoWindow_put_Owner(IVideoWindow *iface, OAHWND Owner) IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, owner %#Ix.\n", This, Owner); + TRACE("(%p/%p)->(%08x)\n", This, iface, (DWORD) Owner); EnterCriticalSection(&This->cs); @@ -4432,7 +4346,7 @@ static HRESULT WINAPI VideoWindow_put_MessageDrain(IVideoWindow *iface, OAHWND D IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, drain %#Ix.\n", This, Drain); + TRACE("(%p/%p)->(%08x)\n", This, iface, (DWORD) Drain); EnterCriticalSection(&This->cs); @@ -4492,7 +4406,7 @@ static HRESULT WINAPI VideoWindow_put_BorderColor(IVideoWindow *iface, LONG Colo IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, colour %#lx.\n", This, Color); + TRACE("(%p/%p)->(%d)\n", This, iface, Color); EnterCriticalSection(&This->cs); @@ -4532,7 +4446,7 @@ static HRESULT WINAPI VideoWindow_put_FullScreenMode(IVideoWindow *iface, LONG F IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, fullscreen %ld.\n", This, FullScreenMode); + TRACE("(%p/%p)->(%d)\n", This, iface, FullScreenMode); EnterCriticalSection(&This->cs); @@ -4552,7 +4466,7 @@ static HRESULT WINAPI VideoWindow_SetWindowForeground(IVideoWindow *iface, LONG IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, focus %ld.\n", This, Focus); + TRACE("(%p/%p)->(%d)\n", This, iface, Focus); EnterCriticalSection(&This->cs); @@ -4573,7 +4487,7 @@ static HRESULT WINAPI VideoWindow_NotifyOwnerMessage(IVideoWindow *iface, OAHWND IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, hwnd %#Ix, message %#lx, wparam %#Ix, lparam %#Ix.\n", This, hwnd, uMsg, wParam, lParam); + TRACE("(%p/%p)->(%08lx, %d, %08lx, %08lx)\n", This, iface, hwnd, uMsg, wParam, lParam); EnterCriticalSection(&This->cs); @@ -4594,7 +4508,7 @@ static HRESULT WINAPI VideoWindow_SetWindowPosition(IVideoWindow *iface, LONG Le IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, left %ld, top %ld, width %ld, height %ld.\n", This, Left, Top, Width, Height); + TRACE("(%p/%p)->(%d, %d, %d, %d)\n", This, iface, Left, Top, Width, Height); EnterCriticalSection(&This->cs); @@ -4698,7 +4612,7 @@ static HRESULT WINAPI VideoWindow_HideCursor(IVideoWindow *iface, LONG HideCurso IVideoWindow *pVideoWindow; HRESULT hr; - TRACE("graph %p, hide %ld.\n", This, HideCursor); + TRACE("(%p/%p)->(%d)\n", This, iface, HideCursor); EnterCriticalSection(&This->cs); @@ -4806,54 +4720,50 @@ static ULONG WINAPI MediaEvent_Release(IMediaEventEx *iface) return IUnknown_Release(graph->outer_unk); } -static HRESULT WINAPI MediaEvent_GetTypeInfoCount(IMediaEventEx *iface, UINT *count) +/*** IDispatch methods ***/ +static HRESULT WINAPI MediaEvent_GetTypeInfoCount(IMediaEventEx *iface, UINT *pctinfo) { - TRACE("iface %p, count %p.\n", iface, count); - *count = 1; + struct filter_graph *This = impl_from_IMediaEventEx(iface); + + TRACE("(%p/%p)->(%p): stub !!!\n", This, iface, pctinfo); + return S_OK; } -static HRESULT WINAPI MediaEvent_GetTypeInfo(IMediaEventEx *iface, UINT index, - LCID lcid, ITypeInfo **typeinfo) +static HRESULT WINAPI MediaEvent_GetTypeInfo(IMediaEventEx *iface, UINT iTInfo, LCID lcid, + ITypeInfo **ppTInfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); - return strmbase_get_typeinfo(IMediaEvent_tid, typeinfo); + struct filter_graph *This = impl_from_IMediaEventEx(iface); + + TRACE("(%p/%p)->(%d, %d, %p): stub !!!\n", This, iface, iTInfo, lcid, ppTInfo); + + return S_OK; } -static HRESULT WINAPI MediaEvent_GetIDsOfNames(IMediaEventEx *iface, REFIID iid, - LPOLESTR *names, UINT count, LCID lcid, DISPID *ids) +static HRESULT WINAPI MediaEvent_GetIDsOfNames(IMediaEventEx *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { - ITypeInfo *typeinfo; - HRESULT hr; + struct filter_graph *This = impl_from_IMediaEventEx(iface); - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", - iface, debugstr_guid(iid), names, count, lcid, ids); + TRACE("(%p/%p)->(%s, %p, %d, %d, %p): stub !!!\n", This, iface, debugstr_guid(riid), rgszNames, + cNames, lcid, rgDispId); - if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaEvent_tid, &typeinfo))) - { - hr = ITypeInfo_GetIDsOfNames(typeinfo, names, count, ids); - ITypeInfo_Release(typeinfo); - } - return hr; + return S_OK; } -static HRESULT WINAPI MediaEvent_Invoke(IMediaEventEx *iface, DISPID id, REFIID iid, LCID lcid, - WORD flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excepinfo, UINT *error_arg) +static HRESULT WINAPI MediaEvent_Invoke(IMediaEventEx *iface, DISPID dispIdMember, REFIID riid, + LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExepInfo, + UINT *puArgErr) { - ITypeInfo *typeinfo; - HRESULT hr; + struct filter_graph *This = impl_from_IMediaEventEx(iface); - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", - iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); + TRACE("(%p/%p)->(%d, %s, %d, %04x, %p, %p, %p, %p): stub !!!\n", This, iface, dispIdMember, + debugstr_guid(riid), lcid, wFlags, pDispParams, pVarResult, pExepInfo, puArgErr); - if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaEvent_tid, &typeinfo))) - { - hr = ITypeInfo_Invoke(typeinfo, iface, id, flags, params, result, excepinfo, error_arg); - ITypeInfo_Release(typeinfo); - } - return hr; + return S_OK; } +/*** IMediaEvent methods ***/ static HRESULT WINAPI MediaEvent_GetEventHandle(IMediaEventEx *iface, OAEVENT *event) { struct filter_graph *graph = impl_from_IMediaEventEx(iface); @@ -4871,7 +4781,7 @@ static HRESULT WINAPI MediaEvent_GetEvent(IMediaEventEx *iface, LONG *code, struct media_event *event; struct list *entry; - TRACE("graph %p, code %p, param1 %p, param2 %p, timeout %ld.\n", graph, code, param1, param2, timeout); + TRACE("graph %p, code %p, param1 %p, param2 %p, timeout %d.\n", graph, code, param1, param2, timeout); *code = 0; @@ -4902,7 +4812,7 @@ static HRESULT WINAPI MediaEvent_WaitForCompletion(IMediaEventEx *iface, LONG ms { struct filter_graph *This = impl_from_IMediaEventEx(iface); - TRACE("graph %p, timeout %ld, code %p.\n", This, msTimeout, pEvCode); + TRACE("(%p/%p)->(%d, %p)\n", This, iface, msTimeout, pEvCode); if (This->state != State_Running) return VFW_E_WRONG_STATE; @@ -4921,7 +4831,7 @@ static HRESULT WINAPI MediaEvent_CancelDefaultHandling(IMediaEventEx *iface, LON { struct filter_graph *This = impl_from_IMediaEventEx(iface); - TRACE("graph %p, code %#lx.\n", This, lEvCode); + TRACE("(%p/%p)->(%d)\n", This, iface, lEvCode); if (lEvCode == EC_COMPLETE) This->HandleEcComplete = FALSE; @@ -4939,7 +4849,7 @@ static HRESULT WINAPI MediaEvent_RestoreDefaultHandling(IMediaEventEx *iface, LO { struct filter_graph *This = impl_from_IMediaEventEx(iface); - TRACE("graph %p, code %#lx.\n", This, lEvCode); + TRACE("(%p/%p)->(%d)\n", This, iface, lEvCode); if (lEvCode == EC_COMPLETE) This->HandleEcComplete = TRUE; @@ -4953,12 +4863,12 @@ static HRESULT WINAPI MediaEvent_RestoreDefaultHandling(IMediaEventEx *iface, LO return S_OK; } -static HRESULT WINAPI MediaEvent_FreeEventParams(IMediaEventEx *iface, LONG code, - LONG_PTR param1, LONG_PTR param2) +static HRESULT WINAPI MediaEvent_FreeEventParams(IMediaEventEx *iface, LONG lEvCode, + LONG_PTR lParam1, LONG_PTR lParam2) { - struct filter_graph *graph = impl_from_IMediaEventEx(iface); + struct filter_graph *This = impl_from_IMediaEventEx(iface); - WARN("graph %p, code %#lx, param1 %Id, param2 %Id, stub!\n", graph, code, param1, param2); + TRACE("(%p/%p)->(%d, %08lx, %08lx): stub !!!\n", This, iface, lEvCode, lParam1, lParam2); return S_OK; } @@ -4969,7 +4879,7 @@ static HRESULT WINAPI MediaEvent_SetNotifyWindow(IMediaEventEx *iface, { struct filter_graph *graph = impl_from_IMediaEventEx(iface); - TRACE("graph %p, window %#Ix, message %#lx, lparam %#Ix.\n", graph, window, message, lparam); + TRACE("graph %p, window %#Ix, message %#x, lparam %#Ix.\n", graph, window, message, lparam); graph->media_event_window = (HWND)window; graph->media_event_message = message; @@ -4982,11 +4892,11 @@ static HRESULT WINAPI MediaEvent_SetNotifyFlags(IMediaEventEx *iface, LONG flags { struct filter_graph *graph = impl_from_IMediaEventEx(iface); - TRACE("graph %p, flags %#lx.\n", graph, flags); + TRACE("graph %p, flags %#x.\n", graph, flags); if (flags & ~AM_MEDIAEVENT_NONOTIFY) { - WARN("Invalid flags %#lx, returning E_INVALIDARG.\n", flags); + WARN("Invalid flags %#x, returning E_INVALIDARG.\n", flags); return E_INVALIDARG; } @@ -5208,7 +5118,7 @@ static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD timeout, F DWORD end = GetTickCount() + timeout; HRESULT hr; - TRACE("graph %p, timeout %lu, state %p.\n", graph, timeout, state); + TRACE("graph %p, timeout %u, state %p.\n", graph, timeout, state); if (!state) return E_POINTER; @@ -5234,7 +5144,7 @@ static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD timeout, F { HRESULT filter_hr = IBaseFilter_GetState(filter->filter, 0, &filter_state); - TRACE("Filter %p returned hr %#lx, state %u.\n", filter->filter, filter_hr, filter_state); + TRACE("Filter %p returned hr %#x, state %u.\n", filter->filter, filter_hr, filter_state); if (filter_hr == VFW_S_STATE_INTERMEDIATE) async_filter = filter->filter; @@ -5276,7 +5186,7 @@ static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD timeout, F EnterCriticalSection(&graph->cs); } - TRACE("Returning %#lx, state %u.\n", hr, *state); + TRACE("Returning %#x, state %u.\n", hr, *state); return hr; } @@ -5395,7 +5305,7 @@ static HRESULT WINAPI MediaEventSink_Notify(IMediaEventSink *iface, LONG code, { struct filter_graph *graph = impl_from_IMediaEventSink(iface); - TRACE("graph %p, code %#lx, param1 %#Ix, param2 %#Ix.\n", graph, code, param1, param2); + TRACE("graph %p, code %#x, param1 %#Ix, param2 %#Ix.\n", graph, code, param1, param2); EnterCriticalSection(&graph->event_cs); @@ -5459,35 +5369,34 @@ static ULONG WINAPI GraphConfig_Release(IGraphConfig *iface) return IUnknown_Release(graph->outer_unk); } -static HRESULT WINAPI GraphConfig_Reconnect(IGraphConfig *iface, IPin *source, IPin *sink, - const AM_MEDIA_TYPE *mt, IBaseFilter *filter, HANDLE abort_event, DWORD flags) +static HRESULT WINAPI GraphConfig_Reconnect(IGraphConfig *iface, IPin *pOutputPin, IPin *pInputPin, + const AM_MEDIA_TYPE *pmtFirstConnection, IBaseFilter *pUsingFilter, HANDLE hAbortEvent, + DWORD dwFlags) { - struct filter_graph *graph = impl_from_IGraphConfig(iface); - - FIXME("graph %p, source %p, sink %p, mt %p, filter %p, abort_event %p, flags %#lx, stub!\n", - graph, source, sink, mt, filter, abort_event, flags); - strmbase_dump_media_type(mt); + struct filter_graph *This = impl_from_IGraphConfig(iface); + FIXME("(%p)->(%p, %p, %p, %p, %p, %x): stub!\n", This, pOutputPin, pInputPin, pmtFirstConnection, pUsingFilter, hAbortEvent, dwFlags); + strmbase_dump_media_type(pmtFirstConnection); + return E_NOTIMPL; } -static HRESULT WINAPI GraphConfig_Reconfigure(IGraphConfig *iface, - IGraphConfigCallback *callback, void *context, DWORD flags, HANDLE abort_event) +static HRESULT WINAPI GraphConfig_Reconfigure(IGraphConfig *iface, IGraphConfigCallback *pCallback, + void *pvContext, DWORD dwFlags, HANDLE hAbortEvent) { - struct filter_graph *graph = impl_from_IGraphConfig(iface); + struct filter_graph *This = impl_from_IGraphConfig(iface); HRESULT hr; - TRACE("graph %p, callback %p, context %p, flags %#lx, abort_event %p.\n", - graph, callback, context, flags, abort_event); + WARN("(%p)->(%p, %p, %x, %p): partial stub!\n", This, pCallback, pvContext, dwFlags, hAbortEvent); - if (abort_event) + if (hAbortEvent) FIXME("The parameter hAbortEvent is not handled!\n"); - EnterCriticalSection(&graph->cs); + EnterCriticalSection(&This->cs); - hr = IGraphConfigCallback_Reconfigure(callback, context, flags); + hr = IGraphConfigCallback_Reconfigure(pCallback, pvContext, dwFlags); - LeaveCriticalSection(&graph->cs); + LeaveCriticalSection(&This->cs); return hr; } @@ -5538,11 +5447,12 @@ static HRESULT WINAPI GraphConfig_PushThroughData(IGraphConfig *iface, IPin *pOu return E_NOTIMPL; } -static HRESULT WINAPI GraphConfig_SetFilterFlags(IGraphConfig *iface, IBaseFilter *filter, DWORD flags) +static HRESULT WINAPI GraphConfig_SetFilterFlags(IGraphConfig *iface, IBaseFilter *pFilter, + DWORD dwFlags) { - struct filter_graph *graph = impl_from_IGraphConfig(iface); + struct filter_graph *This = impl_from_IGraphConfig(iface); - FIXME("graph %p, filter %p, flags %#lx, stub!\n", graph, filter, flags); + FIXME("(%p)->(%p, %x): stub!\n", This, pFilter, dwFlags); return E_NOTIMPL; } @@ -5557,11 +5467,12 @@ static HRESULT WINAPI GraphConfig_GetFilterFlags(IGraphConfig *iface, IBaseFilte return E_NOTIMPL; } -static HRESULT WINAPI GraphConfig_RemoveFilterEx(IGraphConfig *iface, IBaseFilter *filter, DWORD flags) +static HRESULT WINAPI GraphConfig_RemoveFilterEx(IGraphConfig *iface, IBaseFilter *pFilter, + DWORD dwFlags) { - struct filter_graph *graph = impl_from_IGraphConfig(iface); + struct filter_graph *This = impl_from_IGraphConfig(iface); - FIXME("graph %p, filter %p, flags %#lx, stub!\n", graph, filter, flags); + FIXME("(%p)->(%p, %x): stub!\n", This, pFilter, dwFlags); return E_NOTIMPL; } @@ -5609,16 +5520,16 @@ static ULONG WINAPI GraphVersion_Release(IGraphVersion *iface) return IUnknown_Release(graph->outer_unk); } -static HRESULT WINAPI GraphVersion_QueryVersion(IGraphVersion *iface, LONG *version) +static HRESULT WINAPI GraphVersion_QueryVersion(IGraphVersion *iface, LONG *pVersion) { - struct filter_graph *graph = impl_from_IGraphVersion(iface); + struct filter_graph *This = impl_from_IGraphVersion(iface); - TRACE("graph %p, version %p, returning %ld.\n", graph, version, graph->version); - - if (!version) + if(!pVersion) return E_POINTER; - *version = graph->version; + TRACE("(%p)->(%p): current version %i\n", This, pVersion, This->version); + + *pVersion = This->version; return S_OK; } @@ -5655,13 +5566,13 @@ static ULONG WINAPI VideoFrameStep_Release(IVideoFrameStep *iface) static HRESULT WINAPI VideoFrameStep_Step(IVideoFrameStep *iface, DWORD frame_count, IUnknown *filter) { - FIXME("iface %p, frame_count %lu, filter %p, stub!\n", iface, frame_count, filter); + FIXME("iface %p, frame_count %u, filter %p, stub!\n", iface, frame_count, filter); return E_NOTIMPL; } static HRESULT WINAPI VideoFrameStep_CanStep(IVideoFrameStep *iface, LONG multiple, IUnknown *filter) { - FIXME("iface %p, multiple %ld, filter %p, stub!\n", iface, multiple, filter); + FIXME("iface %p, multiple %d, filter %p, stub!\n", iface, multiple, filter); return E_NOTIMPL; } @@ -5688,11 +5599,28 @@ static const IUnknownVtbl IInner_VTable = FilterGraphInner_Release }; +static BOOL CALLBACK register_winegstreamer_proc(INIT_ONCE *once, void *param, void **ctx) +{ + HMODULE mod = LoadLibraryW(L"winegstreamer.dll"); + if (mod) + { + HRESULT (WINAPI *proc)(void) = (void *)GetProcAddress(mod, "DllRegisterServer"); + proc(); + FreeLibrary(mod); + } + return TRUE; +} + static HRESULT filter_graph_common_create(IUnknown *outer, IUnknown **out, BOOL threaded) { + static INIT_ONCE once = INIT_ONCE_STATIC_INIT; struct filter_graph *object; HRESULT hr; + /* HACK: our build system makes it difficult to load gstreamer on prefix + * creation, so it won't get registered. Do that here instead. */ + InitOnceExecuteOnce(&once, register_winegstreamer_proc, NULL, NULL); + *out = NULL; if (!(object = calloc(1, sizeof(*object)))) @@ -5719,7 +5647,7 @@ static HRESULT filter_graph_common_create(IUnknown *outer, IUnknown **out, BOOL if (FAILED(hr = CoCreateInstance(&CLSID_FilterMapper2, object->outer_unk, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&object->punkFilterMapper2))) { - ERR("Failed to create filter mapper, hr %#lx.\n", hr); + ERR("Failed to create filter mapper, hr %#x.\n", hr); free(object); return hr; } diff --git a/dlls/quartz/filtermapper.c b/dlls/quartz/filtermapper.c index 149bc8d1716..a95f0ca7832 100644 --- wine/dlls/quartz/filtermapper.c +++ wine/dlls/quartz/filtermapper.c @@ -76,7 +76,7 @@ static ULONG WINAPI enum_reg_filters_AddRef(IEnumRegFilters *iface) { struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface); ULONG refcount = InterlockedIncrement(&enumerator->refcount); - TRACE("%p increasing refcount to %lu.\n", enumerator, refcount); + TRACE("%p increasing refcount to %u.\n", enumerator, refcount); return refcount; } @@ -86,7 +86,7 @@ static ULONG WINAPI enum_reg_filters_Release(IEnumRegFilters *iface) ULONG refcount = InterlockedDecrement(&enumerator->refcount); unsigned int i; - TRACE("%p decreasing refcount to %lu.\n", enumerator, refcount); + TRACE("%p decreasing refcount to %u.\n", enumerator, refcount); if (!refcount) { for (i = 0; i < enumerator->count; ++i) @@ -103,7 +103,7 @@ static HRESULT WINAPI enum_reg_filters_Next(IEnumRegFilters *iface, ULONG count, struct enum_reg_filters *enumerator = impl_from_IEnumRegFilters(iface); unsigned int i; - TRACE("iface %p, count %lu, filters %p, ret_count %p.\n", iface, count, filters, ret_count); + TRACE("iface %p, count %u, filters %p, ret_count %p.\n", iface, count, filters, ret_count); for (i = 0; i < count && enumerator->index + i < enumerator->count; ++i) { @@ -131,7 +131,7 @@ static HRESULT WINAPI enum_reg_filters_Next(IEnumRegFilters *iface, ULONG count, static HRESULT WINAPI enum_reg_filters_Skip(IEnumRegFilters *iface, ULONG count) { - TRACE("iface %p, count %lu, unimplemented.\n", iface, count); + TRACE("iface %p, count %u, unimplemented.\n", iface, count); return E_NOTIMPL; } @@ -234,7 +234,7 @@ static ULONG WINAPI enum_moniker_AddRef(IEnumMoniker *iface) { struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface); ULONG refcount = InterlockedIncrement(&enumerator->refcount); - TRACE("%p increasing refcount to %lu.\n", enumerator, refcount); + TRACE("%p increasing refcount to %u.\n", enumerator, refcount); return refcount; } @@ -244,7 +244,7 @@ static ULONG WINAPI enum_moniker_Release(IEnumMoniker *iface) ULONG refcount = InterlockedDecrement(&enumerator->refcount); unsigned int i; - TRACE("%p decreasing refcount to %lu.\n", enumerator, refcount); + TRACE("%p decreasing refcount to %u.\n", enumerator, refcount); if (!refcount) { for (i = 0; i < enumerator->count; ++i) @@ -261,7 +261,7 @@ static HRESULT WINAPI enum_moniker_Next(IEnumMoniker *iface, ULONG count, struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface); unsigned int i; - TRACE("iface %p, count %lu, filters %p, ret_count %p.\n", iface, count, filters, ret_count); + TRACE("iface %p, count %u, filters %p, ret_count %p.\n", iface, count, filters, ret_count); for (i = 0; i < count && enumerator->index + i < enumerator->count; ++i) IMoniker_AddRef(filters[i] = enumerator->filters[enumerator->index + i]); @@ -276,7 +276,7 @@ static HRESULT WINAPI enum_moniker_Skip(IEnumMoniker *iface, ULONG count) { struct enum_moniker *enumerator = impl_from_IEnumMoniker(iface); - TRACE("iface %p, count %lu.\n", iface, count); + TRACE("iface %p, count %u.\n", iface, count); enumerator->index += count; return S_OK; @@ -469,27 +469,27 @@ static HRESULT WINAPI Inner_QueryInterface(IUnknown *iface, REFIID riid, void ** static ULONG WINAPI Inner_AddRef(IUnknown *iface) { - FilterMapper3Impl *mapper = impl_from_IUnknown(iface); - ULONG refcount = InterlockedIncrement(&mapper->ref); + FilterMapper3Impl *This = impl_from_IUnknown(iface); + ULONG ref = InterlockedIncrement(&This->ref); - TRACE("%p increasing refcount to %lu.\n", mapper, refcount); + TRACE("(%p)->(): new ref = %d\n", This, ref); - return refcount; + return ref; } static ULONG WINAPI Inner_Release(IUnknown *iface) { - FilterMapper3Impl *mapper = impl_from_IUnknown(iface); - ULONG refcount = InterlockedDecrement(&mapper->ref); + FilterMapper3Impl *This = impl_from_IUnknown(iface); + ULONG ref = InterlockedDecrement(&This->ref); - TRACE("%p decreasing refcount to %lu.\n", mapper, refcount); + TRACE("(%p)->(): new ref = %d\n", This, ref); - if (!refcount) + if (ref == 0) { - CoTaskMemFree(mapper); + CoTaskMemFree(This); } - return refcount; + return ref; } static const IUnknownVtbl IInner_VTable = @@ -529,7 +529,7 @@ static HRESULT WINAPI FilterMapper3_CreateCategory(IFilterMapper3 *iface, HKEY key; LONG ret; - TRACE("iface %p, category %s, merit %#lx, description %s.\n", iface, + TRACE("iface %p, category %s, merit %#x, description %s.\n", iface, debugstr_guid(category), merit, debugstr_w(description)); StringFromGUID2(category, guidstr, ARRAY_SIZE(guidstr)); @@ -702,14 +702,14 @@ static HRESULT FM2_ReadFilterData(BYTE *pData, REGFILTER2 * prf2) if (prrf->dwVersion != 2) { - FIXME("Filter registry version %lu is not supported.\n", prrf->dwVersion); + FIXME("Filter registry version %d not supported\n", prrf->dwVersion); ZeroMemory(prf2, sizeof(*prf2)); hr = E_FAIL; } if (SUCCEEDED(hr)) { - TRACE("dwVersion %lu, dwMerit %#lx, dwPins %lu, dwUnused %#lx.\n", + TRACE("version = %d, merit = %x, #pins = %d, unused = %x\n", prrf->dwVersion, prrf->dwMerit, prrf->dwPins, prrf->dwUnused); prf2->dwVersion = prrf->dwVersion; @@ -730,7 +730,7 @@ static HRESULT FM2_ReadFilterData(BYTE *pData, REGFILTER2 * prf2) TRACE("\tsignature = %s\n", debugstr_an((const char*)prrfp->signature, 4)); - TRACE("\tPin %lu: dwFlags %#lx, dwInstances %lu, dwMediaTypes %lu, dwMediums %lu.\n", + TRACE("\tpin[%d]: flags = %x, instances = %d, media types = %d, mediums = %d\n", i, prrfp->dwFlags, prrfp->dwInstances, prrfp->dwMediaTypes, prrfp->dwMediums); rgPins2[i].dwFlags = prrfp->dwFlags; @@ -901,7 +901,7 @@ static HRESULT WINAPI FilterMapper3_RegisterFilter(IFilterMapper3 *iface, if (FAILED(hr = IParseDisplayName_ParseDisplayName(parser, NULL, display_name, &eaten, &moniker))) { - ERR("Failed to parse display name, hr %#lx.\n", hr); + ERR("Failed to parse display name, hr %#x.\n", hr); IParseDisplayName_Release(parser); free(display_name); return hr; @@ -911,7 +911,7 @@ static HRESULT WINAPI FilterMapper3_RegisterFilter(IFilterMapper3 *iface, if (FAILED(hr = IMoniker_BindToStorage(moniker, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag))) { - ERR("Failed to get property bag, hr %#lx.\n", hr); + ERR("Failed to get property bag, hr %#x.\n", hr); IMoniker_Release(moniker); free(display_name); return hr; @@ -920,13 +920,13 @@ static HRESULT WINAPI FilterMapper3_RegisterFilter(IFilterMapper3 *iface, V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(name); if (FAILED(hr = IPropertyBag_Write(prop_bag, L"FriendlyName", &var))) - ERR("Failed to write friendly name, hr %#lx.\n", hr); + ERR("Failed to write friendly name, hr %#x.\n", hr); VariantClear(&var); V_VT(&var) = VT_BSTR; V_BSTR(&var) = SysAllocString(clsid_string); if (FAILED(hr = IPropertyBag_Write(prop_bag, L"CLSID", &var))) - ERR("Failed to write class ID, hr %#lx.\n", hr); + ERR("Failed to write class ID, hr %#x.\n", hr); VariantClear(&var); if (SUCCEEDED(FM2_WriteFilterData(®filter2, &filter_data, &filter_data_len))) @@ -936,7 +936,7 @@ static HRESULT WINAPI FilterMapper3_RegisterFilter(IFilterMapper3 *iface, { memcpy(V_ARRAY(&var)->pvData, filter_data, filter_data_len); if (FAILED(hr = IPropertyBag_Write(prop_bag, L"FilterData", &var))) - ERR("Failed to write filter data, hr %#lx.\n", hr); + ERR("Failed to write filter data, hr %#x.\n", hr); VariantClear(&var); } @@ -1030,7 +1030,7 @@ static HRESULT WINAPI FilterMapper3_EnumMatchingFilters( HRESULT hr; struct Vector monikers = {NULL, 0, 0}; - TRACE("(%p, %#lx, %s, %#lx, %s, %lu, %p, %p, %p, %s, %s, %p, %p, %p)\n", + TRACE("(%p, %x, %s, %x, %s, %d, %p, %p, %p, %s, %s, %p, %p, %p)\n", ppEnum, dwFlags, bExactMatch ? "true" : "false", @@ -1047,7 +1047,9 @@ static HRESULT WINAPI FilterMapper3_EnumMatchingFilters( pPinCategoryOut); if (dwFlags != 0) - FIXME("Ignoring flags %#lx.\n", dwFlags); + { + FIXME("dwFlags = %x not implemented\n", dwFlags); + } *ppEnum = NULL; @@ -1287,7 +1289,7 @@ static HRESULT WINAPI FilterMapper_EnumMatchingFilters( REGFILTER* regfilters; HRESULT hr; - TRACE("(%p/%p)->(%p, %#lx, %s, %s, %s, %s, %s, %s, %s)\n", + TRACE("(%p/%p)->(%p, %x, %s, %s, %s, %s, %s, %s, %s)\n", This, iface, ppEnum, @@ -1399,7 +1401,7 @@ static HRESULT WINAPI FilterMapper_RegisterFilter(IFilterMapper * iface, HKEY key; LONG ret; - TRACE("iface %p, clsid %s, name %s, merit %#lx.\n", + TRACE("iface %p, clsid %s, name %s, merit %#x.\n", iface, debugstr_guid(&clsid), debugstr_w(name), merit); StringFromGUID2(&clsid, guidstr, ARRAY_SIZE(guidstr)); @@ -1410,7 +1412,7 @@ static HRESULT WINAPI FilterMapper_RegisterFilter(IFilterMapper * iface, return HRESULT_FROM_WIN32(ret); if ((ret = RegSetValueExW(key, NULL, 0, REG_SZ, (const BYTE *)name, (wcslen(name) + 1) * sizeof(WCHAR)))) - ERR("Failed to set filter name, error %lu.\n", ret); + ERR("Failed to set filter name, error %u.\n", ret); RegCloseKey(key); wcscpy(keypath, L"CLSID\\"); @@ -1418,11 +1420,11 @@ static HRESULT WINAPI FilterMapper_RegisterFilter(IFilterMapper * iface, if (!(ret = RegCreateKeyExW(HKEY_CLASSES_ROOT, keypath, 0, NULL, 0, KEY_WRITE, NULL, &key, NULL))) { if ((ret = RegSetValueExW(key, L"Merit", 0, REG_DWORD, (const BYTE *)&merit, sizeof(DWORD)))) - ERR("Failed to set merit, error %lu.\n", ret); + ERR("Failed to set merit, error %u.\n", ret); RegCloseKey(key); } else - ERR("Failed to create CLSID key, error %lu.\n", ret); + ERR("Failed to create CLSID key, error %u.\n", ret); return S_OK; } @@ -1464,7 +1466,7 @@ static HRESULT WINAPI FilterMapper_RegisterPin(IFilterMapper *iface, CLSID clsid if ((ret = RegCreateKeyExW(key, pin_keypath, 0, NULL, 0, KEY_WRITE, NULL, &pin_key, NULL))) { - ERR("Failed to open pin key, error %lu.\n", ret); + ERR("Failed to open pin key, error %u.\n", ret); free(pin_keypath); RegCloseKey(key); return HRESULT_FROM_WIN32(ret); @@ -1472,18 +1474,18 @@ static HRESULT WINAPI FilterMapper_RegisterPin(IFilterMapper *iface, CLSID clsid free(pin_keypath); if ((ret = RegSetValueExW(pin_key, L"AllowedMany", 0, REG_DWORD, (const BYTE *)&many, sizeof(DWORD)))) - ERR("Failed to set AllowedMany value, error %lu.\n", ret); + ERR("Failed to set AllowedMany value, error %u.\n", ret); if ((ret = RegSetValueExW(pin_key, L"AllowedZero", 0, REG_DWORD, (const BYTE *)&zero, sizeof(DWORD)))) - ERR("Failed to set AllowedZero value, error %lu.\n", ret); + ERR("Failed to set AllowedZero value, error %u.\n", ret); if ((ret = RegSetValueExW(pin_key, L"Direction", 0, REG_DWORD, (const BYTE *)&output, sizeof(DWORD)))) - ERR("Failed to set Direction value, error %lu.\n", ret); + ERR("Failed to set Direction value, error %u.\n", ret); if ((ret = RegSetValueExW(pin_key, L"IsRendered", 0, REG_DWORD, (const BYTE *)&rendered, sizeof(DWORD)))) - ERR("Failed to set IsRendered value, error %lu.\n", ret); + ERR("Failed to set IsRendered value, error %u.\n", ret); if (!(ret = RegCreateKeyExW(pin_key, L"Types", 0, NULL, 0, 0, NULL, &type_key, NULL))) RegCloseKey(type_key); else - ERR("Failed to create Types subkey, error %lu.\n", ret); + ERR("Failed to create Types subkey, error %u.\n", ret); RegCloseKey(pin_key); RegCloseKey(key); @@ -1525,7 +1527,7 @@ static HRESULT WINAPI FilterMapper_RegisterPinType(IFilterMapper *iface, if (!(ret = RegCreateKeyExW(key, type_keypath, 0, NULL, 0, 0, NULL, &type_key, NULL))) RegCloseKey(type_key); else - ERR("Failed to create type key, error %lu.\n", ret); + ERR("Failed to create type key, error %u.\n", ret); RegCloseKey(key); return HRESULT_FROM_WIN32(ret); @@ -1544,7 +1546,7 @@ static HRESULT WINAPI FilterMapper_UnregisterFilter(IFilterMapper *iface, CLSID if ((ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Filter", 0, 0, &key))) return HRESULT_FROM_WIN32(ret); if ((ret = RegDeleteKeyW(key, guidstr))) - ERR("Failed to delete filter key, error %lu.\n", ret); + ERR("Failed to delete filter key, error %u.\n", ret); RegCloseKey(key); wcscpy(keypath, L"CLSID\\"); @@ -1552,13 +1554,13 @@ static HRESULT WINAPI FilterMapper_UnregisterFilter(IFilterMapper *iface, CLSID if (!(ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, keypath, 0, KEY_WRITE, &key))) { if ((ret = RegDeleteValueW(key, L"Merit"))) - ERR("Failed to delete Merit value, error %lu.\n", ret); + ERR("Failed to delete Merit value, error %u.\n", ret); if ((ret = RegDeleteTreeW(key, L"Pins"))) - ERR("Failed to delete Pins key, error %lu.\n", ret); + ERR("Failed to delete Pins key, error %u.\n", ret); RegCloseKey(key); } else - ERR("Failed to open CLSID key, error %lu.\n", ret); + ERR("Failed to open CLSID key, error %u.\n", ret); return S_OK; } @@ -1590,7 +1592,7 @@ static HRESULT WINAPI FilterMapper_UnregisterPin(IFilterMapper * iface, CLSID cl return HRESULT_FROM_WIN32(ret); if ((ret = RegDeleteTreeW(key, name))) - ERR("Failed to delete subkey, error %lu.\n", ret); + ERR("Failed to delete subkey, error %u.\n", ret); RegCloseKey(key); @@ -1646,7 +1648,7 @@ static HRESULT WINAPI AMFilterData_ParseFilterData(IAMFilterData* iface, HRESULT hr = S_OK; static REGFILTER2 *prf2; - TRACE("mapper %p, data %p, size %lu, parsed_data %p.\n", This, pData, cb, ppRegFilter2); + TRACE("(%p/%p)->(%p, %d, %p)\n", This, iface, pData, cb, ppRegFilter2); prf2 = CoTaskMemAlloc(sizeof(*prf2)); if (!prf2) diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c index c5302db6ced..ed7080b76b9 100644 --- wine/dlls/quartz/main.c +++ wine/dlls/quartz/main.c @@ -260,13 +260,13 @@ const char * qzdebugstr_guid( const GUID * id ) return debugstr_guid(id); } -int WINAPI AmpFactorToDB(int ampfactor) +LONG WINAPI AmpFactorToDB(LONG ampfactor) { FIXME("(%d) Stub!\n", ampfactor); return 0; } -int WINAPI DBToAmpFactor(int db) +LONG WINAPI DBToAmpFactor(LONG db) { FIXME("(%d) Stub!\n", db); /* Avoid divide by zero (probably during range computation) in Windows Media Player 6.4 */ @@ -283,8 +283,7 @@ DWORD WINAPI AMGetErrorTextA(HRESULT hr, LPSTR buffer, DWORD maxlen) DWORD res; WCHAR errorW[MAX_ERROR_TEXT_LEN]; - TRACE("hr %#lx, buffer %p, maxlen %lu.\n", hr, buffer, maxlen); - + TRACE("(%x,%p,%d)\n", hr, buffer, maxlen); if (!buffer) return 0; @@ -306,7 +305,7 @@ DWORD WINAPI AMGetErrorTextW(HRESULT hr, LPWSTR buffer, DWORD maxlen) unsigned int len; WCHAR error[MAX_ERROR_TEXT_LEN]; - TRACE("hr %#lx, buffer %p, maxlen %lu.\n", hr, buffer, maxlen); + FIXME("(%x,%p,%d) stub\n", hr, buffer, maxlen); if (!buffer) return 0; swprintf(error, ARRAY_SIZE(error), L"Error: 0x%lx", hr); diff --git a/dlls/quartz/memallocator.c b/dlls/quartz/memallocator.c index 87869b4d6b2..531fbe874cf 100644 --- wine/dlls/quartz/memallocator.c +++ wine/dlls/quartz/memallocator.c @@ -135,7 +135,7 @@ static ULONG WINAPI BaseMemAllocator_AddRef(IMemAllocator * iface) BaseMemAllocator *This = impl_from_IMemAllocator(iface); ULONG ref = InterlockedIncrement(&This->ref); - TRACE("%p increasing refcount to %lu.\n", This, ref); + TRACE("(%p)->() AddRef from %d\n", iface, ref - 1); return ref; } @@ -145,7 +145,7 @@ static ULONG WINAPI BaseMemAllocator_Release(IMemAllocator * iface) BaseMemAllocator *This = impl_from_IMemAllocator(iface); ULONG ref = InterlockedDecrement(&This->ref); - TRACE("%p decreasing refcount to %lu.\n", This, ref); + TRACE("(%p)->() Release from %d\n", iface, ref + 1); if (!ref) { @@ -166,7 +166,7 @@ static HRESULT WINAPI BaseMemAllocator_SetProperties(IMemAllocator * iface, ALLO TRACE("(%p)->(%p, %p)\n", This, pRequest, pActual); - TRACE("Requested %ld buffers, size %ld, alignment %ld, prefix %ld.\n", + TRACE("Requested %d buffers, size %d, alignment %d, prefix %d.\n", pRequest->cBuffers, pRequest->cbBuffer, pRequest->cbAlign, pRequest->cbPrefix); EnterCriticalSection(This->pCritSect); @@ -236,7 +236,7 @@ static HRESULT WINAPI BaseMemAllocator_Commit(IMemAllocator * iface) { if (!(This->hSemWaiting = CreateSemaphoreW(NULL, This->props.cBuffers, This->props.cBuffers, NULL))) { - ERR("Failed to create semaphore, error %lu.\n", GetLastError()); + ERR("Couldn't create semaphore (error was %u)\n", GetLastError()); hr = HRESULT_FROM_WIN32(GetLastError()); } else @@ -245,7 +245,7 @@ static HRESULT WINAPI BaseMemAllocator_Commit(IMemAllocator * iface) if (SUCCEEDED(hr)) This->bCommitted = TRUE; else - ERR("Failed to allocate, hr %#lx.\n", hr); + ERR("fnAlloc failed with error 0x%x\n", hr); } } } @@ -278,13 +278,15 @@ static HRESULT WINAPI BaseMemAllocator_Decommit(IMemAllocator * iface) else { if (This->lWaiting != 0) - ERR("Waiting: %ld\n", This->lWaiting); + ERR("Waiting: %d\n", This->lWaiting); This->bCommitted = FALSE; CloseHandle(This->hSemWaiting); This->hSemWaiting = NULL; hr = This->fnFree(iface); + if (FAILED(hr)) + ERR("fnFree failed with error 0x%x\n", hr); } } } @@ -300,9 +302,8 @@ static HRESULT WINAPI BaseMemAllocator_GetBuffer(IMemAllocator * iface, IMediaSa /* NOTE: The pStartTime and pEndTime parameters are not applied to the sample. * The allocator might use these values to determine which buffer it retrieves */ - - TRACE("allocator %p, sample %p, start_time %p, end_time %p, flags %#lx.\n", - This, pSample, pStartTime, pEndTime, dwFlags); + + TRACE("(%p)->(%p, %p, %p, %x)\n", This, pSample, pStartTime, pEndTime, dwFlags); *pSample = NULL; @@ -350,7 +351,7 @@ static HRESULT WINAPI BaseMemAllocator_GetBuffer(IMemAllocator * iface, IMediaSa LeaveCriticalSection(This->pCritSect); if (hr != S_OK) - WARN("Returning hr %#lx.\n", hr); + WARN("%08x\n", hr); return hr; } @@ -378,8 +379,10 @@ static HRESULT WINAPI BaseMemAllocator_ReleaseBuffer(IMemAllocator * iface, IMed if (list_empty(&This->used_list) && This->bDecommitQueued && This->bCommitted) { + HRESULT hrfree; + if (This->lWaiting != 0) - ERR("Waiting: %ld\n", This->lWaiting); + ERR("Waiting: %d\n", This->lWaiting); This->bCommitted = FALSE; This->bDecommitQueued = FALSE; @@ -387,7 +390,8 @@ static HRESULT WINAPI BaseMemAllocator_ReleaseBuffer(IMemAllocator * iface, IMed CloseHandle(This->hSemWaiting); This->hSemWaiting = NULL; - This->fnFree(iface); + if (FAILED(hrfree = This->fnFree(iface))) + ERR("fnFree failed with error 0x%x\n", hrfree); } } LeaveCriticalSection(This->pCritSect); @@ -395,7 +399,7 @@ static HRESULT WINAPI BaseMemAllocator_ReleaseBuffer(IMemAllocator * iface, IMed /* notify a waiting thread that there is now a free buffer */ if (This->hSemWaiting && !ReleaseSemaphore(This->hSemWaiting, 1, NULL)) { - ERR("Failed to release semaphore, error %lu.\n", GetLastError()); + ERR("ReleaseSemaphore failed with error %u\n", GetLastError()); hr = HRESULT_FROM_WIN32(GetLastError()); } @@ -475,7 +479,7 @@ static ULONG WINAPI StdMediaSample2_AddRef(IMediaSample2 * iface) StdMediaSample2 *This = impl_from_IMediaSample2(iface); ULONG ref = InterlockedIncrement(&This->ref); - TRACE("%p increasing refcount to %lu.\n", This, ref); + TRACE("(%p)->(): new ref = %d\n", This, ref); return ref; } @@ -485,7 +489,7 @@ static ULONG WINAPI StdMediaSample2_Release(IMediaSample2 * iface) StdMediaSample2 *This = impl_from_IMediaSample2(iface); ULONG ref = InterlockedDecrement(&This->ref); - TRACE("%p decreasing refcount to %lu.\n", This, ref); + TRACE("(%p)->(): new ref = %d\n", This, ref); if (!ref) { @@ -641,11 +645,11 @@ static HRESULT WINAPI StdMediaSample2_SetActualDataLength(IMediaSample2 * iface, { StdMediaSample2 *This = impl_from_IMediaSample2(iface); - TRACE("sample %p, len %ld.\n", This, len); + TRACE("(%p)->(%d)\n", iface, len); if ((len > This->props.cbBuffer) || (len < 0)) { - ERR("Length %ld exceeds maximum %ld.\n", len, This->props.cbBuffer); + WARN("Tried to set length to %d, while max is %d\n", len, This->props.cbBuffer); return VFW_E_BUFFER_OVERFLOW; } else @@ -762,7 +766,7 @@ static HRESULT WINAPI StdMediaSample2_GetProperties(IMediaSample2 * iface, DWORD { StdMediaSample2 *This = impl_from_IMediaSample2(iface); - TRACE("sample %p, size %lu, properties %p.\n", This, cbProperties, pbProperties); + TRACE("(%p)->(%d, %p)\n", iface, cbProperties, pbProperties); memcpy(pbProperties, &This->props, min(cbProperties, sizeof(This->props))); @@ -773,7 +777,7 @@ static HRESULT WINAPI StdMediaSample2_SetProperties(IMediaSample2 * iface, DWORD { StdMediaSample2 *This = impl_from_IMediaSample2(iface); - TRACE("sample %p, size %lu, properties %p.\n", This, cbProperties, pbProperties); + TRACE("(%p)->(%d, %p)\n", iface, cbProperties, pbProperties); /* NOTE: pbBuffer and cbBuffer are read-only */ memcpy(&This->props, pbProperties, min(cbProperties, AM_SAMPLE2_PROP_SIZE_WRITABLE)); @@ -892,7 +896,7 @@ static HRESULT StdMemAllocator_Free(IMemAllocator * iface) /* free memory */ if (!VirtualFree(This->pMemory, 0, MEM_RELEASE)) { - ERR("Failed to free memory, error %lu.\n", GetLastError()); + ERR("Couldn't free memory. Error: %u\n", GetLastError()); return HRESULT_FROM_WIN32(GetLastError()); } diff --git a/dlls/quartz/passthrough.c b/dlls/quartz/passthrough.c index 4627b2d26f8..2f8fe9dc370 100644 --- wine/dlls/quartz/passthrough.c +++ wine/dlls/quartz/passthrough.c @@ -66,7 +66,7 @@ static ULONG WINAPI seeking_passthrough_AddRef(IUnknown *iface) struct seeking_passthrough *passthrough = impl_from_IUnknown(iface); ULONG refcount = InterlockedIncrement(&passthrough->refcount); - TRACE("%p increasing refcount to %lu.\n", passthrough, refcount); + TRACE("%p increasing refcount to %u.\n", passthrough, refcount); return refcount; } @@ -75,7 +75,7 @@ static ULONG WINAPI seeking_passthrough_Release(IUnknown *iface) struct seeking_passthrough *passthrough = impl_from_IUnknown(iface); ULONG refcount = InterlockedDecrement(&passthrough->refcount); - TRACE("%p decreasing refcount to %lu.\n", passthrough, refcount); + TRACE("%p decreasing refcount to %u.\n", passthrough, refcount); if (!refcount) { strmbase_passthrough_cleanup(&passthrough->passthrough); diff --git a/dlls/quartz/regsvr.c b/dlls/quartz/regsvr.c index d035f8673fb..649e25e7327 100644 --- wine/dlls/quartz/regsvr.c +++ wine/dlls/quartz/regsvr.c @@ -127,7 +127,7 @@ static HRESULT register_filters(struct regsvr_filter const *list) } if (FAILED(hr)) { - ERR("failed to register with hresult %#lx\n", hr); + ERR("failed to register with hresult 0x%x\n", hr); CoTaskMemFree(prfp2); break; } diff --git a/dlls/quartz/systemclock.c b/dlls/quartz/systemclock.c index 729122fec46..f579ae754ea 100644 --- wine/dlls/quartz/systemclock.c +++ wine/dlls/quartz/systemclock.c @@ -25,7 +25,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz); -static LONG cookie_counter; +static int cookie_counter; struct advise_sink { @@ -42,8 +42,7 @@ struct system_clock IUnknown *outer_unk; LONG refcount; - LONG thread_created; - BOOL thread_stopped; + BOOL thread_created, thread_stopped; HANDLE thread; LARGE_INTEGER frequency; REFERENCE_TIME last_time; @@ -91,7 +90,7 @@ static ULONG WINAPI system_clock_inner_AddRef(IUnknown *iface) struct system_clock *clock = impl_from_IUnknown(iface); ULONG refcount = InterlockedIncrement(&clock->refcount); - TRACE("%p increasing refcount to %lu.\n", clock, refcount); + TRACE("%p increasing refcount to %u.\n", clock, refcount); return refcount; } @@ -102,7 +101,7 @@ static ULONG WINAPI system_clock_inner_Release(IUnknown *iface) ULONG refcount = InterlockedDecrement(&clock->refcount); struct advise_sink *sink, *cursor; - TRACE("%p decreasing refcount to %lu.\n", clock, refcount); + TRACE("%p decreasing refcount to %u.\n", clock, refcount); if (!refcount) { @@ -268,7 +267,7 @@ static HRESULT WINAPI SystemClockImpl_AdviseTime(IReferenceClock *iface, { struct system_clock *clock = impl_from_IReferenceClock(iface); - TRACE("clock %p, base %s, offset %s, event %#Ix, cookie %p.\n", + TRACE("clock %p, base %s, offset %s, event %#lx, cookie %p.\n", clock, debugstr_time(base), debugstr_time(offset), event, cookie); if (base + offset <= 0) @@ -282,7 +281,7 @@ static HRESULT WINAPI SystemClockImpl_AdvisePeriodic(IReferenceClock* iface, { struct system_clock *clock = impl_from_IReferenceClock(iface); - TRACE("clock %p, start %s, period %s, semaphore %#Ix, cookie %p.\n", + TRACE("clock %p, start %s, period %s, semaphore %#lx, cookie %p.\n", clock, debugstr_time(start), debugstr_time(period), semaphore, cookie); if (start <= 0 || period <= 0) @@ -296,7 +295,7 @@ static HRESULT WINAPI SystemClockImpl_Unadvise(IReferenceClock *iface, DWORD_PTR struct system_clock *clock = impl_from_IReferenceClock(iface); struct advise_sink *sink; - TRACE("clock %p, cookie %#Ix.\n", clock, cookie); + TRACE("clock %p, cookie %#lx.\n", clock, cookie); EnterCriticalSection(&clock->cs); diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in index 423abc78ef6..a47eec8bfd2 100644 --- wine/dlls/quartz/tests/Makefile.in +++ wine/dlls/quartz/tests/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES TESTDLL = quartz.dll IMPORTS = strmbase advapi32 d3d9 dsound msdmo msvfw32 ole32 oleaut32 user32 uuid winmm diff --git a/dlls/quartz/tests/acmwrapper.c b/dlls/quartz/tests/acmwrapper.c index caeca61ae50..31b32b53ac9 100644 --- wine/dlls/quartz/tests/acmwrapper.c +++ wine/dlls/quartz/tests/acmwrapper.c @@ -27,7 +27,7 @@ static IBaseFilter *create_acm_wrapper(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_ACMWrapper, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -48,7 +48,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -148,53 +148,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_ACMWrapper, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_ACMWrapper, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -206,116 +206,116 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 3); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -327,36 +327,36 @@ static void test_find_pin(void) ULONG ref; hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Output", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"output pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -370,66 +370,68 @@ static void test_pin_info(void) IPin *pin; hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); - ok(!wcscmp(info.achName, L"Input"), "Got name %s.\n", debugstr_w(info.achName)); +todo_wine + ok(!wcscmp(info.achName, L"Input"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"In"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_interface(pin, &IID_IPin, TRUE); check_interface(pin, &IID_IMediaSeeking, TRUE); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); - ok(!wcscmp(info.achName, L"Output"), "Got name %s.\n", debugstr_w(info.achName)); +todo_wine + ok(!wcscmp(info.achName, L"Output"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"Out"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -440,53 +442,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(acmwrapper) diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c index 46ce5d9eeda..ac1078bf59b 100644 --- wine/dlls/quartz/tests/avidec.c +++ wine/dlls/quartz/tests/avidec.c @@ -35,7 +35,7 @@ static IBaseFilter *create_avi_dec(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_AVIDec, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -60,7 +60,7 @@ static LRESULT CALLBACK vfw_driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, static int in_begin; if (winetest_debug > 1) - trace("id %#Ix, driver %p, msg %#x, lparam1 %#Ix, lparam2 %#Ix.\n", + trace("id %#lx, driver %p, msg %#x, lparam1 %#lx, lparam2 %#lx.\n", id, driver, msg, lparam1, lparam2); switch (msg) @@ -143,18 +143,18 @@ static LRESULT CALLBACK vfw_driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, ok(lparam2 == sizeof(ICDECOMPRESS), "Got size %Iu.\n", lparam2); if (testmode == 5 || testmode == 6) - ok(params->dwFlags == ICDECOMPRESS_NOTKEYFRAME, "Got flags %#lx.\n", params->dwFlags); + ok(params->dwFlags == ICDECOMPRESS_NOTKEYFRAME, "Got flags %#x.\n", params->dwFlags); else if (testmode == 3) - ok(params->dwFlags == ICDECOMPRESS_PREROLL, "Got flags %#lx.\n", params->dwFlags); + ok(params->dwFlags == ICDECOMPRESS_PREROLL, "Got flags %#x.\n", params->dwFlags); else - ok(params->dwFlags == 0, "Got flags %#lx.\n", params->dwFlags); + ok(params->dwFlags == 0, "Got flags %#x.\n", params->dwFlags); expect_sink_format.biSizeImage = 200; ok(!memcmp(params->lpbiInput, &expect_sink_format, sizeof(BITMAPINFOHEADER)), "Input types didn't match.\n"); ok(!memcmp(params->lpbiOutput, &source_bitmap_info, sizeof(BITMAPINFOHEADER)), "Output types didn't match.\n"); - ok(!params->ckid, "Got chunk id %#lx.\n", params->ckid); + ok(!params->ckid, "Got chunk id %#x.\n", params->ckid); for (i = 0; i < 200; ++i) expect[i] = i; @@ -189,7 +189,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -289,53 +289,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_AVIDec, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_AVIDec, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -347,116 +347,116 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 3); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -468,36 +468,36 @@ static void test_find_pin(void) ULONG ref; hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins didn't match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"XForm In", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"XForm Out", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"output pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -511,66 +511,66 @@ static void test_pin_info(void) IPin *pin; hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); - ok(!wcscmp(info.achName, L"XForm In"), "Got name %s.\n", wine_dbgstr_w(info.achName)); + todo_wine ok(!wcscmp(info.achName, L"XForm In"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"In"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Out", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_interface(pin, &IID_IPin, TRUE); check_interface(pin, &IID_IMediaSeeking, TRUE); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); - ok(!wcscmp(info.achName, L"XForm Out"), "Got name %s.\n", wine_dbgstr_w(info.achName)); + todo_wine ok(!wcscmp(info.achName, L"XForm Out"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"Out"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_media_types(void) @@ -586,10 +586,10 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); @@ -604,35 +604,35 @@ static void test_media_types(void) vih.bmiHeader.biHeight = 24; vih.bmiHeader.biBitCount = 16; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); vih.bmiHeader.biBitCount = 32; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); vih.bmiHeader.biBitCount = 16; mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = TRUE; mt.lSampleSize = 123; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Some versions of quartz check the major type; some do not. */ mt.subtype = MEDIASUBTYPE_NULL; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_RGB24; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = test_subtype; mt.formattype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.formattype = FORMAT_None; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.formattype = FORMAT_VideoInfo; IPin_Release(pin); @@ -640,23 +640,23 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"Out", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_RGB24; vih.bmiHeader.biCompression = BI_RGB; vih.bmiHeader.biBitCount = 24; vih.bmiHeader.biSizeImage= 32 * 24 * 3; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_enum_media_types(void) @@ -671,29 +671,29 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum1); IEnumMediaTypes_Release(enum2); @@ -702,36 +702,36 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"Out", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -742,53 +742,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -884,12 +884,12 @@ static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample ++filter->got_sample; size = IMediaSample_GetSize(sample); - ok(size == 32 * 24 * 12 / 8, "Got size %lu.\n", size); + ok(size == 32 * 24 * 12 / 8, "Got size %u.\n", size); size = IMediaSample_GetActualDataLength(sample); - ok(size == 32 * 24 * 12 / 8, "Got valid size %lu.\n", size); + ok(size == 32 * 24 * 12 / 8, "Got valid size %u.\n", size); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < size; ++i) expect[i] = 111 - i; ok(!memcmp(data, expect, size), "Data didn't match.\n"); @@ -897,28 +897,28 @@ static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample hr = IMediaSample_GetTime(sample, &start, &stop); if (testmode == 0) { - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); } else if (testmode == 1) { - ok(hr == VFW_S_NO_STOP_TIME, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_NO_STOP_TIME, "Got hr %#x.\n", hr); ok(start == 20000, "Got start time %s.\n", wine_dbgstr_longlong(start)); } else { - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == 20000, "Got start time %s.\n", wine_dbgstr_longlong(start)); ok(stop == 30000, "Got stop time %s.\n", wine_dbgstr_longlong(stop)); } hr = IMediaSample_GetMediaTime(sample, &start, &stop); - ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); hr = IMediaSample_IsDiscontinuity(sample); - todo_wine_if (testmode == 5) ok(hr == (testmode == 4) ? S_OK : S_FALSE, "Got hr %#lx.\n", hr); + todo_wine_if (testmode == 5) ok(hr == (testmode == 4) ? S_OK : S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample_IsPreroll(sample); - todo_wine_if (testmode == 3) ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine_if (testmode == 3) ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample_IsSyncPoint(sample); - todo_wine_if (testmode == 5 || testmode == 6) ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine_if (testmode == 5 || testmode == 6) ok(hr == S_OK, "Got hr %#x.\n", hr); return S_OK; } @@ -983,27 +983,27 @@ static void test_sink_allocator(IMemInputPin *input) HRESULT hr; hr = IMemInputPin_GetAllocatorRequirements(input, &props); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_GetProperties(ret_allocator, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.cBuffers, "Got %ld buffers.\n", props.cBuffers); - ok(!props.cbBuffer, "Got size %ld.\n", props.cbBuffer); - ok(!props.cbAlign, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.cBuffers, "Got %d buffers.\n", props.cBuffers); + ok(!props.cbBuffer, "Got size %d.\n", props.cbBuffer); + ok(!props.cbAlign, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); hr = IMemInputPin_NotifyAllocator(input, ret_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(ret_allocator); } hr = IMemInputPin_NotifyAllocator(input, NULL, TRUE); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&req_allocator); @@ -1013,13 +1013,13 @@ static void test_sink_allocator(IMemInputPin *input) props.cbAlign = 1; props.cbPrefix = 0; hr = IMemAllocator_SetProperties(req_allocator, &props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_NotifyAllocator(input, req_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_allocator == req_allocator, "Allocators didn't match.\n"); IMemAllocator_Release(req_allocator); @@ -1036,104 +1036,104 @@ static void test_sample_processing(IMediaControl *control, IMemInputPin *input, BYTE *data; hr = IMemInputPin_ReceiveCanBlock(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); size = IMediaSample_GetSize(sample); - ok(size == 256, "Got size %ld.\n", size); + ok(size == 256, "Got size %d.\n", size); for (i = 0; i < 200; ++i) data[i] = i; hr = IMediaSample_SetActualDataLength(sample, 200); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = 10000; stop = 20000; hr = IMediaSample_SetMediaTime(sample, &start, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetSyncPoint(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testmode = 0; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(sink->got_sample == 1, "Got %u calls to Receive().\n", sink->got_sample); sink->got_sample = 0; start = 20000; hr = IMediaSample_SetTime(sample, &start, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testmode = 1; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(sink->got_sample == 1, "Got %u calls to Receive().\n", sink->got_sample); sink->got_sample = 0; stop = 30000; hr = IMediaSample_SetTime(sample, &start, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testmode = 2; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(sink->got_sample == 1, "Got %u calls to Receive().\n", sink->got_sample); sink->got_sample = 0; hr = IMediaSample_SetPreroll(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testmode = 3; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(!sink->got_sample, "Got %u calls to Receive().\n", sink->got_sample); hr = IMediaSample_SetPreroll(sample, FALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetDiscontinuity(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testmode = 4; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(sink->got_sample == 1, "Got %u calls to Receive().\n", sink->got_sample); sink->got_sample = 0; hr = IMediaSample_SetSyncPoint(sample, FALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testmode = 5; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(!sink->got_sample, "Got %u calls to Receive().\n", sink->got_sample); hr = IMediaSample_SetDiscontinuity(sample, FALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testmode = 6; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(!sink->got_sample, "Got %u calls to Receive().\n", sink->got_sample); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_Receive(input, sample); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); IMediaSample_Release(sample); IMemAllocator_Release(allocator); @@ -1149,68 +1149,68 @@ static void test_streaming_events(IMediaControl *control, IPin *sink, LONG i; hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < 200; ++i) data[i] = i; hr = IMediaSample_SetActualDataLength(sample, 200); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetSyncPoint(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!testsink->got_new_segment, "Got %u calls to IPin::NewSegment().\n", testsink->got_new_segment); hr = IPin_NewSegment(sink, 10000, 20000, 1.0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(testsink->got_new_segment == 1, "Got %u calls to IPin::NewSegment().\n", testsink->got_new_segment); ok(!testsink->got_eos, "Got %u calls to IPin::EndOfStream().\n", testsink->got_eos); hr = IPin_EndOfStream(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(!testsink->got_sample, "Got %u calls to Receive().\n", testsink->got_sample); ok(testsink->got_eos == 1, "Got %u calls to IPin::EndOfStream().\n", testsink->got_eos); testsink->got_eos = 0; hr = IPin_EndOfStream(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(testsink->got_eos == 1, "Got %u calls to IPin::EndOfStream().\n", testsink->got_eos); testmode = 0; hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(testsink->got_sample == 1, "Got %u calls to Receive().\n", testsink->got_sample); testsink->got_sample = 0; ok(!testsink->got_begin_flush, "Got %u calls to IPin::BeginFlush().\n", testsink->got_begin_flush); hr = IPin_BeginFlush(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(testsink->got_begin_flush == 1, "Got %u calls to IPin::BeginFlush().\n", testsink->got_begin_flush); hr = IMemInputPin_Receive(input, sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(sink); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(!testsink->got_end_flush, "Got %u calls to IPin::EndFlush().\n", testsink->got_end_flush); hr = IPin_EndFlush(sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(testsink->got_end_flush == 1, "Got %u calls to IPin::EndFlush().\n", testsink->got_end_flush); hr = IMemInputPin_Receive(input, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(testsink->got_sample == 1, "Got %u calls to Receive().\n", testsink->got_sample); testsink->got_sample = 0; hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaSample_Release(sample); IMemAllocator_Release(allocator); } @@ -1262,49 +1262,49 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(sink, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_RGB24; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = test_subtype; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(sink, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsource.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsource.source.pin.mt, &req_mt), "Media types didn't match.\n"); FreeMediaType(&mt); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); sink_bitmap_info = req_format.bmiHeader; hr = IPin_EnumMediaTypes(source, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < 9; ++i) { @@ -1349,7 +1349,7 @@ static void test_connect_pin(void) }; hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(pmt, &expect_mt, offsetof(AM_MEDIA_TYPE, cbFormat)), "%u: Media types didn't match.\n", i); ok(!memcmp(pmt->pbFormat, &expect_format, sizeof(VIDEOINFOHEADER)), @@ -1358,14 +1358,14 @@ static void test_connect_pin(void) { const VIDEOINFO *format = (VIDEOINFO *)pmt->pbFormat; - ok(pmt->cbFormat == offsetof(VIDEOINFO, dwBitMasks[3]), "Got format size %lu.\n", pmt->cbFormat); - ok(format->dwBitMasks[iRED] == 0xf800, "Got red bit mask %#lx.\n", format->dwBitMasks[iRED]); - ok(format->dwBitMasks[iGREEN] == 0x07e0, "Got green bit mask %#lx.\n", format->dwBitMasks[iGREEN]); - ok(format->dwBitMasks[iBLUE] == 0x001f, "Got blue bit mask %#lx.\n", format->dwBitMasks[iBLUE]); + ok(pmt->cbFormat == offsetof(VIDEOINFO, dwBitMasks[3]), "Got format size %u.\n", pmt->cbFormat); + ok(format->dwBitMasks[iRED] == 0xf800, "Got red bit mask %#x.\n", format->dwBitMasks[iRED]); + ok(format->dwBitMasks[iGREEN] == 0x07e0, "Got green bit mask %#x.\n", format->dwBitMasks[iGREEN]); + ok(format->dwBitMasks[iBLUE] == 0x001f, "Got blue bit mask %#x.\n", format->dwBitMasks[iBLUE]); } hr = IPin_QueryAccept(source, pmt); - ok(hr == (i == 8 ? S_OK : S_FALSE), "Got hr %#lx.\n", hr); + ok(hr == (i == 8 ? S_OK : S_FALSE), "Got hr %#x.\n", hr); if (i == 8) CopyMediaType(&source_mt, pmt); @@ -1374,7 +1374,7 @@ static void test_connect_pin(void) } hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); @@ -1384,33 +1384,33 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(source, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); /* Exact connection. */ CopyMediaType(&req_mt, &source_mt); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(source, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsink.sink.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); FreeMediaType(&mt); @@ -1418,88 +1418,88 @@ static void test_connect_pin(void) source_bitmap_info = ((VIDEOINFOHEADER *)req_mt.pbFormat)->bmiHeader; hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_sample_processing(control, meminput, &testsink); test_streaming_events(control, sink, meminput, &testsink); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsink.sink.pin.peer == source, "Got peer %p.\n", testsink.sink.pin.peer); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.lSampleSize = 999; req_mt.bTemporalCompression = req_mt.bFixedSizeSamples = TRUE; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.formattype = FORMAT_VideoInfo; /* Connection with wildcards. */ hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.subtype = MEDIASUBTYPE_RGB32; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Video; req_mt.subtype = MEDIASUBTYPE_I420; req_mt.formattype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.subtype = MEDIASUBTYPE_RGB32; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = MEDIATYPE_Audio; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); /* Test enumeration of sink media types. */ @@ -1508,20 +1508,20 @@ static void test_connect_pin(void) testsink.mt = &req_mt; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); ok(hr == VFW_E_NO_ACCEPTABLE_TYPES - || broken(hr == VFW_E_INVALIDMEDIATYPE) /* Win8+ */, "Got hr %#lx.\n", hr); + || broken(hr == VFW_E_INVALIDMEDIATYPE) /* Win8+ */, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Video; req_mt.subtype = MEDIASUBTYPE_I420; req_mt.formattype = FORMAT_VideoInfo; req_mt.lSampleSize = 444; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsource.source.pin.peer == sink, "Got peer %p.\n", testsource.source.pin.peer); IFilterGraph2_Disconnect(graph, &testsource.source.pin.IPin_iface); @@ -1530,13 +1530,13 @@ static void test_connect_pin(void) IPin_Release(source); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsource.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(avidec) diff --git a/dlls/quartz/tests/avisplit.c b/dlls/quartz/tests/avisplit.c index 8b7e8a222b0..06c2f5fed3c 100644 --- wine/dlls/quartz/tests/avisplit.c +++ wine/dlls/quartz/tests/avisplit.c @@ -32,7 +32,7 @@ static IBaseFilter *create_avi_splitter(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_AviSplitter, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -54,11 +54,11 @@ static WCHAR *load_resource(const WCHAR *name) wcscat(pathW, name); file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %u.\n", wine_dbgstr_w(pathW), GetLastError()); res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); - ok(!!res, "Failed to load resource, error %lu.\n", GetLastError()); + ok(!!res, "Failed to load resource, error %u.\n", GetLastError()); ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); WriteFile(file, ptr, SizeofResource( GetModuleHandleA(NULL), res), &written, NULL); ok(written == SizeofResource(GetModuleHandleA(NULL), res), "Failed to write resource.\n"); @@ -96,7 +96,7 @@ static IFilterGraph2 *connect_input(IBaseFilter *splitter, const WCHAR *filename IBaseFilter_FindPin(reader, L"Output", &source); hr = IFilterGraph2_ConnectDirect(graph, source, sink, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(source); IPin_Release(sink); @@ -115,7 +115,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -220,53 +220,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_AviSplitter, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_AviSplitter, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -281,79 +281,79 @@ static void test_enum_pins(void) BOOL ret; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); @@ -361,46 +361,46 @@ static void test_enum_pins(void) graph = connect_input(filter, filename); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); IEnumPins_Release(enum1); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_find_pin(void) @@ -415,34 +415,34 @@ static void test_find_pin(void) BOOL ret; hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Stream 00", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); graph = connect_input(filter, filename); hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Stream 00", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); @@ -450,9 +450,9 @@ static void test_find_pin(void) IEnumPins_Release(enum_pins); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_pin_info(void) @@ -471,52 +471,52 @@ static void test_pin_info(void) graph = connect_input(filter, filename); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_ref = get_refcount(filter); ref = get_refcount(pin); - ok(ref == expect_ref, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"input pin"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == expect_ref + 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == expect_ref + 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"input pin"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Stream 00", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_interface(pin, &IID_IPin, TRUE); check_interface(pin, &IID_IMediaSeeking, TRUE); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"Stream 00"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"Stream 00"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); @@ -524,9 +524,9 @@ static void test_pin_info(void) IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_media_types(void) @@ -557,42 +557,42 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"input pin", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); mt.majortype = MEDIATYPE_Stream; mt.subtype = MEDIASUBTYPE_Avi; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = TRUE; mt.lSampleSize = 123; mt.formattype = FORMAT_WaveFormatEx; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; mt.subtype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_Avi; graph = connect_input(filter, filename); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); @@ -600,86 +600,86 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"Stream 00", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Video), "Got major type %s\n", wine_dbgstr_guid(&pmt->majortype)); ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_I420), "Got subtype %s\n", wine_dbgstr_guid(&pmt->subtype)); ok(!pmt->bFixedSizeSamples, "Got fixed size %d.\n", pmt->bFixedSizeSamples); todo_wine ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); - ok(pmt->lSampleSize == 1, "Got sample size %lu.\n", pmt->lSampleSize); + ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); ok(IsEqualGUID(&pmt->formattype, &FORMAT_VideoInfo), "Got format type %s.\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); - ok(pmt->cbFormat == sizeof(VIDEOINFOHEADER), "Got format size %lu.\n", pmt->cbFormat); + ok(pmt->cbFormat == sizeof(VIDEOINFOHEADER), "Got format size %u.\n", pmt->cbFormat); ok(!memcmp(pmt->pbFormat, &expect_vih, sizeof(VIDEOINFOHEADER)), "Format blocks didn't match.\n"); hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->bFixedSizeSamples = TRUE; pmt->bTemporalCompression = TRUE; pmt->lSampleSize = 123; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->majortype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Video; pmt->subtype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_I420; pmt->formattype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_None; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_VideoInfo; vih = (VIDEOINFOHEADER *)pmt->pbFormat; vih->AvgTimePerFrame = 10000; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); vih->AvgTimePerFrame = 1000 * 10000; vih->dwBitRate = 1000000; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); vih->dwBitRate = 0; SetRect(&vih->rcSource, 0, 0, 32, 24); hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); SetRect(&vih->rcSource, 0, 0, 0, 0); vih->bmiHeader.biCompression = BI_RGB; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); vih->bmiHeader.biCompression = mmioFOURCC('I','4','2','0'); CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_enum_media_types(void) @@ -697,29 +697,29 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"input pin", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum1); IEnumMediaTypes_Release(enum2); @@ -728,64 +728,64 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"Stream 00", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(mts[0]->pbFormat); CoTaskMemFree(mts[0]); @@ -795,9 +795,9 @@ static void test_enum_media_types(void) IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } struct testfilter @@ -809,7 +809,7 @@ struct testfilter const AM_MEDIA_TYPE *mt; HANDLE eos_event; unsigned int sample_count, eos_count, new_segment_count; - REFERENCE_TIME segment_start, segment_end, seek_start, seek_end; + REFERENCE_TIME seek_start, seek_end; }; static inline struct testfilter *impl_from_strmbase_filter(struct strmbase_filter *iface) @@ -836,21 +836,10 @@ static void testfilter_destroy(struct strmbase_filter *iface) strmbase_filter_cleanup(&filter->filter); } -static HRESULT testfilter_init_stream(struct strmbase_filter *iface) -{ - struct testfilter *filter = impl_from_strmbase_filter(iface); - - filter->new_segment_count = 0; - filter->eos_count = 0; - filter->sample_count = 0; - return S_OK; -} - static const struct strmbase_filter_ops testfilter_ops = { .filter_get_pin = testfilter_get_pin, .filter_destroy = testfilter_destroy, - .filter_init_stream = testfilter_init_stream, }; static HRESULT testsource_query_interface(struct strmbase_pin *iface, REFIID iid, void **out) @@ -877,7 +866,7 @@ static HRESULT WINAPI testsource_AttemptConnection(struct strmbase_source *iface if (FAILED(hr = IPin_ReceiveConnection(peer, &iface->pin.IPin_iface, mt))) { - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); IPin_Release(peer); iface->pin.peer = NULL; FreeMediaType(&iface->pin.mt); @@ -924,12 +913,12 @@ static HRESULT testsink_connect(struct strmbase_sink *iface, IPin *peer, const A HRESULT hr; hr = IPin_ConnectedTo(peer, &peer2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer2 == &iface->pin.IPin_iface, "Peer didn't match.\n"); IPin_Release(peer2); hr = IPin_ConnectionMediaType(peer, &mt2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(mt, &mt2), "Media types didn't match.\n"); FreeMediaType(&mt2); @@ -946,16 +935,16 @@ static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample HRESULT hr; hr = IMediaSample_GetTime(sample, &start, &end); - todo_wine_if (hr == VFW_S_NO_STOP_TIME) ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine_if (hr == VFW_S_NO_STOP_TIME) ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_debug > 1) - trace("%04lx: Got sample with timestamps %I64d-%I64d.\n", GetCurrentThreadId(), start, end); + trace("%04x: Got sample with timestamps %I64d-%I64d.\n", GetCurrentThreadId(), start, end); ok(filter->new_segment_count, "Expected NewSegment() before Receive().\n"); IPin_QueryInterface(iface->pin.peer, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetPositions(seeking, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == filter->seek_start, "Expected start position %I64u, got %I64u.\n", filter->seek_start, start); ok(end == filter->seek_end, "Expected end position %I64u, got %I64u.\n", filter->seek_end, end); IMediaSeeking_Release(seeking); @@ -970,7 +959,7 @@ static HRESULT testsink_eos(struct strmbase_sink *iface) struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); if (winetest_debug > 1) - trace("%04lx: Got EOS.\n", GetCurrentThreadId()); + trace("%04x: Got EOS.\n", GetCurrentThreadId()); ok(!filter->eos_count, "Got %u EOS events.\n", filter->eos_count + 1); ++filter->eos_count; @@ -985,19 +974,13 @@ static HRESULT testsink_new_segment(struct strmbase_sink *iface, IMediaSeeking *seeking; HRESULT hr; - if (winetest_debug > 1) - trace("%04lx: Got segment with timestamps %I64d-%I64d.\n", GetCurrentThreadId(), start, end); - ++filter->new_segment_count; IPin_QueryInterface(iface->pin.peer, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetPositions(seeking, &filter->seek_start, &filter->seek_end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - IMediaSeeking_Release(seeking); - - ok(start == filter->segment_start, "Expected start %I64d, got %I64d.\n", filter->segment_start, start); - ok(end == filter->segment_end, "Expected end %I64d, got %I64d.\n", filter->segment_end, end); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(rate == 1.0, "Got rate %.16e.\n", rate); + IMediaSeeking_Release(seeking); return S_OK; } @@ -1098,7 +1081,6 @@ static void testfilter_init(struct testfilter *filter) strmbase_sink_init(&filter->sink, &filter->filter, L"sink", &testsink_ops, NULL); filter->IAsyncReader_iface.lpVtbl = &async_reader_vtbl; filter->eos_event = CreateEventW(NULL, FALSE, FALSE, NULL); - filter->segment_end = 50000000; } static void test_filter_state(IMediaControl *control) @@ -1107,50 +1089,50 @@ static void test_filter_state(IMediaControl *control) HRESULT hr; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); } static void test_connect_pin(void) @@ -1198,48 +1180,48 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(sink, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Video; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Stream; req_mt.subtype = MEDIASUBTYPE_RGB8; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_Avi; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(sink, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsource.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsource.source.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Test source connection. */ @@ -1247,11 +1229,11 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(source, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); /* Exact connection. */ @@ -1261,135 +1243,135 @@ static void test_connect_pin(void) CopyMediaType(&req_mt, source_mt); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_filter_state(control); hr = IPin_ConnectedTo(source, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsink.sink.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsink.sink.pin.peer == source, "Got peer %p.\n", testsink.sink.pin.peer); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.lSampleSize = 999; req_mt.bTemporalCompression = req_mt.bFixedSizeSamples = TRUE; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = MEDIATYPE_Stream; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Video; req_mt.subtype = MEDIASUBTYPE_RGB32; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_I420; /* Connection with wildcards. */ hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.subtype = MEDIASUBTYPE_RGB32; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Video; req_mt.subtype = MEDIASUBTYPE_I420; req_mt.formattype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.subtype = MEDIASUBTYPE_RGB32; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = MEDIATYPE_Audio; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); /* Test enumeration of sink media types. */ testsink.mt = &req_mt; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Video; req_mt.subtype = MEDIASUBTYPE_I420; req_mt.formattype = FORMAT_VideoInfo; req_mt.lSampleSize = 444; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); IPin_Release(source); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsource.source.pin.peer == sink, "Got peer %p.\n", testsource.source.pin.peer); IFilterGraph2_Disconnect(graph, &testsource.source.pin.IPin_iface); @@ -1401,17 +1383,17 @@ static void test_connect_pin(void) IPin_Release(sink); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(reader); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsource.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_unconnected_filter_state(void) @@ -1422,53 +1404,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_seeking(void) @@ -1508,137 +1490,137 @@ static void test_seeking(void) IPin_QueryInterface(pin, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards | AM_SEEKING_CanSeekBackwards | AM_SEEKING_CanGetStopPos - | AM_SEEKING_CanGetDuration), "Got caps %#lx.\n", caps); + | AM_SEEKING_CanGetDuration), "Got caps %#x.\n", caps); caps = AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards), "Got caps %#lx.\n", caps); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards), "Got caps %#x.\n", caps); caps = AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanSeekAbsolute, "Got caps %#lx.\n", caps); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanSeekAbsolute, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); caps = 0; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); for (i = 0; i < ARRAY_SIZE(format_tests); ++i) { hr = IMediaSeeking_IsFormatSupported(seeking, format_tests[i].guid); - todo_wine_if(i == 1) ok(hr == format_tests[i].hr, "Got hr %#lx for format %s.\n", + todo_wine_if(i == 1) ok(hr == format_tests[i].hr, "Got hr %#x for format %s.\n", hr, wine_dbgstr_guid(format_tests[i].guid)); } hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_FRAME); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_SAMPLE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_FRAME); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &TIME_FORMAT_FRAME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_FRAME); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); duration = 0; hr = IMediaSeeking_GetDuration(seeking, &duration); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(duration == 50000000, "Got duration %I64d.\n", duration); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetStopPosition(seeking, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(stop == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(stop)); hr = IMediaSeeking_GetCurrentPosition(seeking, ¤t); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(stop)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 0x123456789a, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 123, &TIME_FORMAT_FRAME); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(time == 123 * 10000000, "Got time %s.\n", wine_dbgstr_longlong(time)); earliest = latest = 0xdeadbeef; hr = IMediaSeeking_GetAvailable(seeking, &earliest, &latest); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!earliest, "Got time %s.\n", wine_dbgstr_longlong(earliest)); ok(latest == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(latest)); rate = 0; hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(rate == 1.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_SetRate(seeking, 200.0); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); rate = 0; hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(rate == 200.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_SetRate(seeking, -1.0); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPreroll(seeking, &time); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); current = 1500 * 10000; stop = 3500 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 1500 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 3500 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Native snaps to the nearest frame. */ ok(current > 0 && current < duration, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop > 0 && stop < duration && stop > current, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -1647,21 +1629,21 @@ static void test_seeking(void) stop = 3500 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current > 0 && current < duration, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop > 0 && stop < duration && stop > current, "Got time %s.\n", wine_dbgstr_longlong(stop)); hr = IMediaSeeking_GetStopPosition(seeking, &prev_stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); current = 0; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == prev_stop, "Expected time %s, got %s.\n", wine_dbgstr_longlong(prev_stop), wine_dbgstr_longlong(stop)); @@ -1670,9 +1652,9 @@ static void test_seeking(void) IPin_Release(pin); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_streaming(void) @@ -1696,32 +1678,33 @@ static void test_streaming(void) IPin_QueryInterface(source, &IID_IMediaSeeking, (void **)&seeking); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Expected timeout.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); ok(testsink.sample_count, "Expected at least one sample.\n"); + testsink.sample_count = testsink.eos_count = 0; hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); ok(testsink.sample_count, "Expected at least one sample.\n"); - testsink.new_segment_count = testsink.sample_count = testsink.eos_count = 0; - testsink.segment_start = 1500 * 10000; - testsink.segment_end = 3500 * 10000; - hr = IMediaSeeking_SetPositions(seeking, &testsink.segment_start, AM_SEEKING_AbsolutePositioning, - &testsink.segment_end, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + testsink.sample_count = testsink.eos_count = 0; + start = 1500 * 10000; + end = 3500 * 10000; + hr = IMediaSeeking_SetPositions(seeking, &start, AM_SEEKING_AbsolutePositioning, + &end, AM_SEEKING_AbsolutePositioning); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); @@ -1729,14 +1712,15 @@ static void test_streaming(void) start = end = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == testsink.seek_start, "Expected start position %I64u, got %I64u.\n", testsink.seek_start, start); ok(end == testsink.seek_end, "Expected end position %I64u, got %I64u.\n", testsink.seek_end, end); + testsink.sample_count = testsink.eos_count = 0; hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); @@ -1744,7 +1728,7 @@ static void test_streaming(void) start = end = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == testsink.seek_start, "Expected start position %I64u, got %I64u.\n", testsink.seek_start, start); ok(end == testsink.seek_end, "Expected end position %I64u, got %I64u.\n", testsink.seek_end, end); @@ -1752,13 +1736,13 @@ static void test_streaming(void) IPin_Release(source); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } START_TEST(avisplit) diff --git a/dlls/quartz/tests/dsoundrender.c b/dlls/quartz/tests/dsoundrender.c index 269c590f8ee..03e6b8413d5 100644 --- wine/dlls/quartz/tests/dsoundrender.c +++ wine/dlls/quartz/tests/dsoundrender.c @@ -36,7 +36,7 @@ static IBaseFilter *create_dsound_render(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -45,7 +45,7 @@ static IFilterGraph2 *create_graph(void) IFilterGraph2 *ret; HRESULT hr; hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); return ret; } @@ -115,17 +115,17 @@ static void test_property_bag(void) hr = CoCreateInstance(&CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, &IID_IPersistPropertyBag, (void **)&ppb); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr != S_OK) return; hr = IPersistPropertyBag_InitNew(ppb); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPersistPropertyBag_Load(ppb, &property_bag, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IPersistPropertyBag_Release(ppb); - ok(!ref, "Got unexpected refcount %ld.\n", ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); } #define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) @@ -138,7 +138,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -229,53 +229,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_DSoundRender, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_DSoundRender, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -287,85 +287,85 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -377,26 +377,26 @@ static void test_find_pin(void) ULONG ref; hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, sink_id, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -410,38 +410,38 @@ static void test_pin_info(void) IPin *pin; hr = IBaseFilter_FindPin(filter, sink_id, &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, sink_id), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, sink_id), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_basic_audio(void) @@ -449,57 +449,56 @@ static void test_basic_audio(void) IBaseFilter *filter = create_dsound_render(); LONG balance, volume; ITypeInfo *typeinfo; - unsigned int count; IBasicAudio *audio; TYPEATTR *typeattr; + ULONG ref, count; HRESULT hr; - ULONG ref; hr = IBaseFilter_QueryInterface(filter, &IID_IBasicAudio, (void **)&audio); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicAudio_get_Balance(audio, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicAudio_get_Balance(audio, &balance); if (hr != VFW_E_MONO_AUDIO_HW) { - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(balance == 0, "Got balance %ld.\n", balance); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(balance == 0, "Got balance %d.\n", balance); hr = IBasicAudio_put_Balance(audio, DSBPAN_LEFT - 1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicAudio_put_Balance(audio, DSBPAN_LEFT); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicAudio_get_Balance(audio, &balance); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(balance == DSBPAN_LEFT, "Got balance %ld.\n", balance); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(balance == DSBPAN_LEFT, "Got balance %d.\n", balance); } hr = IBasicAudio_get_Volume(audio, &volume); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(volume == 0, "Got volume %ld.\n", volume); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(volume == 0, "Got volume %d.\n", volume); hr = IBasicAudio_put_Volume(audio, DSBVOLUME_MIN - 1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicAudio_put_Volume(audio, DSBVOLUME_MIN); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicAudio_get_Volume(audio, &volume); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(volume == DSBVOLUME_MIN, "Got volume %ld.\n", volume); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(volume == DSBVOLUME_MIN, "Got volume %d.\n", volume); hr = IBasicAudio_GetTypeInfoCount(audio, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count == 1, "Got count %u.\n", count); hr = IBasicAudio_GetTypeInfo(audio, 0, 0, &typeinfo); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(typeattr->typekind == TKIND_DISPATCH, "Got kind %u.\n", typeattr->typekind); ok(IsEqualGUID(&typeattr->guid, &IID_IBasicAudio), "Got IID %s.\n", wine_dbgstr_guid(&typeattr->guid)); ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); @@ -507,7 +506,7 @@ static void test_basic_audio(void) IBasicAudio_Release(audio); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_enum_media_types(void) @@ -522,64 +521,64 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, sink_id, &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - todo_wine ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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]); @@ -588,7 +587,7 @@ static void test_enum_media_types(void) IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -656,36 +655,36 @@ static void test_allocator(IMemInputPin *input) HRESULT hr; hr = IMemInputPin_GetAllocatorRequirements(input, &props); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_GetProperties(ret_allocator, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.cBuffers, "Got %ld buffers.\n", props.cBuffers); - ok(!props.cbBuffer, "Got size %ld.\n", props.cbBuffer); - ok(!props.cbAlign, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.cBuffers, "Got %d buffers.\n", props.cBuffers); + ok(!props.cbBuffer, "Got size %d.\n", props.cbBuffer); + ok(!props.cbAlign, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); hr = IMemInputPin_NotifyAllocator(input, ret_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(ret_allocator); } hr = IMemInputPin_NotifyAllocator(input, NULL, TRUE); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&req_allocator); hr = IMemInputPin_NotifyAllocator(input, req_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_allocator == req_allocator, "Allocators didn't match.\n"); IMemAllocator_Release(req_allocator); @@ -703,9 +702,9 @@ static DWORD WINAPI frame_thread(void *arg) struct frame_thread_params *params = arg; HRESULT hr; - if (winetest_debug > 1) trace("%04lx: Sending frame.\n", GetCurrentThreadId()); + if (winetest_debug > 1) trace("%04x: Sending frame.\n", GetCurrentThreadId()); hr = IMemInputPin_Receive(params->sink, params->sample); - if (winetest_debug > 1) trace("%04lx: Returned %#lx.\n", GetCurrentThreadId(), hr); + if (winetest_debug > 1) trace("%04x: Returned %#x.\n", GetCurrentThreadId(), hr); IMediaSample_Release(params->sample); free(params); return hr; @@ -725,24 +724,24 @@ static HRESULT send_frame(IMemInputPin *sink) DWORD ret; hr = IMemInputPin_GetAllocator(sink, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); words = (unsigned short *)data; for (i = 0; i < 44100 * 2; i += 2) words[i] = words[i+1] = sinf(i / 20.0f) * 0x7fff; hr = IMediaSample_SetActualDataLength(sample, 44100 * 4); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start_time = 0; end_time = start_time + 10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); params->sink = sink; params->sample = sample; @@ -762,7 +761,7 @@ static void test_filter_state(IMemInputPin *input, IMediaControl *control) HRESULT hr; hr = send_frame(input); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); /* The renderer is not fully paused until it receives a sample. The * DirectSound renderer never blocks in Receive(), despite returning S_OK @@ -771,71 +770,71 @@ static void test_filter_state(IMemInputPin *input, IMediaControl *control) * than it's worth to emulate, so for now, we'll ignore this behaviour. */ hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); /* It's possible to queue multiple samples while paused. The number of * samples that can be queued depends on the length of each sample, but * it's not particularly clear how. */ hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = send_frame(input); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = send_frame(input); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* The DirectSound renderer will silently refuse to transition to running * if it hasn't finished pausing yet. Once it does it reports itself as @@ -848,43 +847,43 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IMediaControl *control HRESULT hr; hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = send_frame(input); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static unsigned int check_ec_complete(IMediaEvent *eventsrc, DWORD timeout) @@ -898,14 +897,14 @@ static unsigned int check_ec_complete(IMediaEvent *eventsrc, DWORD timeout) { if (code == EC_COMPLETE) { - ok(param1 == S_OK, "Got param1 %#Ix.\n", param1); - ok(!param2, "Got param2 %#Ix.\n", param2); + ok(param1 == S_OK, "Got param1 %#lx.\n", param1); + ok(!param2, "Got param2 %#lx.\n", param2); ret++; } IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); timeout = 0; } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); return ret; } @@ -920,28 +919,28 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) IMediaControl_QueryInterface(control, &IID_IMediaEvent, (void **)&eventsrc); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = send_frame(input); - todo_wine ok(hr == VFW_E_SAMPLE_REJECTED_EOS, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_SAMPLE_REJECTED_EOS, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Expected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -949,79 +948,79 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) * done rendering. */ hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = send_frame(input); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); ret = check_ec_complete(eventsrc, 2000); todo_wine ok(ret == 1, "Expected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); /* Test sending EOS while flushing. */ hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); /* Test sending EOS and then flushing or stopping. */ hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = send_frame(input); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = send_frame(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -1070,37 +1069,37 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(pin, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &source.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); @@ -1108,48 +1107,48 @@ static void test_connect_pin(void) hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemInputPin_NotifyAllocator(input, allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_ReceiveCanBlock(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_filter_state(input, control); test_flushing(pin, input, control); test_eos(pin, input, control); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source.source.pin.peer == pin, "Got peer %p.\n", source.source.pin.peer); IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ref = IMemAllocator_Release(allocator); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMemInputPin_Release(input); IPin_Release(pin); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -1160,53 +1159,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static HRESULT does_dsound_support_format(WAVEFORMATEX *format) @@ -1222,7 +1221,7 @@ static HRESULT does_dsound_support_format(WAVEFORMATEX *format) HRESULT hr; hr = DirectSoundCreate(NULL, &dsound, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IDirectSound_CreateSoundBuffer(dsound, &desc, &buffer, NULL); if (hr == S_OK) @@ -1263,30 +1262,30 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, sink_id, &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { ok(IsEqualGUID(&mt->majortype, &MEDIATYPE_Audio), "Got major type %s.\n", wine_dbgstr_guid(&mt->majortype)); ok(IsEqualGUID(&mt->subtype, &GUID_NULL), "Got subtype %s.\n", wine_dbgstr_guid(&mt->subtype)); ok(mt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", mt->bFixedSizeSamples); ok(!mt->bTemporalCompression, "Got temporal compression %d.\n", mt->bTemporalCompression); - ok(mt->lSampleSize == 1, "Got sample size %lu.\n", mt->lSampleSize); + ok(mt->lSampleSize == 1, "Got sample size %u.\n", mt->lSampleSize); ok(IsEqualGUID(&mt->formattype, &GUID_NULL), "Got format type %s.\n", wine_dbgstr_guid(&mt->formattype)); ok(!mt->pUnk, "Got pUnk %p.\n", mt->pUnk); - ok(!mt->cbFormat, "Got format size %lu.\n", mt->cbFormat); + ok(!mt->cbFormat, "Got format size %u.\n", mt->cbFormat); ok(!mt->pbFormat, "Got unexpected format block.\n"); hr = IPin_QueryAccept(pin, mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); CoTaskMemFree(mt); } hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Audio; req_mt.formattype = FORMAT_WaveFormatEx; @@ -1312,7 +1311,7 @@ static void test_media_types(void) expect_hr = does_dsound_support_format(&wfx); hr = IPin_QueryAccept(pin, &req_mt); - ok(hr == expect_hr, "Expected hr %#lx, got %#lx, for %d channels, %d-bit %s, %ld Hz.\n", + ok(hr == expect_hr, "Expected hr %#x, got %#x, for %d channels, %d-bit %s, %d Hz.\n", expect_hr, hr, channels, formats[i].depth, formats[i].tag == WAVE_FORMAT_PCM ? "integer" : "float", sample_rates[j]); } @@ -1321,7 +1320,7 @@ static void test_media_types(void) IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_eos(void) @@ -1335,49 +1334,49 @@ static void test_unconnected_eos(void) ULONG ref; hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); @@ -1385,9 +1384,9 @@ static void test_unconnected_eos(void) IMediaControl_Release(control); IMediaEvent_Release(eventsrc); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(dsoundrender) @@ -1405,7 +1404,7 @@ START_TEST(dsoundrender) CoUninitialize(); return; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IBaseFilter_Release(filter); test_property_bag(); diff --git a/dlls/quartz/tests/filesource.c b/dlls/quartz/tests/filesource.c index c383d9f6579..4162e248937 100644 --- wine/dlls/quartz/tests/filesource.c +++ wine/dlls/quartz/tests/filesource.c @@ -29,7 +29,7 @@ static IBaseFilter *create_file_source(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -51,11 +51,11 @@ static WCHAR *load_resource(const WCHAR *name) wcscat(pathW, name); file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %u.\n", wine_dbgstr_w(pathW), GetLastError()); res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); - ok(!!res, "Failed to load resource, error %lu.\n", GetLastError()); + ok(!!res, "Failed to load resource, error %u.\n", GetLastError()); ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); WriteFile(file, ptr, SizeofResource( GetModuleHandleA(NULL), res), &written, NULL); ok(written == SizeofResource(GetModuleHandleA(NULL), res), "Failed to write resource.\n"); @@ -70,9 +70,9 @@ static void load_file(IBaseFilter *filter, const WCHAR *filename) HRESULT hr; hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFileSourceFilter_Load(filesource, filename, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IFileSourceFilter_Release(filesource); } @@ -93,7 +93,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -181,53 +181,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_AsyncReader, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_AsyncReader, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_file_source_filter(void) @@ -306,9 +306,9 @@ static void test_file_source_filter(void) trace("Running test for %s.\n", tests[i].label); file = CreateFileW(path, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); - ok(file != INVALID_HANDLE_VALUE, "Failed to create file, error %lu.\n", GetLastError()); + ok(file != INVALID_HANDLE_VALUE, "Failed to create file, error %u.\n", GetLastError()); ret = WriteFile(file, tests[i].data, tests[i].size, &written, NULL); - ok(ret, "Failed to write file, error %lu.\n", GetLastError()); + ok(ret, "Failed to write file, error %u.\n", GetLastError()); CloseHandle(file); filter = create_file_source(); @@ -316,27 +316,27 @@ static void test_file_source_filter(void) olepath = (void *)0xdeadbeef; hr = IFileSourceFilter_GetCurFile(filesource, &olepath, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!olepath, "Got path %s.\n", wine_dbgstr_w(olepath)); hr = IFileSourceFilter_Load(filesource, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IFileSourceFilter_Load(filesource, path, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFileSourceFilter_GetCurFile(filesource, NULL, &mt); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); olepath = NULL; hr = IFileSourceFilter_GetCurFile(filesource, &olepath, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(olepath); olepath = NULL; memset(&file_mt, 0x11, sizeof(file_mt)); hr = IFileSourceFilter_GetCurFile(filesource, &olepath, &file_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(olepath, path), "Expected path %s, got %s.\n", wine_dbgstr_w(path), wine_dbgstr_w(olepath)); ok(IsEqualGUID(&file_mt.majortype, &MEDIATYPE_Stream), "Got major type %s.\n", @@ -348,40 +348,40 @@ static void test_file_source_filter(void) ok(file_mt.bFixedSizeSamples == TRUE, "Got fixed size %d.\n", file_mt.bFixedSizeSamples); ok(file_mt.bTemporalCompression == FALSE, "Got temporal compression %d.\n", file_mt.bTemporalCompression); - ok(file_mt.lSampleSize == 1, "Got sample size %lu.\n", file_mt.lSampleSize); + ok(file_mt.lSampleSize == 1, "Got sample size %u.\n", file_mt.lSampleSize); ok(IsEqualGUID(&file_mt.formattype, &GUID_NULL), "Got format type %s.\n", wine_dbgstr_guid(&file_mt.formattype)); ok(!file_mt.pUnk, "Got pUnk %p.\n", file_mt.pUnk); - ok(!file_mt.cbFormat, "Got format size %#lx.\n", file_mt.cbFormat); + ok(!file_mt.cbFormat, "Got format size %#x.\n", file_mt.cbFormat); ok(!file_mt.pbFormat, "Got format %p.\n", file_mt.pbFormat); CoTaskMemFree(olepath); hr = IBaseFilter_FindPin(filter, L"Output", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EnumMediaTypes(pin, &enum_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum_mt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(pmt, &file_mt, sizeof(*pmt)), "Media types did not match.\n"); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enum_mt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt = file_mt; mt.subtype = GUID_NULL; ok(!memcmp(pmt, &mt, sizeof(*pmt)), "Media types did not match.\n"); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enum_mt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum_mt); mt = file_mt; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.bFixedSizeSamples = FALSE; mt.bTemporalCompression = TRUE; @@ -389,33 +389,33 @@ static void test_file_source_filter(void) mt.formattype = FORMAT_VideoInfo; mt.subtype = MEDIASUBTYPE_RGB32; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; if (!IsEqualGUID(tests[i].subtype, &GUID_NULL)) { mt.subtype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); } IPin_Release(pin); IFileSourceFilter_Release(filesource); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(path); - ok(ret, "Failed to delete file, error %lu\n", GetLastError()); + ok(ret, "Failed to delete file, error %u\n", GetLastError()); } /* test prescribed format */ filter = create_file_source(); hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; mt.subtype = MEDIASUBTYPE_RGB8; @@ -428,73 +428,73 @@ static void test_file_source_filter(void) mt.pbFormat = NULL; filename = load_resource(L"test.avi"); hr = IFileSourceFilter_Load(filesource, filename, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFileSourceFilter_GetCurFile(filesource, &olepath, &file_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&file_mt, &mt, sizeof(mt)), "Media types did not match.\n"); CoTaskMemFree(olepath); hr = IBaseFilter_FindPin(filter, L"Output", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EnumMediaTypes(pin, &enum_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum_mt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(pmt, &file_mt, sizeof(*pmt)), "Media types did not match.\n"); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enum_mt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Stream), "Got major type %s.\n", wine_dbgstr_guid(&pmt->majortype)); ok(IsEqualGUID(&pmt->subtype, &GUID_NULL), "Got subtype %s.\n", wine_dbgstr_guid(&pmt->subtype)); ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples); ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); - ok(pmt->lSampleSize == 1, "Got sample size %lu.\n", pmt->lSampleSize); + ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); ok(IsEqualGUID(&pmt->formattype, &GUID_NULL), "Got format type %s.\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); - ok(!pmt->cbFormat, "Got format size %#lx.\n", pmt->cbFormat); + ok(!pmt->cbFormat, "Got format size %#x.\n", pmt->cbFormat); ok(!pmt->pbFormat, "Got format %p.\n", pmt->pbFormat); hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enum_mt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum_mt); hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = FALSE; mt.lSampleSize = 456; mt.formattype = FORMAT_VideoInfo; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Video; mt.subtype = MEDIASUBTYPE_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IPin_Release(pin); IFileSourceFilter_Release(filesource); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_enum_pins(void) @@ -509,102 +509,102 @@ static void test_enum_pins(void) BOOL ret; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); load_file(filter, filename); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_find_pin(void) @@ -618,31 +618,31 @@ static void test_find_pin(void) BOOL ret; hr = IBaseFilter_FindPin(filter, L"Output", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); load_file(filter, filename); hr = IBaseFilter_FindPin(filter, L"Output", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, &enumpins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enumpins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin, pin2); IPin_Release(pin2); IPin_Release(pin); IEnumPins_Release(enumpins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_pin_info(void) @@ -660,37 +660,37 @@ static void test_pin_info(void) load_file(filter, filename); hr = IBaseFilter_FindPin(filter, L"Output", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"Output"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"Output"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_unconnected_filter_state(void) @@ -701,53 +701,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_sync_read_aligned(IAsyncReader *reader, IMemAllocator *allocator) @@ -765,13 +765,13 @@ static void test_sync_read_aligned(IAsyncReader *reader, IMemAllocator *allocato start_time = 0; end_time = 512 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_SyncReadAligned(reader, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); len = IMediaSample_GetActualDataLength(sample); - ok(len == 512, "Got length %ld.\n", len); + ok(len == 512, "Got length %d.\n", len); for (i = 0; i < 512; i++) ok(data[i] == i % 111, "Got wrong byte %02x at %u.\n", data[i], i); @@ -779,13 +779,13 @@ static void test_sync_read_aligned(IAsyncReader *reader, IMemAllocator *allocato start_time = 512 * (LONGLONG)10000000; end_time = 1024 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_SyncReadAligned(reader, sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); len = IMediaSample_GetActualDataLength(sample); - ok(len == 88, "Got length %ld.\n", len); + ok(len == 88, "Got length %d.\n", len); for (i = 0; i < 88; i++) ok(data[i] == (512 + i) % 111, "Got wrong byte %02x at %u.\n", data[i], i); @@ -793,13 +793,13 @@ static void test_sync_read_aligned(IAsyncReader *reader, IMemAllocator *allocato start_time = 1024 * (LONGLONG)10000000; end_time = 1536 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_SyncReadAligned(reader, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); len = IMediaSample_GetActualDataLength(sample); - ok(len == 0, "Got length %ld.\n", len); + ok(len == 0, "Got length %d.\n", len); IMediaSample_Release(sample); } @@ -814,7 +814,7 @@ static DWORD CALLBACK request_thread(void *arg) { struct request_thread_params *params = arg; HRESULT hr = IAsyncReader_Request(params->reader, params->sample, 123); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return 0; } @@ -836,23 +836,23 @@ static void test_request(IAsyncReader *reader, IMemAllocator *allocator) IMediaSample_GetPointer(sample2, &data2); hr = IAsyncReader_WaitForNext(reader, 0, &ret_sample, &cookie); - ok(hr == VFW_E_TIMEOUT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TIMEOUT, "Got hr %#x.\n", hr); start_time = 0; end_time = 512 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_Request(reader, sample, 123); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_WaitForNext(reader, 1000, &ret_sample, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_sample == sample, "Expected sample %p, got %p.\n", sample, ret_sample); - ok(cookie == 123, "Got cookie %Iu.\n", cookie); + ok(cookie == 123, "Got cookie %lu.\n", cookie); len = IMediaSample_GetActualDataLength(sample); - ok(len == 512, "Got length %ld.\n", len); + ok(len == 512, "Got length %d.\n", hr); for (i = 0; i < 512; i++) ok(data[i] == i % 111, "Got wrong byte %02x at %u.\n", data[i], i); @@ -860,47 +860,47 @@ static void test_request(IAsyncReader *reader, IMemAllocator *allocator) start_time = 1024 * (LONGLONG)10000000; end_time = 1536 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_Request(reader, sample, 123); - ok(hr == HRESULT_FROM_WIN32(ERROR_HANDLE_EOF), "Got hr %#lx.\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_HANDLE_EOF), "Got hr %#x.\n", hr); start_time = 0; end_time = 512 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_Request(reader, sample, 123); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start_time = 512 * (LONGLONG)10000000; end_time = 1024 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample2, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_Request(reader, sample2, 456); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_WaitForNext(reader, 1000, &ret_sample, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (cookie == 123) { ok(ret_sample == sample, "Expected sample %p, got %p.\n", sample, ret_sample); hr = IAsyncReader_WaitForNext(reader, 1000, &ret_sample, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_sample == sample2, "Expected sample %p, got %p.\n", sample2, ret_sample); - ok(cookie == 456, "Got cookie %Iu.\n", cookie); + ok(cookie == 456, "Got cookie %lu.\n", cookie); } else { - ok(cookie == 456, "Got cookie %Iu.\n", cookie); + ok(cookie == 456, "Got cookie %lu.\n", cookie); ok(ret_sample == sample2, "Expected sample %p, got %p.\n", sample2, ret_sample); hr = IAsyncReader_WaitForNext(reader, 1000, &ret_sample, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_sample == sample, "Expected sample %p, got %p.\n", sample, ret_sample); - ok(cookie == 123, "Got cookie %Iu.\n", cookie); + ok(cookie == 123, "Got cookie %lu.\n", cookie); } for (i = 0; i < 512; i++) @@ -916,9 +916,9 @@ static void test_request(IAsyncReader *reader, IMemAllocator *allocator) CloseHandle(thread); hr = IAsyncReader_WaitForNext(reader, 1000, &ret_sample, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_sample == sample, "Samples didn't match.\n"); - ok(cookie == 123, "Got cookie %Iu.\n", cookie); + ok(cookie == 123, "Got cookie %lu.\n", cookie); IMediaSample_Release(sample); IMediaSample_Release(sample2); @@ -930,7 +930,7 @@ static DWORD CALLBACK wait_thread(void *arg) IMediaSample *sample; DWORD_PTR cookie; HRESULT hr = IAsyncReader_WaitForNext(reader, 2000, &sample, &cookie); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); return 0; } @@ -950,44 +950,44 @@ static void test_flush(IAsyncReader *reader, IMemAllocator *allocator) start_time = 0; end_time = 512 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_BeginFlush(reader); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_SyncRead(reader, 0, 20, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < 20; i++) ok(buffer[i] == i % 111, "Got wrong byte %02x at %u.\n", buffer[i], i); start_time = 0; end_time = 512 * (LONGLONG)10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_SyncReadAligned(reader, sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < 512; i++) ok(data[i] == i % 111, "Got wrong byte %02x at %u.\n", data[i], i); hr = IAsyncReader_Request(reader, sample, 456); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IAsyncReader_EndFlush(reader); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_WaitForNext(reader, 0, &ret_sample, &cookie); - ok(hr == VFW_E_TIMEOUT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TIMEOUT, "Got hr %#x.\n", hr); start_time = 0; end_time = 512 * (LONGLONG)10000000; hr = IAsyncReader_Request(reader, sample, 123); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_WaitForNext(reader, 1000, &ret_sample, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_sample == sample, "Expected sample %p, got %p.\n", sample, ret_sample); - ok(cookie == 123, "Got cookie %Iu.\n", cookie); + ok(cookie == 123, "Got cookie %lu.\n", cookie); for (i = 0; i < 512; i++) ok(data[i] == i % 111, "Got wrong byte %02x at %u.\n", data[i], i); @@ -996,12 +996,12 @@ static void test_flush(IAsyncReader *reader, IMemAllocator *allocator) ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Expected timeout.\n"); hr = IAsyncReader_BeginFlush(reader); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(thread, 1000), "Wait timed out.\n"); CloseHandle(thread); hr = IAsyncReader_EndFlush(reader); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaSample_Release(sample); } @@ -1027,7 +1027,7 @@ static void test_async_reader(void) GetTempPathW(ARRAY_SIZE(filename), filename); wcscat(filename, L"test.avi"); file = CreateFileW(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "Failed to create file, error %lu.\n", GetLastError()); + ok(file != INVALID_HANDLE_VALUE, "Failed to create file, error %u.\n", GetLastError()); for (i = 0; i < 600; i++) { BYTE b = i % 111; @@ -1040,31 +1040,31 @@ static void test_async_reader(void) IBaseFilter_FindPin(filter, L"Output", &pin); hr = IPin_QueryInterface(pin, &IID_IAsyncReader, (void **)&reader); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IAsyncReader_Length(reader, &length, &available); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(length == 600, "Got length %s.\n", wine_dbgstr_longlong(length)); ok(available == 600, "Got available length %s.\n", wine_dbgstr_longlong(available)); memset(buffer, 0xcc, sizeof(buffer)); hr = IAsyncReader_SyncRead(reader, 0, 10, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < 10; i++) ok(buffer[i] == i % 111, "Got wrong byte %02x at %u.\n", buffer[i], i); hr = IAsyncReader_SyncRead(reader, 0, 10, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < 10; i++) ok(buffer[i] == i % 111, "Got wrong byte %02x at %u.\n", buffer[i], i); hr = IAsyncReader_SyncRead(reader, 10, 10, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < 10; i++) ok(buffer[i] == (10 + i) % 111, "Got wrong byte %02x at %u.\n", buffer[i], i); hr = IAsyncReader_SyncRead(reader, 590, 20, buffer); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); for (i = 0; i < 10; i++) ok(buffer[i] == (590 + i) % 111, "Got wrong byte %02x at %u.\n", buffer[i], i); for (; i < 20; i++) @@ -1072,16 +1072,16 @@ static void test_async_reader(void) memset(buffer, 0xcc, sizeof(buffer)); hr = IAsyncReader_SyncRead(reader, 600, 10, buffer); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(buffer[0] == 0xcc, "Got wrong byte %02x.\n", buffer[0]); ret_props = req_props; hr = IAsyncReader_RequestAllocator(reader, NULL, &ret_props, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(ret_props.cBuffers == 100, "Got %ld buffers.\n", ret_props.cBuffers); - ok(ret_props.cbBuffer == 1024, "Got size %ld.\n", ret_props.cbBuffer); - ok(ret_props.cbAlign == 512, "Got alignment %ld.\n", ret_props.cbAlign); - ok(ret_props.cbPrefix == 0, "Got prefix %ld.\n", ret_props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(ret_props.cBuffers == 100, "Got %d buffers.\n", ret_props.cBuffers); + ok(ret_props.cbBuffer == 1024, "Got size %d.\n", ret_props.cbBuffer); + ok(ret_props.cbAlign == 512, "Got alignment %d.\n", ret_props.cbAlign); + ok(ret_props.cbPrefix == 0, "Got prefix %d.\n", ret_props.cbPrefix); IMemAllocator_Commit(allocator); @@ -1094,9 +1094,9 @@ static void test_async_reader(void) IPin_Release(pin); IFileSourceFilter_Release(filesource); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_enum_media_types(void) @@ -1115,84 +1115,84 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"Output", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 3, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 3); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(mts[0]); IEnumMediaTypes_Release(enum1); @@ -1200,9 +1200,9 @@ static void test_enum_media_types(void) IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } struct testsink @@ -1319,52 +1319,52 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(source, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); /* Test exact connection. */ hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(source, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsink.pin.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsink.pin.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsink.pin.pin.peer == source, "Got peer %p.\n", testsink.pin.pin.peer); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); req_mt.pbFormat = &my_format; req_mt.cbFormat = sizeof(my_format); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, &req_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); @@ -1373,31 +1373,31 @@ static void test_connect_pin(void) req_mt.majortype = MEDIATYPE_Video; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Stream; req_mt.subtype = MEDIASUBTYPE_RGB8; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, &req_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_Avi; /* Test connection with wildcards. */ hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); req_mt.formattype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); @@ -1405,22 +1405,22 @@ static void test_connect_pin(void) req_mt.formattype = FORMAT_None; req_mt.majortype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.formattype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); req_mt.subtype = MEDIASUBTYPE_RGB8; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); @@ -1428,24 +1428,24 @@ static void test_connect_pin(void) req_mt.majortype = MEDIATYPE_Stream; req_mt.subtype = MEDIASUBTYPE_RGB8; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); req_mt.majortype = MEDIATYPE_Video; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); /* The second type (i.e. whose subtype is GUID_NULL) is not tried. This is * consistent with its being rejected by IPin::QueryAccept(). */ testsink.reject_avi = TRUE; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, NULL); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); /* But any types we expose are tried. */ testsink.mt = &mt; @@ -1454,11 +1454,11 @@ static void test_connect_pin(void) mt.subtype = MEDIASUBTYPE_RGB8; mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, NULL); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.pin.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.pin.pin.mt, &mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.pin.pin.IPin_iface); @@ -1467,13 +1467,13 @@ static void test_connect_pin(void) IPin_Release(source); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } START_TEST(filesource) diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index 0e9a398ad2c..a83bfde0806 100644 --- wine/dlls/quartz/tests/filtergraph.c +++ wine/dlls/quartz/tests/filtergraph.c @@ -42,10 +42,10 @@ static WCHAR *create_file(const WCHAR *name, const char *data, DWORD size) GetTempPathW(ARRAY_SIZE(pathW), pathW); wcscat(pathW, name); file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %u.\n", wine_dbgstr_w(pathW), GetLastError()); WriteFile(file, data, size, &written, NULL); - ok(written = size, "Failed to write file data, error %lu.\n", GetLastError()); + ok(written = size, "Failed to write file data, error %u.\n", GetLastError()); CloseHandle(file); return pathW; @@ -57,7 +57,7 @@ static WCHAR *load_resource(const WCHAR *name) void *ptr; res = FindResourceW(NULL, name, (const WCHAR *)RT_RCDATA); - ok(!!res, "Failed to find resource %s, error %lu.\n", wine_dbgstr_w(name), GetLastError()); + ok(!!res, "Failed to find resource %s, error %u.\n", wine_dbgstr_w(name), GetLastError()); ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); return create_file(name, ptr, SizeofResource(GetModuleHandleA(NULL), res)); } @@ -67,7 +67,7 @@ static IFilterGraph2 *create_graph(void) IFilterGraph2 *ret; HRESULT hr; hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); return ret; } @@ -88,7 +88,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -98,30 +98,23 @@ static void test_interfaces(void) IFilterGraph2 *graph = create_graph(); check_interface(graph, &IID_IBasicAudio, TRUE); - check_interface(graph, &IID_IBasicVideo, TRUE); check_interface(graph, &IID_IBasicVideo2, TRUE); - check_interface(graph, &IID_IFilterGraph, TRUE); check_interface(graph, &IID_IFilterGraph2, TRUE); check_interface(graph, &IID_IFilterMapper, TRUE); - check_interface(graph, &IID_IFilterMapper2, TRUE); check_interface(graph, &IID_IFilterMapper3, TRUE); - check_interface(graph, &IID_IGraphBuilder, TRUE); check_interface(graph, &IID_IGraphConfig, TRUE); check_interface(graph, &IID_IGraphVersion, TRUE); check_interface(graph, &IID_IMediaControl, TRUE); check_interface(graph, &IID_IMediaEvent, TRUE); - check_interface(graph, &IID_IMediaEventEx, TRUE); - check_interface(graph, &IID_IMediaEventSink, TRUE); check_interface(graph, &IID_IMediaFilter, TRUE); + check_interface(graph, &IID_IMediaEventSink, TRUE); check_interface(graph, &IID_IMediaPosition, TRUE); check_interface(graph, &IID_IMediaSeeking, TRUE); check_interface(graph, &IID_IObjectWithSite, TRUE); check_interface(graph, &IID_IVideoFrameStep, TRUE); check_interface(graph, &IID_IVideoWindow, TRUE); - check_interface(graph, &IID_IUnknown, TRUE); check_interface(graph, &IID_IBaseFilter, FALSE); - check_interface(graph, &IID_IDispatch, FALSE); IFilterGraph2_Release(graph); } @@ -134,202 +127,202 @@ static void test_basic_video(IFilterGraph2 *graph) HRESULT hr; hr = IFilterGraph2_QueryInterface(graph, &IID_IBasicVideo, (void **)&pbv); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot get IBasicVideo interface returned: %x\n", hr); /* test get video size */ hr = IBasicVideo_GetVideoSize(pbv, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr==E_POINTER, "IBasicVideo_GetVideoSize returned: %x\n", hr); hr = IBasicVideo_GetVideoSize(pbv, &video_width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr==E_POINTER, "IBasicVideo_GetVideoSize returned: %x\n", hr); hr = IBasicVideo_GetVideoSize(pbv, NULL, &video_height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr==E_POINTER, "IBasicVideo_GetVideoSize returned: %x\n", hr); hr = IBasicVideo_GetVideoSize(pbv, &video_width, &video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot get video size returned: %x\n", hr); /* test source position */ hr = IBasicVideo_GetSourcePosition(pbv, NULL, NULL, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "IBasicVideo_GetSourcePosition returned: %x\n", hr); hr = IBasicVideo_GetSourcePosition(pbv, &left, &top, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "IBasicVideo_GetSourcePosition returned: %x\n", hr); hr = IBasicVideo_GetSourcePosition(pbv, NULL, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "IBasicVideo_GetSourcePosition returned: %x\n", hr); hr = IBasicVideo_GetSourcePosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == video_width, "Expected width %ld, got %ld.\n", video_width, width); - ok(height == video_height, "Expected height %ld, got %ld.\n", video_height, height); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(left == 0, "expected 0, got %d\n", left); + ok(top == 0, "expected 0, got %d\n", top); + ok(width == video_width, "expected %d, got %d\n", video_width, width); + ok(height == video_height, "expected %d, got %d\n", video_height, height); hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, 0, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, video_width*2, video_height*2); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_put_SourceTop(pbv, -1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_put_SourceTop returned: %x\n", hr); hr = IBasicVideo_put_SourceTop(pbv, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put source top returned: %x\n", hr); hr = IBasicVideo_put_SourceTop(pbv, 1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_put_SourceTop returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, video_width, 0, video_width, video_height); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, 0, video_height, video_width, video_height); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, -1, 0, video_width, video_height); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, 0, -1, video_width, video_height); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, video_width/2, video_height/2, video_width, video_height); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, video_width/2, video_height/2, video_width, video_height); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, video_width, video_height+1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, 0, 0, video_width+1, video_height); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetSourcePosition returned: %x\n", hr); hr = IBasicVideo_SetSourcePosition(pbv, video_width/2, video_height/2, video_width/3+1, video_height/3+1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set source position returned: %x\n", hr); hr = IBasicVideo_get_SourceLeft(pbv, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == video_width / 2, "Expected left %ld, got %ld.\n", video_width / 2, left); + ok(hr==S_OK, "Cannot get source left returned: %x\n", hr); + ok(left==video_width/2, "expected %d, got %d\n", video_width/2, left); hr = IBasicVideo_get_SourceTop(pbv, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == video_height / 2, "Expected top %ld, got %ld.\n", video_height / 2, top); + ok(hr==S_OK, "Cannot get source top returned: %x\n", hr); + ok(top==video_height/2, "expected %d, got %d\n", video_height/2, top); hr = IBasicVideo_get_SourceWidth(pbv, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == video_width / 3 + 1, "Expected width %ld, got %ld.\n", video_width / 3 + 1, width); + ok(hr==S_OK, "Cannot get source width returned: %x\n", hr); + ok(width==video_width/3+1, "expected %d, got %d\n", video_width/3+1, width); hr = IBasicVideo_get_SourceHeight(pbv, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == video_height / 3 + 1, "Expected height %ld, got %ld.\n", video_height / 3 + 1, height); + ok(hr==S_OK, "Cannot get source height returned: %x\n", hr); + ok(height==video_height/3+1, "expected %d, got %d\n", video_height/3+1, height); hr = IBasicVideo_put_SourceLeft(pbv, video_width/3); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put source left returned: %x\n", hr); hr = IBasicVideo_GetSourcePosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == video_width / 3, "Expected left %ld, got %ld.\n", video_width / 3, left); - ok(width == video_width / 3 + 1, "Expected width %ld, got %ld.\n", video_width / 3 + 1, width); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(left == video_width/3, "expected %d, got %d\n", video_width/3, left); + ok(width == video_width/3+1, "expected %d, got %d\n", video_width/3+1, width); hr = IBasicVideo_put_SourceTop(pbv, video_height/3); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put source top returned: %x\n", hr); hr = IBasicVideo_GetSourcePosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == video_height / 3, "Expected top %ld, got %ld.\n", video_height / 3, top); - ok(height == video_height / 3 + 1, "Expected height %ld, got %ld.\n", video_height / 3 + 1, height); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(top == video_height/3, "expected %d, got %d\n", video_height/3, top); + ok(height == video_height/3+1, "expected %d, got %d\n", video_height/3+1, height); hr = IBasicVideo_put_SourceWidth(pbv, video_width/4+1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put source width returned: %x\n", hr); hr = IBasicVideo_GetSourcePosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == video_width / 3, "Expected left %ld, got %ld.\n", video_width / 3, left); - ok(width == video_width / 4 + 1, "Expected width %ld, got %ld.\n", video_width / 4 + 1, width); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(left == video_width/3, "expected %d, got %d\n", video_width/3, left); + ok(width == video_width/4+1, "expected %d, got %d\n", video_width/4+1, width); hr = IBasicVideo_put_SourceHeight(pbv, video_height/4+1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put source height returned: %x\n", hr); hr = IBasicVideo_GetSourcePosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == video_height / 3, "Expected top %ld, got %ld.\n", video_height / 3, top); - ok(height == video_height / 4 + 1, "Expected height %ld, got %ld.\n", video_height / 4 + 1, height); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(top == video_height/3, "expected %d, got %d\n", video_height/3, top); + ok(height == video_height/4+1, "expected %d, got %d\n", video_height/4+1, height); /* test destination rectangle */ window_width = max(video_width, GetSystemMetrics(SM_CXMIN) - 2 * GetSystemMetrics(SM_CXFRAME)); hr = IBasicVideo_GetDestinationPosition(pbv, NULL, NULL, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "IBasicVideo_GetDestinationPosition returned: %x\n", hr); hr = IBasicVideo_GetDestinationPosition(pbv, &left, &top, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "IBasicVideo_GetDestinationPosition returned: %x\n", hr); hr = IBasicVideo_GetDestinationPosition(pbv, NULL, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "IBasicVideo_GetDestinationPosition returned: %x\n", hr); hr = IBasicVideo_GetDestinationPosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == window_width, "Expected width %ld, got %ld.\n", window_width, width); - ok(height == video_height, "Expected height %ld, got %ld.\n", video_height, height); + ok(hr == S_OK, "Cannot get destination position returned: %x\n", hr); + ok(left == 0, "expected 0, got %d\n", left); + ok(top == 0, "expected 0, got %d\n", top); + ok(width == window_width, "expected %d, got %d\n", window_width, width); + ok(height == video_height, "expected %d, got %d\n", video_height, height); hr = IBasicVideo_SetDestinationPosition(pbv, 0, 0, 0, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr==E_INVALIDARG, "IBasicVideo_SetDestinationPosition returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, 0, 0, video_width*2, video_height*2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination position returned: %x\n", hr); hr = IBasicVideo_put_DestinationLeft(pbv, -1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination left returned: %x\n", hr); hr = IBasicVideo_put_DestinationLeft(pbv, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination left returned: %x\n", hr); hr = IBasicVideo_put_DestinationLeft(pbv, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination left returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, video_width, 0, video_width, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destinaiton position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, 0, video_height, video_width, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destinaiton position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, -1, 0, video_width, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, 0, -1, video_width, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, video_width/2, video_height/2, video_width, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, video_width/2, video_height/2, video_width, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, 0, 0, video_width, video_height+1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, 0, 0, video_width+1, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); hr = IBasicVideo_SetDestinationPosition(pbv, video_width/2, video_height/2, video_width/3+1, video_height/3+1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); hr = IBasicVideo_get_DestinationLeft(pbv, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == video_width / 2, "Expected left %ld, got %ld.\n", video_width / 2, left); + ok(hr==S_OK, "Cannot get destination left returned: %x\n", hr); + ok(left==video_width/2, "expected %d, got %d\n", video_width/2, left); hr = IBasicVideo_get_DestinationTop(pbv, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == video_height / 2, "Expected top %ld, got %ld.\n", video_height / 2, top); + ok(hr==S_OK, "Cannot get destination top returned: %x\n", hr); + ok(top==video_height/2, "expected %d, got %d\n", video_height/2, top); hr = IBasicVideo_get_DestinationWidth(pbv, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == video_width / 3 + 1, "Expected width %ld, got %ld.\n", video_width / 3 + 1, width); + ok(hr==S_OK, "Cannot get destination width returned: %x\n", hr); + ok(width==video_width/3+1, "expected %d, got %d\n", video_width/3+1, width); hr = IBasicVideo_get_DestinationHeight(pbv, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == video_height / 3 + 1, "Expected height %ld, got %ld.\n", video_height / 3 + 1, height); + ok(hr==S_OK, "Cannot get destination height returned: %x\n", hr); + ok(height==video_height/3+1, "expected %d, got %d\n", video_height/3+1, height); hr = IBasicVideo_put_DestinationLeft(pbv, video_width/3); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination left returned: %x\n", hr); hr = IBasicVideo_GetDestinationPosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == video_width / 3, "Expected left %ld, got %ld.\n", video_width / 3, left); - ok(width == video_width / 3 + 1, "Expected width %ld, got %ld.\n", video_width / 3 + 1, width); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(left == video_width/3, "expected %d, got %d\n", video_width/3, left); + ok(width == video_width/3+1, "expected %d, got %d\n", video_width/3+1, width); hr = IBasicVideo_put_DestinationTop(pbv, video_height/3); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination top returned: %x\n", hr); hr = IBasicVideo_GetDestinationPosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == video_height / 3, "Expected top %ld, got %ld.\n", video_height / 3, top); - ok(height == video_height / 3 + 1, "Expected height %ld, got %ld.\n", video_height / 3 + 1, height); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(top == video_height/3, "expected %d, got %d\n", video_height/3, top); + ok(height == video_height/3+1, "expected %d, got %d\n", video_height/3+1, height); hr = IBasicVideo_put_DestinationWidth(pbv, video_width/4+1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination width returned: %x\n", hr); hr = IBasicVideo_GetDestinationPosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == video_width / 3, "Expected left %ld, got %ld.\n", video_width / 3, left); - ok(width == video_width / 4 + 1, "Expected width %ld, got %ld.\n", video_width / 4 + 1, width); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(left == video_width/3, "expected %d, got %d\n", video_width/3, left); + ok(width == video_width/4+1, "expected %d, got %d\n", video_width/4+1, width); hr = IBasicVideo_put_DestinationHeight(pbv, video_height/4+1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot put destination height returned: %x\n", hr); hr = IBasicVideo_GetDestinationPosition(pbv, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == video_height / 3, "Expected top %ld, got %ld.\n", video_height / 3, top); - ok(height == video_height / 4 + 1, "Expected height %ld, got %ld.\n", video_height / 4 + 1, height); + ok(hr == S_OK, "Cannot get source position returned: %x\n", hr); + ok(top == video_height/3, "expected %d, got %d\n", video_height/3, top); + ok(height == video_height/4+1, "expected %d, got %d\n", video_height/4+1, height); /* reset source rectangle */ hr = IBasicVideo_SetDefaultSourcePosition(pbv); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "IBasicVideo_SetDefaultSourcePosition returned: %x\n", hr); /* reset destination position */ hr = IBasicVideo_SetDestinationPosition(pbv, 0, 0, video_width, video_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr==S_OK, "Cannot set destination position returned: %x\n", hr); IBasicVideo_Release(pbv); } @@ -344,57 +337,57 @@ static void test_media_seeking(IFilterGraph2 *graph) IFilterGraph2_SetDefaultSyncSource(graph); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaSeeking, (void **)&seeking); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IMediaControl) failed: %08x\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IMediaFilter) failed: %08x\n", hr); format = GUID_NULL; hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetTimeFormat failed: %#x\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "got %s\n", wine_dbgstr_guid(&format)); pos = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &pos, NULL, 0x123456789a, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "ConvertTimeFormat failed: %#x\n", hr); ok(pos == 0x123456789a, "got %s\n", wine_dbgstr_longlong(pos)); pos = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &pos, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "ConvertTimeFormat failed: %#x\n", hr); ok(pos == 0x123456789a, "got %s\n", wine_dbgstr_longlong(pos)); pos = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &pos, NULL, 0x123456789a, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "ConvertTimeFormat failed: %#x\n", hr); ok(pos == 0x123456789a, "got %s\n", wine_dbgstr_longlong(pos)); hr = IMediaSeeking_GetCurrentPosition(seeking, &pos); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetCurrentPosition failed: %#x\n", hr); ok(pos == 0, "got %s\n", wine_dbgstr_longlong(pos)); hr = IMediaSeeking_GetDuration(seeking, &duration); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetDuration failed: %#x\n", hr); ok(duration > 0, "got %s\n", wine_dbgstr_longlong(duration)); hr = IMediaSeeking_GetStopPosition(seeking, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetCurrentPosition failed: %08x\n", hr); ok(stop == duration || stop == duration + 1, "expected %s, got %s\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(stop)); hr = IMediaSeeking_SetPositions(seeking, NULL, AM_SEEKING_ReturnTime, NULL, AM_SEEKING_NoPositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "SetPositions failed: %#x\n", hr); hr = IMediaSeeking_SetPositions(seeking, NULL, AM_SEEKING_NoPositioning, NULL, AM_SEEKING_ReturnTime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "SetPositions failed: %#x\n", hr); pos = 0; hr = IMediaSeeking_SetPositions(seeking, &pos, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "SetPositions failed: %08x\n", hr); IMediaFilter_SetSyncSource(filter, NULL); pos = 0xdeadbeef; hr = IMediaSeeking_GetCurrentPosition(seeking, &pos); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetCurrentPosition failed: %08x\n", hr); ok(pos == 0, "Position != 0 (%s)\n", wine_dbgstr_longlong(pos)); IFilterGraph2_SetDefaultSyncSource(graph); @@ -409,47 +402,47 @@ static void test_state_change(IFilterGraph2 *graph) HRESULT hr; hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IMediaControl) failed: %x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %ld.\n", state); + ok(hr == S_OK, "GetState() failed: %x\n", hr); + ok(state == State_Stopped, "wrong state %d\n", state); hr = IMediaControl_Run(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Run() failed: %x\n", hr); hr = IMediaControl_GetState(control, INFINITE, &state); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %ld.\n", state); + ok(SUCCEEDED(hr), "GetState() failed: %x\n", hr); + ok(state == State_Running, "wrong state %d\n", state); hr = IMediaControl_Stop(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Stop() failed: %x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %ld.\n", state); + ok(hr == S_OK, "GetState() failed: %x\n", hr); + ok(state == State_Stopped, "wrong state %d\n", state); hr = IMediaControl_Pause(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Pause() failed: %x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %ld.\n", state); + ok(hr == S_OK, "GetState() failed: %x\n", hr); + ok(state == State_Paused, "wrong state %d\n", state); hr = IMediaControl_Run(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Run() failed: %x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %ld.\n", state); + ok(hr == S_OK, "GetState() failed: %x\n", hr); + ok(state == State_Running, "wrong state %d\n", state); hr = IMediaControl_Pause(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Pause() failed: %x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %ld.\n", state); + ok(hr == S_OK, "GetState() failed: %x\n", hr); + ok(state == State_Paused, "wrong state %d\n", state); hr = IMediaControl_Stop(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Stop() failed: %x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %ld.\n", state); + ok(hr == S_OK, "GetState() failed: %x\n", hr); + ok(state == State_Stopped, "wrong state %d\n", state); IMediaControl_Release(control); } @@ -469,33 +462,33 @@ static void test_media_event(IFilterGraph2 *graph) LONG code; hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IMediaFilter) failed: %#x\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IMediaControl) failed: %#x\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&media_event); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IMediaEvent) failed: %#x\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaSeeking, (void **)&seeking); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IMediaEvent) failed: %#x\n", hr); hr = IMediaControl_Stop(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Stop() failed: %#x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); ok(hr == S_OK, "GetState() timed out\n"); hr = IMediaSeeking_GetDuration(seeking, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetDuration() failed: %#x\n", hr); current = 0; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "SetPositions() failed: %#x\n", hr); hr = IMediaFilter_SetSyncSource(filter, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "SetSyncSource() failed: %#x\n", hr); hr = IMediaEvent_GetEventHandle(media_event, (OAEVENT *)&event); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetEventHandle() failed: %#x\n", hr); /* flush existing events */ while ((hr = IMediaEvent_GetEvent(media_event, &code, &lparam1, &lparam2, 0)) == S_OK); @@ -503,7 +496,7 @@ static void test_media_event(IFilterGraph2 *graph) ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "event should not be signaled\n"); hr = IMediaControl_Run(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Run() failed: %#x\n", hr); while (!got_eos) { @@ -522,16 +515,16 @@ static void test_media_event(IFilterGraph2 *graph) ok(got_eos, "didn't get EOS\n"); hr = IMediaSeeking_GetCurrentPosition(seeking, ¤t); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "GetCurrentPosition() failed: %#x\n", hr); ok(current == stop, "expected %s, got %s\n", wine_dbgstr_longlong(stop), wine_dbgstr_longlong(current)); hr = IMediaControl_Stop(control); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Run() failed: %#x\n", hr); hr = IMediaControl_GetState(control, 1000, &state); ok(hr == S_OK, "GetState() timed out\n"); hr = IFilterGraph2_SetDefaultSyncSource(graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "SetDefaultSinkSource() failed: %#x\n", hr); IMediaSeeking_Release(seeking); IMediaEvent_Release(media_event); @@ -564,7 +557,7 @@ static HRESULT test_graph_builder_connect_file(WCHAR *filename, BOOL audio, BOOL &IID_IBaseFilter, (void **)&renderer); if (hr == VFW_E_NO_AUDIO_HARDWARE) return VFW_E_CANNOT_CONNECT; - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); graph = create_graph(); @@ -573,13 +566,13 @@ static HRESULT test_graph_builder_connect_file(WCHAR *filename, BOOL audio, BOOL IEnumPins_Release(enumpins); hr = IFilterGraph2_AddSourceFilter(graph, filename, NULL, &source_filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "AddSourceFilter failed: %#x\n", hr); hr = IFilterGraph2_AddFilter(graph, renderer, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "AddFilter failed: %#x\n", hr); hr = IBaseFilter_FindPin(source_filter, L"Output", &pin_out); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "FindPin failed: %#x\n", hr); hr = IFilterGraph2_Connect(graph, pin_out, pin_in); if (SUCCEEDED(hr)) @@ -620,32 +613,32 @@ static void test_render_run(const WCHAR *file, BOOL audio, BOOL video) skip("%s: codec not supported; skipping test\n", wine_dbgstr_w(file)); refs = IFilterGraph2_Release(graph); - ok(!refs, "Got outsanding refcount %ld.\n", refs); + ok(!refs, "Graph has %u references\n", refs); hr = test_graph_builder_connect_file(filename, audio, video); - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_CONNECT, "got %#x\n", hr); } else { if (audio) - ok(hr == S_OK || hr == VFW_S_AUDIO_NOT_RENDERED, "Got hr %#lx.\n", hr); + ok(hr == S_OK || hr == VFW_S_AUDIO_NOT_RENDERED, "Got hr %#x.\n", hr); else - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); rungraph(graph, video); refs = IFilterGraph2_Release(graph); - ok(!refs, "Got outsanding refcount %ld.\n", refs); + ok(!refs, "Graph has %u references\n", refs); hr = test_graph_builder_connect_file(filename, audio, video); if (audio && video) - todo_wine ok(hr == VFW_S_PARTIAL_RENDER, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_PARTIAL_RENDER, "Got hr %#x.\n", hr); else - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } /* check reference leaks */ h = CreateFileW(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); - ok(h != INVALID_HANDLE_VALUE, "CreateFile failed: err=%ld\n", GetLastError()); + ok(h != INVALID_HANDLE_VALUE, "CreateFile failed: err=%d\n", GetLastError()); CloseHandle(h); DeleteFileW(filename); @@ -665,74 +658,74 @@ static void test_enum_filters(void) &IID_IBaseFilter, (void **)&filter2); hr = IFilterGraph2_EnumFilters(graph, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Next(enum1, 1, filters, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); IFilterGraph2_AddFilter(graph, filter1, NULL); IFilterGraph2_AddFilter(graph, filter2, NULL); hr = IEnumFilters_Next(enum1, 1, filters, NULL); - ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 1); - ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#x.\n", hr); hr = IEnumFilters_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumFilters_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum1, 1); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumFilters_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Next(enum1, 1, filters, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filters[0] == filter2, "Got filter %p.\n", filters[0]); IBaseFilter_Release(filters[0]); hr = IEnumFilters_Next(enum1, 1, filters, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); ok(filters[0] == filter1, "Got filter %p.\n", filters[0]); IBaseFilter_Release(filters[0]); hr = IEnumFilters_Next(enum1, 1, filters, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 0, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 0, "Got count %u.\n", count); hr = IEnumFilters_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Next(enum1, 2, filters, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); ok(filters[0] == filter2, "Got filter %p.\n", filters[0]); ok(filters[1] == filter1, "Got filter %p.\n", filters[1]); IBaseFilter_Release(filters[0]); @@ -742,41 +735,41 @@ static void test_enum_filters(void) IFilterGraph2_AddFilter(graph, filter1, NULL); hr = IEnumFilters_Next(enum1, 2, filters, &count); - ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_ENUM_OUT_OF_SYNC, "Got hr %#x.\n", hr); hr = IEnumFilters_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Next(enum1, 2, filters, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); ok(filters[0] == filter1, "Got filter %p.\n", filters[0]); ok(filters[1] == filter2, "Got filter %p.\n", filters[1]); IBaseFilter_Release(filters[0]); IBaseFilter_Release(filters[1]); hr = IEnumFilters_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Skip(enum2, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Next(enum2, 2, filters, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); ok(filters[0] == filter2, "Got filter %p.\n", filters[0]); IBaseFilter_Release(filters[0]); hr = IEnumFilters_Skip(enum1, 3); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumFilters_Release(enum2); IEnumFilters_Release(enum1); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static DWORD WINAPI call_RenderFile_multithread(LPVOID lParam) @@ -786,7 +779,7 @@ static DWORD WINAPI call_RenderFile_multithread(LPVOID lParam) HRESULT hr; hr = IFilterGraph2_RenderFile(graph, filename, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); rungraph(graph, TRUE); @@ -1434,7 +1427,7 @@ static HRESULT WINAPI testfilter_Run(IBaseFilter *iface, REFERENCE_TIME start) static HRESULT WINAPI testfilter_GetState(IBaseFilter *iface, DWORD timeout, FILTER_STATE *state) { struct testfilter *filter = impl_from_IBaseFilter(iface); - if (winetest_debug > 1) trace("%p->GetState(%lu)\n", filter, timeout); + if (winetest_debug > 1) trace("%p->GetState(%u)\n", filter, timeout); *state = filter->state; return filter->GetState_hr; @@ -1679,7 +1672,7 @@ static HRESULT WINAPI testseek_SetPositions(IMediaSeeking *iface, LONGLONG *curr DWORD current_flags, LONGLONG *stop, DWORD stop_flags ) { struct testfilter *filter = impl_from_IMediaSeeking(iface); - if (winetest_debug > 1) trace("%p->SetPositions(%s, %#lx, %s, %#lx)\n", + if (winetest_debug > 1) trace("%p->SetPositions(%s, %#x, %s, %#x)\n", iface, wine_dbgstr_longlong(*current), current_flags, wine_dbgstr_longlong(*stop), stop_flags); ok(filter->state != State_Running, "Filter should be paused or stopped while seeking.\n"); filter->seek_current = *current; @@ -2093,7 +2086,7 @@ static void test_graph_builder_render(void) IFilterGraph2_AddFilter(graph, &sink2.IBaseFilter_iface, NULL); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink2_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); @@ -2102,7 +2095,7 @@ static void test_graph_builder_render(void) IFilterGraph2_AddFilter(graph, &sink1.IBaseFilter_iface, NULL); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink1_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); @@ -2113,7 +2106,7 @@ static void test_graph_builder_render(void) IFilterGraph2_AddFilter(graph, &parser.IBaseFilter_iface, NULL); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(parser_pins[1].peer == &sink1_pin.IPin_iface, "Got peer %p.\n", parser_pins[1].peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2125,7 +2118,7 @@ static void test_graph_builder_render(void) IFilterGraph2_AddFilter(graph, &sink1.IBaseFilter_iface, NULL); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink1_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); @@ -2138,7 +2131,7 @@ static void test_graph_builder_render(void) parser_pins[1].name[0] = '~'; hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!parser_pins[1].peer, "Got peer %p.\n", parser_pins[1].peer); ok(!sink1_pin.peer, "Got peer %p.\n", sink1_pin.peer); @@ -2148,14 +2141,14 @@ static void test_graph_builder_render(void) parser_pins[1].name[0] = 0; parser_pins[1].id[0] = '~'; hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(parser_pins[1].peer == &sink1_pin.IPin_iface, "Got peer %p.\n", parser_pins[1].peer); IFilterGraph2_Disconnect(graph, source_pin.peer); IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* Test enumeration of filters from the registry. */ @@ -2183,7 +2176,7 @@ static void test_graph_builder_render(void) skip("Not enough permission to register filters.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); graph = create_graph(); IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL); @@ -2192,12 +2185,12 @@ static void test_graph_builder_render(void) IFilterMapper2_RegisterFilter(mapper, &sink2_clsid, L"test", NULL, NULL, NULL, ®filter); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink2_pin.IPin_iface || source_pin.peer == &sink1_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* Preference is given to filters already in the graph. */ @@ -2206,11 +2199,11 @@ static void test_graph_builder_render(void) IFilterGraph2_AddFilter(graph, &sink2.IBaseFilter_iface, NULL); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink2_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* No preference is given to renderer filters. */ @@ -2225,12 +2218,12 @@ static void test_graph_builder_render(void) IFilterMapper2_RegisterFilter(mapper, &sink2_clsid, L"test", NULL, NULL, NULL, ®filter); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink2_pin.IPin_iface || source_pin.peer == &sink1_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* Preference is given to filters with higher merit. */ @@ -2246,11 +2239,11 @@ static void test_graph_builder_render(void) IFilterMapper2_RegisterFilter(mapper, &sink2_clsid, L"test", NULL, NULL, NULL, ®filter); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink2_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); graph = create_graph(); IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL); @@ -2264,11 +2257,11 @@ static void test_graph_builder_render(void) IFilterMapper2_RegisterFilter(mapper, &sink2_clsid, L"test", NULL, NULL, NULL, ®filter); hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink1_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* Test AM_RENDEREX_RENDERTOEXISTINGRENDERERS. */ @@ -2276,16 +2269,16 @@ static void test_graph_builder_render(void) IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL); hr = IFilterGraph2_RenderEx(graph, &source_pin.IPin_iface, AM_RENDEREX_RENDERTOEXISTINGRENDERERS, NULL); - ok(hr == VFW_E_CANNOT_RENDER, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_RENDER, "Got hr %#x.\n", hr); IFilterGraph2_AddFilter(graph, &sink1.IBaseFilter_iface, NULL); hr = IFilterGraph2_RenderEx(graph, &source_pin.IPin_iface, AM_RENDEREX_RENDERTOEXISTINGRENDERERS, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink1_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &sink1_clsid); IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &sink2_clsid); @@ -2294,15 +2287,15 @@ out: CoRevokeClassObject(cookie1); CoRevokeClassObject(cookie2); IFilterMapper2_Release(mapper); - ok(source.ref == 1, "Got outstanding refcount %ld.\n", source.ref); - ok(source_pin.ref == 1, "Got outstanding refcount %ld.\n", source_pin.ref); - ok(sink1.ref == 1, "Got outstanding refcount %ld.\n", sink1.ref); - ok(sink1_pin.ref == 1, "Got outstanding refcount %ld.\n", sink1_pin.ref); - ok(sink2.ref == 1, "Got outstanding refcount %ld.\n", sink2.ref); - ok(sink2_pin.ref == 1, "Got outstanding refcount %ld.\n", sink2_pin.ref); - ok(parser.ref == 1, "Got outstanding refcount %ld.\n", parser.ref); - ok(parser_pins[0].ref == 1, "Got outstanding refcount %ld.\n", parser_pins[0].ref); - ok(parser_pins[1].ref == 1, "Got outstanding refcount %ld.\n", parser_pins[1].ref); + ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); + ok(source_pin.ref == 1, "Got outstanding refcount %d.\n", source_pin.ref); + ok(sink1.ref == 1, "Got outstanding refcount %d.\n", sink1.ref); + ok(sink1_pin.ref == 1, "Got outstanding refcount %d.\n", sink1_pin.ref); + ok(sink2.ref == 1, "Got outstanding refcount %d.\n", sink2.ref); + ok(sink2_pin.ref == 1, "Got outstanding refcount %d.\n", sink2_pin.ref); + ok(parser.ref == 1, "Got outstanding refcount %d.\n", parser.ref); + ok(parser_pins[0].ref == 1, "Got outstanding refcount %d.\n", parser_pins[0].ref); + ok(parser_pins[1].ref == 1, "Got outstanding refcount %d.\n", parser_pins[1].ref); } static void test_graph_builder_connect(void) @@ -2357,7 +2350,7 @@ static void test_graph_builder_connect(void) IFilterGraph2_AddFilter(graph, &sink.IBaseFilter_iface, NULL); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); @@ -2366,7 +2359,7 @@ static void test_graph_builder_connect(void) ++source_pin.Connect_hr) { hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == source_pin.Connect_hr, "Got hr %#lx for Connect() hr %#lx.\n", + ok(hr == source_pin.Connect_hr, "Got hr %#x for Connect() hr %#x.\n", hr, source_pin.Connect_hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2376,7 +2369,7 @@ static void test_graph_builder_connect(void) sink_pin.accept_mt = &sink_type; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); for (source_pin.Connect_hr = 0x80040200; source_pin.Connect_hr <= 0x800402ff; @@ -2385,10 +2378,10 @@ static void test_graph_builder_connect(void) hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); if (source_pin.Connect_hr == VFW_E_NOT_CONNECTED || source_pin.Connect_hr == VFW_E_NO_AUDIO_HARDWARE) - ok(hr == source_pin.Connect_hr, "Got hr %#lx for Connect() hr %#lx.\n", + ok(hr == source_pin.Connect_hr, "Got hr %#x for Connect() hr %#x.\n", hr, source_pin.Connect_hr); else - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx for Connect() hr %#lx.\n", + ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x for Connect() hr %#x.\n", hr, source_pin.Connect_hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); @@ -2399,7 +2392,7 @@ static void test_graph_builder_connect(void) ++source_pin.EnumMediaTypes_hr) { hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == source_pin.EnumMediaTypes_hr, "Got hr %#lx for EnumMediaTypes() hr %#lx.\n", + ok(hr == source_pin.EnumMediaTypes_hr, "Got hr %#x for EnumMediaTypes() hr %#x.\n", hr, source_pin.EnumMediaTypes_hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); @@ -2414,14 +2407,14 @@ static void test_graph_builder_connect(void) sink_pin.accept_mt = NULL; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); sink_pin.accept_mt = &sink_type; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser2_pins[1].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser2_pins[0].IPin_iface, "Got peer %p.\n", sink_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2433,7 +2426,7 @@ static void test_graph_builder_connect(void) ++source_pin.Connect_hr) { hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx for Connect() hr %#lx.\n", hr, source_pin.Connect_hr); + ok(hr == S_OK, "Got hr %#x for Connect() hr %#x.\n", hr, source_pin.Connect_hr); ok(source_pin.peer == &parser2_pins[1].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser2_pins[0].IPin_iface, "Got peer %p.\n", sink_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2447,7 +2440,7 @@ static void test_graph_builder_connect(void) IFilterGraph2_AddFilter(graph, &parser1.IBaseFilter_iface, NULL); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2459,7 +2452,7 @@ static void test_graph_builder_connect(void) IFilterGraph2_AddFilter(graph, &parser3.IBaseFilter_iface, NULL); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser3_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(parser3_pins[1].peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", parser3_pins[1].peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); @@ -2481,7 +2474,8 @@ static void test_graph_builder_connect(void) IFilterGraph2_AddFilter(graph, &sink2.IBaseFilter_iface, NULL); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - todo_wine ok(hr == VFW_S_PARTIAL_RENDER, "Got hr %#lx.\n", hr); +todo_wine + ok(hr == VFW_S_PARTIAL_RENDER, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); ok(!parser1_pins[2].peer, "Got peer %p.\n", parser1_pins[2].peer); @@ -2495,7 +2489,7 @@ static void test_graph_builder_connect(void) parser1_pins[1].QueryInternalConnections_hr = S_OK; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2508,12 +2502,12 @@ static void test_graph_builder_connect(void) parser1_pins[1].name[0] = '~'; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); parser1.pin_count = 3; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[2].IPin_iface, "Got peer %p.\n", sink_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2525,7 +2519,7 @@ static void test_graph_builder_connect(void) parser1_pins[1].name[0] = 0; parser1_pins[1].id[0] = '~'; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); IFilterGraph2_Disconnect(graph, source_pin.peer); @@ -2534,15 +2528,15 @@ static void test_graph_builder_connect(void) IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface); hr = IFilterGraph2_Connect(graph, &parser1_pins[1].IPin_iface, &parser1_pins[0].IPin_iface); - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); parser1_pins[0].QueryInternalConnections_hr = S_OK; hr = IFilterGraph2_Connect(graph, &parser1_pins[1].IPin_iface, &parser1_pins[0].IPin_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); parser1_pins[0].QueryInternalConnections_hr = E_NOTIMPL; ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* The graph connects from source to sink, not from sink to source. */ @@ -2554,7 +2548,7 @@ static void test_graph_builder_connect(void) parser1_pins[0].require_connected_pin = &parser1_pins[1]; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CANNOT_CONNECT, "Got hr %#x.\n", hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); @@ -2562,14 +2556,14 @@ static void test_graph_builder_connect(void) parser1_pins[1].require_connected_pin = &parser1_pins[0]; hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); parser1_pins[1].require_connected_pin = NULL; ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* Test enumeration of filters from the registry. */ @@ -2605,19 +2599,19 @@ static void test_graph_builder_connect(void) skip("Not enough permission to register filters.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IFilterMapper2_RegisterFilter(mapper, &parser2_clsid, L"test", NULL, NULL, NULL, ®filter); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface || source_pin.peer == &parser2_pins[1].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface || sink_pin.peer == &parser2_pins[0].IPin_iface, "Got peer %p.\n", sink_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* Preference is given to filters already in the graph. */ @@ -2627,12 +2621,12 @@ static void test_graph_builder_connect(void) IFilterGraph2_AddFilter(graph, &parser1.IBaseFilter_iface, NULL); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); /* Preference is given to filters with higher merit. */ @@ -2649,12 +2643,12 @@ static void test_graph_builder_connect(void) IFilterMapper2_RegisterFilter(mapper, &parser2_clsid, L"test", NULL, NULL, NULL, ®filter); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser2_pins[1].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser2_pins[0].IPin_iface, "Got peer %p.\n", sink_pin.peer); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); graph = create_graph(); IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL); @@ -2669,7 +2663,7 @@ static void test_graph_builder_connect(void) IFilterMapper2_RegisterFilter(mapper, &parser2_clsid, L"test", NULL, NULL, NULL, ®filter); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &parser1_pins[1].IPin_iface, "Got peer %p.\n", sink_pin.peer); @@ -2681,21 +2675,21 @@ out: CoRevokeClassObject(cookie2); IFilterMapper2_Release(mapper); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(source.ref == 1, "Got outstanding refcount %ld.\n", source.ref); - ok(source_pin.ref == 1, "Got outstanding refcount %ld.\n", source_pin.ref); - ok(sink.ref == 1, "Got outstanding refcount %ld.\n", sink.ref); - ok(sink_pin.ref == 1, "Got outstanding refcount %ld.\n", sink_pin.ref); - ok(parser1.ref == 1, "Got outstanding refcount %ld.\n", parser1.ref); - ok(parser1_pins[0].ref == 1, "Got outstanding refcount %ld.\n", parser1_pins[0].ref); - ok(parser1_pins[1].ref == 1, "Got outstanding refcount %ld.\n", parser1_pins[1].ref); - ok(parser1_pins[2].ref == 1, "Got outstanding refcount %ld.\n", parser1_pins[2].ref); - ok(parser2.ref == 1, "Got outstanding refcount %ld.\n", parser2.ref); - ok(parser2_pins[0].ref == 1, "Got outstanding refcount %ld.\n", parser2_pins[0].ref); - ok(parser2_pins[1].ref == 1, "Got outstanding refcount %ld.\n", parser2_pins[1].ref); - ok(parser3.ref == 1, "Got outstanding refcount %ld.\n", parser3.ref); - ok(parser3_pins[0].ref == 1, "Got outstanding refcount %ld.\n", parser3_pins[0].ref); - ok(parser3_pins[1].ref == 1, "Got outstanding refcount %ld.\n", parser3_pins[1].ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); + ok(source_pin.ref == 1, "Got outstanding refcount %d.\n", source_pin.ref); + ok(sink.ref == 1, "Got outstanding refcount %d.\n", sink.ref); + ok(sink_pin.ref == 1, "Got outstanding refcount %d.\n", sink_pin.ref); + ok(parser1.ref == 1, "Got outstanding refcount %d.\n", parser1.ref); + ok(parser1_pins[0].ref == 1, "Got outstanding refcount %d.\n", parser1_pins[0].ref); + ok(parser1_pins[1].ref == 1, "Got outstanding refcount %d.\n", parser1_pins[1].ref); + ok(parser1_pins[2].ref == 1, "Got outstanding refcount %d.\n", parser1_pins[2].ref); + ok(parser2.ref == 1, "Got outstanding refcount %d.\n", parser2.ref); + ok(parser2_pins[0].ref == 1, "Got outstanding refcount %d.\n", parser2_pins[0].ref); + ok(parser2_pins[1].ref == 1, "Got outstanding refcount %d.\n", parser2_pins[1].ref); + ok(parser3.ref == 1, "Got outstanding refcount %d.\n", parser3.ref); + ok(parser3_pins[0].ref == 1, "Got outstanding refcount %d.\n", parser3_pins[0].ref); + ok(parser3_pins[1].ref == 1, "Got outstanding refcount %d.\n", parser3_pins[1].ref); } static const GUID test_iid = {0x33333333}; @@ -2744,77 +2738,77 @@ static void test_aggregation(void) graph = (IFilterGraph2 *)0xdeadbeef; hr = CoCreateInstance(&CLSID_FilterGraph, &test_outer, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&graph); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!graph, "Got interface %p.\n", graph); hr = CoCreateInstance(&CLSID_FilterGraph, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IFilterGraph2, (void **)&graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IFilterGraph2_QueryInterface(graph, &IID_IFilterGraph2, (void **)&graph2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(graph2 == (IFilterGraph2 *)0xdeadbeef, "Got unexpected IFilterGraph2 %p.\n", graph2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IFilterGraph2_QueryInterface(graph, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IFilterGraph2_Release(graph); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); /* Test the aggregated filter mapper. */ graph = create_graph(); ref = get_refcount(graph); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IFilterGraph2_QueryInterface(graph, &IID_IFilterMapper2, (void **)&mapper); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(graph); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(mapper); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IFilterMapper2_QueryInterface(mapper, &IID_IFilterGraph2, (void **)&graph2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(graph2 == graph, "Got unexpected IFilterGraph2 %p.\n", graph2); IFilterGraph2_Release(graph2); IFilterMapper2_Release(mapper); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got unexpected refcount %ld.\n", ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); } /* Test how methods from "control" interfaces (IBasicAudio, IBasicVideo, @@ -2827,123 +2821,123 @@ static void test_control_delegation(void) IVideoWindow *window; IBasicVideo2 *video; ITypeInfo *typeinfo; - unsigned int count; TYPEATTR *typeattr; + ULONG count; HRESULT hr; LONG val; /* IBasicAudio */ hr = IFilterGraph2_QueryInterface(graph, &IID_IBasicAudio, (void **)&audio); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IBasicAudio_GetTypeInfoCount(audio, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count == 1, "Got count %u.\n", count); hr = IBasicAudio_put_Volume(audio, -10); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); hr = IBasicAudio_get_Volume(audio, &val); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); hr = IBasicAudio_put_Balance(audio, 10); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); hr = IBasicAudio_get_Balance(audio, &val); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); hr = CoCreateInstance(&CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&renderer); if (hr != VFW_E_NO_AUDIO_HARDWARE) { - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IFilterGraph2_AddFilter(graph, renderer, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IBasicAudio_put_Volume(audio, -10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IBasicAudio_get_Volume(audio, &val); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(val == -10, "got %ld\n", val); + ok(hr == S_OK, "got %#x\n", hr); + ok(val == -10, "got %d\n", val); hr = IBasicAudio_put_Balance(audio, 10); - ok(hr == S_OK || hr == VFW_E_MONO_AUDIO_HW, "Got hr %#lx.\n", hr); + ok(hr == S_OK || hr == VFW_E_MONO_AUDIO_HW, "got %#x\n", hr); hr = IBasicAudio_get_Balance(audio, &val); - ok(hr == S_OK || hr == VFW_E_MONO_AUDIO_HW, "Got hr %#lx.\n", hr); + ok(hr == S_OK || hr == VFW_E_MONO_AUDIO_HW, "got %#x\n", hr); if (hr == S_OK) - ok(val == 10, "got balance %ld\n", val); + ok(val == 10, "got balance %d\n", val); hr = IBaseFilter_QueryInterface(renderer, &IID_IBasicAudio, (void **)&filter_audio); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IBasicAudio_get_Volume(filter_audio, &val); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(val == -10, "got volume %ld\n", val); + ok(hr == S_OK, "got %#x\n", hr); + ok(val == -10, "got volume %d\n", val); hr = IFilterGraph2_RemoveFilter(graph, renderer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); IBaseFilter_Release(renderer); IBasicAudio_Release(filter_audio); } hr = IBasicAudio_put_Volume(audio, -10); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); hr = IBasicAudio_get_Volume(audio, &val); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); hr = IBasicAudio_put_Balance(audio, 10); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); hr = IBasicAudio_get_Balance(audio, &val); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "got %#x\n", hr); IBasicAudio_Release(audio); /* IBasicVideo and IVideoWindow */ hr = IFilterGraph2_QueryInterface(graph, &IID_IBasicVideo2, (void **)&video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IVideoWindow, (void **)&window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); /* Unlike IBasicAudio, these return E_NOINTERFACE. */ hr = IBasicVideo2_get_BitRate(video, &val); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "got %#x\n", hr); hr = IBasicVideo2_GetTypeInfoCount(video, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count == 1, "Got count %u.\n", count); hr = IBasicVideo2_GetTypeInfo(video, 0, 0, &typeinfo); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(typeattr->typekind == TKIND_DISPATCH, "Got kind %u.\n", typeattr->typekind); ok(IsEqualGUID(&typeattr->guid, &IID_IBasicVideo), "Got IID %s.\n", wine_dbgstr_guid(&typeattr->guid)); ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); ITypeInfo_Release(typeinfo); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "got %#x\n", hr); hr = IVideoWindow_GetTypeInfoCount(window, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count == 1, "Got count %u.\n", count); hr = CoCreateInstance(&CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&renderer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IFilterGraph2_AddFilter(graph, renderer, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IBasicVideo2_get_BitRate(video, &val); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "got %#x\n", hr); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "got %#x\n", hr); hr = IFilterGraph2_RemoveFilter(graph, renderer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "got %#x\n", hr); hr = IBasicVideo2_get_BitRate(video, &val); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "got %#x\n", hr); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "got %#x\n", hr); IBaseFilter_Release(renderer); IBasicVideo2_Release(video); @@ -2958,52 +2952,51 @@ static void test_add_remove_filter(void) IFilterGraph2 *graph = create_graph(); IBaseFilter *ret_filter; HRESULT hr; - LONG ref; testfilter_init(&filter, NULL, 0); hr = IFilterGraph2_FindFilterByName(graph, L"testid", &ret_filter); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); ok(!ret_filter, "Got filter %p.\n", ret_filter); hr = IFilterGraph2_AddFilter(graph, &filter.IBaseFilter_iface, L"testid"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter.graph == (IFilterGraph *)graph, "Got graph %p.\n", filter.graph); ok(!wcscmp(filter.name, L"testid"), "Got name %s.\n", wine_dbgstr_w(filter.name)); hr = IFilterGraph2_FindFilterByName(graph, L"testid", &ret_filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_filter == &filter.IBaseFilter_iface, "Got filter %p.\n", ret_filter); IBaseFilter_Release(ret_filter); hr = IFilterGraph2_RemoveFilter(graph, &filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!filter.graph, "Got graph %p.\n", filter.graph); ok(!filter.name, "Got name %s.\n", wine_dbgstr_w(filter.name)); ok(!filter.clock, "Got clock %p,\n", filter.clock); - ok(filter.ref == 1, "Got outstanding refcount %ld.\n", filter.ref); + ok(filter.ref == 1, "Got outstanding refcount %d.\n", filter.ref); hr = IFilterGraph2_FindFilterByName(graph, L"testid", &ret_filter); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); ok(!ret_filter, "Got filter %p.\n", ret_filter); hr = IFilterGraph2_AddFilter(graph, &filter.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter.graph == (IFilterGraph *)graph, "Got graph %p.\n", filter.graph); ok(!wcscmp(filter.name, L"0001"), "Got name %s.\n", wine_dbgstr_w(filter.name)); hr = IFilterGraph2_FindFilterByName(graph, L"0001", &ret_filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_filter == &filter.IBaseFilter_iface, "Got filter %p.\n", ret_filter); IBaseFilter_Release(ret_filter); /* test releasing the filter graph while filters are still connected */ - ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + hr = IFilterGraph2_Release(graph); + ok(!hr, "Got outstanding refcount %d.\n", hr); ok(!filter.graph, "Got graph %p.\n", filter.graph); ok(!filter.name, "Got name %s.\n", wine_dbgstr_w(filter.name)); ok(!filter.clock, "Got clock %p.\n", filter.clock); - ok(filter.ref == 1, "Got outstanding refcount %ld.\n", filter.ref); + ok(filter.ref == 1, "Got outstanding refcount %d.\n", filter.ref); } static HRESULT WINAPI test_connect_direct_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt) @@ -3053,7 +3046,6 @@ static void test_connect_direct(void) IMediaControl *control; AM_MEDIA_TYPE mt; HRESULT hr; - ULONG ref; test_connect_direct_init(&source_pin, PINDIR_OUTPUT); testfilter_init(&source, &source_pin, 1); @@ -3067,75 +3059,83 @@ static void test_connect_direct(void) testfilter_init(&parser2, parser2_pins, 2); hr = IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_AddFilter(graph, &sink.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* The filter graph does not prevent connection while it is running; only * individual filters do. */ IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Connect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); /* Swap the pins when connecting. */ hr = IFilterGraph2_ConnectDirect(graph, &sink_pin.IPin_iface, &source_pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer); + ok(hr == S_OK, "Got hr %#x.\n", hr); +todo_wine + ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer); ok(!sink_pin.mt, "Got mt %p.\n", sink_pin.mt); - todo_wine ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); +todo_wine + ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); +todo_wine + ok(hr == S_OK, "Got hr %#x.\n", hr); +todo_wine + ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Connect(graph, &sink_pin.IPin_iface, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer); + ok(hr == S_OK, "Got hr %#x.\n", hr); +todo_wine + ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer); ok(!sink_pin.mt, "Got mt %p.\n", sink_pin.mt); - todo_wine ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); +todo_wine + ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); +todo_wine + ok(hr == S_OK, "Got hr %#x.\n", hr); +todo_wine + ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); /* Disconnect() does not disconnect the peer. */ hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); @@ -3144,146 +3144,146 @@ static void test_connect_direct(void) IPin_AddRef(sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); /* Test specifying the media type. */ hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(source_pin.mt == &mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Test Reconnect[Ex](). */ hr = IFilterGraph2_Reconnect(graph, &source_pin.IPin_iface); - todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IFilterGraph2_Reconnect(graph, &sink_pin.IPin_iface); - todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Reconnect(graph, &source_pin.IPin_iface); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IFilterGraph2_Reconnect(graph, &sink_pin.IPin_iface); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Reconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); sink_pin.peer = &source_pin.IPin_iface; IPin_AddRef(sink_pin.peer); hr = IFilterGraph2_Reconnect(graph, &sink_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ReconnectEx(graph, &source_pin.IPin_iface, NULL); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IFilterGraph2_ReconnectEx(graph, &sink_pin.IPin_iface, NULL); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ReconnectEx(graph, &source_pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!source_pin.mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ReconnectEx(graph, &source_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(source_pin.mt == &mt, "Got mt %p.\n", source_pin.mt); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); hr = IFilterGraph2_Disconnect(graph, &source_pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* ConnectDirect() protects against cyclical connections. */ hr = IFilterGraph2_AddFilter(graph, &parser1.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_AddFilter(graph, &parser2.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &parser1_pins[1].IPin_iface, &parser1_pins[0].IPin_iface, NULL); - ok(hr == VFW_E_CIRCULAR_GRAPH, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_CIRCULAR_GRAPH, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &parser1_pins[1].IPin_iface, &parser2_pins[0].IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &parser2_pins[1].IPin_iface, &parser1_pins[0].IPin_iface, NULL); - todo_wine ok(hr == VFW_E_CIRCULAR_GRAPH, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_CIRCULAR_GRAPH, "Got hr %#x.\n", hr); IFilterGraph2_Disconnect(graph, &parser1_pins[1].IPin_iface); IFilterGraph2_Disconnect(graph, &parser2_pins[0].IPin_iface); parser1_pins[0].QueryInternalConnections_hr = S_OK; hr = IFilterGraph2_ConnectDirect(graph, &parser1_pins[1].IPin_iface, &parser1_pins[0].IPin_iface, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!parser1_pins[0].peer, "Got peer %p.\n", parser1_pins[0].peer); todo_wine ok(parser1_pins[1].peer == &parser1_pins[0].IPin_iface, "Got peer %p.\n", parser1_pins[1].peer); IFilterGraph2_Disconnect(graph, &parser1_pins[0].IPin_iface); IFilterGraph2_Disconnect(graph, &parser1_pins[1].IPin_iface); hr = IFilterGraph2_ConnectDirect(graph, &parser1_pins[1].IPin_iface, &parser2_pins[0].IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &parser2_pins[1].IPin_iface, &parser1_pins[0].IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IFilterGraph2_Disconnect(graph, &parser1_pins[1].IPin_iface); IFilterGraph2_Disconnect(graph, &parser2_pins[0].IPin_iface); hr = IFilterGraph2_RemoveFilter(graph, &parser1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_RemoveFilter(graph, &parser2.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Both pins are disconnected when a filter is removed. */ hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); sink_pin.peer = &source_pin.IPin_iface; IPin_AddRef(sink_pin.peer); hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); /* If the filter cannot be disconnected, then RemoveFilter() fails. */ hr = IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink_pin.IPin_iface, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); sink_pin.peer = &source_pin.IPin_iface; IPin_AddRef(sink_pin.peer); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); source_pin.require_stopped_disconnect = TRUE; hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); @@ -3292,19 +3292,20 @@ static void test_connect_direct(void) source_pin.require_stopped_disconnect = FALSE; sink_pin.require_stopped_disconnect = TRUE; hr = IFilterGraph2_RemoveFilter(graph, &source.IBaseFilter_iface); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); ok(source_pin.peer == &sink_pin.IPin_iface, "Got peer %p.\n", source_pin.peer); ok(sink_pin.peer == &source_pin.IPin_iface, "Got peer %p.\n", sink_pin.peer); /* Filters are stopped, and pins disconnected, when the graph is destroyed. */ IMediaControl_Release(control); - ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(source.ref == 1, "Got outstanding refcount %ld.\n", source.ref); - ok(sink.ref == 1, "Got outstanding refcount %ld.\n", sink.ref); - ok(source_pin.ref == 1, "Got outstanding refcount %ld.\n", source_pin.ref); - todo_wine ok(sink_pin.ref == 1, "Got outstanding refcount %ld.\n", sink_pin.ref); + hr = IFilterGraph2_Release(graph); + ok(!hr, "Got outstanding refcount %d.\n", hr); + ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); + ok(sink.ref == 1, "Got outstanding refcount %d.\n", sink.ref); + ok(source_pin.ref == 1, "Got outstanding refcount %d.\n", source_pin.ref); +todo_wine + ok(sink_pin.ref == 1, "Got outstanding refcount %d.\n", sink_pin.ref); ok(!source_pin.peer, "Got peer %p.\n", source_pin.peer); ok(!sink_pin.peer, "Got peer %p.\n", sink_pin.peer); } @@ -3334,30 +3335,31 @@ static void test_sync_source(void) &IID_IReferenceClock, (void **)&systemclock); hr = IMediaFilter_SetSyncSource(filter, systemclock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter1.clock == systemclock, "Got clock %p.\n", filter1.clock); ok(filter2.clock == systemclock, "Got clock %p.\n", filter2.clock); hr = IMediaFilter_GetSyncSource(filter, &clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(clock == systemclock, "Got clock %p.\n", clock); IReferenceClock_Release(clock); hr = IMediaFilter_SetSyncSource(filter, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!filter1.clock, "Got clock %p.\n", filter1.clock); ok(!filter2.clock, "Got clock %p.\n", filter2.clock); hr = IMediaFilter_GetSyncSource(filter, &clock); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); +todo_wine + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(!clock, "Got clock %p.\n", clock); IReferenceClock_Release(systemclock); IMediaFilter_Release(filter); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld\n", ref); - ok(filter1.ref == 1, "Got outstanding refcount %ld.\n", filter1.ref); - ok(filter2.ref == 1, "Got outstanding refcount %ld.\n", filter2.ref); + ok(!ref, "Got outstanding refcount %d\n", ref); + ok(filter1.ref == 1, "Got outstanding refcount %d.\n", filter1.ref); + ok(filter2.ref == 1, "Got outstanding refcount %d.\n", filter2.ref); } #define check_filter_state(a, b) check_filter_state_(__LINE__, a, b) @@ -3373,13 +3375,13 @@ static void check_filter_state_(unsigned int line, IFilterGraph2 *graph, FILTER_ IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&mediafilter); hr = IMediaFilter_GetState(mediafilter, 1000, &state); - ok_(__FILE__, line)(hr == S_OK, "IMediaFilter_GetState() returned %#lx.\n", hr); + ok_(__FILE__, line)(hr == S_OK, "IMediaFilter_GetState() returned %#x.\n", hr); ok_(__FILE__, line)(state == expect, "Expected state %u, got %u.\n", expect, state); IMediaFilter_Release(mediafilter); IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); hr = IMediaControl_GetState(control, 1000, &oastate); - ok_(__FILE__, line)(hr == S_OK, "IMediaControl_GetState() returned %#lx.\n", hr); + ok_(__FILE__, line)(hr == S_OK, "IMediaControl_GetState() returned %#x.\n", hr); ok_(__FILE__, line)(state == expect, "Expected state %u, got %u.\n", expect, state); IMediaControl_Release(control); @@ -3387,7 +3389,7 @@ static void check_filter_state_(unsigned int line, IFilterGraph2 *graph, FILTER_ while (IEnumFilters_Next(filterenum, 1, &filter, NULL) == S_OK) { hr = IBaseFilter_GetState(filter, 1000, &state); - ok_(__FILE__, line)(hr == S_OK, "IBaseFilter_GetState() returned %#lx.\n", hr); + ok_(__FILE__, line)(hr == S_OK, "IBaseFilter_GetState() returned %#x.\n", hr); ok_(__FILE__, line)(state == expect, "Expected state %u, got %u.\n", expect, state); IBaseFilter_Release(filter); } @@ -3431,21 +3433,21 @@ static void test_filter_state(void) check_filter_state(graph, State_Stopped); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); /* Pausing sets the default sync source, if it's not already set. */ hr = IMediaFilter_GetSyncSource(filter, &clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!!clock, "Reference clock not set.\n"); ok(source.clock == clock, "Expected %p, got %p.\n", clock, source.clock); ok(sink.clock == clock, "Expected %p, got %p.\n", clock, sink.clock); hr = IReferenceClock_GetTime(clock, &start_time); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(source.start_time >= start_time && source.start_time < start_time + 500 * 10000, @@ -3455,84 +3457,84 @@ static void test_filter_state(void) wine_dbgstr_longlong(source.start_time), wine_dbgstr_longlong(sink.start_time)); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); sink.state = State_Stopped; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); sink.state = State_Running; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); sink.state = State_Paused; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); sink.state = State_Stopped; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); sink.state = State_Paused; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); sink.state = State_Running; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); sink.state = State_Running; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); sink.state = State_Paused; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); sink.state = State_Stopped; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); hr = IMediaControl_StopWhenReady(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); hr = IMediaControl_StopWhenReady(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); hr = IMediaControl_StopWhenReady(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); IReferenceClock_Release(clock); @@ -3555,44 +3557,44 @@ static void test_filter_state(void) IPin_Connect(&source_pin.IPin_iface, &sink_pin.IPin_iface, NULL); hr = IMediaFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); hr = IMediaFilter_GetSyncSource(filter, &clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!!clock, "Reference clock not set.\n"); ok(source.clock == clock, "Expected %p, got %p.\n", clock, source.clock); ok(sink.clock == clock, "Expected %p, got %p.\n", clock, sink.clock); hr = IMediaFilter_Run(filter, 0xdeadbeef); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); ok(source.start_time == 0xdeadbeef, "Got time %s.\n", wine_dbgstr_longlong(source.start_time)); ok(sink.start_time == 0xdeadbeef, "Got time %s.\n", wine_dbgstr_longlong(sink.start_time)); hr = IMediaFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); hr = IMediaFilter_Run(filter, 0xdeadf00d); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); ok(source.start_time == 0xdeadf00d, "Got time %s.\n", wine_dbgstr_longlong(source.start_time)); ok(sink.start_time == 0xdeadf00d, "Got time %s.\n", wine_dbgstr_longlong(sink.start_time)); hr = IMediaFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); hr = IMediaFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); source.expect_run_prev = sink.expect_run_prev = State_Stopped; hr = IReferenceClock_GetTime(clock, &start_time); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); hr = IMediaFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(source.start_time >= start_time && source.start_time < start_time + 500 * 10000, @@ -3603,12 +3605,12 @@ static void test_filter_state(void) Sleep(600); hr = IMediaFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); source.expect_run_prev = sink.expect_run_prev = State_Paused; hr = IMediaFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(source.start_time >= start_time && source.start_time < start_time + 500 * 10000, @@ -3618,13 +3620,13 @@ static void test_filter_state(void) wine_dbgstr_longlong(source.start_time), wine_dbgstr_longlong(sink.start_time)); hr = IMediaFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); Sleep(600); start_time += 550 * 10000; hr = IMediaFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(source.start_time >= start_time && source.start_time < start_time + 500 * 10000, @@ -3634,7 +3636,7 @@ static void test_filter_state(void) wine_dbgstr_longlong(source.start_time), wine_dbgstr_longlong(sink.start_time)); hr = IMediaFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); /* Test removing the sync source. */ @@ -3643,15 +3645,16 @@ static void test_filter_state(void) IMediaFilter_SetSyncSource(filter, NULL); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); - todo_wine ok(source.start_time > 0 && source.start_time < 500 * 10000, - "Got time %s.\n", wine_dbgstr_longlong(source.start_time)); +todo_wine + ok(source.start_time > 0 && source.start_time < 500 * 10000, + "Got time %s.\n", wine_dbgstr_longlong(source.start_time)); ok(sink.start_time == source.start_time, "Expected time %s, got %s.\n", wine_dbgstr_longlong(source.start_time), wine_dbgstr_longlong(sink.start_time)); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); /* Test asynchronous state change. */ @@ -3659,30 +3662,30 @@ static void test_filter_state(void) sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); sink.state_hr = sink.GetState_hr = S_OK; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_Stop(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); sink.state_hr = sink.GetState_hr = S_OK; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); /* Renderers are expected to block completing a state change into paused * until they receive a sample. Because the graph can transition from @@ -3698,11 +3701,11 @@ static void test_filter_state(void) sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); ok(sink.state == State_Paused, "Got state %u.\n", sink.state); ok(source.state == State_Paused, "Got state %u.\n", source.state); @@ -3711,14 +3714,14 @@ static void test_filter_state(void) time = 0; hr = IMediaSeeking_SetPositions(seeking, &time, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); ok(sink.state == State_Paused, "Got state %u.\n", sink.state); ok(source.state == State_Paused, "Got state %u.\n", source.state); @@ -3726,13 +3729,13 @@ static void test_filter_state(void) while ((hr = IMediaControl_GetState(control, INFINITE, &state)) == VFW_S_STATE_INTERMEDIATE) { - ok(state == State_Running, "Got state %lu.\n", state); + ok(state == State_Running, "Got state %u.\n", state); ok(sink.state == State_Paused, "Got state %u.\n", sink.state); ok(source.state == State_Paused, "Got state %u.\n", source.state); Sleep(10); } - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); ok(sink.state == State_Running, "Got state %u.\n", sink.state); ok(source.state == State_Running, "Got state %u.\n", source.state); @@ -3744,21 +3747,21 @@ static void test_filter_state(void) sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_Stop(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(sink.state == State_Stopped, "Got state %u.\n", sink.state); ok(source.state == State_Stopped, "Got state %u.\n", source.state); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); sink.state_hr = sink.GetState_hr = S_OK; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); /* Try an asynchronous stopped->paused->running transition, but pause or * stop the graph before our filter is completely paused. */ @@ -3766,35 +3769,35 @@ static void test_filter_state(void) sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); sink.state_hr = sink.GetState_hr = S_OK; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); ok(sink.state == State_Paused, "Got state %u.\n", sink.state); ok(source.state == State_Paused, "Got state %u.\n", source.state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(sink.state == State_Stopped, "Got state %u.\n", sink.state); ok(source.state == State_Stopped, "Got state %u.\n", source.state); sink.state_hr = sink.GetState_hr = S_OK; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Stopped, "Got state %lu.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Stopped, "Got state %u.\n", state); ok(sink.state == State_Stopped, "Got state %u.\n", sink.state); ok(source.state == State_Stopped, "Got state %u.\n", source.state); @@ -3803,13 +3806,13 @@ static void test_filter_state(void) sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IMediaFilter_Release(filter); IMediaControl_Release(control); IMediaSeeking_Release(seeking); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); graph = create_graph(); IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&filter); @@ -3825,23 +3828,23 @@ static void test_filter_state(void) sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaFilter_Run(filter, 0); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaFilter_GetState(filter, 0, &mf_state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); ok(mf_state == State_Running, "Got state %u.\n", mf_state); ok(sink.state == State_Running, "Got state %u.\n", sink.state); ok(source.state == State_Running, "Got state %u.\n", source.state); sink.state_hr = sink.GetState_hr = S_OK; hr = IMediaFilter_GetState(filter, 0, &mf_state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(mf_state == State_Running, "Got state %u.\n", mf_state); ok(sink.state == State_Running, "Got state %u.\n", sink.state); ok(source.state == State_Running, "Got state %u.\n", source.state); hr = IMediaFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(sink.state == State_Stopped, "Got state %u.\n", sink.state); ok(source.state == State_Stopped, "Got state %u.\n", source.state); @@ -3851,79 +3854,79 @@ static void test_filter_state(void) sink.GetState_hr = VFW_S_CANT_CUE; hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; source.GetState_hr = VFW_S_CANT_CUE; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); sink.GetState_hr = VFW_S_CANT_CUE; source.GetState_hr = VFW_S_STATE_INTERMEDIATE; hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %lu.\n", state); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %u.\n", state); sink.GetState_hr = source.GetState_hr = S_OK; hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); sink.state_hr = S_FALSE; sink.GetState_hr = VFW_S_STATE_INTERMEDIATE; source.GetState_hr = VFW_S_CANT_CUE; hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(sink.state == State_Running, "Got state %u.\n", sink.state); ok(source.state == State_Running, "Got state %u.\n", source.state); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_CANT_CUE, "Got hr %#lx.\n", hr); - ok(state == State_Running, "Got state %lu.\n", state); + ok(hr == VFW_S_CANT_CUE, "Got hr %#x.\n", hr); + ok(state == State_Running, "Got state %u.\n", state); ok(sink.state == State_Running, "Got state %u.\n", sink.state); ok(source.state == State_Running, "Got state %u.\n", source.state); sink.state_hr = sink.GetState_hr = source.GetState_hr = S_OK; hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Add and remove a filter while the graph is running. */ hr = IFilterGraph2_AddFilter(graph, &dummy.IBaseFilter_iface, L"dummy"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dummy.state == State_Stopped, "Got state %#x.\n", dummy.state); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Paused); ok(dummy.state == State_Paused, "Got state %#x.\n", dummy.state); hr = IFilterGraph2_RemoveFilter(graph, &dummy.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dummy.state == State_Paused, "Got state %#x.\n", dummy.state); hr = IFilterGraph2_AddFilter(graph, &dummy.IBaseFilter_iface, L"dummy"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dummy.state == State_Paused, "Got state %#x.\n", dummy.state); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Stopped); hr = IFilterGraph2_RemoveFilter(graph, &dummy.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dummy.state == State_Stopped, "Got state %#x.\n", dummy.state); /* Destroying the graph while it's running stops all filters. */ hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_filter_state(graph, State_Running); source.expect_stop_prev = sink.expect_stop_prev = State_Running; @@ -3931,11 +3934,11 @@ static void test_filter_state(void) IMediaControl_Release(control); IMediaSeeking_Release(seeking); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(source.ref == 1, "Got outstanding refcount %ld.\n", source.ref); - ok(sink.ref == 1, "Got outstanding refcount %ld.\n", sink.ref); - ok(source_pin.ref == 1, "Got outstanding refcount %ld.\n", source_pin.ref); - ok(sink_pin.ref == 1, "Got outstanding refcount %ld.\n", sink_pin.ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); + ok(sink.ref == 1, "Got outstanding refcount %d.\n", sink.ref); + ok(source_pin.ref == 1, "Got outstanding refcount %d.\n", source_pin.ref); + ok(sink_pin.ref == 1, "Got outstanding refcount %d.\n", sink_pin.ref); ok(source.state == State_Stopped, "Got state %u.\n", source.state); ok(sink.state == State_Stopped, "Got state %u.\n", sink.state); } @@ -3958,22 +3961,22 @@ static HRESULT check_ec_complete(IFilterGraph2 *graph, IBaseFilter *filter) IMediaControl_Run(control); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 0); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret_hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 0); if (ret_hr == S_OK) { - ok(code == EC_COMPLETE, "Got code %#lx.\n", code); - ok(param1 == S_OK, "Got param1 %#Ix.\n", param1); - ok(!param2, "Got param2 %#Ix.\n", param2); + ok(code == EC_COMPLETE, "Got code %#x.\n", code); + ok(param1 == S_OK, "Got param1 %#lx.\n", param1); + ok(!param2, "Got param2 %#lx.\n", param2); hr = IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 0); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); } IMediaControl_Stop(control); @@ -3994,8 +3997,8 @@ static void test_ec_complete(void) LONG_PTR param1, param2; IMediaControl *control; IMediaEvent *eventsrc; - LONG code, ref; HRESULT hr; + LONG code; testsink_init(&filter1_pin); testsink_init(&filter2_pin); @@ -4028,33 +4031,33 @@ static void test_ec_complete(void) ok(code != EC_COMPLETE, "Got unexpected EC_COMPLETE.\n"); IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter2.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(code == EC_COMPLETE, "Got code %#lx.\n", code); - ok(param1 == S_OK, "Got param1 %#Ix.\n", param1); - ok(!param2, "Got param2 %#Ix.\n", param2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(code == EC_COMPLETE, "Got code %#x.\n", code); + ok(param1 == S_OK, "Got param1 %#lx.\n", param1); + ok(!param2, "Got param2 %#lx.\n", param2); hr = IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter3.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); IMediaControl_Stop(control); @@ -4063,42 +4066,42 @@ static void test_ec_complete(void) IMediaControl_Run(control); hr = IMediaEvent_CancelDefaultHandling(eventsrc, EC_COMPLETE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(code == EC_COMPLETE, "Got code %#lx.\n", code); - ok(param1 == S_OK, "Got param1 %#Ix.\n", param1); - ok(param2 == (LONG_PTR)&filter1.IBaseFilter_iface, "Got param2 %#Ix.\n", param2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(code == EC_COMPLETE, "Got code %#x.\n", code); + ok(param1 == S_OK, "Got param1 %#lx.\n", param1); + ok(param2 == (LONG_PTR)&filter1.IBaseFilter_iface, "Got param2 %#lx.\n", param2); hr = IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter3.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(code == EC_COMPLETE, "Got code %#lx.\n", code); - ok(param1 == S_OK, "Got param1 %#Ix.\n", param1); - ok(param2 == (LONG_PTR)&filter3.IBaseFilter_iface, "Got param2 %#Ix.\n", param2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(code == EC_COMPLETE, "Got code %#x.\n", code); + ok(param1 == S_OK, "Got param1 %#lx.\n", param1); + ok(param2 == (LONG_PTR)&filter3.IBaseFilter_iface, "Got param2 %#lx.\n", param2); hr = IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); IMediaControl_Stop(control); hr = IMediaEvent_RestoreDefaultHandling(eventsrc, EC_COMPLETE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* A filter counts as a renderer if it (1) exposes IAMFilterMiscFlags and * reports itself as a renderer, or (2) exposes IMediaSeeking or @@ -4112,7 +4115,7 @@ static void test_ec_complete(void) IFilterGraph2_AddFilter(graph, &filter1.IBaseFilter_iface, NULL); hr = check_ec_complete(graph, &filter1.IBaseFilter_iface); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); IFilterGraph2_RemoveFilter(graph, &filter1.IBaseFilter_iface); filter1_pin.dir = PINDIR_INPUT; @@ -4121,37 +4124,37 @@ static void test_ec_complete(void) IFilterGraph2_AddFilter(graph, &filter1.IBaseFilter_iface, NULL); hr = check_ec_complete(graph, &filter1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); + ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); IFilterGraph2_RemoveFilter(graph, &filter1.IBaseFilter_iface); - ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); + ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); filter1_pin.dir = PINDIR_OUTPUT; IFilterGraph2_AddFilter(graph, &filter1.IBaseFilter_iface, NULL); hr = check_ec_complete(graph, &filter1.IBaseFilter_iface); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); - ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); + ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); IFilterGraph2_RemoveFilter(graph, &filter1.IBaseFilter_iface); - ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); + ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); filter1_pin.dir = PINDIR_INPUT; filter1.support_media_time = FALSE; IFilterGraph2_AddFilter(graph, &filter1.IBaseFilter_iface, NULL); hr = check_ec_complete(graph, &filter1.IBaseFilter_iface); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); - ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); + ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); IFilterGraph2_RemoveFilter(graph, &filter1.IBaseFilter_iface); filter1.IMediaPosition_iface.lpVtbl = &testpos_vtbl; IFilterGraph2_AddFilter(graph, &filter1.IBaseFilter_iface, NULL); hr = check_ec_complete(graph, &filter1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IFilterGraph2_RemoveFilter(graph, &filter1.IBaseFilter_iface); @@ -4163,7 +4166,7 @@ static void test_ec_complete(void) IFilterGraph2_AddFilter(graph, &filter1.IBaseFilter_iface, NULL); hr = check_ec_complete(graph, &filter1.IBaseFilter_iface); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); IFilterGraph2_RemoveFilter(graph, &filter1.IBaseFilter_iface); @@ -4171,16 +4174,16 @@ static void test_ec_complete(void) IFilterGraph2_AddFilter(graph, &filter1.IBaseFilter_iface, NULL); hr = check_ec_complete(graph, &filter1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaControl_Release(control); IMediaEvent_Release(eventsrc); IMediaEventSink_Release(eventsink); - ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(filter1.ref == 1, "Got outstanding refcount %ld.\n", filter1.ref); - ok(filter2.ref == 1, "Got outstanding refcount %ld.\n", filter2.ref); - ok(filter3.ref == 1, "Got outstanding refcount %ld.\n", filter3.ref); + hr = IFilterGraph2_Release(graph); + ok(!hr, "Got outstanding refcount %d.\n", hr); + ok(filter1.ref == 1, "Got outstanding refcount %d.\n", filter1.ref); + ok(filter2.ref == 1, "Got outstanding refcount %d.\n", filter2.ref); + ok(filter3.ref == 1, "Got outstanding refcount %d.\n", filter3.ref); } static void test_renderfile_failure(void) @@ -4202,28 +4205,28 @@ static void test_renderfile_failure(void) graph = create_graph(); testfilter_init(&testfilter, NULL, 0); hr = IFilterGraph2_AddFilter(graph, &testfilter.IBaseFilter_iface, L"dummy"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); filename = create_file(L"test.nonsense", bogus_data, sizeof(bogus_data)); hr = IFilterGraph2_RenderFile(graph, filename, NULL); - todo_wine ok(hr == VFW_E_UNSUPPORTED_STREAM, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_UNSUPPORTED_STREAM, "Got hr %#x.\n", hr); hr = IFilterGraph2_EnumFilters(graph, &filterenum); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumFilters_Next(filterenum, 1, &filter, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter == &testfilter.IBaseFilter_iface, "Got unexpected filter %p.\n", filter); hr = IEnumFilters_Next(filterenum, 1, &filter, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumFilters_Release(filterenum); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); + ok(ret, "Failed to delete %s, error %u.\n", debugstr_w(filename), GetLastError()); } /* Remove and re-add the filter, to flush the graph's internal @@ -4284,156 +4287,156 @@ static void test_graph_seeking(void) IFilterGraph2_QueryInterface(graph, &IID_IMediaEventSink, (void **)&eventsink); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(!caps, "Got caps %#lx.\n", caps); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(!caps, "Got caps %#x.\n", caps); caps = 0; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanSeekAbsolute; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - todo_wine ok(!caps, "Got caps %#lx.\n", caps); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); + todo_wine ok(!caps, "Got caps %#x.\n", caps); hr = IMediaSeeking_IsFormatSupported(seeking, NULL); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(all_formats); ++i) { hr = IMediaSeeking_IsFormatSupported(seeking, all_formats[i]); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx for format %s.\n", hr, wine_dbgstr_guid(all_formats[i])); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x for format %s.\n", hr, wine_dbgstr_guid(all_formats[i])); } hr = IMediaSeeking_QueryPreferredFormat(seeking, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_GetTimeFormat(seeking, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_NONE); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_NONE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_NONE); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(unsupported_formats); ++i) { hr = IMediaSeeking_SetTimeFormat(seeking, unsupported_formats[i]); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx for format %s.\n", hr, wine_dbgstr_guid(unsupported_formats[i])); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x for format %s.\n", hr, wine_dbgstr_guid(unsupported_formats[i])); } time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 0x123456789a, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 0x123456789a, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_NONE, 0x123456789a, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_NONE, 0x123456789a, NULL); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, &TIME_FORMAT_NONE); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 0x123456789a, &TIME_FORMAT_NONE); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_NONE, 0x123456789a, &TIME_FORMAT_NONE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &testguid, 0x123456789a, &testguid); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_GetDuration(seeking, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetStopPosition(seeking, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetPositions(seeking, ¤t, 0, &stop, 0); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPositions(seeking, NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPositions(seeking, NULL, &stop); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_GetCurrentPosition(seeking, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); current = 0xdeadbeef; hr = IMediaSeeking_GetCurrentPosition(seeking, ¤t); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_GetAvailable(seeking, &earliest, &latest); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetRate(seeking, 1.0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetRate(seeking, 2.0); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(rate == 1.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_GetPreroll(seeking, &time); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); /* Try with filters added. Note that a filter need only expose * IMediaSeeking—no other heuristics are used to determine if it is a @@ -4445,10 +4448,10 @@ static void test_graph_seeking(void) filter1.support_testguid = TRUE; hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &testguid); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IFilterGraph2_RemoveFilter(graph, &filter1.IBaseFilter_iface); filter1.support_media_time = TRUE; @@ -4462,91 +4465,91 @@ static void test_graph_seeking(void) filter1.seek_caps = AM_SEEKING_CanDoSegments | AM_SEEKING_CanGetCurrentPos; filter2.seek_caps = AM_SEEKING_CanDoSegments | AM_SEEKING_CanGetDuration; hr = IMediaSeeking_GetCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#lx.\n", caps); - ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); - ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter2.seeking_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#x.\n", caps); + ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); + ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter2.seeking_ref); flush_cached_seeking(graph, &filter1); flush_cached_seeking(graph, &filter2); caps = AM_SEEKING_CanDoSegments | AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#lx.\n", caps); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanDoSegments; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#lx.\n", caps); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); flush_cached_seeking(graph, &filter1); flush_cached_seeking(graph, &filter2); hr = IMediaSeeking_IsFormatSupported(seeking, &testguid); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); filter1.support_testguid = TRUE; hr = IMediaSeeking_IsFormatSupported(seeking, &testguid); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); filter1.support_testguid = FALSE; filter2.support_testguid = TRUE; hr = IMediaSeeking_IsFormatSupported(seeking, &testguid); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); /* Filters are not consulted about preferred formats. */ hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); filter2.support_testguid = FALSE; hr = IMediaSeeking_SetTimeFormat(seeking, &testguid); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); filter1.support_testguid = TRUE; hr = IMediaSeeking_SetTimeFormat(seeking, &testguid); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&filter1.time_format, &testguid), "Got format %s.\n", debugstr_guid(&filter1.time_format)); ok(IsEqualGUID(&filter2.time_format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", debugstr_guid(&filter2.time_format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &testguid), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &testguid); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#lx.\n", caps); - ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); - ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter2.seeking_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#x.\n", caps); + ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); + ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter2.seeking_ref); filter2.support_testguid = TRUE; hr = IMediaSeeking_SetTimeFormat(seeking, &testguid); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&filter1.time_format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", debugstr_guid(&filter1.time_format)); todo_wine ok(IsEqualGUID(&filter2.time_format, &testguid), @@ -4556,43 +4559,43 @@ static void test_graph_seeking(void) flush_cached_seeking(graph, &filter1); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == (AM_SEEKING_CanDoSegments | AM_SEEKING_CanGetDuration), "Got caps %#lx.\n", caps); - ok(!filter1.seeking_ref, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); - ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter2.seeking_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == (AM_SEEKING_CanDoSegments | AM_SEEKING_CanGetDuration), "Got caps %#x.\n", caps); + ok(!filter1.seeking_ref, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); + ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter2.seeking_ref); filter1.support_media_time = TRUE; filter1.support_testguid = FALSE; flush_cached_seeking(graph, &filter1); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#lx.\n", caps); - ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); - ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter2.seeking_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanDoSegments, "Got caps %#x.\n", caps); + ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); + ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter2.seeking_ref); ok(IsEqualGUID(&filter1.time_format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", debugstr_guid(&filter1.time_format)); todo_wine ok(IsEqualGUID(&filter2.time_format, &testguid), "Got format %s.\n", debugstr_guid(&filter2.time_format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &testguid), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_NONE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &testguid, 0x123456789a, &testguid); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &testguid, 0x123456789a, &TIME_FORMAT_NONE); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); flush_cached_seeking(graph, &filter1); flush_cached_seeking(graph, &filter2); @@ -4600,33 +4603,33 @@ static void test_graph_seeking(void) filter1.seek_duration = 0x12345; filter2.seek_duration = 0x23456; hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x23456, "Got time %s.\n", wine_dbgstr_longlong(time)); filter2.seek_duration = 0x12345; filter1.seek_duration = 0x23456; hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x23456, "Got time %s.\n", wine_dbgstr_longlong(time)); filter1.seek_hr = filter2.seek_hr = 0xbeef; hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x23456, "Got time %s.\n", wine_dbgstr_longlong(time)); filter1.seek_hr = E_NOTIMPL; filter2.seek_hr = S_OK; hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x12345, "Got time %s.\n", wine_dbgstr_longlong(time)); filter1.seek_hr = 0xdeadbeef; hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == 0xdeadbeef, "Got hr %#lx.\n", hr); + ok(hr == 0xdeadbeef, "Got hr %#x.\n", hr); filter1.seek_hr = filter2.seek_hr = E_NOTIMPL; hr = IMediaSeeking_GetDuration(seeking, &time); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); filter1.seek_hr = filter2.seek_hr = S_OK; flush_cached_seeking(graph, &filter1); @@ -4635,40 +4638,40 @@ static void test_graph_seeking(void) filter1.seek_stop = 0x54321; filter2.seek_stop = 0x65432; hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x65432, "Got time %s.\n", wine_dbgstr_longlong(time)); filter2.seek_stop = 0x54321; filter1.seek_stop = 0x65432; hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x65432, "Got time %s.\n", wine_dbgstr_longlong(time)); filter1.seek_hr = filter2.seek_hr = 0xbeef; hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x65432, "Got time %s.\n", wine_dbgstr_longlong(time)); filter1.seek_hr = E_NOTIMPL; filter2.seek_hr = S_OK; hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x54321, "Got time %s.\n", wine_dbgstr_longlong(time)); filter1.seek_hr = 0xdeadbeef; hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == 0xdeadbeef, "Got hr %#lx.\n", hr); + ok(hr == 0xdeadbeef, "Got hr %#x.\n", hr); filter1.seek_hr = filter2.seek_hr = E_NOTIMPL; hr = IMediaSeeking_GetStopPosition(seeking, &time); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); filter1.seek_hr = filter2.seek_hr = S_OK; flush_cached_seeking(graph, &filter1); flush_cached_seeking(graph, &filter2); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!time, "Got time %s.\n", wine_dbgstr_longlong(time)); flush_cached_seeking(graph, &filter1); @@ -4676,7 +4679,7 @@ static void test_graph_seeking(void) current = stop = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 0x65432, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -4687,7 +4690,7 @@ static void test_graph_seeking(void) stop = 0x321; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 0x123, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 0x321, "Got time %s.\n", wine_dbgstr_longlong(stop)); ok(filter1.seek_current == 0x123, "Got time %s.\n", wine_dbgstr_longlong(filter1.seek_current)); @@ -4698,32 +4701,32 @@ static void test_graph_seeking(void) filter1.seek_hr = filter2.seek_hr = 0xbeef; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); filter1.seek_hr = E_NOTIMPL; filter2.seek_hr = S_OK; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); filter1.seek_hr = 0xdeadbeef; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == 0xdeadbeef, "Got hr %#lx.\n", hr); + ok(hr == 0xdeadbeef, "Got hr %#x.\n", hr); filter1.seek_hr = filter2.seek_hr = E_NOTIMPL; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); filter1.seek_hr = filter2.seek_hr = S_OK; hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 12340000, "Got time %s.\n", wine_dbgstr_longlong(time)); current = stop = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 12340000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 0x321, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -4731,7 +4734,7 @@ static void test_graph_seeking(void) stop = 0x321; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 12340000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 0x321, "Got time %s.\n", wine_dbgstr_longlong(stop)); ok(filter1.seek_current == 12340000, "Got time %s.\n", wine_dbgstr_longlong(filter1.seek_current)); @@ -4743,7 +4746,7 @@ static void test_graph_seeking(void) stop = 0x321; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 0x123, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 43210000, "Got time %s.\n", wine_dbgstr_longlong(stop)); ok(filter1.seek_current == 0x123, "Got time %s.\n", wine_dbgstr_longlong(filter1.seek_current)); @@ -4755,17 +4758,17 @@ static void test_graph_seeking(void) flush_cached_seeking(graph, &filter2); hr = IMediaSeeking_SetRate(seeking, 2.0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(filter1.seek_rate == 2.0, "Got rate %.16e.\n", filter1.seek_rate); todo_wine ok(filter2.seek_rate == 2.0, "Got rate %.16e.\n", filter2.seek_rate); hr = IMediaSeeking_SetRate(seeking, 1.0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(filter1.seek_rate == 1.0, "Got rate %.16e.\n", filter1.seek_rate); todo_wine ok(filter2.seek_rate == 1.0, "Got rate %.16e.\n", filter2.seek_rate); hr = IMediaSeeking_SetRate(seeking, -1.0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(filter1.seek_rate == -1.0, "Got rate %.16e.\n", filter1.seek_rate); todo_wine ok(filter2.seek_rate == -1.0, "Got rate %.16e.\n", filter2.seek_rate); @@ -4773,34 +4776,34 @@ static void test_graph_seeking(void) flush_cached_seeking(graph, &filter2); hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(rate == -1.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_SetRate(seeking, 1.0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Test how retrieving the current position behaves while the graph is * running. Apparently the graph caches the last position returned by * SetPositions() and then adds the clock offset to the stream start. */ hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Note that if the graph is running, it is paused while seeking. */ current = 0; stop = 9000 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(compare_time(time, 1234 * 10000, 40 * 10000), "Expected about 1234ms, got %s.\n", wine_dbgstr_longlong(time)); current = stop = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(compare_time(current, 1234 * 10000, 40 * 10000), "Expected about 1234ms, got %s.\n", wine_dbgstr_longlong(current)); @@ -4812,144 +4815,144 @@ static void test_graph_seeking(void) hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning | AM_SEEKING_NoFlush, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_NoFlush); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); Sleep(100); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(compare_time(time, 1334 * 10000, 80 * 10000), "Expected about 1334ms, got %s.\n", wine_dbgstr_longlong(time)); current = stop = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(compare_time(current, 1334 * 10000, 80 * 10000), "Expected about 1334ms, got %s.\n", wine_dbgstr_longlong(current)); ok(stop == 8000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); Sleep(100); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(compare_time(time, 1334 * 10000, 80 * 10000), "Expected about 1334ms, got %s.\n", wine_dbgstr_longlong(time)); current = stop = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_interactive) /* Timing problems make this test too liable to fail. */ ok(compare_time(current, 1334 * 10000, 80 * 10000), "Expected about 1334ms, got %s.\n", wine_dbgstr_longlong(current)); ok(stop == 8000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 12340000, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaFilter_SetSyncSource(filter, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); Sleep(100); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(!time, "Got time %s.\n", wine_dbgstr_longlong(time)); current = stop = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(!stop, "Got time %s.\n", wine_dbgstr_longlong(stop)); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* GetCurrentPositions() will return the stop position once all renderers * report EC_COMPLETE. Atelier Sophie depends on this behaviour. */ hr = IFilterGraph2_SetDefaultSyncSource(graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); filter1.seek_stop = 5000 * 10000; filter2.seek_stop = 6000 * 10000; hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time < 5000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time < 5000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter2.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 6000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); filter1.seek_hr = filter2.seek_hr = E_NOTIMPL; filter1.seek_stop = filter2.seek_stop = 0xdeadbeef; hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time < 5000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter1.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(eventsink, EC_COMPLETE, S_OK, (LONG_PTR)&filter2.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 6000 * 10000, "Got time %s.\n", wine_dbgstr_longlong(time)); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_NONE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaFilter_Release(filter); IMediaControl_Release(control); IMediaSeeking_Release(seeking); IMediaEventSink_Release(eventsink); - ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); - ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %ld.\n", filter2.seeking_ref); + ok(filter1.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); + ok(filter2.seeking_ref > 0, "Unexpected seeking refcount %d.\n", filter2.seeking_ref); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(filter1.ref == 1, "Got outstanding refcount %ld.\n", filter1.ref); - ok(filter2.ref == 1, "Got outstanding refcount %ld.\n", filter2.ref); - ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %ld.\n", filter1.seeking_ref); - ok(filter2.seeking_ref == 0, "Unexpected seeking refcount %ld.\n", filter2.seeking_ref); + ok(!ref, "Got outstanding refcount %d.\n", hr); + ok(filter1.ref == 1, "Got outstanding refcount %d.\n", filter1.ref); + ok(filter2.ref == 1, "Got outstanding refcount %d.\n", filter2.ref); + ok(filter1.seeking_ref == 0, "Unexpected seeking refcount %d.\n", filter1.seeking_ref); + ok(filter2.seeking_ref == 0, "Unexpected seeking refcount %d.\n", filter2.seeking_ref); } static void test_default_sync_source(void) @@ -4978,20 +4981,20 @@ static void test_default_sync_source(void) IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&filter); hr = IFilterGraph2_SetDefaultSyncSource(graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaFilter_GetSyncSource(filter, &clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!!clock, "Reference clock not set.\n"); IReferenceClock_Release(clock); source.IReferenceClock_iface.lpVtbl = &testclock_vtbl; hr = IFilterGraph2_SetDefaultSyncSource(graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaFilter_GetSyncSource(filter, &clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(clock == &source.IReferenceClock_iface, "Got unexpected clock.\n"); IReferenceClock_Release(clock); @@ -5001,29 +5004,29 @@ static void test_default_sync_source(void) sink2.IReferenceClock_iface.lpVtbl = &testclock_vtbl; hr = IFilterGraph2_SetDefaultSyncSource(graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaFilter_GetSyncSource(filter, &clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(clock == &sink2.IReferenceClock_iface, "Got unexpected clock.\n"); IReferenceClock_Release(clock); sink1.IReferenceClock_iface.lpVtbl = &testclock_vtbl; hr = IFilterGraph2_SetDefaultSyncSource(graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaFilter_GetSyncSource(filter, &clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(clock == &sink1.IReferenceClock_iface, "Got unexpected clock.\n"); IReferenceClock_Release(clock); IMediaFilter_Release(filter); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(sink1.ref == 1, "Got outstanding refcount %ld.\n", sink1.ref); - ok(sink2.ref == 1, "Got outstanding refcount %ld.\n", sink2.ref); - ok(source.ref == 1, "Got outstanding refcount %ld.\n", source.ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(sink1.ref == 1, "Got outstanding refcount %d.\n", sink1.ref); + ok(sink2.ref == 1, "Got outstanding refcount %d.\n", sink2.ref); + ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); } static void test_add_source_filter(void) @@ -5048,20 +5051,20 @@ static void test_add_source_filter(void) filename = create_file(L"test.mp3", midi_data, sizeof(midi_data)); hr = IFilterGraph2_AddSourceFilter(graph, filename, L"test", &filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetClassID(filter, &clsid); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&clsid, &CLSID_AsyncReader), "Got filter %s.\n", wine_dbgstr_guid(&clsid)); hr = IBaseFilter_QueryFilterInfo(filter, &filter_info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(filter_info.achName, L"test"), "Got unexpected name %s.\n", wine_dbgstr_w(filter_info.achName)); IFilterGraph_Release(filter_info.pGraph); hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFileSourceFilter_GetCurFile(filesource, &ret_filename, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(ret_filename, filename), "Expected filename %s, got %s.\n", wine_dbgstr_w(filename), wine_dbgstr_w(ret_filename)); ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Stream), "Got major type %s.\n", wine_dbgstr_guid(&mt.majortype)); @@ -5069,38 +5072,38 @@ static void test_add_source_filter(void) IFileSourceFilter_Release(filesource); hr = IFilterGraph2_AddSourceFilter(graph, filename, L"test", &filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 != filter, "Filters shouldn't match.\n"); hr = IFilterGraph2_RemoveFilter(graph, filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IBaseFilter_Release(filter2); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = IFilterGraph2_RemoveFilter(graph, filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete %s, error %lu.\n", wine_dbgstr_w(filename), GetLastError()); + ok(ret, "Failed to delete %s, error %u.\n", wine_dbgstr_w(filename), GetLastError()); /* Test a file which should be registered by signature. */ filename = create_file(L"test.avi", midi_data, sizeof(midi_data)); hr = IFilterGraph2_AddSourceFilter(graph, filename, NULL, &filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetClassID(filter, &clsid); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&clsid, &CLSID_AsyncReader), "Got filter %s.\n", wine_dbgstr_guid(&clsid)); hr = IBaseFilter_QueryFilterInfo(filter, &filter_info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(!wcscmp(filter_info.achName, filename), "Got unexpected name %s.\n", wine_dbgstr_w(filter_info.achName)); IFilterGraph_Release(filter_info.pGraph); hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFileSourceFilter_GetCurFile(filesource, &ret_filename, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(ret_filename, filename), "Expected filename %s, got %s.\n", wine_dbgstr_w(filename), wine_dbgstr_w(ret_filename)); ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Stream), "Got major type %s.\n", wine_dbgstr_guid(&mt.majortype)); @@ -5108,11 +5111,11 @@ static void test_add_source_filter(void) IFileSourceFilter_Release(filesource); hr = IFilterGraph2_RemoveFilter(graph, filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete %s, error %lu.\n", wine_dbgstr_w(filename), GetLastError()); + ok(ret, "Failed to delete %s, error %u.\n", wine_dbgstr_w(filename), GetLastError()); if (!RegCreateKeyA(HKEY_CLASSES_ROOT, "Media Type\\{abbccdde-0000-0000-0000-000000000000}" "\\{bccddeef-0000-0000-0000-000000000000}", &key)) @@ -5134,16 +5137,16 @@ static void test_add_source_filter(void) filename = create_file(L"test.avi", bogus_data, sizeof(bogus_data)); hr = IFilterGraph2_AddSourceFilter(graph, filename, NULL, &filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter == &testfilter.IBaseFilter_iface, "Got unexpected filter %p.\n", filter); hr = IFilterGraph2_RemoveFilter(graph, filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IBaseFilter_Release(filter); ref = IBaseFilter_Release(&testfilter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete %s, error %lu.\n", wine_dbgstr_w(filename), GetLastError()); + ok(ret, "Failed to delete %s, error %u.\n", wine_dbgstr_w(filename), GetLastError()); RegDeleteKeyA(HKEY_CLASSES_ROOT, "Media Type\\{abbccdde-0000-0000-0000-000000000000}" "\\{bccddeef-0000-0000-0000-000000000000}"); RegDeleteKeyA(HKEY_CLASSES_ROOT, "Media Type\\{abbccdde-0000-0000-0000-000000000000}"); @@ -5153,7 +5156,7 @@ static void test_add_source_filter(void) skip("Not enough permission to register media types.\n"); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static HWND get_renderer_hwnd(IFilterGraph2 *graph) @@ -5167,20 +5170,20 @@ static HWND get_renderer_hwnd(IFilterGraph2 *graph) IPin *pin; hr = IFilterGraph2_EnumFilters(graph, &enum_filters); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (IEnumFilters_Next(enum_filters, 1, &filter, NULL) == S_OK) { hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IEnumPins_Release(enum_pins); if (SUCCEEDED(IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay))) { hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IOverlay_Release(overlay); } @@ -5226,12 +5229,12 @@ static void test_window_threading(void) hr = IFilterGraph2_RenderFile(graph, filename, NULL); if (FAILED(hr)) { - skip("Cannot render test file, hr %#lx.\n", hr); + skip("Cannot render test file, hr %#x.\n", hr); IFilterGraph2_Release(graph); DeleteFileW(filename); return; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if ((hwnd = get_renderer_hwnd(graph))) { @@ -5245,9 +5248,9 @@ static void test_window_threading(void) * while the video window is released. In particular, we must not send * WM_PARENTNOTIFY. This is not achieved through window styles. */ hr = IFilterGraph2_QueryInterface(graph, &IID_IVideoWindow, (void **)&window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Owner(window, (OAHWND)parent); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IVideoWindow_Release(window); ok(!(GetWindowLongW(hwnd, GWL_EXSTYLE) & WS_EX_NOPARENTNOTIFY), "Window has WS_EX_NOPARENTNOTIFY.\n"); } @@ -5257,7 +5260,7 @@ static void test_window_threading(void) SetActiveWindow(parent); expect_parent_message = FALSE; ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); expect_parent_message = TRUE; hwnd = GetActiveWindow(); @@ -5265,10 +5268,10 @@ static void test_window_threading(void) hr = CoCreateInstance(&CLSID_FilterGraphNoThread, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&graph); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_RenderFile(graph, filename, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if ((hwnd = get_renderer_hwnd(graph))) { @@ -5279,12 +5282,12 @@ static void test_window_threading(void) skip("Could not find renderer window.\n"); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(parent); UnregisterClassA("quartz_test_parent", GetModuleHandleA(NULL)); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } /* Hyperdevotion Noire needs to be able to Render() from UYVY. */ @@ -5323,12 +5326,12 @@ static void test_autoplug_uyvy(void) * failure to decode up to missing audio hardware, even though we're not * trying to render audio. */ hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); - todo_wine ok(hr == S_OK || hr == VFW_E_NO_AUDIO_HARDWARE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK || hr == VFW_E_NO_AUDIO_HARDWARE, "Got hr %#x.\n", hr); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(source.ref == 1, "Got outstanding refcount %ld.\n", source.ref); - ok(source_pin.ref == 1, "Got outstanding refcount %ld.\n", source_pin.ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); + ok(source_pin.ref == 1, "Got outstanding refcount %d.\n", source_pin.ref); } static void test_set_notify_flags(void) @@ -5353,129 +5356,129 @@ static void test_set_notify_flags(void) status = SysAllocString(L"status"); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEventEx, (void **)&media_event); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEventSink, (void **)&media_event_sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testfilter_init(&filter, NULL, 0); filter.IAMFilterMiscFlags_iface.lpVtbl = &testmiscflags_vtbl; filter.misc_flags = AM_FILTER_MISC_FLAGS_IS_RENDERER; hr = IFilterGraph2_AddFilter(graph, &filter.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventEx_GetEventHandle(media_event, (OAEVENT *)&event); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventEx_SetNotifyWindow(media_event, (OAHWND)window, WM_USER, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n"); while (PeekMessageA(&msg, window, WM_USER, WM_USER, PM_REMOVE)); hr = IMediaEventEx_SetNotifyFlags(media_event, 2); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaEventEx_GetNotifyFlags(media_event, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); flags = 0xdeadbeef; hr = IMediaEventEx_GetNotifyFlags(media_event, &flags); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!flags, "Got flags %#lx\n", flags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!flags, "Got flags %#x\n", flags); hr = IMediaEventEx_SetNotifyFlags(media_event, AM_MEDIAEVENT_NONOTIFY); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); flags = 0xdeadbeef; hr = IMediaEventEx_GetNotifyFlags(media_event, &flags); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(flags == AM_MEDIAEVENT_NONOTIFY, "Got flags %#lx\n", flags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(flags == AM_MEDIAEVENT_NONOTIFY, "Got flags %#x\n", flags); ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n"); hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n"); ok(!PeekMessageA(&msg, window, WM_USER, WM_USER, PM_REMOVE), "Window should not be notified.\n"); hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n"); hr = IMediaControl_Stop(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n"); hr = IMediaControl_Pause(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n"); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n"); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n"); hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n"); hr = IMediaEventEx_SetNotifyFlags(media_event, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); flags = 0xdeadbeef; hr = IMediaEventEx_GetNotifyFlags(media_event, &flags); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!flags, "Got flags %#lx\n", flags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!flags, "Got flags %#x\n", flags); hr = IMediaControl_Stop(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventEx_SetNotifyFlags(media_event, AM_MEDIAEVENT_NONOTIFY); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n"); hr = IMediaControl_Stop(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaControl_Release(media_control); IMediaEventEx_Release(media_event); IMediaEventSink_Release(media_event_sink); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(filter.ref == 1, "Got outstanding refcount %ld.\n", filter.ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(filter.ref == 1, "Got outstanding refcount %d.\n", filter.ref); SysFreeString(status); DestroyWindow(window); @@ -5500,9 +5503,9 @@ static void check_events_(unsigned int line, IMediaEventEx *media_event, if (code == EC_STATUS) ++ec_status_count; hr = IMediaEventEx_FreeEventParams(media_event, code, param1, param2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); ok_(__FILE__, line)(ec_complete_count == expected_ec_complete_count, "Expected %d EC_COMPLETE events.\n", expected_ec_complete_count); ok_(__FILE__, line)(ec_status_count == expected_ec_status_count, @@ -5526,58 +5529,58 @@ static void test_events(void) status = SysAllocString(L"status"); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEventEx, (void **)&media_event); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEventSink, (void **)&media_event_sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); testfilter_init(&filter, NULL, 0); filter.IAMFilterMiscFlags_iface.lpVtbl = &testmiscflags_vtbl; filter.misc_flags = AM_FILTER_MISC_FLAGS_IS_RENDERER; hr = IFilterGraph2_AddFilter(graph, &filter.IBaseFilter_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventEx_GetEventHandle(media_event, (OAEVENT *)&event); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); code = 0xdeadbeef; param1 = 0xdeadbeef; param2 = 0xdeadbeef; hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 0); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); - ok(!code, "Got code %#lx.\n", code); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); + ok(!code, "Got code %#x.\n", code); todo_wine ok(!param1, "Got param1 %#Ix.\n", param1); todo_wine ok(!param2, "Got param2 %#Ix.\n", param2); /* EC_COMPLETE is ignored while in stopped or paused state. */ hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_events(media_event, 0, 2); hr = IMediaControl_Pause(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_events(media_event, 0, 2); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_events(media_event, 0, 0); @@ -5585,68 +5588,68 @@ static void test_events(void) * This remains true even with default handling canceled. */ hr = IMediaEventEx_CancelDefaultHandling(media_event, EC_COMPLETE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_events(media_event, 1, 2); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_events(media_event, 0, 2); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_events(media_event, 1, 2); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK, (LONG_PTR)&filter.IBaseFilter_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)status, (LONG_PTR)status); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Run(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_events(media_event, 0, 2); @@ -5655,57 +5658,23 @@ static void test_events(void) SetEvent(event); hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 50); - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n"); hr = IMediaControl_Stop(media_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaControl_Release(media_control); IMediaEventEx_Release(media_event); IMediaEventSink_Release(media_event_sink); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(filter.ref == 1, "Got outstanding refcount %ld.\n", filter.ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(filter.ref == 1, "Got outstanding refcount %d.\n", filter.ref); SysFreeString(status); } -static void test_event_dispatch(void) -{ - IFilterGraph2 *graph = create_graph(); - IMediaEventEx *event_ex; - ITypeInfo *typeinfo; - IMediaEvent *event; - TYPEATTR *typeattr; - unsigned int count; - HRESULT hr; - ULONG ref; - - IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&event); - IFilterGraph2_QueryInterface(graph, &IID_IMediaEventEx, (void **)&event_ex); - ok((void *)event == event_ex, "Interface pointers didn't match.\n"); - IMediaEventEx_Release(event_ex); - - hr = IMediaEvent_GetTypeInfoCount(event, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %u.\n", count); - - hr = IMediaEvent_GetTypeInfo(event, 0, 0, &typeinfo); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(typeattr->typekind == TKIND_DISPATCH, "Got kind %u.\n", typeattr->typekind); - ok(IsEqualGUID(&typeattr->guid, &IID_IMediaEvent), "Got IID %s.\n", debugstr_guid(&typeattr->guid)); - ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); - ITypeInfo_Release(typeinfo); - - IMediaEvent_Release(event); - ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); -} - START_TEST(filtergraph) { CoInitializeEx(NULL, COINIT_MULTITHREADED); @@ -5733,7 +5702,6 @@ START_TEST(filtergraph) test_autoplug_uyvy(); test_set_notify_flags(); test_events(); - test_event_dispatch(); CoUninitialize(); test_render_with_multithread(); diff --git a/dlls/quartz/tests/filtermapper.c b/dlls/quartz/tests/filtermapper.c index 3c492845389..f1a942b1d25 100644 --- wine/dlls/quartz/tests/filtermapper.c +++ wine/dlls/quartz/tests/filtermapper.c @@ -35,7 +35,7 @@ static IFilterMapper3 *create_mapper(void) IFilterMapper3 *ret; HRESULT hr; hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper3, (void **)&ret); - ok(hr == S_OK, "Failed to create filter mapper, hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create filter mapper, hr %#x.\n", hr); return ret; } @@ -56,7 +56,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -92,10 +92,10 @@ static BOOL enum_find_filter(const WCHAR *wszFilterName, IEnumMoniker *pEnum) VariantInit(&var); hr = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID*)&pPropBagCat); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "IMoniker_BindToStorage failed with %x\n", hr); hr = IPropertyBag_Read(pPropBagCat, L"FriendlyName", &var, NULL); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "IPropertyBag_Read failed with %x\n", hr); if (!wcscmp(V_BSTR(&var), wszFilterName)) found = TRUE; @@ -128,13 +128,13 @@ static void test_fm2_enummatchingfilters(void) hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (LPVOID*)&pMapper); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "CoCreateInstance failed with %x\n", hr); if (FAILED(hr)) goto out; hr = CoCreateGuid(&clsidFilter1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "CoCreateGuid failed with %x\n", hr); hr = CoCreateGuid(&clsidFilter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "CoCreateGuid failed with %x\n", hr); /* Test that a test renderer filter is returned when enumerating filters with bRender=FALSE */ rgf2.dwVersion = 2; @@ -162,7 +162,7 @@ static void test_fm2_enummatchingfilters(void) } else { - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_RegisterFilter failed with %x\n", hr); rgPins2[0].dwFlags = 0; @@ -178,11 +178,11 @@ static void test_fm2_enummatchingfilters(void) hr = IFilterMapper2_RegisterFilter(pMapper, &clsidFilter2, L"Testfilter2", NULL, &CLSID_LegacyAmFilterCategory, NULL, &rgf2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_RegisterFilter failed with %x\n", hr); hr = IFilterMapper2_EnumMatchingFilters(pMapper, &pEnum, 0, TRUE, MERIT_UNLIKELY, TRUE, 0, NULL, NULL, &GUID_NULL, FALSE, FALSE, 0, NULL, NULL, &GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_EnumMatchingFilters failed with %x\n", hr); if (SUCCEEDED(hr) && pEnum) { found = enum_find_filter(L"Testfilter1", pEnum); @@ -194,7 +194,7 @@ static void test_fm2_enummatchingfilters(void) hr = IFilterMapper2_EnumMatchingFilters(pMapper, &pEnum, 0, TRUE, MERIT_UNLIKELY, TRUE, 0, NULL, NULL, &GUID_NULL, FALSE, FALSE, 0, NULL, NULL, &GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_EnumMatchingFilters failed with %x\n", hr); if (SUCCEEDED(hr) && pEnum) { found = enum_find_filter(L"Testfilter2", pEnum); @@ -208,7 +208,7 @@ static void test_fm2_enummatchingfilters(void) hr = IFilterMapper2_EnumMatchingFilters(pMapper, &pEnum, 0, TRUE, MERIT_UNLIKELY, TRUE, 0, NULL, NULL, &GUID_NULL, TRUE, FALSE, 0, NULL, NULL, &GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_EnumMatchingFilters failed with %x\n", hr); if (SUCCEEDED(hr) && pEnum) { @@ -217,12 +217,12 @@ static void test_fm2_enummatchingfilters(void) } hr = IFilterMapper2_QueryInterface(pMapper, &IID_IFilterMapper, (void **)&mapper); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "QueryInterface(IFilterMapper) failed: %#x\n", hr); found = FALSE; hr = IFilterMapper_EnumMatchingFilters(mapper, &enum_reg, MERIT_UNLIKELY, FALSE, GUID_NULL, GUID_NULL, FALSE, FALSE, GUID_NULL, GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper_EnumMatchingFilters failed: %#x\n", hr); while (!found && IEnumRegFilters_Next(enum_reg, 1, ®filter, &count) == S_OK) { if (!wcscmp(regfilter->Name, L"Testfilter1") && IsEqualGUID(&clsidFilter1, ®filter->Clsid)) @@ -239,7 +239,7 @@ static void test_fm2_enummatchingfilters(void) hr = IFilterMapper2_EnumMatchingFilters(pMapper, &pEnum, 0, TRUE, MERIT_UNLIKELY, TRUE, 0, NULL, NULL, &GUID_NULL, TRUE, FALSE, 0, NULL, NULL, &GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_EnumMatchingFilters failed with %x\n", hr); if (SUCCEEDED(hr) && pEnum) { @@ -251,18 +251,18 @@ static void test_fm2_enummatchingfilters(void) { hr = IFilterMapper2_UnregisterFilter(pMapper, &CLSID_LegacyAmFilterCategory, NULL, &clsidFilter1); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "IFilterMapper2_UnregisterFilter failed with %x\n", hr); hr = IFilterMapper2_UnregisterFilter(pMapper, &CLSID_LegacyAmFilterCategory, NULL, &clsidFilter2); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "IFilterMapper2_UnregisterFilter failed with %x\n", hr); } out: if (pEnum) IEnumMoniker_Release(pEnum); ref = IFilterMapper2_Release(pMapper); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_legacy_filter_registration(void) @@ -298,34 +298,34 @@ static void test_legacy_filter_registration(void) * registers in this way. Filters so registered must then be accessible through both IFilterMapper_EnumMatchingFilters * and IFilterMapper2_EnumMatchingFilters. */ hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (void **)&mapper2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "CoCreateInstance failed with %x\n", hr); hr = IFilterMapper2_QueryInterface(mapper2, &IID_IFilterMapper, (void **)&mapper); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_QueryInterface failed with %x\n", hr); /* Set default value - this is interpreted as "friendly name" later. */ RegSetValueExW(hkey, NULL, 0, REG_SZ, (const BYTE *)L"Testfilter", sizeof(L"Testfilter")); RegCloseKey(hkey); hr = IFilterMapper_RegisterFilter(mapper, clsid, L"Testfilter", MERIT_UNLIKELY); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "RegisterFilter failed: %#x\n", hr); hr = IFilterMapper_RegisterPin(mapper, clsid, L"Pin1", TRUE, FALSE, FALSE, FALSE, GUID_NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "RegisterPin failed: %#x\n", hr); hr = IFilterMapper_RegisterPinType(mapper, clsid, L"Pin1", GUID_NULL, GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "RegisterPinType failed: %#x\n", hr); hr = IFilterMapper2_EnumMatchingFilters(mapper2, &enum_mon, 0, TRUE, MERIT_UNLIKELY, TRUE, 0, NULL, NULL, &GUID_NULL, FALSE, FALSE, 0, NULL, NULL, &GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_EnumMatchingFilters failed: %x\n", hr); ok(enum_find_filter(L"Testfilter", enum_mon), "IFilterMapper2 didn't find filter\n"); IEnumMoniker_Release(enum_mon); found = FALSE; hr = IFilterMapper_EnumMatchingFilters(mapper, &enum_reg, MERIT_UNLIKELY, TRUE, GUID_NULL, GUID_NULL, FALSE, FALSE, GUID_NULL, GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper_EnumMatchingFilters failed with %x\n", hr); while(!found && IEnumRegFilters_Next(enum_reg, 1, ®filter, &count) == S_OK) { if (!wcscmp(regfilter->Name, L"Testfilter") && IsEqualGUID(&clsid, ®filter->Clsid)) @@ -335,18 +335,18 @@ static void test_legacy_filter_registration(void) ok(found, "IFilterMapper didn't find filter\n"); hr = IFilterMapper_UnregisterFilter(mapper, clsid); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "FilterMapper_UnregisterFilter failed with %x\n", hr); hr = IFilterMapper2_EnumMatchingFilters(mapper2, &enum_mon, 0, TRUE, MERIT_UNLIKELY, TRUE, 0, NULL, NULL, &GUID_NULL, FALSE, FALSE, 0, NULL, NULL, &GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_EnumMatchingFilters failed: %x\n", hr); ok(!enum_find_filter(L"Testfilter", enum_mon), "IFilterMapper2 shouldn't find filter\n"); IEnumMoniker_Release(enum_mon); found = FALSE; hr = IFilterMapper_EnumMatchingFilters(mapper, &enum_reg, MERIT_UNLIKELY, TRUE, GUID_NULL, GUID_NULL, FALSE, FALSE, GUID_NULL, GUID_NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper_EnumMatchingFilters failed with %x\n", hr); while(!found && IEnumRegFilters_Next(enum_reg, 1, ®filter, &count) == S_OK) { if (!wcscmp(regfilter->Name, L"Testfilter") && IsEqualGUID(&clsid, ®filter->Clsid)) @@ -356,13 +356,13 @@ static void test_legacy_filter_registration(void) ok(!found, "IFilterMapper shouldn't find filter\n"); ret = RegDeleteKeyW(HKEY_CLASSES_ROOT, key_name); - ok(!ret, "RegDeleteKeyA failed: %Iu\n", ret); + ok(!ret, "RegDeleteKeyA failed: %lu\n", ret); hr = IFilterMapper_RegisterFilter(mapper, clsid, L"Testfilter", MERIT_UNLIKELY); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "RegisterFilter failed: %#x\n", hr); hr = IFilterMapper_UnregisterFilter(mapper, clsid); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "FilterMapper_UnregisterFilter failed with %x\n", hr); IFilterMapper_Release(mapper); IFilterMapper2_Release(mapper2); @@ -382,13 +382,13 @@ static void test_register_filter_with_null_clsMinorType(void) hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (LPVOID*)&pMapper); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "CoCreateInstance failed with %x\n", hr); if (FAILED(hr)) goto out; hr = CoCreateGuid(&clsidFilter1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "CoCreateGuid failed with %x\n", hr); hr = CoCreateGuid(&clsidFilter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "CoCreateGuid failed with %x\n", hr); rgPinType.clsMajorType = &GUID_NULL; /* Make sure quartz accepts it without crashing */ @@ -418,10 +418,10 @@ static void test_register_filter_with_null_clsMinorType(void) skip("Not authorized to register filters\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_RegisterFilter failed with %x\n", hr); hr = IFilterMapper2_UnregisterFilter(pMapper, &CLSID_LegacyAmFilterCategory, NULL, &clsidFilter1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "FilterMapper_UnregisterFilter failed with %x\n", hr); /* Test with pin descript version 2 */ ZeroMemory(&rgf2, sizeof(rgf2)); @@ -440,10 +440,10 @@ static void test_register_filter_with_null_clsMinorType(void) hr = IFilterMapper2_RegisterFilter(pMapper, &clsidFilter2, L"Testfilter2", NULL, &CLSID_LegacyAmFilterCategory, NULL, &rgf2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "IFilterMapper2_RegisterFilter failed with %x\n", hr); hr = IFilterMapper2_UnregisterFilter(pMapper, &CLSID_LegacyAmFilterCategory, NULL, &clsidFilter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "FilterMapper_UnregisterFilter failed with %x\n", hr); out: @@ -473,7 +473,7 @@ static void test_parse_filter_data(void) hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (LPVOID*)&pMapper); - ok((hr == S_OK || broken(hr != S_OK)), "Got hr %#lx.\n", hr); + ok((hr == S_OK || broken(hr != S_OK)), "CoCreateInstance failed with %x\n", hr); if (FAILED(hr)) goto out; hr = IFilterMapper2_QueryInterface(pMapper, &IID_IAMFilterData, (LPVOID*)&pData); @@ -559,53 +559,53 @@ static void test_aggregation(void) mapper = (IFilterMapper3 *)0xdeadbeef; hr = CoCreateInstance(&CLSID_FilterMapper2, &test_outer, CLSCTX_INPROC_SERVER, &IID_IFilterMapper3, (void **)&mapper); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!mapper, "Got interface %p.\n", mapper); hr = CoCreateInstance(&CLSID_FilterMapper2, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IFilterMapper3, (void **)&mapper); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterMapper3_QueryInterface(mapper, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IFilterMapper3_QueryInterface(mapper, &IID_IFilterMapper3, (void **)&mapper2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(mapper2 == (IFilterMapper3 *)0xdeadbeef, "Got unexpected IFilterMapper3 %p.\n", mapper2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IFilterMapper3_QueryInterface(mapper, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IFilterMapper3_Release(mapper); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_dmo(void) @@ -625,19 +625,19 @@ static void test_dmo(void) skip("Not enough permissions to register DMOs.\n"); return; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mapper = create_mapper(); hr = IFilterMapper3_EnumMatchingFilters(mapper, &enumerator, 0, FALSE, 0, FALSE, 0, NULL, NULL, NULL, FALSE, FALSE, 0, NULL, NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); found = FALSE; while (IEnumMoniker_Next(enumerator, 1, &moniker, NULL) == S_OK) { hr = IMoniker_GetDisplayName(moniker, NULL, NULL, &name); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (!wcscmp(name, L"@device:dmo:{77777777-0000-0000-0000-000000000000}{57F2DB8B-E6BB-4513-9D43-DCD2A6593125}")) found = TRUE; @@ -651,10 +651,10 @@ static void test_dmo(void) /* DMOs are enumerated by IFilterMapper in Windows 7 and higher. */ ref = IFilterMapper3_Release(mapper); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = DMOUnregister(&testclsid, &DMOCATEGORY_AUDIO_DECODER); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } START_TEST(filtermapper) diff --git a/dlls/quartz/tests/memallocator.c b/dlls/quartz/tests/memallocator.c index 37df9a24bd2..164f3af47f4 100644 --- wine/dlls/quartz/tests/memallocator.c +++ wine/dlls/quartz/tests/memallocator.c @@ -27,7 +27,7 @@ static IMemAllocator *create_allocator(void) IMemAllocator *allocator = NULL; HRESULT hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return allocator; } @@ -63,59 +63,59 @@ static void test_properties(void) memset(&ret_props, 0xcc, sizeof(ret_props)); hr = IMemAllocator_GetProperties(allocator, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!ret_props.cBuffers, "Got %ld buffers.\n", ret_props.cBuffers); - ok(!ret_props.cbBuffer, "Got size %ld.\n", ret_props.cbBuffer); - ok(!ret_props.cbAlign, "Got align %ld.\n", ret_props.cbAlign); - ok(!ret_props.cbPrefix, "Got prefix %ld.\n", ret_props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!ret_props.cBuffers, "Got %d buffers.\n", ret_props.cBuffers); + ok(!ret_props.cbBuffer, "Got size %d.\n", ret_props.cbBuffer); + ok(!ret_props.cbAlign, "Got align %d.\n", ret_props.cbAlign); + ok(!ret_props.cbPrefix, "Got prefix %d.\n", ret_props.cbPrefix); hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == VFW_E_BADALIGN, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_BADALIGN, "Got hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(tests); i++) { req_props = tests[i]; hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); ok(!memcmp(&req_props, &tests[i], sizeof(req_props)), "Test %u: Requested props should not be changed.\n", i); - ok(ret_props.cBuffers == req_props.cBuffers, "Test %u: Got %ld buffers.\n", i, ret_props.cBuffers); - ok(ret_props.cbBuffer >= req_props.cbBuffer, "Test %u: Got size %ld.\n", i, ret_props.cbBuffer); - ok(ret_props.cbAlign == req_props.cbAlign, "Test %u: Got alignment %ld.\n", i, ret_props.cbAlign); - ok(ret_props.cbPrefix == req_props.cbPrefix, "Test %u: Got prefix %ld.\n", i, ret_props.cbPrefix); + ok(ret_props.cBuffers == req_props.cBuffers, "Test %u: Got %d buffers.\n", i, ret_props.cBuffers); + ok(ret_props.cbBuffer >= req_props.cbBuffer, "Test %u: Got size %d.\n", i, ret_props.cbBuffer); + ok(ret_props.cbAlign == req_props.cbAlign, "Test %u: Got alignment %d.\n", i, ret_props.cbAlign); + ok(ret_props.cbPrefix == req_props.cbPrefix, "Test %u: Got prefix %d.\n", i, ret_props.cbPrefix); ret_size = ret_props.cbBuffer; hr = IMemAllocator_GetProperties(allocator, &ret_props); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); - ok(ret_props.cBuffers == req_props.cBuffers, "Test %u: Got %ld buffers.\n", i, ret_props.cBuffers); - ok(ret_props.cbBuffer == ret_size, "Test %u: Got size %ld.\n", i, ret_props.cbBuffer); - ok(ret_props.cbAlign == req_props.cbAlign, "Test %u: Got alignment %ld.\n", i, ret_props.cbAlign); - ok(ret_props.cbPrefix == req_props.cbPrefix, "Test %u: Got prefix %ld.\n", i, ret_props.cbPrefix); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); + ok(ret_props.cBuffers == req_props.cBuffers, "Test %u: Got %d buffers.\n", i, ret_props.cBuffers); + ok(ret_props.cbBuffer == ret_size, "Test %u: Got size %d.\n", i, ret_props.cbBuffer); + ok(ret_props.cbAlign == req_props.cbAlign, "Test %u: Got alignment %d.\n", i, ret_props.cbAlign); + ok(ret_props.cbPrefix == req_props.cbPrefix, "Test %u: Got prefix %d.\n", i, ret_props.cbPrefix); hr = IMemAllocator_Commit(allocator); if (!req_props.cbBuffer) { - ok(hr == VFW_E_SIZENOTSET, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == VFW_E_SIZENOTSET, "Test %u: Got hr %#x.\n", i, hr); continue; } - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == VFW_E_ALREADY_COMMITTED, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == VFW_E_ALREADY_COMMITTED, "Test %u: Got hr %#x.\n", i, hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); size = IMediaSample_GetSize(sample); - ok(size == ret_size, "Test %u: Got size %ld.\n", i, size); + ok(size == ret_size, "Test %u: Got size %d.\n", i, size); hr = IMemAllocator_Decommit(allocator); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == VFW_E_BUFFERS_OUTSTANDING, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == VFW_E_BUFFERS_OUTSTANDING, "Test %u: Got hr %#x.\n", i, hr); hr = IMediaSample_Release(sample); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); } IMemAllocator_Release(allocator); @@ -130,42 +130,42 @@ static void test_commit(void) BYTE *data; hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaSample_Release(sample); hr = IMemAllocator_Decommit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Decommit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Extant samples remain valid even after Decommit() is called. */ hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Decommit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(data, 0xcc, 65536); hr = IMemAllocator_GetBuffer(allocator, &sample2, NULL, NULL, 0); - ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); IMediaSample_Release(sample); IMemAllocator_Release(allocator); @@ -182,132 +182,132 @@ static void test_sample_time(void) HRESULT hr; hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_QueryInterface(sample, &IID_IMediaSample2, (void **)&sample2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = 0xdeadbeef; end = 0xdeadf00d; hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); ok(start == 0xdeadbeef, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0xdeadf00d, "Got end %s.\n", wine_dbgstr_longlong(end)); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); hr = IMediaSample_SetTime(sample, NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); start = 0x123; hr = IMediaSample_SetTime(sample, &start, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = end = 0; hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_S_NO_STOP_TIME, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_NO_STOP_TIME, "Got hr %#x.\n", hr); ok(start == 0x123, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0x124, "Got end %s.\n", wine_dbgstr_longlong(end)); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.dwSampleFlags == AM_SAMPLE_TIMEVALID, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.dwSampleFlags == AM_SAMPLE_TIMEVALID, "Got flags %#x.\n", props.dwSampleFlags); ok(props.tStart == 0x123, "Got start %s.\n", wine_dbgstr_longlong(props.tStart)); hr = IMediaSample_SetTime(sample, NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); end = 0x321; hr = IMediaSample_SetTime(sample, NULL, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); start = 0x123; end = 0x321; hr = IMediaSample_SetTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = end = 0; hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == 0x123, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0x321, "Got end %s.\n", wine_dbgstr_longlong(end)); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(props.dwSampleFlags == (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID), - "Got flags %#lx.\n", props.dwSampleFlags); + "Got flags %#x.\n", props.dwSampleFlags); ok(props.tStart == 0x123, "Got start %s.\n", wine_dbgstr_longlong(props.tStart)); ok(props.tStop == 0x321, "Got end %s.\n", wine_dbgstr_longlong(props.tStop)); props.dwSampleFlags = 0; hr = IMediaSample2_SetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); props.dwSampleFlags = AM_SAMPLE_TIMEVALID; props.tStart = 0x123; hr = IMediaSample2_SetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = end = 0; hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_S_NO_STOP_TIME, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_NO_STOP_TIME, "Got hr %#x.\n", hr); ok(start == 0x123, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0x124, "Got end %s.\n", wine_dbgstr_longlong(end)); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.dwSampleFlags == AM_SAMPLE_TIMEVALID, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.dwSampleFlags == AM_SAMPLE_TIMEVALID, "Got flags %#x.\n", props.dwSampleFlags); ok(props.tStart == 0x123, "Got start %s.\n", wine_dbgstr_longlong(props.tStart)); props.dwSampleFlags = AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID; props.tStart = 0x1234; props.tStop = 0x4321; hr = IMediaSample2_SetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = end = 0; hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == 0x1234, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0x4321, "Got end %s.\n", wine_dbgstr_longlong(end)); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(props.dwSampleFlags == (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID), - "Got flags %#lx.\n", props.dwSampleFlags); + "Got flags %#x.\n", props.dwSampleFlags); ok(props.tStart == 0x1234, "Got start %s.\n", wine_dbgstr_longlong(props.tStart)); ok(props.tStop == 0x4321, "Got end %s.\n", wine_dbgstr_longlong(props.tStop)); @@ -317,28 +317,28 @@ static void test_sample_time(void) start = 0x123; end = 0x321; hr = IMemAllocator_GetBuffer(allocator, &sample, &start, &end, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_QueryInterface(sample, &IID_IMediaSample2, (void **)&sample2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = 0xdeadbeef; end = 0xdeadf00d; hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); ok(start == 0xdeadbeef, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0xdeadf00d, "Got end %s.\n", wine_dbgstr_longlong(end)); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); start = 0x123; end = 0x321; hr = IMediaSample_SetMediaTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetTime(sample, &start, &end); - ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_SAMPLE_TIME_NOT_SET, "Got hr %#x.\n", hr); IMediaSample2_Release(sample2); IMediaSample_Release(sample); @@ -355,48 +355,48 @@ static void test_media_time(void) HRESULT hr; hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = 0xdeadbeef; end = 0xdeadf00d; hr = IMediaSample_GetMediaTime(sample, &start, &end); - ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); ok(start == 0xdeadbeef, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0xdeadf00d, "Got end %s.\n", wine_dbgstr_longlong(end)); hr = IMediaSample_SetMediaTime(sample, NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetMediaTime(sample, &start, &end); - ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); /* This crashes on quartz.dll < 6.6. */ if (0) { start = 0x123; hr = IMediaSample_SetMediaTime(sample, &start, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); } end = 0x321; hr = IMediaSample_SetMediaTime(sample, NULL, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetMediaTime(sample, &start, &end); - ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); start = 0x123; end = 0x321; hr = IMediaSample_SetMediaTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = end = 0; hr = IMediaSample_GetMediaTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == 0x123, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0x321, "Got end %s.\n", wine_dbgstr_longlong(end)); @@ -405,35 +405,35 @@ static void test_media_time(void) start = 0x123; end = 0x321; hr = IMemAllocator_GetBuffer(allocator, &sample, &start, &end, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start = 0xdeadbeef; end = 0xdeadf00d; hr = IMediaSample_GetMediaTime(sample, &start, &end); - ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); ok(start == 0xdeadbeef, "Got start %s.\n", wine_dbgstr_longlong(start)); ok(end == 0xdeadf00d, "Got end %s.\n", wine_dbgstr_longlong(end)); start = 0x123; end = 0x321; hr = IMediaSample_SetTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetMediaTime(sample, &start, &end); - ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); start = 0x123; end = 0x321; hr = IMediaSample_SetMediaTime(sample, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaSample_Release(sample); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetMediaTime(sample, &start, &end); - ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_MEDIA_TIME_NOT_SET, "Got hr %#x.\n", hr); IMediaSample_Release(sample); IMemAllocator_Release(allocator); @@ -457,193 +457,193 @@ static void test_sample_properties(void) expect_mt.pbFormat = NULL; hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_QueryInterface(sample, &IID_IMediaSample2, (void **)&sample2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwTypeSpecificFlags, "Got type-specific flags %#lx.\n", props.dwTypeSpecificFlags); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); - ok(props.lActual == 65536, "Got actual length %ld.\n", props.lActual); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwTypeSpecificFlags, "Got type-specific flags %#x.\n", props.dwTypeSpecificFlags); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); + ok(props.lActual == 65536, "Got actual length %d.\n", props.lActual); ok(!props.tStart, "Got sample start %s.\n", wine_dbgstr_longlong(props.tStart)); - ok(!props.dwStreamId, "Got stream ID %#lx.\n", props.dwStreamId); + ok(!props.dwStreamId, "Got stream ID %#x.\n", props.dwStreamId); ok(!props.pMediaType, "Got media type %p.\n", props.pMediaType); ok(props.pbBuffer == data, "Expected pointer %p, got %p.\n", data, props.pbBuffer); - ok(props.cbBuffer == 65536, "Got buffer length %ld.\n", props.cbBuffer); + ok(props.cbBuffer == 65536, "Got buffer length %d.\n", props.cbBuffer); /* media type */ mt = (AM_MEDIA_TYPE *)0xdeadbeef; hr = IMediaSample_GetMediaType(sample, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(!mt, "Got media type %p.\n", mt); hr = IMediaSample_SetMediaType(sample, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt = (AM_MEDIA_TYPE *)0xdeadbeef; hr = IMediaSample_GetMediaType(sample, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(!mt, "Got media type %p.\n", mt); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); ok(!props.pMediaType, "Got media type %p.\n", props.pMediaType); hr = IMediaSample_SetMediaType(sample, &expect_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetMediaType(sample, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(mt, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); CoTaskMemFree(mt); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.dwSampleFlags == AM_SAMPLE_TYPECHANGED, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.dwSampleFlags == AM_SAMPLE_TYPECHANGED, "Got flags %#x.\n", props.dwSampleFlags); ok(!memcmp(props.pMediaType, &expect_mt, sizeof(AM_MEDIA_TYPE)), "Media types didn't match.\n"); hr = IMediaSample_SetMediaType(sample, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt = (AM_MEDIA_TYPE *)0xdeadbeef; hr = IMediaSample_GetMediaType(sample, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(!mt, "Got media type %p.\n", mt); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); ok(!props.pMediaType, "Got media type %p.\n", props.pMediaType); /* actual length */ len = IMediaSample_GetActualDataLength(sample); - ok(len == 65536, "Got length %ld.\n", len); + ok(len == 65536, "Got length %d.\n", len); hr = IMediaSample_SetActualDataLength(sample, 65537); - ok(hr == VFW_E_BUFFER_OVERFLOW, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_BUFFER_OVERFLOW, "Got hr %#x.\n", hr); hr = IMediaSample_SetActualDataLength(sample, -1); - ok(hr == VFW_E_BUFFER_OVERFLOW || broken(hr == S_OK), "Got hr %#lx.\n", hr); + ok(hr == VFW_E_BUFFER_OVERFLOW || broken(hr == S_OK), "Got hr %#x.\n", hr); hr = IMediaSample_SetActualDataLength(sample, 65536); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetActualDataLength(sample, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); len = IMediaSample_GetActualDataLength(sample); - ok(len == 0, "Got length %ld.\n", len); + ok(len == 0, "Got length %d.\n", len); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.lActual == 0, "Got actual length %ld.\n", props.lActual); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.lActual == 0, "Got actual length %d.\n", props.lActual); props.lActual = 123; hr = IMediaSample2_SetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.lActual == 123, "Got actual length %ld.\n", props.lActual); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.lActual == 123, "Got actual length %d.\n", props.lActual); len = IMediaSample_GetActualDataLength(sample); - ok(len == 123, "Got length %ld.\n", len); + ok(len == 123, "Got length %d.\n", len); /* boolean flags */ hr = IMediaSample_IsPreroll(sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample_SetPreroll(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsPreroll(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.dwSampleFlags == AM_SAMPLE_PREROLL, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.dwSampleFlags == AM_SAMPLE_PREROLL, "Got flags %#x.\n", props.dwSampleFlags); hr = IMediaSample_SetPreroll(sample, FALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsPreroll(sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); hr = IMediaSample_IsDiscontinuity(sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample_SetDiscontinuity(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsDiscontinuity(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.dwSampleFlags == AM_SAMPLE_DATADISCONTINUITY, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.dwSampleFlags == AM_SAMPLE_DATADISCONTINUITY, "Got flags %#x.\n", props.dwSampleFlags); hr = IMediaSample_SetDiscontinuity(sample, FALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsDiscontinuity(sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); hr = IMediaSample_IsSyncPoint(sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample_SetSyncPoint(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsSyncPoint(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.dwSampleFlags == AM_SAMPLE_SPLICEPOINT, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.dwSampleFlags == AM_SAMPLE_SPLICEPOINT, "Got flags %#x.\n", props.dwSampleFlags); hr = IMediaSample_SetSyncPoint(sample, FALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsSyncPoint(sample); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); props.dwSampleFlags = (AM_SAMPLE_PREROLL | AM_SAMPLE_DATADISCONTINUITY | AM_SAMPLE_SPLICEPOINT); hr = IMediaSample2_SetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsPreroll(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsDiscontinuity(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_IsSyncPoint(sample); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(props.dwSampleFlags == (AM_SAMPLE_PREROLL | AM_SAMPLE_DATADISCONTINUITY | AM_SAMPLE_SPLICEPOINT), - "Got flags %#lx.\n", props.dwSampleFlags); + "Got flags %#x.\n", props.dwSampleFlags); hr = IMediaSample_SetMediaType(sample, &expect_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaSample2_Release(sample2); IMediaSample_Release(sample); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_QueryInterface(sample, &IID_IMediaSample2, (void **)&sample2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample2_GetProperties(sample2, sizeof(props), (BYTE *)&props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.dwTypeSpecificFlags, "Got type-specific flags %#lx.\n", props.dwTypeSpecificFlags); - ok(!props.dwSampleFlags, "Got flags %#lx.\n", props.dwSampleFlags); - ok(props.lActual == 123, "Got actual length %ld.\n", props.lActual); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.dwTypeSpecificFlags, "Got type-specific flags %#x.\n", props.dwTypeSpecificFlags); + ok(!props.dwSampleFlags, "Got flags %#x.\n", props.dwSampleFlags); + ok(props.lActual == 123, "Got actual length %d.\n", props.lActual); ok(!props.tStart, "Got sample start %s.\n", wine_dbgstr_longlong(props.tStart)); - ok(!props.dwStreamId, "Got stream ID %#lx.\n", props.dwStreamId); + ok(!props.dwStreamId, "Got stream ID %#x.\n", props.dwStreamId); ok(!props.pMediaType, "Got media type %p.\n", props.pMediaType); - ok(props.cbBuffer == 65536, "Got buffer length %ld.\n", props.cbBuffer); + ok(props.cbBuffer == 65536, "Got buffer length %d.\n", props.cbBuffer); IMediaSample2_Release(sample2); IMediaSample_Release(sample); diff --git a/dlls/quartz/tests/mpegsplit.c b/dlls/quartz/tests/mpegsplit.c index b2cced84c68..0809c5f861f 100644 --- wine/dlls/quartz/tests/mpegsplit.c +++ wine/dlls/quartz/tests/mpegsplit.c @@ -32,7 +32,7 @@ static IBaseFilter *create_mpeg_splitter(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_MPEG1Splitter, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -54,11 +54,11 @@ static WCHAR *load_resource(const WCHAR *name) wcscat(pathW, name); file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %u.\n", wine_dbgstr_w(pathW), GetLastError()); res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); - ok(!!res, "Failed to load resource, error %lu.\n", GetLastError()); + ok(!!res, "Failed to load resource, error %u.\n", GetLastError()); ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); WriteFile(file, ptr, SizeofResource( GetModuleHandleA(NULL), res), &written, NULL); ok(written == SizeofResource(GetModuleHandleA(NULL), res), "Failed to write resource.\n"); @@ -96,7 +96,7 @@ static IFilterGraph2 *connect_input(IBaseFilter *splitter, const WCHAR *filename IBaseFilter_FindPin(reader, L"Output", &source); hr = IFilterGraph2_ConnectDirect(graph, source, sink, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(source); IPin_Release(sink); @@ -115,7 +115,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -222,53 +222,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_MPEG1Splitter, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_MPEG1Splitter, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -283,71 +283,71 @@ static void test_enum_pins(void) BOOL ret; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); @@ -355,46 +355,46 @@ static void test_enum_pins(void) graph = connect_input(filter, filename); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); IEnumPins_Release(enum1); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_find_pin(void) @@ -409,34 +409,34 @@ static void test_find_pin(void) BOOL ret; hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Audio", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); graph = connect_input(filter, filename); hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"Audio", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); @@ -444,9 +444,9 @@ static void test_find_pin(void) IEnumPins_Release(enum_pins); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_pin_info(void) @@ -465,49 +465,49 @@ static void test_pin_info(void) graph = connect_input(filter, filename); hr = IBaseFilter_FindPin(filter, L"Input", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_ref = get_refcount(filter); ref = get_refcount(pin); - ok(ref == expect_ref, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"Input"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == expect_ref + 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == expect_ref + 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"Input"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"Audio", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"Audio"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"Audio"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); @@ -515,9 +515,9 @@ static void test_pin_info(void) IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_media_types(void) @@ -548,7 +548,7 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"Input", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.majortype = MEDIATYPE_Stream; expect_mt.bFixedSizeSamples = TRUE; @@ -556,7 +556,7 @@ static void test_media_types(void) expect_mt.lSampleSize = 1; hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1System; if (hr == S_OK) { @@ -565,7 +565,7 @@ static void test_media_types(void) } hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1VideoCD; if (hr == S_OK) { @@ -574,7 +574,7 @@ static void test_media_types(void) } hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1Video; if (hr == S_OK) { @@ -583,7 +583,7 @@ static void test_media_types(void) } hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1Audio; if (hr == S_OK) { @@ -592,70 +592,70 @@ static void test_media_types(void) } hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); mt.majortype = MEDIATYPE_Stream; mt.subtype = MEDIASUBTYPE_MPEG1Audio; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_MPEG1Video; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_MPEG1VideoCD; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_MPEG1System; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_MPEG1AudioPayload; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_MPEG1Payload; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_MPEG1Packet; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_MPEG1Audio; mt.majortype = MEDIATYPE_Audio; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; mt.formattype = FORMAT_None; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.formattype = FORMAT_VideoInfo; hr = IPin_QueryAccept(pin, &mt); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.formattype = FORMAT_WaveFormatEx; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = TRUE; mt.lSampleSize = 123; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); graph = connect_input(filter, filename); /* Connecting input doesn't change the reported media types. */ hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); expect_mt.subtype = MEDIASUBTYPE_MPEG1System; if (hr == S_OK) { @@ -669,21 +669,21 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"Audio", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Audio), "Got major type %s.\n", wine_dbgstr_guid(&pmt->majortype)); todo_wine ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_MPEG1AudioPayload), "Got subtype %s.\n", wine_dbgstr_guid(&pmt->subtype)); todo_wine ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples); ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); - todo_wine ok(pmt->lSampleSize == 1, "Got sample size %lu.\n", pmt->lSampleSize); + todo_wine ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); ok(IsEqualGUID(&pmt->formattype, &FORMAT_WaveFormatEx), "Got format type %s.\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); - todo_wine ok(pmt->cbFormat == sizeof(MPEG1WAVEFORMAT), "Got format size %lu.\n", pmt->cbFormat); + todo_wine ok(pmt->cbFormat == sizeof(MPEG1WAVEFORMAT), "Got format size %u.\n", pmt->cbFormat); if (pmt->cbFormat == sizeof(MPEG1WAVEFORMAT)) { /* Native will sometimes leave junk in the joint stereo flags. */ @@ -692,58 +692,58 @@ static void test_media_types(void) } hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->bFixedSizeSamples = FALSE; pmt->bTemporalCompression = TRUE; pmt->lSampleSize = 123; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Audio; pmt->subtype = MEDIASUBTYPE_MPEG1Audio; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_MPEG1Packet; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_MPEG1Video; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_MPEG1AudioPayload; pmt->formattype = FORMAT_None; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_WaveFormatEx; wfx = (MPEG1WAVEFORMAT *)pmt->pbFormat; wfx->fwHeadLayer = ACM_MPEG_LAYER2; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); wfx->fwHeadLayer = ACM_MPEG_LAYER3; wfx->wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); wfx->wfx.wFormatTag = WAVE_FORMAT_MPEG; CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr != S_OK) goto done; ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Audio), "Got major type %s.\n", @@ -752,80 +752,80 @@ static void test_media_types(void) wine_dbgstr_guid(&pmt->subtype)); ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples); ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); - ok(pmt->lSampleSize == 1, "Got sample size %lu.\n", pmt->lSampleSize); + ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); ok(IsEqualGUID(&pmt->formattype, &FORMAT_WaveFormatEx), "Got format type %s.\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); - ok(pmt->cbFormat == sizeof(MPEG1WAVEFORMAT), "Got format size %lu.\n", pmt->cbFormat); + ok(pmt->cbFormat == sizeof(MPEG1WAVEFORMAT), "Got format size %u.\n", pmt->cbFormat); /* Native will sometimes leave junk in the joint stereo flags. */ expect_wfx.fwHeadModeExt = ((MPEG1WAVEFORMAT *)pmt->pbFormat)->fwHeadModeExt; ok(!memcmp(pmt->pbFormat, &expect_wfx, sizeof(MPEG1WAVEFORMAT)), "Format blocks didn't match.\n"); hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Audio), "Got major type %s.\n", wine_dbgstr_guid(&pmt->majortype)); ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_mp3), "Got subtype %s.\n", wine_dbgstr_guid(&pmt->subtype)); ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples); ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); - ok(pmt->lSampleSize == 1, "Got sample size %lu.\n", pmt->lSampleSize); + ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); ok(IsEqualGUID(&pmt->formattype, &FORMAT_WaveFormatEx), "Got format type %s.\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); - ok(pmt->cbFormat == sizeof(MPEGLAYER3WAVEFORMAT), "Got format size %lu.\n", pmt->cbFormat); + ok(pmt->cbFormat == sizeof(MPEGLAYER3WAVEFORMAT), "Got format size %u.\n", pmt->cbFormat); ok(!memcmp(pmt->pbFormat, &expect_mp3_wfx, sizeof(MPEGLAYER3WAVEFORMAT)), "Format blocks didn't match.\n"); hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->bFixedSizeSamples = FALSE; pmt->bTemporalCompression = TRUE; pmt->lSampleSize = 123; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Video; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Audio; pmt->subtype = MEDIASUBTYPE_MPEG1Audio; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_MPEG1Packet; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_MPEG1Video; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_MPEG1AudioPayload; pmt->formattype = FORMAT_None; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_WaveFormatEx; mp3wfx = (MPEGLAYER3WAVEFORMAT *)pmt->pbFormat; mp3wfx->fdwFlags = MPEGLAYER3_FLAG_PADDING_OFF; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mp3wfx->fdwFlags = MPEGLAYER3_FLAG_PADDING_ISO; mp3wfx->wfx.wFormatTag = WAVE_FORMAT_MPEG; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mp3wfx->wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3; CoTaskMemFree(pmt->pbFormat); @@ -833,16 +833,16 @@ static void test_media_types(void) done: hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_enum_media_types(void) @@ -861,78 +861,78 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"Input", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); - todo_wine ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(count == 2, "Got count %lu.\n", 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 %#lx.\n", hr); - todo_wine ok(count == 2, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 5); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 4); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) CoTaskMemFree(mts[0]); IEnumMediaTypes_Release(enum1); @@ -942,82 +942,82 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"Audio", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); - todo_wine_if(i) ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(count == 2, "Got count %lu.\n", 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 %#lx.\n", hr); - todo_wine ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 4); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 3); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(mts[0]->pbFormat); CoTaskMemFree(mts[0]); @@ -1027,9 +1027,9 @@ static void test_enum_media_types(void) IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_unconnected_filter_state(void) @@ -1040,53 +1040,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -1098,7 +1098,7 @@ struct testfilter const AM_MEDIA_TYPE *mt; HANDLE eos_event; unsigned int sample_count, eos_count, new_segment_count; - REFERENCE_TIME segment_start, segment_end, seek_start, seek_end; + REFERENCE_TIME seek_start, seek_end; }; static inline struct testfilter *impl_from_strmbase_filter(struct strmbase_filter *iface) @@ -1125,21 +1125,10 @@ static void testfilter_destroy(struct strmbase_filter *iface) CloseHandle(filter->eos_event); } -static HRESULT testfilter_init_stream(struct strmbase_filter *iface) -{ - struct testfilter *filter = impl_from_strmbase_filter(iface); - - filter->new_segment_count = 0; - filter->eos_count = 0; - filter->sample_count = 0; - return S_OK; -} - static const struct strmbase_filter_ops testfilter_ops = { .filter_get_pin = testfilter_get_pin, .filter_destroy = testfilter_destroy, - .filter_init_stream = testfilter_init_stream, }; static HRESULT testsource_query_interface(struct strmbase_pin *iface, REFIID iid, void **out) @@ -1166,7 +1155,7 @@ static HRESULT WINAPI testsource_AttemptConnection(struct strmbase_source *iface if (FAILED(hr = IPin_ReceiveConnection(peer, &iface->pin.IPin_iface, mt))) { - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); IPin_Release(peer); iface->pin.peer = NULL; FreeMediaType(&iface->pin.mt); @@ -1221,16 +1210,16 @@ static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample HRESULT hr; hr = IMediaSample_GetTime(sample, &start, &end); - todo_wine_if (hr == VFW_S_NO_STOP_TIME) ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine_if (hr == VFW_S_NO_STOP_TIME) ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_debug > 1) - trace("%04lx: Got sample with timestamps %I64d-%I64d.\n", GetCurrentThreadId(), start, end); + trace("%04x: Got sample with timestamps %I64d-%I64d.\n", GetCurrentThreadId(), start, end); ok(filter->new_segment_count, "Expected NewSegment() before Receive().\n"); IPin_QueryInterface(iface->pin.peer, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetPositions(seeking, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == filter->seek_start, "Expected start position %I64u, got %I64u.\n", filter->seek_start, start); ok(end == filter->seek_end, "Expected end position %I64u, got %I64u.\n", filter->seek_end, end); IMediaSeeking_Release(seeking); @@ -1245,7 +1234,7 @@ static HRESULT testsink_eos(struct strmbase_sink *iface) struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); if (winetest_debug > 1) - trace("%04lx: Got EOS.\n", GetCurrentThreadId()); + trace("%04x: Got EOS.\n", GetCurrentThreadId()); ok(!filter->eos_count, "Got %u EOS events.\n", filter->eos_count + 1); ++filter->eos_count; @@ -1260,19 +1249,13 @@ static HRESULT testsink_new_segment(struct strmbase_sink *iface, IMediaSeeking *seeking; HRESULT hr; - if (winetest_debug > 1) - trace("%04lx: Got segment with timestamps %I64d-%I64d.\n", GetCurrentThreadId(), start, end); - ++filter->new_segment_count; IPin_QueryInterface(iface->pin.peer, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetPositions(seeking, &filter->seek_start, &filter->seek_end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - IMediaSeeking_Release(seeking); - - ok(start == filter->segment_start, "Expected start %I64d, got %I64d.\n", filter->segment_start, start); - ok(end == filter->segment_end, "Expected end %I64d, got %I64d.\n", filter->segment_end, end); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(rate == 1.0, "Got rate %.16e.\n", rate); + IMediaSeeking_Release(seeking); return S_OK; } @@ -1373,7 +1356,6 @@ static void testfilter_init(struct testfilter *filter) strmbase_sink_init(&filter->sink, &filter->filter, L"sink", &testsink_ops, NULL); filter->IAsyncReader_iface.lpVtbl = &async_reader_vtbl; filter->eos_event = CreateEventW(NULL, FALSE, FALSE, NULL); - filter->segment_end = 5392500; } static void test_connect_pin(void) @@ -1421,48 +1403,48 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(sink, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Video; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Stream; req_mt.subtype = MEDIASUBTYPE_RGB8; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_MPEG1Audio; hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(sink, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsource.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(sink, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsource.source.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Test source connection. */ @@ -1470,11 +1452,11 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(source, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); /* Exact connection. */ @@ -1484,71 +1466,71 @@ static void test_connect_pin(void) CopyMediaType(&req_mt, source_mt); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(source, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &testsink.sink.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(source, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, source); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsink.sink.pin.peer == source, "Got peer %p.\n", testsink.sink.pin.peer); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.lSampleSize = 999; req_mt.bTemporalCompression = req_mt.bFixedSizeSamples = TRUE; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = MEDIATYPE_Stream; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Audio; req_mt.subtype = MEDIASUBTYPE_PCM; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_MPEG1AudioPayload; /* Connection with wildcards. */ hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); @@ -1556,24 +1538,24 @@ static void test_connect_pin(void) req_mt.subtype = MEDIASUBTYPE_PCM; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Audio; req_mt.subtype = MEDIASUBTYPE_MPEG1AudioPayload; req_mt.formattype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); @@ -1581,38 +1563,38 @@ static void test_connect_pin(void) req_mt.subtype = MEDIASUBTYPE_PCM; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.subtype = GUID_NULL; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&testsink.sink.pin.mt, source_mt), "Media types didn't match.\n"); IFilterGraph2_Disconnect(graph, source); IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); req_mt.majortype = MEDIATYPE_Stream; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); /* Test enumeration of sink media types. */ testsink.mt = &req_mt; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); req_mt.majortype = MEDIATYPE_Audio; req_mt.subtype = MEDIASUBTYPE_MPEG1AudioPayload; req_mt.formattype = FORMAT_WaveFormatEx; req_mt.lSampleSize = 444; hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); IPin_Release(source); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, sink); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(testsource.source.pin.peer == sink, "Got peer %p.\n", testsource.source.pin.peer); IFilterGraph2_Disconnect(graph, &testsource.source.pin.IPin_iface); @@ -1624,17 +1606,17 @@ static void test_connect_pin(void) IPin_Release(sink); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(reader); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsource.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_seeking(void) @@ -1674,121 +1656,121 @@ static void test_seeking(void) IPin_QueryInterface(pin, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards | AM_SEEKING_CanSeekBackwards | AM_SEEKING_CanGetStopPos - | AM_SEEKING_CanGetDuration), "Got caps %#lx.\n", caps); + | AM_SEEKING_CanGetDuration), "Got caps %#x.\n", caps); caps = AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards), "Got caps %#lx.\n", caps); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards), "Got caps %#x.\n", caps); caps = AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanSeekAbsolute, "Got caps %#lx.\n", caps); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanSeekAbsolute, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); caps = 0; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); for (i = 0; i < ARRAY_SIZE(format_tests); ++i) { hr = IMediaSeeking_IsFormatSupported(seeking, format_tests[i].guid); - ok(hr == format_tests[i].hr, "Got hr %#lx for format %s.\n", + ok(hr == format_tests[i].hr, "Got hr %#x for format %s.\n", hr, wine_dbgstr_guid(format_tests[i].guid)); } hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_SAMPLE); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_FRAME); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); duration = 0; hr = IMediaSeeking_GetDuration(seeking, &duration); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(duration == 5392500, "Got duration %I64d.\n", duration); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetStopPosition(seeking, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(stop == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(stop)); hr = IMediaSeeking_GetCurrentPosition(seeking, ¤t); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(stop)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 0x123456789a, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); earliest = latest = 0xdeadbeef; hr = IMediaSeeking_GetAvailable(seeking, &earliest, &latest); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!earliest, "Got time %s.\n", wine_dbgstr_longlong(earliest)); ok(latest == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(latest)); rate = 0; hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(rate == 1.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_SetRate(seeking, 200.0); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); rate = 0; hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(rate == 200.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_SetRate(seeking, -1.0); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPreroll(seeking, &time); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); current = 200 * 10000; stop = 400 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 400 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 400 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -1796,7 +1778,7 @@ static void test_seeking(void) stop = 400 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 400 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -1804,18 +1786,18 @@ static void test_seeking(void) stop = 200 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 100 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); current = 50 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 50 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -1823,9 +1805,9 @@ static void test_seeking(void) IPin_Release(pin); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_streaming(void) @@ -1849,32 +1831,33 @@ static void test_streaming(void) IPin_QueryInterface(source, &IID_IMediaSeeking, (void **)&seeking); hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Expected timeout.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); ok(testsink.sample_count, "Expected at least one sample.\n"); + testsink.sample_count = testsink.eos_count = 0; hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); ok(testsink.sample_count, "Expected at least one sample.\n"); - testsink.new_segment_count = testsink.sample_count = testsink.eos_count = 0; - testsink.segment_start = 100 * 10000; - testsink.segment_end = 300 * 10000; - hr = IMediaSeeking_SetPositions(seeking, &testsink.segment_start, AM_SEEKING_AbsolutePositioning, - &testsink.segment_end, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + testsink.sample_count = testsink.eos_count = 0; + start = 100 * 10000; + end = 300 * 10000; + hr = IMediaSeeking_SetPositions(seeking, &start, AM_SEEKING_AbsolutePositioning, + &end, AM_SEEKING_AbsolutePositioning); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); @@ -1882,14 +1865,15 @@ static void test_streaming(void) start = end = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == testsink.seek_start, "Expected start position %I64u, got %I64u.\n", testsink.seek_start, start); ok(end == testsink.seek_end, "Expected end position %I64u, got %I64u.\n", testsink.seek_end, end); + testsink.sample_count = testsink.eos_count = 0; hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(testsink.eos_event, 1000), "Did not receive EOS.\n"); ok(WaitForSingleObject(testsink.eos_event, 100) == WAIT_TIMEOUT, "Got more than one EOS.\n"); @@ -1897,7 +1881,7 @@ static void test_streaming(void) start = end = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, &start, &end); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(start == testsink.seek_start, "Expected start position %I64u, got %I64u.\n", testsink.seek_start, start); ok(end == testsink.seek_end, "Expected end position %I64u, got %I64u.\n", testsink.seek_end, end); @@ -1905,13 +1889,13 @@ static void test_streaming(void) IPin_Release(source); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_large_file(void) @@ -1949,17 +1933,17 @@ static void test_large_file(void) duration = 0xdeadbeef; hr = IMediaSeeking_GetDuration(seeking, &duration); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(duration == 2400 * 10000000ull, "Got duration %I64d.\n", duration); IMediaSeeking_Release(seeking); IPin_Release(source); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(path); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } START_TEST(mpegsplit) diff --git a/dlls/quartz/tests/passthrough.c b/dlls/quartz/tests/passthrough.c index 0e542d1733a..ce7365928e5 100644 --- wine/dlls/quartz/tests/passthrough.c +++ wine/dlls/quartz/tests/passthrough.c @@ -74,53 +74,53 @@ static void test_aggregation(void) passthrough = (ISeekingPassThru *)0xdeadbeef; hr = CoCreateInstance(&CLSID_SeekingPassThru, &test_outer, CLSCTX_INPROC_SERVER, &IID_ISeekingPassThru, (void **)&passthrough); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!passthrough, "Got interface %p.\n", passthrough); hr = CoCreateInstance(&CLSID_SeekingPassThru, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_ISeekingPassThru, (void **)&passthrough); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ISeekingPassThru_QueryInterface(passthrough, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = ISeekingPassThru_QueryInterface(passthrough, &IID_ISeekingPassThru, (void **)&passthrough2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(passthrough2 == (ISeekingPassThru *)0xdeadbeef, "Got unexpected ISeekingPassThru %p.\n", passthrough2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = ISeekingPassThru_QueryInterface(passthrough, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); ISeekingPassThru_Release(passthrough); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } START_TEST(passthrough) diff --git a/dlls/quartz/tests/systemclock.c b/dlls/quartz/tests/systemclock.c index 65bc406f35f..3b39d2aadb4 100644 --- wine/dlls/quartz/tests/systemclock.c +++ wine/dlls/quartz/tests/systemclock.c @@ -27,7 +27,7 @@ static IReferenceClock *create_system_clock(void) IReferenceClock *clock = NULL; HRESULT hr = CoCreateInstance(&CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (void **)&clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return clock; } @@ -48,7 +48,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -64,7 +64,7 @@ static void test_interfaces(void) check_interface(clock, &IID_IDirectDraw, FALSE); ref = IReferenceClock_Release(clock); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static const GUID test_iid = {0x33333333}; @@ -112,53 +112,53 @@ static void test_aggregation(void) clock = (IReferenceClock *)0xdeadbeef; hr = CoCreateInstance(&CLSID_SystemClock, &test_outer, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (void **)&clock); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!clock, "Got interface %p.\n", clock); hr = CoCreateInstance(&CLSID_SystemClock, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IReferenceClock, (void **)&clock); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IReferenceClock_QueryInterface(clock, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IReferenceClock_QueryInterface(clock, &IID_IReferenceClock, (void **)&clock2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(clock2 == (IReferenceClock *)0xdeadbeef, "Got unexpected IReferenceClock %p.\n", clock2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IReferenceClock_QueryInterface(clock, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IReferenceClock_Release(clock); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_get_time(void) @@ -169,17 +169,17 @@ static void test_get_time(void) ULONG ref; hr = IReferenceClock_GetTime(clock, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IReferenceClock_GetTime(clock, &time1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time1 % 10000 == 0, "Expected no less than 1ms coarseness, but got time %s.\n", wine_dbgstr_longlong(time1)); ticks = (REFERENCE_TIME)timeGetTime() * 10000; hr = IReferenceClock_GetTime(clock, &time2); - ok(hr == (time2 == time1 ? S_FALSE : S_OK), "Got hr %#lx.\n", hr); + ok(hr == (time2 == time1 ? S_FALSE : S_OK), "Got hr %#x.\n", hr); ok(time2 % 10000 == 0, "Expected no less than 1ms coarseness, but got time %s.\n", wine_dbgstr_longlong(time1)); @@ -187,12 +187,12 @@ static void test_get_time(void) Sleep(100); hr = IReferenceClock_GetTime(clock, &time2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time2 - time1 > 80 * 10000, "Expected about %s, but got %s.\n", wine_dbgstr_longlong(time1 + 80 * 10000), wine_dbgstr_longlong(time2)); ref = IReferenceClock_Release(clock); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_advise(void) @@ -209,72 +209,72 @@ static void test_advise(void) semaphore = CreateSemaphoreA(NULL, 0, 10, NULL); hr = IReferenceClock_GetTime(clock, ¤t); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); hr = IReferenceClock_AdviseTime(clock, current, 500 * 10000, (HEVENT)event, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IReferenceClock_AdviseTime(clock, -1000 * 10000, 500 * 10000, (HEVENT)event, &cookie); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IReferenceClock_AdviseTime(clock, current, 500 * 10000, (HEVENT)event, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 460) == WAIT_TIMEOUT, "Event should not be signaled.\n"); ok(!WaitForSingleObject(event, 80), "Event should be signaled.\n"); hr = IReferenceClock_Unadvise(clock, cookie); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ResetEvent(event); hr = IReferenceClock_GetTime(clock, ¤t); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); hr = IReferenceClock_AdviseTime(clock, current, 500 * 10000, (HEVENT)event, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IReferenceClock_Unadvise(clock, cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 540) == WAIT_TIMEOUT, "Event should not be signaled.\n"); ResetEvent(event); hr = IReferenceClock_GetTime(clock, ¤t); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); hr = IReferenceClock_AdviseTime(clock, current + 500 * 10000, 0, (HEVENT)event, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(event, 460) == WAIT_TIMEOUT, "Event should not be signaled.\n"); ok(!WaitForSingleObject(event, 80), "Event should be signaled.\n"); hr = IReferenceClock_GetTime(clock, ¤t); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); hr = IReferenceClock_AdvisePeriodic(clock, current, 500 * 10000, (HSEMAPHORE)semaphore, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IReferenceClock_AdvisePeriodic(clock, current, 0, (HSEMAPHORE)semaphore, &cookie); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IReferenceClock_AdvisePeriodic(clock, current, -500 * 10000, (HSEMAPHORE)semaphore, &cookie); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IReferenceClock_AdvisePeriodic(clock, -500 * 10000, 1000 * 10000, (HSEMAPHORE)semaphore, &cookie); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IReferenceClock_AdvisePeriodic(clock, current, 100 * 10000, (HSEMAPHORE)semaphore, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!WaitForSingleObject(semaphore, 50), "Semaphore should be signaled.\n"); for (i = 0; i < 5; ++i) ok(!WaitForSingleObject(semaphore, 500), "Semaphore should be signaled.\n"); hr = IReferenceClock_Unadvise(clock, cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(semaphore, 200) == WAIT_TIMEOUT, "Semaphore should not be signaled.\n"); ResetEvent(event); hr = IReferenceClock_GetTime(clock, ¤t); - ok(SUCCEEDED(hr), "Got hr %#lx.\n", hr); + ok(SUCCEEDED(hr), "Got hr %#x.\n", hr); hr = IReferenceClock_AdviseTime(clock, current, 500 * 10000, (HEVENT)event, &cookie); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IReferenceClock_Release(clock); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n"); diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c index c76dae15e91..5625971426b 100644 --- wine/dlls/quartz/tests/videorenderer.c +++ wine/dlls/quartz/tests/videorenderer.c @@ -20,7 +20,6 @@ #define COBJMACROS #include "dshow.h" -#include "videoacc.h" #include "wine/strmbase.h" #include "wine/test.h" @@ -29,7 +28,7 @@ static IBaseFilter *create_video_renderer(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -44,7 +43,7 @@ static IFilterGraph2 *create_graph(void) IFilterGraph2 *ret; HRESULT hr; hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); return ret; } @@ -65,7 +64,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -90,7 +89,6 @@ static void test_interfaces(void) check_interface(filter, &IID_IVideoWindow, TRUE); check_interface(filter, &IID_IAMFilterMiscFlags, FALSE); - check_interface(filter, &IID_IAMVideoAccelerator, FALSE); check_interface(filter, &IID_IBasicAudio, FALSE); check_interface(filter, &IID_IDispatch, FALSE); check_interface(filter, &IID_IOverlay, FALSE); @@ -107,7 +105,6 @@ static void test_interfaces(void) todo_wine check_interface(pin, &IID_IQualityControl, TRUE); check_interface(pin, &IID_IUnknown, TRUE); - check_interface(pin, &IID_IAMVideoAccelerator, FALSE); check_interface(pin, &IID_IAsyncReader, FALSE); check_interface(pin, &IID_IMediaPosition, FALSE); check_interface(pin, &IID_IMediaSeeking, FALSE); @@ -161,53 +158,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_VideoRenderer, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_VideoRenderer, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -220,85 +217,85 @@ static void test_enum_pins(void) ULONG ref; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -310,23 +307,23 @@ static void test_find_pin(void) ULONG ref; hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -340,38 +337,39 @@ static void test_pin_info(void) IPin *pin; hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); - ok(!wcscmp(info.achName, L"Input"), "Got name %s.\n", debugstr_w(info.achName)); +todo_wine + ok(!wcscmp(info.achName, L"Input"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"In"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_media_types(void) @@ -400,10 +398,10 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); @@ -416,30 +414,30 @@ static void test_media_types(void) { req_mt.subtype = *subtype_tests[i]; hr = IPin_QueryAccept(pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); + ok(hr == S_OK, "Got hr %#x for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); } req_mt.subtype = MEDIASUBTYPE_NULL; hr = IPin_QueryAccept(pin, &req_mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_enum_media_types(void) @@ -454,36 +452,36 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -715,36 +713,36 @@ static void test_allocator(IMemInputPin *input) HRESULT hr; hr = IMemInputPin_GetAllocatorRequirements(input, &props); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_GetProperties(ret_allocator, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.cBuffers, "Got %ld buffers.\n", props.cBuffers); - ok(!props.cbBuffer, "Got size %ld.\n", props.cbBuffer); - ok(!props.cbAlign, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.cBuffers, "Got %d buffers.\n", props.cBuffers); + ok(!props.cbBuffer, "Got size %d.\n", props.cbBuffer); + ok(!props.cbAlign, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); hr = IMemInputPin_NotifyAllocator(input, ret_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(ret_allocator); } hr = IMemInputPin_NotifyAllocator(input, NULL, TRUE); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&req_allocator); hr = IMemInputPin_NotifyAllocator(input, req_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(ret_allocator == req_allocator, "Allocators didn't match.\n"); IMemAllocator_Release(req_allocator); @@ -762,9 +760,9 @@ static DWORD WINAPI frame_thread(void *arg) struct frame_thread_params *params = arg; HRESULT hr; - if (winetest_debug > 1) trace("%04lx: Sending frame.\n", GetCurrentThreadId()); + if (winetest_debug > 1) trace("%04x: Sending frame.\n", GetCurrentThreadId()); hr = IMemInputPin_Receive(params->sink, params->sample); - if (winetest_debug > 1) trace("%04lx: Returned %#lx.\n", GetCurrentThreadId(), hr); + if (winetest_debug > 1) trace("%04x: Returned %#x.\n", GetCurrentThreadId(), hr); IMediaSample_Release(params->sample); free(params); return hr; @@ -781,25 +779,25 @@ static HANDLE send_frame_time(IMemInputPin *sink, REFERENCE_TIME start_time, uns BYTE *data; hr = IMemInputPin_GetAllocator(sink, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(data, color, 32 * 16 * 2); hr = IMediaSample_SetActualDataLength(sample, 32 * 16 * 2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start_time *= 10000000; end_time = start_time + 10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetPreroll(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); params->sink = sink; params->sample = sample; @@ -834,129 +832,129 @@ static void test_filter_state(IMemInputPin *input, IMediaControl *control) thread = send_frame(input); hr = join_thread(thread); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); /* The renderer is not fully paused until it receives a sample. The thread * sending the sample blocks in IMemInputPin_Receive() until the filter is * stopped or run. */ hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* The sink will decommit our allocator for us when stopping, and recommit * it when pausing. */ hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - todo_wine ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); if (hr == S_OK) IMediaSample_Release(sample); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -968,54 +966,54 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IMediaControl *control HRESULT hr; hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); thread = send_frame(input); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* We dropped the sample we were holding, so now we need a new one... */ hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void test_sample_time(IBaseFilter *filter, IPin *pin, IMemInputPin *input, IMediaControl *control) @@ -1029,32 +1027,32 @@ static void test_sample_time(IBaseFilter *filter, IPin *pin, IMemInputPin *input IBaseFilter_QueryInterface(filter, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == 0xdeadbeef, "Got hr %#lx.\n", hr); + ok(hr == 0xdeadbeef, "Got hr %#x.\n", hr); thread = send_frame_time(input, 1, 0x11); /* dark blue */ hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetCurrentPosition(seeking, &time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 10000000, "Got time %s.\n", wine_dbgstr_longlong(time)); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 500) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Sample time is relative to the time passed to Run(). Thus a sample * stamped at or earlier than 1s will now be displayed immediately, because @@ -1066,38 +1064,38 @@ static void test_sample_time(IBaseFilter *filter, IPin *pin, IMemInputPin *input * are marked as discontinuous. */ hr = join_thread(send_frame_time(input, 1, 0x22)); /* dark green */ - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame_time(input, 0, 0x33)); /* light green */ - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame_time(input, -2, 0x44)); /* dark red */ - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame_time(input, 2, 0x66); /* orange */ ok(WaitForSingleObject(thread, 500) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame_time(input, 1000000, 0xff); /* white */ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); /* If the frame makes it to Receive() in time to be rendered, we get S_OK. */ - ok(hr == S_OK || hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == S_OK || hr == E_FAIL, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame_time(input, 1000000, 0xff); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); /* If the frame makes it to Receive() in time to be rendered, we get S_OK. */ - ok(hr == S_OK || hr == E_FAIL, "Got hr %#lx.\n", hr); + ok(hr == S_OK || hr == E_FAIL, "Got hr %#x.\n", hr); IMediaSeeking_Release(seeking); } @@ -1113,14 +1111,14 @@ static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG { if (code == expected_code) { - ok(param1 == expected1, "Got param1 %#Ix.\n", param1); - ok(param2 == expected2, "Got param2 %#Ix.\n", param2); + ok(param1 == expected1, "Got param1 %#lx.\n", param1); + ok(param2 == expected2, "Got param2 %#lx.\n", param2); ret++; } IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); timeout = 0; } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); return ret; } @@ -1140,28 +1138,28 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) IMediaControl_QueryInterface(control, &IID_IMediaEvent, (void **)&eventsrc); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = join_thread(send_frame(input)); - todo_wine ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_UNEXPECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Expected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -1169,73 +1167,73 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) * done rendering. */ hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); ret = check_ec_complete(eventsrc, 1600); todo_wine ok(ret == 1, "Expected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); /* Test sending EOS while flushing. */ hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); /* Test sending EOS and then flushing or stopping. */ hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -1257,43 +1255,43 @@ static void test_current_image(IBaseFilter *filter, IMemInputPin *input, IBaseFilter_QueryInterface(filter, &IID_IBasicVideo, (void **)&video); hr = IBasicVideo_GetCurrentImage(video, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetCurrentImage(video, NULL, buffer); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); size = 0xdeadbeef; hr = IBasicVideo_GetCurrentImage(video, &size, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2, "Got size %ld.\n", size); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2, "Got size %d.\n", size); size = 0xdeadbeef; hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == VFW_E_NOT_PAUSED, "Got hr %#lx.\n", hr); - ok(size == 0xdeadbeef, "Got size %ld.\n", size); + ok(hr == VFW_E_NOT_PAUSED, "Got hr %#x.\n", hr); + ok(size == 0xdeadbeef, "Got size %d.\n", size); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); size = 0xdeadbeef; hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); - ok(size == 0xdeadbeef, "Got size %ld.\n", size); + ok(hr == E_UNEXPECTED, "Got hr %#x.\n", hr); + ok(size == 0xdeadbeef, "Got size %d.\n", size); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); size = sizeof(BITMAPINFOHEADER) + 32 * 16 * 2 - 1; hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == E_OUTOFMEMORY, "Got hr %#lx.\n", hr); - ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2 - 1, "Got size %ld.\n", size); + ok(hr == E_OUTOFMEMORY, "Got hr %#x.\n", hr); + ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2 - 1, "Got size %d.\n", size); size = sizeof(BITMAPINFOHEADER) + 32 * 16 * 2; memset(buffer, 0xcc, sizeof(buffer)); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2, "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 2, "Got size %d.\n", size); ok(!memcmp(bih, expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); for (i = 0; i < 32 * 16 * 2; ++i) { @@ -1302,14 +1300,14 @@ static void test_current_image(IBaseFilter *filter, IMemInputPin *input, } hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); join_thread(thread); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == VFW_E_NOT_PAUSED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_PAUSED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IBasicVideo_Release(video); } @@ -1333,18 +1331,18 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IOverlay_Release(overlay); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); SendMessageW(hwnd, WM_CLOSE, 0, 0); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(ret == 1, "Expected EC_USERABORT.\n"); @@ -1357,28 +1355,28 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con if (ret == WAIT_OBJECT_0) { GetExitCodeThread(thread, (DWORD *)&hr); - ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); + ok(hr == E_UNEXPECTED, "Got hr %#x.\n", hr); } CloseHandle(thread); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); /* We receive an EC_USERABORT notification immediately. */ hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1391,7 +1389,7 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con ok(!IsWindowVisible(hwnd), "Window should be visible.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1449,52 +1447,52 @@ static void test_connect_pin(void) { req_mt.subtype = *subtype_tests[i]; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); + ok(hr == S_OK, "Got hr %#x for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } req_mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.formattype = FORMAT_VideoInfo; peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(pin, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &source.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); @@ -1502,17 +1500,17 @@ static void test_connect_pin(void) hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemInputPin_NotifyAllocator(input, allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_ReceiveCanBlock(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_filter_state(input, control); test_flushing(pin, input, control); @@ -1522,31 +1520,31 @@ static void test_connect_pin(void) test_window_close(pin, input, control); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source.source.pin.peer == pin, "Got peer %p.\n", peer); IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ref = IMemAllocator_Release(allocator); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMemInputPin_Release(input); IPin_Release(pin); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -1557,53 +1555,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_overlay(void) @@ -1618,17 +1616,17 @@ static void test_overlay(void) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hwnd = (HWND)0xdeadbeef; hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(hwnd && hwnd != (HWND)0xdeadbeef, "Got invalid window %p.\n", hwnd); IOverlay_Release(overlay); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } /* try to make sure pending X events have been processed before continuing */ @@ -1652,7 +1650,7 @@ static void flush_events(void) static LRESULT CALLBACK window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { if (winetest_debug > 1) - trace("hwnd %p, msg %#x, wparam %#Ix, lparam %#Ix.\n", hwnd, msg, wparam, lparam); + trace("hwnd %p, msg %#x, wparam %#lx, lparam %#lx.\n", hwnd, msg, wparam, lparam); if (wparam == 0xdeadbeef) return 0; @@ -1667,7 +1665,7 @@ static void test_video_window_caption(IVideoWindow *window, HWND hwnd) HRESULT hr; hr = IVideoWindow_get_Caption(window, &caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(caption, L"ActiveMovie Window"), "Got caption %s.\n", wine_dbgstr_w(caption)); SysFreeString(caption); @@ -1676,11 +1674,11 @@ static void test_video_window_caption(IVideoWindow *window, HWND hwnd) caption = SysAllocString(L"foo"); hr = IVideoWindow_put_Caption(window, caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SysFreeString(caption); hr = IVideoWindow_get_Caption(window, &caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(caption, L"foo"), "Got caption %s.\n", wine_dbgstr_w(caption)); SysFreeString(caption); @@ -1694,53 +1692,53 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw LONG style; hr = IVideoWindow_get_WindowStyle(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), - "Got style %#lx.\n", style); + "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_STYLE); ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), - "Got style %#lx.\n", style); + "Got style %#x.\n", style); hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_HSCROLL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_VSCROLL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_MAXIMIZE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_MINIMIZE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style & ~WS_CLIPCHILDREN); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyle(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#lx.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_get_WindowStyleEx(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == WS_EX_WINDOWEDGE, "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_EXSTYLE); - ok(style == WS_EX_WINDOWEDGE, "Got style %#lx.\n", style); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); hr = IVideoWindow_put_WindowStyleEx(window, style | WS_EX_TRANSPARENT); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyleEx(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_EXSTYLE); - ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#lx.\n", style); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); } static BOOL CALLBACK top_window_cb(HWND hwnd, LPARAM ctx) @@ -1771,25 +1769,25 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1799,14 +1797,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(top == hwnd, "Got top window %p.\n", top); hr = IVideoWindow_put_WindowState(window, SW_MINIMIZE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_MINIMIZE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MINIMIZE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(IsIconic(hwnd), "Window should be minimized.\n"); @@ -1814,14 +1812,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_RESTORE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1829,14 +1827,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_MAXIMIZE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_MAXIMIZE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MAXIMIZE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should be minimized.\n"); @@ -1844,17 +1842,17 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_RESTORE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowState(window, SW_HIDE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1862,14 +1860,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_Visible(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1877,14 +1875,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1892,14 +1890,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_SetWindowForeground(window, TRUE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_SetWindowForeground(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -1907,7 +1905,7 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(top == hwnd, "Got top window %p.\n", top); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -1916,7 +1914,7 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == our_hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == our_hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -1938,114 +1936,114 @@ static void test_video_window_position(IVideoWindow *window, HWND hwnd, HWND our expect_height = rect.bottom - rect.top; hr = IVideoWindow_put_Left(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Top(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == expect_height, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == expect_height, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 0, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == expect_height, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 0, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_put_Left(window, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == expect_height, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == expect_height, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 10, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == 10 + expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == expect_height, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_put_Height(window, 200); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == 200, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 200, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == 200, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == 200, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 10, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == 10 + expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == 200, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == 200, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_SetWindowPosition(window, 100, 200, 300, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 100, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 200, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 200, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 300, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 300, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 400, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 100, "Got left %ld.\n", left); - ok(top == 200, "Got top %ld.\n", top); - ok(width == 300, "Got width %ld.\n", width); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); + ok(top == 200, "Got top %d.\n", top); + ok(width == 300, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 100, "Got window left %ld.\n", rect.left); - ok(rect.top == 200, "Got window top %ld.\n", rect.top); - ok(rect.right == 400, "Got window right %ld.\n", rect.right); - ok(rect.bottom == 600, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 100, "Got window left %d.\n", rect.left); + ok(rect.top == 200, "Got window top %d.\n", rect.top); + ok(rect.right == 400, "Got window right %d.\n", rect.right); + ok(rect.bottom == 600, "Got window bottom %d.\n", rect.bottom); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); @@ -2062,25 +2060,25 @@ static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(!(style & WS_CHILD), "Got style %#lx.\n", style); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == our_hwnd, "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok((style & WS_CHILD), "Got style %#lx.\n", style); + ok((style & WS_CHILD), "Got style %#x.\n", style); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); @@ -2089,31 +2087,31 @@ static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hw ShowWindow(our_hwnd, SW_HIDE); hr = IVideoWindow_put_Visible(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OAFALSE, "Got state %d.\n", state); hr = IVideoWindow_put_Owner(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(!(style & WS_CHILD), "Got style %#lx.\n", style); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); ok(top_hwnd == hwnd, "Got top window %p.\n", top_hwnd); hr = IVideoWindow_get_Visible(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OATRUE, "Got state %d.\n", state); } struct notify_message_params @@ -2127,7 +2125,7 @@ static DWORD CALLBACK notify_message_proc(void *arg) { const struct notify_message_params *params = arg; HRESULT hr = IVideoWindow_NotifyOwnerMessage(params->window, (OAHWND)params->hwnd, params->message, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return 0; } @@ -2170,15 +2168,15 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our flush_events(); hr = IVideoWindow_get_MessageDrain(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got window %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got window %#lx.\n", oahwnd); hr = IVideoWindow_put_MessageDrain(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_MessageDrain(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(oahwnd == (OAHWND)our_hwnd, "Got window %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got window %#lx.\n", oahwnd); for (i = 0; i < ARRAY_SIZE(drain_tests); ++i) { @@ -2187,8 +2185,8 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our ok(ret, "Expected a message.\n"); ok(msg.hwnd == our_hwnd, "Got hwnd %p.\n", msg.hwnd); ok(msg.message == drain_tests[i], "Got message %#x.\n", msg.message); - ok(msg.wParam == 0xdeadbeef, "Got wparam %#Ix.\n", msg.wParam); - ok(!msg.lParam, "Got lparam %#Ix.\n", msg.lParam); + ok(msg.wParam == 0xdeadbeef, "Got wparam %#lx.\n", msg.wParam); + ok(!msg.lParam, "Got lparam %#lx.\n", msg.lParam); DispatchMessageA(&msg); ret = PeekMessageA(&msg, 0, drain_tests[i], drain_tests[i], PM_REMOVE); @@ -2196,10 +2194,10 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_put_MessageDrain(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); flush_events(); @@ -2208,7 +2206,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our * posted all messages. */ hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SYSCOLORCHANGE, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { @@ -2217,7 +2215,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_FONTCHANGE, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { @@ -2254,7 +2252,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_put_Owner(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *graph, HWND hwnd) @@ -2266,41 +2264,41 @@ static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *grap IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); hr = IVideoWindow_get_AutoShow(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IVideoWindow_put_AutoShow(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OAFALSE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OAFALSE, "Got %d.\n", l); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaControl_Release(control); } @@ -2354,36 +2352,36 @@ static void test_video_window(void) IBaseFilter_FindPin(filter, L"In", &pin); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_debug > 1) trace("ours %p, theirs %p\n", our_hwnd, hwnd); GetWindowRect(hwnd, &rect); tid = GetWindowThreadProcessId(hwnd, NULL); - ok(tid == GetCurrentThreadId(), "Expected tid %#lx, got %#lx.\n", GetCurrentThreadId(), tid); + ok(tid == GetCurrentThreadId(), "Expected tid %#x, got %#x.\n", GetCurrentThreadId(), tid); hr = IBaseFilter_QueryInterface(filter, &IID_IVideoWindow, (void **)&window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Caption(window, &caption); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyle(window, &l); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IVideoWindow_get_AutoShow(window, &l); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); testfilter_init(&source); IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, NULL); IFilterGraph2_AddFilter(graph, filter, NULL); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); @@ -2396,29 +2394,29 @@ static void test_video_window(void) test_video_window_messages(window, hwnd, our_hwnd); hr = IVideoWindow_put_FullScreenMode(window, OATRUE); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IVideoWindow_get_FullScreenMode(window, &l); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 640, "Got width %ld.\n", width); - ok(height == 480, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 640, "Got width %d.\n", width); + ok(height == 480, "Got height %d.\n", height); hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 640, "Got width %ld.\n", width); - ok(height == 480, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 640, "Got width %d.\n", width); + ok(height == 480, "Got height %d.\n", height); IFilterGraph2_Release(graph); IVideoWindow_Release(window); IOverlay_Release(overlay); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(our_hwnd); } @@ -2430,31 +2428,31 @@ static void check_source_position_(int line, IBasicVideo *video, left = top = width = height = 0xdeadbeef; hr = IBasicVideo_GetSourcePosition(video, &left, &top, &width, &height); - ok_(__FILE__,line)(hr == S_OK, "Got hr %#lx.\n", hr); - ok_(__FILE__,line)(left == expect_left, "Got left %ld.\n", left); - ok_(__FILE__,line)(top == expect_top, "Got top %ld.\n", top); - ok_(__FILE__,line)(width == expect_width, "Got width %ld.\n", width); - ok_(__FILE__,line)(height == expect_height, "Got height %ld.\n", height); + ok_(__FILE__,line)(hr == S_OK, "Got hr %#x.\n", hr); + ok_(__FILE__,line)(left == expect_left, "Got left %d.\n", left); + ok_(__FILE__,line)(top == expect_top, "Got top %d.\n", top); + ok_(__FILE__,line)(width == expect_width, "Got width %d.\n", width); + ok_(__FILE__,line)(height == expect_height, "Got height %d.\n", height); l = 0xdeadbeef; hr = IBasicVideo_get_SourceLeft(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == left, "Got left %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#x.\n", hr); + ok_(__FILE__,line)(l == left, "Got left %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceTop(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == top, "Got top %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#x.\n", hr); + ok_(__FILE__,line)(l == top, "Got top %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceWidth(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == width, "Got width %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#x.\n", hr); + ok_(__FILE__,line)(l == width, "Got width %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceHeight(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == height, "Got height %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#x.\n", hr); + ok_(__FILE__,line)(l == height, "Got height %d.\n", l); } #define check_source_position(a,b,c,d,e) check_source_position_(__LINE__,a,b,c,d,e) @@ -2464,77 +2462,77 @@ static void test_basic_video_source(IBasicVideo *video) check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, 10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, 10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, -500); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 700); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 500, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, -300); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 600); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 10, 0, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, 20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 10, 20, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 4, 5, 60, 40); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 0, 0, 600, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDefaultSourcePosition(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void check_destination_position_(int line, IBasicVideo *video, @@ -2545,31 +2543,31 @@ static void check_destination_position_(int line, IBasicVideo *video, left = top = width = height = 0xdeadbeef; hr = IBasicVideo_GetDestinationPosition(video, &left, &top, &width, &height); - ok_(__FILE__,line)(hr == S_OK, "Failed to get position, hr %#lx.\n", hr); - ok_(__FILE__,line)(left == expect_left, "Got left %ld.\n", left); - ok_(__FILE__,line)(top == expect_top, "Got top %ld.\n", top); - ok_(__FILE__,line)(width == expect_width, "Got width %ld.\n", width); - ok_(__FILE__,line)(height == expect_height, "Got height %ld.\n", height); + ok_(__FILE__,line)(hr == S_OK, "Failed to get position, hr %#x.\n", hr); + ok_(__FILE__,line)(left == expect_left, "Got left %d.\n", left); + ok_(__FILE__,line)(top == expect_top, "Got top %d.\n", top); + ok_(__FILE__,line)(width == expect_width, "Got width %d.\n", width); + ok_(__FILE__,line)(height == expect_height, "Got height %d.\n", height); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationLeft(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == left, "Got left %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#x.\n", hr); + ok_(__FILE__,line)(l == left, "Got left %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationTop(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == top, "Got top %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#x.\n", hr); + ok_(__FILE__,line)(l == top, "Got top %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationWidth(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == width, "Got width %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#x.\n", hr); + ok_(__FILE__,line)(l == width, "Got width %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationHeight(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == height, "Got height %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#x.\n", hr); + ok_(__FILE__,line)(l == height, "Got height %d.\n", l); } #define check_destination_position(a,b,c,d,e) check_destination_position_(__LINE__,a,b,c,d,e) @@ -2583,107 +2581,107 @@ static void test_basic_video_destination(IBasicVideo *video) check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationLeft(video, -10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, -10, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationLeft(video, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationTop(video, -20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, -20, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationTop(video, 20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, -700); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 700); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 700, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, -500); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 500); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 4, 5, 60, 40); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 0, 0, 600, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDefaultDestinationPosition(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&rect, 100, 200, 500, 500); AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); hr = IVideoWindow_SetWindowPosition(window, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 0, 0, 400, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); SetRect(&rect, 100, 200, 600, 600); AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); hr = IVideoWindow_SetWindowPosition(window, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IVideoWindow_Release(window); } @@ -2728,127 +2726,127 @@ static void test_basic_video(void) IBaseFilter_FindPin(filter, L"In", &pin); hr = IBasicVideo_GetTypeInfoCount(video, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count == 1, "Got count %u.\n", count); hr = IBasicVideo_GetTypeInfo(video, 0, 0, &typeinfo); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(typeattr->typekind == TKIND_DISPATCH, "Got kind %u.\n", typeattr->typekind); ok(IsEqualGUID(&typeattr->guid, &IID_IBasicVideo), "Got IID %s.\n", wine_dbgstr_guid(&typeattr->guid)); ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); ITypeInfo_Release(typeinfo); hr = IBasicVideo_get_AvgTimePerFrame(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_AvgTimePerFrame(video, &reftime); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitRate(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitRate(video, &l); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitErrorRate(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitErrorRate(video, &l); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_VideoWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_VideoHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceLeft(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceTop(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationLeft(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationTop(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, NULL, &top, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, &top, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, &top, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, NULL, &top, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, &top, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, &top, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoSize(video, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoSize(video, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, NULL, &l); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, &l, NULL); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); testfilter_init(&source); IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, L"vmr9"); IFilterGraph2_AddFilter(graph, filter, L"source"); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); reftime = 0.0; hr = IBasicVideo_get_AvgTimePerFrame(video, &reftime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(reftime == 0.02, "Got frame rate %.16e.\n", reftime); l = 0xdeadbeef; hr = IBasicVideo_get_BitRate(video, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!l, "Got bit rate %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!l, "Got bit rate %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_BitErrorRate(video, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!l, "Got bit rate %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!l, "Got bit rate %d.\n", l); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, &l, NULL); - todo_wine ok(hr == VFW_E_NO_PALETTE_AVAILABLE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NO_PALETTE_AVAILABLE, "Got hr %#x.\n", hr); width = height = 0xdeadbeef; hr = IBasicVideo_GetVideoSize(video, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 600, "Got width %ld.\n", width); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 600, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); test_basic_video_source(video); test_basic_video_destination(video); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); vih.bmiHeader.biWidth = 16; vih.bmiHeader.biHeight = 16; vih.bmiHeader.biSizeImage = 0; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 16, 16); @@ -2858,13 +2856,13 @@ static void test_basic_video(void) max(16, GetSystemMetrics(SM_CYMIN) - (rect.bottom - rect.top))); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IBasicVideo_Release(video); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_eos(void) @@ -2878,49 +2876,49 @@ static void test_unconnected_eos(void) ULONG ref; hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); @@ -2928,9 +2926,9 @@ static void test_unconnected_eos(void) IMediaControl_Release(control); IMediaEvent_Release(eventsrc); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(videorenderer) diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index 88c82bec0d3..efc876a845c 100644 --- wine/dlls/quartz/tests/vmr7.c +++ wine/dlls/quartz/tests/vmr7.c @@ -23,7 +23,6 @@ #include "dshow.h" #include "d3d9.h" #include "vmr9.h" -#include "videoacc.h" #include "wine/strmbase.h" #include "wine/test.h" @@ -33,13 +32,13 @@ static IBaseFilter *create_vmr7(DWORD mode) IVMRFilterConfig *config; HRESULT hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (mode) { hr = IBaseFilter_QueryInterface(filter, &IID_IVMRFilterConfig, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_SetRenderingMode(config, mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IVMRFilterConfig_Release(config); } return filter; @@ -51,10 +50,10 @@ static HRESULT set_mixing_mode(IBaseFilter *filter) HRESULT hr; hr = IBaseFilter_QueryInterface(filter, &IID_IVMRFilterConfig, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_SetNumberOfStreams(config, 2); - todo_wine ok(hr == VFW_E_DDRAW_CAPS_NOT_SUITABLE || hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_DDRAW_CAPS_NOT_SUITABLE || hr == S_OK, "Got hr %#x.\n", hr); IVMRFilterConfig_Release(config); return hr; @@ -88,7 +87,7 @@ static IFilterGraph2 *create_graph(void) IFilterGraph2 *ret; HRESULT hr; hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); return ret; } @@ -108,101 +107,101 @@ static void test_filter_config(void) hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMRMode_Windowed, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMRMode_Windowed, "Got mode %#x.\n", mode); hr = IVMRFilterConfig_SetRenderingMode(config, VMRMode_Windowed); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMRMode_Windowed, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMRMode_Windowed, "Got mode %#x.\n", mode); hr = IVMRFilterConfig_SetRenderingMode(config, VMRMode_Windowed); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ref = IVMRFilterConfig_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_SetRenderingMode(config, VMRMode_Windowless); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMRMode_Windowless, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMRMode_Windowless, "Got mode %#x.\n", mode); hr = IVMRFilterConfig_SetRenderingMode(config, VMRMode_Windowed); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ref = IVMRFilterConfig_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_SetRenderingMode(config, VMRMode_Renderless); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMRMode_Renderless, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMRMode_Renderless, "Got mode %#x.\n", mode); hr = IVMRFilterConfig_SetRenderingMode(config, VMRMode_Windowless); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ref = IVMRFilterConfig_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_GetNumberOfStreams(config, &count); - todo_wine ok(hr == VFW_E_VMR_NOT_IN_MIXER_MODE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_VMR_NOT_IN_MIXER_MODE, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_SetNumberOfStreams(config, 3); if (hr != VFW_E_DDRAW_CAPS_NOT_SUITABLE) { - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_GetNumberOfStreams(config, &count); todo_wine { - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 3, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 3, "Got count %u.\n", count); } hr = IVMRFilterConfig_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMRMode_Windowed, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMRMode_Windowed, "Got mode %#x.\n", mode); /* Despite MSDN, you can still change the rendering mode after setting the * stream count. */ hr = IVMRFilterConfig_SetRenderingMode(config, VMRMode_Windowless); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMRMode_Windowless, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMRMode_Windowless, "Got mode %#x.\n", mode); hr = IVMRFilterConfig_GetNumberOfStreams(config, &count); todo_wine { - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 3, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 3, "Got count %u.\n", count); } } else skip("Mixing mode is not supported.\n"); ref = IVMRFilterConfig_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } #define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) @@ -215,18 +214,22 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } -static void test_common_interfaces(IBaseFilter *filter) +static void test_interfaces(void) { + IBaseFilter *filter = create_vmr7(0); + ULONG ref; IPin *pin; check_interface(filter, &IID_IAMCertifiedOutputProtection, TRUE); check_interface(filter, &IID_IAMFilterMiscFlags, TRUE); check_interface(filter, &IID_IBaseFilter, TRUE); + check_interface(filter, &IID_IBasicVideo, TRUE); + todo_wine check_interface(filter, &IID_IBasicVideo2, TRUE); todo_wine check_interface(filter, &IID_IKsPropertySet, TRUE); check_interface(filter, &IID_IMediaFilter, TRUE); check_interface(filter, &IID_IMediaPosition, TRUE); @@ -235,12 +238,13 @@ static void test_common_interfaces(IBaseFilter *filter) check_interface(filter, &IID_IQualityControl, TRUE); todo_wine check_interface(filter, &IID_IQualProp, TRUE); check_interface(filter, &IID_IUnknown, TRUE); + check_interface(filter, &IID_IVideoWindow, TRUE); todo_wine check_interface(filter, &IID_IVMRAspectRatioControl, TRUE); todo_wine check_interface(filter, &IID_IVMRDeinterlaceControl, TRUE); check_interface(filter, &IID_IVMRFilterConfig, TRUE); todo_wine check_interface(filter, &IID_IVMRMixerBitmap, TRUE); + check_interface(filter, &IID_IVMRMonitorConfig, TRUE); - check_interface(filter, &IID_IAMVideoAccelerator, FALSE); check_interface(filter, &IID_IBasicAudio, FALSE); check_interface(filter, &IID_IDirectDrawVideo, FALSE); check_interface(filter, &IID_IPersistPropertyBag, FALSE); @@ -250,14 +254,16 @@ static void test_common_interfaces(IBaseFilter *filter) check_interface(filter, &IID_IVMRDeinterlaceControl9, FALSE); check_interface(filter, &IID_IVMRFilterConfig9, FALSE); check_interface(filter, &IID_IVMRMixerBitmap9, FALSE); + check_interface(filter, &IID_IVMRMixerControl, FALSE); check_interface(filter, &IID_IVMRMixerControl9, FALSE); check_interface(filter, &IID_IVMRMonitorConfig9, FALSE); + check_interface(filter, &IID_IVMRSurfaceAllocatorNotify, FALSE); check_interface(filter, &IID_IVMRSurfaceAllocatorNotify9, FALSE); + check_interface(filter, &IID_IVMRWindowlessControl, FALSE); check_interface(filter, &IID_IVMRWindowlessControl9, FALSE); IBaseFilter_FindPin(filter, L"VMR Input0", &pin); - check_interface(pin, &IID_IAMVideoAccelerator, TRUE); check_interface(pin, &IID_IMemInputPin, TRUE); check_interface(pin, &IID_IOverlay, TRUE); check_interface(pin, &IID_IPin, TRUE); @@ -269,27 +275,8 @@ static void test_common_interfaces(IBaseFilter *filter) check_interface(pin, &IID_IMediaSeeking, FALSE); IPin_Release(pin); -} - -static void test_interfaces(void) -{ - IBaseFilter *filter = create_vmr7(0); - ULONG ref; - - test_common_interfaces(filter); - - check_interface(filter, &IID_IBasicVideo, TRUE); - todo_wine check_interface(filter, &IID_IBasicVideo2, TRUE); - check_interface(filter, &IID_IVideoWindow, TRUE); - check_interface(filter, &IID_IVMRMonitorConfig, TRUE); - - check_interface(filter, &IID_IVMRMixerControl, FALSE); - check_interface(filter, &IID_IVMRSurfaceAllocatorNotify, FALSE); - check_interface(filter, &IID_IVMRWindowlessControl, FALSE); - - ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + IBaseFilter_Release(filter); filter = create_vmr7(VMRMode_Windowless); check_interface(filter, &IID_IVMRMonitorConfig, TRUE); @@ -298,12 +285,28 @@ static void test_interfaces(void) todo_wine check_interface(filter, &IID_IBasicVideo, FALSE); check_interface(filter, &IID_IBasicVideo2, FALSE); todo_wine check_interface(filter, &IID_IVideoWindow, FALSE); - check_interface(filter, &IID_IVMRMixerControl, FALSE); check_interface(filter, &IID_IVMRSurfaceAllocatorNotify, FALSE); + check_interface(filter, &IID_IVMRSurfaceAllocatorNotify9, FALSE); + check_interface(filter, &IID_IVMRMixerControl, FALSE); + check_interface(filter, &IID_IVMRMixerControl9, FALSE); + check_interface(filter, &IID_IVMRMonitorConfig9, FALSE); + check_interface(filter, &IID_IVMRWindowlessControl9, FALSE); - ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + IBaseFilter_FindPin(filter, L"VMR Input0", &pin); + check_interface(pin, &IID_IMemInputPin, TRUE); + check_interface(pin, &IID_IOverlay, TRUE); + check_interface(pin, &IID_IPin, TRUE); + todo_wine check_interface(pin, &IID_IQualityControl, TRUE); + check_interface(pin, &IID_IUnknown, TRUE); + + check_interface(pin, &IID_IKsPropertySet, FALSE); + check_interface(pin, &IID_IMediaPosition, FALSE); + check_interface(pin, &IID_IMediaSeeking, FALSE); + + IPin_Release(pin); + + IBaseFilter_Release(filter); filter = create_vmr7(VMRMode_Renderless); check_interface(filter, &IID_IVMRSurfaceAllocatorNotify, TRUE); @@ -313,10 +316,27 @@ static void test_interfaces(void) todo_wine check_interface(filter, &IID_IVideoWindow, FALSE); check_interface(filter, &IID_IVMRMixerControl, FALSE); todo_wine check_interface(filter, &IID_IVMRMonitorConfig, FALSE); + check_interface(filter, &IID_IVMRMonitorConfig9, FALSE); + check_interface(filter, &IID_IVMRSurfaceAllocatorNotify9, FALSE); check_interface(filter, &IID_IVMRWindowlessControl, FALSE); + check_interface(filter, &IID_IVMRWindowlessControl9, FALSE); + + IBaseFilter_FindPin(filter, L"VMR Input0", &pin); + + check_interface(pin, &IID_IMemInputPin, TRUE); + check_interface(pin, &IID_IOverlay, TRUE); + check_interface(pin, &IID_IPin, TRUE); + todo_wine check_interface(pin, &IID_IQualityControl, TRUE); + check_interface(pin, &IID_IUnknown, TRUE); + + check_interface(pin, &IID_IKsPropertySet, FALSE); + check_interface(pin, &IID_IMediaPosition, FALSE); + check_interface(pin, &IID_IMediaSeeking, FALSE); + + IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static const GUID test_iid = {0x33333333}; @@ -364,53 +384,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_VideoMixingRenderer, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_VideoMixingRenderer, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -422,79 +442,79 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); @@ -502,37 +522,37 @@ static void test_enum_pins(void) if (SUCCEEDED(set_mixing_mode(filter))) { hr = IEnumPins_Next(enum1, 1, pins, NULL); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); } @@ -541,7 +561,7 @@ static void test_enum_pins(void) IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -555,51 +575,51 @@ static void test_find_pin(void) IBaseFilter_EnumPins(filter, &enum_pins); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"VMR Input0", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins did not match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"VMR input1", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); if (SUCCEEDED(set_mixing_mode(filter))) { IEnumPins_Reset(enum_pins); hr = IBaseFilter_FindPin(filter, L"VMR Input0", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins did not match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"VMR Input1", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins did not match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"VMR Input2", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); } else skip("Mixing mode is not supported.\n"); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -620,16 +640,16 @@ static void test_pin_info(void) IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"VMR Input0"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, &count); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); @@ -643,16 +663,16 @@ static void test_pin_info(void) IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"VMR Input1"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, &count); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); } @@ -660,7 +680,7 @@ static void test_pin_info(void) skip("Mixing mode is not supported.\n"); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_media_types(void) @@ -689,10 +709,10 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); @@ -705,30 +725,30 @@ static void test_media_types(void) { req_mt.subtype = *subtype_tests[i]; hr = IPin_QueryAccept(pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_enum_media_types(void) @@ -743,36 +763,36 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -783,53 +803,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -890,45 +910,45 @@ static void test_allocator(IMemInputPin *input) HRESULT hr; hr = IMemInputPin_GetAllocatorRequirements(input, &props); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_GetProperties(ret_allocator, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.cBuffers, "Got %ld buffers.\n", props.cBuffers); - ok(!props.cbBuffer, "Got size %ld.\n", props.cbBuffer); - ok(!props.cbAlign, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.cBuffers, "Got %d buffers.\n", props.cBuffers); + ok(!props.cbBuffer, "Got size %d.\n", props.cbBuffer); + ok(!props.cbAlign, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); hr = IMemInputPin_NotifyAllocator(input, ret_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); req_props.cBuffers = 1; req_props.cbBuffer = 32 * 16 * 4; req_props.cbAlign = 1; req_props.cbPrefix = 0; hr = IMemAllocator_SetProperties(ret_allocator, &req_props, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.cBuffers == 1, "Got %ld buffers.\n", props.cBuffers); - ok(props.cbBuffer == 32 * 16 * 4, "Got size %ld.\n", props.cbBuffer); - ok(props.cbAlign == 1, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.cBuffers == 1, "Got %d buffers.\n", props.cBuffers); + ok(props.cbBuffer == 32 * 16 * 4, "Got size %d.\n", props.cbBuffer); + ok(props.cbAlign == 1, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); IMemAllocator_Release(ret_allocator); } hr = IMemInputPin_NotifyAllocator(input, NULL, TRUE); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&req_allocator); hr = IMemInputPin_NotifyAllocator(input, req_allocator, TRUE); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); IMemAllocator_Release(req_allocator); } @@ -944,9 +964,9 @@ static DWORD WINAPI frame_thread(void *arg) struct frame_thread_params *params = arg; HRESULT hr; - if (winetest_debug > 1) trace("%04lx: Sending frame.\n", GetCurrentThreadId()); + if (winetest_debug > 1) trace("%04x: Sending frame.\n", GetCurrentThreadId()); hr = IMemInputPin_Receive(params->sink, params->sample); - if (winetest_debug > 1) trace("%04lx: Returned %#lx.\n", GetCurrentThreadId(), hr); + if (winetest_debug > 1) trace("%04x: Returned %#x.\n", GetCurrentThreadId(), hr); IMediaSample_Release(params->sample); free(params); return hr; @@ -963,25 +983,25 @@ static HANDLE send_frame(IMemInputPin *sink) BYTE *data; hr = IMemInputPin_GetAllocator(sink, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(data, 0x55, IMediaSample_GetSize(sample)); hr = IMediaSample_SetActualDataLength(sample, IMediaSample_GetSize(sample)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start_time = 0; end_time = start_time + 10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetPreroll(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); params->sink = sink; params->sample = sample; @@ -1007,9 +1027,9 @@ static void commit_allocator(IMemInputPin *input) HRESULT hr; hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -1023,130 +1043,130 @@ static void test_filter_state(IMemInputPin *input, IMediaControl *control) thread = send_frame(input); hr = join_thread(thread); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); /* The renderer is not fully paused until it receives a sample. The thread * sending the sample blocks in IMemInputPin_Receive() until the filter is * stopped or run. */ hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* The sink will decommit our allocator for us when stopping, however it * will not recommit it when pausing. */ hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - todo_wine ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); if (hr == S_OK) IMediaSample_Release(sample); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -1159,61 +1179,61 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IMediaControl *control commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); thread = send_frame(input); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* We dropped the sample we were holding, so now we need a new one... */ hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %#lx.\n", state); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %#x.\n", state); thread = send_frame(input); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %#lx.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %#x.\n", state); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG expected_code, LONG_PTR expected1, LONG_PTR expected2) @@ -1227,14 +1247,14 @@ static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG { if (code == expected_code) { - ok(param1 == expected1, "Got param1 %#Ix.\n", param1); - ok(param2 == expected2, "Got param2 %#Ix.\n", param2); + ok(param1 == expected1, "Got param1 %#lx.\n", param1); + ok(param2 == expected2, "Got param2 %#lx.\n", param2); ret++; } IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); timeout = 0; } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); return ret; } @@ -1266,68 +1286,68 @@ static void test_current_image(IBaseFilter *filter, IMemInputPin *input, IBaseFilter_QueryInterface(filter, &IID_IBasicVideo, (void **)&video); hr = IBasicVideo_GetCurrentImage(video, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetCurrentImage(video, NULL, buffer); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); size = 0xdeadbeef; hr = IBasicVideo_GetCurrentImage(video, &size, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 4, "Got size %ld.\n", size); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 4, "Got size %d.\n", size); size = sizeof(buffer); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); /* The contents seem to reflect the last frame rendered. */ commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); size = sizeof(buffer); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); /* The contents seem to reflect the last frame rendered. */ thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); size = 1; memset(buffer, 0xcc, sizeof(buffer)); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == 1, "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == 1, "Got size %d.\n", size); size = sizeof(buffer); memset(buffer, 0xcc, sizeof(buffer)); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); for (i = 0; i < 32 * 16; ++i) - ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08lx at %u.\n", data[i], i); + ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08x at %u.\n", data[i], i); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); join_thread(thread); size = sizeof(buffer); memset(buffer, 0xcc, sizeof(buffer)); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); for (i = 0; i < 32 * 16; ++i) - ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08lx at %u.\n", data[i], i); + ok((data[i] & 0xffffff) == 0x555555, "Got unexpected color %08x at %u.\n", data[i], i); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IBasicVideo_Release(video); } @@ -1343,14 +1363,14 @@ static unsigned int check_ec_userabort(IMediaEvent *eventsrc, DWORD timeout) { if (code == EC_USERABORT) { - ok(!param1, "Got param1 %#Ix.\n", param1); - ok(!param2, "Got param2 %#Ix.\n", param2); + ok(!param1, "Got param1 %#lx.\n", param1); + ok(!param2, "Got param2 %#lx.\n", param2); ret++; } IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); timeout = 0; } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); return ret; } @@ -1369,19 +1389,19 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IOverlay_Release(overlay); commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); SendMessageW(hwnd, WM_CLOSE, 0, 0); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(ret == 1, "Expected EC_USERABORT.\n"); @@ -1394,17 +1414,17 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con if (ret == WAIT_OBJECT_0) { GetExitCodeThread(thread, (DWORD *)&hr); - ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); + ok(hr == E_UNEXPECTED, "Got hr %#x.\n", hr); } CloseHandle(thread); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1412,11 +1432,11 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con commit_allocator(input); hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1429,7 +1449,7 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con ok(!IsWindowVisible(hwnd), "Window should be visible.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1485,7 +1505,7 @@ static void test_connect_pin(void) vih.bmiHeader.biBitCount = 16; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); vih.bmiHeader.biBitCount = 32; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); @@ -1498,32 +1518,32 @@ static void test_connect_pin(void) * the actual samples only have a size of 32 * 16 * 3. */ req_props.cbBuffer = 32 * 16 * 3; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < ARRAY_SIZE(subtype_tests); ++i) { req_mt.subtype = *subtype_tests[i]; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); + ok(hr == S_OK, "Got hr %#x for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } req_mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.formattype = FORMAT_VideoInfo; req_mt.subtype = MEDIASUBTYPE_RGB8; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); if (hr == S_OK) { IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); @@ -1533,29 +1553,29 @@ static void test_connect_pin(void) peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(pin, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &source.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); /* Disconnecting while not stopped is broken: it returns S_OK, but @@ -1566,16 +1586,16 @@ static void test_connect_pin(void) test_allocator(input); hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); hr = IMemInputPin_ReceiveCanBlock(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_filter_state(input, control); test_flushing(pin, input, control); @@ -1583,29 +1603,29 @@ static void test_connect_pin(void) test_window_close(pin, input, control); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source.source.pin.peer == pin, "Got peer %p.\n", peer); IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); IMemInputPin_Release(input); IPin_Release(pin); IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_overlay(void) @@ -1620,17 +1640,17 @@ static void test_overlay(void) IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hwnd = (HWND)0xdeadbeef; hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(hwnd && hwnd != (HWND)0xdeadbeef, "Got invalid window %p.\n", hwnd); IOverlay_Release(overlay); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } /* try to make sure pending X events have been processed before continuing */ @@ -1654,7 +1674,7 @@ static void flush_events(void) static LRESULT CALLBACK window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { if (winetest_debug > 1) - trace("hwnd %p, msg %#x, wparam %#Ix, lparam %#Ix.\n", hwnd, msg, wparam, lparam); + trace("hwnd %p, msg %#x, wparam %#lx, lparam %#lx.\n", hwnd, msg, wparam, lparam); if (wparam == 0xdeadbeef) return 0; @@ -1669,7 +1689,7 @@ static void test_video_window_caption(IVideoWindow *window, HWND hwnd) HRESULT hr; hr = IVideoWindow_get_Caption(window, &caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(caption, L"ActiveMovie Window"), "Got caption %s.\n", wine_dbgstr_w(caption)); SysFreeString(caption); @@ -1678,11 +1698,11 @@ static void test_video_window_caption(IVideoWindow *window, HWND hwnd) caption = SysAllocString(L"foo"); hr = IVideoWindow_put_Caption(window, caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SysFreeString(caption); hr = IVideoWindow_get_Caption(window, &caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(caption, L"foo"), "Got caption %s.\n", wine_dbgstr_w(caption)); SysFreeString(caption); @@ -1696,53 +1716,53 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw LONG style; hr = IVideoWindow_get_WindowStyle(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), - "Got style %#lx.\n", style); + "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_STYLE); ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), - "Got style %#lx.\n", style); + "Got style %#x.\n", style); hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_HSCROLL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_VSCROLL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_MAXIMIZE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_MINIMIZE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style & ~WS_CLIPCHILDREN); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyle(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#lx.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_get_WindowStyleEx(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == WS_EX_WINDOWEDGE, "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_EXSTYLE); - ok(style == WS_EX_WINDOWEDGE, "Got style %#lx.\n", style); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); hr = IVideoWindow_put_WindowStyleEx(window, style | WS_EX_TRANSPARENT); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyleEx(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_EXSTYLE); - ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#lx.\n", style); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); } static BOOL CALLBACK top_window_cb(HWND hwnd, LPARAM ctx) @@ -1773,25 +1793,25 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1801,14 +1821,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(top == hwnd, "Got top window %p.\n", top); hr = IVideoWindow_put_WindowState(window, SW_MINIMIZE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_MINIMIZE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MINIMIZE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(IsIconic(hwnd), "Window should be minimized.\n"); @@ -1816,14 +1836,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_RESTORE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1831,14 +1851,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_MAXIMIZE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_MAXIMIZE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MAXIMIZE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should be minimized.\n"); @@ -1846,17 +1866,17 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_RESTORE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowState(window, SW_HIDE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1864,14 +1884,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_Visible(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1879,14 +1899,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -1894,14 +1914,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_SetWindowForeground(window, TRUE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_SetWindowForeground(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -1909,7 +1929,7 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(top == hwnd, "Got top window %p.\n", top); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -1918,7 +1938,7 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == our_hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == our_hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -1940,114 +1960,114 @@ static void test_video_window_position(IVideoWindow *window, HWND hwnd, HWND our expect_height = rect.bottom - rect.top; hr = IVideoWindow_put_Left(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Top(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == expect_height, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == expect_height, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 0, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == expect_height, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 0, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_put_Left(window, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == expect_height, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == expect_height, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 10, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == 10 + expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == expect_height, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_put_Height(window, 200); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == 200, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 200, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == 200, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == 200, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 10, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == 10 + expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == 200, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == 200, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_SetWindowPosition(window, 100, 200, 300, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 100, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 200, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 200, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 300, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 300, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 400, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 100, "Got left %ld.\n", left); - ok(top == 200, "Got top %ld.\n", top); - ok(width == 300, "Got width %ld.\n", width); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); + ok(top == 200, "Got top %d.\n", top); + ok(width == 300, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 100, "Got window left %ld.\n", rect.left); - ok(rect.top == 200, "Got window top %ld.\n", rect.top); - ok(rect.right == 400, "Got window right %ld.\n", rect.right); - ok(rect.bottom == 600, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 100, "Got window left %d.\n", rect.left); + ok(rect.top == 200, "Got window top %d.\n", rect.top); + ok(rect.right == 400, "Got window right %d.\n", rect.right); + ok(rect.bottom == 600, "Got window bottom %d.\n", rect.bottom); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); @@ -2064,25 +2084,25 @@ static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(!(style & WS_CHILD), "Got style %#lx.\n", style); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == our_hwnd, "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok((style & WS_CHILD), "Got style %#lx.\n", style); + ok((style & WS_CHILD), "Got style %#x.\n", style); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); @@ -2091,31 +2111,31 @@ static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hw ShowWindow(our_hwnd, SW_HIDE); hr = IVideoWindow_put_Visible(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OAFALSE, "Got state %d.\n", state); hr = IVideoWindow_put_Owner(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(!(style & WS_CHILD), "Got style %#lx.\n", style); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); ok(top_hwnd == hwnd, "Got top window %p.\n", top_hwnd); hr = IVideoWindow_get_Visible(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OATRUE, "Got state %d.\n", state); } struct notify_message_params @@ -2129,7 +2149,7 @@ static DWORD CALLBACK notify_message_proc(void *arg) { const struct notify_message_params *params = arg; HRESULT hr = IVideoWindow_NotifyOwnerMessage(params->window, (OAHWND)params->hwnd, params->message, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return 0; } @@ -2172,15 +2192,15 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our flush_events(); hr = IVideoWindow_get_MessageDrain(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got window %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got window %#lx.\n", oahwnd); hr = IVideoWindow_put_MessageDrain(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_MessageDrain(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(oahwnd == (OAHWND)our_hwnd, "Got window %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got window %#lx.\n", oahwnd); for (i = 0; i < ARRAY_SIZE(drain_tests); ++i) { @@ -2189,8 +2209,8 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our ok(ret, "Expected a message.\n"); ok(msg.hwnd == our_hwnd, "Got hwnd %p.\n", msg.hwnd); ok(msg.message == drain_tests[i], "Got message %#x.\n", msg.message); - ok(msg.wParam == 0xdeadbeef, "Got wparam %#Ix.\n", msg.wParam); - ok(!msg.lParam, "Got lparam %#Ix.\n", msg.lParam); + ok(msg.wParam == 0xdeadbeef, "Got wparam %#lx.\n", msg.wParam); + ok(!msg.lParam, "Got lparam %#lx.\n", msg.lParam); DispatchMessageA(&msg); ret = PeekMessageA(&msg, 0, drain_tests[i], drain_tests[i], PM_REMOVE); @@ -2198,10 +2218,10 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_put_MessageDrain(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); flush_events(); @@ -2210,7 +2230,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our * posted all messages. */ hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SYSCOLORCHANGE, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { @@ -2219,7 +2239,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_FONTCHANGE, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { @@ -2256,7 +2276,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_put_Owner(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *graph, HWND hwnd) @@ -2268,41 +2288,41 @@ static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *grap IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); hr = IVideoWindow_get_AutoShow(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IVideoWindow_put_AutoShow(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OAFALSE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OAFALSE, "Got %d.\n", l); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaControl_Release(control); } @@ -2360,27 +2380,27 @@ static void test_video_window(void) IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_debug > 1) trace("ours %p, theirs %p\n", our_hwnd, hwnd); GetWindowRect(hwnd, &rect); tid = GetWindowThreadProcessId(hwnd, NULL); - ok(tid == GetCurrentThreadId(), "Expected tid %#lx, got %#lx.\n", GetCurrentThreadId(), tid); + ok(tid == GetCurrentThreadId(), "Expected tid %#x, got %#x.\n", GetCurrentThreadId(), tid); hr = IBaseFilter_QueryInterface(filter, &IID_IVideoWindow, (void **)&window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Caption(window, &caption); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyle(window, &l); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IVideoWindow_get_AutoShow(window, &l); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); testfilter_init(&source); IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, NULL); @@ -2393,17 +2413,17 @@ static void test_video_window(void) req_props.cbBuffer = 32 * 16 * 3; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -2418,14 +2438,14 @@ static void test_video_window(void) test_video_window_messages(window, hwnd, our_hwnd); hr = IVideoWindow_put_FullScreenMode(window, OATRUE); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IVideoWindow_get_FullScreenMode(window, &l); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); - todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); - todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); IFilterGraph2_Release(graph); IVideoWindow_Release(window); @@ -2433,9 +2453,9 @@ static void test_video_window(void) IMemInputPin_Release(input); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(our_hwnd); } @@ -2447,31 +2467,31 @@ static void check_source_position_(int line, IBasicVideo *video, left = top = width = height = 0xdeadbeef; hr = IBasicVideo_GetSourcePosition(video, &left, &top, &width, &height); - ok_(__FILE__,line)(hr == S_OK, "Got hr %#lx.\n", hr); - ok_(__FILE__,line)(left == expect_left, "Got left %ld.\n", left); - ok_(__FILE__,line)(top == expect_top, "Got top %ld.\n", top); - ok_(__FILE__,line)(width == expect_width, "Got width %ld.\n", width); - ok_(__FILE__,line)(height == expect_height, "Got height %ld.\n", height); + ok_(__FILE__,line)(hr == S_OK, "Got hr %#x.\n", hr); + ok_(__FILE__,line)(left == expect_left, "Got left %d.\n", left); + ok_(__FILE__,line)(top == expect_top, "Got top %d.\n", top); + ok_(__FILE__,line)(width == expect_width, "Got width %d.\n", width); + ok_(__FILE__,line)(height == expect_height, "Got height %d.\n", height); l = 0xdeadbeef; hr = IBasicVideo_get_SourceLeft(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == left, "Got left %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#x.\n", hr); + ok_(__FILE__,line)(l == left, "Got left %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceTop(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == top, "Got top %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#x.\n", hr); + ok_(__FILE__,line)(l == top, "Got top %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceWidth(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == width, "Got width %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#x.\n", hr); + ok_(__FILE__,line)(l == width, "Got width %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceHeight(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == height, "Got height %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#x.\n", hr); + ok_(__FILE__,line)(l == height, "Got height %d.\n", l); } #define check_source_position(a,b,c,d,e) check_source_position_(__LINE__,a,b,c,d,e) @@ -2481,77 +2501,77 @@ static void test_basic_video_source(IBasicVideo *video) check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, 10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, 10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, -500); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 700); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 500, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, -300); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 600); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 10, 0, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, 20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 10, 20, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 4, 5, 60, 40); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 0, 0, 600, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDefaultSourcePosition(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void check_destination_position_(int line, IBasicVideo *video, @@ -2562,31 +2582,31 @@ static void check_destination_position_(int line, IBasicVideo *video, left = top = width = height = 0xdeadbeef; hr = IBasicVideo_GetDestinationPosition(video, &left, &top, &width, &height); - ok_(__FILE__,line)(hr == S_OK, "Failed to get position, hr %#lx.\n", hr); - ok_(__FILE__,line)(left == expect_left, "Got left %ld.\n", left); - ok_(__FILE__,line)(top == expect_top, "Got top %ld.\n", top); - ok_(__FILE__,line)(width == expect_width, "Got width %ld.\n", width); - ok_(__FILE__,line)(height == expect_height, "Got height %ld.\n", height); + ok_(__FILE__,line)(hr == S_OK, "Failed to get position, hr %#x.\n", hr); + ok_(__FILE__,line)(left == expect_left, "Got left %d.\n", left); + ok_(__FILE__,line)(top == expect_top, "Got top %d.\n", top); + ok_(__FILE__,line)(width == expect_width, "Got width %d.\n", width); + ok_(__FILE__,line)(height == expect_height, "Got height %d.\n", height); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationLeft(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == left, "Got left %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#x.\n", hr); + ok_(__FILE__,line)(l == left, "Got left %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationTop(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == top, "Got top %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#x.\n", hr); + ok_(__FILE__,line)(l == top, "Got top %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationWidth(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == width, "Got width %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#x.\n", hr); + ok_(__FILE__,line)(l == width, "Got width %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationHeight(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == height, "Got height %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#x.\n", hr); + ok_(__FILE__,line)(l == height, "Got height %d.\n", l); } #define check_destination_position(a,b,c,d,e) check_destination_position_(__LINE__,a,b,c,d,e) @@ -2600,107 +2620,107 @@ static void test_basic_video_destination(IBasicVideo *video) check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationLeft(video, -10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, -10, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationLeft(video, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationTop(video, -20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, -20, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationTop(video, 20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, -700); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 700); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 700, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, -500); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 500); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 4, 5, 60, 40); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 0, 0, 600, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDefaultDestinationPosition(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&rect, 100, 200, 500, 500); AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); hr = IVideoWindow_SetWindowPosition(window, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 0, 0, 400, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); SetRect(&rect, 100, 200, 600, 600); AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); hr = IVideoWindow_SetWindowPosition(window, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IVideoWindow_Release(window); } @@ -2749,83 +2769,83 @@ static void test_basic_video(void) IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); hr = IBasicVideo_GetTypeInfoCount(video, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count == 1, "Got count %u.\n", count); hr = IBasicVideo_GetTypeInfo(video, 0, 0, &typeinfo); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(typeattr->typekind == TKIND_DISPATCH, "Got kind %u.\n", typeattr->typekind); ok(IsEqualGUID(&typeattr->guid, &IID_IBasicVideo), "Got IID %s.\n", wine_dbgstr_guid(&typeattr->guid)); ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); ITypeInfo_Release(typeinfo); hr = IBasicVideo_get_AvgTimePerFrame(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_AvgTimePerFrame(video, &reftime); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitRate(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitRate(video, &l); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitErrorRate(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitErrorRate(video, &l); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_VideoWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_VideoHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceLeft(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceTop(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationLeft(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationTop(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, NULL, &top, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, &top, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, &top, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, NULL, &top, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, &top, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, &top, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoSize(video, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoSize(video, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, NULL, &l); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, &l, NULL); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); testfilter_init(&source); IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, L"vmr9"); @@ -2836,66 +2856,66 @@ static void test_basic_video(void) skip("Got E_FAIL when connecting.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } reftime = 0.0; hr = IBasicVideo_get_AvgTimePerFrame(video, &reftime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_double(reftime, 0.02, 1 << 28), "Got frame rate %.16e.\n", reftime); l = 0xdeadbeef; hr = IBasicVideo_get_BitRate(video, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!l, "Got bit rate %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!l, "Got bit rate %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_BitErrorRate(video, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!l, "Got bit rate %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!l, "Got bit rate %d.\n", l); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, &l, NULL); - todo_wine ok(hr == VFW_E_NO_PALETTE_AVAILABLE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NO_PALETTE_AVAILABLE, "Got hr %#x.\n", hr); width = height = 0xdeadbeef; hr = IBasicVideo_GetVideoSize(video, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 600, "Got width %ld.\n", width); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 600, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); test_basic_video_source(video); test_basic_video_destination(video); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); vih.bmiHeader.biWidth = 16; vih.bmiHeader.biHeight = 16; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -2908,14 +2928,14 @@ static void test_basic_video(void) out: ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IBasicVideo_Release(video); IMemInputPin_Release(input); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_windowless_size(void) @@ -2960,12 +2980,12 @@ static void test_windowless_size(void) ok(!!window, "Failed to create a window.\n"); hr = IVMRWindowlessControl_SetVideoClippingWindow(windowless_control, window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); @@ -2975,47 +2995,47 @@ static void test_windowless_size(void) skip("Got E_FAIL when setting allocator properties.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); } hr = IVMRWindowlessControl_GetNativeVideoSize(windowless_control, NULL, &height, &aspect_width, &aspect_height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IVMRWindowlessControl_GetNativeVideoSize(windowless_control, &width, NULL, &aspect_width, &aspect_height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); width = height = 0xdeadbeef; hr = IVMRWindowlessControl_GetNativeVideoSize(windowless_control, &width, &height, NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 32, "Got width %ld.\n", width); - ok(height == 16, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 32, "Got width %d.\n", width); + ok(height == 16, "Got height %d.\n", height); aspect_width = aspect_height = 0xdeadbeef; hr = IVMRWindowlessControl_GetNativeVideoSize(windowless_control, &width, &height, &aspect_width, &aspect_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(aspect_width == 32, "Got width %ld.\n", aspect_width); - ok(aspect_height == 16, "Got height %ld.\n", aspect_height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(aspect_width == 32, "Got width %d.\n", aspect_width); + ok(aspect_height == 16, "Got height %d.\n", aspect_height); memset(&src, 0xcc, sizeof(src)); hr = IVMRWindowlessControl_GetVideoPosition(windowless_control, &src, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 0, 0, 32, 16); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl_GetVideoPosition(windowless_control, NULL, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 0, 0, 0, 0); ok(EqualRect(&dst, &expect), "Got dest rect %s.\n", wine_dbgstr_rect(&dst)); SetRect(&src, 4, 6, 16, 12); hr = IVMRWindowlessControl_SetVideoPosition(windowless_control, &src, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(&src, 0xcc, sizeof(src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl_GetVideoPosition(windowless_control, &src, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 4, 6, 16, 12); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); SetRect(&expect, 0, 0, 0, 0); @@ -3023,12 +3043,12 @@ static void test_windowless_size(void) SetRect(&dst, 40, 60, 120, 160); hr = IVMRWindowlessControl_SetVideoPosition(windowless_control, NULL, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(&src, 0xcc, sizeof(src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl_GetVideoPosition(windowless_control, &src, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 4, 6, 16, 12); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); SetRect(&expect, 40, 60, 120, 160); @@ -3040,12 +3060,12 @@ static void test_windowless_size(void) out: ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMemInputPin_Release(input); IPin_Release(pin); IVMRWindowlessControl_Release(windowless_control); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(window); } @@ -3060,49 +3080,49 @@ static void test_unconnected_eos(void) ULONG ref; hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); @@ -3110,9 +3130,9 @@ static void test_unconnected_eos(void) IMediaControl_Release(control); IMediaEvent_Release(eventsrc); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(vmr7) diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 405f7ee89ba..a0ccb4898a9 100644 --- wine/dlls/quartz/tests/vmr9.c +++ wine/dlls/quartz/tests/vmr9.c @@ -27,7 +27,6 @@ #include "qedit.h" #include "d3d9.h" #include "vmr9.h" -#include "videoacc.h" #include "wmcodecdsp.h" #include "wine/strmbase.h" #include "wine/test.h" @@ -38,13 +37,13 @@ static IBaseFilter *create_vmr9(DWORD mode) IVMRFilterConfig9 *config; HRESULT hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (mode) { hr = IBaseFilter_QueryInterface(filter, &IID_IVMRFilterConfig9, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_SetRenderingMode(config, mode); - ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#x.\n", hr); IVMRFilterConfig9_Release(config); } return filter; @@ -56,10 +55,10 @@ static HRESULT set_mixing_mode(IBaseFilter *filter, DWORD count) HRESULT hr; hr = IBaseFilter_QueryInterface(filter, &IID_IVMRFilterConfig9, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_SetNumberOfStreams(config, count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IVMRFilterConfig9_Release(config); return hr; @@ -93,7 +92,7 @@ static IFilterGraph2 *create_graph(void) IFilterGraph2 *ret; HRESULT hr; hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); return ret; } @@ -113,92 +112,92 @@ static void test_filter_config(void) hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig9, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMRMode_Windowed, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMRMode_Windowed, "Got mode %#x.\n", mode); hr = IVMRFilterConfig9_SetRenderingMode(config, VMR9Mode_Windowed); - ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMR9Mode_Windowed, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMR9Mode_Windowed, "Got mode %#x.\n", mode); hr = IVMRFilterConfig9_SetRenderingMode(config, VMR9Mode_Windowed); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ref = IVMRFilterConfig9_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig9, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_SetRenderingMode(config, VMR9Mode_Windowless); - ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMR9Mode_Windowless, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMR9Mode_Windowless, "Got mode %#x.\n", mode); hr = IVMRFilterConfig9_SetRenderingMode(config, VMR9Mode_Windowed); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ref = IVMRFilterConfig9_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig9, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_SetRenderingMode(config, VMR9Mode_Renderless); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMR9Mode_Renderless, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMR9Mode_Renderless, "Got mode %#x.\n", mode); hr = IVMRFilterConfig9_SetRenderingMode(config, VMR9Mode_Windowless); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ref = IVMRFilterConfig9_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, &IID_IVMRFilterConfig9, (void **)&config); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &count); - ok(hr == VFW_E_VMR_NOT_IN_MIXER_MODE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_VMR_NOT_IN_MIXER_MODE, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_SetNumberOfStreams(config, 3); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 3, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 3, "Got count %u.\n", count); hr = IVMRFilterConfig9_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMR9Mode_Windowed, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMR9Mode_Windowed, "Got mode %#x.\n", mode); /* Despite MSDN, you can still change the rendering mode after setting the * stream count. */ hr = IVMRFilterConfig9_SetRenderingMode(config, VMR9Mode_Windowless); - ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#lx.\n", hr); + ok(hr == S_OK || broken(hr == E_FAIL), "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetRenderingMode(config, &mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(mode == VMR9Mode_Windowless, "Got mode %#lx.\n", mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(mode == VMR9Mode_Windowless, "Got mode %#x.\n", mode); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 3, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 3, "Got count %u.\n", count); ref = IVMRFilterConfig9_Release(config); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } #define check_interface_broken(a, b, c) check_interface_(__LINE__, a, b, c, TRUE) @@ -221,7 +220,7 @@ static HRESULT check_interface_(unsigned int line, void *iface, REFIID riid, BOO hr = IUnknown_QueryInterface(unknown, riid, (void **)&out); ok_(__FILE__, line)(hr == expected_hr || broken(is_broken && hr == broken_hr), - "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(out); return hr; @@ -247,7 +246,6 @@ static void test_common_interfaces(IBaseFilter *filter) check_interface(filter, &IID_IVMRFilterConfig9, TRUE); check_interface(filter, &IID_IVMRMixerBitmap9, TRUE); - check_interface(filter, &IID_IAMVideoAccelerator, FALSE); check_interface(filter, &IID_IBasicAudio, FALSE); check_interface(filter, &IID_IDirectDrawVideo, FALSE); check_interface(filter, &IID_IPersistPropertyBag, FALSE); @@ -264,7 +262,6 @@ static void test_common_interfaces(IBaseFilter *filter) IBaseFilter_FindPin(filter, L"VMR Input0", &pin); - check_interface(pin, &IID_IAMVideoAccelerator, TRUE); check_interface(pin, &IID_IMemInputPin, TRUE); check_interface(pin, &IID_IOverlay, TRUE); check_interface(pin, &IID_IPin, TRUE); @@ -297,7 +294,7 @@ static void test_interfaces(void) check_interface(filter, &IID_IVMRWindowlessControl9, FALSE); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); filter = create_vmr9(VMR9Mode_Windowless); test_common_interfaces(filter); @@ -314,7 +311,7 @@ static void test_interfaces(void) check_interface(filter, &IID_IVMRSurfaceAllocatorNotify9, FALSE); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); filter = create_vmr9(VMR9Mode_Renderless); test_common_interfaces(filter); @@ -328,7 +325,7 @@ static void test_interfaces(void) check_interface(filter, &IID_IVMRWindowlessControl9, FALSE); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); filter = create_vmr9(VMR9Mode_Windowed); set_mixing_mode(filter, 1); @@ -346,7 +343,7 @@ static void test_interfaces(void) check_interface(filter, &IID_IVMRWindowlessControl9, FALSE); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static const GUID test_iid = {0x33333333}; @@ -394,53 +391,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -452,79 +449,79 @@ static void test_enum_pins(void) HRESULT hr; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); @@ -532,43 +529,43 @@ static void test_enum_pins(void) set_mixing_mode(filter, 2); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(count == 2, "Got count %lu.\n", count); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); if (count > 1) IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - todo_wine ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + todo_wine ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); if (count > 1) IPin_Release(pins[1]); IEnumPins_Release(enum1); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_find_pin(void) @@ -582,51 +579,51 @@ static void test_find_pin(void) IBaseFilter_EnumPins(filter, &enum_pins); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"In", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"VMR Input0", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins did not match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"VMR Input1", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); set_mixing_mode(filter, 2); IEnumPins_Reset(enum_pins); hr = IBaseFilter_FindPin(filter, L"VMR Input0", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins did not match.\n"); IPin_Release(pin); IPin_Release(pin2); hr = IBaseFilter_FindPin(filter, L"VMR Input1", &pin); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Pins did not match.\n"); IPin_Release(pin); IPin_Release(pin2); } hr = IBaseFilter_FindPin(filter, L"VMR Input2", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); IEnumPins_Release(enum_pins); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_pin_info(void) @@ -647,23 +644,23 @@ static void test_pin_info(void) IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"VMR Input0"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, &count); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); set_mixing_mode(filter, 2); hr = IBaseFilter_FindPin(filter, L"VMR Input1", &pin); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IPin_QueryPinInfo(pin, &info); @@ -673,22 +670,22 @@ static void test_pin_info(void) IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"VMR Input1"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); hr = IPin_QueryInternalConnections(pin, NULL, &count); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); IPin_Release(pin); } ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_media_types(void) @@ -716,10 +713,10 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &mt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); @@ -732,33 +729,33 @@ static void test_media_types(void) { req_mt.subtype = *subtype_tests[i]; hr = IPin_QueryAccept(pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx for subtype %s.\n", hr, wine_dbgstr_guid(subtype_tests[i])); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_enum_media_types(void) @@ -773,36 +770,36 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + 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 %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_filter_state(void) @@ -813,53 +810,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } struct testfilter @@ -920,45 +917,45 @@ static void test_allocator(IMemInputPin *input) HRESULT hr; hr = IMemInputPin_GetAllocatorRequirements(input, &props); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &ret_allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_GetProperties(ret_allocator, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!props.cBuffers, "Got %ld buffers.\n", props.cBuffers); - ok(!props.cbBuffer, "Got size %ld.\n", props.cbBuffer); - ok(!props.cbAlign, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.cBuffers, "Got %d buffers.\n", props.cBuffers); + ok(!props.cbBuffer, "Got size %d.\n", props.cbBuffer); + ok(!props.cbAlign, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); hr = IMemInputPin_NotifyAllocator(input, ret_allocator, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); req_props.cBuffers = 1; req_props.cbBuffer = 32 * 16 * 4; req_props.cbAlign = 1; req_props.cbPrefix = 0; hr = IMemAllocator_SetProperties(ret_allocator, &req_props, &props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(props.cBuffers == 1, "Got %ld buffers.\n", props.cBuffers); - ok(props.cbBuffer == 32 * 16 * 4, "Got size %ld.\n", props.cbBuffer); - ok(props.cbAlign == 1, "Got alignment %ld.\n", props.cbAlign); - ok(!props.cbPrefix, "Got prefix %ld.\n", props.cbPrefix); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(props.cBuffers == 1, "Got %d buffers.\n", props.cBuffers); + ok(props.cbBuffer == 32 * 16 * 4, "Got size %d.\n", props.cbBuffer); + ok(props.cbAlign == 1, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); IMemAllocator_Release(ret_allocator); } hr = IMemInputPin_NotifyAllocator(input, NULL, TRUE); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)&req_allocator); hr = IMemInputPin_NotifyAllocator(input, req_allocator, TRUE); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); IMemAllocator_Release(req_allocator); } @@ -974,9 +971,9 @@ static DWORD WINAPI frame_thread(void *arg) struct frame_thread_params *params = arg; HRESULT hr; - if (winetest_debug > 1) trace("%04lx: Sending frame.\n", GetCurrentThreadId()); + if (winetest_debug > 1) trace("%04x: Sending frame.\n", GetCurrentThreadId()); hr = IMemInputPin_Receive(params->sink, params->sample); - if (winetest_debug > 1) trace("%04lx: Returned %#lx.\n", GetCurrentThreadId(), hr); + if (winetest_debug > 1) trace("%04x: Returned %#x.\n", GetCurrentThreadId(), hr); IMediaSample_Release(params->sample); free(params); return hr; @@ -994,27 +991,27 @@ static HANDLE send_frame_time(IMemInputPin *sink, REFERENCE_TIME start_time, DWO BYTE *data; hr = IMemInputPin_GetAllocator(sink, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); size = IMediaSample_GetSize(sample); hr = IMediaSample_GetPointer(sample, &data); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); for (i = 0; i < size / sizeof(DWORD); ++i) ((DWORD *)data)[i] = color; hr = IMediaSample_SetActualDataLength(sample, size); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); start_time *= 10000000; end_time = start_time + 10000000; hr = IMediaSample_SetTime(sample, &start_time, &end_time); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSample_SetPreroll(sample, TRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); params->sink = sink; params->sample = sample; @@ -1045,9 +1042,9 @@ static void commit_allocator(IMemInputPin *input) HRESULT hr; hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -1061,130 +1058,130 @@ static void test_filter_state(IMemInputPin *input, IMediaControl *control) thread = send_frame(input); hr = join_thread(thread); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); /* The renderer is not fully paused until it receives a sample. The thread * sending the sample blocks in IMemInputPin_Receive() until the filter is * stopped or run. */ hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* The sink will decommit our allocator for us when stopping, however it * will not recommit it when pausing. */ hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_GetBuffer(allocator, &sample, NULL, NULL, 0); - todo_wine ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_COMMITTED, "Got hr %#x.\n", hr); if (hr == S_OK) IMediaSample_Release(sample); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -1197,61 +1194,61 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IMediaControl *control commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); thread = send_frame(input); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* We dropped the sample we were holding, so now we need a new one... */ hr = IMediaControl_GetState(control, 0, &state); - todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %#lx.\n", state); + todo_wine ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %#x.\n", state); thread = send_frame(input); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == State_Paused, "Got state %#lx.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == State_Paused, "Got state %#x.\n", state); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame(input); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG expected_code, LONG_PTR expected1, LONG_PTR expected2) @@ -1265,14 +1262,14 @@ static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG { if (code == expected_code) { - ok(param1 == expected1, "Got param1 %#Ix.\n", param1); - ok(param2 == expected2, "Got param2 %#Ix.\n", param2); + ok(param1 == expected1, "Got param1 %#lx.\n", param1); + ok(param2 == expected2, "Got param2 %#lx.\n", param2); ret++; } IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); timeout = 0; } - ok(hr == E_ABORT, "Got hr %#lx.\n", hr); + ok(hr == E_ABORT, "Got hr %#x.\n", hr); return ret; } @@ -1293,28 +1290,28 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = join_thread(send_frame(input)); - todo_wine ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_UNEXPECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Expected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -1323,23 +1320,23 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) commit_allocator(input); hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); ret = check_ec_complete(eventsrc, 1600); todo_wine ok(ret == 1, "Expected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -1347,19 +1344,19 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) commit_allocator(input); hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -1367,31 +1364,31 @@ static void test_eos(IPin *pin, IMemInputPin *input, IMediaControl *control) commit_allocator(input); hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); todo_wine ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_EndOfStream(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got unexpected EC_COMPLETE.\n"); @@ -1406,25 +1403,25 @@ static void test_sample_time(IPin *pin, IMemInputPin *input, IMediaControl *cont commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 0, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); thread = send_frame_time(input, 1, 0x000000ff); /* blue */ hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(WaitForSingleObject(thread, 500) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Sample time is relative to the time passed to Run(). Thus a sample * stamped at or earlier than 1s will now be displayed immediately, because @@ -1436,33 +1433,33 @@ static void test_sample_time(IPin *pin, IMemInputPin *input, IMediaControl *cont * discontinuous. */ hr = join_thread(send_frame_time(input, 1, 0x0000ffff)); /* cyan */ - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame_time(input, 0, 0x0000ff00)); /* green */ - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(send_frame_time(input, -2, 0x00ff0000)); /* red */ - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame_time(input, 1000000, 0x00ffffff); /* white */ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IPin_BeginFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); /* If the frame makes it to Receive() in time to be rendered, we get S_OK. */ - ok(hr == S_OK || hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_OK || hr == S_FALSE, "Got hr %#x.\n", hr); hr = IPin_EndFlush(pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); thread = send_frame_time(input, 1000000, 0x00ffff00); /* yellow */ ok(WaitForSingleObject(thread, 100) == WAIT_TIMEOUT, "Thread should block in Receive().\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); /* If the frame makes it to Receive() in time to be rendered, we get S_OK. */ - ok(hr == S_OK || hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == S_OK || hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); } static void test_current_image(IBaseFilter *filter, IMemInputPin *input, @@ -1484,68 +1481,68 @@ static void test_current_image(IBaseFilter *filter, IMemInputPin *input, IBaseFilter_QueryInterface(filter, &IID_IBasicVideo, (void **)&video); hr = IBasicVideo_GetCurrentImage(video, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetCurrentImage(video, NULL, buffer); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); size = 0xdeadbeef; hr = IBasicVideo_GetCurrentImage(video, &size, NULL); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 4, "Got size %ld.\n", size); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(size == sizeof(BITMAPINFOHEADER) + 32 * 16 * 4, "Got size %d.\n", size); size = sizeof(buffer); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); /* The contents seem to reflect the last frame rendered. */ commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); size = sizeof(buffer); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); /* The contents seem to reflect the last frame rendered. */ thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); size = 1; memset(buffer, 0xcc, sizeof(buffer)); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == 1, "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == 1, "Got size %d.\n", size); size = sizeof(buffer); memset(buffer, 0xcc, sizeof(buffer)); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); for (i = 0; i < 32 * 16; ++i) - ok((data[i] & 0xffffff) == 0x7f007f, "Got unexpected color %08lx at %u.\n", data[i], i); + ok((data[i] & 0xffffff) == 0x7f007f, "Got unexpected color %08x at %u.\n", data[i], i); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); join_thread(thread); size = sizeof(buffer); memset(buffer, 0xcc, sizeof(buffer)); hr = IBasicVideo_GetCurrentImage(video, &size, buffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(size == sizeof(buffer), "Got size %ld.\n", size); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(size == sizeof(buffer), "Got size %d.\n", size); ok(!memcmp(bih, &expect_bih, sizeof(BITMAPINFOHEADER)), "Bitmap headers didn't match.\n"); for (i = 0; i < 32 * 16; ++i) - ok((data[i] & 0xffffff) == 0x7f007f, "Got unexpected color %08lx at %u.\n", data[i], i); + ok((data[i] & 0xffffff) == 0x7f007f, "Got unexpected color %08x at %u.\n", data[i], i); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IBasicVideo_Release(video); } @@ -1569,19 +1566,19 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IOverlay_Release(overlay); commit_allocator(input); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); SendMessageW(hwnd, WM_CLOSE, 0, 0); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(ret == 1, "Expected EC_USERABORT.\n"); @@ -1594,17 +1591,17 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con if (ret == WAIT_OBJECT_0) { GetExitCodeThread(thread, (DWORD *)&hr); - ok(hr == E_UNEXPECTED, "Got hr %#lx.\n", hr); + ok(hr == E_UNEXPECTED, "Got hr %#x.\n", hr); } CloseHandle(thread); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1612,11 +1609,11 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con commit_allocator(input); hr = IMediaControl_Run(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = join_thread(send_frame(input)); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1629,7 +1626,7 @@ static void test_window_close(IPin *pin, IMemInputPin *input, IMediaControl *con ok(!IsWindowVisible(hwnd), "Window should be visible.\n"); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_userabort(eventsrc, 0); ok(!ret, "Got unexpected EC_USERABORT.\n"); @@ -1699,54 +1696,54 @@ static void test_connect_pin(void) skip("Got E_FAIL when connecting.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx for subtype %s and bpp %u.\n", hr, + ok(hr == S_OK, "Got hr %#x for subtype %s and bpp %u.\n", hr, wine_dbgstr_guid(subtype_tests[i]), bpp_tests[j]); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } } req_mt.formattype = FORMAT_None; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.formattype = FORMAT_VideoInfo; req_mt.subtype = MEDIASUBTYPE_RGB8; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_WAVE; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); req_mt.subtype = MEDIASUBTYPE_RGB32; peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == VFW_E_NOT_STOPPED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_STOPPED, "Got hr %#x.\n", hr); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IPin_ConnectedTo(pin, &peer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(peer == &source.source.pin.IPin_iface, "Got peer %p.\n", peer); IPin_Release(peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); /* Disconnecting while not stopped is broken: it returns S_OK, but @@ -1755,16 +1752,16 @@ static void test_connect_pin(void) test_allocator(input); hr = IMemInputPin_GetAllocator(input, &allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); hr = IMemInputPin_ReceiveCanBlock(input); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); test_filter_state(input, control); test_flushing(pin, input, control); @@ -1774,30 +1771,30 @@ static void test_connect_pin(void) test_window_close(pin, input, control); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); ok(source.source.pin.peer == pin, "Got peer %p.\n", source.source.pin.peer); IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); peer = (IPin *)0xdeadbeef; hr = IPin_ConnectedTo(pin, &peer); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); ok(!peer, "Got peer %p.\n", peer); hr = IPin_ConnectionMediaType(pin, &mt); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); out: IMediaControl_Release(control); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMemInputPin_Release(input); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_overlay(void) @@ -1812,49 +1809,49 @@ static void test_overlay(void) IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hwnd = (HWND)0xdeadbeef; hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(hwnd && hwnd != (HWND)0xdeadbeef, "Got invalid window %p.\n", hwnd); IOverlay_Release(overlay); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); filter = create_vmr9(VMR9Mode_Windowless); IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hwnd = (HWND)0xdeadbeef; hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ok(hwnd == (HWND)0xdeadbeef, "Got window %p.\n", hwnd); IOverlay_Release(overlay); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); filter = create_vmr9(VMR9Mode_Renderless); IBaseFilter_FindPin(filter, L"VMR Input0", &pin); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hwnd = (HWND)0xdeadbeef; hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ok(hwnd == (HWND)0xdeadbeef, "Got window %p.\n", hwnd); IOverlay_Release(overlay); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } /* try to make sure pending X events have been processed before continuing */ @@ -1878,7 +1875,7 @@ static void flush_events(void) static LRESULT CALLBACK window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { if (winetest_debug > 1) - trace("hwnd %p, msg %#x, wparam %#Ix, lparam %#Ix.\n", hwnd, msg, wparam, lparam); + trace("hwnd %p, msg %#x, wparam %#lx, lparam %#lx.\n", hwnd, msg, wparam, lparam); if (wparam == 0xdeadbeef) return 0; @@ -1893,7 +1890,7 @@ static void test_video_window_caption(IVideoWindow *window, HWND hwnd) HRESULT hr; hr = IVideoWindow_get_Caption(window, &caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(caption, L"ActiveMovie Window"), "Got caption %s.\n", wine_dbgstr_w(caption)); SysFreeString(caption); @@ -1902,11 +1899,11 @@ static void test_video_window_caption(IVideoWindow *window, HWND hwnd) caption = SysAllocString(L"foo"); hr = IVideoWindow_put_Caption(window, caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SysFreeString(caption); hr = IVideoWindow_get_Caption(window, &caption); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(caption, L"foo"), "Got caption %s.\n", wine_dbgstr_w(caption)); SysFreeString(caption); @@ -1920,53 +1917,53 @@ static void test_video_window_style(IVideoWindow *window, HWND hwnd, HWND our_hw LONG style; hr = IVideoWindow_get_WindowStyle(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), - "Got style %#lx.\n", style); + "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_STYLE); ok(style == (WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW), - "Got style %#lx.\n", style); + "Got style %#x.\n", style); hr = IVideoWindow_put_WindowStyle(window, style | WS_DISABLED); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_HSCROLL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_VSCROLL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_MAXIMIZE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style | WS_MINIMIZE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowStyle(window, style & ~WS_CLIPCHILDREN); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyle(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#lx.\n", style); + ok(style == (WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW), "Got style %#x.\n", style); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_get_WindowStyleEx(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == WS_EX_WINDOWEDGE, "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_EXSTYLE); - ok(style == WS_EX_WINDOWEDGE, "Got style %#lx.\n", style); + ok(style == WS_EX_WINDOWEDGE, "Got style %#x.\n", style); hr = IVideoWindow_put_WindowStyleEx(window, style | WS_EX_TRANSPARENT); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyleEx(window, &style); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#lx.\n", style); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); style = GetWindowLongA(hwnd, GWL_EXSTYLE); - ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#lx.\n", style); + ok(style == (WS_EX_WINDOWEDGE | WS_EX_TRANSPARENT), "Got style %#x.\n", style); } static BOOL CALLBACK top_window_cb(HWND hwnd, LPARAM ctx) @@ -1997,25 +1994,25 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); ok(!IsZoomed(hwnd), "Window should not be maximized.\n"); hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -2025,14 +2022,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(top == hwnd, "Got top window %p.\n", top); hr = IVideoWindow_put_WindowState(window, SW_MINIMIZE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_MINIMIZE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MINIMIZE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(IsIconic(hwnd), "Window should be minimized.\n"); @@ -2040,14 +2037,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_RESTORE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -2055,14 +2052,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_MAXIMIZE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_MAXIMIZE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_MAXIMIZE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should be minimized.\n"); @@ -2070,17 +2067,17 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_RESTORE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_WindowState(window, SW_HIDE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -2088,14 +2085,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_Visible(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_SHOW, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_SHOW, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(state == OATRUE, "Got state %d.\n", state); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -2103,14 +2100,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowState(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == SW_HIDE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == SW_HIDE, "Got state %d.\n", state); hr = IVideoWindow_get_Visible(window, &state); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(state == OAFALSE, "Got state %d.\n", state); ok(!IsWindowVisible(hwnd), "Window should not be visible.\n"); ok(!IsIconic(hwnd), "Window should not be minimized.\n"); @@ -2118,14 +2115,14 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); hr = IVideoWindow_put_WindowState(window, SW_SHOWNA); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_SetWindowForeground(window, TRUE); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_SetWindowForeground(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -2133,7 +2130,7 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw ok(top == hwnd, "Got top window %p.\n", top); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -2142,7 +2139,7 @@ static void test_video_window_state(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_SetWindowForeground(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); ok(GetFocus() == our_hwnd, "Got focus window %p.\n", GetFocus()); ok(GetForegroundWindow() == our_hwnd, "Got foreground window %p.\n", GetForegroundWindow()); @@ -2164,114 +2161,114 @@ static void test_video_window_position(IVideoWindow *window, HWND hwnd, HWND our expect_height = rect.bottom - rect.top; hr = IVideoWindow_put_Left(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Top(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == expect_height, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 0, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 0, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == expect_height, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 0, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == expect_height, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 0, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_put_Left(window, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == expect_height, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == expect_height, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == expect_height, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 10, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == 10 + expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == expect_height, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == expect_height, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_put_Height(window, 200); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 0, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 0, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == expect_width, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == expect_width, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == 200, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 200, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 10, "Got left %ld.\n", left); - ok(top == 0, "Got top %ld.\n", top); - ok(width == expect_width, "Got width %ld.\n", width); - ok(height == 200, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 10, "Got left %d.\n", left); + ok(top == 0, "Got top %d.\n", top); + ok(width == expect_width, "Got width %d.\n", width); + ok(height == 200, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 10, "Got window left %ld.\n", rect.left); - ok(rect.top == 0, "Got window top %ld.\n", rect.top); - ok(rect.right == 10 + expect_width, "Got window right %ld.\n", rect.right); - ok(rect.bottom == 200, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 10, "Got window left %d.\n", rect.left); + ok(rect.top == 0, "Got window top %d.\n", rect.top); + ok(rect.right == 10 + expect_width, "Got window right %d.\n", rect.right); + ok(rect.bottom == 200, "Got window bottom %d.\n", rect.bottom); hr = IVideoWindow_SetWindowPosition(window, 100, 200, 300, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Left(window, &left); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 100, "Got left %ld.\n", left); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); hr = IVideoWindow_get_Top(window, &top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(top == 200, "Got top %ld.\n", top); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(top == 200, "Got top %d.\n", top); hr = IVideoWindow_get_Width(window, &width); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 300, "Got width %ld.\n", width); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 300, "Got width %d.\n", width); hr = IVideoWindow_get_Height(window, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(height == 400, "Got height %d.\n", height); hr = IVideoWindow_GetWindowPosition(window, &left, &top, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(left == 100, "Got left %ld.\n", left); - ok(top == 200, "Got top %ld.\n", top); - ok(width == 300, "Got width %ld.\n", width); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(left == 100, "Got left %d.\n", left); + ok(top == 200, "Got top %d.\n", top); + ok(width == 300, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); GetWindowRect(hwnd, &rect); - ok(rect.left == 100, "Got window left %ld.\n", rect.left); - ok(rect.top == 200, "Got window top %ld.\n", rect.top); - ok(rect.right == 400, "Got window right %ld.\n", rect.right); - ok(rect.bottom == 600, "Got window bottom %ld.\n", rect.bottom); + ok(rect.left == 100, "Got window left %d.\n", rect.left); + ok(rect.top == 200, "Got window top %d.\n", rect.top); + ok(rect.right == 400, "Got window right %d.\n", rect.right); + ok(rect.bottom == 600, "Got window bottom %d.\n", rect.bottom); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); @@ -2288,25 +2285,25 @@ static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hw SetWindowPos(our_hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(!(style & WS_CHILD), "Got style %#lx.\n", style); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == our_hwnd, "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok((style & WS_CHILD), "Got style %#lx.\n", style); + ok((style & WS_CHILD), "Got style %#x.\n", style); ok(GetActiveWindow() == our_hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); @@ -2315,31 +2312,31 @@ static void test_video_window_owner(IVideoWindow *window, HWND hwnd, HWND our_hw ShowWindow(our_hwnd, SW_HIDE); hr = IVideoWindow_put_Visible(window, OATRUE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == OAFALSE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OAFALSE, "Got state %d.\n", state); hr = IVideoWindow_put_Owner(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Owner(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got owner %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got owner %#lx.\n", oahwnd); parent = GetAncestor(hwnd, GA_PARENT); ok(parent == GetDesktopWindow(), "Got parent %p.\n", parent); style = GetWindowLongA(hwnd, GWL_STYLE); - ok(!(style & WS_CHILD), "Got style %#lx.\n", style); + ok(!(style & WS_CHILD), "Got style %#x.\n", style); ok(GetActiveWindow() == hwnd, "Got active window %p.\n", GetActiveWindow()); top_hwnd = get_top_window(); ok(top_hwnd == hwnd, "Got top window %p.\n", top_hwnd); hr = IVideoWindow_get_Visible(window, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(state == OATRUE, "Got state %ld.\n", state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == OATRUE, "Got state %d.\n", state); } struct notify_message_params @@ -2353,7 +2350,7 @@ static DWORD CALLBACK notify_message_proc(void *arg) { const struct notify_message_params *params = arg; HRESULT hr = IVideoWindow_NotifyOwnerMessage(params->window, (OAHWND)params->hwnd, params->message, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return 0; } @@ -2396,15 +2393,15 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our flush_events(); hr = IVideoWindow_get_MessageDrain(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!oahwnd, "Got window %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!oahwnd, "Got window %#lx.\n", oahwnd); hr = IVideoWindow_put_MessageDrain(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_MessageDrain(window, &oahwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(oahwnd == (OAHWND)our_hwnd, "Got window %#Ix.\n", oahwnd); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(oahwnd == (OAHWND)our_hwnd, "Got window %#lx.\n", oahwnd); for (i = 0; i < ARRAY_SIZE(drain_tests); ++i) { @@ -2413,8 +2410,8 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our ok(ret, "Expected a message.\n"); ok(msg.hwnd == our_hwnd, "Got hwnd %p.\n", msg.hwnd); ok(msg.message == drain_tests[i], "Got message %#x.\n", msg.message); - ok(msg.wParam == 0xdeadbeef, "Got wparam %#Ix.\n", msg.wParam); - ok(!msg.lParam, "Got lparam %#Ix.\n", msg.lParam); + ok(msg.wParam == 0xdeadbeef, "Got wparam %#lx.\n", msg.wParam); + ok(!msg.lParam, "Got lparam %#lx.\n", msg.lParam); DispatchMessageA(&msg); ret = PeekMessageA(&msg, 0, drain_tests[i], drain_tests[i], PM_REMOVE); @@ -2422,10 +2419,10 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_put_MessageDrain(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Owner(window, (OAHWND)our_hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); flush_events(); @@ -2434,7 +2431,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our * posted all messages. */ hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_SYSCOLORCHANGE, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { @@ -2443,7 +2440,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_NotifyOwnerMessage(window, (OAHWND)our_hwnd, WM_FONTCHANGE, 0, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) { @@ -2480,7 +2477,7 @@ static void test_video_window_messages(IVideoWindow *window, HWND hwnd, HWND our } hr = IVideoWindow_put_Owner(window, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *graph, HWND hwnd) @@ -2492,41 +2489,41 @@ static void test_video_window_autoshow(IVideoWindow *window, IFilterGraph2 *grap IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); hr = IVideoWindow_get_AutoShow(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OATRUE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OATRUE, "Got %d.\n", l); hr = IVideoWindow_put_AutoShow(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_put_Visible(window, OAFALSE); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Visible(window, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(l == OAFALSE, "Got %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(l == OAFALSE, "Got %d.\n", l); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaControl_Release(control); } @@ -2586,27 +2583,27 @@ static void test_video_window(void) IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); hr = IPin_QueryInterface(pin, &IID_IOverlay, (void **)&overlay); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IOverlay_GetWindowHandle(overlay, &hwnd); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (winetest_debug > 1) trace("ours %p, theirs %p\n", our_hwnd, hwnd); GetWindowRect(hwnd, &rect); tid = GetWindowThreadProcessId(hwnd, NULL); - ok(tid == GetCurrentThreadId(), "Expected tid %#lx, got %#lx.\n", GetCurrentThreadId(), tid); + ok(tid == GetCurrentThreadId(), "Expected tid %#x, got %#x.\n", GetCurrentThreadId(), tid); hr = IBaseFilter_QueryInterface(filter, &IID_IVideoWindow, (void **)&window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVideoWindow_get_Caption(window, &caption); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IVideoWindow_get_WindowStyle(window, &l); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IVideoWindow_get_AutoShow(window, &l); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); testfilter_init(&source); IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, NULL); @@ -2618,17 +2615,17 @@ static void test_video_window(void) skip("Got E_FAIL when connecting.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -2643,34 +2640,34 @@ static void test_video_window(void) test_video_window_messages(window, hwnd, our_hwnd); hr = IVideoWindow_put_FullScreenMode(window, OATRUE); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IVideoWindow_get_FullScreenMode(window, &l); - ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); - todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); - todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); monitorinfo.cbSize = sizeof(monitorinfo); GetMonitorInfoW(MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY), &monitorinfo); hr = IVideoWindow_GetMinIdealImageSize(window, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(width == 1, "Got width %ld.\n", width); - todo_wine ok(height == 1, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == 1, "Got width %d.\n", width); + todo_wine ok(height == 1, "Got height %d.\n", height); hr = IVideoWindow_GetMaxIdealImageSize(window, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(width == monitorinfo.rcMonitor.right + 1, "Expected width %ld, got %ld.\n", + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(width == monitorinfo.rcMonitor.right + 1, "Expected width %d, got %d.\n", monitorinfo.rcMonitor.right + 1, width); - todo_wine ok(height == monitorinfo.rcMonitor.bottom + 1, "Expected height %ld, got %ld.\n", + todo_wine ok(height == monitorinfo.rcMonitor.bottom + 1, "Expected height %d, got %d.\n", monitorinfo.rcMonitor.bottom + 1, height); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); out: IMediaControl_Release(control); @@ -2680,9 +2677,9 @@ out: IMemInputPin_Release(input); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(our_hwnd); } @@ -2709,7 +2706,7 @@ static IDirect3DDevice9 *create_device(HWND window) IDirect3D9_Release(d3d); if (FAILED(hr)) { - skip("Failed to create a 3D device, hr %#lx.\n", hr); + skip("Failed to create a 3D device, hr %#x.\n", hr); return NULL; } return device; @@ -2754,7 +2751,7 @@ static void test_allocate_surface_helper(void) count = 2; hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - todo_wine ok(hr == E_FAIL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_FAIL, "Got hr %#x.\n", hr); hr = IVMRSurfaceAllocatorNotify9_SetD3DDevice(notify, device, MonitorFromWindow(window, MONITOR_DEFAULTTOPRIMARY)); if (hr == E_NOINTERFACE) @@ -2762,42 +2759,42 @@ static void test_allocate_surface_helper(void) win_skip("Direct3D does not support video rendering.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); if (0) /* crashes on Windows */ { hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, NULL, &count, surfaces); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, NULL, surfaces); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); } hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); ok(!!surfaces[0], "Surface 0 was not allocated.\n"); ok(!!surfaces[1], "Surface 1 was not allocated.\n"); hr = IDirect3DSurface9_GetDevice(surfaces[0], &device2); - ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#x.\n", hr); ok(device2 == device, "Devices did not match.\n"); IDirect3DDevice9_Release(device2); hr = IDirect3DSurface9_GetContainer(surfaces[0], &IID_IDirect3DTexture9, (void **)&container); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); hr = IDirect3DSurface9_GetDesc(surfaces[0], &desc); - ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#x.\n", hr); ok(desc.Format == info.Format, "Got format %#x.\n", desc.Format); ok(desc.Type == D3DRTYPE_SURFACE, "Got type %u.\n", desc.Type); - ok(!desc.Usage, "Got usage %#lx.\n", desc.Usage); + ok(!desc.Usage, "Got usage %#x.\n", desc.Usage); ok(desc.Pool == D3DPOOL_DEFAULT, "Got pool %u.\n", desc.Pool); ok(desc.MultiSampleType == D3DMULTISAMPLE_NONE, "Got multisample type %u.\n", desc.MultiSampleType); - ok(!desc.MultiSampleQuality, "Got multisample quality %lu.\n", desc.MultiSampleQuality); + ok(!desc.MultiSampleQuality, "Got multisample quality %u.\n", desc.MultiSampleQuality); ok(desc.Width == 32, "Got width %u.\n", desc.Width); ok(desc.Height == 16, "Got height %u.\n", desc.Height); @@ -2807,16 +2804,16 @@ static void test_allocate_surface_helper(void) surfaces[0] = surfaces[1] = NULL; count = 1; hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); - todo_wine ok(!count, "Got count %lu.\n", count); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(!count, "Got count %u.\n", count); ok(!surfaces[0], "Surface 0 was allocated.\n"); ok(!surfaces[1], "Surface 1 was allocated.\n"); count = 2; info.MinBuffers = 1; hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); ok(!!surfaces[0], "Surface 0 was not allocated.\n"); ok(!!surfaces[1], "Surface 1 was not allocated.\n"); IDirect3DSurface9_Release(surfaces[0]); @@ -2826,28 +2823,28 @@ static void test_allocate_surface_helper(void) info.dwFlags = VMR9AllocFlag_TextureSurface; surfaces[0] = surfaces[1] = NULL; hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); ok(!!surfaces[0], "Surface 0 was not allocated.\n"); ok(!!surfaces[1], "Surface 1 was not allocated.\n"); hr = IDirect3DSurface9_GetDevice(surfaces[0], &device2); - ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#x.\n", hr); ok(device2 == device, "Devices did not match.\n"); IDirect3DDevice9_Release(device2); hr = IDirect3DSurface9_GetContainer(surfaces[0], &IID_IDirect3DTexture9, (void **)&container); - ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#x.\n", hr); IDirect3DTexture9_Release(container); hr = IDirect3DSurface9_GetDesc(surfaces[1], &desc); - ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#x.\n", hr); ok(desc.Format == info.Format, "Got format %#x.\n", desc.Format); ok(desc.Type == D3DRTYPE_SURFACE, "Got type %u.\n", desc.Type); - ok(desc.Usage == D3DUSAGE_DYNAMIC, "Got usage %#lx.\n", desc.Usage); + ok(desc.Usage == D3DUSAGE_DYNAMIC, "Got usage %#x.\n", desc.Usage); ok(desc.Pool == D3DPOOL_DEFAULT, "Got pool %u.\n", desc.Pool); ok(desc.MultiSampleType == D3DMULTISAMPLE_NONE, "Got multisample type %u.\n", desc.MultiSampleType); - ok(!desc.MultiSampleQuality, "Got multisample quality %lu.\n", desc.MultiSampleQuality); + ok(!desc.MultiSampleQuality, "Got multisample quality %u.\n", desc.MultiSampleQuality); ok(desc.Width == 32, "Got width %u.\n", desc.Width); ok(desc.Height == 16, "Got height %u.\n", desc.Height); @@ -2857,8 +2854,8 @@ static void test_allocate_surface_helper(void) info.Format = D3DFMT_R8G8B8; surfaces[0] = surfaces[1] = NULL; hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == D3DERR_INVALIDCALL, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); ok(!surfaces[0], "Surface 0 was allocated.\n"); ok(!surfaces[1], "Surface 1 was allocated.\n"); @@ -2866,19 +2863,19 @@ static void test_allocate_surface_helper(void) info.dwFlags = VMR9AllocFlag_3DRenderTarget; count = 1; hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); ok(!!surfaces[0], "Surface 0 was not allocated.\n"); ok(info.Format != 0, "Expected a format.\n"); hr = IDirect3DSurface9_GetDesc(surfaces[0], &desc); - ok(hr == D3D_OK, "Got hr %#lx.\n", hr); + ok(hr == D3D_OK, "Got hr %#x.\n", hr); ok(desc.Format == info.Format, "Expected format %#x, got %#x.\n", info.Format, desc.Format); ok(desc.Type == D3DRTYPE_SURFACE, "Got type %u.\n", desc.Type); - ok(desc.Usage == D3DUSAGE_RENDERTARGET, "Got usage %#lx.\n", desc.Usage); + ok(desc.Usage == D3DUSAGE_RENDERTARGET, "Got usage %#x.\n", desc.Usage); ok(desc.Pool == D3DPOOL_DEFAULT, "Got pool %u.\n", desc.Pool); ok(desc.MultiSampleType == D3DMULTISAMPLE_NONE, "Got multisample type %u.\n", desc.MultiSampleType); - ok(!desc.MultiSampleQuality, "Got multisample quality %lu.\n", desc.MultiSampleQuality); + ok(!desc.MultiSampleQuality, "Got multisample quality %u.\n", desc.MultiSampleQuality); ok(desc.Width == 32, "Got width %u.\n", desc.Width); ok(desc.Height == 16, "Got height %u.\n", desc.Height); @@ -2888,15 +2885,15 @@ static void test_allocate_surface_helper(void) info.dwFlags = VMR9AllocFlag_OffscreenSurface | VMR9AllocFlag_TextureSurface; count = 1; hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(notify, &info, &count, surfaces); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); out: IVMRSurfaceAllocatorNotify9_Release(notify); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IDirect3DDevice9_Release(device); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(window); } @@ -2939,14 +2936,14 @@ static ULONG WINAPI presenter_Release(IVMRImagePresenter9 *iface) static HRESULT WINAPI presenter_StartPresenting(IVMRImagePresenter9 *iface, DWORD_PTR cookie) { if (winetest_debug > 1) trace("StartPresenting()\n"); - ok(cookie == 0xabacab, "Got cookie %#Ix.\n", cookie); + ok(cookie == 0xabacab, "Got cookie %#lx.\n", cookie); return E_NOTIMPL; } static HRESULT WINAPI presenter_StopPresenting(IVMRImagePresenter9 *iface, DWORD_PTR cookie) { if (winetest_debug > 1) trace("StopPresenting()\n"); - ok(cookie == 0xabacab, "Got cookie %#Ix.\n", cookie); + ok(cookie == 0xabacab, "Got cookie %#lx.\n", cookie); return E_NOTIMPL; } @@ -2956,16 +2953,16 @@ static HRESULT WINAPI presenter_PresentImage(IVMRImagePresenter9 *iface, DWORD_P static const RECT rect; if (winetest_debug > 1) trace("PresentImage()\n"); - ok(cookie == 0xabacab, "Got cookie %#Ix.\n", cookie); - todo_wine ok(info->dwFlags == VMR9Sample_TimeValid, "Got flags %#lx.\n", info->dwFlags); + ok(cookie == 0xabacab, "Got cookie %#lx.\n", cookie); + todo_wine ok(info->dwFlags == VMR9Sample_TimeValid, "Got flags %#x.\n", info->dwFlags); ok(!info->rtStart, "Got start time %s.\n", wine_dbgstr_longlong(info->rtStart)); ok(info->rtEnd == 10000000, "Got end time %s.\n", wine_dbgstr_longlong(info->rtEnd)); - todo_wine ok(info->szAspectRatio.cx == 120, "Got aspect ratio width %ld.\n", info->szAspectRatio.cx); - todo_wine ok(info->szAspectRatio.cy == 60, "Got aspect ratio height %ld.\n", info->szAspectRatio.cy); + todo_wine ok(info->szAspectRatio.cx == 120, "Got aspect ratio width %d.\n", info->szAspectRatio.cx); + todo_wine ok(info->szAspectRatio.cy == 60, "Got aspect ratio height %d.\n", info->szAspectRatio.cy); ok(EqualRect(&info->rcSrc, &rect), "Got source rect %s.\n", wine_dbgstr_rect(&info->rcSrc)); ok(EqualRect(&info->rcDst, &rect), "Got dest rect %s.\n", wine_dbgstr_rect(&info->rcDst)); - ok(!info->dwReserved1, "Got dwReserved1 %#lx.\n", info->dwReserved1); - ok(!info->dwReserved2, "Got dwReserved2 %#lx.\n", info->dwReserved2); + ok(!info->dwReserved1, "Got dwReserved1 %#x.\n", info->dwReserved1); + ok(!info->dwReserved2, "Got dwReserved2 %#x.\n", info->dwReserved2); ++presenter->got_PresentImage; return S_OK; @@ -3020,18 +3017,18 @@ static HRESULT WINAPI allocator_InitializeDevice(IVMRSurfaceAllocator9 *iface, { struct presenter *presenter = impl_from_IVMRSurfaceAllocator9(iface); - if (winetest_debug > 1) trace("InitializeDevice(flags %#lx, format %u)\n", + if (winetest_debug > 1) trace("InitializeDevice(flags %#x, format %u)\n", info->dwFlags, info->Format); - ok(cookie == 0xabacab, "Got cookie %#Ix.\n", cookie); - ok(info->dwWidth == 32, "Got width %lu.\n", info->dwWidth); - ok(info->dwHeight == 16, "Got height %lu.\n", info->dwHeight); - todo_wine ok(info->MinBuffers == 5, "Got buffer count %lu.\n", info->MinBuffers); + ok(cookie == 0xabacab, "Got cookie %#lx.\n", cookie); + ok(info->dwWidth == 32, "Got width %u.\n", info->dwWidth); + ok(info->dwHeight == 16, "Got height %u.\n", info->dwHeight); + todo_wine ok(info->MinBuffers == 5, "Got buffer count %u.\n", info->MinBuffers); ok(info->Pool == D3DPOOL_DEFAULT, "Got pool %u\n", info->Pool); - todo_wine ok(info->szAspectRatio.cx == 120, "Got aspect ratio width %ld.\n", info->szAspectRatio.cx); - todo_wine ok(info->szAspectRatio.cy == 60, "Got aspect ratio height %ld.\n", info->szAspectRatio.cy); - ok(info->szNativeSize.cx == 32, "Got native width %ld.\n", info->szNativeSize.cx); - ok(info->szNativeSize.cy == 16, "Got native height %ld.\n", info->szNativeSize.cy); - todo_wine ok(*buffer_count == 5, "Got buffer count %lu.\n", *buffer_count); + todo_wine ok(info->szAspectRatio.cx == 120, "Got aspect ratio width %d.\n", info->szAspectRatio.cx); + todo_wine ok(info->szAspectRatio.cy == 60, "Got aspect ratio height %d.\n", info->szAspectRatio.cy); + ok(info->szNativeSize.cx == 32, "Got native width %d.\n", info->szNativeSize.cx); + ok(info->szNativeSize.cy == 16, "Got native height %d.\n", info->szNativeSize.cy); + todo_wine ok(*buffer_count == 5, "Got buffer count %u.\n", *buffer_count); presenter->format = info->Format; @@ -3046,7 +3043,7 @@ static HRESULT WINAPI allocator_TerminateDevice(IVMRSurfaceAllocator9 *iface, DW struct presenter *presenter = impl_from_IVMRSurfaceAllocator9(iface); if (winetest_debug > 1) trace("TerminateDevice()\n"); - ok(cookie == 0xabacab, "Got cookie %#Ix.\n", cookie); + ok(cookie == 0xabacab, "Got cookie %#lx.\n", cookie); /* Don't dereference the surfaces here, to mimic How to Survive. */ ++presenter->got_TerminateDevice; return E_NOTIMPL; @@ -3057,10 +3054,10 @@ static HRESULT WINAPI allocator_GetSurface(IVMRSurfaceAllocator9 *iface, { struct presenter *presenter = impl_from_IVMRSurfaceAllocator9(iface); - if (winetest_debug > 1) trace("GetSurface(index %lu)\n", index); - ok(cookie == 0xabacab, "Got cookie %#Ix.\n", cookie); - ok(!flags, "Got flags %#lx.\n", flags); - ok(index < 5, "Got index %lu.\n", index); + if (winetest_debug > 1) trace("GetSurface(index %u)\n", index); + ok(cookie == 0xabacab, "Got cookie %#lx.\n", cookie); + ok(!flags, "Got flags %#x.\n", flags); + ok(index < 5, "Got index %u.\n", index); /* Don't reference the surface here, to mimic How to Survive. */ *surface = presenter->surfaces[index]; @@ -3097,10 +3094,10 @@ static void test_renderless_present(struct presenter *presenter, presenter->got_PresentImage = 0; hr = IMediaControl_Pause(control); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); thread = send_frame(input); hr = IMediaControl_GetState(control, 1000, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); /* Atelier Sophie uses the VMR in renderless mode, calls * IMediaControl::Run() from a stopped state and expects that * IMediaControl::GetState() returns S_OK only after PresentImage() has @@ -3108,13 +3105,13 @@ static void test_renderless_present(struct presenter *presenter, ok(presenter->got_PresentImage == 1, "Got %u calls to PresentImage().\n", presenter->got_PresentImage); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = join_thread(thread); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(presenter->got_PresentImage == 1, "Got %u calls to PresentImage().\n", presenter->got_PresentImage); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMediaControl_Release(control); } @@ -3203,11 +3200,11 @@ static void test_renderless_formats(void) win_skip("Direct3D does not support video rendering.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator(notify, 0xabacab, &presenter.IVMRSurfaceAllocator9_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); presenter.notify = notify; @@ -3229,14 +3226,14 @@ static void test_renderless_formats(void) * IMemAllocator::SetProperties(), so let that fail here for now. */ if (hr != S_OK) { - skip("Format %u (%#x), flags %#lx are not supported, hr %#lx.\n", + skip("Format %u (%#x), flags %#x are not supported, hr %#x.\n", tests[i].format, tests[i].format, tests[i].flags, hr); continue; } - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + todo_wine ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); if (hr != S_OK) { test_allocator(input); @@ -3246,22 +3243,22 @@ static void test_renderless_formats(void) hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); if (hr != S_OK) { - skip("Format %u (%#x), flags %#lx are not supported, hr %#lx.\n", + skip("Format %u (%#x), flags %#x are not supported, hr %#x.\n", tests[i].format, tests[i].format, tests[i].flags, hr); IMemAllocator_Release(allocator); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); continue; } ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); hr = IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator(notify, 0xabacab, &presenter2.IVMRSurfaceAllocator9_iface); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); ok(presenter.format == tests[i].format, "Test %u: Got format %u (%#x).\n", i, presenter.format, presenter.format); @@ -3269,31 +3266,31 @@ static void test_renderless_formats(void) test_renderless_present(&presenter, graph, input); hr = IMemAllocator_Decommit(allocator); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); IMemAllocator_Release(allocator); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Test %u: Got hr %#lx.\n", i, hr); + ok(hr == S_OK, "Test %u: Got hr %#x.\n", i, hr); } hr = IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator(notify, 0xabacab, &presenter2.IVMRSurfaceAllocator9_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMemInputPin_Release(input); IPin_Release(pin); out: IVMRSurfaceAllocatorNotify9_Release(notify); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); - ok(presenter.refcount == 1, "Got outstanding refcount %ld.\n", presenter.refcount); - ok(presenter2.refcount == 1, "Got outstanding refcount %ld.\n", presenter2.refcount); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(presenter.refcount == 1, "Got outstanding refcount %d.\n", presenter.refcount); + ok(presenter2.refcount == 1, "Got outstanding refcount %d.\n", presenter2.refcount); ref = IDirect3DDevice9_Release(device); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(window); } @@ -3323,32 +3320,32 @@ static void test_mixing_mode(void) IBaseFilter_QueryInterface(filter, &IID_IVMRFilterConfig9, (void **)&config); hr = IBaseFilter_QueryInterface(filter, &IID_IVMRMixerControl9, (void **)&mixer_control); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &stream_count); - ok(hr == VFW_E_VMR_NOT_IN_MIXER_MODE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_VMR_NOT_IN_MIXER_MODE, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_SetNumberOfStreams(config, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &stream_count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(stream_count == 1, "Got %lu streams.\n", stream_count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(stream_count == 1, "Got %u streams.\n", stream_count); hr = IBaseFilter_QueryInterface(filter, &IID_IVMRMixerControl9, (void **)&mixer_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IVMRMixerControl9_Release(mixer_control); hr = IVMRFilterConfig9_SetNumberOfStreams(config, 2); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &stream_count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(stream_count == 1, "Got %lu streams.\n", stream_count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(stream_count == 1, "Got %u streams.\n", stream_count); IVMRFilterConfig9_Release(config); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } filter = create_vmr9(VMR9Mode_Windowless); @@ -3358,27 +3355,27 @@ static void test_mixing_mode(void) window = CreateWindowA("static", "quartz_test", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, 0, 0, 0, 0); ok(!!window, "Failed to create a window.\n"); hr = IVMRWindowlessControl9_SetVideoClippingWindow(windowless_control, window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &stream_count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(stream_count == 4, "Got %lu streams.\n", stream_count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(stream_count == 4, "Got %u streams.\n", stream_count); hr = IBaseFilter_QueryInterface(filter, &IID_IVMRMixerControl9, (void **)&mixer_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IVMRMixerControl9_Release(mixer_control); hr = IVMRFilterConfig9_SetNumberOfStreams(config, 2); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IVMRFilterConfig9_GetNumberOfStreams(config, &stream_count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(stream_count == 4, "Got %lu streams.\n", stream_count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(stream_count == 4, "Got %u streams.\n", stream_count); IVMRWindowlessControl9_Release(windowless_control); IVMRFilterConfig9_Release(config); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(window); } @@ -3417,30 +3414,30 @@ static void test_clipping_window(void) ok(!!window, "Failed to create a window.\n"); hr = IVMRWindowlessControl9_SetVideoClippingWindow(windowless_control, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IVMRWindowlessControl9_SetVideoClippingWindow(windowless_control, (HWND)0xdeadbeef); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRWindowlessControl9_SetVideoClippingWindow(windowless_control, window); - ok(hr == VFW_E_WRONG_STATE, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRWindowlessControl9_SetVideoClippingWindow(windowless_control, window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IPin_Release(pin); IVMRWindowlessControl9_Release(windowless_control); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(window); } @@ -3463,16 +3460,16 @@ static void test_surface_allocator_notify_refcount(void) hr = IVMRSurfaceAllocatorNotify9_AdviseSurfaceAllocator(notify, 0xabacab, &presenter.IVMRSurfaceAllocator9_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ok(presenter.got_TerminateDevice == 1, "Got %u calls to TerminateDevice().\n", presenter.got_TerminateDevice); - ok(presenter.refcount == 1, "Got outstanding refcount %ld.\n", presenter.refcount); + ok(presenter.refcount == 1, "Got outstanding refcount %d.\n", presenter.refcount); ref = IVMRSurfaceAllocatorNotify9_Release(notify); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void check_source_position_(int line, IBasicVideo *video, @@ -3483,31 +3480,31 @@ static void check_source_position_(int line, IBasicVideo *video, left = top = width = height = 0xdeadbeef; hr = IBasicVideo_GetSourcePosition(video, &left, &top, &width, &height); - ok_(__FILE__,line)(hr == S_OK, "Got hr %#lx.\n", hr); - ok_(__FILE__,line)(left == expect_left, "Got left %ld.\n", left); - ok_(__FILE__,line)(top == expect_top, "Got top %ld.\n", top); - ok_(__FILE__,line)(width == expect_width, "Got width %ld.\n", width); - ok_(__FILE__,line)(height == expect_height, "Got height %ld.\n", height); + ok_(__FILE__,line)(hr == S_OK, "Got hr %#x.\n", hr); + ok_(__FILE__,line)(left == expect_left, "Got left %d.\n", left); + ok_(__FILE__,line)(top == expect_top, "Got top %d.\n", top); + ok_(__FILE__,line)(width == expect_width, "Got width %d.\n", width); + ok_(__FILE__,line)(height == expect_height, "Got height %d.\n", height); l = 0xdeadbeef; hr = IBasicVideo_get_SourceLeft(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == left, "Got left %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#x.\n", hr); + ok_(__FILE__,line)(l == left, "Got left %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceTop(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == top, "Got top %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#x.\n", hr); + ok_(__FILE__,line)(l == top, "Got top %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceWidth(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == width, "Got width %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#x.\n", hr); + ok_(__FILE__,line)(l == width, "Got width %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_SourceHeight(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == height, "Got height %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#x.\n", hr); + ok_(__FILE__,line)(l == height, "Got height %d.\n", l); } #define check_source_position(a,b,c,d,e) check_source_position_(__LINE__,a,b,c,d,e) @@ -3517,77 +3514,77 @@ static void test_basic_video_source(IBasicVideo *video) check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, 10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, 10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, -500); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 700); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceWidth(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 500, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, -300); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 600); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceHeight(video, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceLeft(video, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 10, 0, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, -10); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_SourceTop(video, 20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 10, 20, 500, 300); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 4, 5, 60, 40); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 0, 0, 600, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetSourcePosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDefaultSourcePosition(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_source_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultSource(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); } static void check_destination_position_(int line, IBasicVideo *video, @@ -3598,31 +3595,31 @@ static void check_destination_position_(int line, IBasicVideo *video, left = top = width = height = 0xdeadbeef; hr = IBasicVideo_GetDestinationPosition(video, &left, &top, &width, &height); - ok_(__FILE__,line)(hr == S_OK, "Failed to get position, hr %#lx.\n", hr); - ok_(__FILE__,line)(left == expect_left, "Got left %ld.\n", left); - ok_(__FILE__,line)(top == expect_top, "Got top %ld.\n", top); - ok_(__FILE__,line)(width == expect_width, "Got width %ld.\n", width); - ok_(__FILE__,line)(height == expect_height, "Got height %ld.\n", height); + ok_(__FILE__,line)(hr == S_OK, "Failed to get position, hr %#x.\n", hr); + ok_(__FILE__,line)(left == expect_left, "Got left %d.\n", left); + ok_(__FILE__,line)(top == expect_top, "Got top %d.\n", top); + ok_(__FILE__,line)(width == expect_width, "Got width %d.\n", width); + ok_(__FILE__,line)(height == expect_height, "Got height %d.\n", height); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationLeft(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == left, "Got left %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get left, hr %#x.\n", hr); + ok_(__FILE__,line)(l == left, "Got left %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationTop(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == top, "Got top %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get top, hr %#x.\n", hr); + ok_(__FILE__,line)(l == top, "Got top %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationWidth(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == width, "Got width %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get width, hr %#x.\n", hr); + ok_(__FILE__,line)(l == width, "Got width %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_DestinationHeight(video, &l); - ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#lx.\n", hr); - ok_(__FILE__,line)(l == height, "Got height %ld.\n", l); + ok_(__FILE__,line)(hr == S_OK, "Failed to get height, hr %#x.\n", hr); + ok_(__FILE__,line)(l == height, "Got height %d.\n", l); } #define check_destination_position(a,b,c,d,e) check_destination_position_(__LINE__,a,b,c,d,e) @@ -3636,107 +3633,107 @@ static void test_basic_video_destination(IBasicVideo *video) check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationLeft(video, -10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, -10, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationLeft(video, 10); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationTop(video, -20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, -20, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationTop(video, 20); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, -700); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 700); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 700, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationWidth(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, -500); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 0); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 500); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 500); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_put_DestinationHeight(video, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 10, 20, 500, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 4, 5, 60, 40); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 0, 0, 600, 400); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 4, 5, 60, 40); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDefaultDestinationPosition(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 600, 400); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&rect, 100, 200, 500, 500); AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); hr = IVideoWindow_SetWindowPosition(window, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBasicVideo_SetDestinationPosition(video, 0, 0, 400, 300); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); SetRect(&rect, 100, 200, 600, 600); AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE); hr = IVideoWindow_SetWindowPosition(window, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_destination_position(video, 0, 0, 400, 300); hr = IBasicVideo_IsUsingDefaultDestination(video); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IVideoWindow_Release(window); } @@ -3785,83 +3782,83 @@ static void test_basic_video(void) IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input); hr = IBasicVideo_GetTypeInfoCount(video, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(count == 1, "Got count %u.\n", count); hr = IBasicVideo_GetTypeInfo(video, 0, 0, &typeinfo); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = ITypeInfo_GetTypeAttr(typeinfo, &typeattr); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(typeattr->typekind == TKIND_DISPATCH, "Got kind %u.\n", typeattr->typekind); ok(IsEqualGUID(&typeattr->guid, &IID_IBasicVideo), "Got IID %s.\n", wine_dbgstr_guid(&typeattr->guid)); ITypeInfo_ReleaseTypeAttr(typeinfo, typeattr); ITypeInfo_Release(typeinfo); hr = IBasicVideo_get_AvgTimePerFrame(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_AvgTimePerFrame(video, &reftime); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitRate(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitRate(video, &l); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitErrorRate(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_BitErrorRate(video, &l); - ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); hr = IBasicVideo_get_VideoWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_VideoHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceLeft(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceTop(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_SourceHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationLeft(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationWidth(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationTop(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_get_DestinationHeight(video, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, NULL, &top, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, &top, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetSourcePosition(video, &left, &top, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, NULL, &top, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, NULL, &width, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, &top, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetDestinationPosition(video, &left, &top, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoSize(video, &width, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoSize(video, NULL, &height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, NULL, &l); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, &l, NULL); - todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); testfilter_init(&source); IFilterGraph2_AddFilter(graph, &source.filter.IBaseFilter_iface, L"vmr9"); @@ -3872,66 +3869,66 @@ static void test_basic_video(void) skip("Got E_FAIL when connecting.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } reftime = 0.0; hr = IBasicVideo_get_AvgTimePerFrame(video, &reftime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(compare_double(reftime, 0.02, 1 << 28), "Got frame rate %.16e.\n", reftime); l = 0xdeadbeef; hr = IBasicVideo_get_BitRate(video, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!l, "Got bit rate %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!l, "Got bit rate %d.\n", l); l = 0xdeadbeef; hr = IBasicVideo_get_BitErrorRate(video, &l); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(!l, "Got bit rate %ld.\n", l); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!l, "Got bit rate %d.\n", l); hr = IBasicVideo_GetVideoPaletteEntries(video, 0, 1, &l, NULL); - todo_wine ok(hr == VFW_E_NO_PALETTE_AVAILABLE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == VFW_E_NO_PALETTE_AVAILABLE, "Got hr %#x.\n", hr); width = height = 0xdeadbeef; hr = IBasicVideo_GetVideoSize(video, &width, &height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 600, "Got width %ld.\n", width); - ok(height == 400, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 600, "Got width %d.\n", width); + ok(height == 400, "Got height %d.\n", height); test_basic_video_source(video); test_basic_video_destination(video); hr = IFilterGraph2_Disconnect(graph, &source.source.pin.IPin_iface); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_Disconnect(graph, pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); vih.bmiHeader.biWidth = 16; vih.bmiHeader.biHeight = 16; hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &req_mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); hr = IMemAllocator_Commit(allocator); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IMemAllocator_Release(allocator); } @@ -3944,14 +3941,14 @@ static void test_basic_video(void) out: ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IBasicVideo_Release(video); IMemInputPin_Release(input); IPin_Release(pin); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(&source.filter.IBaseFilter_iface); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_windowless_size(void) @@ -3978,11 +3975,11 @@ static void test_windowless_size(void) IVMRAspectRatioControl9 *aspect_ratio_control; IVMRWindowlessControl9 *windowless_control; IFilterGraph2 *graph = create_graph(); + VMR9AspectRatioMode aspect_mode; struct testfilter source; IMemAllocator *allocator; RECT src, dst, expect; IMemInputPin *input; - DWORD aspect_mode; HWND window; HRESULT hr; ULONG ref; @@ -3999,12 +3996,12 @@ static void test_windowless_size(void) ok(!!window, "Failed to create a window.\n"); hr = IVMRWindowlessControl9_SetVideoClippingWindow(windowless_control, window); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_ConnectDirect(graph, &source.source.pin.IPin_iface, pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMemInputPin_GetAllocator(input, &allocator); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); if (hr == S_OK) { hr = IMemAllocator_SetProperties(allocator, &req_props, &ret_props); @@ -4014,57 +4011,57 @@ static void test_windowless_size(void) skip("Got E_FAIL when setting allocator properties.\n"); goto out; } - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!memcmp(&ret_props, &req_props, sizeof(req_props)), "Properties did not match.\n"); } hr = IVMRWindowlessControl9_GetNativeVideoSize(windowless_control, NULL, &height, &aspect_width, &aspect_height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IVMRWindowlessControl9_GetNativeVideoSize(windowless_control, &width, NULL, &aspect_width, &aspect_height); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); aspect_mode = 0xdeadbeef; hr = IVMRWindowlessControl9_GetAspectRatioMode(windowless_control, &aspect_mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(aspect_mode == VMR9ARMode_None, "Got mode %lu.\n", aspect_mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(aspect_mode == VMR9ARMode_None, "Got mode %u.\n", aspect_mode); aspect_mode = 0xdeadbeef; hr = IVMRAspectRatioControl9_GetAspectRatioMode(aspect_ratio_control, &aspect_mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(aspect_mode == VMR9ARMode_None, "Got mode %lu.\n", aspect_mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(aspect_mode == VMR9ARMode_None, "Got mode %u.\n", aspect_mode); width = height = 0xdeadbeef; hr = IVMRWindowlessControl9_GetNativeVideoSize(windowless_control, &width, &height, NULL, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(width == 32, "Got width %ld.\n", width); - ok(height == 16, "Got height %ld.\n", height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(width == 32, "Got width %d.\n", width); + ok(height == 16, "Got height %d.\n", height); aspect_width = aspect_height = 0xdeadbeef; hr = IVMRWindowlessControl9_GetNativeVideoSize(windowless_control, &width, &height, &aspect_width, &aspect_height); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(aspect_width == 32, "Got width %ld.\n", aspect_width); - ok(aspect_height == 16, "Got height %ld.\n", aspect_height); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(aspect_width == 32, "Got width %d.\n", aspect_width); + ok(aspect_height == 16, "Got height %d.\n", aspect_height); memset(&src, 0xcc, sizeof(src)); hr = IVMRWindowlessControl9_GetVideoPosition(windowless_control, &src, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 0, 0, 32, 16); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl9_GetVideoPosition(windowless_control, NULL, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 0, 0, 0, 0); ok(EqualRect(&dst, &expect), "Got dest rect %s.\n", wine_dbgstr_rect(&dst)); SetRect(&src, 4, 6, 16, 12); hr = IVMRWindowlessControl9_SetVideoPosition(windowless_control, &src, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(&src, 0xcc, sizeof(src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl9_GetVideoPosition(windowless_control, &src, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 4, 6, 16, 12); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); SetRect(&expect, 0, 0, 0, 0); @@ -4072,12 +4069,12 @@ static void test_windowless_size(void) SetRect(&dst, 40, 60, 120, 160); hr = IVMRWindowlessControl9_SetVideoPosition(windowless_control, NULL, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(&src, 0xcc, sizeof(src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl9_GetVideoPosition(windowless_control, &src, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 4, 6, 16, 12); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); SetRect(&expect, 40, 60, 120, 160); @@ -4088,28 +4085,28 @@ static void test_windowless_size(void) ok(EqualRect(&src, &expect), "Got window rect %s.\n", wine_dbgstr_rect(&src)); hr = IVMRAspectRatioControl9_SetAspectRatioMode(aspect_ratio_control, VMR9ARMode_LetterBox); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); aspect_mode = 0xdeadbeef; hr = IVMRWindowlessControl9_GetAspectRatioMode(windowless_control, &aspect_mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(aspect_mode == VMR9ARMode_LetterBox, "Got mode %lu.\n", aspect_mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(aspect_mode == VMR9ARMode_LetterBox, "Got mode %u.\n", aspect_mode); hr = IVMRWindowlessControl9_SetAspectRatioMode(windowless_control, VMR9ARMode_None); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); aspect_mode = 0xdeadbeef; hr = IVMRAspectRatioControl9_GetAspectRatioMode(aspect_ratio_control, &aspect_mode); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(aspect_mode == VMR9ARMode_None, "Got mode %lu.\n", aspect_mode); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(aspect_mode == VMR9ARMode_None, "Got mode %u.\n", aspect_mode); hr = IVMRWindowlessControl9_SetAspectRatioMode(windowless_control, VMR9ARMode_LetterBox); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(&src, 0xcc, sizeof(src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl9_GetVideoPosition(windowless_control, &src, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 4, 6, 16, 12); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); SetRect(&expect, 40, 60, 120, 160); @@ -4118,12 +4115,12 @@ static void test_windowless_size(void) SetRect(&src, 0, 0, 32, 16); SetRect(&dst, 0, 0, 640, 480); hr = IVMRWindowlessControl9_SetVideoPosition(windowless_control, &src, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); memset(&src, 0xcc, sizeof(src)); memset(&dst, 0xcc, sizeof(dst)); hr = IVMRWindowlessControl9_GetVideoPosition(windowless_control, &src, &dst); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); SetRect(&expect, 0, 0, 32, 16); ok(EqualRect(&src, &expect), "Got source rect %s.\n", wine_dbgstr_rect(&src)); SetRect(&expect, 0, 0, 640, 480); @@ -4131,13 +4128,13 @@ static void test_windowless_size(void) out: ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); IMemInputPin_Release(input); IPin_Release(pin); IVMRWindowlessControl9_Release(windowless_control); IVMRAspectRatioControl9_Release(aspect_ratio_control); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); DestroyWindow(window); } @@ -4152,25 +4149,25 @@ static void test_mixing_prefs(void) set_mixing_mode(filter, 1); hr = IBaseFilter_QueryInterface(filter, &IID_IVMRMixerControl9, (void **)&mixer_control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRMixerControl9_GetMixingPrefs(mixer_control, &flags); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(flags == (MixerPref9_NoDecimation | MixerPref9_ARAdjustXorY | MixerPref9_BiLinearFiltering - | MixerPref9_RenderTargetRGB), "Got flags %#lx.\n", flags); + | MixerPref9_RenderTargetRGB), "Got flags %#x.\n", flags); hr = IVMRMixerControl9_SetMixingPrefs(mixer_control, MixerPref9_NoDecimation | MixerPref9_ARAdjustXorY | MixerPref9_PointFiltering | MixerPref9_RenderTargetRGB); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IVMRMixerControl9_GetMixingPrefs(mixer_control, &flags); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(flags == (MixerPref9_NoDecimation | MixerPref9_ARAdjustXorY | MixerPref9_PointFiltering - | MixerPref9_RenderTargetRGB), "Got flags %#lx.\n", flags); + | MixerPref9_RenderTargetRGB), "Got flags %#x.\n", flags); IVMRMixerControl9_Release(mixer_control); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_unconnected_eos(void) @@ -4184,49 +4181,49 @@ static void test_unconnected_eos(void) ULONG ref; hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Pause(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Stop(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(!ret, "Got %u EC_COMPLETE events.\n", ret); hr = IMediaControl_Run(control); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ret = check_ec_complete(eventsrc, 0); ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); @@ -4234,9 +4231,9 @@ static void test_unconnected_eos(void) IMediaControl_Release(control); IMediaEvent_Release(eventsrc); ref = IFilterGraph2_Release(graph); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } START_TEST(vmr9) @@ -4249,7 +4246,7 @@ START_TEST(vmr9) if (FAILED(hr = CoCreateInstance(&CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter))) { - skip("Failed to create VMR9, hr %#lx.\n", hr); + skip("Failed to create VMR9, hr %#x.\n", hr); return; } IBaseFilter_Release(filter); diff --git a/dlls/quartz/tests/waveparser.c b/dlls/quartz/tests/waveparser.c index 1c86a39c730..fee93b33f5f 100644 --- wine/dlls/quartz/tests/waveparser.c +++ wine/dlls/quartz/tests/waveparser.c @@ -30,7 +30,7 @@ static IBaseFilter *create_wave_parser(void) IBaseFilter *filter = NULL; HRESULT hr = CoCreateInstance(&CLSID_WAVEParser, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); return filter; } @@ -46,11 +46,11 @@ static WCHAR *load_resource(const WCHAR *name) wcscat(pathW, name); file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %u.\n", wine_dbgstr_w(pathW), GetLastError()); res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); - ok(!!res, "Failed to load resource, error %lu.\n", GetLastError()); + ok(!!res, "Failed to load resource, error %u.\n", GetLastError()); ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); WriteFile(file, ptr, SizeofResource( GetModuleHandleA(NULL), res), &written, NULL); ok(written == SizeofResource(GetModuleHandleA(NULL), res), "Failed to write resource.\n"); @@ -88,7 +88,7 @@ static IFilterGraph2 *connect_input(IBaseFilter *splitter, const WCHAR *filename IBaseFilter_FindPin(reader, L"Output", &source); hr = IFilterGraph2_ConnectDirect(graph, source, sink, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(source); IPin_Release(sink); @@ -107,7 +107,7 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO expected_hr = supported ? S_OK : E_NOINTERFACE; hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); - ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); if (SUCCEEDED(hr)) IUnknown_Release(unk); } @@ -212,53 +212,53 @@ static void test_aggregation(void) filter = (IBaseFilter *)0xdeadbeef; hr = CoCreateInstance(&CLSID_WAVEParser, &test_outer, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!filter, "Got interface %p.\n", filter); hr = CoCreateInstance(&CLSID_WAVEParser, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); IUnknown_Release(unk2); hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); IBaseFilter_Release(filter); ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %ld.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); } static void test_enum_pins(void) @@ -273,79 +273,79 @@ static void test_enum_pins(void) BOOL ret; ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#lx.\n", hr); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %ld.\n", ref); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); IPin_Release(pins[0]); ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %ld.\n", ref); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); IPin_Release(pins[0]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); IEnumPins_Release(enum2); @@ -353,46 +353,46 @@ static void test_enum_pins(void) graph = connect_input(filter, filename); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pins[0]); hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum1, 3, pins, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 2, "Got count %lu.\n", count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 2, "Got count %u.\n", count); IPin_Release(pins[0]); IPin_Release(pins[1]); IEnumPins_Release(enum1); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_find_pin(void) @@ -407,31 +407,31 @@ static void test_find_pin(void) BOOL ret; hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"output", &pin); - ok(hr == VFW_E_NOT_FOUND, "Got hr %#lx.\n", hr); + ok(hr == VFW_E_NOT_FOUND, "Got hr %#x.\n", hr); graph = connect_input(filter, filename); hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"output", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(pin == pin2, "Expected pin %p, got %p.\n", pin2, pin); IPin_Release(pin); IPin_Release(pin2); @@ -439,9 +439,9 @@ static void test_find_pin(void) IEnumPins_Release(enum_pins); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_pin_info(void) @@ -460,52 +460,52 @@ static void test_pin_info(void) graph = connect_input(filter, filename); hr = IBaseFilter_FindPin(filter, L"input pin", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); expect_ref = get_refcount(filter); ref = get_refcount(pin); - ok(ref == expect_ref, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref, "Got unexpected refcount %d.\n", ref); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"input pin"), "Got name %s.\n", wine_dbgstr_w(info.achName)); ref = get_refcount(filter); - ok(ref == expect_ref + 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); ref = get_refcount(pin); - ok(ref == expect_ref + 1, "Got unexpected refcount %ld.\n", ref); + ok(ref == expect_ref + 1, "Got unexpected refcount %d.\n", ref); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"input pin"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); IPin_Release(pin); hr = IBaseFilter_FindPin(filter, L"output", &pin); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); check_interface(pin, &IID_IPin, TRUE); check_interface(pin, &IID_IMediaSeeking, TRUE); hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); ok(info.dir == PINDIR_OUTPUT, "Got direction %d.\n", info.dir); ok(!wcscmp(info.achName, L"output"), "Got name %s.\n", wine_dbgstr_w(info.achName)); IBaseFilter_Release(info.pFilter); hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(dir == PINDIR_OUTPUT, "Got direction %d.\n", dir); hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!wcscmp(id, L"output"), "Got id %s.\n", wine_dbgstr_w(id)); CoTaskMemFree(id); @@ -513,9 +513,9 @@ static void test_pin_info(void) IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_media_types(void) @@ -536,42 +536,42 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"input pin", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); mt.majortype = MEDIATYPE_Stream; mt.subtype = MEDIASUBTYPE_WAVE; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.bFixedSizeSamples = TRUE; mt.bTemporalCompression = TRUE; mt.lSampleSize = 123; mt.formattype = FORMAT_VideoInfo; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); mt.majortype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.majortype = MEDIATYPE_Stream; mt.subtype = GUID_NULL; hr = IPin_QueryAccept(pin, &mt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); mt.subtype = MEDIASUBTYPE_WAVE; graph = connect_input(filter, filename); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); @@ -579,48 +579,48 @@ static void test_media_types(void) IBaseFilter_FindPin(filter, L"output", &pin); hr = IPin_EnumMediaTypes(pin, &enummt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&pmt->majortype, &MEDIATYPE_Audio), "Got major type %s.\n", wine_dbgstr_guid(&pmt->majortype)); ok(IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_PCM), "Got subtype %s\n", wine_dbgstr_guid(&pmt->subtype)); ok(pmt->bFixedSizeSamples == TRUE, "Got fixed size %d.\n", pmt->bFixedSizeSamples); ok(!pmt->bTemporalCompression, "Got temporal compression %d.\n", pmt->bTemporalCompression); - ok(pmt->lSampleSize == 1, "Got sample size %lu.\n", pmt->lSampleSize); + ok(pmt->lSampleSize == 1, "Got sample size %u.\n", pmt->lSampleSize); ok(IsEqualGUID(&pmt->formattype, &FORMAT_WaveFormatEx), "Got format type %s.\n", wine_dbgstr_guid(&pmt->formattype)); ok(!pmt->pUnk, "Got pUnk %p.\n", pmt->pUnk); - ok(pmt->cbFormat == sizeof(WAVEFORMATEX), "Got format size %lu.\n", pmt->cbFormat); + ok(pmt->cbFormat == sizeof(WAVEFORMATEX), "Got format size %u.\n", pmt->cbFormat); ok(!memcmp(pmt->pbFormat, &expect_wfx, sizeof(WAVEFORMATEX)), "Format blocks didn't match.\n"); hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->bFixedSizeSamples = FALSE; pmt->bTemporalCompression = TRUE; pmt->lSampleSize = 123; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); pmt->majortype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->majortype = MEDIATYPE_Audio; pmt->subtype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->subtype = MEDIASUBTYPE_WAVE; pmt->formattype = GUID_NULL; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); pmt->formattype = FORMAT_None; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); wfx = (WAVEFORMATEX *)pmt->pbFormat; @@ -628,28 +628,28 @@ static void test_media_types(void) wfx->nAvgBytesPerSec = 44100 * 2; wfx->nBlockAlign = 2; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); *wfx = expect_wfx; wfx->wFormatTag = WAVE_FORMAT_IMA_ADPCM; hr = IPin_QueryAccept(pin, pmt); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); *wfx = expect_wfx; CoTaskMemFree(pmt->pbFormat); CoTaskMemFree(pmt); hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enummt); IPin_Release(pin); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_enum_media_types(void) @@ -667,29 +667,29 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"input pin", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); IEnumMediaTypes_Release(enum1); IEnumMediaTypes_Release(enum2); @@ -698,64 +698,64 @@ static void test_enum_media_types(void) IBaseFilter_FindPin(filter, L"output", &pin); hr = IPin_EnumMediaTypes(pin, &enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + 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 %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); - ok(!count, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 2, mts, &count); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(count == 1, "Got count %lu.\n", 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 %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Reset(enum1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IEnumMediaTypes_Next(enum2, 1, mts, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); CoTaskMemFree(mts[0]->pbFormat); CoTaskMemFree(mts[0]); @@ -765,9 +765,9 @@ static void test_enum_media_types(void) IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } static void test_unconnected_filter_state(void) @@ -778,53 +778,53 @@ static void test_unconnected_filter_state(void) ULONG ref; hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Pause(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Paused, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); hr = IBaseFilter_Run(filter, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Running, "Got state %u.\n", state); hr = IBaseFilter_Stop(filter); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IBaseFilter_GetState(filter, 0, &state); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(state == State_Stopped, "Got state %u.\n", state); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); } static void test_seeking(void) @@ -864,137 +864,137 @@ static void test_seeking(void) IPin_QueryInterface(pin, &IID_IMediaSeeking, (void **)&seeking); hr = IMediaSeeking_GetCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards | AM_SEEKING_CanSeekBackwards | AM_SEEKING_CanGetStopPos - | AM_SEEKING_CanGetDuration | AM_SEEKING_CanDoSegments), "Got caps %#lx.\n", caps); + | AM_SEEKING_CanGetDuration | AM_SEEKING_CanDoSegments), "Got caps %#x.\n", caps); caps = AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards), "Got caps %#lx.\n", caps); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(caps == (AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanSeekForwards), "Got caps %#x.\n", caps); caps = AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); - ok(caps == AM_SEEKING_CanSeekAbsolute, "Got caps %#lx.\n", caps); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(caps == AM_SEEKING_CanSeekAbsolute, "Got caps %#x.\n", caps); caps = AM_SEEKING_CanGetCurrentPos; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); caps = 0; hr = IMediaSeeking_CheckCapabilities(seeking, &caps); - ok(hr == E_FAIL, "Got hr %#lx.\n", hr); - ok(!caps, "Got caps %#lx.\n", caps); + ok(hr == E_FAIL, "Got hr %#x.\n", hr); + ok(!caps, "Got caps %#x.\n", caps); for (i = 0; i < ARRAY_SIZE(format_tests); ++i) { hr = IMediaSeeking_IsFormatSupported(seeking, format_tests[i].guid); - todo_wine_if(i == 1) ok(hr == format_tests[i].hr, "Got hr %#lx for format %s.\n", + todo_wine_if(i == 1) ok(hr == format_tests[i].hr, "Got hr %#x for format %s.\n", hr, wine_dbgstr_guid(format_tests[i].guid)); } hr = IMediaSeeking_QueryPreferredFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_SAMPLE); - ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_FRAME); - ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_SAMPLE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetTimeFormat(seeking, &format); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(IsEqualGUID(&format, &TIME_FORMAT_SAMPLE), "Got format %s.\n", wine_dbgstr_guid(&format)); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - todo_wine ok(hr == S_FALSE, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); hr = IMediaSeeking_IsUsingTimeFormat(seeking, &TIME_FORMAT_SAMPLE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); hr = IMediaSeeking_SetTimeFormat(seeking, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); duration = 0xdeadbeef; hr = IMediaSeeking_GetDuration(seeking, &duration); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(duration == 1000000, "Got duration %I64d.\n", duration); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetStopPosition(seeking, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(stop == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(stop)); hr = IMediaSeeking_GetCurrentPosition(seeking, ¤t); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!current, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(stop)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, &TIME_FORMAT_MEDIA_TIME, 0x123456789a, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 0x123456789a, &TIME_FORMAT_MEDIA_TIME); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(time == 0x123456789a, "Got time %s.\n", wine_dbgstr_longlong(time)); time = 0xdeadbeef; hr = IMediaSeeking_ConvertTimeFormat(seeking, &time, NULL, 441, &TIME_FORMAT_SAMPLE); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(time == 100000, "Got time %s.\n", wine_dbgstr_longlong(time)); earliest = latest = 0xdeadbeef; hr = IMediaSeeking_GetAvailable(seeking, &earliest, &latest); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(!earliest, "Got time %s.\n", wine_dbgstr_longlong(earliest)); ok(latest == duration, "Expected time %s, got %s.\n", wine_dbgstr_longlong(duration), wine_dbgstr_longlong(latest)); rate = 0; hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(rate == 1.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_SetRate(seeking, 200.0); - todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); rate = 0; hr = IMediaSeeking_GetRate(seeking, &rate); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); todo_wine ok(rate == 200.0, "Got rate %.16e.\n", rate); hr = IMediaSeeking_SetRate(seeking, -1.0); - todo_wine ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); hr = IMediaSeeking_GetPreroll(seeking, &time); - todo_wine ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr); + todo_wine ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); current = 200 * 10000; stop = 400 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, &stop, AM_SEEKING_AbsolutePositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 400 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 400 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -1002,7 +1002,7 @@ static void test_seeking(void) stop = 400 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 400 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -1010,18 +1010,18 @@ static void test_seeking(void) stop = 200 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime, &stop, AM_SEEKING_AbsolutePositioning | AM_SEEKING_ReturnTime); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 100 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); current = 50 * 10000; hr = IMediaSeeking_SetPositions(seeking, ¤t, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); stop = current = 0xdeadbeef; hr = IMediaSeeking_GetPositions(seeking, ¤t, &stop); - ok(hr == S_OK, "Got hr %#lx.\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr); ok(current == 50 * 10000, "Got time %s.\n", wine_dbgstr_longlong(current)); ok(stop == 200 * 10000, "Got time %s.\n", wine_dbgstr_longlong(stop)); @@ -1029,9 +1029,9 @@ static void test_seeking(void) IPin_Release(pin); IFilterGraph2_Release(graph); ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %ld.\n", ref); + ok(!ref, "Got outstanding refcount %d.\n", ref); ret = DeleteFileW(filename); - ok(ret, "Failed to delete file, error %lu.\n", GetLastError()); + ok(ret, "Failed to delete file, error %u.\n", GetLastError()); } START_TEST(waveparser) diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index f725a9998ce..1dbb8a02181 100644 --- wine/dlls/quartz/videorenderer.c +++ wine/dlls/quartz/videorenderer.c @@ -92,7 +92,7 @@ static HRESULT video_renderer_render(struct strmbase_renderer *iface, IMediaSamp hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { - ERR("Failed to get buffer pointer, hr %#lx.\n", hr); + ERR("Cannot get pointer to sample data (%x)\n", hr); return hr; } @@ -277,7 +277,7 @@ static HRESULT WINAPI VideoWindow_get_FullScreenMode(IVideoWindow *iface, { struct video_renderer *This = impl_from_IVideoWindow(iface); - TRACE("window %p, fullscreen %p.\n", This, FullScreenMode); + TRACE("(%p/%p)->(%p): %d\n", This, iface, FullScreenMode, This->FullScreenMode); if (!FullScreenMode) return E_POINTER; @@ -292,7 +292,7 @@ static HRESULT WINAPI VideoWindow_put_FullScreenMode(IVideoWindow *iface, LONG f struct video_renderer *filter = impl_from_IVideoWindow(iface); HWND window = filter->window.hwnd; - FIXME("filter %p, fullscreen %ld.\n", filter, fullscreen); + FIXME("filter %p, fullscreen %d.\n", filter, fullscreen); if (fullscreen) { @@ -399,7 +399,7 @@ static HRESULT WINAPI overlay_GetPalette(IOverlay *iface, DWORD *count, PALETTEE static HRESULT WINAPI overlay_SetPalette(IOverlay *iface, DWORD count, PALETTEENTRY *palette) { - FIXME("iface %p, count %lu, palette %p, stub!\n", iface, count, palette); + FIXME("iface %p, count %u, palette %p, stub!\n", iface, count, palette); return E_NOTIMPL; } @@ -445,7 +445,7 @@ static HRESULT WINAPI overlay_GetVideoPosition(IOverlay *iface, RECT *source, RE static HRESULT WINAPI overlay_Advise(IOverlay *iface, IOverlayNotify *sink, DWORD flags) { - FIXME("iface %p, sink %p, flags %#lx, stub!\n", iface, sink, flags); + FIXME("iface %p, sink %p, flags %#x, stub!\n", iface, sink, flags); return E_NOTIMPL; } @@ -481,8 +481,6 @@ HRESULT video_renderer_create(IUnknown *outer, IUnknown **out) return E_OUTOFMEMORY; strmbase_renderer_init(&object->renderer, outer, &CLSID_VideoRenderer, L"In", &renderer_ops); - wcscpy(object->renderer.sink.pin.name, L"Input"); - object->IOverlay_iface.lpVtbl = &overlay_vtbl; video_window_init(&object->window, &IVideoWindow_VTable, diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 2330f8fc0c9..4bde811c6d7 100644 --- wine/dlls/quartz/vmr9.c +++ wine/dlls/quartz/vmr9.c @@ -33,7 +33,6 @@ #include "ddraw.h" #include "dvdmedia.h" #include "d3d9.h" -#include "videoacc.h" #include "vmr9.h" #include "wine/debug.h" @@ -79,7 +78,6 @@ struct quartz_vmr * Native uses a separate reference count for IVMRSurfaceAllocatorNotify9. */ LONG IVMRSurfaceAllocatorNotify9_refcount; - IAMVideoAccelerator IAMVideoAccelerator_iface; IOverlay IOverlay_iface; IVMRSurfaceAllocator9 *allocator; @@ -246,7 +244,7 @@ static HRESULT vmr_render(struct strmbase_renderer *iface, IMediaSample *sample) if (FAILED(hr = IMediaSample_GetPointer(sample, &data))) { - ERR("Failed to get pointer to sample data, hr %#lx.\n", hr); + ERR("Failed to get pointer to sample data, hr %#x.\n", hr); return hr; } data_size = IMediaSample_GetActualDataLength(sample); @@ -269,7 +267,7 @@ static HRESULT vmr_render(struct strmbase_renderer *iface, IMediaSample *sample) if (FAILED(hr = IDirect3DSurface9_LockRect(info.lpSurf, &locked_rect, NULL, D3DLOCK_DISCARD))) { - ERR("Failed to lock surface, hr %#lx.\n", hr); + ERR("Failed to lock surface, hr %#x.\n", hr); return hr; } @@ -334,7 +332,7 @@ static HRESULT initialize_device(struct quartz_vmr *filter, VMR9AllocationInfo * if (FAILED(hr = IVMRSurfaceAllocator9_InitializeDevice(filter->allocator, filter->cookie, info, &count))) { - WARN("Failed to initialize device (flags %#lx), hr %#lx.\n", info->dwFlags, hr); + WARN("Failed to initialize device (flags %#x), hr %#x.\n", info->dwFlags, hr); return hr; } @@ -343,7 +341,7 @@ static HRESULT initialize_device(struct quartz_vmr *filter, VMR9AllocationInfo * if (FAILED(hr = IVMRSurfaceAllocator9_GetSurface(filter->allocator, filter->cookie, i, 0, &filter->surfaces[i]))) { - ERR("Failed to get surface %lu, hr %#lx.\n", i, hr); + ERR("Failed to get surface %u, hr %#x.\n", i, hr); while (i--) IDirect3DSurface9_Release(filter->surfaces[i]); IVMRSurfaceAllocator9_TerminateDevice(filter->allocator, filter->cookie); @@ -427,7 +425,7 @@ static HRESULT allocate_surfaces(struct quartz_vmr *filter, const AM_MEDIA_TYPE break; default: - WARN("Unhandled video compression %#lx.\n", filter->bmiheader.biCompression); + WARN("Unhandled video compression %#x.\n", filter->bmiheader.biCompression); free(filter->surfaces); return VFW_E_TYPE_NOT_ACCEPTED; } @@ -612,9 +610,7 @@ static HRESULT vmr_pin_query_interface(struct strmbase_renderer *iface, REFIID i { struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface); - if (IsEqualGUID(iid, &IID_IAMVideoAccelerator)) - *out = &filter->IAMVideoAccelerator_iface; - else if (IsEqualGUID(iid, &IID_IOverlay)) + if (IsEqualGUID(iid, &IID_IOverlay)) *out = &filter->IOverlay_iface; else return E_NOINTERFACE; @@ -886,12 +882,11 @@ static HRESULT WINAPI VMR7FilterConfig_SetImageCompositor(IVMRFilterConfig *ifac return E_NOTIMPL; } -static HRESULT WINAPI VMR7FilterConfig_SetNumberOfStreams(IVMRFilterConfig *iface, DWORD count) +static HRESULT WINAPI VMR7FilterConfig_SetNumberOfStreams(IVMRFilterConfig *iface, DWORD max) { - struct quartz_vmr *filter = impl_from_IVMRFilterConfig(iface); - - FIXME("filter %p, count %lu, stub!\n", filter, count); + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + FIXME("(%p/%p)->(%u) stub\n", iface, This, max); return E_NOTIMPL; } @@ -903,12 +898,11 @@ static HRESULT WINAPI VMR7FilterConfig_GetNumberOfStreams(IVMRFilterConfig *ifac return E_NOTIMPL; } -static HRESULT WINAPI VMR7FilterConfig_SetRenderingPrefs(IVMRFilterConfig *iface, DWORD flags) +static HRESULT WINAPI VMR7FilterConfig_SetRenderingPrefs(IVMRFilterConfig *iface, DWORD renderflags) { - struct quartz_vmr *filter = impl_from_IVMRFilterConfig(iface); - - FIXME("filter %p, flags %#lx, stub!\n", filter, flags); + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + FIXME("(%p/%p)->(%u) stub\n", iface, This, renderflags); return E_NOTIMPL; } @@ -924,7 +918,7 @@ static HRESULT WINAPI VMR7FilterConfig_SetRenderingMode(IVMRFilterConfig *iface, { struct quartz_vmr *filter = impl_from_IVMRFilterConfig(iface); - TRACE("iface %p, mode %#lx.\n", iface, mode); + TRACE("iface %p, mode %#x.\n", iface, mode); return IVMRFilterConfig9_SetRenderingMode(&filter->IVMRFilterConfig9_iface, mode); } @@ -1110,7 +1104,7 @@ static HRESULT WINAPI VMR7MonitorConfig_GetAvailableMonitors(IVMRMonitorConfig * struct quartz_vmr *This = impl_from_IVMRMonitorConfig(iface); struct get_available_monitors_args args; - TRACE("filter %p, info %p, arraysize %lu, numdev %p.\n", This, info, arraysize, numdev); + FIXME("(%p/%p)->(%p, %u, %p) semi-stub\n", iface, This, info, arraysize, numdev); if (!numdev) return E_POINTER; @@ -1210,7 +1204,7 @@ static HRESULT WINAPI VMR9MonitorConfig_GetAvailableMonitors(IVMRMonitorConfig9 struct quartz_vmr *This = impl_from_IVMRMonitorConfig9(iface); struct get_available_monitors_args args; - TRACE("filter %p, info %p, arraysize %lu, numdev %p.\n", This, info, arraysize, numdev); + FIXME("(%p/%p)->(%p, %u, %p) semi-stub\n", iface, This, info, arraysize, numdev); if (!numdev) return E_POINTER; @@ -1270,7 +1264,7 @@ static HRESULT WINAPI VMR9FilterConfig_SetNumberOfStreams(IVMRFilterConfig9 *ifa { struct quartz_vmr *filter = impl_from_IVMRFilterConfig9(iface); - FIXME("iface %p, count %lu, stub!\n", iface, count); + FIXME("iface %p, count %u, stub!\n", iface, count); if (!count) { @@ -1313,12 +1307,11 @@ static HRESULT WINAPI VMR9FilterConfig_GetNumberOfStreams(IVMRFilterConfig9 *ifa return S_OK; } -static HRESULT WINAPI VMR9FilterConfig_SetRenderingPrefs(IVMRFilterConfig9 *iface, DWORD flags) +static HRESULT WINAPI VMR9FilterConfig_SetRenderingPrefs(IVMRFilterConfig9 *iface, DWORD renderflags) { - struct quartz_vmr *filter = impl_from_IVMRFilterConfig9(iface); - - TRACE("filter %p, flags %#lx.\n", filter, flags); + struct quartz_vmr *This = impl_from_IVMRFilterConfig9(iface); + FIXME("(%p/%p)->(%u) stub\n", iface, This, renderflags); return E_NOTIMPL; } @@ -1335,7 +1328,7 @@ static HRESULT WINAPI VMR9FilterConfig_SetRenderingMode(IVMRFilterConfig9 *iface HRESULT hr = S_OK; struct quartz_vmr *This = impl_from_IVMRFilterConfig9(iface); - TRACE("filter %p, mode %lu.\n", This, mode); + TRACE("(%p/%p)->(%u)\n", iface, This, mode); EnterCriticalSection(&This->renderer.filter.filter_cs); if (This->mode) @@ -1360,14 +1353,14 @@ static HRESULT WINAPI VMR9FilterConfig_SetRenderingMode(IVMRFilterConfig9 *iface if (FAILED(hr = VMR9DefaultAllocatorPresenterImpl_create(This, (void **)&This->presenter))) { - ERR("Failed to create default presenter, hr %#lx.\n", hr); + ERR("Failed to create default presenter, hr %#x.\n", hr); break; } if (FAILED(hr = IVMRImagePresenter9_QueryInterface(This->presenter, &IID_IVMRSurfaceAllocator9, (void **)&This->allocator))) { - ERR("Failed to query for IVMRSurfaceAllocator9, hr %#lx.\n", hr); + ERR("Failed to query for IVMRSurfaceAllocator9, hr %#x.\n", hr); IVMRImagePresenter9_Release(This->presenter); This->allocator = NULL; This->presenter = NULL; @@ -1727,7 +1720,7 @@ static HRESULT WINAPI VMR9WindowlessControl_SetAspectRatioMode(IVMRWindowlessCon { struct quartz_vmr *filter = impl_from_IVMRWindowlessControl9(iface); - TRACE("filter %p, mode %lu.\n", filter, mode); + TRACE("filter %p, mode %u.\n", filter, mode); EnterCriticalSection(&filter->renderer.filter.filter_cs); filter->aspect_mode = mode; @@ -1943,7 +1936,7 @@ static ULONG WINAPI VMR9SurfaceAllocatorNotify_AddRef(IVMRSurfaceAllocatorNotify struct quartz_vmr *filter = impl_from_IVMRSurfaceAllocatorNotify9(iface); ULONG refcount = InterlockedIncrement(&filter->IVMRSurfaceAllocatorNotify9_refcount); - TRACE("%p increasing refcount to %lu.\n", iface, refcount); + TRACE("%p increasing refcount to %u.\n", iface, refcount); return refcount; } @@ -1953,7 +1946,7 @@ static ULONG WINAPI VMR9SurfaceAllocatorNotify_Release(IVMRSurfaceAllocatorNotif struct quartz_vmr *filter = impl_from_IVMRSurfaceAllocatorNotify9(iface); ULONG refcount = InterlockedDecrement(&filter->IVMRSurfaceAllocatorNotify9_refcount); - TRACE("%p decreasing refcount to %lu.\n", iface, refcount); + TRACE("%p decreasing refcount to %u.\n", iface, refcount); if (!refcount && !filter->renderer.filter.refcount) free(filter); @@ -2038,7 +2031,7 @@ static HRESULT WINAPI VMR9SurfaceAllocatorNotify_AllocateSurfaceHelper(IVMRSurfa if (!allocinfo || !numbuffers || !surface) return E_POINTER; - TRACE("Flags %#lx, size %lux%lu, format %u (%#x), pool %u, minimum buffers %lu.\n", + TRACE("Flags %#x, size %ux%u, format %u (%#x), pool %u, minimum buffers %u.\n", allocinfo->dwFlags, allocinfo->dwWidth, allocinfo->dwHeight, allocinfo->Format, allocinfo->Format, allocinfo->Pool, allocinfo->MinBuffers); @@ -2063,7 +2056,7 @@ static HRESULT WINAPI VMR9SurfaceAllocatorNotify_AllocateSurfaceHelper(IVMRSurfa if (!*numbuffers || *numbuffers < allocinfo->MinBuffers) { - WARN("%lu surfaces requested (minimum %lu); returning E_INVALIDARG.\n", + WARN("%u surfaces requested (minimum %u); returning E_INVALIDARG.\n", *numbuffers, allocinfo->MinBuffers); return E_INVALIDARG; } @@ -2110,12 +2103,12 @@ static HRESULT WINAPI VMR9SurfaceAllocatorNotify_AllocateSurfaceHelper(IVMRSurfa } else { - FIXME("Unhandled flags %#lx.\n", allocinfo->dwFlags); + FIXME("Unhandled flags %#x.\n", allocinfo->dwFlags); return E_NOTIMPL; } if (FAILED(hr)) - WARN("%lu/%lu surfaces allocated, hr %#lx.\n", i, *numbuffers, hr); + WARN("%u/%u surfaces allocated, hr %#x.\n", i, *numbuffers, hr); if (i >= allocinfo->MinBuffers) { @@ -2177,7 +2170,7 @@ static HRESULT WINAPI mixer_control9_SetAlpha(IVMRMixerControl9 *iface, DWORD st { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, stream %lu, alpha %.8e, stub!\n", filter, stream, alpha); + FIXME("filter %p, stream %u, alpha %.8e, stub!\n", filter, stream, alpha); return E_NOTIMPL; } @@ -2186,7 +2179,7 @@ static HRESULT WINAPI mixer_control9_GetAlpha(IVMRMixerControl9 *iface, DWORD st { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, stream %lu, alpha %p, stub!\n", filter, stream, alpha); + FIXME("filter %p, stream %u, alpha %p, stub!\n", filter, stream, alpha); return E_NOTIMPL; } @@ -2195,7 +2188,7 @@ static HRESULT WINAPI mixer_control9_SetZOrder(IVMRMixerControl9 *iface, DWORD s { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, stream %lu, z %lu, stub!\n", filter, stream, z); + FIXME("filter %p, stream %u, z %u, stub!\n", filter, stream, z); return E_NOTIMPL; } @@ -2204,7 +2197,7 @@ static HRESULT WINAPI mixer_control9_GetZOrder(IVMRMixerControl9 *iface, DWORD s { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, stream %lu, z %p, stub!\n", filter, stream, z); + FIXME("filter %p, stream %u, z %p, stub!\n", filter, stream, z); return E_NOTIMPL; } @@ -2214,7 +2207,7 @@ static HRESULT WINAPI mixer_control9_SetOutputRect(IVMRMixerControl9 *iface, { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, stream %lu, rect %s, stub!\n", filter, stream, debugstr_normalized_rect(rect)); + FIXME("filter %p, stream %u, rect %s, stub!\n", filter, stream, debugstr_normalized_rect(rect)); return E_NOTIMPL; } @@ -2224,7 +2217,7 @@ static HRESULT WINAPI mixer_control9_GetOutputRect(IVMRMixerControl9 *iface, { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, stream %lu, rect %p, stub!\n", filter, stream, rect); + FIXME("filter %p, stream %u, rect %p, stub!\n", filter, stream, rect); return E_NOTIMPL; } @@ -2233,7 +2226,7 @@ static HRESULT WINAPI mixer_control9_SetBackgroundClr(IVMRMixerControl9 *iface, { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, color #%06lx, stub!\n", filter, color); + FIXME("filter %p, color #%06x, stub!\n", filter, color); return E_NOTIMPL; } @@ -2251,7 +2244,7 @@ static HRESULT WINAPI mixer_control9_SetMixingPrefs(IVMRMixerControl9 *iface, DW { struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); - FIXME("filter %p, flags %#lx, stub!\n", filter, flags); + FIXME("filter %p, flags %#x, stub!\n", filter, flags); EnterCriticalSection(&filter->renderer.filter.filter_cs); filter->mixing_prefs = flags; @@ -2348,7 +2341,7 @@ static HRESULT WINAPI mixer_bitmap9_SetAlphaBitmap(IVMRMixerBitmap9 *iface, const VMR9AlphaBitmap *bitmap) { FIXME("iface %p, bitmap %p, stub!\n", iface, bitmap); - TRACE("dwFlags %#lx, hdc %p, pDDS %p, rSrc %s, rDest %s, fAlpha %.8e, clrSrcKey #%06lx, dwFilterMode %#lx.\n", + TRACE("dwFlags %#x, hdc %p, pDDS %p, rSrc %s, rDest %s, fAlpha %.8e, clrSrcKey #%06x, dwFilterMode %#x.\n", bitmap->dwFlags, bitmap->hdc, bitmap->pDDS, wine_dbgstr_rect(&bitmap->rSrc), debugstr_normalized_rect(&bitmap->rDest), bitmap->fAlpha, bitmap->clrSrcKey, bitmap->dwFilterMode); return E_NOTIMPL; @@ -2417,7 +2410,7 @@ static HRESULT WINAPI aspect_ratio_control9_SetAspectRatioMode(IVMRAspectRatioCo { struct quartz_vmr *filter = impl_from_IVMRAspectRatioControl9(iface); - TRACE("filter %p, mode %lu.\n", filter, mode); + TRACE("filter %p, mode %u.\n", filter, mode); EnterCriticalSection(&filter->renderer.filter.filter_cs); filter->aspect_mode = mode; @@ -2434,139 +2427,6 @@ static const IVMRAspectRatioControl9Vtbl aspect_ratio_control9_vtbl = aspect_ratio_control9_SetAspectRatioMode, }; -static struct quartz_vmr *impl_from_IAMVideoAccelerator(IAMVideoAccelerator *iface) -{ - return CONTAINING_RECORD(iface, struct quartz_vmr, IAMVideoAccelerator_iface); -} - -static HRESULT WINAPI video_accelerator_QueryInterface(IAMVideoAccelerator *iface, REFIID iid, void **out) -{ - struct quartz_vmr *filter = impl_from_IAMVideoAccelerator(iface); - return IPin_QueryInterface(&filter->renderer.sink.pin.IPin_iface, iid, out); -} - -static ULONG WINAPI video_accelerator_AddRef(IAMVideoAccelerator *iface) -{ - struct quartz_vmr *filter = impl_from_IAMVideoAccelerator(iface); - return IPin_AddRef(&filter->renderer.sink.pin.IPin_iface); -} - -static ULONG WINAPI video_accelerator_Release(IAMVideoAccelerator *iface) -{ - struct quartz_vmr *filter = impl_from_IAMVideoAccelerator(iface); - return IPin_Release(&filter->renderer.sink.pin.IPin_iface); -} - -static HRESULT WINAPI video_accelerator_GetVideoAcceleratorGUIDs( - IAMVideoAccelerator *iface, DWORD *count, GUID *accelerators) -{ - FIXME("iface %p, count %p, accelerators %p, stub!\n", iface, count, accelerators); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_GetUncompFormatsSupported(IAMVideoAccelerator *iface, - const GUID *accelerator, DWORD *count, DDPIXELFORMAT *formats) -{ - FIXME("iface %p, accelerator %s, count %p, formats %p, stub!\n", - iface, debugstr_guid(accelerator), count, formats); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_GetInternalMemInfo(IAMVideoAccelerator *iface, - const GUID *accelerator, const AMVAUncompDataInfo *format_info, AMVAInternalMemInfo *mem_info) -{ - FIXME("iface %p, accelerator %s, format_info %p, mem_info %p, stub!\n", - iface, debugstr_guid(accelerator), format_info, mem_info); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_GetCompBufferInfo(IAMVideoAccelerator *iface, - const GUID *accelerator, const AMVAUncompDataInfo *uncompressed_info, - DWORD *compressed_info_count, AMVACompBufferInfo *compressed_infos) -{ - FIXME("iface %p, accelerator %s, uncompressed_info %p, compressed_info_count %p, compressed_infos %p, stub!\n", - iface, debugstr_guid(accelerator), uncompressed_info, compressed_info_count, compressed_infos); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_GetInternalCompBufferInfo( - IAMVideoAccelerator *iface, DWORD *count, AMVACompBufferInfo *infos) -{ - FIXME("iface %p, count %p, infos %p, stub!\n", iface, count, infos); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_BeginFrame(IAMVideoAccelerator *iface, const AMVABeginFrameInfo *info) -{ - FIXME("iface %p, info %p, stub!\n", iface, info); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_EndFrame(IAMVideoAccelerator *iface, const AMVAEndFrameInfo *info) -{ - FIXME("iface %p, info %p, stub!\n", iface, info); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_GetBuffer(IAMVideoAccelerator *iface, - DWORD type_index, DWORD buffer_index, BOOL read_only, void **buffer, LONG *stride) -{ - FIXME("iface %p, type_index %lu, buffer_index %lu, read_only %d, buffer %p, stride %p, stub!\n", - iface, type_index, buffer_index, read_only, buffer, stride); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_ReleaseBuffer( - IAMVideoAccelerator *iface, DWORD type_index, DWORD buffer_index) -{ - FIXME("iface %p, type_index %lu, buffer_index %lu, stub!\n", iface, type_index, buffer_index); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_Execute(IAMVideoAccelerator *iface, - DWORD function, void *in_data, DWORD in_size, void *out_data, - DWORD out_size, DWORD buffer_count, const AMVABUFFERINFO *buffers) -{ - FIXME("iface %p, function %#lx, in_data %p, in_size %lu," - " out_data %p, out_size %lu, buffer_count %lu, buffers %p, stub!\n", - iface, function, in_data, in_size, out_data, out_size, buffer_count, buffers); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_QueryRenderStatus(IAMVideoAccelerator *iface, - DWORD type_index, DWORD buffer_index, DWORD flags) -{ - FIXME("iface %p, type_index %lu, buffer_index %lu, flags %#lx, stub!\n", - iface, type_index, buffer_index, flags); - return E_NOTIMPL; -} - -static HRESULT WINAPI video_accelerator_DisplayFrame( - IAMVideoAccelerator *iface, DWORD index, IMediaSample *sample) -{ - FIXME("iface %p, index %lu, sample %p, stub!\n", iface, index, sample); - return E_NOTIMPL; -} - -static const IAMVideoAcceleratorVtbl video_accelerator_vtbl = -{ - video_accelerator_QueryInterface, - video_accelerator_AddRef, - video_accelerator_Release, - video_accelerator_GetVideoAcceleratorGUIDs, - video_accelerator_GetUncompFormatsSupported, - video_accelerator_GetInternalMemInfo, - video_accelerator_GetCompBufferInfo, - video_accelerator_GetInternalCompBufferInfo, - video_accelerator_BeginFrame, - video_accelerator_EndFrame, - video_accelerator_GetBuffer, - video_accelerator_ReleaseBuffer, - video_accelerator_Execute, - video_accelerator_QueryRenderStatus, - video_accelerator_DisplayFrame, -}; - static inline struct quartz_vmr *impl_from_IOverlay(IOverlay *iface) { return CONTAINING_RECORD(iface, struct quartz_vmr, IOverlay_iface); @@ -2598,7 +2458,7 @@ static HRESULT WINAPI overlay_GetPalette(IOverlay *iface, DWORD *count, PALETTEE static HRESULT WINAPI overlay_SetPalette(IOverlay *iface, DWORD count, PALETTEENTRY *palette) { - FIXME("iface %p, count %lu, palette %p, stub!\n", iface, count, palette); + FIXME("iface %p, count %u, palette %p, stub!\n", iface, count, palette); return E_NOTIMPL; } @@ -2647,7 +2507,7 @@ static HRESULT WINAPI overlay_GetVideoPosition(IOverlay *iface, RECT *source, RE static HRESULT WINAPI overlay_Advise(IOverlay *iface, IOverlayNotify *sink, DWORD flags) { - FIXME("iface %p, sink %p, flags %#lx, stub!\n", iface, sink, flags); + FIXME("iface %p, sink %p, flags %#x, stub!\n", iface, sink, flags); return E_NOTIMPL; } @@ -2704,8 +2564,6 @@ static HRESULT vmr_create(IUnknown *outer, IUnknown **out, const CLSID *clsid) object->IVMRSurfaceAllocatorNotify9_iface.lpVtbl = &VMR9_SurfaceAllocatorNotify_Vtbl; object->IVMRWindowlessControl_iface.lpVtbl = &VMR7_WindowlessControl_Vtbl; object->IVMRWindowlessControl9_iface.lpVtbl = &VMR9_WindowlessControl_Vtbl; - - object->IAMVideoAccelerator_iface.lpVtbl = &video_accelerator_vtbl; object->IOverlay_iface.lpVtbl = &overlay_vtbl; video_window_init(&object->window, &IVideoWindow_VTable, @@ -2765,30 +2623,32 @@ static HRESULT WINAPI VMR9_ImagePresenter_QueryInterface(IVMRImagePresenter9 *if static ULONG WINAPI VMR9_ImagePresenter_AddRef(IVMRImagePresenter9 *iface) { - struct default_presenter *presenter = impl_from_IVMRImagePresenter9(iface); - ULONG refcount = InterlockedIncrement(&presenter->refCount); + struct default_presenter *This = impl_from_IVMRImagePresenter9(iface); + ULONG refCount = InterlockedIncrement(&This->refCount); - TRACE("%p increasing refcount to %lu.\n", presenter, refcount); + TRACE("(%p)->() AddRef from %d\n", iface, refCount - 1); - return refcount; + return refCount; } static ULONG WINAPI VMR9_ImagePresenter_Release(IVMRImagePresenter9 *iface) { struct default_presenter *This = impl_from_IVMRImagePresenter9(iface); - ULONG refcount = InterlockedDecrement(&This->refCount); + ULONG refCount = InterlockedDecrement(&This->refCount); - TRACE("%p decreasing refcount to %lu.\n", This, refcount); + TRACE("(%p)->() Release from %d\n", iface, refCount + 1); - if (!refcount) + if (!refCount) { DWORD i; - + TRACE("Destroying\n"); IDirect3D9_Release(This->d3d9_ptr); + TRACE("Number of surfaces: %u\n", This->num_surfaces); for (i = 0; i < This->num_surfaces; ++i) { IDirect3DSurface9 *surface = This->d3d9_surfaces[i]; + TRACE("Releasing surface %p\n", surface); if (surface) IDirect3DSurface9_Release(surface); } @@ -2801,7 +2661,7 @@ static ULONG WINAPI VMR9_ImagePresenter_Release(IVMRImagePresenter9 *iface) free(This); return 0; } - return refcount; + return refCount; } static HRESULT WINAPI VMR9_ImagePresenter_StartPresenting(IVMRImagePresenter9 *iface, DWORD_PTR cookie) @@ -2841,23 +2701,23 @@ static HRESULT WINAPI VMR9_ImagePresenter_PresentImage(IVMRImagePresenter9 *ifac if (FAILED(hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0))) - ERR("Failed to clear, hr %#lx.\n", hr); + ERR("Failed to clear, hr %#x.\n", hr); if (FAILED(hr = IDirect3DDevice9_BeginScene(device))) - ERR("Failed to begin scene, hr %#lx.\n", hr); + ERR("Failed to begin scene, hr %#x.\n", hr); if (FAILED(hr = IDirect3DDevice9_GetBackBuffer(device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer))) { - ERR("Failed to get backbuffer, hr %#lx.\n", hr); + ERR("Failed to get backbuffer, hr %#x.\n", hr); return hr; } if (FAILED(hr = IDirect3DDevice9_StretchRect(device, info->lpSurf, NULL, backbuffer, NULL, D3DTEXF_POINT))) - ERR("Failed to blit image, hr %#lx.\n", hr); + ERR("Failed to blit image, hr %#x.\n", hr); IDirect3DSurface9_Release(backbuffer); if (FAILED(hr = IDirect3DDevice9_EndScene(device))) - ERR("Failed to end scene, hr %#lx.\n", hr); + ERR("Failed to end scene, hr %#x.\n", hr); if (filter->aspect_mode == VMR9ARMode_LetterBox) { @@ -2885,7 +2745,7 @@ static HRESULT WINAPI VMR9_ImagePresenter_PresentImage(IVMRImagePresenter9 *ifac } if (FAILED(hr = IDirect3DDevice9_Present(device, &src, &dst, NULL, NULL))) - ERR("Failed to present, hr %#lx.\n", hr); + ERR("Failed to present, hr %#x.\n", hr); return S_OK; } @@ -2918,15 +2778,21 @@ static ULONG WINAPI VMR9_SurfaceAllocator_Release(IVMRSurfaceAllocator9 *iface) return IVMRImagePresenter9_Release(&presenter->IVMRImagePresenter9_iface); } -static void adjust_surface_size(const D3DCAPS9 *caps, VMR9AllocationInfo *allocinfo) +static HRESULT VMR9_SurfaceAllocator_SetAllocationSettings(struct default_presenter *This, VMR9AllocationInfo *allocinfo) { + D3DCAPS9 caps; UINT width, height; + HRESULT hr; - /* There are no restrictions on the size of offscreen surfaces. */ if (!(allocinfo->dwFlags & VMR9AllocFlag_TextureSurface)) - return; + /* Only needed for texture surfaces */ + return S_OK; - if (!(caps->TextureCaps & D3DPTEXTURECAPS_POW2) || (caps->TextureCaps & D3DPTEXTURECAPS_SQUAREONLY)) + hr = IDirect3DDevice9_GetDeviceCaps(This->d3d9_dev, &caps); + if (FAILED(hr)) + return hr; + + if (!(caps.TextureCaps & D3DPTEXTURECAPS_POW2) || (caps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY)) { width = allocinfo->dwWidth; height = allocinfo->dwHeight; @@ -2942,7 +2808,7 @@ static void adjust_surface_size(const D3DCAPS9 *caps, VMR9AllocationInfo *alloci FIXME("NPOW2 support missing, not using proper surfaces!\n"); } - if (caps->TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) + if (caps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) { if (height > width) width = height; @@ -2953,6 +2819,8 @@ static void adjust_surface_size(const D3DCAPS9 *caps, VMR9AllocationInfo *alloci allocinfo->dwHeight = height; allocinfo->dwWidth = width; + + return hr; } static UINT d3d9_adapter_from_hwnd(IDirect3D9 *d3d9, HWND hwnd, HMONITOR *mon_out) @@ -3013,7 +2881,7 @@ static HRESULT WINAPI VMR9_SurfaceAllocator_InitializeDevice(IVMRSurfaceAllocato NULL, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device); if (FAILED(hr)) { - ERR("Failed to create device, hr %#lx.\n", hr); + ERR("Could not create device: %08x\n", hr); return hr; } @@ -3031,13 +2899,19 @@ static HRESULT WINAPI VMR9_SurfaceAllocator_InitializeDevice(IVMRSurfaceAllocato if (!(This->d3d9_surfaces = calloc(*numbuffers, sizeof(IDirect3DSurface9 *)))) return E_OUTOFMEMORY; - adjust_surface_size(&caps, info); + hr = VMR9_SurfaceAllocator_SetAllocationSettings(This, info); + if (FAILED(hr)) + ERR("Setting allocation settings failed: %08x\n", hr); + + if (SUCCEEDED(hr)) + { + hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(This->SurfaceAllocatorNotify, info, numbuffers, This->d3d9_surfaces); + if (FAILED(hr)) + ERR("Allocating surfaces failed: %08x\n", hr); + } - hr = IVMRSurfaceAllocatorNotify9_AllocateSurfaceHelper(This->SurfaceAllocatorNotify, - info, numbuffers, This->d3d9_surfaces); if (FAILED(hr)) { - ERR("Failed to allocate surfaces, hr %#lx.\n", hr); IVMRSurfaceAllocator9_TerminateDevice(This->pVMR9->allocator, This->pVMR9->cookie); return hr; } @@ -3049,7 +2923,7 @@ static HRESULT WINAPI VMR9_SurfaceAllocator_InitializeDevice(IVMRSurfaceAllocato static HRESULT WINAPI VMR9_SurfaceAllocator_TerminateDevice(IVMRSurfaceAllocator9 *iface, DWORD_PTR cookie) { - TRACE("iface %p, cookie %#Ix.\n", iface, cookie); + TRACE("iface %p, cookie %#lx.\n", iface, cookie); return S_OK; } @@ -3113,6 +2987,8 @@ static IDirect3D9 *init_d3d9(HMODULE d3d9_handle) static HRESULT VMR9DefaultAllocatorPresenterImpl_create(struct quartz_vmr *parent, LPVOID * ppv) { struct default_presenter *object; + HRESULT hr = S_OK; + int i; if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY; @@ -3125,6 +3001,24 @@ static HRESULT VMR9DefaultAllocatorPresenterImpl_create(struct quartz_vmr *paren return VFW_E_DDRAW_CAPS_NOT_SUITABLE; } + i = 0; + do + { + D3DDISPLAYMODE mode; + + hr = IDirect3D9_EnumAdapterModes(object->d3d9_ptr, i++, D3DFMT_X8R8G8B8, 0, &mode); + if (hr == D3DERR_INVALIDCALL) break; /* out of adapters */ + } while (FAILED(hr)); + if (FAILED(hr)) + ERR("HR: %08x\n", hr); + if (hr == D3DERR_NOTAVAILABLE) + { + ERR("Format not supported\n"); + IDirect3D9_Release(object->d3d9_ptr); + free(object); + return VFW_E_DDRAW_CAPS_NOT_SUITABLE; + } + object->IVMRImagePresenter9_iface.lpVtbl = &VMR9_ImagePresenter; object->IVMRSurfaceAllocator9_iface.lpVtbl = &VMR9_SurfaceAllocator; diff --git a/dlls/quartz/window.c b/dlls/quartz/window.c index 3e19d9b582e..5b172d5f108 100644 --- wine/dlls/quartz/window.c +++ wine/dlls/quartz/window.c @@ -105,7 +105,7 @@ HRESULT video_window_create_window(struct video_window *window) winclass.lpszClassName = class_name; if (!RegisterClassW(&winclass) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS) { - ERR("Failed to register class, error %lu.\n", GetLastError()); + ERR("Unable to register window class: %u\n", GetLastError()); return E_FAIL; } @@ -151,7 +151,7 @@ HRESULT WINAPI BaseControlWindowImpl_GetTypeInfoCount(IVideoWindow *iface, UINT HRESULT WINAPI BaseControlWindowImpl_GetTypeInfo(IVideoWindow *iface, UINT index, LCID lcid, ITypeInfo **typeinfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); + TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo); return strmbase_get_typeinfo(IVideoWindow_tid, typeinfo); } @@ -161,7 +161,7 @@ HRESULT WINAPI BaseControlWindowImpl_GetIDsOfNames(IVideoWindow *iface, REFIID i ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", + TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n", iface, debugstr_guid(iid), names, count, lcid, ids); if (SUCCEEDED(hr = strmbase_get_typeinfo(IVideoWindow_tid, &typeinfo))) @@ -178,7 +178,7 @@ HRESULT WINAPI BaseControlWindowImpl_Invoke(IVideoWindow *iface, DISPID id, REFI ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", + TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); if (SUCCEEDED(hr = strmbase_get_typeinfo(IVideoWindow_tid, &typeinfo))) @@ -225,7 +225,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_WindowStyle(IVideoWindow *iface, LONG s { struct video_window *window = impl_from_IVideoWindow(iface); - TRACE("window %p, style %#lx.\n", window, style); + TRACE("window %p, style %#x.\n", window, style); if (style & (WS_DISABLED|WS_HSCROLL|WS_MAXIMIZE|WS_MINIMIZE|WS_VSCROLL)) return E_INVALIDARG; @@ -250,7 +250,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_WindowStyleEx(IVideoWindow *iface, LONG { struct video_window *window = impl_from_IVideoWindow(iface); - TRACE("window %p, style %#lx.\n", window, style); + TRACE("window %p, style %#x.\n", window, style); if (!SetWindowLongW(window->hwnd, GWL_EXSTYLE, style)) return E_FAIL; @@ -271,7 +271,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_AutoShow(IVideoWindow *iface, LONG Auto { struct video_window *This = impl_from_IVideoWindow(iface); - TRACE("window %p, AutoShow %ld.\n", This, AutoShow); + TRACE("(%p/%p)->(%d)\n", This, iface, AutoShow); This->AutoShow = AutoShow; @@ -293,7 +293,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_WindowState(IVideoWindow *iface, LONG s { struct video_window *window = impl_from_IVideoWindow(iface); - TRACE("window %p, state %ld.\n", window, state); + TRACE("window %p, state %#x.\n", window, state); ShowWindow(window->hwnd, state); return S_OK; @@ -323,7 +323,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_BackgroundPalette(IVideoWindow *iface, { struct video_window *This = impl_from_IVideoWindow(iface); - FIXME("window %p, palette %ld, stub!\n", This, BackgroundPalette); + FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, BackgroundPalette); return S_OK; } @@ -341,7 +341,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_Visible(IVideoWindow *iface, LONG visib { struct video_window *window = impl_from_IVideoWindow(iface); - TRACE("window %p, visible %ld.\n", window, visible); + TRACE("window %p, visible %d.\n", window, visible); ShowWindow(window->hwnd, visible ? SW_SHOW : SW_HIDE); return S_OK; @@ -365,7 +365,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_Left(IVideoWindow *iface, LONG left) struct video_window *window = impl_from_IVideoWindow(iface); RECT rect; - TRACE("window %p, left %ld.\n", window, left); + TRACE("window %p, left %d.\n", window, left); GetWindowRect(window->hwnd, &rect); if (!SetWindowPos(window->hwnd, NULL, left, rect.top, 0, 0, @@ -392,7 +392,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_Width(IVideoWindow *iface, LONG width) struct video_window *window = impl_from_IVideoWindow(iface); RECT rect; - TRACE("window %p, width %ld.\n", window, width); + TRACE("window %p, width %d.\n", window, width); GetWindowRect(window->hwnd, &rect); if (!SetWindowPos(window->hwnd, NULL, 0, 0, width, rect.bottom - rect.top, @@ -419,7 +419,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_Top(IVideoWindow *iface, LONG top) struct video_window *window = impl_from_IVideoWindow(iface); RECT rect; - TRACE("window %p, top %ld.\n", window, top); + TRACE("window %p, top %d.\n", window, top); GetWindowRect(window->hwnd, &rect); if (!SetWindowPos(window->hwnd, NULL, rect.left, top, 0, 0, @@ -446,7 +446,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_Height(IVideoWindow *iface, LONG height struct video_window *window = impl_from_IVideoWindow(iface); RECT rect; - TRACE("window %p, height %ld.\n", window, height); + TRACE("window %p, height %d.\n", window, height); GetWindowRect(window->hwnd, &rect); if (!SetWindowPos(window->hwnd, NULL, 0, 0, rect.right - rect.left, @@ -473,7 +473,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_Owner(IVideoWindow *iface, OAHWND owner struct video_window *window = impl_from_IVideoWindow(iface); HWND hwnd = window->hwnd; - TRACE("window %p, owner %#Ix.\n", window, owner); + TRACE("window %p, owner %#lx.\n", window, owner); /* Make sure we are marked as WS_CHILD before reparenting ourselves, so that * we do not steal focus. LEGO Island depends on this. */ @@ -503,7 +503,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_MessageDrain(IVideoWindow *iface, OAHWN { struct video_window *This = impl_from_IVideoWindow(iface); - TRACE("window %p, drain %#Ix.\n", This, Drain); + TRACE("(%p/%p)->(%08x)\n", This, iface, (DWORD) Drain); This->hwndDrain = (HWND)Drain; @@ -534,7 +534,7 @@ HRESULT WINAPI BaseControlWindowImpl_put_BorderColor(IVideoWindow *iface, LONG C { struct video_window *This = impl_from_IVideoWindow(iface); - TRACE("window %p, colour %#lx.\n", This, Color); + FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, Color); return S_OK; } @@ -546,12 +546,9 @@ HRESULT WINAPI BaseControlWindowImpl_get_FullScreenMode(IVideoWindow *iface, LON return E_NOTIMPL; } -HRESULT WINAPI BaseControlWindowImpl_put_FullScreenMode(IVideoWindow *iface, LONG fullscreen) +HRESULT WINAPI BaseControlWindowImpl_put_FullScreenMode(IVideoWindow *iface, LONG FullScreenMode) { - struct video_window *window = impl_from_IVideoWindow(iface); - - TRACE("window %p, fullscreen %ld.\n", window, fullscreen); - + TRACE("(%p)->(%d)\n", iface, FullScreenMode); return E_NOTIMPL; } @@ -560,7 +557,7 @@ HRESULT WINAPI BaseControlWindowImpl_SetWindowForeground(IVideoWindow *iface, LO struct video_window *window = impl_from_IVideoWindow(iface); UINT flags = SWP_NOMOVE | SWP_NOSIZE; - TRACE("window %p, focus %ld.\n", window, focus); + TRACE("window %p, focus %d.\n", window, focus); if (focus != OAFALSE && focus != OATRUE) return E_INVALIDARG; @@ -580,7 +577,7 @@ HRESULT WINAPI BaseControlWindowImpl_SetWindowPosition(IVideoWindow *iface, { struct video_window *window = impl_from_IVideoWindow(iface); - TRACE("window %p, left %ld, top %ld, width %ld, height %ld.\n", window, left, top, width, height); + TRACE("window %p, left %d, top %d, width %d, height %d.\n", window, left, top, width, height); if (!SetWindowPos(window->hwnd, NULL, left, top, width, height, SWP_NOACTIVATE | SWP_NOZORDER)) return E_FAIL; @@ -608,7 +605,7 @@ HRESULT WINAPI BaseControlWindowImpl_NotifyOwnerMessage(IVideoWindow *iface, { struct video_window *window = impl_from_IVideoWindow(iface); - TRACE("window %p, hwnd %#Ix, message %#lx, wparam %#Ix, lparam %#Ix.\n", + TRACE("window %p, hwnd %#lx, message %#x, wparam %#lx, lparam %#lx.\n", window, hwnd, message, wparam, lparam); /* That these messages are forwarded, and no others, is stated by the @@ -664,11 +661,11 @@ HRESULT WINAPI BaseControlWindowImpl_GetRestorePosition(IVideoWindow *iface, LON return S_OK; } -HRESULT WINAPI BaseControlWindowImpl_HideCursor(IVideoWindow *iface, LONG hide) +HRESULT WINAPI BaseControlWindowImpl_HideCursor(IVideoWindow *iface, LONG HideCursor) { - struct video_window *window = impl_from_IVideoWindow(iface); + struct video_window *This = impl_from_IVideoWindow(iface); - FIXME("window %p, hide %ld, stub!\n", window, hide); + FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, HideCursor); return S_OK; } @@ -715,7 +712,7 @@ static HRESULT WINAPI basic_video_GetTypeInfoCount(IBasicVideo *iface, UINT *cou static HRESULT WINAPI basic_video_GetTypeInfo(IBasicVideo *iface, UINT index, LCID lcid, ITypeInfo **typeinfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); + TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo); return strmbase_get_typeinfo(IBasicVideo_tid, typeinfo); } @@ -725,7 +722,7 @@ static HRESULT WINAPI basic_video_GetIDsOfNames(IBasicVideo *iface, REFIID iid, ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", + TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n", iface, debugstr_guid(iid), names, count, lcid, ids); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo))) @@ -742,7 +739,7 @@ static HRESULT WINAPI basic_video_Invoke(IBasicVideo *iface, DISPID id, REFIID i ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", + TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); if (SUCCEEDED(hr = strmbase_get_typeinfo(IBasicVideo_tid, &typeinfo))) @@ -846,7 +843,7 @@ static HRESULT WINAPI basic_video_put_SourceLeft(IBasicVideo *iface, LONG left) { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, left %ld.\n", window, left); + TRACE("window %p, left %d.\n", window, left); if (left < 0 || window->src.right + left - window->src.left > get_bitmap_header(window)->biWidth) return E_INVALIDARG; @@ -872,7 +869,7 @@ static HRESULT WINAPI basic_video_put_SourceWidth(IBasicVideo *iface, LONG width { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, width %ld.\n", window, width); + TRACE("window %p, width %d.\n", window, width); if (width <= 0 || window->src.left + width > get_bitmap_header(window)->biWidth) return E_INVALIDARG; @@ -898,7 +895,7 @@ static HRESULT WINAPI basic_video_put_SourceTop(IBasicVideo *iface, LONG top) { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, top %ld.\n", window, top); + TRACE("window %p, top %d.\n", window, top); if (top < 0 || window->src.bottom + top - window->src.top > get_bitmap_header(window)->biHeight) return E_INVALIDARG; @@ -924,7 +921,7 @@ static HRESULT WINAPI basic_video_put_SourceHeight(IBasicVideo *iface, LONG heig { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, height %ld.\n", window, height); + TRACE("window %p, height %d.\n", window, height); if (height <= 0 || window->src.top + height > get_bitmap_header(window)->biHeight) return E_INVALIDARG; @@ -950,7 +947,7 @@ static HRESULT WINAPI basic_video_put_DestinationLeft(IBasicVideo *iface, LONG l { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, left %ld.\n", window, left); + TRACE("window %p, left %d.\n", window, left); window->default_dst = FALSE; OffsetRect(&window->dst, left - window->dst.left, 0); @@ -974,7 +971,7 @@ static HRESULT WINAPI basic_video_put_DestinationWidth(IBasicVideo *iface, LONG { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, width %ld.\n", window, width); + TRACE("window %p, width %d.\n", window, width); if (width <= 0) return E_INVALIDARG; @@ -1001,7 +998,7 @@ static HRESULT WINAPI basic_video_put_DestinationTop(IBasicVideo *iface, LONG to { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, top %ld.\n", window, top); + TRACE("window %p, top %d.\n", window, top); window->default_dst = FALSE; OffsetRect(&window->dst, 0, top - window->dst.top); @@ -1025,7 +1022,7 @@ static HRESULT WINAPI basic_video_put_DestinationHeight(IBasicVideo *iface, LONG { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, height %ld.\n", window, height); + TRACE("window %p, height %d.\n", window, height); if (height <= 0) return E_INVALIDARG; @@ -1054,7 +1051,7 @@ static HRESULT WINAPI basic_video_SetSourcePosition(IBasicVideo *iface, struct video_window *window = impl_from_IBasicVideo(iface); const BITMAPINFOHEADER *bitmap_header = get_bitmap_header(window); - TRACE("window %p, left %ld, top %ld, width %ld, height %ld.\n", window, left, top, width, height); + TRACE("window %p, left %d, top %d, width %d, height %d.\n", window, left, top, width, height); if (left < 0 || left + width > bitmap_header->biWidth || width <= 0) return E_INVALIDARG; @@ -1098,7 +1095,7 @@ static HRESULT WINAPI basic_video_SetDestinationPosition(IBasicVideo *iface, { struct video_window *window = impl_from_IBasicVideo(iface); - TRACE("window %p, left %ld, top %ld, width %ld, height %ld.\n", window, left, top, width, height); + TRACE("window %p, left %d, top %d, width %d, height %d.\n", window, left, top, width, height); if (width <= 0 || height <= 0) return E_INVALIDARG; @@ -1156,7 +1153,7 @@ static HRESULT WINAPI basic_video_GetVideoPaletteEntries(IBasicVideo *iface, { struct video_window *window = impl_from_IBasicVideo(iface); - FIXME("window %p, start %ld, count %ld, ret_count %p, palette %p, stub!\n", + FIXME("window %p, start %d, count %d, ret_count %p, palette %p, stub!\n", window, start, count, ret_count, palette); if (!ret_count || !palette) @@ -1247,7 +1244,7 @@ static const IBasicVideoVtbl basic_video_vtbl = void video_window_unregister_class(void) { if (!UnregisterClassW(class_name, NULL) && GetLastError() != ERROR_CLASS_DOES_NOT_EXIST) - ERR("Failed to unregister class, error %lu.\n", GetLastError()); + ERR("Failed to unregister class, error %u.\n", GetLastError()); } void video_window_init(struct video_window *window, const IVideoWindowVtbl *vtbl, diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index f1ccb987750..423faa25648 100644 --- wine/dlls/wined3d/adapter_vk.c +++ wine/dlls/wined3d/adapter_vk.c @@ -2264,7 +2264,7 @@ static enum wined3d_feature_level feature_level_from_caps(const struct shader_ca return WINED3D_FEATURE_LEVEL_11_1; if (shader_model >= 4) - return WINED3D_FEATURE_LEVEL_10_1; + return WINED3D_FEATURE_LEVEL_11_1; return WINED3D_FEATURE_LEVEL_NONE; } diff --git a/dlls/winegstreamer/Makefile.in b/dlls/winegstreamer/Makefile.in index 3524cffb399..1b7caa769eb 100644 --- wine/dlls/winegstreamer/Makefile.in +++ wine/dlls/winegstreamer/Makefile.in @@ -1,19 +1,22 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES MODULE = winegstreamer.dll UNIXLIB = winegstreamer.so IMPORTLIB = winegstreamer -IMPORTS = strmbase ole32 msdmo +IMPORTS = strmbase ole32 DELAYIMPORTS = mfplat EXTRAINCL = $(GSTREAMER_CFLAGS) EXTRALIBS = $(GSTREAMER_LIBS) $(PTHREAD_LIBS) C_SRCS = \ + aac_decoder.c \ audioconvert.c \ + colorconvert.c \ + decode_transform.c \ h264_decoder.c \ main.c \ media_source.c \ mfplat.c \ quartz_parser.c \ - wg_format.c \ wg_parser.c \ wg_transform.c \ wm_asyncreader.c \ diff --git a/dlls/winegstreamer/aac_decoder.c b/dlls/winegstreamer/aac_decoder.c new file mode 100644 index 00000000000..97f2824039d --- /dev/null +++ wine/dlls/winegstreamer/aac_decoder.c @@ -0,0 +1,620 @@ +/* AAC Decoder Transform + * + * Copyright 2022 RĂ©mi Bernon for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" +#include "mfobjects.h" +#include "mftransform.h" +#include "wmcodecdsp.h" + +#include "wine/debug.h" +#include "wine/heap.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +static const GUID *aac_decoder_input_types[] = +{ + &MFAudioFormat_AAC, +}; +static const GUID *aac_decoder_output_types[] = +{ + &MFAudioFormat_PCM, + &MFAudioFormat_Float, +}; + +struct aac_decoder +{ + IMFTransform IMFTransform_iface; + LONG refcount; + IMFMediaType *input_type; + IMFMediaType *output_type; + + IMFSample *input_sample; + struct wg_transform *wg_transform; +}; + +static struct aac_decoder *impl_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct aac_decoder, IMFTransform_iface); +} + +static void try_create_wg_transform(struct aac_decoder *decoder) +{ + struct wg_encoded_format input_format; + struct wg_format output_format; + + if (!decoder->input_type || !decoder->output_type) + return; + + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + + mf_media_type_to_wg_encoded_format(decoder->input_type, &input_format); + if (input_format.encoded_type == WG_ENCODED_TYPE_UNKNOWN) + return; + + mf_media_type_to_wg_format(decoder->output_type, &output_format); + if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + return; + + decoder->wg_transform = wg_transform_create(&input_format, &output_format); + if (!decoder->wg_transform) + WARN("Failed to create wg_transform.\n"); +} + +static HRESULT WINAPI aac_decoder_QueryInterface(IMFTransform *iface, REFIID iid, void **out) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); + + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IMFTransform)) + *out = &decoder->IMFTransform_iface; + else + { + *out = NULL; + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static ULONG WINAPI aac_decoder_AddRef(IMFTransform *iface) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&decoder->refcount); + + TRACE("iface %p increasing refcount to %u.\n", decoder, refcount); + + return refcount; +} + +static ULONG WINAPI aac_decoder_Release(IMFTransform *iface) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&decoder->refcount); + + TRACE("iface %p decreasing refcount to %u.\n", decoder, refcount); + + if (!refcount) + { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + if (decoder->input_type) + IMFMediaType_Release(decoder->input_type); + if (decoder->output_type) + IMFMediaType_Release(decoder->output_type); + free(decoder); + } + + return refcount; +} + +static HRESULT WINAPI aac_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + FIXME("iface %p, input_minimum %p, input_maximum %p, output_minimum %p, output_maximum %p stub!\n", + iface, input_minimum, input_maximum, output_minimum, output_maximum); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + FIXME("iface %p, inputs %p, outputs %p stub!\n", iface, inputs, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + FIXME("iface %p, input_size %u, inputs %p, output_size %u, outputs %p stub!\n", + iface, input_size, inputs, output_size, outputs); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + UINT32 block_alignment; + HRESULT hr; + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_alignment))) + return hr; + + info->hnsMaxLatency = 0; + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES|MFT_INPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER + |MFT_INPUT_STREAM_FIXED_SAMPLE_SIZE|MFT_INPUT_STREAM_HOLDS_BUFFERS; + info->cbSize = 0; + info->cbMaxLookahead = 0; + info->cbAlignment = 0; + + return S_OK; +} + +static HRESULT WINAPI aac_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + UINT32 channel_count, block_alignment; + HRESULT hr; + + TRACE("iface %p, id %u, info %p.\n", iface, id, info); + + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->output_type, &MF_MT_AUDIO_NUM_CHANNELS, &channel_count))) + return hr; + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->output_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_alignment))) + return hr; + + info->dwFlags = 0; + info->cbSize = 0x1800 * block_alignment * channel_count; + info->cbAlignment = 0; + + return S_OK; +} + +static HRESULT WINAPI aac_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("iface %p, attributes %p stub!\n", iface, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + FIXME("iface %p, id %u stub!\n", iface, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + FIXME("iface %p, streams %u, ids %p stub!\n", iface, streams, ids); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + FIXME("iface %p, id %u, index %u, type %p stub!\n", iface, id, index, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + UINT32 channel_count, sample_size, sample_rate, block_alignment; + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaType *media_type; + const GUID *output_type; + HRESULT hr; + + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); + + if (!decoder->input_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *type = NULL; + + if (index >= ARRAY_SIZE(aac_decoder_output_types)) + return MF_E_NO_MORE_TYPES; + index = ARRAY_SIZE(aac_decoder_output_types) - index - 1; + output_type = aac_decoder_output_types[index]; + + if (FAILED(hr = MFCreateMediaType(&media_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio))) + goto done; + if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, output_type))) + goto done; + + if (IsEqualGUID(output_type, &MFAudioFormat_Float)) + sample_size = 32; + else if (IsEqualGUID(output_type, &MFAudioFormat_PCM)) + sample_size = 16; + else + { + FIXME("Subtype %s not implemented!\n", debugstr_guid(output_type)); + hr = E_NOTIMPL; + goto done; + } + + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, sample_size))) + goto done; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_NUM_CHANNELS, &channel_count))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_NUM_CHANNELS, channel_count))) + goto done; + + if (FAILED(hr = IMFMediaType_GetUINT32(decoder->input_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &sample_rate))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, sample_rate))) + goto done; + + block_alignment = sample_size * channel_count / 8; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, block_alignment))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, sample_rate * block_alignment))) + goto done; + + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, 1))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_FIXED_SIZE_SAMPLES, 1))) + goto done; + if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_PREFER_WAVEFORMATEX, 1))) + goto done; + +done: + if (SUCCEEDED(hr)) + IMFMediaType_AddRef((*type = media_type)); + + IMFMediaType_Release(media_type); + return hr; +} + +static HRESULT WINAPI aac_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + MF_ATTRIBUTE_TYPE item_type; + GUID major, subtype; + HRESULT hr; + ULONG i; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (!IsEqualGUID(&major, &MFMediaType_Audio)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(aac_decoder_input_types); ++i) + if (IsEqualGUID(&subtype, aac_decoder_input_types[i])) + break; + if (i == ARRAY_SIZE(aac_decoder_input_types)) + return MF_E_INVALIDMEDIATYPE; + + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_USER_DATA, &item_type)) || + item_type != MF_ATTRIBUTE_BLOB) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_NUM_CHANNELS, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_PREFER_WAVEFORMATEX, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + + if (!decoder->input_type && FAILED(hr = MFCreateMediaType(&decoder->input_type))) + return hr; + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + return IMFMediaType_CopyAllItems(type, (IMFAttributes *)decoder->input_type); +} + +static HRESULT WINAPI aac_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + MF_ATTRIBUTE_TYPE item_type; + ULONG i, sample_size; + GUID major, subtype; + HRESULT hr; + + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || + FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (!IsEqualGUID(&major, &MFMediaType_Audio)) + return MF_E_INVALIDMEDIATYPE; + + for (i = 0; i < ARRAY_SIZE(aac_decoder_output_types); ++i) + if (IsEqualGUID(&subtype, aac_decoder_output_types[i])) + break; + if (i == ARRAY_SIZE(aac_decoder_output_types)) + return MF_E_INVALIDMEDIATYPE; + + if (IsEqualGUID(&subtype, &MFAudioFormat_Float)) + sample_size = 32; + else if (IsEqualGUID(&subtype, &MFAudioFormat_PCM)) + sample_size = 16; + else + { + FIXME("Subtype %s not implemented!\n", debugstr_guid(&subtype)); + hr = E_NOTIMPL; + return hr; + } + + if (FAILED(IMFMediaType_SetUINT32(decoder->input_type, &MF_MT_AUDIO_BITS_PER_SAMPLE, sample_size))) + return MF_E_INVALIDMEDIATYPE; + + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_NUM_CHANNELS, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + if (FAILED(IMFMediaType_GetItemType(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &item_type)) || + item_type != MF_ATTRIBUTE_UINT32) + return MF_E_INVALIDMEDIATYPE; + + if (!decoder->output_type && FAILED(hr = MFCreateMediaType(&decoder->output_type))) + return hr; + + if (FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *)decoder->output_type))) + return hr; + + try_create_wg_transform(decoder); + return S_OK; +} + +static HRESULT WINAPI aac_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("iface %p, id %u, flags %p stub!\n", iface, id, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("iface %p, flags %p stub!\n", iface, flags); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("iface %p, lower %s, upper %s stub!\n", iface, + wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + FIXME("iface %p, id %u, event %p stub!\n", iface, id, event); + return E_NOTIMPL; +} + +static HRESULT WINAPI aac_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + FIXME("iface %p, message %#x, param %p stub!\n", iface, message, (void *)param); + return S_OK; +} + +static HRESULT WINAPI aac_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + IMFMediaBuffer *media_buffer; + MFT_INPUT_STREAM_INFO info; + UINT32 buffer_size; + BYTE *buffer; + HRESULT hr; + + TRACE("iface %p, id %u, sample %p, flags %#x.\n", iface, id, sample, flags); + + if (FAILED(hr = IMFTransform_GetInputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + if (decoder->input_sample) + return MF_E_NOTACCEPTING; + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &buffer_size))) + goto done; + + if (SUCCEEDED(hr = wg_transform_push_data(decoder->wg_transform, buffer, buffer_size))) + IMFSample_AddRef((decoder->input_sample = sample)); + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static HRESULT WINAPI aac_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct aac_decoder *decoder = impl_from_IMFTransform(iface); + struct wg_sample wg_sample = {0}; + IMFMediaBuffer *media_buffer; + MFT_OUTPUT_STREAM_INFO info; + HRESULT hr; + + TRACE("iface %p, flags %#x, count %u, samples %p, status %p.\n", iface, flags, count, samples, status); + + if (count > 1) + { + FIXME("Not implemented count %u\n", count); + return E_NOTIMPL; + } + + if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) + return hr; + + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + *status = 0; + samples[0].dwStatus = 0; + if (!samples[0].pSample) + { + samples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &media_buffer))) + return hr; + + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &wg_sample.data, &wg_sample.size, NULL))) + goto done; + + if (wg_sample.size < info.cbSize) + hr = MF_E_BUFFERTOOSMALL; + else if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, &wg_sample))) + { + if (wg_sample.flags & WG_SAMPLE_FLAG_INCOMPLETE) + samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_INCOMPLETE; + } + else + { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); + decoder->input_sample = NULL; + } + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_SetCurrentLength(media_buffer, wg_sample.size); + IMFMediaBuffer_Release(media_buffer); + return hr; +} + +static const IMFTransformVtbl aac_decoder_vtbl = +{ + aac_decoder_QueryInterface, + aac_decoder_AddRef, + aac_decoder_Release, + aac_decoder_GetStreamLimits, + aac_decoder_GetStreamCount, + aac_decoder_GetStreamIDs, + aac_decoder_GetInputStreamInfo, + aac_decoder_GetOutputStreamInfo, + aac_decoder_GetAttributes, + aac_decoder_GetInputStreamAttributes, + aac_decoder_GetOutputStreamAttributes, + aac_decoder_DeleteInputStream, + aac_decoder_AddInputStreams, + aac_decoder_GetInputAvailableType, + aac_decoder_GetOutputAvailableType, + aac_decoder_SetInputType, + aac_decoder_SetOutputType, + aac_decoder_GetInputCurrentType, + aac_decoder_GetOutputCurrentType, + aac_decoder_GetInputStatus, + aac_decoder_GetOutputStatus, + aac_decoder_SetOutputBounds, + aac_decoder_ProcessEvent, + aac_decoder_ProcessMessage, + aac_decoder_ProcessInput, + aac_decoder_ProcessOutput, +}; + +HRESULT aac_decoder_create(REFIID riid, void **ret) +{ + struct aac_decoder *decoder; + + TRACE("riid %s, ret %p.\n", debugstr_guid(riid), ret); + + if (!(decoder = calloc(1, sizeof(*decoder)))) + return E_OUTOFMEMORY; + + decoder->IMFTransform_iface.lpVtbl = &aac_decoder_vtbl; + decoder->refcount = 1; + + *ret = &decoder->IMFTransform_iface; + TRACE("Created decoder %p\n", *ret); + return S_OK; +} diff --git a/dlls/winegstreamer/audioconvert.c b/dlls/winegstreamer/audioconvert.c index d5723cdf58f..2e16c9c78f5 100644 --- wine/dlls/winegstreamer/audioconvert.c +++ wine/dlls/winegstreamer/audioconvert.c @@ -35,6 +35,11 @@ struct audio_converter IMFMediaType *input_type; IMFMediaType *output_type; CRITICAL_SECTION cs; + BOOL buffer_inflight; + LONGLONG buffer_pts, buffer_dur; + struct wg_parser *parser; + struct wg_parser_stream *stream; + IMFAttributes *attributes, *output_attributes; }; static struct audio_converter *impl_audio_converter_from_IMFTransform(IMFTransform *iface) @@ -64,7 +69,7 @@ static ULONG WINAPI audio_converter_AddRef(IMFTransform *iface) struct audio_converter *transform = impl_audio_converter_from_IMFTransform(iface); ULONG refcount = InterlockedIncrement(&transform->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -74,12 +79,20 @@ static ULONG WINAPI audio_converter_Release(IMFTransform *iface) struct audio_converter *transform = impl_audio_converter_from_IMFTransform(iface); ULONG refcount = InterlockedDecrement(&transform->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { transform->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&transform->cs); + if (transform->attributes) + IMFAttributes_Release(transform->attributes); + if (transform->output_attributes) + IMFAttributes_Release(transform->output_attributes); + if (transform->stream) + wg_parser_disconnect(transform->parser); + if (transform->parser) + wg_parser_destroy(transform->parser); free(transform); } @@ -108,36 +121,75 @@ static HRESULT WINAPI audio_converter_GetStreamCount(IMFTransform *iface, DWORD static HRESULT WINAPI audio_converter_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, DWORD output_size, DWORD *outputs) { - TRACE("%p, %lu, %p, %lu, %p.\n", iface, input_size, inputs, output_size, outputs); + TRACE("%p %u %p %u %p.\n", iface, input_size, inputs, output_size, outputs); return E_NOTIMPL; } static HRESULT WINAPI audio_converter_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) { - FIXME("%p, %lu, %p.\n", iface, id, info); + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); - return E_NOTIMPL; + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_DOES_NOT_ADDREF; + info->cbMaxLookahead = 0; + info->cbAlignment = 0; + info->hnsMaxLatency = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + IMFMediaType_GetUINT32(converter->input_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &info->cbSize); + + LeaveCriticalSection(&converter->cs); + + return S_OK; } static HRESULT WINAPI audio_converter_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) { - FIXME("%p. %lu, %p.\n", iface, id, info); + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); - return E_NOTIMPL; + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES; + info->cbAlignment = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + IMFMediaType_GetUINT32(converter->output_type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &info->cbSize); + + LeaveCriticalSection(&converter->cs); + + return S_OK; } static HRESULT WINAPI audio_converter_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) { - FIXME("%p, %p.\n", iface, attributes); + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); - return E_NOTIMPL; + TRACE("%p, %p.\n", iface, attributes); + + *attributes = converter->attributes; + IMFAttributes_AddRef(*attributes); + + return S_OK; } static HRESULT WINAPI audio_converter_GetInputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) { - FIXME("%p, %lu, %p.\n", iface, id, attributes); + FIXME("%p, %u, %p.\n", iface, id, attributes); return E_NOTIMPL; } @@ -145,21 +197,29 @@ static HRESULT WINAPI audio_converter_GetInputStreamAttributes(IMFTransform *ifa static HRESULT WINAPI audio_converter_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) { - FIXME("%p, %lu, %p.\n", iface, id, attributes); + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); - return E_NOTIMPL; + TRACE("%p, %u, %p.\n", iface, id, attributes); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + *attributes = converter->output_attributes; + IMFAttributes_AddRef(*attributes); + + return S_OK; } static HRESULT WINAPI audio_converter_DeleteInputStream(IMFTransform *iface, DWORD id) { - TRACE("%p, %lu.\n", iface, id); + TRACE("%p, %u.\n", iface, id); return E_NOTIMPL; } static HRESULT WINAPI audio_converter_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) { - TRACE("%p, %lu, %p.\n", iface, streams, ids); + TRACE("%p, %u, %p.\n", iface, streams, ids); return E_NOTIMPL; } @@ -170,7 +230,7 @@ static HRESULT WINAPI audio_converter_GetInputAvailableType(IMFTransform *iface, IMFMediaType *ret; HRESULT hr; - TRACE("%p, %lu, %lu, %p.\n", iface, id, index, type); + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); if (id != 0) return MF_E_INVALIDSTREAMNUMBER; @@ -222,7 +282,7 @@ static HRESULT WINAPI audio_converter_GetOutputAvailableType(IMFTransform *iface const GUID *subtype; DWORD rate, channels, bps; - TRACE("%p, %lu, %lu, %p.\n", iface, id, index, type); + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); if (id != 0) return MF_E_INVALIDSTREAMNUMBER; @@ -272,12 +332,13 @@ fail: static HRESULT WINAPI audio_converter_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { GUID major_type, subtype; - UINT32 unused; + struct wg_format format; + DWORD unused; HRESULT hr; struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); - TRACE("%p, %lu, %p, %#lx.\n", iface, id, type, flags); + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); if (id != 0) return MF_E_INVALIDSTREAMNUMBER; @@ -291,6 +352,11 @@ static HRESULT WINAPI audio_converter_SetInputType(IMFTransform *iface, DWORD id if (converter->input_type) { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } IMFMediaType_Release(converter->input_type); converter->input_type = NULL; } @@ -317,6 +383,10 @@ static HRESULT WINAPI audio_converter_SetInputType(IMFTransform *iface, DWORD id if (!IsEqualGUID(&subtype, &MFAudioFormat_PCM) && !IsEqualGUID(&subtype, &MFAudioFormat_Float)) return MF_E_INVALIDTYPE; + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + if (flags & MFT_SET_TYPE_TEST_ONLY) return S_OK; @@ -336,6 +406,21 @@ static HRESULT WINAPI audio_converter_SetInputType(IMFTransform *iface, DWORD id converter->input_type = NULL; } + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format output_format; + mf_media_type_to_wg_format(converter->output_type, &output_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &format, 1, &output_format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + LeaveCriticalSection(&converter->cs); return hr; @@ -345,17 +430,15 @@ static HRESULT WINAPI audio_converter_SetOutputType(IMFTransform *iface, DWORD i { struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); GUID major_type, subtype; - UINT32 unused; + struct wg_format format; + DWORD unused; HRESULT hr; - TRACE("%p, %lu, %p, %#lx.\n", iface, id, type, flags); + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); if (id != 0) return MF_E_INVALIDSTREAMNUMBER; - if (!converter->input_type) - return MF_E_TRANSFORM_TYPE_NOT_SET; - if (!type) { if (flags & MFT_SET_TYPE_TEST_ONLY) @@ -365,6 +448,11 @@ static HRESULT WINAPI audio_converter_SetOutputType(IMFTransform *iface, DWORD i if (converter->output_type) { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } IMFMediaType_Release(converter->output_type); converter->output_type = NULL; } @@ -391,6 +479,10 @@ static HRESULT WINAPI audio_converter_SetOutputType(IMFTransform *iface, DWORD i if (!IsEqualGUID(&subtype, &MFAudioFormat_PCM) && !IsEqualGUID(&subtype, &MFAudioFormat_Float)) return MF_E_INVALIDTYPE; + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + if (flags & MFT_SET_TYPE_TEST_ONLY) return S_OK; @@ -410,6 +502,21 @@ static HRESULT WINAPI audio_converter_SetOutputType(IMFTransform *iface, DWORD i converter->output_type = NULL; } + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format input_format; + mf_media_type_to_wg_format(converter->input_type, &input_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &input_format, 1, &format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + LeaveCriticalSection(&converter->cs); return hr; @@ -421,7 +528,7 @@ static HRESULT WINAPI audio_converter_GetInputCurrentType(IMFTransform *iface, D IMFMediaType *ret; HRESULT hr; - TRACE("%p, %lu, %p.\n", converter, id, type); + TRACE("%p, %u, %p.\n", converter, id, type); if (id != 0) return MF_E_INVALIDSTREAMNUMBER; @@ -452,7 +559,7 @@ static HRESULT WINAPI audio_converter_GetOutputCurrentType(IMFTransform *iface, IMFMediaType *ret; HRESULT hr; - TRACE("%p, %lu, %p.\n", converter, id, type); + TRACE("%p, %u, %p.\n", converter, id, type); if (id != 0) return MF_E_INVALIDSTREAMNUMBER; @@ -479,7 +586,7 @@ static HRESULT WINAPI audio_converter_GetOutputCurrentType(IMFTransform *iface, static HRESULT WINAPI audio_converter_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) { - FIXME("%p, %lu, %p.\n", iface, id, flags); + FIXME("%p, %u, %p.\n", iface, id, flags); return E_NOTIMPL; } @@ -500,17 +607,36 @@ static HRESULT WINAPI audio_converter_SetOutputBounds(IMFTransform *iface, LONGL static HRESULT WINAPI audio_converter_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) { - TRACE("%p, %lu, %p.\n", iface, id, event); + TRACE("%p, %u, %p.\n", iface, id, event); return E_NOTIMPL; } static HRESULT WINAPI audio_converter_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) { - TRACE("%p, %u, %Iu.\n", iface, message, param); + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + struct wg_parser_buffer wg_buffer; + + TRACE("%p, %u %lu.\n", iface, message, param); switch(message) { + case MFT_MESSAGE_COMMAND_FLUSH: + { + EnterCriticalSection(&converter->cs); + if (!converter->buffer_inflight) + { + LeaveCriticalSection(&converter->cs); + return S_OK; + } + + wg_parser_stream_get_buffer(converter->stream, &wg_buffer); + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + LeaveCriticalSection(&converter->cs); + return S_OK; + } case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: return S_OK; default: @@ -521,17 +647,197 @@ static HRESULT WINAPI audio_converter_ProcessMessage(IMFTransform *iface, MFT_ME static HRESULT WINAPI audio_converter_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) { - FIXME("%p, %lu, %p, %#lx.\n", iface, id, sample, flags); + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_size; + uint64_t offset; + uint32_t size; + HRESULT hr; - return E_NOTIMPL; + TRACE("%p, %u, %p, %#x.\n", iface, id, sample, flags); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (converter->buffer_inflight) + { + hr = MF_E_NOTACCEPTING; + goto done; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer))) + goto done; + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, &buffer_size))) + goto done; + + if (!wg_parser_get_next_read_offset(converter->parser, &offset, &size)) + { + hr = MF_E_UNEXPECTED; + IMFMediaBuffer_Unlock(buffer); + goto done; + } + + wg_parser_push_data(converter->parser, WG_READ_SUCCESS, buffer_data, buffer_size); + + IMFMediaBuffer_Unlock(buffer); + converter->buffer_inflight = TRUE; + if (FAILED(IMFSample_GetSampleTime(sample, &converter->buffer_pts))) + converter->buffer_pts = -1; + if (FAILED(IMFSample_GetSampleDuration(sample, &converter->buffer_dur))) + converter->buffer_dur = -1; + +done: + if (buffer) + IMFMediaBuffer_Release(buffer); + LeaveCriticalSection(&converter->cs); + return hr; } static HRESULT WINAPI audio_converter_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) { - FIXME("%p, %#lx, %lu, %p, %p.\n", iface, flags, count, samples, status); + struct audio_converter *converter = impl_audio_converter_from_IMFTransform(iface); + IMFSample *allocated_sample = NULL; + struct wg_parser_buffer wg_buffer; + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_len; + HRESULT hr = S_OK; - return E_NOTIMPL; + TRACE("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (!count) + return S_OK; + + if (count != 1) + return MF_E_INVALIDSTREAMNUMBER; + + if (samples[0].dwStreamID != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (!converter->buffer_inflight) + { + hr = MF_E_TRANSFORM_NEED_MORE_INPUT; + goto done; + } + + if (!wg_parser_stream_get_buffer(converter->stream, &wg_buffer)) + assert(0); + + if (!samples[0].pSample) + { + if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer.size, &buffer))) + { + ERR("Failed to create buffer, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = MFCreateSample(&allocated_sample))) + { + ERR("Failed to create sample, hr %#x.\n", hr); + goto done; + } + + samples[0].pSample = allocated_sample; + + if (FAILED(hr = IMFSample_AddBuffer(samples[0].pSample, buffer))) + { + ERR("Failed to add buffer, hr %#x.\n", hr); + goto done; + } + + IMFMediaBuffer_Release(buffer); + buffer = NULL; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &buffer))) + { + ERR("Failed to get buffer from sample, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_GetMaxLength(buffer, &buffer_len))) + { + ERR("Failed to get buffer size, hr %#x.\n", hr); + goto done; + } + + if (buffer_len < wg_buffer.size) + { + WARN("Client's buffer is smaller (%u bytes) than the output sample (%u bytes)\n", + buffer_len, wg_buffer.size); + + hr = MF_E_BUFFERTOOSMALL; + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer.size))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, NULL))) + { + ERR("Failed to lock buffer hr %#x.\n", hr); + goto done; + } + + if (!wg_parser_stream_copy_buffer(converter->stream, buffer_data, 0, wg_buffer.size)) + { + ERR("Failed to copy buffer.\n"); + IMFMediaBuffer_Unlock(buffer); + hr = E_FAIL; + goto done; + } + + IMFMediaBuffer_Unlock(buffer); + + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + if (converter->buffer_pts != -1) + IMFSample_SetSampleTime(samples[0].pSample, converter->buffer_pts); + if (converter->buffer_dur != -1) + IMFSample_SetSampleDuration(samples[0].pSample, converter->buffer_dur); + + samples[0].dwStatus = 0; + samples[0].pEvents = NULL; + + done: + if (buffer) + IMFMediaBuffer_Release(buffer); + if (allocated_sample && FAILED(hr)) + { + IMFSample_Release(allocated_sample); + samples[0].pSample = NULL; + } + LeaveCriticalSection(&converter->cs); + return hr; } static const IMFTransformVtbl audio_converter_vtbl = @@ -567,6 +873,7 @@ static const IMFTransformVtbl audio_converter_vtbl = HRESULT audio_converter_create(REFIID riid, void **ret) { struct audio_converter *object; + HRESULT hr; TRACE("%s %p\n", debugstr_guid(riid), ret); @@ -579,6 +886,25 @@ HRESULT audio_converter_create(REFIID riid, void **ret) InitializeCriticalSection(&object->cs); object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": audio_converter_lock"); + if (FAILED(hr = MFCreateAttributes(&object->attributes, 0))) + { + IMFTransform_Release(&object->IMFTransform_iface); + return hr; + } + + if (FAILED(hr = MFCreateAttributes(&object->output_attributes, 0))) + { + IMFTransform_Release(&object->IMFTransform_iface); + return hr; + } + + if (!(object->parser = wg_parser_create(WG_PARSER_AUDIOCONV, true))) + { + ERR("Failed to create audio converter due to GStreamer error.\n"); + IMFTransform_Release(&object->IMFTransform_iface); + return E_OUTOFMEMORY; + } + *ret = &object->IMFTransform_iface; return S_OK; } diff --git a/dlls/winegstreamer/colorconvert.c b/dlls/winegstreamer/colorconvert.c new file mode 100644 index 00000000000..92322e877ec --- /dev/null +++ wine/dlls/winegstreamer/colorconvert.c @@ -0,0 +1,901 @@ +/* GStreamer Color Converter + * + * Copyright 2020 Derek Lesho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +static const GUID *raw_types[] = { + &MFVideoFormat_RGB24, + &MFVideoFormat_RGB32, + &MFVideoFormat_RGB555, + &MFVideoFormat_RGB8, + &MFVideoFormat_AYUV, + &MFVideoFormat_I420, + &MFVideoFormat_IYUV, + &MFVideoFormat_NV11, + &MFVideoFormat_NV12, + &MFVideoFormat_UYVY, + &MFVideoFormat_v216, + &MFVideoFormat_v410, + &MFVideoFormat_YUY2, + &MFVideoFormat_YVYU, + &MFVideoFormat_YVYU, +}; + +struct color_converter +{ + IMFTransform IMFTransform_iface; + LONG refcount; + IMFMediaType *input_type; + IMFMediaType *output_type; + CRITICAL_SECTION cs; + BOOL buffer_inflight; + LONGLONG buffer_pts, buffer_dur; + struct wg_parser *parser; + struct wg_parser_stream *stream; +}; + +static struct color_converter *impl_color_converter_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct color_converter, IMFTransform_iface); +} + +static HRESULT WINAPI color_converter_QueryInterface(IMFTransform *iface, REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualGUID(riid, &IID_IMFTransform) || + IsEqualGUID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFTransform_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI color_converter_AddRef(IMFTransform *iface) +{ + struct color_converter *transform = impl_color_converter_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI color_converter_Release(IMFTransform *iface) +{ + struct color_converter *transform = impl_color_converter_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&transform->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + transform->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&transform->cs); + if (transform->output_type) + IMFMediaType_Release(transform->output_type); + if (transform->stream) + wg_parser_disconnect(transform->parser); + if (transform->parser) + wg_parser_destroy(transform->parser); + free(transform); + } + + return refcount; +} + +static HRESULT WINAPI color_converter_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + TRACE("%p, %p, %p, %p, %p.\n", iface, input_minimum, input_maximum, output_minimum, output_maximum); + + *input_minimum = *input_maximum = *output_minimum = *output_maximum = 1; + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + TRACE("%p, %p, %p.\n", iface, inputs, outputs); + + *inputs = *outputs = 1; + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + TRACE("%p %u %p %u %p.\n", iface, input_size, inputs, output_size, outputs); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 framesize; + GUID subtype; + + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_DOES_NOT_ADDREF | MFT_INPUT_STREAM_FIXED_SAMPLE_SIZE; + info->cbMaxLookahead = 0; + info->cbAlignment = 0; + info->hnsMaxLatency = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + { + if (SUCCEEDED(IMFMediaType_GetGUID(converter->input_type, &MF_MT_SUBTYPE, &subtype)) && + SUCCEEDED(IMFMediaType_GetUINT64(converter->input_type, &MF_MT_FRAME_SIZE, &framesize))) + { + MFCalculateImageSize(&subtype, framesize >> 32, (UINT32) framesize, &info->cbSize); + } + + if (!info->cbSize) + WARN("Failed to get desired input buffer size, the non-provided sample path will likely break\n"); + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 framesize; + GUID subtype; + + TRACE("%p %u %p.\n", iface, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES | MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER; + info->cbAlignment = 0; + info->cbSize = 0; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + { + if (SUCCEEDED(IMFMediaType_GetGUID(converter->output_type, &MF_MT_SUBTYPE, &subtype)) && + SUCCEEDED(IMFMediaType_GetUINT64(converter->output_type, &MF_MT_FRAME_SIZE, &framesize))) + { + MFCalculateImageSize(&subtype, framesize >> 32, (UINT32) framesize, &info->cbSize); + } + + if (!info->cbSize) + WARN("Failed to get desired output buffer size, the non-provided sample path will likely break\n"); + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("%p, %p.\n", iface, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + TRACE("%p, %u.\n", iface, id); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + TRACE("%p, %u, %p.\n", iface, streams, ids); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= ARRAY_SIZE(raw_types)) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_MAJOR_TYPE, &MFMediaType_Video))) + { + IMFMediaType_Release(ret); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_SUBTYPE, raw_types[index]))) + { + IMFMediaType_Release(ret); + return hr; + } + + *type = ret; + + return S_OK; +} + +static HRESULT WINAPI color_converter_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %u, %p.\n", iface, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= ARRAY_SIZE(raw_types)) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + IMFMediaType_CopyAllItems(converter->input_type, (IMFAttributes *) ret); + + LeaveCriticalSection(&converter->cs); + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_MAJOR_TYPE, &MFMediaType_Video))) + { + IMFMediaType_Release(ret); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(ret, &MF_MT_SUBTYPE, raw_types[index]))) + { + IMFMediaType_Release(ret); + return hr; + } + + *type = ret; + + return S_OK; +} + +static HRESULT WINAPI color_converter_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 input_framesize, output_framesize; + GUID major_type, subtype; + struct wg_format format; + unsigned int i; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + if (converter->input_type) + { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + IMFMediaType_Release(converter->input_type); + converter->input_type = NULL; + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!IsEqualGUID(&major_type, &MFMediaType_Video)) + return MF_E_INVALIDTYPE; + + for (i = 0; i < ARRAY_SIZE(raw_types); i++) + { + if (IsEqualGUID(&subtype, raw_types[i])) + break; + } + + if (i == ARRAY_SIZE(raw_types)) + return MF_E_INVALIDTYPE; + + EnterCriticalSection(&converter->cs); + + if(converter->output_type + && SUCCEEDED(IMFMediaType_GetUINT64(converter->output_type, &MF_MT_FRAME_SIZE, &output_framesize)) + && SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &input_framesize)) + && input_framesize != output_framesize) + { + LeaveCriticalSection(&converter->cs); + return MF_E_INVALIDTYPE; + } + + LeaveCriticalSection(&converter->cs); + + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + hr = S_OK; + + if (!converter->input_type) + hr = MFCreateMediaType(&converter->input_type); + + if (SUCCEEDED(hr)) + hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *) converter->input_type); + + if (FAILED(hr)) + { + IMFMediaType_Release(converter->input_type); + converter->input_type = NULL; + } + + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format output_format; + mf_media_type_to_wg_format(converter->output_type, &output_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &format, 1, &output_format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + + LeaveCriticalSection(&converter->cs); + + return hr; +} + +static HRESULT WINAPI color_converter_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + UINT64 input_framesize, output_framesize; + GUID major_type, subtype; + struct wg_format format; + unsigned int i; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + { + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + IMFMediaType_Release(converter->output_type); + converter->output_type = NULL; + } + + LeaveCriticalSection(&converter->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!IsEqualGUID(&major_type, &MFMediaType_Video)) + return MF_E_INVALIDTYPE; + + for (i = 0; i < ARRAY_SIZE(raw_types); i++) + { + if (IsEqualGUID(&subtype, raw_types[i])) + break; + } + + if (i == ARRAY_SIZE(raw_types)) + return MF_E_INVALIDTYPE; + + EnterCriticalSection(&converter->cs); + + if(converter->input_type + && SUCCEEDED(IMFMediaType_GetUINT64(converter->input_type, &MF_MT_FRAME_SIZE, &input_framesize)) + && SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &output_framesize)) + && input_framesize != output_framesize) + { + LeaveCriticalSection(&converter->cs); + return MF_E_INVALIDTYPE; + } + + LeaveCriticalSection(&converter->cs); + + mf_media_type_to_wg_format(type, &format); + if (!format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&converter->cs); + + hr = S_OK; + + if (!converter->output_type) + hr = MFCreateMediaType(&converter->output_type); + + if (SUCCEEDED(hr)) + hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *) converter->output_type); + + if (FAILED(hr)) + { + IMFMediaType_Release(converter->output_type); + converter->output_type = NULL; + } + + if (converter->stream) + { + wg_parser_disconnect(converter->parser); + converter->stream = NULL; + } + + if (converter->input_type && converter->output_type) + { + struct wg_format input_format; + mf_media_type_to_wg_format(converter->input_type, &input_format); + + if (SUCCEEDED(hr = wg_parser_connect_unseekable(converter->parser, &input_format, 1, &format, NULL))) + converter->stream = wg_parser_get_stream(converter->parser, 0); + } + + LeaveCriticalSection(&converter->cs); + + return hr; +} + +static HRESULT WINAPI color_converter_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFMediaType *ret; + HRESULT hr; + + TRACE("%p, %u, %p.\n", converter, id, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (FAILED(hr = MFCreateMediaType(&ret))) + return hr; + + EnterCriticalSection(&converter->cs); + + if (converter->output_type) + hr = IMFMediaType_CopyAllItems(converter->output_type, (IMFAttributes *)ret); + else + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + + LeaveCriticalSection(&converter->cs); + + if (SUCCEEDED(hr)) + *type = ret; + else + IMFMediaType_Release(ret); + + return hr; +} + +static HRESULT WINAPI color_converter_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("%p, %u, %p.\n", iface, id, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("%p, %p.\n", iface, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("%p, %s, %s.\n", iface, wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + TRACE("%p, %u, %p.\n", iface, id, event); + + return E_NOTIMPL; +} + +static HRESULT WINAPI color_converter_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + struct wg_parser_buffer wg_buffer; + + TRACE("%p, %u %lu.\n", iface, message, param); + + switch(message) + { + case MFT_MESSAGE_COMMAND_FLUSH: + { + EnterCriticalSection(&converter->cs); + if (!converter->buffer_inflight) + { + LeaveCriticalSection(&converter->cs); + return S_OK; + } + + wg_parser_stream_get_buffer(converter->stream, &wg_buffer); + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + LeaveCriticalSection(&converter->cs); + return S_OK; + } + case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: + return S_OK; + default: + FIXME("Unhandled message type %x.\n", message); + return E_NOTIMPL; + } +} + +static HRESULT WINAPI color_converter_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_size; + uint64_t offset; + uint32_t size; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", iface, id, sample, flags); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (converter->buffer_inflight) + { + hr = MF_E_NOTACCEPTING; + goto done; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer))) + goto done; + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, &buffer_size))) + goto done; + + for (;;) + { + if (!wg_parser_get_next_read_offset(converter->parser, &offset, &size)) + { + TRACE("sink unconnected\n"); + continue; + } + + wg_parser_push_data(converter->parser, WG_READ_SUCCESS, buffer_data, min(buffer_size, size)); + + if (buffer_size <= size) + break; + + buffer_data += size; + buffer_size -= size; + } + + IMFMediaBuffer_Unlock(buffer); + converter->buffer_inflight = TRUE; + if (FAILED(IMFSample_GetSampleTime(sample, &converter->buffer_pts))) + converter->buffer_pts = -1; + if (FAILED(IMFSample_GetSampleDuration(sample, &converter->buffer_dur))) + converter->buffer_dur = -1; + +done: + if (buffer) + IMFMediaBuffer_Release(buffer); + LeaveCriticalSection(&converter->cs); + return hr; +} + +static HRESULT WINAPI color_converter_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct color_converter *converter = impl_color_converter_from_IMFTransform(iface); + IMFSample *allocated_sample = NULL; + struct wg_parser_buffer wg_buffer; + IMFMediaBuffer *buffer = NULL; + unsigned char *buffer_data; + DWORD buffer_len; + HRESULT hr = S_OK; + + TRACE("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); + + if (flags) + WARN("Unsupported flags %#x.\n", flags); + + if (!count) + return S_OK; + + if (count != 1) + return MF_E_INVALIDSTREAMNUMBER; + + if (samples[0].dwStreamID != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&converter->cs); + + if (!converter->stream) + { + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + goto done; + } + + if (!converter->buffer_inflight) + { + hr = MF_E_TRANSFORM_NEED_MORE_INPUT; + goto done; + } + + if (!wg_parser_stream_get_buffer(converter->stream, &wg_buffer)) + assert(0); + + if (!samples[0].pSample) + { + if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer.size, &buffer))) + { + ERR("Failed to create buffer, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = MFCreateSample(&allocated_sample))) + { + ERR("Failed to create sample, hr %#x.\n", hr); + goto done; + } + + samples[0].pSample = allocated_sample; + + if (FAILED(hr = IMFSample_AddBuffer(samples[0].pSample, buffer))) + { + ERR("Failed to add buffer, hr %#x.\n", hr); + goto done; + } + + IMFMediaBuffer_Release(buffer); + buffer = NULL; + } + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &buffer))) + { + ERR("Failed to get buffer from sample, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_GetMaxLength(buffer, &buffer_len))) + { + ERR("Failed to get buffer size, hr %#x.\n", hr); + goto done; + } + + if (buffer_len < wg_buffer.size) + { + WARN("Client's buffer is smaller (%u bytes) than the output sample (%u bytes)\n", + buffer_len, wg_buffer.size); + + hr = MF_E_BUFFERTOOSMALL; + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer.size))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto done; + } + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, NULL))) + { + ERR("Failed to lock buffer hr %#x.\n", hr); + goto done; + } + + if (!wg_parser_stream_copy_buffer(converter->stream, buffer_data, 0, wg_buffer.size)) + { + ERR("Failed to copy buffer.\n"); + IMFMediaBuffer_Unlock(buffer); + hr = E_FAIL; + goto done; + } + + IMFMediaBuffer_Unlock(buffer); + + wg_parser_stream_release_buffer(converter->stream); + converter->buffer_inflight = FALSE; + + if (converter->buffer_pts != -1) + IMFSample_SetSampleTime(samples[0].pSample, converter->buffer_pts); + if (converter->buffer_dur != -1) + IMFSample_SetSampleDuration(samples[0].pSample, converter->buffer_dur); + + samples[0].dwStatus = 0; + samples[0].pEvents = NULL; + + done: + if (buffer) + IMFMediaBuffer_Release(buffer); + if (FAILED(hr) && allocated_sample) + { + IMFSample_Release(allocated_sample); + samples[0].pSample = NULL; + } + LeaveCriticalSection(&converter->cs); + return hr; +} + +static const IMFTransformVtbl color_converter_vtbl = +{ + color_converter_QueryInterface, + color_converter_AddRef, + color_converter_Release, + color_converter_GetStreamLimits, + color_converter_GetStreamCount, + color_converter_GetStreamIDs, + color_converter_GetInputStreamInfo, + color_converter_GetOutputStreamInfo, + color_converter_GetAttributes, + color_converter_GetInputStreamAttributes, + color_converter_GetOutputStreamAttributes, + color_converter_DeleteInputStream, + color_converter_AddInputStreams, + color_converter_GetInputAvailableType, + color_converter_GetOutputAvailableType, + color_converter_SetInputType, + color_converter_SetOutputType, + color_converter_GetInputCurrentType, + color_converter_GetOutputCurrentType, + color_converter_GetInputStatus, + color_converter_GetOutputStatus, + color_converter_SetOutputBounds, + color_converter_ProcessEvent, + color_converter_ProcessMessage, + color_converter_ProcessInput, + color_converter_ProcessOutput, +}; + +HRESULT color_converter_create(REFIID riid, void **ret) +{ + struct color_converter *object; + + TRACE("%s %p\n", debugstr_guid(riid), ret); + + if (!(object = calloc(1, sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IMFTransform_iface.lpVtbl = &color_converter_vtbl; + object->refcount = 1; + + InitializeCriticalSection(&object->cs); + object->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": color_converter_lock"); + + if (!(object->parser = wg_parser_create(WG_PARSER_VIDEOCONV, true))) + { + ERR("Failed to create video converter due to GStreamer error.\n"); + IMFTransform_Release(&object->IMFTransform_iface); + return E_OUTOFMEMORY; + } + + *ret = &object->IMFTransform_iface; + return S_OK; +} diff --git a/dlls/winegstreamer/decode_transform.c b/dlls/winegstreamer/decode_transform.c new file mode 100644 index 00000000000..fb7f432923f --- /dev/null +++ wine/dlls/winegstreamer/decode_transform.c @@ -0,0 +1,1218 @@ +/* GStreamer Decoder Transform + * + * Copyright 2021 Derek Lesho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "gst_private.h" + +#include "mfapi.h" +#include "mferror.h" +#include "mfobjects.h" +#include "mftransform.h" + +#include "wine/debug.h" +#include "wine/heap.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); + +const GUID *h264_input_types[] = {&MFVideoFormat_H264}; +/* NV12 comes first https://docs.microsoft.com/en-us/windows/win32/medfound/mft-decoder-expose-output-types-in-native-order . thanks to @vitorhnn */ +const GUID *h264_output_types[] = {&MFVideoFormat_NV12, &MFVideoFormat_I420, &MFVideoFormat_IYUV, &MFVideoFormat_YUY2, &MFVideoFormat_YV12}; + +const GUID *aac_input_types[] = {&MFAudioFormat_AAC}; +const GUID *aac_output_types[] = {&MFAudioFormat_Float}; + +static struct decoder_desc +{ + const GUID *major_type; + const GUID **input_types; + unsigned int input_types_count; + const GUID **output_types; + unsigned int output_types_count; +} decoder_descs[] = +{ + { /* DECODER_TYPE_H264 */ + &MFMediaType_Video, + h264_input_types, + ARRAY_SIZE(h264_input_types), + h264_output_types, + ARRAY_SIZE(h264_output_types), + }, + { /* DECODER_TYPE_AAC */ + &MFMediaType_Audio, + aac_input_types, + ARRAY_SIZE(aac_input_types), + aac_output_types, + ARRAY_SIZE(aac_output_types), + } +}; + +struct pipeline_event +{ + enum + { + PIPELINE_EVENT_NONE, + PIPELINE_EVENT_PARSER_STARTED, + PIPELINE_EVENT_READ_REQUEST, + } type; + union + { + struct + { + struct wg_parser_stream *stream; + } parser_started; + } u; +}; + +struct mf_decoder +{ + IMFTransform IMFTransform_iface; + LONG refcount; + enum decoder_type type; + IMFMediaType *input_type, *output_type; + CRITICAL_SECTION cs, help_cs, event_cs; + CONDITION_VARIABLE help_cv, event_cv; + BOOL flushing, draining, eos, helper_thread_shutdown, video; + HANDLE helper_thread, read_thread; + uint64_t offset_tracker; + struct wg_parser *wg_parser; + struct wg_parser_stream *wg_stream; + + struct + { + enum + { + HELP_REQ_NONE, + HELP_REQ_START_PARSER, + } type; + } help_request; + + struct pipeline_event event; +}; + +static struct mf_decoder *impl_mf_decoder_from_IMFTransform(IMFTransform *iface) +{ + return CONTAINING_RECORD(iface, struct mf_decoder, IMFTransform_iface); +} + +static HRESULT WINAPI mf_decoder_QueryInterface (IMFTransform *iface, REFIID riid, void **out) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out); + + if (IsEqualIID(riid, &IID_IMFTransform) || + IsEqualIID(riid, &IID_IUnknown)) + { + *out = iface; + IMFTransform_AddRef(iface); + return S_OK; + } + + WARN("Unsupported %s.\n", debugstr_guid(riid)); + *out = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI mf_decoder_AddRef(IMFTransform *iface) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + ULONG refcount = InterlockedIncrement(&decoder->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + return refcount; +} + +static ULONG WINAPI mf_decoder_Release(IMFTransform *iface) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + ULONG refcount = InterlockedDecrement(&decoder->refcount); + + TRACE("%p, refcount %u.\n", iface, refcount); + + if (!refcount) + { + if (decoder->input_type) + { + IMFMediaType_Release(decoder->input_type); + decoder->input_type = NULL; + } + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + if (decoder->wg_parser) + { + /* NULL wg_parser is possible if the wg_parser creation failed. */ + + if (decoder->wg_stream) + wg_parser_disconnect(decoder->wg_parser); + + EnterCriticalSection(&decoder->event_cs); + decoder->helper_thread_shutdown = TRUE; + WakeAllConditionVariable(&decoder->event_cv); + LeaveCriticalSection(&decoder->event_cs); + + EnterCriticalSection(&decoder->help_cs); + WakeAllConditionVariable(&decoder->help_cv); + LeaveCriticalSection(&decoder->help_cs); + + if (WaitForSingleObject(decoder->helper_thread, 10000) != WAIT_OBJECT_0) + FIXME("Failed waiting for helper thread to terminate.\n"); + CloseHandle(decoder->helper_thread); + if (WaitForSingleObject(decoder->read_thread, 10000) != WAIT_OBJECT_0) + FIXME("Failed waiting for read thread to terminate.\n"); + CloseHandle(decoder->read_thread); + + wg_parser_destroy(decoder->wg_parser); + } + + DeleteCriticalSection(&decoder->cs); + DeleteCriticalSection(&decoder->help_cs); + DeleteCriticalSection(&decoder->event_cs); + + heap_free(decoder); + } + + return refcount; +} + +static HRESULT WINAPI mf_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) +{ + TRACE("%p, %p, %p, %p, %p.\n", iface, input_minimum, input_maximum, output_minimum, output_maximum); + + *input_minimum = *input_maximum = *output_minimum = *output_maximum = 1; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +{ + TRACE("%p %p %p.\n", iface, inputs, outputs); + + *inputs = *outputs = 1; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) +{ + TRACE("%p %u %p %u %p.\n", iface, input_size, inputs, output_size, outputs); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + + TRACE("%p %u %p\n", decoder, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + info->dwFlags = MFT_INPUT_STREAM_WHOLE_SAMPLES | MFT_INPUT_STREAM_DOES_NOT_ADDREF; + info->cbAlignment = 0; + info->cbSize = 0; + /* TODO: retrieve following fields from gstreamer */ + info->hnsMaxLatency = 0; + info->cbMaxLookahead = 0; + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + MFT_OUTPUT_STREAM_INFO stream_info = {}; + GUID output_subtype; + UINT64 framesize; + + TRACE("%p %u %p\n", decoder, id, info); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&decoder->cs); + + if (!decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + if (decoder->video) + { + stream_info.dwFlags = MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | + MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES; + stream_info.cbSize = 0; + if (SUCCEEDED(IMFMediaType_GetGUID(decoder->output_type, &MF_MT_SUBTYPE, &output_subtype)) && + SUCCEEDED(IMFMediaType_GetUINT64(decoder->output_type, &MF_MT_FRAME_SIZE, &framesize))) + { + MFCalculateImageSize(&output_subtype, framesize >> 32, (UINT32) framesize, &stream_info.cbSize); + } + if (!stream_info.cbSize) + ERR("Failed to get desired output buffer size\n"); + } + else + { + stream_info.dwFlags = MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE | MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES; + stream_info.cbSize = 4; + } + stream_info.cbAlignment = 0; + + LeaveCriticalSection(&decoder->cs); + + *info = stream_info; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +{ + FIXME("%p, %p. semi-stub!\n", iface, attributes); + + return MFCreateAttributes(attributes, 0); +} + +static HRESULT WINAPI mf_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) +{ + FIXME("%p, %u, %p.\n", iface, id, attributes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) +{ + TRACE("%p, %u.\n", iface, id); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +{ + TRACE("%p, %u, %p.\n", iface, streams, ids); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + IMFMediaType *input_type; + HRESULT hr; + + TRACE("%p, %u, %u, %p\n", decoder, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= decoder_descs[decoder->type].input_types_count) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&input_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(input_type, &MF_MT_MAJOR_TYPE, decoder_descs[decoder->type].major_type))) + { + IMFMediaType_Release(input_type); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(input_type, &MF_MT_SUBTYPE, decoder_descs[decoder->type].input_types[index]))) + { + IMFMediaType_Release(input_type); + return hr; + } + + *type = input_type; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + IMFMediaType *output_type; + HRESULT hr; + + TRACE("%p, %u, %u, %p\n", decoder, id, index, type); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (index >= decoder_descs[decoder->type].output_types_count) + return MF_E_NO_MORE_TYPES; + + if (FAILED(hr = MFCreateMediaType(&output_type))) + return hr; + + if (FAILED(hr = IMFMediaType_SetGUID(output_type, &MF_MT_MAJOR_TYPE, decoder_descs[decoder->type].major_type))) + { + IMFMediaType_Release(output_type); + return hr; + } + + if (FAILED(hr = IMFMediaType_SetGUID(output_type, &MF_MT_SUBTYPE, decoder_descs[decoder->type].output_types[index]))) + { + IMFMediaType_Release(output_type); + return hr; + } + + *type = output_type; + + return S_OK; +} + +static HRESULT WINAPI mf_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + struct wg_format input_format; + GUID major_type, subtype; + unsigned int i; + HRESULT hr; + + TRACE("%p, %u, %p, %#x.\n", decoder, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (decoder->input_type) + { + IMFMediaType_Release(decoder->input_type); + decoder->input_type = NULL; + } + + LeaveCriticalSection(&decoder->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!(IsEqualGUID(&major_type, decoder_descs[decoder->type].major_type))) + return MF_E_INVALIDTYPE; + + for (i = 0; i < decoder_descs[decoder->type].input_types_count; i++) + { + if (IsEqualGUID(&subtype, decoder_descs[decoder->type].input_types[i])) + break; + if (i == decoder_descs[decoder->type].input_types_count) + return MF_E_INVALIDTYPE; + } + + mf_media_type_to_wg_format(type, &input_format); + if (!input_format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + hr = S_OK; + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (!decoder->input_type) + hr = MFCreateMediaType(&decoder->input_type); + + if (SUCCEEDED(hr) && FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes*) decoder->input_type))) + { + IMFMediaType_Release(decoder->input_type); + decoder->input_type = NULL; + } + + if (decoder->input_type && decoder->output_type) + { + EnterCriticalSection(&decoder->help_cs); + while(decoder->help_request.type != HELP_REQ_NONE) + SleepConditionVariableCS(&decoder->help_cv, &decoder->help_cs, INFINITE); + decoder->help_request.type = HELP_REQ_START_PARSER; + LeaveCriticalSection(&decoder->help_cs); + WakeAllConditionVariable(&decoder->help_cv); + } + + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + struct wg_format output_format; + GUID major_type, subtype; + HRESULT hr; + unsigned int i; + + TRACE("%p, %u, %p, %#x.\n", decoder, id, type, flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (!type) + { + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (decoder->output_type) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + LeaveCriticalSection(&decoder->cs); + + return S_OK; + } + + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major_type))) + return MF_E_INVALIDTYPE; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return MF_E_INVALIDTYPE; + + if (!(IsEqualGUID(&major_type, decoder_descs[decoder->type].major_type))) + return MF_E_INVALIDTYPE; + + for (i = 0; i < decoder_descs[decoder->type].output_types_count; i++) + { + if (IsEqualGUID(&subtype, decoder_descs[decoder->type].output_types[i])) + break; + if (i == decoder_descs[decoder->type].output_types_count) + return MF_E_INVALIDTYPE; + } + + mf_media_type_to_wg_format(type, &output_format); + if (!output_format.major_type) + return MF_E_INVALIDTYPE; + + if (flags & MFT_SET_TYPE_TEST_ONLY) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + hr = S_OK; + + if (decoder->wg_stream) + { + decoder->wg_stream = NULL; + wg_parser_disconnect(decoder->wg_parser); + } + + if (!decoder->output_type) + hr = MFCreateMediaType(&decoder->output_type); + + if (SUCCEEDED(hr) && FAILED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes*) decoder->output_type))) + { + IMFMediaType_Release(decoder->output_type); + decoder->output_type = NULL; + } + + if (decoder->input_type && decoder->output_type) + { + EnterCriticalSection(&decoder->help_cs); + while(decoder->help_request.type != HELP_REQ_NONE) + SleepConditionVariableCS(&decoder->help_cv, &decoder->help_cs, INFINITE); + decoder->help_request.type = HELP_REQ_START_PARSER; + LeaveCriticalSection(&decoder->help_cs); + WakeAllConditionVariable(&decoder->help_cv); + } + + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +{ + FIXME("%p, %u, %p.\n", iface, id, type); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +{ + FIXME("%p, %u, %p\n", iface, id, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) +{ + FIXME("%p, %p.\n", iface, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +{ + FIXME("%p, %s, %s.\n", iface, wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mf_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +{ + FIXME("%p, %u, %p.\n", iface, id, event); + + return E_NOTIMPL; +} + +static DWORD CALLBACK helper_thread_func(PVOID ctx) +{ + struct mf_decoder *decoder = (struct mf_decoder *)ctx; + + for(;;) + { + EnterCriticalSection(&decoder->help_cs); + + while(!decoder->helper_thread_shutdown && decoder->help_request.type == HELP_REQ_NONE) + SleepConditionVariableCS(&decoder->help_cv, &decoder->help_cs, INFINITE); + if (decoder->helper_thread_shutdown) + { + LeaveCriticalSection(&decoder->help_cs); + return 0; + } + + switch(decoder->help_request.type) + { + case HELP_REQ_START_PARSER: + { + struct wg_format input_format, output_format; + struct wg_rect wg_aperture = {0}; + MFVideoArea *aperture = NULL; + UINT32 aperture_size; + + decoder->help_request.type = HELP_REQ_NONE; + LeaveCriticalSection(&decoder->help_cs); + + mf_media_type_to_wg_format(decoder->input_type, &input_format); + mf_media_type_to_wg_format(decoder->output_type, &output_format); + + if (SUCCEEDED(IMFMediaType_GetAllocatedBlob(decoder->output_type, + &MF_MT_MINIMUM_DISPLAY_APERTURE, (UINT8 **) &aperture, &aperture_size))) + { + TRACE("Decoded media's aperture: x: %u %u/65536, y: %u %u/65536, area: %u x %u\n", + aperture->OffsetX.value, aperture->OffsetX.fract, + aperture->OffsetY.value, aperture->OffsetY.fract, aperture->Area.cx, aperture->Area.cy); + + /* TODO: verify aperture params? */ + + wg_aperture.left = aperture->OffsetX.value; + wg_aperture.top = aperture->OffsetY.value; + wg_aperture.right = aperture->Area.cx; + wg_aperture.bottom = aperture->Area.cy; + + CoTaskMemFree(aperture); + } + + wg_parser_connect_unseekable(decoder->wg_parser, + &input_format, 1, &output_format, aperture ? &wg_aperture : NULL); + + EnterCriticalSection(&decoder->event_cs); + while (!decoder->helper_thread_shutdown && decoder->event.type != PIPELINE_EVENT_NONE) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + + if (decoder->helper_thread_shutdown) + { + LeaveCriticalSection(&decoder->event_cs); + return 0; + } + + decoder->event.type = PIPELINE_EVENT_PARSER_STARTED; + decoder->event.u.parser_started.stream = wg_parser_get_stream(decoder->wg_parser, 0); + + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + break; + } + default: + assert(0); + } + } +} + +/* We use a separate thread to wait for reads, as we may want to wait to WAIT_ANY + on a read and another event. */ +static DWORD CALLBACK read_thread_func(PVOID ctx) +{ + struct mf_decoder *decoder = (struct mf_decoder *)ctx; + uint64_t offset; + uint32_t size; + + for (;;) + { + if (decoder->helper_thread_shutdown) + break; + + if (!wg_parser_get_next_read_offset(decoder->wg_parser, &offset, &size)) + continue; + + EnterCriticalSection(&decoder->event_cs); + while (!decoder->helper_thread_shutdown && decoder->event.type != PIPELINE_EVENT_NONE) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + + if (decoder->helper_thread_shutdown) + { + LeaveCriticalSection(&decoder->event_cs); + break; + } + + decoder->event.type = PIPELINE_EVENT_READ_REQUEST; + WakeAllConditionVariable(&decoder->event_cv); + while (!decoder->helper_thread_shutdown && decoder->event.type == PIPELINE_EVENT_READ_REQUEST) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + LeaveCriticalSection(&decoder->event_cs); + } + + return 0; +} + +static struct pipeline_event get_pipeline_event(struct mf_decoder *decoder) +{ + struct pipeline_event ret; + + EnterCriticalSection(&decoder->event_cs); + while(decoder->event.type == PIPELINE_EVENT_NONE) + SleepConditionVariableCS(&decoder->event_cv, &decoder->event_cs, INFINITE); + + ret = decoder->event; + + if (ret.type != PIPELINE_EVENT_READ_REQUEST) + { + decoder->event.type = PIPELINE_EVENT_NONE; + WakeAllConditionVariable(&decoder->event_cv); + } + + LeaveCriticalSection(&decoder->event_cs); + + return ret; +} + +static HRESULT WINAPI mf_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + HRESULT hr; + + TRACE("%p, %x %lu.\n", decoder, message, param); + + EnterCriticalSection(&decoder->cs); + if (!decoder->input_type || !decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + hr = S_OK; + + switch (message) + { + case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: + case MFT_MESSAGE_NOTIFY_START_OF_STREAM: + break; + case MFT_MESSAGE_NOTIFY_END_OF_STREAM: + { + if (param) + { + hr = MF_E_INVALIDSTREAMNUMBER; + break; + } + if (!decoder->wg_stream) + { + ERR("End-Of-Stream marked on a decoder MFT which hasn't finished initialization\n"); + hr = E_FAIL; + break; + } + + decoder->eos = TRUE; + break; + } + case MFT_MESSAGE_COMMAND_DRAIN: + { + struct pipeline_event pip_event; + + if (!decoder->wg_stream) + { + ERR("Drain requested on a decoder MFT which hasn't finished initialization\n"); + hr = E_FAIL; + break; + } + + pip_event = get_pipeline_event(decoder); + assert(pip_event.type == PIPELINE_EVENT_READ_REQUEST); + + wg_parser_push_data(decoder->wg_parser, WG_READ_EOS, NULL, 0); + + EnterCriticalSection(&decoder->event_cs); + decoder->event.type = PIPELINE_EVENT_NONE; + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + decoder->draining = TRUE; + decoder->offset_tracker = 0; + break; + } + case MFT_MESSAGE_COMMAND_FLUSH: + { + struct pipeline_event pip_event; + + if (!decoder->wg_stream) + { + ERR("Flush requested on a decoder MFT which hasn't finished initialization\n"); + hr = E_FAIL; + break; + } + + pip_event = get_pipeline_event(decoder); + assert(pip_event.type == PIPELINE_EVENT_READ_REQUEST); + + wg_parser_push_data(decoder->wg_parser, WG_READ_FLUSHING, NULL, 0); + + EnterCriticalSection(&decoder->event_cs); + decoder->event.type = PIPELINE_EVENT_NONE; + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + decoder->offset_tracker = 0; + break; + } + default: + { + ERR("Unhandled message type %x.\n", message); + hr = E_FAIL; + break; + } + } + + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + struct pipeline_event pip_event; + IMFMediaBuffer *buffer = NULL; + HRESULT hr = S_OK; + BYTE *buffer_data; + DWORD buffer_size; + uint32_t size = 0; + uint64_t offset; + + TRACE("%p, %u, %p, %#x.\n", decoder, id, sample, flags); + + if (flags) + WARN("Unsupported flags %#x\n", flags); + + if (id != 0) + return MF_E_INVALIDSTREAMNUMBER; + + EnterCriticalSection(&decoder->cs); + + if (!decoder->input_type || !decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + if (decoder->draining) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_NOTACCEPTING; + } + + if (!decoder->wg_stream) + { + pip_event = get_pipeline_event(decoder); + + switch (pip_event.type) + { + case PIPELINE_EVENT_PARSER_STARTED: + decoder->wg_stream = pip_event.u.parser_started.stream; + break; + case PIPELINE_EVENT_READ_REQUEST: + break; + default: + assert(0); + } + } + + if (decoder->wg_stream && !wg_parser_stream_drain(decoder->wg_stream)) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_NOTACCEPTING; + } + + /* At this point, we either have a pre-init read request, or drained pipeline */ + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer))) + goto done; + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &buffer_data, NULL, &buffer_size))) + goto done; + + pip_event = get_pipeline_event(decoder); + assert(pip_event.type == PIPELINE_EVENT_READ_REQUEST); + + for(;;) + { + uint32_t copy_size; + + if (!wg_parser_get_next_read_offset(decoder->wg_parser, &offset, &size)) + continue; + + copy_size = min(size, buffer_size); + + if (offset != decoder->offset_tracker) + { + ERR("A seek is needed, MFTs don't support this!\n"); + wg_parser_push_data(decoder->wg_parser, WG_READ_FAILURE, NULL, 0); + IMFMediaBuffer_Unlock(buffer); + hr = E_FAIL; + goto done; + } + + wg_parser_push_data(decoder->wg_parser, WG_READ_SUCCESS, buffer_data, buffer_size); + + decoder->offset_tracker += copy_size; + + if (buffer_size <= size) + break; + + buffer_data += copy_size; + buffer_size -= copy_size; + + WARN("Input sample split into multiple read requests\n"); + } + + EnterCriticalSection(&decoder->event_cs); + decoder->event.type = PIPELINE_EVENT_NONE; + LeaveCriticalSection(&decoder->event_cs); + WakeAllConditionVariable(&decoder->event_cv); + + IMFMediaBuffer_Unlock(buffer); + + done: + if (buffer) + IMFMediaBuffer_Release(buffer); + LeaveCriticalSection(&decoder->cs); + return hr; +} + +static HRESULT WINAPI mf_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) +{ + struct mf_decoder *decoder = impl_mf_decoder_from_IMFTransform(iface); + MFT_OUTPUT_DATA_BUFFER *relevant_buffer = NULL; + struct wg_parser_buffer wg_buffer; + struct pipeline_event pip_event; + IMFMediaBuffer *buffer; + DWORD buffer_len; + unsigned int i; + BYTE *data; + HRESULT hr; + + TRACE("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); + + if (flags) + WARN("Unsupported flags %#x\n", flags); + + for (i = 0; i < count; i++) + { + MFT_OUTPUT_DATA_BUFFER *out_buffer = &samples[i]; + + if (out_buffer->dwStreamID != 0) + return MF_E_INVALIDSTREAMNUMBER; + + if (relevant_buffer) + return MF_E_INVALIDSTREAMNUMBER; + + relevant_buffer = out_buffer; + } + + if (!relevant_buffer) + return S_OK; + + EnterCriticalSection(&decoder->cs); + + if (!decoder->input_type || !decoder->output_type) + { + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_TYPE_NOT_SET; + } + + if (!decoder->wg_stream) + { + pip_event = get_pipeline_event(decoder); + + switch (pip_event.type) + { + case PIPELINE_EVENT_PARSER_STARTED: + decoder->wg_stream = pip_event.u.parser_started.stream; + break; + case PIPELINE_EVENT_READ_REQUEST: + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_NEED_MORE_INPUT; + default: + assert(0); + } + } + + if (wg_parser_stream_drain(decoder->wg_stream)) + { + /* this would be unexpected, as we should get the EOS-event when a drain command completes. */ + assert (!decoder->draining); + + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (!wg_parser_stream_get_buffer(decoder->wg_stream, &wg_buffer)) + { + if (!decoder->draining) + { + LeaveCriticalSection(&decoder->cs); + WARN("Received EOS event while not draining\n"); + return E_FAIL; + } + decoder->draining = FALSE; + LeaveCriticalSection(&decoder->cs); + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } + + if (relevant_buffer->pSample) + { + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(relevant_buffer->pSample, &buffer))) + { + ERR("Failed to get buffer from sample, hr %#x.\n", hr); + LeaveCriticalSection(&decoder->cs); + return hr; + } + } + else + { + if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer.size, &buffer))) + { + ERR("Failed to create buffer, hr %#x.\n", hr); + LeaveCriticalSection(&decoder->cs); + return hr; + } + + if (FAILED(hr = MFCreateSample(&relevant_buffer->pSample))) + { + ERR("Failed to create sample, hr %#x.\n", hr); + LeaveCriticalSection(&decoder->cs); + IMFMediaBuffer_Release(buffer); + return hr; + } + + if (FAILED(hr = IMFSample_AddBuffer(relevant_buffer->pSample, buffer))) + { + ERR("Failed to add buffer, hr %#x.\n", hr); + goto out; + } + } + + if (FAILED(hr = IMFMediaBuffer_GetMaxLength(buffer, &buffer_len))) + { + ERR("Failed to get buffer size, hr %#x.\n", hr); + goto out; + } + + if (buffer_len < wg_buffer.size) + { + WARN("Client's buffer is smaller (%u bytes) than the output sample (%u bytes)\n", + buffer_len, wg_buffer.size); + + if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, buffer_len))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto out; + } + } + else if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer.size))) + { + ERR("Failed to set size, hr %#x.\n", hr); + goto out; + } + + + if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL))) + { + ERR("Failed to lock buffer, hr %#x.\n", hr); + goto out; + } + + if (!wg_parser_stream_copy_buffer(decoder->wg_stream, data, 0, min(buffer_len, wg_buffer.size))) + { + hr = E_FAIL; + goto out; + } + + if (FAILED(hr = IMFMediaBuffer_Unlock(buffer))) + { + ERR("Failed to unlock buffer, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFSample_SetSampleTime(relevant_buffer->pSample, wg_buffer.pts))) + { + ERR("Failed to set sample time, hr %#x.\n", hr); + goto out; + } + + if (FAILED(hr = IMFSample_SetSampleDuration(relevant_buffer->pSample, wg_buffer.duration))) + { + ERR("Failed to set sample duration, hr %#x.\n", hr); + goto out; + } + + relevant_buffer->dwStatus = 0; + relevant_buffer->pEvents = NULL; + *status = 0; + + out: + if (SUCCEEDED(hr)) + wg_parser_stream_release_buffer(decoder->wg_stream); + LeaveCriticalSection(&decoder->cs); + + if (FAILED(hr)) + { + IMFSample_Release(relevant_buffer->pSample); + relevant_buffer->pSample = NULL; + } + + IMFMediaBuffer_Release(buffer); + + return hr; +} + +static const IMFTransformVtbl mf_decoder_vtbl = +{ + mf_decoder_QueryInterface, + mf_decoder_AddRef, + mf_decoder_Release, + mf_decoder_GetStreamLimits, + mf_decoder_GetStreamCount, + mf_decoder_GetStreamIDs, + mf_decoder_GetInputStreamInfo, + mf_decoder_GetOutputStreamInfo, + mf_decoder_GetAttributes, + mf_decoder_GetInputStreamAttributes, + mf_decoder_GetOutputStreamAttributes, + mf_decoder_DeleteInputStream, + mf_decoder_AddInputStreams, + mf_decoder_GetInputAvailableType, + mf_decoder_GetOutputAvailableType, + mf_decoder_SetInputType, + mf_decoder_SetOutputType, + mf_decoder_GetInputCurrentType, + mf_decoder_GetOutputCurrentType, + mf_decoder_GetInputStatus, + mf_decoder_GetOutputStatus, + mf_decoder_SetOutputBounds, + mf_decoder_ProcessEvent, + mf_decoder_ProcessMessage, + mf_decoder_ProcessInput, + mf_decoder_ProcessOutput, +}; + +HRESULT decode_transform_create(REFIID riid, void **obj, enum decoder_type type) +{ + struct mf_decoder *object; + struct wg_parser *parser; + + TRACE("%s, %p %u.\n", debugstr_guid(riid), obj, type); + + if (!(object = heap_alloc_zero(sizeof(*object)))) + return E_OUTOFMEMORY; + + object->IMFTransform_iface.lpVtbl = &mf_decoder_vtbl; + object->refcount = 1; + + object->type = type; + object->video = decoder_descs[type].major_type == &MFMediaType_Video; + + InitializeCriticalSection(&object->cs); + InitializeCriticalSection(&object->help_cs); + InitializeCriticalSection(&object->event_cs); + InitializeConditionVariable(&object->help_cv); + InitializeConditionVariable(&object->event_cv); + + if (!(parser = wg_parser_create(WG_PARSER_DECODEBIN, TRUE))) + { + ERR("Failed to create Decoder MFT type %u: Unspecified GStreamer error\n", type); + IMFTransform_Release(&object->IMFTransform_iface); + return E_OUTOFMEMORY; + } + object->wg_parser = parser; + + object->helper_thread = CreateThread(NULL, 0, helper_thread_func, object, 0, NULL); + object->read_thread = CreateThread(NULL, 0, read_thread_func, object, 0, NULL); + + *obj = &object->IMFTransform_iface; + return S_OK; +} diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index f5da807a2ab..c6b256b4fdd 100644 --- wine/dlls/winegstreamer/gst_private.h +++ wine/dlls/winegstreamer/gst_private.h @@ -39,7 +39,7 @@ #include "unixlib.h" -bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size); +bool array_reserve(void **elements, size_t *capacity, size_t count, size_t size) DECLSPEC_HIDDEN; static inline const char *debugstr_time(REFERENCE_TIME time) { @@ -64,67 +64,78 @@ static inline const char *debugstr_time(REFERENCE_TIME time) #define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000) -struct wg_parser *wg_parser_create(enum wg_parser_type type, bool unlimited_buffering); -void wg_parser_destroy(struct wg_parser *parser); +struct wg_parser *wg_parser_create(enum wg_parser_type type, bool unlimited_buffering) DECLSPEC_HIDDEN; +void wg_parser_destroy(struct wg_parser *parser) DECLSPEC_HIDDEN; -HRESULT wg_parser_connect(struct wg_parser *parser, uint64_t file_size); -void wg_parser_disconnect(struct wg_parser *parser); +HRESULT wg_parser_connect(struct wg_parser *parser, uint64_t file_size) DECLSPEC_HIDDEN; +HRESULT wg_parser_connect_unseekable(struct wg_parser *parser, const struct wg_format *in_format, + uint32_t stream_count, const struct wg_format *out_formats, const struct wg_rect *apertures) DECLSPEC_HIDDEN; +void wg_parser_disconnect(struct wg_parser *parser) DECLSPEC_HIDDEN; -bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, uint32_t *size); -void wg_parser_push_data(struct wg_parser *parser, const void *data, uint32_t size); +bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, uint32_t *size) DECLSPEC_HIDDEN; +void wg_parser_push_data(struct wg_parser *parser, enum wg_read_result result, const void *data, uint32_t size) DECLSPEC_HIDDEN; -uint32_t wg_parser_get_stream_count(struct wg_parser *parser); -struct wg_parser_stream *wg_parser_get_stream(struct wg_parser *parser, uint32_t index); +uint32_t wg_parser_get_stream_count(struct wg_parser *parser) DECLSPEC_HIDDEN; +struct wg_parser_stream *wg_parser_get_stream(struct wg_parser *parser, uint32_t index) DECLSPEC_HIDDEN; -void wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, struct wg_format *format); -void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format); -void wg_parser_stream_disable(struct wg_parser_stream *stream); +void wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, struct wg_format *format) DECLSPEC_HIDDEN; +void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format, const struct wg_rect *aperture, uint32_t flags) DECLSPEC_HIDDEN; +void wg_parser_stream_disable(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; -bool wg_parser_stream_get_buffer(struct wg_parser_stream *stream, struct wg_parser_buffer *buffer); +bool wg_parser_stream_get_buffer(struct wg_parser_stream *stream, struct wg_parser_buffer *buffer) DECLSPEC_HIDDEN; bool wg_parser_stream_copy_buffer(struct wg_parser_stream *stream, - void *data, uint32_t offset, uint32_t size); -void wg_parser_stream_release_buffer(struct wg_parser_stream *stream); + void *data, uint32_t offset, uint32_t size) DECLSPEC_HIDDEN; +void wg_parser_stream_release_buffer(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; void wg_parser_stream_notify_qos(struct wg_parser_stream *stream, - bool underflow, double proportion, int64_t diff, uint64_t timestamp); + bool underflow, double proportion, int64_t diff, uint64_t timestamp) DECLSPEC_HIDDEN; /* Returns the duration in 100-nanosecond units. */ -uint64_t wg_parser_stream_get_duration(struct wg_parser_stream *stream); +uint64_t wg_parser_stream_get_duration(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; +bool wg_parser_stream_get_language(struct wg_parser_stream *stream, char *buffer, uint32_t size) DECLSPEC_HIDDEN; /* start_pos and stop_pos are in 100-nanosecond units. */ void wg_parser_stream_seek(struct wg_parser_stream *stream, double rate, - uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags); + uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags) DECLSPEC_HIDDEN; +bool wg_parser_stream_drain(struct wg_parser_stream *stream) DECLSPEC_HIDDEN; -struct wg_transform *wg_transform_create(const struct wg_format *input_format, - const struct wg_format *output_format); -void wg_transform_destroy(struct wg_transform *transform); -HRESULT wg_transform_push_data(struct wg_transform *transform, struct wg_sample *sample); -HRESULT wg_transform_read_data(struct wg_transform *transform, struct wg_sample *sample); +struct wg_transform *wg_transform_create(const struct wg_encoded_format *input_format, + const struct wg_format *output_format) DECLSPEC_HIDDEN; +void wg_transform_destroy(struct wg_transform *transform) DECLSPEC_HIDDEN; +HRESULT wg_transform_push_data(struct wg_transform *transform, const void *data, uint32_t size) DECLSPEC_HIDDEN; +HRESULT wg_transform_read_data(struct wg_transform *transform, struct wg_sample *sample) DECLSPEC_HIDDEN; unsigned int wg_format_get_max_size(const struct wg_format *format); -HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out); -HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out); -HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out); -HRESULT wave_parser_create(IUnknown *outer, IUnknown **out); -HRESULT wma_decoder_create(IUnknown *outer, IUnknown **out); +HRESULT avi_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT mpeg_splitter_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT wave_parser_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; +HRESULT wma_decoder_create(IUnknown *outer, IUnknown **out) DECLSPEC_HIDDEN; bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool wm); bool amt_to_wg_format(const AM_MEDIA_TYPE *mt, struct wg_format *format); -BOOL init_gstreamer(void); +BOOL init_gstreamer(void) DECLSPEC_HIDDEN; -extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj); -extern HRESULT mfplat_DllRegisterServer(void); +extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN; +extern HRESULT mfplat_DllRegisterServer(void) DECLSPEC_HIDDEN; -IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format); -void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format); +IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) DECLSPEC_HIDDEN; +void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format) DECLSPEC_HIDDEN; +void mf_media_type_to_wg_encoded_format(IMFMediaType *type, struct wg_encoded_format *format) DECLSPEC_HIDDEN; -HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out); -void mf_destroy_wg_sample(struct wg_sample *wg_sample); +HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj) DECLSPEC_HIDDEN; -HRESULT winegstreamer_stream_handler_create(REFIID riid, void **obj); +HRESULT aac_decoder_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; +HRESULT h264_decoder_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; +HRESULT audio_converter_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; +HRESULT color_converter_create(REFIID riid, void **ret) DECLSPEC_HIDDEN; -HRESULT h264_decoder_create(REFIID riid, void **ret); -HRESULT audio_converter_create(REFIID riid, void **ret); +enum decoder_type +{ + DECODER_TYPE_H264, + DECODER_TYPE_AAC, +}; +HRESULT decode_transform_create(REFIID riid, void **obj, enum decoder_type) DECLSPEC_HIDDEN; struct wm_stream { diff --git a/dlls/winegstreamer/h264_decoder.c b/dlls/winegstreamer/h264_decoder.c index 8bfa15529db..f6a4d47188f 100644 --- wine/dlls/winegstreamer/h264_decoder.c +++ wine/dlls/winegstreamer/h264_decoder.c @@ -23,17 +23,18 @@ #include "mferror.h" #include "mfobjects.h" #include "mftransform.h" +#include "wmcodecdsp.h" #include "wine/debug.h" +#include "wine/heap.h" WINE_DEFAULT_DEBUG_CHANNEL(mfplat); -static const GUID *const h264_decoder_input_types[] = +static const GUID *h264_decoder_input_types[] = { &MFVideoFormat_H264, - &MFVideoFormat_H264_ES, }; -static const GUID *const h264_decoder_output_types[] = +static const GUID *h264_decoder_output_types[] = { &MFVideoFormat_NV12, &MFVideoFormat_YV12, @@ -50,6 +51,8 @@ struct h264_decoder IMFMediaType *output_type; struct wg_transform *wg_transform; + struct wg_format wg_format; + ULONGLONG last_pts; }; static struct h264_decoder *impl_from_IMFTransform(IMFTransform *iface) @@ -59,77 +62,88 @@ static struct h264_decoder *impl_from_IMFTransform(IMFTransform *iface) static HRESULT try_create_wg_transform(struct h264_decoder *decoder) { - struct wg_format input_format; + struct wg_encoded_format input_format; struct wg_format output_format; if (decoder->wg_transform) wg_transform_destroy(decoder->wg_transform); - decoder->wg_transform = NULL; - mf_media_type_to_wg_format(decoder->input_type, &input_format); - if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + mf_media_type_to_wg_encoded_format(decoder->input_type, &input_format); + if (input_format.encoded_type == WG_ENCODED_TYPE_UNKNOWN) return MF_E_INVALIDMEDIATYPE; mf_media_type_to_wg_format(decoder->output_type, &output_format); if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) return MF_E_INVALIDMEDIATYPE; - if (!(decoder->wg_transform = wg_transform_create(&input_format, &output_format))) - return E_FAIL; + decoder->last_pts = 0; + decoder->wg_transform = wg_transform_create(&input_format, &output_format); + if (decoder->wg_transform) + return S_OK; - return S_OK; + WARN("Failed to create H264 wg_transform.\n"); + return E_FAIL; } static HRESULT fill_output_media_type(IMFMediaType *media_type, IMFMediaType *default_type) { UINT32 value, width, height; - UINT64 ratio; + MFVideoArea aperture = {0}; + UINT64 value64; GUID subtype; HRESULT hr; if (FAILED(hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &subtype))) return hr; - if (FAILED(hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &ratio))) + if (FAILED(hr = IMFMediaType_GetUINT64(media_type, &MF_MT_FRAME_SIZE, &value64))) { - if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_FRAME_SIZE, &ratio))) - ratio = (UINT64)1920 << 32 | 1080; - if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, ratio))) + if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_FRAME_SIZE, &value64))) + value64 = (UINT64)1920 << 32 | 1080; + if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, value64))) return hr; } - width = ratio >> 32; - height = ratio; + width = value64 >> 32; + height = value64; if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_FRAME_RATE, NULL))) { - if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_FRAME_RATE, &ratio))) - ratio = (UINT64)30000 << 32 | 1001; - if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_RATE, ratio))) + if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_FRAME_RATE, &value64))) + value64 = (UINT64)30000 << 32 | 1001; + if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_RATE, value64))) return hr; } if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_PIXEL_ASPECT_RATIO, NULL))) { - if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_PIXEL_ASPECT_RATIO, &ratio))) - ratio = (UINT64)1 << 32 | 1; - if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, ratio))) + if (!default_type || FAILED(hr = IMFMediaType_GetUINT64(default_type, &MF_MT_PIXEL_ASPECT_RATIO, &value64))) + value64 = (UINT64)1 << 32 | 1; + if (FAILED(hr = IMFMediaType_SetUINT64(media_type, &MF_MT_PIXEL_ASPECT_RATIO, value64))) return hr; } if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_SAMPLE_SIZE, NULL))) { - if ((!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_SAMPLE_SIZE, &value))) && - FAILED(hr = MFCalculateImageSize(&subtype, width, height, &value))) - return hr; + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_SAMPLE_SIZE, &value))) + { + if (IsEqualGUID(&subtype, &MFVideoFormat_YUY2)) + value = width * height * 2; + else + value = width * height * 3 / 2; + } if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_SAMPLE_SIZE, value))) return hr; } if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_DEFAULT_STRIDE, NULL))) { - if ((!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_DEFAULT_STRIDE, &value))) && - FAILED(hr = MFGetStrideForBitmapInfoHeader(subtype.Data1, width, (LONG *)&value))) - return hr; + if (!default_type || FAILED(hr = IMFMediaType_GetUINT32(default_type, &MF_MT_DEFAULT_STRIDE, &value))) + { + if (IsEqualGUID(&subtype, &MFVideoFormat_YUY2)) + value = width * 2; + else + value = width; + } if (FAILED(hr = IMFMediaType_SetUINT32(media_type, &MF_MT_DEFAULT_STRIDE, value))) return hr; } @@ -166,17 +180,27 @@ static HRESULT fill_output_media_type(IMFMediaType *media_type, IMFMediaType *de return hr; } + if (FAILED(hr = IMFMediaType_GetItem(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, NULL))) + { + if (default_type && SUCCEEDED(hr = IMFMediaType_GetBlob(default_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, + (BYTE *)&aperture, sizeof(aperture), NULL))) + { + if (FAILED(hr = IMFMediaType_SetBlob(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, + (BYTE *)&aperture, sizeof(aperture)))) + return hr; + } + } + return S_OK; } -static HRESULT WINAPI transform_QueryInterface(IMFTransform *iface, REFIID iid, void **out) +static HRESULT WINAPI h264_decoder_QueryInterface(IMFTransform *iface, REFIID iid, void **out) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); - if (IsEqualGUID(iid, &IID_IUnknown) || - IsEqualGUID(iid, &IID_IMFTransform)) + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IMFTransform)) *out = &decoder->IMFTransform_iface; else { @@ -189,22 +213,22 @@ static HRESULT WINAPI transform_QueryInterface(IMFTransform *iface, REFIID iid, return S_OK; } -static ULONG WINAPI transform_AddRef(IMFTransform *iface) +static ULONG WINAPI h264_decoder_AddRef(IMFTransform *iface) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); ULONG refcount = InterlockedIncrement(&decoder->refcount); - TRACE("iface %p increasing refcount to %lu.\n", decoder, refcount); + TRACE("iface %p increasing refcount to %u.\n", decoder, refcount); return refcount; } -static ULONG WINAPI transform_Release(IMFTransform *iface) +static ULONG WINAPI h264_decoder_Release(IMFTransform *iface) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); ULONG refcount = InterlockedDecrement(&decoder->refcount); - TRACE("iface %p decreasing refcount to %lu.\n", decoder, refcount); + TRACE("iface %p decreasing refcount to %u.\n", decoder, refcount); if (!refcount) { @@ -220,33 +244,33 @@ static ULONG WINAPI transform_Release(IMFTransform *iface) return refcount; } -static HRESULT WINAPI transform_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, - DWORD *input_maximum, DWORD *output_minimum, DWORD *output_maximum) +static HRESULT WINAPI h264_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, + DWORD *output_minimum, DWORD *output_maximum) { FIXME("iface %p, input_minimum %p, input_maximum %p, output_minimum %p, output_maximum %p stub!\n", iface, input_minimum, input_maximum, output_minimum, output_maximum); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +static HRESULT WINAPI h264_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) { FIXME("iface %p, inputs %p, outputs %p stub!\n", iface, inputs, outputs); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetStreamIDs(IMFTransform *iface, DWORD input_size, - DWORD *inputs, DWORD output_size, DWORD *outputs) +static HRESULT WINAPI h264_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, + DWORD output_size, DWORD *outputs) { - FIXME("iface %p, input_size %lu, inputs %p, output_size %lu, outputs %p stub!\n", iface, - input_size, inputs, output_size, outputs); + FIXME("iface %p, input_size %u, inputs %p, output_size %u, outputs %p stub!\n", + iface, input_size, inputs, output_size, outputs); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +static HRESULT WINAPI h264_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); - TRACE("iface %p, id %#lx, info %p.\n", iface, id, info); + TRACE("iface %p, id %u, info %p.\n", iface, id, info); if (!decoder->input_type) return MF_E_TRANSFORM_TYPE_NOT_SET; @@ -260,70 +284,68 @@ static HRESULT WINAPI transform_GetInputStreamInfo(IMFTransform *iface, DWORD id return S_OK; } -static HRESULT WINAPI transform_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +static HRESULT WINAPI h264_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); - UINT32 sample_size; - UINT64 frame_size; + IMFMediaType *media_type; + HRESULT hr; - TRACE("iface %p, id %#lx, info %p.\n", iface, id, info); + TRACE("iface %p, id %u, info %p.\n", iface, id, info); - if (!decoder->output_type) - sample_size = 1920 * 1088 * 2; - else if (FAILED(IMFMediaType_GetUINT32(decoder->output_type, &MF_MT_SAMPLE_SIZE, &sample_size))) - { - if (FAILED(IMFMediaType_GetUINT64(decoder->output_type, &MF_MT_FRAME_SIZE, &frame_size))) - sample_size = 1920 * 1088 * 2; - else - sample_size = (frame_size >> 32) * (UINT32)frame_size * 2; - } + if (!decoder->input_type || !decoder->output_type) + return MF_E_TRANSFORM_TYPE_NOT_SET; + + media_type = decoder->output_type; info->dwFlags = MFT_OUTPUT_STREAM_WHOLE_SAMPLES | MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER | MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE; - info->cbSize = sample_size; + if (FAILED(hr = IMFMediaType_GetUINT32(media_type, &MF_MT_SAMPLE_SIZE, &info->cbSize))) + info->cbSize = 1920 * 1080 * 2; info->cbAlignment = 0; return S_OK; } -static HRESULT WINAPI transform_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +static HRESULT WINAPI h264_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) { FIXME("iface %p, attributes %p stub!\n", iface, attributes); + return MFCreateAttributes(attributes, 0); } -static HRESULT WINAPI transform_GetInputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) +static HRESULT WINAPI h264_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, + IMFAttributes **attributes) { - FIXME("iface %p, id %#lx, attributes %p stub!\n", iface, id, attributes); + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, +static HRESULT WINAPI h264_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) { - FIXME("iface %p, id %#lx, attributes %p stub!\n", iface, id, attributes); + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); return E_NOTIMPL; } -static HRESULT WINAPI transform_DeleteInputStream(IMFTransform *iface, DWORD id) +static HRESULT WINAPI h264_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) { - FIXME("iface %p, id %#lx stub!\n", iface, id); + FIXME("iface %p, id %u stub!\n", iface, id); return E_NOTIMPL; } -static HRESULT WINAPI transform_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +static HRESULT WINAPI h264_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) { - FIXME("iface %p, streams %lu, ids %p stub!\n", iface, streams, ids); + FIXME("iface %p, streams %u, ids %p stub!\n", iface, streams, ids); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, +static HRESULT WINAPI h264_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, IMFMediaType **type) { IMFMediaType *media_type; const GUID *subtype; HRESULT hr; - TRACE("iface %p, id %#lx, index %#lx, type %p.\n", iface, id, index, type); + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); *type = NULL; @@ -342,15 +364,15 @@ static HRESULT WINAPI transform_GetInputAvailableType(IMFTransform *iface, DWORD return hr; } -static HRESULT WINAPI transform_GetOutputAvailableType(IMFTransform *iface, DWORD id, - DWORD index, IMFMediaType **type) +static HRESULT WINAPI h264_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, + IMFMediaType **type) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); IMFMediaType *media_type; const GUID *output_type; HRESULT hr; - TRACE("iface %p, id %#lx, index %#lx, type %p.\n", iface, id, index, type); + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); if (!decoder->input_type) return MF_E_TRANSFORM_TYPE_NOT_SET; @@ -369,7 +391,7 @@ static HRESULT WINAPI transform_GetOutputAvailableType(IMFTransform *iface, DWOR if (FAILED(hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, output_type))) goto done; - hr = fill_output_media_type(media_type, NULL); + hr = fill_output_media_type(media_type, decoder->output_type); done: if (SUCCEEDED(hr)) @@ -379,14 +401,14 @@ done: return hr; } -static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +static HRESULT WINAPI h264_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); GUID major, subtype; HRESULT hr; ULONG i; - TRACE("iface %p, id %#lx, type %p, flags %#lx.\n", iface, id, type, flags); + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) @@ -414,14 +436,15 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM return S_OK; } -static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +static HRESULT WINAPI h264_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); GUID major, subtype; + BOOL identical; HRESULT hr; ULONG i; - TRACE("iface %p, id %#lx, type %p, flags %#lx.\n", iface, id, type, flags); + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); if (!decoder->input_type) return MF_E_TRANSFORM_TYPE_NOT_SET; @@ -440,7 +463,13 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF return MF_E_INVALIDMEDIATYPE; if (decoder->output_type) + { + if (SUCCEEDED(hr = IMFMediaType_Compare(decoder->output_type, (IMFAttributes *)type, + MF_ATTRIBUTES_MATCH_THEIR_ITEMS, &identical)) && identical) + return S_OK; IMFMediaType_Release(decoder->output_type); + } + IMFMediaType_AddRef((decoder->output_type = type)); if (FAILED(hr = try_create_wg_transform(decoder))) @@ -452,56 +481,71 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF return hr; } -static HRESULT WINAPI transform_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +static HRESULT WINAPI h264_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) { - FIXME("iface %p, id %#lx, type %p stub!\n", iface, id, type); + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +static HRESULT WINAPI h264_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) { - FIXME("iface %p, id %#lx, type %p stub!\n", iface, id, type); + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +static HRESULT WINAPI h264_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) { - FIXME("iface %p, id %#lx, flags %p stub!\n", iface, id, flags); + FIXME("iface %p, id %u, flags %p stub!\n", iface, id, flags); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetOutputStatus(IMFTransform *iface, DWORD *flags) +static HRESULT WINAPI h264_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) { FIXME("iface %p, flags %p stub!\n", iface, flags); return E_NOTIMPL; } -static HRESULT WINAPI transform_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +static HRESULT WINAPI h264_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) { - FIXME("iface %p, lower %I64d, upper %I64d stub!\n", iface, lower, upper); + FIXME("iface %p, lower %s, upper %s stub!\n", iface, + wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); return E_NOTIMPL; } -static HRESULT WINAPI transform_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +static HRESULT WINAPI h264_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) { - FIXME("iface %p, id %#lx, event %p stub!\n", iface, id, event); + FIXME("iface %p, id %u, event %p stub!\n", iface, id, event); return E_NOTIMPL; } -static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +static HRESULT WINAPI h264_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) { - FIXME("iface %p, message %#x, param %Ix stub!\n", iface, message, param); + struct h264_decoder *decoder = impl_from_IMFTransform(iface); + + FIXME("iface %p, message %#x, param %p stub!\n", iface, message, (void *)param); + + switch (message) + { + case MFT_MESSAGE_NOTIFY_BEGIN_STREAMING: + memset(&decoder->wg_format, 0, sizeof(decoder->wg_format)); + break; + default: + break; + } + return S_OK; } -static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +static HRESULT WINAPI h264_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); - struct wg_sample *wg_sample; + IMFMediaBuffer *media_buffer; MFT_INPUT_STREAM_INFO info; + UINT32 buffer_size; + BYTE *buffer; HRESULT hr; - TRACE("iface %p, id %#lx, sample %p, flags %#lx.\n", iface, id, sample, flags); + TRACE("iface %p, id %u, sample %p, flags %#x.\n", iface, id, sample, flags); if (FAILED(hr = IMFTransform_GetInputStreamInfo(iface, 0, &info))) return hr; @@ -509,27 +553,41 @@ static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFS if (!decoder->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET; - if (FAILED(hr = mf_create_wg_sample(sample, &wg_sample))) + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer))) return hr; - hr = wg_transform_push_data(decoder->wg_transform, wg_sample); + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &buffer_size))) + goto done; + + hr = wg_transform_push_data(decoder->wg_transform, buffer, buffer_size); - mf_destroy_wg_sample(wg_sample); + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_Release(media_buffer); return hr; } -static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, +static HRESULT WINAPI h264_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) { struct h264_decoder *decoder = impl_from_IMFTransform(iface); + struct wg_sample wg_sample = {0}; + IMFMediaBuffer *media_buffer; MFT_OUTPUT_STREAM_INFO info; - struct wg_sample *wg_sample; + MFVideoArea aperture = {0}; + IMFMediaType *media_type; + UINT32 align, offset; + UINT64 framerate; HRESULT hr; - TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); + TRACE("iface %p, flags %#x, count %u, samples %p, status %p.\n", iface, flags, count, samples, status); - if (count != 1) - return E_INVALIDARG; + if (count > 1) + { + FIXME("Not implemented count %u\n", count); + return E_NOTIMPL; + } if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) return hr; @@ -539,48 +597,116 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, *status = 0; samples[0].dwStatus = 0; - if (!samples[0].pSample) return E_INVALIDARG; + if (!samples[0].pSample) + { + samples[0].dwStatus = MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE; + return MF_E_TRANSFORM_NEED_MORE_INPUT; + } - if (FAILED(hr = mf_create_wg_sample(samples[0].pSample, &wg_sample))) + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &media_buffer))) return hr; - if (wg_sample->max_size < info.cbSize) + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &wg_sample.data, &wg_sample.size, NULL))) + goto done; + + wg_sample.format = &decoder->wg_format; + if (wg_sample.size < info.cbSize) hr = MF_E_BUFFERTOOSMALL; - else - hr = wg_transform_read_data(decoder->wg_transform, wg_sample); + else if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, &wg_sample))) + { + if (!(wg_sample.flags & (WG_SAMPLE_FLAG_HAS_PTS|WG_SAMPLE_FLAG_HAS_DURATION))) + { + IMFMediaType_GetUINT64(decoder->output_type, &MF_MT_FRAME_RATE, &framerate); + wg_sample.pts = decoder->last_pts; + wg_sample.duration = (UINT64)10000000 * (UINT32)framerate / (framerate >> 32); + wg_sample.flags |= (WG_SAMPLE_FLAG_HAS_PTS|WG_SAMPLE_FLAG_HAS_DURATION); + decoder->last_pts += wg_sample.duration; + } + + if (wg_sample.flags & WG_SAMPLE_FLAG_HAS_PTS) + IMFSample_SetSampleTime(samples[0].pSample, wg_sample.pts); + if (wg_sample.flags & WG_SAMPLE_FLAG_HAS_DURATION) + IMFSample_SetSampleDuration(samples[0].pSample, wg_sample.duration); + + if (decoder->wg_format.u.video.format == WG_VIDEO_FORMAT_NV12 && + (align = decoder->wg_format.u.video.height & 15)) + { + offset = decoder->wg_format.u.video.width * decoder->wg_format.u.video.height; + align = (16 - align) * decoder->wg_format.u.video.width; + memmove(wg_sample.data + offset + align, wg_sample.data + offset, + wg_sample.size - offset); + wg_sample.size += align; + } + + hr = IMFMediaBuffer_SetCurrentLength(media_buffer, wg_sample.size); + } + else if (hr == MF_E_TRANSFORM_STREAM_CHANGE) + { + media_type = mf_media_type_from_wg_format(&decoder->wg_format); + IMFMediaType_SetUINT32(media_type, &MF_MT_SAMPLE_SIZE, wg_sample.size); + IMFMediaType_DeleteItem(media_type, &MF_MT_FRAME_RATE); + IMFMediaType_DeleteItem(decoder->output_type, &MF_MT_DEFAULT_STRIDE); + fill_output_media_type(media_type, decoder->output_type); + + if (decoder->wg_format.u.video.format == WG_VIDEO_FORMAT_NV12 && + (align = decoder->wg_format.u.video.height & 15)) + { + aperture.Area.cx = decoder->wg_format.u.video.width; + aperture.Area.cy = decoder->wg_format.u.video.height; + IMFMediaType_SetBlob(media_type, &MF_MT_MINIMUM_DISPLAY_APERTURE, + (BYTE *)&aperture, sizeof(aperture)); + + aperture.Area.cy += 16 - align; + IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, + (UINT64)aperture.Area.cx << 32 | aperture.Area.cy); + IMFMediaType_SetUINT32(media_type, &MF_MT_SAMPLE_SIZE, + aperture.Area.cx * aperture.Area.cy * 3 / 2); + } - mf_destroy_wg_sample(wg_sample); + IMFMediaType_Release(decoder->output_type); + decoder->output_type = media_type; + + samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE; + *status |= MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE; + } + + IMFMediaBuffer_Unlock(media_buffer); + +done: + if (FAILED(hr)) + IMFMediaBuffer_SetCurrentLength(media_buffer, 0); + IMFMediaBuffer_Release(media_buffer); return hr; } -static const IMFTransformVtbl transform_vtbl = -{ - transform_QueryInterface, - transform_AddRef, - transform_Release, - transform_GetStreamLimits, - transform_GetStreamCount, - transform_GetStreamIDs, - transform_GetInputStreamInfo, - transform_GetOutputStreamInfo, - transform_GetAttributes, - transform_GetInputStreamAttributes, - transform_GetOutputStreamAttributes, - transform_DeleteInputStream, - transform_AddInputStreams, - transform_GetInputAvailableType, - transform_GetOutputAvailableType, - transform_SetInputType, - transform_SetOutputType, - transform_GetInputCurrentType, - transform_GetOutputCurrentType, - transform_GetInputStatus, - transform_GetOutputStatus, - transform_SetOutputBounds, - transform_ProcessEvent, - transform_ProcessMessage, - transform_ProcessInput, - transform_ProcessOutput, +static const IMFTransformVtbl h264_decoder_vtbl = +{ + h264_decoder_QueryInterface, + h264_decoder_AddRef, + h264_decoder_Release, + h264_decoder_GetStreamLimits, + h264_decoder_GetStreamCount, + h264_decoder_GetStreamIDs, + h264_decoder_GetInputStreamInfo, + h264_decoder_GetOutputStreamInfo, + h264_decoder_GetAttributes, + h264_decoder_GetInputStreamAttributes, + h264_decoder_GetOutputStreamAttributes, + h264_decoder_DeleteInputStream, + h264_decoder_AddInputStreams, + h264_decoder_GetInputAvailableType, + h264_decoder_GetOutputAvailableType, + h264_decoder_SetInputType, + h264_decoder_SetOutputType, + h264_decoder_GetInputCurrentType, + h264_decoder_GetOutputCurrentType, + h264_decoder_GetInputStatus, + h264_decoder_GetOutputStatus, + h264_decoder_SetOutputBounds, + h264_decoder_ProcessEvent, + h264_decoder_ProcessMessage, + h264_decoder_ProcessInput, + h264_decoder_ProcessOutput, }; HRESULT h264_decoder_create(REFIID riid, void **ret) @@ -592,7 +718,7 @@ HRESULT h264_decoder_create(REFIID riid, void **ret) if (!(decoder = calloc(1, sizeof(*decoder)))) return E_OUTOFMEMORY; - decoder->IMFTransform_iface.lpVtbl = &transform_vtbl; + decoder->IMFTransform_iface.lpVtbl = &h264_decoder_vtbl; decoder->refcount = 1; *ret = &decoder->IMFTransform_iface; diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index d88a462d81e..219fde82dc6 100644 --- wine/dlls/winegstreamer/main.c +++ wine/dlls/winegstreamer/main.c @@ -25,9 +25,7 @@ #include "gst_private.h" #include "winternl.h" #include "rpcproxy.h" -#include "dmoreg.h" #include "gst_guids.h" -#include "wmcodecdsp.h" static unixlib_handle_t unix_handle; @@ -70,20 +68,13 @@ struct wg_parser *wg_parser_create(enum wg_parser_type type, bool unlimited_buff .unlimited_buffering = unlimited_buffering, }; - TRACE("type %#x, unlimited_buffering %d.\n", type, unlimited_buffering); - if (__wine_unix_call(unix_handle, unix_wg_parser_create, ¶ms)) return NULL; - - TRACE("Returning parser %p.\n", params.parser); - return params.parser; } void wg_parser_destroy(struct wg_parser *parser) { - TRACE("parser %p.\n", parser); - __wine_unix_call(unix_handle, unix_wg_parser_destroy, parser); } @@ -95,15 +86,26 @@ HRESULT wg_parser_connect(struct wg_parser *parser, uint64_t file_size) .file_size = file_size, }; - TRACE("parser %p, file_size %I64u.\n", parser, file_size); - return __wine_unix_call(unix_handle, unix_wg_parser_connect, ¶ms); } -void wg_parser_disconnect(struct wg_parser *parser) +HRESULT wg_parser_connect_unseekable(struct wg_parser *parser, const struct wg_format *in_format, + uint32_t stream_count, const struct wg_format *out_formats, const struct wg_rect *apertures) { - TRACE("parser %p.\n", parser); + struct wg_parser_connect_unseekable_params params = + { + .parser = parser, + .in_format = in_format, + .stream_count = stream_count, + .out_formats = out_formats, + .apertures = apertures, + }; + + return __wine_unix_call(unix_handle, unix_wg_parser_connect_unseekable, ¶ms); +} +void wg_parser_disconnect(struct wg_parser *parser) +{ __wine_unix_call(unix_handle, unix_wg_parser_disconnect, parser); } @@ -114,8 +116,6 @@ bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, .parser = parser, }; - TRACE("parser %p, offset %p, size %p.\n", parser, offset, size); - if (__wine_unix_call(unix_handle, unix_wg_parser_get_next_read_offset, ¶ms)) return false; *offset = params.offset; @@ -123,17 +123,16 @@ bool wg_parser_get_next_read_offset(struct wg_parser *parser, uint64_t *offset, return true; } -void wg_parser_push_data(struct wg_parser *parser, const void *data, uint32_t size) +void wg_parser_push_data(struct wg_parser *parser, enum wg_read_result result, const void *data, uint32_t size) { struct wg_parser_push_data_params params = { .parser = parser, + .result = result, .data = data, .size = size, }; - TRACE("parser %p, data %p, size %u.\n", parser, data, size); - __wine_unix_call(unix_handle, unix_wg_parser_push_data, ¶ms); } @@ -144,8 +143,6 @@ uint32_t wg_parser_get_stream_count(struct wg_parser *parser) .parser = parser, }; - TRACE("parser %p.\n", parser); - __wine_unix_call(unix_handle, unix_wg_parser_get_stream_count, ¶ms); return params.count; } @@ -158,11 +155,7 @@ struct wg_parser_stream *wg_parser_get_stream(struct wg_parser *parser, uint32_t .index = index, }; - TRACE("parser %p, index %u.\n", parser, index); - __wine_unix_call(unix_handle, unix_wg_parser_get_stream, ¶ms); - - TRACE("Returning stream %p.\n", params.stream); return params.stream; } @@ -174,28 +167,24 @@ void wg_parser_stream_get_preferred_format(struct wg_parser_stream *stream, stru .format = format, }; - TRACE("stream %p, format %p.\n", stream, format); - __wine_unix_call(unix_handle, unix_wg_parser_stream_get_preferred_format, ¶ms); } -void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format) +void wg_parser_stream_enable(struct wg_parser_stream *stream, const struct wg_format *format, const struct wg_rect *aperture, uint32_t flags) { struct wg_parser_stream_enable_params params = { .stream = stream, .format = format, + .aperture = aperture, + .flags = flags, }; - TRACE("stream %p, format %p.\n", stream, format); - __wine_unix_call(unix_handle, unix_wg_parser_stream_enable, ¶ms); } void wg_parser_stream_disable(struct wg_parser_stream *stream) { - TRACE("stream %p.\n", stream); - __wine_unix_call(unix_handle, unix_wg_parser_stream_disable, stream); } @@ -207,8 +196,6 @@ bool wg_parser_stream_get_buffer(struct wg_parser_stream *stream, struct wg_pars .buffer = buffer, }; - TRACE("stream %p, buffer %p.\n", stream, buffer); - return !__wine_unix_call(unix_handle, unix_wg_parser_stream_get_buffer, ¶ms); } @@ -223,15 +210,11 @@ bool wg_parser_stream_copy_buffer(struct wg_parser_stream *stream, .size = size, }; - TRACE("stream %p, data %p, offset %u, size %u.\n", stream, data, offset, size); - return !__wine_unix_call(unix_handle, unix_wg_parser_stream_copy_buffer, ¶ms); } void wg_parser_stream_release_buffer(struct wg_parser_stream *stream) { - TRACE("stream %p.\n", stream); - __wine_unix_call(unix_handle, unix_wg_parser_stream_release_buffer, stream); } @@ -247,9 +230,6 @@ void wg_parser_stream_notify_qos(struct wg_parser_stream *stream, .timestamp = timestamp, }; - TRACE("stream %p, underflow %d, proportion %.16e, diff %I64d, timestamp %I64u.\n", - stream, underflow, proportion, diff, timestamp); - __wine_unix_call(unix_handle, unix_wg_parser_stream_notify_qos, ¶ms); } @@ -260,14 +240,22 @@ uint64_t wg_parser_stream_get_duration(struct wg_parser_stream *stream) .stream = stream, }; - TRACE("stream %p.\n", stream); - __wine_unix_call(unix_handle, unix_wg_parser_stream_get_duration, ¶ms); - - TRACE("Returning duration %I64u.\n", params.duration); return params.duration; } +bool wg_parser_stream_get_language(struct wg_parser_stream *stream, char *buffer, uint32_t size) +{ + struct wg_parser_stream_get_language_params params = + { + .stream = stream, + .buffer = buffer, + .size = size, + }; + + return !__wine_unix_call(unix_handle, unix_wg_parser_stream_get_language, ¶ms); +} + void wg_parser_stream_seek(struct wg_parser_stream *stream, double rate, uint64_t start_pos, uint64_t stop_pos, DWORD start_flags, DWORD stop_flags) { @@ -281,13 +269,15 @@ void wg_parser_stream_seek(struct wg_parser_stream *stream, double rate, .stop_flags = stop_flags, }; - TRACE("stream %p, rate %.16e, start_pos %I64u, stop_pos %I64u, start_flags %#lx, stop_flags %#lx.\n", - stream, rate, start_pos, stop_pos, start_flags, stop_flags); - __wine_unix_call(unix_handle, unix_wg_parser_stream_seek, ¶ms); } -struct wg_transform *wg_transform_create(const struct wg_format *input_format, +bool wg_parser_stream_drain(struct wg_parser_stream *stream) +{ + return !__wine_unix_call(unix_handle, unix_wg_parser_stream_drain, stream); +} + +struct wg_transform *wg_transform_create(const struct wg_encoded_format *input_format, const struct wg_format *output_format) { struct wg_transform_create_params params = @@ -296,37 +286,26 @@ struct wg_transform *wg_transform_create(const struct wg_format *input_format, .output_format = output_format, }; - TRACE("input_format %p, output_format %p.\n", input_format, output_format); - if (__wine_unix_call(unix_handle, unix_wg_transform_create, ¶ms)) return NULL; - - TRACE("Returning transform %p.\n", params.transform); return params.transform; } void wg_transform_destroy(struct wg_transform *transform) { - TRACE("transform %p.\n", transform); - __wine_unix_call(unix_handle, unix_wg_transform_destroy, transform); } -HRESULT wg_transform_push_data(struct wg_transform *transform, struct wg_sample *sample) +HRESULT wg_transform_push_data(struct wg_transform *transform, const void *data, uint32_t size) { struct wg_transform_push_data_params params = { .transform = transform, - .sample = sample, + .data = data, + .size = size, }; - NTSTATUS status; - - TRACE("transform %p, sample %p.\n", transform, sample); - - if ((status = __wine_unix_call(unix_handle, unix_wg_transform_push_data, ¶ms))) - return HRESULT_FROM_NT(status); - return params.result; + return __wine_unix_call(unix_handle, unix_wg_transform_push_data, ¶ms); } HRESULT wg_transform_read_data(struct wg_transform *transform, struct wg_sample *sample) @@ -336,14 +315,8 @@ HRESULT wg_transform_read_data(struct wg_transform *transform, struct wg_sample .transform = transform, .sample = sample, }; - NTSTATUS status; - TRACE("transform %p, sample %p.\n", transform, sample); - - if ((status = __wine_unix_call(unix_handle, unix_wg_transform_read_data, ¶ms))) - return HRESULT_FROM_NT(status); - - return params.result; + return __wine_unix_call(unix_handle, unix_wg_transform_read_data, ¶ms); } BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved) @@ -619,24 +592,16 @@ static const REGFILTER2 reg_decodebin_parser = HRESULT WINAPI DllRegisterServer(void) { - DMO_PARTIAL_MEDIATYPE wma_decoder_output[2] = - { - {.type = MEDIATYPE_Audio, .subtype = MEDIASUBTYPE_PCM}, - {.type = MEDIATYPE_Audio, .subtype = MEDIASUBTYPE_IEEE_FLOAT}, - }; - DMO_PARTIAL_MEDIATYPE wma_decoder_input[4] = - { - {.type = MEDIATYPE_Audio, .subtype = MEDIASUBTYPE_MSAUDIO1}, - {.type = MEDIATYPE_Audio, .subtype = MEDIASUBTYPE_WMAUDIO2}, - {.type = MEDIATYPE_Audio, .subtype = MEDIASUBTYPE_WMAUDIO3}, - {.type = MEDIATYPE_Audio, .subtype = MEDIASUBTYPE_WMAUDIO_LOSSLESS}, - }; - IFilterMapper2 *mapper; HRESULT hr; TRACE(".\n"); + init_gstreamer(); + + if (FAILED(hr = mfplat_DllRegisterServer())) + return hr; + if (FAILED(hr = __wine_register_resources())) return hr; @@ -653,10 +618,6 @@ HRESULT WINAPI DllRegisterServer(void) IFilterMapper2_Release(mapper); - if (FAILED(hr = DMORegister(L"WMA Decoder DMO", &CLSID_WMADecMediaObject, &DMOCATEGORY_AUDIO_DECODER, - 0, ARRAY_SIZE(wma_decoder_input), wma_decoder_input, ARRAY_SIZE(wma_decoder_output), wma_decoder_output))) - return hr; - return mfplat_DllRegisterServer(); } @@ -680,9 +641,5 @@ HRESULT WINAPI DllUnregisterServer(void) IFilterMapper2_UnregisterFilter(mapper, NULL, NULL, &CLSID_WAVEParser); IFilterMapper2_Release(mapper); - - if (FAILED(hr = DMOUnregister(&CLSID_WMADecMediaObject, &DMOCATEGORY_AUDIO_DECODER))) - return hr; - return S_OK; } diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index f07b83f413e..82a6da1bcbf 100644 --- wine/dlls/winegstreamer/media_source.c +++ wine/dlls/winegstreamer/media_source.c @@ -105,7 +105,6 @@ struct media_source SOURCE_RUNNING, SOURCE_SHUTDOWN, } state; - float rate; HANDLE read_thread; bool read_thread_shutdown; @@ -305,7 +304,7 @@ static void flush_token_queue(struct media_stream *stream, BOOL send) &stream->parent_source->async_commands_callback, &command->IUnknown_iface); } if (FAILED(hr)) - WARN("Could not enqueue sample request, hr %#lx\n", hr); + WARN("Could not enqueue sample request, hr %#x\n", hr); } else if (stream->token_queue[i]) IUnknown_Release(stream->token_queue[i]); @@ -358,15 +357,11 @@ static void start_pipeline(struct media_source *source, struct source_async_comm IMFMediaTypeHandler_GetCurrentMediaType(mth, ¤t_mt); mf_media_type_to_wg_format(current_mt, &format); - wg_parser_stream_enable(stream->wg_stream, &format); + wg_parser_stream_enable(stream->wg_stream, &format, NULL, 0); IMFMediaType_Release(current_mt); IMFMediaTypeHandler_Release(mth); } - else - { - wg_parser_stream_disable(stream->wg_stream); - } if (position->vt != VT_EMPTY) stream->eos = FALSE; @@ -423,7 +418,10 @@ static void stop_pipeline(struct media_source *source) { struct media_stream *stream = source->streams[i]; if (stream->state != STREAM_INACTIVE) + { IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, MEStreamStopped, &GUID_NULL, S_OK, NULL); + wg_parser_stream_disable(stream->wg_stream); + } } IMFMediaEventQueue_QueueEventParamVar(source->event_queue, MESourceStopped, &GUID_NULL, S_OK, NULL); @@ -460,32 +458,32 @@ static void send_buffer(struct media_stream *stream, const struct wg_parser_buff if (FAILED(hr = MFCreateSample(&sample))) { - ERR("Failed to create sample, hr %#lx.\n", hr); + ERR("Failed to create sample, hr %#x.\n", hr); return; } if (FAILED(hr = MFCreateMemoryBuffer(wg_buffer->size, &buffer))) { - ERR("Failed to create buffer, hr %#lx.\n", hr); + ERR("Failed to create buffer, hr %#x.\n", hr); IMFSample_Release(sample); return; } if (FAILED(hr = IMFSample_AddBuffer(sample, buffer))) { - ERR("Failed to add buffer, hr %#lx.\n", hr); + ERR("Failed to add buffer, hr %#x.\n", hr); goto out; } if (FAILED(hr = IMFMediaBuffer_SetCurrentLength(buffer, wg_buffer->size))) { - ERR("Failed to set size, hr %#lx.\n", hr); + ERR("Failed to set size, hr %#x.\n", hr); goto out; } if (FAILED(hr = IMFMediaBuffer_Lock(buffer, &data, NULL, NULL))) { - ERR("Failed to lock buffer, hr %#lx.\n", hr); + ERR("Failed to lock buffer, hr %#x.\n", hr); goto out; } @@ -499,19 +497,19 @@ static void send_buffer(struct media_stream *stream, const struct wg_parser_buff if (FAILED(hr = IMFMediaBuffer_Unlock(buffer))) { - ERR("Failed to unlock buffer, hr %#lx.\n", hr); + ERR("Failed to unlock buffer, hr %#x.\n", hr); goto out; } if (FAILED(hr = IMFSample_SetSampleTime(sample, wg_buffer->pts))) { - ERR("Failed to set sample time, hr %#lx.\n", hr); + ERR("Failed to set sample time, hr %#x.\n", hr); goto out; } if (FAILED(hr = IMFSample_SetSampleDuration(sample, wg_buffer->duration))) { - ERR("Failed to set sample duration, hr %#lx.\n", hr); + ERR("Failed to set sample duration, hr %#x.\n", hr); goto out; } @@ -626,7 +624,7 @@ static DWORD CALLBACK read_thread(void *arg) * an error when reading past the file size. */ if (!size) { - wg_parser_push_data(source->wg_parser, data, 0); + wg_parser_push_data(source->wg_parser, WG_READ_SUCCESS, data, 0); continue; } @@ -641,10 +639,10 @@ static DWORD CALLBACK read_thread(void *arg) if (SUCCEEDED(hr = IMFByteStream_SetCurrentPosition(byte_stream, offset))) hr = IMFByteStream_Read(byte_stream, data, size, &ret_size); if (FAILED(hr)) - ERR("Failed to read %u bytes at offset %I64u, hr %#lx.\n", size, offset, hr); + ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); else if (ret_size != size) - ERR("Unexpected short read: requested %u bytes, got %lu.\n", size, ret_size); - wg_parser_push_data(source->wg_parser, SUCCEEDED(hr) ? data : NULL, ret_size); + ERR("Unexpected short read: requested %u bytes, got %u.\n", size, ret_size); + wg_parser_push_data(source->wg_parser, SUCCEEDED(hr) ? WG_READ_SUCCESS : WG_READ_FAILURE, data, ret_size); } free(data); @@ -680,7 +678,7 @@ static ULONG WINAPI media_stream_AddRef(IMFMediaStream *iface) struct media_stream *stream = impl_from_IMFMediaStream(iface); ULONG ref = InterlockedIncrement(&stream->ref); - TRACE("%p, refcount %lu.\n", iface, ref); + TRACE("%p, refcount %u.\n", iface, ref); return ref; } @@ -690,7 +688,7 @@ static ULONG WINAPI media_stream_Release(IMFMediaStream *iface) struct media_stream *stream = impl_from_IMFMediaStream(iface); ULONG ref = InterlockedDecrement(&stream->ref); - TRACE("%p, refcount %lu.\n", iface, ref); + TRACE("%p, refcount %u.\n", iface, ref); if (!ref) { @@ -707,7 +705,7 @@ static HRESULT WINAPI media_stream_GetEvent(IMFMediaStream *iface, DWORD flags, { struct media_stream *stream = impl_from_IMFMediaStream(iface); - TRACE("%p, %#lx, %p.\n", iface, flags, event); + TRACE("%p, %#x, %p.\n", iface, flags, event); return IMFMediaEventQueue_GetEvent(stream->event_queue, flags, event); } @@ -735,7 +733,7 @@ static HRESULT WINAPI media_stream_QueueEvent(IMFMediaStream *iface, MediaEventT { struct media_stream *stream = impl_from_IMFMediaStream(iface); - TRACE("%p, %lu, %s, %#lx, %p.\n", iface, event_type, debugstr_guid(ext_type), hr, value); + TRACE("%p, %d, %s, %#x, %p.\n", iface, event_type, debugstr_guid(ext_type), hr, value); return IMFMediaEventQueue_QueueEventParamVar(stream->event_queue, event_type, ext_type, hr, value); } @@ -826,7 +824,7 @@ static HRESULT new_media_stream(struct media_source *source, struct media_stream *object = calloc(1, sizeof(*object)); HRESULT hr; - TRACE("source %p, wg_stream %p, stream_id %lu.\n", source, wg_stream, stream_id); + TRACE("source %p, wg_stream %p, stream_id %u.\n", source, wg_stream, stream_id); object->IMFMediaStream_iface.lpVtbl = &media_stream_vtbl; object->ref = 1; @@ -855,7 +853,7 @@ static HRESULT new_media_stream(struct media_source *source, static HRESULT media_stream_init_desc(struct media_stream *stream) { IMFMediaTypeHandler *type_handler = NULL; - IMFMediaType *stream_types[6]; + IMFMediaType *stream_types[8]; struct wg_format format; DWORD type_count = 0; unsigned int i; @@ -874,6 +872,8 @@ static HRESULT media_stream_init_desc(struct media_stream *stream) &MFVideoFormat_YUY2, &MFVideoFormat_IYUV, &MFVideoFormat_I420, + &MFVideoFormat_ARGB32, + &MFVideoFormat_RGB32, }; IMFMediaType *base_type = mf_media_type_from_wg_format(&format); @@ -1092,9 +1092,6 @@ static ULONG WINAPI media_source_rate_control_Release(IMFRateControl *iface) static HRESULT WINAPI media_source_rate_control_SetRate(IMFRateControl *iface, BOOL thin, float rate) { - struct media_source *source = impl_from_IMFRateControl(iface); - HRESULT hr; - FIXME("%p, %d, %f.\n", iface, thin, rate); if (rate < 0.0f) @@ -1103,24 +1100,20 @@ static HRESULT WINAPI media_source_rate_control_SetRate(IMFRateControl *iface, B if (thin) return MF_E_THINNING_UNSUPPORTED; - if (FAILED(hr = IMFRateSupport_IsRateSupported(&source->IMFRateSupport_iface, thin, rate, NULL))) - return hr; - - source->rate = rate; + if (rate != 1.0f) + return MF_E_UNSUPPORTED_RATE; - return IMFMediaEventQueue_QueueEventParamVar(source->event_queue, MESourceRateChanged, &GUID_NULL, S_OK, NULL); + return S_OK; } static HRESULT WINAPI media_source_rate_control_GetRate(IMFRateControl *iface, BOOL *thin, float *rate) { - struct media_source *source = impl_from_IMFRateControl(iface); - TRACE("%p, %p, %p.\n", iface, thin, rate); if (thin) *thin = FALSE; - *rate = source->rate; + *rate = 1.0f; return S_OK; } @@ -1166,7 +1159,7 @@ static ULONG WINAPI media_source_AddRef(IMFMediaSource *iface) struct media_source *source = impl_from_IMFMediaSource(iface); ULONG ref = InterlockedIncrement(&source->ref); - TRACE("%p, refcount %lu.\n", iface, ref); + TRACE("%p, refcount %u.\n", iface, ref); return ref; } @@ -1176,7 +1169,7 @@ static ULONG WINAPI media_source_Release(IMFMediaSource *iface) struct media_source *source = impl_from_IMFMediaSource(iface); ULONG ref = InterlockedDecrement(&source->ref); - TRACE("%p, refcount %lu.\n", iface, ref); + TRACE("%p, refcount %u.\n", iface, ref); if (!ref) { @@ -1192,7 +1185,7 @@ static HRESULT WINAPI media_source_GetEvent(IMFMediaSource *iface, DWORD flags, { struct media_source *source = impl_from_IMFMediaSource(iface); - TRACE("%p, %#lx, %p.\n", iface, flags, event); + TRACE("%p, %#x, %p.\n", iface, flags, event); return IMFMediaEventQueue_GetEvent(source->event_queue, flags, event); } @@ -1220,7 +1213,7 @@ static HRESULT WINAPI media_source_QueueEvent(IMFMediaSource *iface, MediaEventT { struct media_source *source = impl_from_IMFMediaSource(iface); - TRACE("%p, %lu, %s, %#lx, %p.\n", iface, event_type, debugstr_guid(ext_type), hr, value); + TRACE("%p, %d, %s, %#x, %p.\n", iface, event_type, debugstr_guid(ext_type), hr, value); return IMFMediaEventQueue_QueueEventParamVar(source->event_queue, event_type, ext_type, hr, value); } @@ -1379,6 +1372,7 @@ static const IMFMediaSourceVtbl IMFMediaSource_vtbl = static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_source **out_media_source) { + BOOL video_selected = FALSE, audio_selected = FALSE; IMFStreamDescriptor **descriptors = NULL; unsigned int stream_count = UINT_MAX; struct media_source *object; @@ -1400,7 +1394,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ if (FAILED(hr = IMFByteStream_GetLength(bytestream, &file_size))) { - FIXME("Failed to get byte stream length, hr %#lx.\n", hr); + FIXME("Failed to get byte stream length, hr %#x.\n", hr); return hr; } @@ -1415,7 +1409,6 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ object->ref = 1; object->byte_stream = bytestream; IMFByteStream_AddRef(bytestream); - object->rate = 1.0f; if (FAILED(hr = MFCreateEventQueue(&object->event_queue))) goto fail; @@ -1458,7 +1451,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ if (FAILED(hr = media_stream_init_desc(object->streams[i]))) { - ERR("Failed to finish initialization of media stream %p, hr %#lx.\n", object->streams[i], hr); + ERR("Failed to finish initialization of media stream %p, hr %x.\n", object->streams[i], hr); IMFMediaSource_Release(&object->streams[i]->parent_source->IMFMediaSource_iface); IMFMediaEventQueue_Release(object->streams[i]->event_queue); free(object->streams[i]); @@ -1473,15 +1466,52 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ descriptors = malloc(object->stream_count * sizeof(IMFStreamDescriptor *)); for (i = 0; i < object->stream_count; i++) { - IMFMediaStream_GetStreamDescriptor(&object->streams[i]->IMFMediaStream_iface, &descriptors[i]); + IMFStreamDescriptor **descriptor = &descriptors[object->stream_count - 1 - i]; + char language[128]; + DWORD language_len; + WCHAR *languageW; + + IMFMediaStream_GetStreamDescriptor(&object->streams[i]->IMFMediaStream_iface, descriptor); + + if (wg_parser_stream_get_language(object->streams[i]->wg_stream, language, sizeof(language))) + { + if ((language_len = MultiByteToWideChar(CP_UTF8, 0, language, -1, NULL, 0))) + { + languageW = malloc(language_len * sizeof(WCHAR)); + if (MultiByteToWideChar(CP_UTF8, 0, language, -1, languageW, language_len)) + { + IMFStreamDescriptor_SetString(*descriptor, &MF_SD_LANGUAGE, languageW); + } + free(languageW); + } + } } if (FAILED(hr = MFCreatePresentationDescriptor(object->stream_count, descriptors, &object->pres_desc))) goto fail; + /* Select one of each major type. */ for (i = 0; i < object->stream_count; i++) { - IMFPresentationDescriptor_SelectStream(object->pres_desc, i); + IMFMediaTypeHandler *handler; + GUID major_type; + BOOL select_stream = FALSE; + + IMFStreamDescriptor_GetMediaTypeHandler(descriptors[i], &handler); + IMFMediaTypeHandler_GetMajorType(handler, &major_type); + if (IsEqualGUID(&major_type, &MFMediaType_Video) && !video_selected) + { + select_stream = TRUE; + video_selected = TRUE; + } + if (IsEqualGUID(&major_type, &MFMediaType_Audio) && !audio_selected) + { + select_stream = TRUE; + audio_selected = TRUE; + } + if (select_stream) + IMFPresentationDescriptor_SelectStream(object->pres_desc, i); + IMFMediaTypeHandler_Release(handler); IMFStreamDescriptor_Release(descriptors[i]); } free(descriptors); @@ -1500,7 +1530,7 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ return S_OK; fail: - WARN("Failed to construct MFMediaSource, hr %#lx.\n", hr); + WARN("Failed to construct MFMediaSource, hr %#x.\n", hr); if (descriptors) { @@ -1587,7 +1617,7 @@ static ULONG WINAPI winegstreamer_stream_handler_AddRef(IMFByteStreamHandler *if struct winegstreamer_stream_handler *handler = impl_from_IMFByteStreamHandler(iface); ULONG refcount = InterlockedIncrement(&handler->refcount); - TRACE("%p, refcount %lu.\n", handler, refcount); + TRACE("%p, refcount %u.\n", handler, refcount); return refcount; } @@ -1598,7 +1628,7 @@ static ULONG WINAPI winegstreamer_stream_handler_Release(IMFByteStreamHandler *i ULONG refcount = InterlockedDecrement(&handler->refcount); struct winegstreamer_stream_handler_result *result, *next; - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -1654,7 +1684,7 @@ static ULONG WINAPI create_object_context_AddRef(IUnknown *iface) struct create_object_context *context = impl_from_IUnknown(iface); ULONG refcount = InterlockedIncrement(&context->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -1664,7 +1694,7 @@ static ULONG WINAPI create_object_context_Release(IUnknown *iface) struct create_object_context *context = impl_from_IUnknown(iface); ULONG refcount = InterlockedDecrement(&context->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -1694,7 +1724,7 @@ static HRESULT WINAPI winegstreamer_stream_handler_BeginCreateObject(IMFByteStre IMFAsyncResult *caller, *item; HRESULT hr; - TRACE("%p, %s, %#lx, %p, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, cancel_cookie, callback, state); + TRACE("%p, %s, %#x, %p, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, cancel_cookie, callback, state); if (cancel_cookie) *cancel_cookie = NULL; @@ -1871,7 +1901,7 @@ static HRESULT WINAPI winegstreamer_stream_handler_callback_GetParameters(IMFAsy static HRESULT winegstreamer_stream_handler_create_object(struct winegstreamer_stream_handler *This, WCHAR *url, IMFByteStream *stream, DWORD flags, IPropertyStore *props, IUnknown **out_object, MF_OBJECT_TYPE *out_obj_type) { - TRACE("%p, %s, %p, %#lx, %p, %p, %p.\n", This, debugstr_w(url), stream, flags, props, out_object, out_obj_type); + TRACE("%p, %s, %p, %u, %p, %p, %p.\n", This, debugstr_w(url), stream, flags, props, out_object, out_obj_type); if (flags & MF_RESOLUTION_MEDIASOURCE) { @@ -1890,7 +1920,7 @@ static HRESULT winegstreamer_stream_handler_create_object(struct winegstreamer_s } else { - FIXME("Unhandled flags %#lx.\n", flags); + FIXME("flags = %08x\n", flags); return E_NOTIMPL; } } diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c index 97e27bb7301..3ec45d7de4e 100644 --- wine/dlls/winegstreamer/mfplat.c +++ wine/dlls/winegstreamer/mfplat.c @@ -29,6 +29,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mfplat); +DEFINE_MEDIATYPE_GUID(MFAudioFormat_XMAudio2, 0x0166); + struct video_processor { IMFTransform IMFTransform_iface; @@ -64,7 +66,7 @@ static ULONG WINAPI video_processor_AddRef(IMFTransform *iface) struct video_processor *transform = impl_video_processor_from_IMFTransform(iface); ULONG refcount = InterlockedIncrement(&transform->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); return refcount; } @@ -74,7 +76,7 @@ static ULONG WINAPI video_processor_Release(IMFTransform *iface) struct video_processor *transform = impl_video_processor_from_IMFTransform(iface); ULONG refcount = InterlockedDecrement(&transform->refcount); - TRACE("%p, refcount %lu.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount); if (!refcount) { @@ -146,7 +148,7 @@ static HRESULT WINAPI video_processor_GetOutputStreamAttributes(IMFTransform *if { struct video_processor *transform = impl_video_processor_from_IMFTransform(iface); - TRACE("%p, %lu, %p.\n", iface, id, attributes); + TRACE("%p, %u, %p.\n", iface, id, attributes); *attributes = transform->output_attributes; IMFAttributes_AddRef(*attributes); @@ -156,14 +158,14 @@ static HRESULT WINAPI video_processor_GetOutputStreamAttributes(IMFTransform *if static HRESULT WINAPI video_processor_DeleteInputStream(IMFTransform *iface, DWORD id) { - TRACE("%p, %lu.\n", iface, id); + TRACE("%p, %u.\n", iface, id); return E_NOTIMPL; } static HRESULT WINAPI video_processor_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) { - TRACE("%p, %lu, %p.\n", iface, streams, ids); + TRACE("%p, %u, %p.\n", iface, streams, ids); return E_NOTIMPL; } @@ -171,7 +173,7 @@ static HRESULT WINAPI video_processor_AddInputStreams(IMFTransform *iface, DWORD static HRESULT WINAPI video_processor_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, IMFMediaType **type) { - FIXME("%p, %lu, %lu, %p.\n", iface, id, index, type); + FIXME("%p, %u, %u, %p.\n", iface, id, index, type); return E_NOTIMPL; } @@ -179,42 +181,42 @@ static HRESULT WINAPI video_processor_GetInputAvailableType(IMFTransform *iface, static HRESULT WINAPI video_processor_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, IMFMediaType **type) { - FIXME("%p, %lu, %lu, %p.\n", iface, id, index, type); + FIXME("%p, %u, %u, %p.\n", iface, id, index, type); return E_NOTIMPL; } static HRESULT WINAPI video_processor_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { - FIXME("%p, %lu, %p, %#lx.\n", iface, id, type, flags); + FIXME("%p, %u, %p, %#x.\n", iface, id, type, flags); return E_NOTIMPL; } static HRESULT WINAPI video_processor_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { - FIXME("%p, %lu, %p, %#lx.\n", iface, id, type, flags); + FIXME("%p, %u, %p, %#x.\n", iface, id, type, flags); return E_NOTIMPL; } static HRESULT WINAPI video_processor_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) { - FIXME("%p, %lu, %p.\n", iface, id, type); + FIXME("%p, %u, %p.\n", iface, id, type); return E_NOTIMPL; } static HRESULT WINAPI video_processor_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) { - FIXME("%p, %lu, %p.\n", iface, id, type); + FIXME("%p, %u, %p.\n", iface, id, type); return E_NOTIMPL; } static HRESULT WINAPI video_processor_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) { - FIXME("%p, %lu, %p.\n", iface, id, flags); + FIXME("%p, %u, %p.\n", iface, id, flags); return E_NOTIMPL; } @@ -235,21 +237,21 @@ static HRESULT WINAPI video_processor_SetOutputBounds(IMFTransform *iface, LONGL static HRESULT WINAPI video_processor_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) { - TRACE("%p, %lu, %p.\n", iface, id, event); + TRACE("%p, %u, %p.\n", iface, id, event); return E_NOTIMPL; } static HRESULT WINAPI video_processor_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) { - FIXME("%p, %u, %#Ix.\n", iface, message, param); + FIXME("%p, %u.\n", iface, message); return E_NOTIMPL; } static HRESULT WINAPI video_processor_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) { - FIXME("%p, %lu, %p, %#lx.\n", iface, id, sample, flags); + FIXME("%p, %u, %p, %#x.\n", iface, id, sample, flags); return E_NOTIMPL; } @@ -257,7 +259,7 @@ static HRESULT WINAPI video_processor_ProcessInput(IMFTransform *iface, DWORD id static HRESULT WINAPI video_processor_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) { - FIXME("%p, %#lx, %lu, %p, %p.\n", iface, flags, count, samples, status); + FIXME("%p, %#x, %u, %p, %p.\n", iface, flags, count, samples, status); return E_NOTIMPL; } @@ -408,7 +410,9 @@ class_objects[] = { &CLSID_VideoProcessorMFT, &video_processor_create }, { &CLSID_GStreamerByteStreamHandler, &winegstreamer_stream_handler_create }, { &CLSID_WINEAudioConverter, &audio_converter_create }, + { &CLSID_CColorConvertDMO, &color_converter_create }, { &CLSID_MSH264DecoderMFT, &h264_decoder_create }, + { &CLSID_MSAACDecMFT, &aac_decoder_create }, }; HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) @@ -438,39 +442,75 @@ HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) } static WCHAR audio_converterW[] = L"Audio Converter"; -static const GUID *const audio_converter_supported_types[] = +static const GUID *audio_converter_supported_types[] = { &MFAudioFormat_PCM, &MFAudioFormat_Float, }; static WCHAR wma_decoderW[] = L"WMAudio Decoder MFT"; -static const GUID *const wma_decoder_input_types[] = +static const GUID *wma_decoder_input_types[] = { &MEDIASUBTYPE_MSAUDIO1, &MFAudioFormat_WMAudioV8, &MFAudioFormat_WMAudioV9, &MFAudioFormat_WMAudio_Lossless, }; -static const GUID *const wma_decoder_output_types[] = +static const GUID *wma_decoder_output_types[] = { &MFAudioFormat_PCM, &MFAudioFormat_Float, }; -static WCHAR h264_decoderW[] = L"Microsoft H264 Video Decoder MFT"; -static const GUID *const h264_decoder_input_types[] = +static WCHAR video_processorW[] = L"Video Processor MFT"; +static const GUID *video_processor_supported_types[] = +{ + &MFVideoFormat_IYUV, +}; + +static WCHAR color_converterW[] = L"Color Converter"; +static const GUID *color_converter_supported_types[] = +{ + &MFVideoFormat_RGB24, + &MFVideoFormat_RGB32, + &MFVideoFormat_RGB555, + &MFVideoFormat_RGB8, + &MFVideoFormat_AYUV, + &MFVideoFormat_I420, + &MFVideoFormat_IYUV, + &MFVideoFormat_NV11, + &MFVideoFormat_NV12, + &MFVideoFormat_UYVY, + &MFVideoFormat_v216, + &MFVideoFormat_v410, + &MFVideoFormat_YUY2, + &MFVideoFormat_YVYU, + &MFVideoFormat_YVYU, +}; + +static WCHAR h264_decoderW[] = L"H.264 Decoder"; +static const GUID *h264_decoder_input_types[] = { &MFVideoFormat_H264, - &MFVideoFormat_H264_ES, }; -static const GUID *const h264_decoder_output_types[] = +static const GUID *h264_decoder_output_types[] = { &MFVideoFormat_NV12, - &MFVideoFormat_YV12, - &MFVideoFormat_IYUV, &MFVideoFormat_I420, + &MFVideoFormat_IYUV, &MFVideoFormat_YUY2, + &MFVideoFormat_YV12, +}; + +static WCHAR aac_decoderW[] = L"AAC Decoder"; +static const GUID *aac_decoder_input_types[] = +{ + &MFAudioFormat_AAC, +}; +static const GUID *aac_decoder_output_types[] = +{ + &MFAudioFormat_Float, + &MFAudioFormat_PCM, }; static const struct mft @@ -481,9 +521,9 @@ static const struct mft const UINT32 flags; const GUID *major_type; const UINT32 input_types_count; - const GUID *const *input_types; + const GUID **input_types; const UINT32 output_types_count; - const GUID *const *output_types; + const GUID **output_types; } mfts[] = { @@ -509,6 +549,28 @@ mfts[] = ARRAY_SIZE(wma_decoder_output_types), wma_decoder_output_types, }, + { + &CLSID_VideoProcessorMFT, + &MFT_CATEGORY_VIDEO_PROCESSOR, + video_processorW, + 0, + &MFMediaType_Video, + ARRAY_SIZE(video_processor_supported_types), + video_processor_supported_types, + ARRAY_SIZE(video_processor_supported_types), + video_processor_supported_types, + }, + { + &CLSID_CColorConvertDMO, + &MFT_CATEGORY_VIDEO_EFFECT, + color_converterW, + MFT_ENUM_FLAG_SYNCMFT, + &MFMediaType_Video, + ARRAY_SIZE(color_converter_supported_types), + color_converter_supported_types, + ARRAY_SIZE(color_converter_supported_types), + color_converter_supported_types, + }, { &CLSID_MSH264DecoderMFT, &MFT_CATEGORY_VIDEO_DECODER, @@ -520,13 +582,24 @@ mfts[] = ARRAY_SIZE(h264_decoder_output_types), h264_decoder_output_types, }, + { + &CLSID_MSAACDecMFT, + &MFT_CATEGORY_AUDIO_DECODER, + aac_decoderW, + MFT_ENUM_FLAG_SYNCMFT, + &MFMediaType_Audio, + ARRAY_SIZE(aac_decoder_input_types), + aac_decoder_input_types, + ARRAY_SIZE(aac_decoder_output_types), + aac_decoder_output_types, + }, }; HRESULT mfplat_DllRegisterServer(void) { unsigned int i, j; HRESULT hr; - MFT_REGISTER_TYPE_INFO input_types[4], output_types[5]; + MFT_REGISTER_TYPE_INFO input_types[15], output_types[15]; for (i = 0; i < ARRAY_SIZE(mfts); i++) { @@ -548,7 +621,7 @@ HRESULT mfplat_DllRegisterServer(void) if (FAILED(hr)) { - FIXME("Failed to register MFT, hr %#lx.\n", hr); + FIXME("Failed to register MFT, hr %#x\n", hr); return hr; } } @@ -615,7 +688,8 @@ static IMFMediaType *mf_media_type_from_wg_format_audio(const struct wg_format * IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_BITS_PER_SAMPLE, audio_formats[i].depth); IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, format->u.audio.rate); IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_NUM_CHANNELS, format->u.audio.channels); - IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_CHANNEL_MASK, format->u.audio.channel_mask); + if (format->u.audio.channel_mask) + IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_CHANNEL_MASK, format->u.audio.channel_mask); IMFMediaType_SetUINT32(type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); IMFMediaType_SetUINT32(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, format->u.audio.channels * audio_formats[i].depth / 8); @@ -659,10 +733,6 @@ IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) { switch (format->major_type) { - case WG_MAJOR_TYPE_H264: - case WG_MAJOR_TYPE_WMA: - FIXME("Format %u not implemented!\n", format->major_type); - /* fallthrough */ case WG_MAJOR_TYPE_UNKNOWN: return NULL; @@ -677,11 +747,17 @@ IMFMediaType *mf_media_type_from_wg_format(const struct wg_format *format) return NULL; } -static void mf_media_type_to_wg_format_audio(IMFMediaType *type, const GUID *subtype, struct wg_format *format) +static void mf_media_type_to_wg_format_audio(IMFMediaType *type, struct wg_format *format) { UINT32 rate, channels, channel_mask, depth; unsigned int i; + GUID subtype; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + { + FIXME("Subtype is not set.\n"); + return; + } if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &rate))) { FIXME("Sample rate is not set.\n"); @@ -703,6 +779,8 @@ static void mf_media_type_to_wg_format_audio(IMFMediaType *type, const GUID *sub channel_mask = KSAUDIO_SPEAKER_MONO; else if (channels == 2) channel_mask = KSAUDIO_SPEAKER_STEREO; + else if IsEqualGUID(&subtype, &MFAudioFormat_AAC) + channel_mask = 0; else { FIXME("Channel mask is not set.\n"); @@ -717,20 +795,26 @@ static void mf_media_type_to_wg_format_audio(IMFMediaType *type, const GUID *sub for (i = 0; i < ARRAY_SIZE(audio_formats); ++i) { - if (IsEqualGUID(subtype, audio_formats[i].subtype) && depth == audio_formats[i].depth) + if (IsEqualGUID(&subtype, audio_formats[i].subtype) && depth == audio_formats[i].depth) { format->u.audio.format = audio_formats[i].format; return; } } - FIXME("Unrecognized audio subtype %s, depth %u.\n", debugstr_guid(subtype), depth); + FIXME("Unrecognized audio subtype %s, depth %u.\n", debugstr_guid(&subtype), depth); } -static void mf_media_type_to_wg_format_video(IMFMediaType *type, const GUID *subtype, struct wg_format *format) +static void mf_media_type_to_wg_format_video(IMFMediaType *type, struct wg_format *format) { UINT64 frame_rate, frame_size; unsigned int i; + GUID subtype; + if (FAILED(IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + { + FIXME("Subtype is not set.\n"); + return; + } if (FAILED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &frame_size))) { FIXME("Frame size is not set.\n"); @@ -751,20 +835,41 @@ static void mf_media_type_to_wg_format_video(IMFMediaType *type, const GUID *sub for (i = 0; i < ARRAY_SIZE(video_formats); ++i) { - if (IsEqualGUID(subtype, video_formats[i].subtype)) + if (IsEqualGUID(&subtype, video_formats[i].subtype)) { format->u.video.format = video_formats[i].format; - return; + break; } } - FIXME("Unrecognized video subtype %s.\n", debugstr_guid(subtype)); + if (i == ARRAY_SIZE(video_formats)) + FIXME("Unrecognized video subtype %s.\n", debugstr_guid(&subtype)); +} + +void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format) +{ + GUID major_type; + + memset(format, 0, sizeof(*format)); + + if (FAILED(IMFMediaType_GetMajorType(type, &major_type))) + { + FIXME("Major type is not set.\n"); + return; + } + + if (IsEqualGUID(&major_type, &MFMediaType_Audio)) + mf_media_type_to_wg_format_audio(type, format); + else if (IsEqualGUID(&major_type, &MFMediaType_Video)) + mf_media_type_to_wg_format_video(type, format); + else + FIXME("Unrecognized major type %s.\n", debugstr_guid(&major_type)); } -static void mf_media_type_to_wg_format_wma(IMFMediaType *type, const GUID *subtype, struct wg_format *format) +static void mf_media_type_to_wg_encoded_format_xwma(IMFMediaType *type, struct wg_encoded_format *format, + enum wg_encoded_type encoded_type, UINT32 version) { UINT32 rate, depth, channels, block_align, bytes_per_second, codec_data_len; BYTE codec_data[64]; - UINT32 version; if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, &rate))) { @@ -776,6 +881,11 @@ static void mf_media_type_to_wg_format_wma(IMFMediaType *type, const GUID *subty FIXME("Channel count is not set.\n"); return; } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &bytes_per_second))) + { + FIXME("Bitrate is not set.\n"); + return; + } if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_BLOCK_ALIGNMENT, &block_align))) { FIXME("Block alignment is not set.\n"); @@ -791,61 +901,85 @@ static void mf_media_type_to_wg_format_wma(IMFMediaType *type, const GUID *subty FIXME("Codec data is not set.\n"); return; } - if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, &bytes_per_second))) + + format->encoded_type = encoded_type; + format->u.xwma.version = version; + format->u.xwma.bitrate = bytes_per_second * 8; + format->u.xwma.rate = rate; + format->u.xwma.depth = depth; + format->u.xwma.channels = channels; + format->u.xwma.block_align = block_align; + format->u.xwma.codec_data_len = codec_data_len; + memcpy(format->u.xwma.codec_data, codec_data, codec_data_len); +} + +static void mf_media_type_to_wg_encoded_format_aac(IMFMediaType *type, struct wg_encoded_format *format) +{ + UINT32 codec_data_len, payload_type, profile_level_indication; + BYTE codec_data[64]; + + /* Audio specific config is stored at after HEAACWAVEINFO in MF_MT_USER_DATA + * https://docs.microsoft.com/en-us/windows/win32/api/mmreg/ns-mmreg-heaacwaveformat + */ + struct { - FIXME("Bitrate is not set.\n"); - bytes_per_second = 0; - } + WORD payload_type; + WORD profile_level_indication; + WORD type; + WORD reserved1; + DWORD reserved2; + } *aac_info = (void *)codec_data; - if (IsEqualGUID(subtype, &MEDIASUBTYPE_MSAUDIO1)) - version = 1; - else if (IsEqualGUID(subtype, &MFAudioFormat_WMAudioV8)) - version = 2; - else if (IsEqualGUID(subtype, &MFAudioFormat_WMAudioV9)) - version = 3; - else if (IsEqualGUID(subtype, &MFAudioFormat_WMAudio_Lossless)) - version = 4; - else + if (FAILED(IMFMediaType_GetBlob(type, &MF_MT_USER_DATA, codec_data, sizeof(codec_data), &codec_data_len))) { - assert(0); + FIXME("Codec data is not set.\n"); return; } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AAC_PAYLOAD_TYPE, &payload_type))) + { + FIXME("AAC payload type is not set.\n"); + payload_type = aac_info->payload_type; + } + if (FAILED(IMFMediaType_GetUINT32(type, &MF_MT_AAC_AUDIO_PROFILE_LEVEL_INDICATION, &profile_level_indication))) + { + FIXME("AAC provile level indication is not set.\n"); + profile_level_indication = aac_info->profile_level_indication; + } - format->major_type = WG_MAJOR_TYPE_WMA; - format->u.wma.version = version; - format->u.wma.bitrate = bytes_per_second * 8; - format->u.wma.rate = rate; - format->u.wma.depth = depth; - format->u.wma.channels = channels; - format->u.wma.block_align = block_align; - format->u.wma.codec_data_len = codec_data_len; - memcpy(format->u.wma.codec_data, codec_data, codec_data_len); + format->encoded_type = WG_ENCODED_TYPE_AAC; + format->u.aac.payload_type = payload_type; + format->u.aac.profile_level_indication = profile_level_indication; + format->u.aac.codec_data_len = 0; + + if (codec_data_len > sizeof(*aac_info)) + { + format->u.aac.codec_data_len = codec_data_len - sizeof(*aac_info); + memcpy(format->u.aac.codec_data, codec_data + sizeof(*aac_info), codec_data_len - sizeof(*aac_info)); + } } -static void mf_media_type_to_wg_format_h264(IMFMediaType *type, struct wg_format *format) +static void mf_media_type_to_wg_encoded_format_h264(IMFMediaType *type, struct wg_encoded_format *format) { UINT64 frame_rate, frame_size; UINT32 profile, level; - memset(format, 0, sizeof(*format)); - format->major_type = WG_MAJOR_TYPE_H264; + format->encoded_type = WG_ENCODED_TYPE_H264; + format->u.h264.width = 0; + format->u.h264.height = 0; + format->u.h264.fps_n = 1; + format->u.h264.fps_d = 1; if (SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_SIZE, &frame_size))) { - format->u.h264.width = frame_size >> 32; + format->u.h264.width = (UINT32)(frame_size >> 32); format->u.h264.height = (UINT32)frame_size; } if (SUCCEEDED(IMFMediaType_GetUINT64(type, &MF_MT_FRAME_RATE, &frame_rate)) && (UINT32)frame_rate) { - format->u.h264.fps_n = frame_rate >> 32; + format->u.h264.fps_n = (UINT32)(frame_rate >> 32); format->u.h264.fps_d = (UINT32)frame_rate; } - else - { - format->u.h264.fps_n = 1; - format->u.h264.fps_d = 1; - } if (SUCCEEDED(IMFMediaType_GetUINT32(type, &MF_MT_MPEG2_PROFILE, &profile))) format->u.h264.profile = profile; @@ -854,7 +988,7 @@ static void mf_media_type_to_wg_format_h264(IMFMediaType *type, struct wg_format format->u.h264.level = level; } -void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format) +void mf_media_type_to_wg_encoded_format(IMFMediaType *type, struct wg_encoded_format *format) { GUID major_type, subtype; @@ -873,70 +1007,30 @@ void mf_media_type_to_wg_format(IMFMediaType *type, struct wg_format *format) if (IsEqualGUID(&major_type, &MFMediaType_Audio)) { - if (IsEqualGUID(&subtype, &MEDIASUBTYPE_MSAUDIO1) || - IsEqualGUID(&subtype, &MFAudioFormat_WMAudioV8) || - IsEqualGUID(&subtype, &MFAudioFormat_WMAudioV9) || - IsEqualGUID(&subtype, &MFAudioFormat_WMAudio_Lossless)) - mf_media_type_to_wg_format_wma(type, &subtype, format); + if (IsEqualGUID(&subtype, &MEDIASUBTYPE_MSAUDIO1)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 1); + else if (IsEqualGUID(&subtype, &MFAudioFormat_WMAudioV8)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 2); + else if (IsEqualGUID(&subtype, &MFAudioFormat_WMAudioV9)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 3); + else if (IsEqualGUID(&subtype, &MFAudioFormat_WMAudio_Lossless)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_WMA, 4); + else if (IsEqualGUID(&subtype, &MFAudioFormat_XMAudio2)) + mf_media_type_to_wg_encoded_format_xwma(type, format, WG_ENCODED_TYPE_XMA, 2); + else if (IsEqualGUID(&subtype, &MFAudioFormat_AAC)) + mf_media_type_to_wg_encoded_format_aac(type, format); else - mf_media_type_to_wg_format_audio(type, &subtype, format); + FIXME("Unimplemented audio subtype %s.\n", debugstr_guid(&subtype)); } else if (IsEqualGUID(&major_type, &MFMediaType_Video)) { if (IsEqualGUID(&subtype, &MFVideoFormat_H264)) - mf_media_type_to_wg_format_h264(type, format); + mf_media_type_to_wg_encoded_format_h264(type, format); else - mf_media_type_to_wg_format_video(type, &subtype, format); + FIXME("Unimplemented audio subtype %s.\n", debugstr_guid(&subtype)); } else - FIXME("Unrecognized major type %s.\n", debugstr_guid(&major_type)); -} - -struct mf_sample -{ - IMFSample *sample; - IMFMediaBuffer *media_buffer; - struct wg_sample wg_sample; -}; - -HRESULT mf_create_wg_sample(IMFSample *sample, struct wg_sample **out) -{ - DWORD current_length, max_length; - struct mf_sample *mf_sample; - BYTE *buffer; - HRESULT hr; - - if (!(mf_sample = calloc(1, sizeof(*mf_sample)))) - return E_OUTOFMEMORY; - if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &mf_sample->media_buffer))) - goto out; - if (FAILED(hr = IMFMediaBuffer_Lock(mf_sample->media_buffer, &buffer, &max_length, ¤t_length))) - goto out; - - IMFSample_AddRef((mf_sample->sample = sample)); - mf_sample->wg_sample.data = buffer; - mf_sample->wg_sample.size = current_length; - mf_sample->wg_sample.max_size = max_length; - - TRACE("Created mf_sample %p for sample %p.\n", mf_sample, sample); - *out = &mf_sample->wg_sample; - return S_OK; - -out: - if (mf_sample->media_buffer) - IMFMediaBuffer_Release(mf_sample->media_buffer); - free(mf_sample); - return hr; -} - -void mf_destroy_wg_sample(struct wg_sample *wg_sample) -{ - struct mf_sample *mf_sample = CONTAINING_RECORD(wg_sample, struct mf_sample, wg_sample); - - IMFMediaBuffer_Unlock(mf_sample->media_buffer); - IMFMediaBuffer_SetCurrentLength(mf_sample->media_buffer, wg_sample->size); - IMFMediaBuffer_Release(mf_sample->media_buffer); - - IMFSample_Release(mf_sample->sample); - free(mf_sample); + { + FIXME("Unimplemented major type %s.\n", debugstr_guid(&major_type)); + } } diff --git a/dlls/winegstreamer/quartz_parser.c b/dlls/winegstreamer/quartz_parser.c index 7b82f3efbc9..e9a3b00016d 100644 --- wine/dlls/winegstreamer/quartz_parser.c +++ wine/dlls/winegstreamer/quartz_parser.c @@ -29,8 +29,8 @@ #include "dvdmedia.h" #include "mmreg.h" #include "ks.h" -#include "wmcodecdsp.h" #include "initguid.h" +#include "wmcodecdsp.h" #include "ksmedia.h" WINE_DEFAULT_DEBUG_CHANNEL(quartz); @@ -328,11 +328,6 @@ unsigned int wg_format_get_max_size(const struct wg_format *format) break; } - case WG_MAJOR_TYPE_H264: - case WG_MAJOR_TYPE_WMA: - FIXME("Format %u not implemented!\n", format->major_type); - return 0; - case WG_MAJOR_TYPE_UNKNOWN: FIXME("Cannot guess maximum sample size for unknown format.\n"); return 0; @@ -424,10 +419,6 @@ bool amt_from_wg_format(AM_MEDIA_TYPE *mt, const struct wg_format *format, bool switch (format->major_type) { - case WG_MAJOR_TYPE_H264: - case WG_MAJOR_TYPE_WMA: - FIXME("Format %u not implemented!\n", format->major_type); - /* fallthrough */ case WG_MAJOR_TYPE_UNKNOWN: return false; @@ -470,7 +461,7 @@ static bool amt_to_wg_format_audio(const AM_MEDIA_TYPE *mt, struct wg_format *fo } if (mt->cbFormat < sizeof(WAVEFORMATEX) || !mt->pbFormat) { - ERR("Unexpected format size %lu.\n", mt->cbFormat); + ERR("Unexpected format size %u.\n", mt->cbFormat); return false; } @@ -522,7 +513,7 @@ static bool amt_to_wg_format_audio_mpeg1(const AM_MEDIA_TYPE *mt, struct wg_form } if (mt->cbFormat < sizeof(*audio_format) || !mt->pbFormat) { - ERR("Unexpected format size %lu.\n", mt->cbFormat); + ERR("Unexpected format size %u.\n", mt->cbFormat); return false; } @@ -551,7 +542,7 @@ static bool amt_to_wg_format_audio_mpeg1_layer3(const AM_MEDIA_TYPE *mt, struct } if (mt->cbFormat < sizeof(*audio_format) || !mt->pbFormat) { - ERR("Unexpected format size %lu.\n", mt->cbFormat); + ERR("Unexpected format size %u.\n", mt->cbFormat); return false; } @@ -596,7 +587,7 @@ static bool amt_to_wg_format_video(const AM_MEDIA_TYPE *mt, struct wg_format *fo } if (mt->cbFormat < sizeof(VIDEOINFOHEADER) || !mt->pbFormat) { - ERR("Unexpected format size %lu.\n", mt->cbFormat); + ERR("Unexpected format size %u.\n", mt->cbFormat); return false; } @@ -692,11 +683,11 @@ static HRESULT send_sample(struct parser_source *pin, IMediaSample *sample, HRESULT hr; BYTE *ptr = NULL; - TRACE("offset %u, size %u, sample size %lu.\n", offset, size, IMediaSample_GetSize(sample)); + TRACE("offset %u, size %u, sample size %u\n", offset, size, IMediaSample_GetSize(sample)); hr = IMediaSample_SetActualDataLength(sample, size); if(FAILED(hr)){ - ERR("Failed to set sample size, hr %#lx.\n", hr); + WARN("SetActualDataLength failed: %08x\n", hr); return hr; } @@ -746,10 +737,12 @@ static HRESULT send_sample(struct parser_source *pin, IMediaSample *sample, IMediaSample_SetSyncPoint(sample, !buffer->delta); if (!pin->pin.pin.peer) - return VFW_E_NOT_CONNECTED; + hr = VFW_E_NOT_CONNECTED; + else + hr = IMemInputPin_Receive(pin->pin.pMemInputPin, sample); + + TRACE("sending sample returned: %08x\n", hr); - hr = IMemInputPin_Receive(pin->pin.pMemInputPin, sample); - TRACE("Receive() returned hr %#lx.\n", hr); return hr; } @@ -764,7 +757,7 @@ static void send_buffer(struct parser_source *pin, const struct wg_parser_buffer { if (FAILED(hr = IPin_NewSegment(pin->pin.pin.peer, pin->seek.llCurrent, pin->seek.llStop, pin->seek.dRate))) - WARN("Failed to deliver new segment, hr %#lx.\n", hr); + WARN("Failed to deliver new segment, hr %#x.\n", hr); pin->need_segment = false; } @@ -779,9 +772,12 @@ static void send_buffer(struct parser_source *pin, const struct wg_parser_buffer { uint32_t advance; - if (FAILED(hr = IMemAllocator_GetBuffer(pin->pin.pAllocator, &sample, NULL, NULL, 0))) + hr = BaseOutputPinImpl_GetDeliveryBuffer(&pin->pin, &sample, NULL, NULL, 0); + + if (FAILED(hr)) { - ERR("Failed to get a sample, hr %#lx.\n", hr); + if (hr != VFW_E_NOT_CONNECTED) + ERR("Could not get a delivery buffer (%x), returning GST_FLOW_FLUSHING\n", hr); break; } @@ -799,9 +795,12 @@ static void send_buffer(struct parser_source *pin, const struct wg_parser_buffer } else { - if (FAILED(hr = IMemAllocator_GetBuffer(pin->pin.pAllocator, &sample, NULL, NULL, 0))) + hr = BaseOutputPinImpl_GetDeliveryBuffer(&pin->pin, &sample, NULL, NULL, 0); + + if (FAILED(hr)) { - ERR("Failed to get a sample, hr %#lx.\n", hr); + if (hr != VFW_E_NOT_CONNECTED) + ERR("Could not get a delivery buffer (%x), returning GST_FLOW_FLUSHING\n", hr); } else { @@ -888,9 +887,9 @@ static DWORD CALLBACK read_thread(void *arg) hr = IAsyncReader_SyncRead(filter->reader, offset, size, data); if (FAILED(hr)) - ERR("Failed to read %u bytes at offset %I64u, hr %#lx.\n", size, offset, hr); + ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); - wg_parser_push_data(filter->wg_parser, SUCCEEDED(hr) ? data : NULL, size); + wg_parser_push_data(filter->wg_parser, SUCCEEDED(hr) ? WG_READ_SUCCESS : WG_READ_FAILURE, data, size); } free(data); @@ -961,24 +960,6 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface) filter->streaming = true; - for (i = 0; i < filter->source_count; ++i) - { - struct parser_source *source = filter->sources[i]; - struct wg_format format; - bool ret; - - if (source->pin.pin.peer) - { - ret = amt_to_wg_format(&source->pin.pin.mt, &format); - assert(ret); - wg_parser_stream_enable(source->wg_stream, &format); - } - else - { - wg_parser_stream_disable(source->wg_stream); - } - } - /* DirectShow retains the old seek positions, but resets to them every time * it transitions from stopped -> paused. */ @@ -997,7 +978,7 @@ static HRESULT parser_init_stream(struct strmbase_filter *iface) continue; if (FAILED(hr = IMemAllocator_Commit(pin->pin.pAllocator))) - ERR("Failed to commit allocator, hr %#lx.\n", hr); + ERR("Failed to commit allocator, hr %#x.\n", hr); pin->need_segment = true; pin->eos = false; @@ -1117,13 +1098,20 @@ static const struct strmbase_sink_ops sink_ops = static BOOL decodebin_parser_filter_init_gst(struct parser *filter) { struct wg_parser *parser = filter->wg_parser; + const char *sgi = getenv("SteamGameId"); + const WCHAR *format; unsigned int i, stream_count; WCHAR source_name[20]; + /* King of Fighters XIII requests the WMV decoder filter pins by name + * to connect them to a Sample Grabber filter. + */ + format = (sgi && !strcmp(sgi, "222940")) ? L"out%u" : L"Stream %02u"; + stream_count = wg_parser_get_stream_count(parser); for (i = 0; i < stream_count; ++i) { - swprintf(source_name, ARRAY_SIZE(source_name), L"Stream %02u", i); + swprintf(source_name, ARRAY_SIZE(source_name), format, i); if (!create_pin(filter, wg_parser_get_stream(parser, i), source_name)) return FALSE; } @@ -1209,7 +1197,7 @@ HRESULT decodebin_parser_create(IUnknown *outer, IUnknown **out) if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY; - if (!(object->wg_parser = wg_parser_create(WG_PARSER_DECODEBIN, false))) + if (!(object->wg_parser = wg_parser_create(WG_PARSER_DECODEBIN, true))) { free(object); return E_OUTOFMEMORY; @@ -1260,14 +1248,14 @@ static HRESULT WINAPI stream_select_Info(IAMStreamSelect *iface, LONG index, AM_MEDIA_TYPE **mt, DWORD *flags, LCID *lcid, DWORD *group, WCHAR **name, IUnknown **object, IUnknown **unknown) { - FIXME("iface %p, index %ld, mt %p, flags %p, lcid %p, group %p, name %p, object %p, unknown %p, stub!\n", + FIXME("iface %p, index %d, mt %p, flags %p, lcid %p, group %p, name %p, object %p, unknown %p, stub!\n", iface, index, mt, flags, lcid, group, name, object, unknown); return E_NOTIMPL; } static HRESULT WINAPI stream_select_Enable(IAMStreamSelect *iface, LONG index, DWORD flags) { - FIXME("iface %p, index %ld, flags %#lx, stub!\n", iface, index, flags); + FIXME("iface %p, index %d, flags %#x, stub!\n", iface, index, flags); return E_NOTIMPL; } @@ -1329,7 +1317,7 @@ static HRESULT WINAPI GST_Seeking_SetPositions(IMediaSeeking *iface, struct parser *filter = impl_from_strmbase_filter(pin->pin.pin.filter); int i; - TRACE("pin %p, current %s, current_flags %#lx, stop %s, stop_flags %#lx.\n", + TRACE("pin %p, current %s, current_flags %#x, stop %s, stop_flags %#x.\n", pin, current ? debugstr_time(*current) : "", current_flags, stop ? debugstr_time(*stop) : "", stop_flags); @@ -1451,7 +1439,7 @@ static HRESULT WINAPI GST_QualityControl_Notify(IQualityControl *iface, IBaseFil uint64_t timestamp; int64_t diff; - TRACE("pin %p, sender %p, type %s, proportion %ld, late %s, timestamp %s.\n", + TRACE("pin %p, sender %p, type %s, proportion %u, late %s, timestamp %s.\n", pin, sender, q.Type == Famine ? "Famine" : "Flood", q.Proportion, debugstr_time(q.Late), debugstr_time(q.TimeStamp)); @@ -1547,6 +1535,8 @@ static HRESULT WINAPI GSTOutPin_DecideBufferSize(struct strmbase_source *iface, struct parser_source *pin = impl_source_from_IPin(&iface->pin.IPin_iface); unsigned int buffer_size = 16384; ALLOCATOR_PROPERTIES ret_props; + struct wg_format format; + bool ret; if (IsEqualGUID(&pin->pin.pin.mt.formattype, &FORMAT_VideoInfo)) { @@ -1561,6 +1551,10 @@ static HRESULT WINAPI GSTOutPin_DecideBufferSize(struct strmbase_source *iface, buffer_size = format->nAvgBytesPerSec; } + ret = amt_to_wg_format(&pin->pin.pin.mt, &format); + assert(ret); + wg_parser_stream_enable(pin->wg_stream, &format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); + /* We do need to drop any buffers that might have been sent with the old * caps, but this will be handled in parser_init_stream(). */ @@ -1570,6 +1564,13 @@ static HRESULT WINAPI GSTOutPin_DecideBufferSize(struct strmbase_source *iface, return IMemAllocator_SetProperties(allocator, props, &ret_props); } +static void source_disconnect(struct strmbase_source *iface) +{ + struct parser_source *pin = impl_source_from_IPin(&iface->pin.IPin_iface); + + wg_parser_stream_disable(pin->wg_stream); +} + static void free_source_pin(struct parser_source *pin) { if (pin->pin.pin.peer) @@ -1595,6 +1596,7 @@ static const struct strmbase_source_ops source_ops = .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection, .pfnDecideAllocator = BaseOutputPinImpl_DecideAllocator, .pfnDecideBufferSize = GSTOutPin_DecideBufferSize, + .source_disconnect = source_disconnect, }; static struct parser_source *create_pin(struct parser *filter, @@ -1633,12 +1635,6 @@ static HRESULT GST_RemoveOutputPins(struct parser *This) if (!This->sink_connected) return S_OK; - for (i = 0; i < This->source_count; ++i) - { - if (This->sources[i]) - free_source_pin(This->sources[i]); - } - wg_parser_disconnect(This->wg_parser); /* read_thread() needs to stay alive to service any read requests GStreamer @@ -1647,6 +1643,12 @@ static HRESULT GST_RemoveOutputPins(struct parser *This) WaitForSingleObject(This->read_thread, INFINITE); CloseHandle(This->read_thread); + for (i = 0; i < This->source_count; ++i) + { + if (This->sources[i]) + free_source_pin(This->sources[i]); + } + This->source_count = 0; free(This->sources); This->sources = NULL; diff --git a/dlls/winegstreamer/unix_private.h b/dlls/winegstreamer/unix_private.h index 7bce8263aaf..88566ab1db5 100644 --- wine/dlls/winegstreamer/unix_private.h +++ wine/dlls/winegstreamer/unix_private.h @@ -23,14 +23,11 @@ #include "unixlib.h" -#include - extern bool init_gstreamer(void) DECLSPEC_HIDDEN; extern GstElement *create_element(const char *name, const char *plugin_set) DECLSPEC_HIDDEN; - +extern GstCaps *wg_format_to_caps(const struct wg_format *format) DECLSPEC_HIDDEN; extern void wg_format_from_caps(struct wg_format *format, const GstCaps *caps) DECLSPEC_HIDDEN; extern bool wg_format_compare(const struct wg_format *a, const struct wg_format *b) DECLSPEC_HIDDEN; -extern GstCaps *wg_format_to_caps(const struct wg_format *format) DECLSPEC_HIDDEN; extern NTSTATUS wg_transform_create(void *args) DECLSPEC_HIDDEN; extern NTSTATUS wg_transform_destroy(void *args) DECLSPEC_HIDDEN; diff --git a/dlls/winegstreamer/unixlib.h b/dlls/winegstreamer/unixlib.h index f4e2ea4966b..e39cf54fd08 100644 --- wine/dlls/winegstreamer/unixlib.h +++ wine/dlls/winegstreamer/unixlib.h @@ -37,8 +37,6 @@ struct wg_format WG_MAJOR_TYPE_UNKNOWN, WG_MAJOR_TYPE_VIDEO, WG_MAJOR_TYPE_AUDIO, - WG_MAJOR_TYPE_WMA, - WG_MAJOR_TYPE_H264, } major_type; union @@ -90,6 +88,22 @@ struct wg_format uint32_t channel_mask; /* In WinMM format. */ uint32_t rate; } audio; + } u; +}; + +struct wg_encoded_format +{ + enum wg_encoded_type + { + WG_ENCODED_TYPE_UNKNOWN, + WG_ENCODED_TYPE_WMA, + WG_ENCODED_TYPE_XMA, + WG_ENCODED_TYPE_AAC, + WG_ENCODED_TYPE_H264, + } encoded_type; + + union + { struct { uint32_t version; @@ -100,7 +114,14 @@ struct wg_format uint32_t block_align; uint32_t codec_data_len; unsigned char codec_data[64]; - } wma; + } xwma; + struct + { + uint32_t payload_type; + uint32_t profile_level_indication; + uint32_t codec_data_len; + unsigned char codec_data[64]; + } aac; struct { int32_t width, height; @@ -111,17 +132,12 @@ struct wg_format } u; }; -enum wg_sample_flag +struct wg_rect { - WG_SAMPLE_FLAG_INCOMPLETE = 1, -}; - -struct wg_sample -{ - UINT32 flags; - UINT32 max_size; - UINT32 size; - BYTE *data; + uint32_t left; + uint32_t right; + uint32_t top; + uint32_t bottom; }; struct wg_parser_buffer @@ -133,12 +149,22 @@ struct wg_parser_buffer }; C_ASSERT(sizeof(struct wg_parser_buffer) == 32); +enum wg_read_result +{ + WG_READ_SUCCESS, + WG_READ_FAILURE, + WG_READ_FLUSHING, + WG_READ_EOS, +}; + enum wg_parser_type { WG_PARSER_DECODEBIN, WG_PARSER_AVIDEMUX, WG_PARSER_MPEGAUDIOPARSE, WG_PARSER_WAVPARSE, + WG_PARSER_AUDIOCONV, + WG_PARSER_VIDEOCONV, }; struct wg_parser_create_params @@ -154,6 +180,15 @@ struct wg_parser_connect_params UINT64 file_size; }; +struct wg_parser_connect_unseekable_params +{ + struct wg_parser *parser; + const struct wg_format *in_format; + UINT32 stream_count; + const struct wg_format *out_formats; + const struct wg_rect *apertures; +}; + struct wg_parser_get_next_read_offset_params { struct wg_parser *parser; @@ -164,6 +199,7 @@ struct wg_parser_get_next_read_offset_params struct wg_parser_push_data_params { struct wg_parser *parser; + enum wg_read_result result; const void *data; UINT32 size; }; @@ -187,10 +223,14 @@ struct wg_parser_stream_get_preferred_format_params struct wg_format *format; }; +#define STREAM_ENABLE_FLAG_FLIP_RGB 0x1 + struct wg_parser_stream_enable_params { struct wg_parser_stream *stream; const struct wg_format *format; + const struct wg_rect *aperture; + uint32_t flags; }; struct wg_parser_stream_get_buffer_params @@ -222,6 +262,13 @@ struct wg_parser_stream_get_duration_params UINT64 duration; }; +struct wg_parser_stream_get_language_params +{ + struct wg_parser_stream *stream; + char *buffer; + UINT32 size; +}; + struct wg_parser_stream_seek_params { struct wg_parser_stream *stream; @@ -233,22 +280,38 @@ struct wg_parser_stream_seek_params struct wg_transform_create_params { struct wg_transform *transform; - const struct wg_format *input_format; + const struct wg_encoded_format *input_format; const struct wg_format *output_format; }; struct wg_transform_push_data_params { struct wg_transform *transform; - struct wg_sample *sample; - HRESULT result; + const void *data; + UINT32 size; +}; + +enum wg_sample_flags +{ + WG_SAMPLE_FLAG_INCOMPLETE = 1, + WG_SAMPLE_FLAG_HAS_PTS = 2, + WG_SAMPLE_FLAG_HAS_DURATION = 4, +}; + +struct wg_sample +{ + UINT32 flags; + BYTE *data; + UINT32 size; + /* pts and duration are in 100-nanosecond units. */ + ULONGLONG pts, duration; + struct wg_format *format; }; struct wg_transform_read_data_params { struct wg_transform *transform; struct wg_sample *sample; - HRESULT result; }; enum unix_funcs @@ -257,6 +320,7 @@ enum unix_funcs unix_wg_parser_destroy, unix_wg_parser_connect, + unix_wg_parser_connect_unseekable, unix_wg_parser_disconnect, unix_wg_parser_get_next_read_offset, @@ -275,8 +339,11 @@ enum unix_funcs unix_wg_parser_stream_notify_qos, unix_wg_parser_stream_get_duration, + unix_wg_parser_stream_get_language, unix_wg_parser_stream_seek, + unix_wg_parser_stream_drain, + unix_wg_transform_create, unix_wg_transform_destroy, diff --git a/dlls/winegstreamer/wg_parser.c b/dlls/winegstreamer/wg_parser.c index 48b88a4b11c..cbd037e42c8 100644 --- wine/dlls/winegstreamer/wg_parser.c +++ wine/dlls/winegstreamer/wg_parser.c @@ -30,6 +30,7 @@ #include #include +#define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_30 #include #include #include @@ -61,7 +62,7 @@ struct wg_parser init_gst_cb init_gst; struct wg_parser_stream **streams; - unsigned int stream_count; + unsigned int stream_count, expected_stream_count; GstElement *container, *decodebin; GstBus *bus; @@ -75,7 +76,7 @@ struct wg_parser pthread_mutex_t mutex; pthread_cond_t init_cond; - bool no_more_pads, has_duration, error; + bool no_more_pads, has_duration, error, pull_mode, seekable; pthread_cond_t read_cond, read_done_cond; struct @@ -87,9 +88,12 @@ struct wg_parser GstFlowReturn ret; } read_request; - bool sink_connected; + bool sink_connected, draining; bool unlimited_buffering; + struct wg_format input_format; + + bool use_mediaconv; }; struct wg_parser_stream @@ -97,9 +101,10 @@ struct wg_parser_stream struct wg_parser *parser; GstPad *their_src, *post_sink, *post_src, *my_sink; - GstElement *flip; + GstElement *flip, *box; GstSegment segment; struct wg_format preferred_format, current_format; + struct wg_rect aperture; pthread_cond_t event_cond, event_empty_cond; GstBuffer *buffer; @@ -108,8 +113,402 @@ struct wg_parser_stream bool flushing, eos, enabled, has_caps; uint64_t duration; + gchar *language_code; }; +static enum wg_audio_format wg_audio_format_from_gst(GstAudioFormat format) +{ + switch (format) + { + case GST_AUDIO_FORMAT_U8: + return WG_AUDIO_FORMAT_U8; + case GST_AUDIO_FORMAT_S16LE: + return WG_AUDIO_FORMAT_S16LE; + case GST_AUDIO_FORMAT_S24LE: + return WG_AUDIO_FORMAT_S24LE; + case GST_AUDIO_FORMAT_S32LE: + return WG_AUDIO_FORMAT_S32LE; + case GST_AUDIO_FORMAT_F32LE: + return WG_AUDIO_FORMAT_F32LE; + case GST_AUDIO_FORMAT_F64LE: + return WG_AUDIO_FORMAT_F64LE; + default: + return WG_AUDIO_FORMAT_UNKNOWN; + } +} + +static uint32_t wg_channel_position_from_gst(GstAudioChannelPosition position) +{ + static const uint32_t position_map[] = + { + SPEAKER_FRONT_LEFT, + SPEAKER_FRONT_RIGHT, + SPEAKER_FRONT_CENTER, + SPEAKER_LOW_FREQUENCY, + SPEAKER_BACK_LEFT, + SPEAKER_BACK_RIGHT, + SPEAKER_FRONT_LEFT_OF_CENTER, + SPEAKER_FRONT_RIGHT_OF_CENTER, + SPEAKER_BACK_CENTER, + 0, + SPEAKER_SIDE_LEFT, + SPEAKER_SIDE_RIGHT, + SPEAKER_TOP_FRONT_LEFT, + SPEAKER_TOP_FRONT_RIGHT, + SPEAKER_TOP_FRONT_CENTER, + SPEAKER_TOP_CENTER, + SPEAKER_TOP_BACK_LEFT, + SPEAKER_TOP_BACK_RIGHT, + 0, + 0, + SPEAKER_TOP_BACK_CENTER, + }; + + if (position == GST_AUDIO_CHANNEL_POSITION_MONO) + return SPEAKER_FRONT_CENTER; + + if (position >= 0 && position < ARRAY_SIZE(position_map)) + return position_map[position]; + return 0; +} + +static uint32_t wg_channel_mask_from_gst(const GstAudioInfo *info) +{ + uint32_t mask = 0, position; + unsigned int i; + + for (i = 0; i < GST_AUDIO_INFO_CHANNELS(info); ++i) + { + if (!(position = wg_channel_position_from_gst(GST_AUDIO_INFO_POSITION(info, i)))) + { + GST_WARNING("Unsupported channel %#x.", GST_AUDIO_INFO_POSITION(info, i)); + return 0; + } + /* Make sure it's also in WinMM order. WinMM mandates that channels be + * ordered, as it were, from least to most significant SPEAKER_* bit. + * Hence we fail if the current channel was already specified, or if any + * higher bit was already specified. */ + if (mask & ~(position - 1)) + { + GST_WARNING("Unsupported channel order."); + return 0; + } + mask |= position; + } + return mask; +} + +static void wg_format_from_audio_info(struct wg_format *format, const GstAudioInfo *info) +{ + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.format = wg_audio_format_from_gst(GST_AUDIO_INFO_FORMAT(info)); + format->u.audio.channels = GST_AUDIO_INFO_CHANNELS(info); + format->u.audio.channel_mask = wg_channel_mask_from_gst(info); + format->u.audio.rate = GST_AUDIO_INFO_RATE(info); +} + +static enum wg_video_format wg_video_format_from_gst(GstVideoFormat format) +{ + switch (format) + { + case GST_VIDEO_FORMAT_BGRA: + return WG_VIDEO_FORMAT_BGRA; + case GST_VIDEO_FORMAT_BGRx: + return WG_VIDEO_FORMAT_BGRx; + case GST_VIDEO_FORMAT_BGR: + return WG_VIDEO_FORMAT_BGR; + case GST_VIDEO_FORMAT_RGB15: + return WG_VIDEO_FORMAT_RGB15; + case GST_VIDEO_FORMAT_RGB16: + return WG_VIDEO_FORMAT_RGB16; + case GST_VIDEO_FORMAT_AYUV: + return WG_VIDEO_FORMAT_AYUV; + case GST_VIDEO_FORMAT_I420: + return WG_VIDEO_FORMAT_I420; + case GST_VIDEO_FORMAT_NV12: + return WG_VIDEO_FORMAT_NV12; + case GST_VIDEO_FORMAT_UYVY: + return WG_VIDEO_FORMAT_UYVY; + case GST_VIDEO_FORMAT_YUY2: + return WG_VIDEO_FORMAT_YUY2; + case GST_VIDEO_FORMAT_YV12: + return WG_VIDEO_FORMAT_YV12; + case GST_VIDEO_FORMAT_YVYU: + return WG_VIDEO_FORMAT_YVYU; + default: + return WG_VIDEO_FORMAT_UNKNOWN; + } +} + +static void wg_format_from_video_info(struct wg_format *format, const GstVideoInfo *info) +{ + format->major_type = WG_MAJOR_TYPE_VIDEO; + format->u.video.format = wg_video_format_from_gst(GST_VIDEO_INFO_FORMAT(info)); + format->u.video.width = GST_VIDEO_INFO_WIDTH(info); + format->u.video.height = GST_VIDEO_INFO_HEIGHT(info); + format->u.video.fps_n = GST_VIDEO_INFO_FPS_N(info); + format->u.video.fps_d = GST_VIDEO_INFO_FPS_D(info); +} + +static void wg_format_from_caps_audio_mpeg(struct wg_format *format, const GstCaps *caps) +{ + const GstStructure *structure = gst_caps_get_structure(caps, 0); + gint layer, channels, rate; + + if (!gst_structure_get_int(structure, "layer", &layer)) + { + GST_WARNING("Missing \"layer\" value."); + return; + } + if (!gst_structure_get_int(structure, "channels", &channels)) + { + GST_WARNING("Missing \"channels\" value."); + return; + } + if (!gst_structure_get_int(structure, "rate", &rate)) + { + GST_WARNING("Missing \"rate\" value."); + return; + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + + if (layer == 1) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER1; + else if (layer == 2) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER2; + else if (layer == 3) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER3; + + format->u.audio.channels = channels; + format->u.audio.rate = rate; +} + +static void wg_format_from_caps_video_cinepak(struct wg_format *format, const GstCaps *caps) +{ + const GstStructure *structure = gst_caps_get_structure(caps, 0); + gint width, height, fps_n, fps_d; + + if (!gst_structure_get_int(structure, "width", &width)) + { + GST_WARNING("Missing \"width\" value."); + return; + } + if (!gst_structure_get_int(structure, "height", &height)) + { + GST_WARNING("Missing \"height\" value."); + return; + } + if (!gst_structure_get_fraction(structure, "framerate", &fps_n, &fps_d)) + { + fps_n = 0; + fps_d = 1; + } + + format->major_type = WG_MAJOR_TYPE_VIDEO; + format->u.video.format = WG_VIDEO_FORMAT_CINEPAK; + format->u.video.width = width; + format->u.video.height = height; + format->u.video.fps_n = fps_n; + format->u.video.fps_d = fps_d; +} + +void wg_format_from_caps(struct wg_format *format, const GstCaps *caps) +{ + const GstStructure *structure = gst_caps_get_structure(caps, 0); + const char *name = gst_structure_get_name(structure); + + memset(format, 0, sizeof(*format)); + + if (!strcmp(name, "audio/x-raw")) + { + GstAudioInfo info; + + if (gst_audio_info_from_caps(&info, caps)) + wg_format_from_audio_info(format, &info); + } + else if (!strcmp(name, "video/x-raw")) + { + GstVideoInfo info; + + if (gst_video_info_from_caps(&info, caps)) + wg_format_from_video_info(format, &info); + } + else if (!strcmp(name, "audio/mpeg")) + { + wg_format_from_caps_audio_mpeg(format, caps); + } + else if (!strcmp(name, "video/x-cinepak")) + { + wg_format_from_caps_video_cinepak(format, caps); + } + else + { + gchar *str = gst_caps_to_string(caps); + + GST_FIXME("Unhandled caps %s.", str); + g_free(str); + } +} + +static GstAudioFormat wg_audio_format_to_gst(enum wg_audio_format format) +{ + switch (format) + { + case WG_AUDIO_FORMAT_U8: return GST_AUDIO_FORMAT_U8; + case WG_AUDIO_FORMAT_S16LE: return GST_AUDIO_FORMAT_S16LE; + case WG_AUDIO_FORMAT_S24LE: return GST_AUDIO_FORMAT_S24LE; + case WG_AUDIO_FORMAT_S32LE: return GST_AUDIO_FORMAT_S32LE; + case WG_AUDIO_FORMAT_F32LE: return GST_AUDIO_FORMAT_F32LE; + case WG_AUDIO_FORMAT_F64LE: return GST_AUDIO_FORMAT_F64LE; + default: return GST_AUDIO_FORMAT_UNKNOWN; + } +} + +static void wg_channel_mask_to_gst(GstAudioChannelPosition *positions, uint32_t mask, uint32_t channel_count) +{ + const uint32_t orig_mask = mask; + unsigned int i; + DWORD bit; + + static const GstAudioChannelPosition position_map[] = + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE1, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, + GST_AUDIO_CHANNEL_POSITION_TOP_CENTER, + GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_TOP_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_TOP_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER, + GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT, + }; + + for (i = 0; i < channel_count; ++i) + { + positions[i] = GST_AUDIO_CHANNEL_POSITION_NONE; + if (BitScanForward(&bit, mask)) + { + if (bit < ARRAY_SIZE(position_map)) + positions[i] = position_map[bit]; + else + GST_WARNING("Invalid channel mask %#x.\n", orig_mask); + mask &= ~(1 << bit); + } + else + { + GST_WARNING("Incomplete channel mask %#x.\n", orig_mask); + } + } +} + +static GstCaps *wg_format_to_caps_audio(const struct wg_format *format) +{ + GstAudioChannelPosition positions[32]; + GstAudioFormat audio_format; + GstAudioInfo info; + + if ((audio_format = wg_audio_format_to_gst(format->u.audio.format)) == GST_AUDIO_FORMAT_UNKNOWN) + return NULL; + + wg_channel_mask_to_gst(positions, format->u.audio.channel_mask, format->u.audio.channels); + gst_audio_info_set_format(&info, audio_format, format->u.audio.rate, format->u.audio.channels, positions); + return gst_audio_info_to_caps(&info); +} + +static GstVideoFormat wg_video_format_to_gst(enum wg_video_format format) +{ + switch (format) + { + case WG_VIDEO_FORMAT_BGRA: return GST_VIDEO_FORMAT_BGRA; + case WG_VIDEO_FORMAT_BGRx: return GST_VIDEO_FORMAT_BGRx; + case WG_VIDEO_FORMAT_BGR: return GST_VIDEO_FORMAT_BGR; + case WG_VIDEO_FORMAT_RGB15: return GST_VIDEO_FORMAT_RGB15; + case WG_VIDEO_FORMAT_RGB16: return GST_VIDEO_FORMAT_RGB16; + case WG_VIDEO_FORMAT_AYUV: return GST_VIDEO_FORMAT_AYUV; + case WG_VIDEO_FORMAT_I420: return GST_VIDEO_FORMAT_I420; + case WG_VIDEO_FORMAT_NV12: return GST_VIDEO_FORMAT_NV12; + case WG_VIDEO_FORMAT_UYVY: return GST_VIDEO_FORMAT_UYVY; + case WG_VIDEO_FORMAT_YUY2: return GST_VIDEO_FORMAT_YUY2; + case WG_VIDEO_FORMAT_YV12: return GST_VIDEO_FORMAT_YV12; + case WG_VIDEO_FORMAT_YVYU: return GST_VIDEO_FORMAT_YVYU; + default: return GST_VIDEO_FORMAT_UNKNOWN; + } +} + +static GstCaps *wg_format_to_caps_video(const struct wg_format *format) +{ + GstVideoFormat video_format; + GstVideoInfo info; + unsigned int i; + GstCaps *caps; + + if ((video_format = wg_video_format_to_gst(format->u.video.format)) == GST_VIDEO_FORMAT_UNKNOWN) + return NULL; + + gst_video_info_set_format(&info, video_format, format->u.video.width, abs(format->u.video.height)); + if ((caps = gst_video_info_to_caps(&info))) + { + /* Clear some fields that shouldn't prevent us from connecting. */ + for (i = 0; i < gst_caps_get_size(caps); ++i) + { + gst_structure_remove_fields(gst_caps_get_structure(caps, i), + "framerate", "pixel-aspect-ratio", "colorimetry", "chroma-site", NULL); + } + } + return caps; +} + +GstCaps *wg_format_to_caps(const struct wg_format *format) +{ + switch (format->major_type) + { + case WG_MAJOR_TYPE_UNKNOWN: + return NULL; + case WG_MAJOR_TYPE_AUDIO: + return wg_format_to_caps_audio(format); + case WG_MAJOR_TYPE_VIDEO: + return wg_format_to_caps_video(format); + } + assert(0); + return NULL; +} + +bool wg_format_compare(const struct wg_format *a, const struct wg_format *b) +{ + if (a->major_type != b->major_type) + return false; + + switch (a->major_type) + { + case WG_MAJOR_TYPE_UNKNOWN: + return false; + + case WG_MAJOR_TYPE_AUDIO: + return a->u.audio.format == b->u.audio.format + && a->u.audio.channels == b->u.audio.channels + && a->u.audio.rate == b->u.audio.rate; + + case WG_MAJOR_TYPE_VIDEO: + /* Do not compare FPS. */ + return a->u.video.format == b->u.video.format + && a->u.video.width == b->u.video.width + && abs(a->u.video.height) == abs(b->u.video.height); + } + + assert(0); + return false; +} + static NTSTATUS wg_parser_get_stream_count(void *args) { struct wg_parser_get_stream_count_params *params = args; @@ -133,7 +532,7 @@ static NTSTATUS wg_parser_get_next_read_offset(void *args) pthread_mutex_lock(&parser->mutex); - while (parser->sink_connected && !parser->read_request.size) + while (parser->sink_connected && (!parser->read_request.size || parser->read_request.done)) pthread_cond_wait(&parser->read_cond, &parser->mutex); if (!parser->sink_connected) @@ -149,16 +548,33 @@ static NTSTATUS wg_parser_get_next_read_offset(void *args) return S_OK; } +static GstFlowReturn wg_read_result_to_gst(enum wg_read_result result) +{ + switch (result) + { + case WG_READ_SUCCESS: return GST_FLOW_OK; + case WG_READ_FAILURE: return GST_FLOW_ERROR; + case WG_READ_FLUSHING: return GST_FLOW_FLUSHING; + case WG_READ_EOS: return GST_FLOW_EOS; + } + return GST_FLOW_ERROR; +} + static NTSTATUS wg_parser_push_data(void *args) { const struct wg_parser_push_data_params *params = args; struct wg_parser *parser = params->parser; + enum wg_read_result result = params->result; const void *data = params->data; uint32_t size = params->size; pthread_mutex_lock(&parser->mutex); - if (data) + if (result != WG_READ_SUCCESS) + { + parser->read_request.ret = wg_read_result_to_gst(result); + } + else if (data) { if (size) { @@ -196,7 +612,9 @@ static NTSTATUS wg_parser_stream_get_preferred_format(void *args) { const struct wg_parser_stream_get_preferred_format_params *params = args; - *params->format = params->stream->preferred_format; + if (params->stream->has_caps) + *params->format = params->stream->preferred_format; + return S_OK; } @@ -205,42 +623,65 @@ static NTSTATUS wg_parser_stream_enable(void *args) const struct wg_parser_stream_enable_params *params = args; struct wg_parser_stream *stream = params->stream; const struct wg_format *format = params->format; - struct wg_parser *parser = stream->parser; + const struct wg_rect *aperture = params->aperture; - pthread_mutex_lock(&parser->mutex); + if (!stream->parser->seekable) + return S_OK; stream->current_format = *format; stream->enabled = true; - pthread_mutex_unlock(&parser->mutex); - if (format->major_type == WG_MAJOR_TYPE_VIDEO) { - bool flip = (format->u.video.height < 0); - - switch (format->u.video.format) + if (params->flags & STREAM_ENABLE_FLAG_FLIP_RGB) { - case WG_VIDEO_FORMAT_BGRA: - case WG_VIDEO_FORMAT_BGRx: - case WG_VIDEO_FORMAT_BGR: - case WG_VIDEO_FORMAT_RGB15: - case WG_VIDEO_FORMAT_RGB16: - flip = !flip; - break; + bool flip = (format->u.video.height < 0); - case WG_VIDEO_FORMAT_AYUV: - case WG_VIDEO_FORMAT_I420: - case WG_VIDEO_FORMAT_NV12: - case WG_VIDEO_FORMAT_UYVY: - case WG_VIDEO_FORMAT_YUY2: - case WG_VIDEO_FORMAT_YV12: - case WG_VIDEO_FORMAT_YVYU: - case WG_VIDEO_FORMAT_UNKNOWN: - case WG_VIDEO_FORMAT_CINEPAK: - break; + switch (format->u.video.format) + { + case WG_VIDEO_FORMAT_BGRA: + case WG_VIDEO_FORMAT_BGRx: + case WG_VIDEO_FORMAT_BGR: + case WG_VIDEO_FORMAT_RGB15: + case WG_VIDEO_FORMAT_RGB16: + flip = !flip; + break; + + case WG_VIDEO_FORMAT_AYUV: + case WG_VIDEO_FORMAT_I420: + case WG_VIDEO_FORMAT_NV12: + case WG_VIDEO_FORMAT_UYVY: + case WG_VIDEO_FORMAT_YUY2: + case WG_VIDEO_FORMAT_YV12: + case WG_VIDEO_FORMAT_YVYU: + case WG_VIDEO_FORMAT_UNKNOWN: + case WG_VIDEO_FORMAT_CINEPAK: + break; + } + + gst_util_set_object_arg(G_OBJECT(stream->flip), "method", flip ? "vertical-flip" : "none"); } - gst_util_set_object_arg(G_OBJECT(stream->flip), "method", flip ? "vertical-flip" : "none"); + if (aperture) + { + if (!stream->box && (stream->aperture.left || stream->aperture.top || + (stream->aperture.right && stream->aperture.right != stream->current_format.u.video.width) || + (stream->aperture.bottom && stream->aperture.bottom != stream->current_format.u.video.height))) + { + fprintf(stderr, "winegstreamer: failed to create videobox, are %u-bit GStreamer \"good\" plugins installed?\n", + 8 * (int)sizeof(void *)); + return E_FAIL; + } + + if (aperture->left) + g_object_set(G_OBJECT(stream->box), "left", -aperture->left, NULL); + if (aperture->top) + g_object_set(G_OBJECT(stream->box), "top", -aperture->top, NULL); + if (aperture->right) + g_object_set(G_OBJECT(stream->box), "right", aperture->right - format->u.video.width, NULL); + if (aperture->bottom) + g_object_set(G_OBJECT(stream->box), "bottom", aperture->bottom - format->u.video.height, NULL); + } } gst_pad_push_event(stream->my_sink, gst_event_new_reconfigure()); @@ -250,13 +691,8 @@ static NTSTATUS wg_parser_stream_enable(void *args) static NTSTATUS wg_parser_stream_disable(void *args) { struct wg_parser_stream *stream = args; - struct wg_parser *parser = stream->parser; - pthread_mutex_lock(&parser->mutex); stream->enabled = false; - stream->current_format.major_type = WG_MAJOR_TYPE_UNKNOWN; - pthread_mutex_unlock(&parser->mutex); - pthread_cond_signal(&stream->event_empty_cond); return S_OK; } @@ -350,6 +786,14 @@ static NTSTATUS wg_parser_stream_get_duration(void *args) return S_OK; } +static NTSTATUS wg_parser_stream_get_language(void *args) +{ + struct wg_parser_stream_get_language_params *params = args; + if (params->stream->language_code) + lstrcpynA(params->buffer, params->stream->language_code, params->size); + return params->stream->language_code ? S_OK : E_FAIL; +} + static NTSTATUS wg_parser_stream_seek(void *args) { GstSeekType start_type = GST_SEEK_TYPE_SET, stop_type = GST_SEEK_TYPE_SET; @@ -358,6 +802,9 @@ static NTSTATUS wg_parser_stream_seek(void *args) DWORD stop_flags = params->stop_flags; GstSeekFlags flags = 0; + if (!params->stream->parser->seekable) + return E_FAIL; + if (start_flags & AM_SEEKING_SeekToKeyFrame) flags |= GST_SEEK_FLAG_KEY_UNIT; if (start_flags & AM_SEEKING_Segment) @@ -377,6 +824,44 @@ static NTSTATUS wg_parser_stream_seek(void *args) return S_OK; } +static NTSTATUS wg_parser_stream_drain(void *args) +{ + struct wg_parser_stream *stream = args; + struct wg_parser *parser = stream->parser; + bool ret; + + pthread_mutex_lock(&parser->mutex); + + /* Sanity check making sure caller didn't try to drain an already-EOS or unselected stream. + There's no reason for a caller to do this, but it could be an accident in which case we + should indicate that the stream is drained instead of locking-up. */ + if (!stream->enabled || stream->eos) + { + pthread_mutex_unlock(&parser->mutex); + return true; + } + + parser->draining = true; + pthread_cond_signal(&parser->read_done_cond); + + /* We must wait for either an event to occur or the drain to complete. + Since drains are blocking, we assign this responsibility to the thread + pulling data, as the pipeline will not need to pull more data until + the drain completes. If one input buffer yields more than one output + buffer, the chain callback blocks on the wg_parser_stream_buffer_release + for the first buffer, which would never be called if the drain function + hadn't completed. */ + while (parser->draining && !stream->buffer) + pthread_cond_wait(&stream->event_cond, &parser->mutex); + + ret = !stream->buffer; + parser->draining = false; + + pthread_mutex_unlock(&stream->parser->mutex); + + return ret; +} + static NTSTATUS wg_parser_stream_notify_qos(void *args) { const struct wg_parser_stream_notify_qos_params *params = args; @@ -425,6 +910,34 @@ static GstAutoplugSelectResult autoplug_select_cb(GstElement *bin, GstPad *pad, return GST_AUTOPLUG_SELECT_TRY; } +static gint find_videoconv_cb(gconstpointer a, gconstpointer b) +{ + const GValue *val_a = a, *val_b = b; + GstElementFactory *factory_a = g_value_get_object(val_a), *factory_b = g_value_get_object(val_b); + const char *name_a = gst_element_factory_get_longname(factory_a), *name_b = gst_element_factory_get_longname(factory_b); + + if (!strcmp(name_a, "Proton video converter")) + return -1; + if (!strcmp(name_b, "Proton video converter")) + return 1; + return 0; +} + +static GValueArray *autoplug_sort_cb(GstElement *bin, GstPad *pad, + GstCaps *caps, GValueArray *factories, gpointer user) +{ + struct wg_parser *parser = user; + GValueArray *ret = g_value_array_copy(factories); + + if (!parser->use_mediaconv) + return NULL; + + GST_DEBUG("parser %p.", parser); + + g_value_array_sort(ret, find_videoconv_cb); + return ret; +} + static void no_more_pads_cb(GstElement *element, gpointer user) { struct wg_parser *parser = user; @@ -447,7 +960,6 @@ static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) switch (event->type) { case GST_EVENT_SEGMENT: - pthread_mutex_lock(&parser->mutex); if (stream->enabled) { const GstSegment *segment; @@ -456,31 +968,29 @@ static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) if (segment->format != GST_FORMAT_TIME) { - pthread_mutex_unlock(&parser->mutex); GST_FIXME("Unhandled format \"%s\".", gst_format_get_name(segment->format)); break; } gst_segment_copy_into(segment, &stream->segment); } - pthread_mutex_unlock(&parser->mutex); break; case GST_EVENT_EOS: pthread_mutex_lock(&parser->mutex); stream->eos = true; + pthread_mutex_unlock(&parser->mutex); if (stream->enabled) pthread_cond_signal(&stream->event_cond); else pthread_cond_signal(&parser->init_cond); - pthread_mutex_unlock(&parser->mutex); break; case GST_EVENT_FLUSH_START: - pthread_mutex_lock(&parser->mutex); - if (stream->enabled) { + pthread_mutex_lock(&parser->mutex); + stream->flushing = true; pthread_cond_signal(&stream->event_empty_cond); @@ -490,9 +1000,9 @@ static gboolean sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) gst_buffer_unref(stream->buffer); stream->buffer = NULL; } - } - pthread_mutex_unlock(&parser->mutex); + pthread_mutex_unlock(&parser->mutex); + } break; case GST_EVENT_FLUSH_STOP: @@ -541,21 +1051,19 @@ static GstFlowReturn sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *bu GST_LOG("stream %p, buffer %p.", stream, buffer); - pthread_mutex_lock(&parser->mutex); - - /* Allow this buffer to be flushed by GStreamer. We are effectively - * implementing a queue object here. */ - - while (stream->enabled && !stream->flushing && stream->buffer) - pthread_cond_wait(&stream->event_empty_cond, &parser->mutex); - if (!stream->enabled) { - pthread_mutex_unlock(&parser->mutex); gst_buffer_unref(buffer); return GST_FLOW_OK; } + /* Allow this buffer to be flushed by GStreamer. We are effectively + * implementing a queue object here. */ + + pthread_mutex_lock(&parser->mutex); + + while (!stream->flushing && stream->buffer) + pthread_cond_wait(&stream->event_empty_cond, &parser->mutex); if (stream->flushing) { pthread_mutex_unlock(&parser->mutex); @@ -588,7 +1096,6 @@ static GstFlowReturn sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *bu static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) { struct wg_parser_stream *stream = gst_pad_get_element_private(pad); - struct wg_parser *parser = stream->parser; GST_LOG("stream %p, type \"%s\".", stream, gst_query_type_get_name(query->type)); @@ -601,10 +1108,10 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) gst_query_parse_caps(query, &filter); - pthread_mutex_lock(&parser->mutex); - caps = wg_format_to_caps(&stream->current_format); - pthread_mutex_unlock(&parser->mutex); - + if (stream->enabled) + caps = wg_format_to_caps(&stream->current_format); + else + caps = gst_caps_new_any(); if (!caps) return FALSE; @@ -630,11 +1137,8 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) gboolean ret = TRUE; GstCaps *caps; - pthread_mutex_lock(&parser->mutex); - - if (stream->current_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + if (!stream->enabled) { - pthread_mutex_unlock(&parser->mutex); gst_query_set_accept_caps_result(query, TRUE); return TRUE; } @@ -642,9 +1146,6 @@ static gboolean sink_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) gst_query_parse_accept_caps(query, &caps); wg_format_from_caps(&format, caps); ret = wg_format_compare(&format, &stream->current_format); - - pthread_mutex_unlock(&parser->mutex); - if (!ret && gst_debug_category_get_threshold(GST_CAT_DEFAULT) >= GST_LEVEL_WARNING) { gchar *str = gst_caps_to_string(caps); @@ -673,23 +1174,35 @@ GstElement *create_element(const char *name, const char *plugin_set) static struct wg_parser_stream *create_stream(struct wg_parser *parser) { struct wg_parser_stream *stream, **new_array; + unsigned int i; char pad_name[19]; - if (!(new_array = realloc(parser->streams, (parser->stream_count + 1) * sizeof(*parser->streams)))) - return NULL; - parser->streams = new_array; + for (i = 0; i < parser->expected_stream_count; i++) + { + if (!parser->streams[i]->parser) + { + stream = parser->streams[i]; + break; + } + } - if (!(stream = calloc(1, sizeof(*stream)))) - return NULL; + if (i == parser->expected_stream_count) + { + if (!(new_array = realloc(parser->streams, (parser->stream_count + 1) * sizeof(*parser->streams)))) + return NULL; + parser->streams = new_array; + + if (!(stream = calloc(1, sizeof(*stream)))) + return NULL; + } gst_segment_init(&stream->segment, GST_FORMAT_UNDEFINED); stream->parser = parser; - stream->current_format.major_type = WG_MAJOR_TYPE_UNKNOWN; pthread_cond_init(&stream->event_cond, NULL); pthread_cond_init(&stream->event_empty_cond, NULL); - sprintf(pad_name, "qz_sink_%u", parser->stream_count); + sprintf(pad_name, "wine_sink_%u", parser->stream_count); stream->my_sink = gst_pad_new(pad_name, GST_PAD_SINK); gst_pad_set_element_private(stream->my_sink, stream); gst_pad_set_chain_function(stream->my_sink, sink_chain_cb); @@ -706,10 +1219,14 @@ static void free_stream(struct wg_parser_stream *stream) { if (stream->post_sink) { + gst_pad_unlink(stream->their_src, stream->post_sink); + gst_pad_unlink(stream->post_src, stream->my_sink); gst_object_unref(stream->post_src); gst_object_unref(stream->post_sink); stream->post_src = stream->post_sink = NULL; } + else + gst_pad_unlink(stream->their_src, stream->my_sink); gst_object_unref(stream->their_src); } gst_object_unref(stream->my_sink); @@ -717,6 +1234,9 @@ static void free_stream(struct wg_parser_stream *stream) pthread_cond_destroy(&stream->event_cond); pthread_cond_destroy(&stream->event_empty_cond); + if (stream->language_code) + g_free(stream->language_code); + free(stream); } @@ -741,7 +1261,53 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user) if (!strcmp(name, "video/x-raw")) { - GstElement *deinterlace, *vconv, *flip, *vconv2; + GstElement *capssetter, *deinterlace, *vconv, *flip, *box, *vconv2; + + /* Hack?: Flatten down the colorimetry to default values, without + * actually modifying the video at all. + * + * We want to do color matrix conversions when converting from YUV to + * RGB or vice versa. We do *not* want to do color matrix conversions + * when converting YUV <-> YUV or RGB <-> RGB, because these are slow + * (it essentially means always using the slow path, never going through + * liborc). However, we have two videoconvert elements, and it's + * basically impossible to know what conversions each is going to do + * until caps are negotiated (without depending on some implementation + * details, and even then it'snot exactly trivial). And setting + * matrix-mode after caps are negotiated has no effect. + * + * Nor can we just retain colorimetry information the way we retain + * other caps values, because videoconvert automatically clears it if + * not doing passthrough. I think that this would only happen if we have + * to do a double conversion, but that is possible. Not likely, but I + * don't want to have to be the one to find out that there's still a + * game broken. + * + * [Note that we'd actually kind of like to retain colorimetry + * information, just in case it does ever become relevant to pass that + * on to the next DirectShow filter. Hence I think the correct solution + * for upstream is to get videoconvert to Not Do That.] + * + * So as a fallback solution, we force an identity transformation of + * the caps to those with a "default" color matrix—i.e. transform the + * caps, but not the data. We do this by *pre*pending a capssetter to + * the front of the chain, and we remove the matrix-mode setting for the + * videoconvert elements. + */ + if (!(capssetter = gst_element_factory_make("capssetter", NULL))) + { + GST_ERROR("Failed to create capssetter, are %u-bit GStreamer \"good\" plugins installed?\n", + 8 * (int)sizeof(void *)); + goto out; + } + gst_util_set_object_arg(G_OBJECT(capssetter), "join", "true"); + /* Actually, this is invalid, but it causes videoconvert to use default + * colorimetry as a result. Yes, this is depending on undocumented + * implementation details. It's a hack. + * + * Sadly there doesn't seem to be a way to get capssetter to clear + * certain fields while leaving others untouched. */ + gst_util_set_object_arg(G_OBJECT(capssetter), "caps", "video/x-raw,colorimetry=0:0:0:0"); /* DirectShow can express interlaced video, but downstream filters can't * necessarily consume it. In particular, the video renderer can't. */ @@ -754,32 +1320,77 @@ static void pad_added_cb(GstElement *element, GstPad *pad, gpointer user) if (!(vconv = create_element("videoconvert", "base"))) goto out; + /* Let GStreamer choose a default number of threads. */ + gst_util_set_object_arg(G_OBJECT(vconv), "n-threads", "0"); + /* GStreamer outputs RGB video top-down, but DirectShow expects bottom-up. */ if (!(flip = create_element("videoflip", "good"))) goto out; + box = gst_element_factory_make("videobox", NULL); + /* videoflip does not support 15 and 16-bit RGB so add a second videoconvert * to do the final conversion. */ if (!(vconv2 = create_element("videoconvert", "base"))) goto out; + /* Let GStreamer choose a default number of threads. */ + gst_util_set_object_arg(G_OBJECT(vconv2), "n-threads", "0"); + + if (!parser->seekable) + { + if (!box && (stream->aperture.left || stream->aperture.top || + (stream->aperture.right && stream->aperture.right != stream->current_format.u.video.width) || + (stream->aperture.bottom && stream->aperture.bottom != stream->current_format.u.video.height))) + { + fprintf(stderr, "winegstreamer: failed to create videobox, are %u-bit GStreamer \"good\" plugins installed?\n", + 8 * (int)sizeof(void *)); + goto out; + } + if (stream->aperture.left) + g_object_set(G_OBJECT(box), "left", -stream->aperture.left, NULL); + if (stream->aperture.bottom) + g_object_set(G_OBJECT(box), "top", -stream->aperture.top, NULL); + if (stream->aperture.right) + g_object_set(G_OBJECT(box), "right", stream->aperture.right - stream->current_format.u.video.width, NULL); + if (stream->aperture.bottom) + g_object_set(G_OBJECT(box), "bottom", stream->aperture.bottom - stream->current_format.u.video.height, NULL); + } + /* The bin takes ownership of these elements. */ + gst_bin_add(GST_BIN(parser->container), capssetter); + gst_element_sync_state_with_parent(capssetter); gst_bin_add(GST_BIN(parser->container), deinterlace); gst_element_sync_state_with_parent(deinterlace); gst_bin_add(GST_BIN(parser->container), vconv); gst_element_sync_state_with_parent(vconv); gst_bin_add(GST_BIN(parser->container), flip); gst_element_sync_state_with_parent(flip); + if (box) + { + gst_bin_add(GST_BIN(parser->container), box); + gst_element_sync_state_with_parent(box); + } gst_bin_add(GST_BIN(parser->container), vconv2); gst_element_sync_state_with_parent(vconv2); + gst_element_link(capssetter, deinterlace); gst_element_link(deinterlace, vconv); gst_element_link(vconv, flip); - gst_element_link(flip, vconv2); + if (box) + { + gst_element_link(flip, box); + gst_element_link(box, vconv2); + } + else + { + gst_element_link(flip, vconv2); + } - stream->post_sink = gst_element_get_static_pad(deinterlace, "sink"); + stream->post_sink = gst_element_get_static_pad(capssetter, "sink"); stream->post_src = gst_element_get_static_pad(vconv2, "src"); stream->flip = flip; + stream->box = box; } else if (!strcmp(name, "audio/x-raw")) { @@ -868,6 +1479,7 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent, { struct wg_parser *parser = gst_pad_get_element_private(pad); GstFlowReturn ret; + unsigned int i; GST_LOG("pad %p, offset %" G_GINT64_MODIFIER "u, size %u, buffer %p.", pad, offset, size, *buffer); @@ -889,6 +1501,14 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent, pthread_mutex_lock(&parser->mutex); + if (parser->draining) + { + gst_pad_peer_query(parser->my_src, gst_query_new_drain()); + parser->draining = false; + for (i = 0; i < parser->stream_count; i++) + pthread_cond_signal(&parser->streams[i]->event_cond); + } + assert(!parser->read_request.size); parser->read_request.buffer = *buffer; parser->read_request.offset = offset; @@ -901,7 +1521,16 @@ static GstFlowReturn src_getrange_cb(GstPad *pad, GstObject *parent, * read_thread() not running. */ while (!parser->read_request.done) + { pthread_cond_wait(&parser->read_done_cond, &parser->mutex); + if (parser->draining) + { + gst_pad_peer_query(parser->my_src, gst_query_new_drain()); + parser->draining = false; + for (i = 0; i < parser->stream_count; i++) + pthread_cond_signal(&parser->streams[i]->event_cond); + } + } *buffer = parser->read_request.buffer; ret = parser->read_request.ret; @@ -929,7 +1558,7 @@ static gboolean src_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) gst_query_set_duration(query, GST_FORMAT_PERCENT, GST_FORMAT_PERCENT_MAX); return TRUE; } - else if (format == GST_FORMAT_BYTES) + else if (format == GST_FORMAT_BYTES && parser->seekable) { gst_query_set_duration(query, GST_FORMAT_BYTES, parser->file_size); return TRUE; @@ -943,15 +1572,42 @@ static gboolean src_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) GST_WARNING("Cannot seek using format \"%s\".", gst_format_get_name(format)); return FALSE; } + if (!parser->seekable) + return FALSE; gst_query_set_seeking(query, GST_FORMAT_BYTES, 1, 0, parser->file_size); return TRUE; case GST_QUERY_SCHEDULING: - gst_query_set_scheduling(query, GST_SCHEDULING_FLAG_SEEKABLE, 1, -1, 0); + gst_query_set_scheduling(query, parser->seekable ? GST_SCHEDULING_FLAG_SEEKABLE : GST_SCHEDULING_FLAG_SEQUENTIAL, 1, -1, 0); gst_query_add_scheduling_mode(query, GST_PAD_MODE_PUSH); gst_query_add_scheduling_mode(query, GST_PAD_MODE_PULL); return TRUE; + case GST_QUERY_CAPS: + { + GstCaps *caps, *filter, *temp; + + gst_query_parse_caps(query, &filter); + + if (parser->input_format.major_type) + caps = wg_format_to_caps(&parser->input_format); + else + caps = gst_caps_new_any(); + if (!caps) + return FALSE; + + if (filter) + { + temp = gst_caps_intersect(caps, filter); + gst_caps_unref(caps); + caps = temp; + } + + gst_query_set_caps_result(query, caps); + gst_caps_unref(caps); + return TRUE; + } + default: GST_WARNING("Unhandled query type %s.", GST_QUERY_TYPE_NAME(query)); return FALSE; @@ -961,35 +1617,81 @@ static gboolean src_query_cb(GstPad *pad, GstObject *parent, GstQuery *query) static void *push_data(void *arg) { struct wg_parser *parser = arg; + ULONG alloc_size = 16384; + GstCaps *caps = NULL; + GstSegment *segment; GstBuffer *buffer; + unsigned int i; guint max_size; GST_DEBUG("Starting push thread."); - if (!(buffer = gst_buffer_new_allocate(NULL, 16384, NULL))) + if (parser->input_format.major_type) + caps = wg_format_to_caps(&parser->input_format); + + if (parser->input_format.major_type == WG_MAJOR_TYPE_VIDEO) { - GST_ERROR("Failed to allocate memory."); - return NULL; + GstVideoInfo info; + gst_video_info_from_caps(&info, caps); + alloc_size = info.size; } max_size = parser->stop_offset ? parser->stop_offset : parser->file_size; + gst_pad_push_event(parser->my_src, gst_event_new_stream_start("wg_stream")); + + if (caps) gst_pad_push_event(parser->my_src, gst_event_new_caps(caps)); + + segment = gst_segment_new(); + gst_segment_init(segment, GST_FORMAT_BYTES); + gst_pad_push_event(parser->my_src, gst_event_new_segment(segment)); + for (;;) { ULONG size; int ret; - if (parser->next_offset >= max_size) + if (parser->seekable && parser->next_offset >= max_size) break; - size = min(16384, max_size - parser->next_offset); + size = parser->seekable ? min(alloc_size, max_size - parser->next_offset) : alloc_size; - if ((ret = src_getrange_cb(parser->my_src, NULL, parser->next_offset, size, &buffer)) < 0) + buffer = NULL; + if ((ret = src_getrange_cb(parser->my_src, NULL, parser->next_offset, size, &buffer) < 0)) { + /* When we are in unseekable push mode, the pushing pad is responsible for handling flushing. */ + if (!parser->seekable && ret == GST_FLOW_FLUSHING) + { + gst_pad_push_event(parser->my_src, gst_event_new_seek(1.0f, + GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_NONE, 0, GST_SEEK_TYPE_NONE, 0)); + continue; + } + + if (!parser->seekable && ret == GST_FLOW_EOS) + { + gst_pad_push_event(parser->my_src, gst_event_new_eos()); + pthread_mutex_lock(&parser->mutex); + for (i = 0; i < parser->stream_count; i++) + { + if (!parser->streams[i]->enabled) + continue; + while (!parser->streams[i]->flushing && !parser->streams[i]->eos) + pthread_cond_wait(&parser->streams[i]->event_empty_cond, &parser->mutex); + parser->streams[i]->eos = false; + } + + pthread_mutex_unlock(&parser->mutex); + + segment = gst_segment_new(); + gst_segment_init(segment, GST_FORMAT_BYTES); + gst_pad_push_event(parser->my_src, gst_event_new_segment(segment)); + continue; + } + GST_ERROR("Failed to read data, ret %s.", gst_flow_get_name(ret)); break; } - parser->next_offset += size; + parser->next_offset += gst_buffer_get_size(buffer); buffer->duration = buffer->pts = -1; if ((ret = gst_pad_push(parser->my_src, buffer)) < 0) @@ -999,8 +1701,6 @@ static void *push_data(void *arg) } } - gst_buffer_unref(buffer); - gst_pad_push_event(parser->my_src, gst_event_new_eos()); GST_DEBUG("Stopping push thread."); @@ -1041,9 +1741,12 @@ static gboolean src_activate_mode_cb(GstPad *pad, GstObject *parent, GstPadMode GST_DEBUG("%s source pad for parser %p in %s mode.", activate ? "Activating" : "Deactivating", parser, gst_pad_mode_get_name(mode)); + parser->pull_mode = false; + switch (mode) { case GST_PAD_MODE_PULL: + parser->pull_mode = activate; return TRUE; case GST_PAD_MODE_PUSH: return activate_push(pad, activate); @@ -1053,9 +1756,12 @@ static gboolean src_activate_mode_cb(GstPad *pad, GstObject *parent, GstPadMode return FALSE; } +static BOOL decodebin_parser_init_gst(struct wg_parser *parser); + static GstBusSyncReply bus_handler_cb(GstBus *bus, GstMessage *msg, gpointer user) { struct wg_parser *parser = user; + const GstStructure *structure; gchar *dbg_info = NULL; GError *err = NULL; @@ -1090,6 +1796,21 @@ static GstBusSyncReply bus_handler_cb(GstBus *bus, GstMessage *msg, gpointer use pthread_cond_signal(&parser->init_cond); break; + case GST_MESSAGE_ELEMENT: + structure = gst_message_get_structure(msg); + if (gst_structure_has_name(structure, "missing-plugin")) + { + pthread_mutex_lock(&parser->mutex); + if (!parser->use_mediaconv && parser->init_gst == decodebin_parser_init_gst) + { + GST_WARNING("Autoplugged element failed to initialise, trying again with protonvideoconvert."); + parser->error = true; + pthread_cond_signal(&parser->init_cond); + } + pthread_mutex_unlock(&parser->mutex); + } + break; + default: break; } @@ -1105,6 +1826,7 @@ static gboolean src_perform_seek(struct wg_parser *parser, GstEvent *event) GstEvent *flush_event; GstSeekFlags flags; gint64 cur, stop; + GstSegment *seg; guint32 seqnum; gdouble rate; @@ -1138,7 +1860,12 @@ static gboolean src_perform_seek(struct wg_parser *parser, GstEvent *event) gst_event_set_seqnum(flush_event, seqnum); gst_pad_push_event(parser->my_src, flush_event); if (thread) + { gst_pad_set_active(parser->my_src, 1); + seg = gst_segment_new(); + gst_segment_init(seg, GST_FORMAT_BYTES); + gst_pad_push_event(parser->my_src, gst_event_new_segment(seg)); + } } return TRUE; @@ -1172,16 +1899,27 @@ static gboolean src_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) return ret; } -static NTSTATUS wg_parser_connect(void *args) +static gchar *query_language(GstPad *pad) +{ + GstTagList *tag_list; + GstEvent *tag_event; + gchar *ret = NULL; + + if ((tag_event = gst_pad_get_sticky_event(pad, GST_EVENT_TAG, 0))) + { + gst_event_parse_tag(tag_event, &tag_list); + gst_tag_list_get_string(tag_list, "language-code", &ret); + gst_event_unref(tag_event); + } + + return ret; +} + +static HRESULT wg_parser_connect_inner(struct wg_parser *parser) { - GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("quartz_src", + GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE("wine_src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); - const struct wg_parser_connect_params *params = args; - struct wg_parser *parser = params->parser; - unsigned int i; - int ret; - parser->file_size = params->file_size; parser->sink_connected = true; if (!parser->bus) @@ -1193,7 +1931,7 @@ static NTSTATUS wg_parser_connect(void *args) parser->container = gst_bin_new(NULL); gst_element_set_bus(parser->container, parser->bus); - parser->my_src = gst_pad_new_from_static_template(&src_template, "quartz-src"); + parser->my_src = gst_pad_new_from_static_template(&src_template, "wine-src"); gst_pad_set_getrange_function(parser->my_src, src_getrange_cb); gst_pad_set_query_function(parser->my_src, src_query_cb); gst_pad_set_activatemode_function(parser->my_src, src_activate_mode_cb); @@ -1204,14 +1942,41 @@ static NTSTATUS wg_parser_connect(void *args) parser->next_pull_offset = 0; parser->error = false; + return S_OK; +} + +static NTSTATUS wg_parser_connect(void *args) +{ + const struct wg_parser_connect_params *params = args; + struct wg_parser *parser = params->parser; + bool use_mediaconv = false; + unsigned int i; + HRESULT hr; + int ret; + + parser->seekable = true; + parser->file_size = params->file_size; + + if ((hr = wg_parser_connect_inner(parser))) + return hr; + if (!parser->init_gst(parser)) goto out; gst_element_set_state(parser->container, GST_STATE_PAUSED); + if (!parser->pull_mode) + gst_pad_set_active(parser->my_src, 1); ret = gst_element_get_state(parser->container, NULL, NULL, -1); + if (ret == GST_STATE_CHANGE_FAILURE) { - GST_ERROR("Failed to play stream.\n"); + if (!parser->use_mediaconv && parser->init_gst == decodebin_parser_init_gst && parser->pull_mode) + { + GST_WARNING("Failed to play media, trying again with protonvideoconvert."); + use_mediaconv = true; + } + else + GST_ERROR("Failed to play stream.\n"); goto out; } @@ -1221,6 +1986,8 @@ static NTSTATUS wg_parser_connect(void *args) pthread_cond_wait(&parser->init_cond, &parser->mutex); if (parser->error) { + if (!parser->use_mediaconv && parser->init_gst == decodebin_parser_init_gst) + use_mediaconv = true; pthread_mutex_unlock(&parser->mutex); goto out; } @@ -1293,13 +2060,7 @@ static NTSTATUS wg_parser_connect(void *args) pthread_cond_wait(&parser->init_cond, &parser->mutex); } } - - /* Now that we're fully initialized, enable the stream so that further - * samples get queued instead of being discarded. We don't actually need - * the samples (in particular, the frontend should seek before - * attempting to read anything), but we don't want to waste CPU time - * trying to decode them. */ - stream->enabled = true; + stream->language_code = query_language(stream->their_src); } pthread_mutex_unlock(&parser->mutex); @@ -1312,6 +2073,7 @@ out: gst_element_set_state(parser->container, GST_STATE_NULL); if (parser->their_sink) { + gst_pad_unlink(parser->my_src, parser->their_sink); gst_object_unref(parser->their_sink); parser->my_src = parser->their_sink = NULL; } @@ -1334,9 +2096,58 @@ out: pthread_mutex_unlock(&parser->mutex); pthread_cond_signal(&parser->read_cond); + if (use_mediaconv) + { + parser->use_mediaconv = true; + hr = wg_parser_connect(args); + parser->use_mediaconv = false; + return hr; + } + return E_FAIL; } +static NTSTATUS wg_parser_connect_unseekable(void *args) +{ + const struct wg_parser_connect_unseekable_params *params = args; + const struct wg_format *out_formats = params->out_formats; + const struct wg_format *in_format = params->in_format; + const struct wg_rect *apertures = params->apertures; + uint32_t stream_count = params->stream_count; + struct wg_parser *parser = params->parser; + unsigned int i; + HRESULT hr; + + parser->seekable = false; + /* since typefind is not available here, we must have an input_format */ + parser->input_format = *in_format; + + if ((hr = wg_parser_connect_inner(parser))) + return hr; + + parser->stop_offset = -1; + + parser->expected_stream_count = stream_count; + parser->streams = calloc(stream_count, sizeof(*parser->streams)); + + for (i = 0; i < stream_count; i++) + { + parser->streams[i] = calloc(1, sizeof(*parser->streams[i])); + parser->streams[i]->current_format = out_formats[i]; + if (apertures) + parser->streams[i]->aperture = apertures[i]; + parser->streams[i]->enabled = true; + } + + if (!parser->init_gst(parser)) + return E_FAIL; + + if (parser->stream_count < parser->expected_stream_count) + return E_FAIL; + + return S_OK; +} + static NTSTATUS wg_parser_disconnect(void *args) { struct wg_parser *parser = args; @@ -1344,14 +2155,20 @@ static NTSTATUS wg_parser_disconnect(void *args) /* Unblock all of our streams. */ pthread_mutex_lock(&parser->mutex); + parser->no_more_pads = true; + pthread_cond_signal(&parser->init_cond); for (i = 0; i < parser->stream_count; ++i) { parser->streams[i]->flushing = true; + pthread_cond_signal(&parser->streams[i]->event_cond); pthread_cond_signal(&parser->streams[i]->event_empty_cond); } pthread_mutex_unlock(&parser->mutex); gst_element_set_state(parser->container, GST_STATE_NULL); + if (!parser->pull_mode) + gst_pad_set_active(parser->my_src, 0); + gst_pad_unlink(parser->my_src, parser->their_sink); gst_object_unref(parser->my_src); gst_object_unref(parser->their_sink); parser->my_src = parser->their_sink = NULL; @@ -1383,6 +2200,9 @@ static BOOL decodebin_parser_init_gst(struct wg_parser *parser) if (!(element = create_element("decodebin", "base"))) return FALSE; + if (parser->input_format.major_type) + g_object_set(G_OBJECT(element), "sink-caps", wg_format_to_caps(&parser->input_format), NULL); + gst_bin_add(GST_BIN(parser->container), element); parser->decodebin = element; @@ -1396,6 +2216,7 @@ static BOOL decodebin_parser_init_gst(struct wg_parser *parser) g_signal_connect(element, "pad-added", G_CALLBACK(pad_added_cb), parser); g_signal_connect(element, "pad-removed", G_CALLBACK(pad_removed_cb), parser); g_signal_connect(element, "autoplug-select", G_CALLBACK(autoplug_select_cb), parser); + g_signal_connect(element, "autoplug-sort", G_CALLBACK(autoplug_sort_cb), parser); g_signal_connect(element, "no-more-pads", G_CALLBACK(no_more_pads_cb), parser); parser->their_sink = gst_element_get_static_pad(element, "sink"); @@ -1406,7 +2227,7 @@ static BOOL decodebin_parser_init_gst(struct wg_parser *parser) if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { - GST_ERROR("Failed to link pads, error %d.", ret); + GST_ERROR("Failed to link pads, error %d.\n", ret); return FALSE; } @@ -1435,7 +2256,7 @@ static BOOL avi_parser_init_gst(struct wg_parser *parser) if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { - GST_ERROR("Failed to link pads, error %d.", ret); + GST_ERROR("Failed to link pads, error %d.\n", ret); return FALSE; } @@ -1456,7 +2277,7 @@ static BOOL mpeg_audio_parser_init_gst(struct wg_parser *parser) parser->their_sink = gst_element_get_static_pad(element, "sink"); if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { - GST_ERROR("Failed to link sink pads, error %d.", ret); + GST_ERROR("Failed to link sink pads, error %d.\n", ret); return FALSE; } @@ -1466,7 +2287,7 @@ static BOOL mpeg_audio_parser_init_gst(struct wg_parser *parser) gst_object_ref(stream->their_src = gst_element_get_static_pad(element, "src")); if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) { - GST_ERROR("Failed to link source pads, error %d.", ret); + GST_ERROR("Failed to link source pads, error %d.\n", ret); return FALSE; } gst_pad_set_active(stream->my_sink, 1); @@ -1490,7 +2311,7 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser) parser->their_sink = gst_element_get_static_pad(element, "sink"); if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) { - GST_ERROR("Failed to link sink pads, error %d.", ret); + GST_ERROR("Failed to link sink pads, error %d.\n", ret); return FALSE; } @@ -1501,7 +2322,7 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser) gst_object_ref(stream->their_src); if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) { - GST_ERROR("Failed to link source pads, error %d.", ret); + GST_ERROR("Failed to link source pads, error %d.\n", ret); return FALSE; } gst_pad_set_active(stream->my_sink, 1); @@ -1511,6 +2332,119 @@ static BOOL wave_parser_init_gst(struct wg_parser *parser) return TRUE; } +static BOOL audio_convert_init_gst(struct wg_parser *parser) +{ + struct wg_parser_stream *stream; + GstElement *convert, *resampler; + int ret; + + if (parser->seekable) + return FALSE; + + if (parser->expected_stream_count != 1) + return FALSE; + + if (parser->input_format.major_type != WG_MAJOR_TYPE_AUDIO) + return FALSE; + + if (!(convert = create_element("audioconvert", "base"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), convert); + + if (!(resampler = create_element("audioresample", "base"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), resampler); + + gst_element_link(convert, resampler); + + parser->their_sink = gst_element_get_static_pad(convert, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.\n", ret); + return FALSE; + } + + if (!(stream = create_stream(parser))) + return FALSE; + + stream->their_src = gst_element_get_static_pad(resampler, "src"); + gst_object_ref(stream->their_src); + if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.\n", ret); + return FALSE; + } + gst_pad_set_active(stream->my_sink, 1); + + parser->no_more_pads = true; + + gst_element_set_state(parser->container, GST_STATE_PAUSED); + gst_pad_set_active(parser->my_src, 1); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); + if (ret == GST_STATE_CHANGE_FAILURE) + { + GST_ERROR("Failed to play stream.\n"); + return FALSE; + } + + return TRUE; +} + +static BOOL video_convert_init_gst(struct wg_parser *parser) +{ + struct wg_parser_stream *stream; + GstElement *convert; + int ret; + + if (parser->seekable) + return FALSE; + + if (parser->expected_stream_count != 1) + return FALSE; + + if (parser->input_format.major_type != WG_MAJOR_TYPE_VIDEO) + return FALSE; + + if (!(convert = create_element("videoconvert", "base"))) + return FALSE; + + gst_bin_add(GST_BIN(parser->container), convert); + + parser->their_sink = gst_element_get_static_pad(convert, "sink"); + if ((ret = gst_pad_link(parser->my_src, parser->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.\n", ret); + return FALSE; + } + + if (!(stream = create_stream(parser))) + return FALSE; + + stream->their_src = gst_element_get_static_pad(convert, "src"); + gst_object_ref(stream->their_src); + if ((ret = gst_pad_link(stream->their_src, stream->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.\n", ret); + return FALSE; + } + gst_pad_set_active(stream->my_sink, 1); + + parser->no_more_pads = true; + + gst_element_set_state(parser->container, GST_STATE_PAUSED); + gst_pad_set_active(parser->my_src, 1); + ret = gst_element_get_state(parser->container, NULL, NULL, -1); + if (ret == GST_STATE_CHANGE_FAILURE) + { + GST_ERROR("Failed to play stream.\n"); + return FALSE; + } + + return TRUE; +} + static void init_gstreamer_once(void) { char arg0[] = "wine"; @@ -1519,6 +2453,22 @@ static void init_gstreamer_once(void) int argc = ARRAY_SIZE(args) - 1; char **argv = args; GError *err; + const char *e; + + if ((e = getenv("WINE_GST_REGISTRY_DIR"))) + { + char gst_reg[PATH_MAX]; +#if defined(__x86_64__) + const char *arch = "/registry.x86_64.bin"; +#elif defined(__i386__) + const char *arch = "/registry.i386.bin"; +#else +#error Bad arch +#endif + strcpy(gst_reg, e); + strcat(gst_reg, arch); + setenv("GST_REGISTRY_1_0", gst_reg, 1); + } if (!gst_init_check(&argc, &argv, &err)) { @@ -1529,7 +2479,7 @@ static void init_gstreamer_once(void) GST_DEBUG_CATEGORY_INIT(wine, "WINE", GST_DEBUG_FG_RED, "Wine GStreamer support"); - GST_INFO("GStreamer library version %s; wine built with %d.%d.%d.", + GST_INFO("GStreamer library version %s; wine built with %d.%d.%d.\n", gst_version_string(), GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO); } @@ -1537,7 +2487,10 @@ bool init_gstreamer(void) { static pthread_once_t init_once = PTHREAD_ONCE_INIT; - return !pthread_once(&init_once, init_gstreamer_once); + if (pthread_once(&init_once, init_gstreamer_once)) + return false; + + return true; } static NTSTATUS wg_parser_create(void *args) @@ -1548,6 +2501,8 @@ static NTSTATUS wg_parser_create(void *args) [WG_PARSER_AVIDEMUX] = avi_parser_init_gst, [WG_PARSER_MPEGAUDIOPARSE] = mpeg_audio_parser_init_gst, [WG_PARSER_WAVPARSE] = wave_parser_init_gst, + [WG_PARSER_AUDIOCONV] = audio_convert_init_gst, + [WG_PARSER_VIDEOCONV] = video_convert_init_gst, }; struct wg_parser_create_params *params = args; @@ -1566,7 +2521,7 @@ static NTSTATUS wg_parser_create(void *args) parser->init_gst = init_funcs[params->type]; parser->unlimited_buffering = params->unlimited_buffering; - GST_DEBUG("Created winegstreamer parser %p.", parser); + GST_DEBUG("Created winegstreamer parser %p.\n", parser); params->parser = parser; return S_OK; } @@ -1597,6 +2552,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X(wg_parser_destroy), X(wg_parser_connect), + X(wg_parser_connect_unseekable), X(wg_parser_disconnect), X(wg_parser_get_next_read_offset), @@ -1615,8 +2571,11 @@ const unixlib_entry_t __wine_unix_call_funcs[] = X(wg_parser_stream_notify_qos), X(wg_parser_stream_get_duration), + X(wg_parser_stream_get_language), X(wg_parser_stream_seek), + X(wg_parser_stream_drain), + X(wg_transform_create), X(wg_transform_destroy), diff --git a/dlls/winegstreamer/wg_transform.c b/dlls/winegstreamer/wg_transform.c index 49c7bfaa927..b080894dbe4 100644 --- wine/dlls/winegstreamer/wg_transform.c +++ wine/dlls/winegstreamer/wg_transform.c @@ -32,98 +32,315 @@ #include #include -#include "ntstatus.h" -#define WIN32_NO_STATUS #include "winternl.h" +#include "dshow.h" #include "mferror.h" #include "unix_private.h" +#include "wine/list.h" + GST_DEBUG_CATEGORY_EXTERN(wine); #define GST_CAT_DEFAULT wine +struct wg_transform_sample +{ + struct list entry; + GstSample *sample; +}; + struct wg_transform { GstElement *container; GstPad *my_src, *my_sink; GstPad *their_sink, *their_src; - GstSegment segment; - GstBufferList *input; - guint input_max_length; - GstAtomicQueue *output_queue; - GstBuffer *output_buffer; + pthread_mutex_t mutex; + struct list samples; + GstCaps *sink_caps; }; +static GstCaps *wg_format_to_caps_xwma(const struct wg_encoded_format *format) +{ + GstBuffer *buffer; + GstCaps *caps; + + if (format->encoded_type == WG_ENCODED_TYPE_WMA) + { + caps = gst_caps_new_empty_simple("audio/x-wma"); + if (format->u.xwma.version) + gst_caps_set_simple(caps, "wmaversion", G_TYPE_INT, format->u.xwma.version, NULL); + } + else + { + caps = gst_caps_new_empty_simple("audio/x-xma"); + if (format->u.xwma.version) + gst_caps_set_simple(caps, "xmaversion", G_TYPE_INT, format->u.xwma.version, NULL); + } + + if (format->u.xwma.bitrate) + gst_caps_set_simple(caps, "bitrate", G_TYPE_INT, format->u.xwma.bitrate, NULL); + if (format->u.xwma.rate) + gst_caps_set_simple(caps, "rate", G_TYPE_INT, format->u.xwma.rate, NULL); + if (format->u.xwma.depth) + gst_caps_set_simple(caps, "depth", G_TYPE_INT, format->u.xwma.depth, NULL); + if (format->u.xwma.channels) + gst_caps_set_simple(caps, "channels", G_TYPE_INT, format->u.xwma.channels, NULL); + if (format->u.xwma.block_align) + gst_caps_set_simple(caps, "block_align", G_TYPE_INT, format->u.xwma.block_align, NULL); + + if (format->u.xwma.codec_data_len) + { + buffer = gst_buffer_new_and_alloc(format->u.xwma.codec_data_len); + gst_buffer_fill(buffer, 0, format->u.xwma.codec_data, format->u.xwma.codec_data_len); + gst_caps_set_simple(caps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); + gst_buffer_unref(buffer); + } + + return caps; +} + +static GstCaps *wg_format_to_caps_aac(const struct wg_encoded_format *format) +{ + const char *profile, *level, *stream_format; + GstBuffer *buffer; + GstCaps *caps; + + caps = gst_caps_new_empty_simple("audio/mpeg"); + gst_caps_set_simple(caps, "mpegversion", G_TYPE_INT, 4, NULL); + + switch (format->u.aac.payload_type) + { + case 0: stream_format = "raw"; break; + case 1: stream_format = "adts"; break; + case 2: stream_format = "adif"; break; + case 3: stream_format = "loas"; break; + default: stream_format = "raw"; break; + } + if (stream_format) + gst_caps_set_simple(caps, "stream-format", G_TYPE_STRING, stream_format, NULL); + + switch (format->u.aac.profile_level_indication) + { + case 0x29: profile = "lc"; level = "2"; break; + case 0x2A: profile = "lc"; level = "4"; break; + case 0x2B: profile = "lc"; level = "5"; break; + default: + GST_FIXME("Unrecognized profile-level-indication %u\n", format->u.aac.profile_level_indication); + /* fallthrough */ + case 0x00: case 0xFE: profile = level = NULL; break; /* unspecified */ + } + if (profile) + gst_caps_set_simple(caps, "profile", G_TYPE_STRING, profile, NULL); + if (level) + gst_caps_set_simple(caps, "level", G_TYPE_STRING, level, NULL); + + if (format->u.aac.codec_data_len) + { + buffer = gst_buffer_new_and_alloc(format->u.aac.codec_data_len); + gst_buffer_fill(buffer, 0, format->u.aac.codec_data, format->u.aac.codec_data_len); + gst_caps_set_simple(caps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); + gst_buffer_unref(buffer); + } + + return caps; +} + +static GstCaps *wg_format_to_caps_h264(const struct wg_encoded_format *format) +{ + const char *profile, *level; + GstCaps *caps; + + caps = gst_caps_new_empty_simple("video/x-h264"); + gst_caps_set_simple(caps, "stream-format", G_TYPE_STRING, "byte-stream", NULL); + gst_caps_set_simple(caps, "alignment", G_TYPE_STRING, "au", NULL); + + if (format->u.h264.width) + gst_caps_set_simple(caps, "width", G_TYPE_INT, format->u.h264.width, NULL); + if (format->u.h264.height) + gst_caps_set_simple(caps, "height", G_TYPE_INT, format->u.h264.height, NULL); + if (format->u.h264.fps_n || format->u.h264.fps_d) + gst_caps_set_simple(caps, "framerate", GST_TYPE_FRACTION, format->u.h264.fps_n, format->u.h264.fps_d, NULL); + + switch (format->u.h264.profile) + { + case /* eAVEncH264VProfile_Main */ 77: profile = "main"; break; + case /* eAVEncH264VProfile_High */ 100: profile = "high"; break; + case /* eAVEncH264VProfile_444 */ 244: profile = "high-4:4:4"; break; + default: + GST_ERROR("Unrecognized H.264 profile attribute %u.", format->u.h264.profile); + /* fallthrough */ + case 0: profile = NULL; + } + if (profile) + gst_caps_set_simple(caps, "profile", G_TYPE_STRING, profile, NULL); + + switch (format->u.h264.level) + { + case /* eAVEncH264VLevel1 */ 10: level = "1"; break; + case /* eAVEncH264VLevel1_1 */ 11: level = "1.1"; break; + case /* eAVEncH264VLevel1_2 */ 12: level = "1.2"; break; + case /* eAVEncH264VLevel1_3 */ 13: level = "1.3"; break; + case /* eAVEncH264VLevel2 */ 20: level = "2"; break; + case /* eAVEncH264VLevel2_1 */ 21: level = "2.1"; break; + case /* eAVEncH264VLevel2_2 */ 22: level = "2.2"; break; + case /* eAVEncH264VLevel3 */ 30: level = "3"; break; + case /* eAVEncH264VLevel3_1 */ 31: level = "3.1"; break; + case /* eAVEncH264VLevel3_2 */ 32: level = "3.2"; break; + case /* eAVEncH264VLevel4 */ 40: level = "4"; break; + case /* eAVEncH264VLevel4_1 */ 41: level = "4.1"; break; + case /* eAVEncH264VLevel4_2 */ 42: level = "4.2"; break; + case /* eAVEncH264VLevel5 */ 50: level = "5"; break; + case /* eAVEncH264VLevel5_1 */ 51: level = "5.1"; break; + case /* eAVEncH264VLevel5_2 */ 52: level = "5.2"; break; + default: + GST_ERROR("Unrecognized H.264 level attribute %u.", format->u.h264.level); + /* fallthrough */ + case 0: level = NULL; + } + if (level) + gst_caps_set_simple(caps, "level", G_TYPE_STRING, level, NULL); + + return caps; +} + +static GstCaps *wg_encoded_format_to_caps(const struct wg_encoded_format *format) +{ + switch (format->encoded_type) + { + case WG_ENCODED_TYPE_UNKNOWN: + return NULL; + case WG_ENCODED_TYPE_WMA: + case WG_ENCODED_TYPE_XMA: + return wg_format_to_caps_xwma(format); + case WG_ENCODED_TYPE_AAC: + return wg_format_to_caps_aac(format); + case WG_ENCODED_TYPE_H264: + return wg_format_to_caps_h264(format); + } + assert(0); + return NULL; +} + static GstFlowReturn transform_sink_chain_cb(GstPad *pad, GstObject *parent, GstBuffer *buffer) { struct wg_transform *transform = gst_pad_get_element_private(pad); + struct wg_transform_sample *sample; - GST_LOG("transform %p, buffer %p.", transform, buffer); + GST_INFO("transform %p, buffer %p.", transform, buffer); - gst_atomic_queue_push(transform->output_queue, buffer); + if (!(sample = malloc(sizeof(*sample)))) + GST_ERROR("Failed to allocate transform sample entry"); + else + { + pthread_mutex_lock(&transform->mutex); + if (!(sample->sample = gst_sample_new(buffer, transform->sink_caps, NULL, NULL))) + GST_ERROR("Failed to allocate transform sample"); + list_add_tail(&transform->samples, &sample->entry); + pthread_mutex_unlock(&transform->mutex); + } + gst_buffer_unref(buffer); return GST_FLOW_OK; } +static gboolean transform_sink_event_cb(GstPad *pad, GstObject *parent, GstEvent *event) +{ + struct wg_transform *transform = gst_pad_get_element_private(pad); + + GST_INFO("transform %p, type \"%s\".", transform, GST_EVENT_TYPE_NAME(event)); + + switch (event->type) + { + case GST_EVENT_CAPS: + { + GstCaps *caps; + gchar *str; + + gst_event_parse_caps(event, &caps); + str = gst_caps_to_string(caps); + GST_WARNING("Got caps \"%s\".", str); + g_free(str); + + pthread_mutex_lock(&transform->mutex); + gst_caps_unref(transform->sink_caps); + transform->sink_caps = gst_caps_ref(caps); + pthread_mutex_unlock(&transform->mutex); + break; + } + default: + GST_WARNING("Ignoring \"%s\" event.", GST_EVENT_TYPE_NAME(event)); + } + + gst_event_unref(event); + return TRUE; +} + NTSTATUS wg_transform_destroy(void *args) { struct wg_transform *transform = args; - GstBuffer *buffer; + struct wg_transform_sample *sample, *next; + + if (transform->container) + gst_element_set_state(transform->container, GST_STATE_NULL); - if (transform->input) - gst_buffer_list_unref(transform->input); + if (transform->their_src && transform->my_sink) + gst_pad_unlink(transform->their_src, transform->my_sink); + if (transform->their_sink && transform->my_src) + gst_pad_unlink(transform->my_src, transform->their_sink); - gst_element_set_state(transform->container, GST_STATE_NULL); + if (transform->their_sink) + g_object_unref(transform->their_sink); + if (transform->their_src) + g_object_unref(transform->their_src); - if (transform->output_buffer) - gst_buffer_unref(transform->output_buffer); - while ((buffer = gst_atomic_queue_pop(transform->output_queue))) - gst_buffer_unref(buffer); + if (transform->container) + g_object_unref(transform->container); - g_object_unref(transform->their_sink); - g_object_unref(transform->their_src); - g_object_unref(transform->container); - g_object_unref(transform->my_sink); - g_object_unref(transform->my_src); - gst_atomic_queue_unref(transform->output_queue); - free(transform); + if (transform->my_sink) + g_object_unref(transform->my_sink); + if (transform->my_src) + g_object_unref(transform->my_src); + + LIST_FOR_EACH_ENTRY_SAFE(sample, next, &transform->samples, struct wg_transform_sample, entry) + { + gst_sample_unref(sample->sample); + list_remove(&sample->entry); + free(sample); + } - return STATUS_SUCCESS; + free(transform); + return S_OK; } -static GstElement *transform_find_element(GstElementFactoryListType type, GstCaps *src_caps, GstCaps *sink_caps) +static GstElement *try_create_transform(GstCaps *src_caps, GstCaps *sink_caps) { GstElement *element = NULL; GList *tmp, *transforms; - const gchar *name; + gchar *type; - if (!(transforms = gst_element_factory_list_get_elements(type, GST_RANK_MARGINAL))) - goto done; + transforms = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_ANY, + GST_RANK_MARGINAL); tmp = gst_element_factory_list_filter(transforms, src_caps, GST_PAD_SINK, FALSE); gst_plugin_feature_list_free(transforms); - if (!(transforms = tmp)) - goto done; + transforms = tmp; tmp = gst_element_factory_list_filter(transforms, sink_caps, GST_PAD_SRC, FALSE); gst_plugin_feature_list_free(transforms); - if (!(transforms = tmp)) - goto done; + transforms = tmp; transforms = g_list_sort(transforms, gst_plugin_feature_rank_compare_func); for (tmp = transforms; tmp != NULL && element == NULL; tmp = tmp->next) { - name = gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(tmp->data)); - if (!(element = gst_element_factory_create(GST_ELEMENT_FACTORY(tmp->data), NULL))) - GST_WARNING("Failed to create %s element.", name); + type = gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(tmp->data)); + element = gst_element_factory_create(GST_ELEMENT_FACTORY(tmp->data), NULL); + if (!element) + GST_WARNING("Failed to create %s element.", type); } gst_plugin_feature_list_free(transforms); -done: if (element) - { - GST_DEBUG("Created %s element %p.", name, element); - } + GST_INFO("Created %s element %p.", type, element); else { gchar *src_str = gst_caps_to_string(src_caps), *sink_str = gst_caps_to_string(sink_caps); @@ -139,304 +356,275 @@ static bool transform_append_element(struct wg_transform *transform, GstElement GstElement **first, GstElement **last) { gchar *name = gst_element_get_name(element); - bool success = false; - if (!gst_bin_add(GST_BIN(transform->container), element) || - (*last && !gst_element_link(*last, element))) + if (!gst_bin_add(GST_BIN(transform->container), element)) { - GST_ERROR("Failed to link %s element.", name); + GST_ERROR("Failed to add %s element to bin.", name); + g_free(name); + return false; } - else + + if (*last && !gst_element_link(*last, element)) { - GST_DEBUG("Linked %s element %p.", name, element); - if (!*first) - *first = element; - *last = element; - success = true; + GST_ERROR("Failed to link %s element.", name); + g_free(name); + return false; } + GST_INFO("Created %s element %p.", name, element); g_free(name); - return success; + + if (!*first) + *first = element; + + *last = element; + return true; } NTSTATUS wg_transform_create(void *args) { struct wg_transform_create_params *params = args; - GstCaps *raw_caps = NULL, *src_caps = NULL, *sink_caps = NULL; + struct wg_encoded_format input_format = *params->input_format; struct wg_format output_format = *params->output_format; - struct wg_format input_format = *params->input_format; GstElement *first = NULL, *last = NULL, *element; - NTSTATUS status = STATUS_UNSUCCESSFUL; - GstPadTemplate *template = NULL; + GstCaps *raw_caps, *src_caps, *sink_caps; struct wg_transform *transform; + GstPadTemplate *template; const gchar *media_type; - GstEvent *event; + GstSegment *segment; + int i, ret; if (!init_gstreamer()) - return STATUS_UNSUCCESSFUL; + return E_FAIL; if (!(transform = calloc(1, sizeof(*transform)))) - return STATUS_NO_MEMORY; - if (!(transform->container = gst_bin_new("wg_transform"))) - goto out; - if (!(transform->input = gst_buffer_list_new())) - goto out; - if (!(transform->output_queue = gst_atomic_queue_new(8))) - goto out; - transform->input_max_length = 1; - - if (!(src_caps = wg_format_to_caps(&input_format))) - goto out; - if (!(template = gst_pad_template_new("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps))) - goto out; + return E_OUTOFMEMORY; + + list_init(&transform->samples); + + src_caps = wg_encoded_format_to_caps(&input_format); + assert(src_caps); + sink_caps = wg_format_to_caps(&output_format); + assert(sink_caps); + media_type = gst_structure_get_name(gst_caps_get_structure(sink_caps, 0)); + raw_caps = gst_caps_new_empty_simple(media_type); + assert(raw_caps); + + transform->sink_caps = gst_caps_copy(sink_caps); + transform->container = gst_bin_new("wg_transform"); + assert(transform->container); + + if (!(element = try_create_transform(src_caps, raw_caps)) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + + switch (output_format.major_type) + { + case WG_MAJOR_TYPE_AUDIO: + if (!(element = create_element("audioconvert", "base")) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + if (!(element = create_element("audioresample", "base")) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + break; + case WG_MAJOR_TYPE_VIDEO: + if (!(element = create_element("videoconvert", "base")) || + !transform_append_element(transform, element, &first, &last)) + goto failed; + for (i = 0; i < gst_caps_get_size(sink_caps); ++i) + gst_structure_remove_fields(gst_caps_get_structure(sink_caps, i), + "width", "height", NULL); + break; + default: + assert(0); + break; + } + + if (!(transform->their_sink = gst_element_get_static_pad(first, "sink"))) + { + GST_ERROR("Failed to find target sink pad."); + goto failed; + } + if (!(transform->their_src = gst_element_get_static_pad(last, "src"))) + { + GST_ERROR("Failed to find target src pad."); + goto failed; + } + + template = gst_pad_template_new("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps); + assert(template); transform->my_src = gst_pad_new_from_template(template, "src"); g_object_unref(template); - if (!transform->my_src) - goto out; + assert(transform->my_src); - if (!(sink_caps = wg_format_to_caps(&output_format))) - goto out; - if (!(template = gst_pad_template_new("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps))) - goto out; + template = gst_pad_template_new("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps); + assert(template); transform->my_sink = gst_pad_new_from_template(template, "sink"); g_object_unref(template); - if (!transform->my_sink) - goto out; + assert(transform->my_sink); gst_pad_set_element_private(transform->my_sink, transform); + gst_pad_set_event_function(transform->my_sink, transform_sink_event_cb); gst_pad_set_chain_function(transform->my_sink, transform_sink_chain_cb); - /* Since we append conversion elements, we don't want to filter decoders - * based on the actual output caps now. Matching decoders with the - * raw output media type should be enough. - */ - media_type = gst_structure_get_name(gst_caps_get_structure(sink_caps, 0)); - if (!(raw_caps = gst_caps_new_empty_simple(media_type))) - goto out; - - switch (input_format.major_type) - { - case WG_MAJOR_TYPE_H264: - /* Call of Duty: Black Ops 3 doesn't care about the ProcessInput/ProcessOutput - * return values, it calls them in a specific order and expects the decoder - * transform to be able to queue its input buffers. We need to use a buffer list - * to match its expectations. - */ - transform->input_max_length = 16; - /* fallthrough */ - case WG_MAJOR_TYPE_WMA: - if (!(element = transform_find_element(GST_ELEMENT_FACTORY_TYPE_DECODER, src_caps, raw_caps)) - || !transform_append_element(transform, element, &first, &last)) - { - gst_caps_unref(raw_caps); - goto out; - } - break; - - case WG_MAJOR_TYPE_AUDIO: - case WG_MAJOR_TYPE_VIDEO: - case WG_MAJOR_TYPE_UNKNOWN: - GST_FIXME("Format %u not implemented!", input_format.major_type); - gst_caps_unref(raw_caps); - goto out; + if ((ret = gst_pad_link(transform->my_src, transform->their_sink)) < 0) + { + GST_ERROR("Failed to link sink pads, error %d.", ret); + goto failed; + } + if ((ret = gst_pad_link(transform->their_src, transform->my_sink)) < 0) + { + GST_ERROR("Failed to link source pads, error %d.", ret); + goto failed; } - gst_caps_unref(raw_caps); + if (!(ret = gst_pad_set_active(transform->my_sink, 1))) + GST_WARNING("Failed to activate my_sink."); + if (!(ret = gst_pad_set_active(transform->my_src, 1))) + GST_WARNING("Failed to activate my_src."); - switch (output_format.major_type) + gst_element_set_state(transform->container, GST_STATE_PAUSED); + ret = gst_element_get_state(transform->container, NULL, NULL, -1); + if (ret == GST_STATE_CHANGE_FAILURE) { - case WG_MAJOR_TYPE_AUDIO: - /* The MF audio decoder transforms allow decoding to various formats - * as well as resampling the audio at the same time, whereas - * GStreamer decoder plugins usually only support decoding to a - * single format and at the original rate. - * - * The WMA decoder transform also has output samples interleaved on - * Windows, whereas GStreamer avdec_wmav2 output uses - * non-interleaved format. - */ - if (!(element = create_element("audioconvert", "base")) - || !transform_append_element(transform, element, &first, &last)) - goto out; - if (!(element = create_element("audioresample", "base")) - || !transform_append_element(transform, element, &first, &last)) - goto out; - break; - - case WG_MAJOR_TYPE_VIDEO: - break; - - case WG_MAJOR_TYPE_H264: - case WG_MAJOR_TYPE_WMA: - case WG_MAJOR_TYPE_UNKNOWN: - GST_FIXME("Format %u not implemented!", output_format.major_type); - goto out; + GST_ERROR("Failed to play stream.\n"); + goto failed; } - if (!(transform->their_sink = gst_element_get_static_pad(first, "sink"))) - goto out; - if (!(transform->their_src = gst_element_get_static_pad(last, "src"))) - goto out; - if (gst_pad_link(transform->my_src, transform->their_sink) < 0) - goto out; - if (gst_pad_link(transform->their_src, transform->my_sink) < 0) - goto out; - if (!gst_pad_set_active(transform->my_sink, 1)) - goto out; - if (!gst_pad_set_active(transform->my_src, 1)) - goto out; + if (!gst_pad_push_event(transform->my_src, gst_event_new_stream_start("stream"))) + { + GST_ERROR("Failed to send stream-start."); + goto failed; + } - gst_element_set_state(transform->container, GST_STATE_PAUSED); - if (!gst_element_get_state(transform->container, NULL, NULL, -1)) - goto out; - - if (!(event = gst_event_new_stream_start("stream")) - || !gst_pad_push_event(transform->my_src, event)) - goto out; - if (!(event = gst_event_new_caps(src_caps)) - || !gst_pad_push_event(transform->my_src, event)) - goto out; - - /* We need to use GST_FORMAT_TIME here because it's the only format - * some elements such avdec_wmav2 correctly support. */ - gst_segment_init(&transform->segment, GST_FORMAT_TIME); - transform->segment.start = 0; - transform->segment.stop = -1; - if (!(event = gst_event_new_segment(&transform->segment)) - || !gst_pad_push_event(transform->my_src, event)) - goto out; + if (!gst_pad_push_event(transform->my_src, gst_event_new_caps(src_caps)) || + !gst_pad_has_current_caps(transform->their_sink)) + { + GST_ERROR("Failed to set stream caps."); + goto failed; + } - gst_caps_unref(sink_caps); - gst_caps_unref(src_caps); + segment = gst_segment_new(); + gst_segment_init(segment, GST_FORMAT_TIME); + segment->start = 0; + segment->stop = -1; + ret = gst_pad_push_event(transform->my_src, gst_event_new_segment(segment)); + gst_segment_free(segment); + if (!ret) + { + GST_ERROR("Failed to start new segment."); + goto failed; + } GST_INFO("Created winegstreamer transform %p.", transform); params->transform = transform; - return STATUS_SUCCESS; -out: - if (transform->their_sink) - gst_object_unref(transform->their_sink); - if (transform->their_src) - gst_object_unref(transform->their_src); - if (transform->my_sink) - gst_object_unref(transform->my_sink); - if (sink_caps) - gst_caps_unref(sink_caps); - if (transform->my_src) - gst_object_unref(transform->my_src); - if (src_caps) - gst_caps_unref(src_caps); - if (transform->output_queue) - gst_atomic_queue_unref(transform->output_queue); - if (transform->input) - gst_buffer_list_unref(transform->input); - if (transform->container) - { - gst_element_set_state(transform->container, GST_STATE_NULL); - gst_object_unref(transform->container); - } - free(transform); - GST_ERROR("Failed to create winegstreamer transform."); - return status; +failed: + gst_caps_unref(raw_caps); + gst_caps_unref(src_caps); + gst_caps_unref(sink_caps); + + if (params->transform) + return S_OK; + + wg_transform_destroy(transform); + return E_FAIL; } NTSTATUS wg_transform_push_data(void *args) { struct wg_transform_push_data_params *params = args; struct wg_transform *transform = params->transform; - struct wg_sample *sample = params->sample; GstBuffer *buffer; - guint length; + GstFlowReturn ret; - length = gst_buffer_list_length(transform->input); - if (length >= transform->input_max_length) - { - GST_INFO("Refusing %u bytes, %u buffers already queued", sample->size, length); - params->result = MF_E_NOTACCEPTING; - return STATUS_SUCCESS; - } + buffer = gst_buffer_new_and_alloc(params->size); + gst_buffer_fill(buffer, 0, params->data, params->size); - if (!(buffer = gst_buffer_new_and_alloc(sample->size))) + ret = gst_pad_push(transform->my_src, buffer); + if (ret) { - GST_ERROR("Failed to allocate input buffer"); - return STATUS_NO_MEMORY; + GST_ERROR("Failed to push buffer %d", ret); + return MF_E_NOTACCEPTING; } - gst_buffer_fill(buffer, 0, sample->data, sample->size); - gst_buffer_list_insert(transform->input, -1, buffer); - GST_INFO("Copied %u bytes from sample %p to input buffer list", sample->size, sample); - params->result = S_OK; - return STATUS_SUCCESS; + GST_INFO("Pushed %u bytes", params->size); + return S_OK; } -static NTSTATUS read_transform_output_data(GstBuffer *buffer, struct wg_sample *sample) +NTSTATUS wg_transform_read_data(void *args) { + struct wg_transform_read_data_params *params = args; + struct wg_transform *transform = params->transform; + struct wg_sample *read_sample = params->sample; + struct wg_transform_sample *transform_sample; + struct wg_format buffer_format; + bool broken_timestamp = false; + GstBuffer *buffer; + struct list *head; GstMapInfo info; + GstCaps *caps; - if (!gst_buffer_map(buffer, &info, GST_MAP_READ)) + pthread_mutex_lock(&transform->mutex); + if (!(head = list_head(&transform->samples))) { - GST_ERROR("Failed to map buffer %p", buffer); - return STATUS_UNSUCCESSFUL; + pthread_mutex_unlock(&transform->mutex); + return MF_E_TRANSFORM_NEED_MORE_INPUT; } - if (sample->max_size >= info.size) - sample->size = info.size; - else + transform_sample = LIST_ENTRY(head, struct wg_transform_sample, entry); + buffer = gst_sample_get_buffer(transform_sample->sample); + + if (read_sample->format) { - sample->flags |= WG_SAMPLE_FLAG_INCOMPLETE; - sample->size = sample->max_size; + if (!(caps = gst_sample_get_caps(transform_sample->sample))) + caps = transform->sink_caps; + wg_format_from_caps(&buffer_format, caps); + if (!wg_format_compare(read_sample->format, &buffer_format)) + { + *read_sample->format = buffer_format; + read_sample->size = gst_buffer_get_size(buffer); + pthread_mutex_unlock(&transform->mutex); + return MF_E_TRANSFORM_STREAM_CHANGE; + } + + if (buffer_format.major_type == WG_MAJOR_TYPE_VIDEO + && buffer_format.u.video.fps_n <= 1 + && buffer_format.u.video.fps_d <= 1) + broken_timestamp = true; } - memcpy(sample->data, info.data, sample->size); + gst_buffer_map(buffer, &info, GST_MAP_READ); + if (read_sample->size > info.size) + read_sample->size = info.size; + memcpy(read_sample->data, info.data, read_sample->size); gst_buffer_unmap(buffer, &info); - gst_buffer_resize(buffer, sample->size, -1); - - GST_INFO("Copied %u bytes, sample %p, flags %#x", sample->size, sample, sample->flags); - return STATUS_SUCCESS; -} - -NTSTATUS wg_transform_read_data(void *args) -{ - struct wg_transform_read_data_params *params = args; - struct wg_transform *transform = params->transform; - struct wg_sample *sample = params->sample; - GstBufferList *input = transform->input; - GstFlowReturn ret; - NTSTATUS status; - if (!gst_buffer_list_length(transform->input)) - GST_DEBUG("Not input buffer queued"); - else if (!(transform->input = gst_buffer_list_new())) + if (buffer->pts != GST_CLOCK_TIME_NONE && !broken_timestamp) { - GST_ERROR("Failed to allocate new input queue"); - return STATUS_NO_MEMORY; + read_sample->flags |= WG_SAMPLE_FLAG_HAS_PTS; + read_sample->pts = buffer->pts / 100; } - else if ((ret = gst_pad_push_list(transform->my_src, input))) + if (buffer->duration != GST_CLOCK_TIME_NONE && !broken_timestamp) { - GST_ERROR("Failed to push transform input, error %d", ret); - return STATUS_UNSUCCESSFUL; + read_sample->flags |= WG_SAMPLE_FLAG_HAS_DURATION; + read_sample->duration = buffer->duration / 100; } - if (!transform->output_buffer && !(transform->output_buffer = gst_atomic_queue_pop(transform->output_queue))) + if (info.size > read_sample->size) { - sample->size = 0; - params->result = MF_E_TRANSFORM_NEED_MORE_INPUT; - GST_INFO("Cannot read %u bytes, no output available", sample->max_size); - return STATUS_SUCCESS; + read_sample->flags |= WG_SAMPLE_FLAG_INCOMPLETE; + gst_buffer_resize(buffer, read_sample->size, -1); } - - if ((status = read_transform_output_data(transform->output_buffer, sample))) - { - sample->size = 0; - return status; - } - - if (!(sample->flags & WG_SAMPLE_FLAG_INCOMPLETE)) + else { - gst_buffer_unref(transform->output_buffer); - transform->output_buffer = NULL; + gst_sample_unref(transform_sample->sample); + list_remove(&transform_sample->entry); + free(transform_sample); } + pthread_mutex_unlock(&transform->mutex); - params->result = S_OK; - return STATUS_SUCCESS; + GST_INFO("Read %u bytes, flags %#x", read_sample->size, read_sample->flags); + return S_OK; } diff --git a/dlls/winegstreamer/winegstreamer_classes.idl b/dlls/winegstreamer/winegstreamer_classes.idl index 347ee906a52..5762430a5cd 100644 --- wine/dlls/winegstreamer/winegstreamer_classes.idl +++ wine/dlls/winegstreamer/winegstreamer_classes.idl @@ -78,4 +78,16 @@ coclass CWMADecMediaObject {}; threading(both), uuid(62ce7e72-4c71-4d20-b15d-452831a87d9d) ] -coclass CMSH264DecoderMFT {} +coclass CMSH264DecoderMFT { } + +[ + threading(both), + uuid(32d186a7-218f-4c75-8876-dd77273a8999) +] +coclass CMSAACDecMFT { } + +[ + threading(both), + uuid(98230571-0087-4204-b020-3282538e57d3) +] +coclass CColorConvertDMO { } diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c index 947b3307a3a..a7ad6a6c45c 100644 --- wine/dlls/winegstreamer/wm_asyncreader.c +++ wine/dlls/winegstreamer/wm_asyncreader.c @@ -66,7 +66,7 @@ static void open_stream(struct async_reader *reader, IWMReaderCallback *callback if (FAILED(hr = IWMReaderCallback_QueryInterface(callback, &IID_IWMReaderCallbackAdvanced, (void **)&reader->reader.callback_advanced))) reader->reader.callback_advanced = NULL; - TRACE("Querying for IWMReaderCallbackAdvanced returned %#lx.\n", hr); + TRACE("Querying for IWMReaderCallbackAdvanced returned %#x.\n", hr); } static DWORD WINAPI stream_thread(void *arg) @@ -133,7 +133,7 @@ static DWORD WINAPI stream_thread(void *arg) else hr = IWMReaderCallback_OnSample(callback, stream_number - 1, pts, duration, flags, sample, reader->context); - TRACE("Callback returned %#lx.\n", hr); + TRACE("Callback returned %#x.\n", hr); INSSBuffer_Release(sample); } else if (hr == NS_E_NO_MORE_SAMPLES) @@ -158,7 +158,7 @@ static DWORD WINAPI stream_thread(void *arg) } else { - ERR("Failed to get sample, hr %#lx.\n", hr); + ERR("Failed to get sample, hr %#x.\n", hr); LeaveCriticalSection(&reader->stream_cs); return 0; } @@ -271,7 +271,7 @@ static HRESULT WINAPI WMReader_GetOutputProps(IWMReader *iface, DWORD output, IW { struct async_reader *reader = impl_from_IWMReader(iface); - TRACE("reader %p, output %lu, props %p.\n", reader, output, props); + TRACE("reader %p, output %u, props %p.\n", reader, output, props); return wm_reader_get_output_props(&reader->reader, output, props); } @@ -280,7 +280,7 @@ static HRESULT WINAPI WMReader_SetOutputProps(IWMReader *iface, DWORD output, IW { struct async_reader *reader = impl_from_IWMReader(iface); - TRACE("reader %p, output %lu, props %p.\n", reader, output, props); + TRACE("reader %p, output %u, props %p.\n", reader, output, props); return wm_reader_set_output_props(&reader->reader, output, props); } @@ -289,7 +289,7 @@ static HRESULT WINAPI WMReader_GetOutputFormatCount(IWMReader *iface, DWORD outp { struct async_reader *reader = impl_from_IWMReader(iface); - TRACE("reader %p, output %lu, count %p.\n", reader, output, count); + TRACE("reader %p, output %u, count %p.\n", reader, output, count); return wm_reader_get_output_format_count(&reader->reader, output, count); } @@ -299,7 +299,7 @@ static HRESULT WINAPI WMReader_GetOutputFormat(IWMReader *iface, DWORD output, { struct async_reader *reader = impl_from_IWMReader(iface); - TRACE("reader %p, output %lu, index %lu, props %p.\n", reader, output, index, props); + TRACE("reader %p, output %u, index %u, props %p.\n", reader, output, index, props); return wm_reader_get_output_format(&reader->reader, output, index, props); } @@ -530,17 +530,15 @@ static HRESULT WINAPI WMReaderAdvanced_SetAllocateForOutput(IWMReaderAdvanced6 * { struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); - TRACE("reader %p, output %lu, allocate %d.\n", reader, output, allocate); + TRACE("reader %p, output %u, allocate %d.\n", reader, output, allocate); return wm_reader_set_allocate_for_output(&reader->reader, output, allocate); } static HRESULT WINAPI WMReaderAdvanced_GetAllocateForOutput(IWMReaderAdvanced6 *iface, DWORD output_num, BOOL *allocate) { - struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); - - FIXME("reader %p, output %lu, allocate %p, stub!\n", reader, output_num, allocate); - + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, output_num, allocate); return E_NOTIMPL; } @@ -578,7 +576,7 @@ static HRESULT WINAPI WMReaderAdvanced_SetClientInfo(IWMReaderAdvanced6 *iface, static HRESULT WINAPI WMReaderAdvanced_GetMaxOutputSampleSize(IWMReaderAdvanced6 *iface, DWORD output, DWORD *max) { struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); - FIXME("(%p)->(%lu %p)\n", This, output, max); + FIXME("(%p)->(%d %p)\n", This, output, max); return E_NOTIMPL; } @@ -661,7 +659,7 @@ static HRESULT WINAPI WMReaderAdvanced2_GetOutputSetting(IWMReaderAdvanced6 *ifa const WCHAR *name, WMT_ATTR_DATATYPE *type, BYTE *value, WORD *length) { struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); - FIXME("(%p)->(%lu %s %p %p %p)\n", This, output_num, debugstr_w(name), type, value, length); + FIXME("(%p)->(%d %s %p %p %p)\n", This, output_num, debugstr_w(name), type, value, length); return E_NOTIMPL; } @@ -669,7 +667,7 @@ static HRESULT WINAPI WMReaderAdvanced2_SetOutputSetting(IWMReaderAdvanced6 *ifa const WCHAR *name, WMT_ATTR_DATATYPE type, const BYTE *value, WORD length) { struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); - FIXME("(%p)->(%lu %s %#x %p %u)\n", This, output_num, debugstr_w(name), type, value, length); + FIXME("(%p)->(%d %s %d %p %d)\n", This, output_num, debugstr_w(name), type, value, length); return E_NOTIMPL; } @@ -736,18 +734,15 @@ static HRESULT WINAPI WMReaderAdvanced3_StartAtPosition(IWMReaderAdvanced6 *ifac static HRESULT WINAPI WMReaderAdvanced4_GetLanguageCount(IWMReaderAdvanced6 *iface, DWORD output_num, WORD *language_count) { struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); - FIXME("(%p)->(%lu %p)\n", This, output_num, language_count); + FIXME("(%p)->(%d %p)\n", This, output_num, language_count); return E_NOTIMPL; } static HRESULT WINAPI WMReaderAdvanced4_GetLanguage(IWMReaderAdvanced6 *iface, DWORD output_num, WORD language, WCHAR *language_string, WORD *language_string_len) { - struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); - - FIXME("reader %p, output %lu, language %#x, language_string %p, language_string_len %p, stub!\n", - reader, output_num, language, language_string, language_string_len); - + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %x %p %p)\n", This, output_num, language, language_string, language_string_len); return E_NOTIMPL; } @@ -803,21 +798,17 @@ static HRESULT WINAPI WMReaderAdvanced4_GetURL(IWMReaderAdvanced6 *iface, WCHAR static HRESULT WINAPI WMReaderAdvanced5_SetPlayerHook(IWMReaderAdvanced6 *iface, DWORD output_num, IWMPlayerHook *hook) { - struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); - - FIXME("reader %p, output %lu, hook %p, stub!\n", reader, output_num, hook); - + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%d %p)\n", This, output_num, hook); return E_NOTIMPL; } static HRESULT WINAPI WMReaderAdvanced6_SetProtectStreamSamples(IWMReaderAdvanced6 *iface, BYTE *cert, DWORD cert_size, DWORD cert_type, DWORD flags, BYTE *initialization_vector, DWORD *initialization_vector_size) { - struct async_reader *reader = impl_from_IWMReaderAdvanced6(iface); - - FIXME("reader %p, cert %p, cert_size %lu, cert_type %#lx, flags %#lx, vector %p, vector_size %p, stub!\n", - reader, cert, cert_size, cert_type, flags, initialization_vector, initialization_vector_size); - + struct async_reader *This = impl_from_IWMReaderAdvanced6(iface); + FIXME("(%p)->(%p %d %d %x %p %p)\n", This, cert, cert_size, cert_type, flags, initialization_vector, + initialization_vector_size); return E_NOTIMPL; } @@ -900,18 +891,18 @@ static ULONG WINAPI reader_accl_Release(IWMReaderAccelerator *iface) static HRESULT WINAPI reader_accl_GetCodecInterface(IWMReaderAccelerator *iface, DWORD output, REFIID riid, void **codec) { - struct async_reader *reader = impl_from_IWMReaderAccelerator(iface); + struct async_reader *This = impl_from_IWMReaderAccelerator(iface); - FIXME("reader %p, output %lu, iid %s, codec %p, stub!\n", reader, output, debugstr_guid(riid), codec); + FIXME("%p, %d, %s, %p\n", This, output, debugstr_guid(riid), codec); return E_NOTIMPL; } static HRESULT WINAPI reader_accl_Notify(IWMReaderAccelerator *iface, DWORD output, WM_MEDIA_TYPE *subtype) { - struct async_reader *reader = impl_from_IWMReaderAccelerator(iface); + struct async_reader *This = impl_from_IWMReaderAccelerator(iface); - FIXME("reader %p, output %lu, subtype %p, stub!\n", reader, output, subtype); + FIXME("%p, %d, %p\n", This, output, subtype); return E_NOTIMPL; } @@ -969,13 +960,11 @@ static HRESULT WINAPI networkconfig_GetUDPPortRanges(IWMReaderNetworkConfig2 *if return E_NOTIMPL; } -static HRESULT WINAPI networkconfig_SetUDPPortRanges(IWMReaderNetworkConfig2 *iface, - WM_PORT_NUMBER_RANGE *ranges, DWORD count) +static HRESULT WINAPI networkconfig_SetUDPPortRanges(IWMReaderNetworkConfig2 *iface, WM_PORT_NUMBER_RANGE *array, + DWORD ranges) { - struct async_reader *reader = impl_from_IWMReaderNetworkConfig2(iface); - - FIXME("reader %p, ranges %p, count %lu.\n", reader, ranges, count); - + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %p, %u\n", This, array, ranges); return E_NOTIMPL; } @@ -1022,10 +1011,8 @@ static HRESULT WINAPI networkconfig_GetProxyPort(IWMReaderNetworkConfig2 *iface, static HRESULT WINAPI networkconfig_SetProxyPort(IWMReaderNetworkConfig2 *iface, const WCHAR *protocol, DWORD port) { - struct async_reader *reader = impl_from_IWMReaderNetworkConfig2(iface); - - FIXME("reader %p, protocol %s, port %lu, stub!\n", reader, debugstr_w(protocol), port); - + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %s, %u\n", This, debugstr_w(protocol), port); return E_NOTIMPL; } @@ -1149,10 +1136,8 @@ static HRESULT WINAPI networkconfig_GetConnectionBandwidth(IWMReaderNetworkConfi static HRESULT WINAPI networkconfig_SetConnectionBandwidth(IWMReaderNetworkConfig2 *iface, DWORD bandwidth) { - struct async_reader *reader = impl_from_IWMReaderNetworkConfig2(iface); - - FIXME("reader %p, bandwidth %lu, stub!\n", reader, bandwidth); - + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u\n", This, bandwidth); return E_NOTIMPL; } @@ -1166,10 +1151,8 @@ static HRESULT WINAPI networkconfig_GetNumProtocolsSupported(IWMReaderNetworkCon static HRESULT WINAPI networkconfig_GetSupportedProtocolName(IWMReaderNetworkConfig2 *iface, DWORD protocol_num, WCHAR *protocol, DWORD *size) { - struct async_reader *reader = impl_from_IWMReaderNetworkConfig2(iface); - - FIXME("reader %p, index %lu, protocol %p, size %p, stub!\n", reader, protocol_num, protocol, size); - + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u, %p %p\n", This, protocol_num, protocol, size); return E_NOTIMPL; } @@ -1183,10 +1166,8 @@ static HRESULT WINAPI networkconfig_AddLoggingUrl(IWMReaderNetworkConfig2 *iface static HRESULT WINAPI networkconfig_GetLoggingUrl(IWMReaderNetworkConfig2 *iface, DWORD index, WCHAR *url, DWORD *size) { - struct async_reader *reader = impl_from_IWMReaderNetworkConfig2(iface); - - FIXME("reader %p, index %lu, url %p, size %p, stub!\n", reader, index, url, size); - + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u, %p, %p\n", This, index, url, size); return E_NOTIMPL; } @@ -1257,10 +1238,8 @@ static HRESULT WINAPI networkconfig_GetAutoReconnectLimit(IWMReaderNetworkConfig static HRESULT WINAPI networkconfig_SetAutoReconnectLimit(IWMReaderNetworkConfig2 *iface, DWORD limit) { - struct async_reader *reader = impl_from_IWMReaderNetworkConfig2(iface); - - FIXME("reader %p, limit %lu, stub!\n", reader, limit); - + struct async_reader *This = impl_from_IWMReaderNetworkConfig2(iface); + FIXME("%p, %u\n", This, limit); return E_NOTIMPL; } @@ -1391,10 +1370,8 @@ static HRESULT WINAPI readclock_SetTimer(IWMReaderStreamClock *iface, QWORD when static HRESULT WINAPI readclock_KillTimer(IWMReaderStreamClock *iface, DWORD id) { - struct async_reader *reader = impl_from_IWMReaderStreamClock(iface); - - FIXME("reader %p, id %lu, stub!\n", reader, id); - + struct async_reader *This = impl_from_IWMReaderStreamClock(iface); + FIXME("%p, %d\n", This, id); return E_NOTIMPL; } @@ -1433,10 +1410,8 @@ static ULONG WINAPI negotiation_Release(IWMReaderTypeNegotiation *iface) static HRESULT WINAPI negotiation_TryOutputProps(IWMReaderTypeNegotiation *iface, DWORD output, IWMOutputMediaProps *props) { - struct async_reader *reader = impl_from_IWMReaderTypeNegotiation(iface); - - FIXME("reader %p, output %lu, props %p, stub!\n", reader, output, props); - + struct async_reader *This = impl_from_IWMReaderTypeNegotiation(iface); + FIXME("%p, %d, %p\n", This, output, props); return E_NOTIMPL; } @@ -1481,31 +1456,25 @@ static HRESULT WINAPI refclock_GetTime(IReferenceClock *iface, REFERENCE_TIME *t static HRESULT WINAPI refclock_AdviseTime(IReferenceClock *iface, REFERENCE_TIME basetime, REFERENCE_TIME streamtime, HEVENT event, DWORD_PTR *cookie) { - struct async_reader *reader = impl_from_IReferenceClock(iface); - - FIXME("reader %p, basetime %s, streamtime %s, event %#Ix, cookie %p, stub!\n", - reader, debugstr_time(basetime), debugstr_time(streamtime), event, cookie); - + struct async_reader *This = impl_from_IReferenceClock(iface); + FIXME("%p, %s, %s, %lu, %p\n", This, wine_dbgstr_longlong(basetime), + wine_dbgstr_longlong(streamtime), event, cookie); return E_NOTIMPL; } static HRESULT WINAPI refclock_AdvisePeriodic(IReferenceClock *iface, REFERENCE_TIME starttime, REFERENCE_TIME period, HSEMAPHORE semaphore, DWORD_PTR *cookie) { - struct async_reader *reader = impl_from_IReferenceClock(iface); - - FIXME("reader %p, starttime %s, period %s, semaphore %#Ix, cookie %p, stub!\n", - reader, debugstr_time(starttime), debugstr_time(period), semaphore, cookie); - + struct async_reader *This = impl_from_IReferenceClock(iface); + FIXME("%p, %s, %s, %lu, %p\n", This, wine_dbgstr_longlong(starttime), + wine_dbgstr_longlong(period), semaphore, cookie); return E_NOTIMPL; } static HRESULT WINAPI refclock_Unadvise(IReferenceClock *iface, DWORD_PTR cookie) { - struct async_reader *reader = impl_from_IReferenceClock(iface); - - FIXME("reader %p, cookie %Iu, stub!\n", reader, cookie); - + struct async_reader *This = impl_from_IReferenceClock(iface); + FIXME("%p, %lu\n", This, cookie); return E_NOTIMPL; } diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c index 57ba8633a84..cb667c957b4 100644 --- wine/dlls/winegstreamer/wm_reader.c +++ wine/dlls/winegstreamer/wm_reader.c @@ -24,7 +24,7 @@ static struct wm_stream *get_stream_by_output_number(struct wm_reader *reader, D { if (output < reader->stream_count) return &reader->streams[output]; - WARN("Invalid output number %lu.\n", output); + WARN("Invalid output number %u.\n", output); return NULL; } @@ -65,7 +65,7 @@ static ULONG WINAPI output_props_AddRef(IWMOutputMediaProps *iface) struct output_props *props = impl_from_IWMOutputMediaProps(iface); ULONG refcount = InterlockedIncrement(&props->refcount); - TRACE("%p increasing refcount to %lu.\n", props, refcount); + TRACE("%p increasing refcount to %u.\n", props, refcount); return refcount; } @@ -75,7 +75,7 @@ static ULONG WINAPI output_props_Release(IWMOutputMediaProps *iface) struct output_props *props = impl_from_IWMOutputMediaProps(iface); ULONG refcount = InterlockedDecrement(&props->refcount); - TRACE("%p decreasing refcount to %lu.\n", props, refcount); + TRACE("%p decreasing refcount to %u.\n", props, refcount); if (!refcount) free(props); @@ -209,7 +209,7 @@ static ULONG WINAPI buffer_AddRef(INSSBuffer *iface) struct buffer *buffer = impl_from_INSSBuffer(iface); ULONG refcount = InterlockedIncrement(&buffer->refcount); - TRACE("%p increasing refcount to %lu.\n", buffer, refcount); + TRACE("%p increasing refcount to %u.\n", buffer, refcount); return refcount; } @@ -219,7 +219,7 @@ static ULONG WINAPI buffer_Release(INSSBuffer *iface) struct buffer *buffer = impl_from_INSSBuffer(iface); ULONG refcount = InterlockedDecrement(&buffer->refcount); - TRACE("%p decreasing refcount to %lu.\n", buffer, refcount); + TRACE("%p decreasing refcount to %u.\n", buffer, refcount); if (!refcount) free(buffer); @@ -237,7 +237,7 @@ static HRESULT WINAPI buffer_SetLength(INSSBuffer *iface, DWORD size) { struct buffer *buffer = impl_from_INSSBuffer(iface); - TRACE("iface %p, size %lu.\n", buffer, size); + TRACE("iface %p, size %u.\n", buffer, size); if (size > buffer->capacity) return E_INVALIDARG; @@ -329,7 +329,7 @@ static ULONG WINAPI stream_config_AddRef(IWMStreamConfig *iface) struct stream_config *config = impl_from_IWMStreamConfig(iface); ULONG refcount = InterlockedIncrement(&config->refcount); - TRACE("%p increasing refcount to %lu.\n", config, refcount); + TRACE("%p increasing refcount to %u.\n", config, refcount); return refcount; } @@ -339,7 +339,7 @@ static ULONG WINAPI stream_config_Release(IWMStreamConfig *iface) struct stream_config *config = impl_from_IWMStreamConfig(iface); ULONG refcount = InterlockedDecrement(&config->refcount); - TRACE("%p decreasing refcount to %lu.\n", config, refcount); + TRACE("%p decreasing refcount to %u.\n", config, refcount); if (!refcount) { @@ -422,7 +422,7 @@ static HRESULT WINAPI stream_config_GetBitrate(IWMStreamConfig *iface, DWORD *bi static HRESULT WINAPI stream_config_SetBitrate(IWMStreamConfig *iface, DWORD bitrate) { - FIXME("iface %p, bitrate %lu, stub!\n", iface, bitrate); + FIXME("iface %p, bitrate %u, stub!\n", iface, bitrate); return E_NOTIMPL; } @@ -434,7 +434,7 @@ static HRESULT WINAPI stream_config_GetBufferWindow(IWMStreamConfig *iface, DWOR static HRESULT WINAPI stream_config_SetBufferWindow(IWMStreamConfig *iface, DWORD window) { - FIXME("iface %p, window %lu, stub!\n", iface, window); + FIXME("iface %p, window %u, stub!\n", iface, window); return E_NOTIMPL; } @@ -573,7 +573,7 @@ static DWORD CALLBACK read_thread(void *arg) if (!size) { - wg_parser_push_data(reader->wg_parser, data, 0); + wg_parser_push_data(reader->wg_parser, WG_READ_SUCCESS, data, 0); continue; } @@ -591,8 +591,8 @@ static DWORD CALLBACK read_thread(void *arg) if (!SetFilePointerEx(file, large_offset, NULL, FILE_BEGIN) || !ReadFile(file, data, size, &ret_size, NULL)) { - ERR("Failed to read %u bytes at offset %I64u, error %lu.\n", size, offset, GetLastError()); - wg_parser_push_data(reader->wg_parser, NULL, 0); + ERR("Failed to read %u bytes at offset %I64u, error %u.\n", size, offset, GetLastError()); + wg_parser_push_data(reader->wg_parser, WG_READ_FAILURE, NULL, 0); continue; } } @@ -602,15 +602,15 @@ static DWORD CALLBACK read_thread(void *arg) hr = IStream_Read(stream, data, size, &ret_size); if (FAILED(hr)) { - ERR("Failed to read %u bytes at offset %I64u, hr %#lx.\n", size, offset, hr); - wg_parser_push_data(reader->wg_parser, NULL, 0); + ERR("Failed to read %u bytes at offset %I64u, hr %#x.\n", size, offset, hr); + wg_parser_push_data(reader->wg_parser, WG_READ_FAILURE, NULL, 0); continue; } } if (ret_size != size) - ERR("Unexpected short read: requested %u bytes, got %lu.\n", size, ret_size); - wg_parser_push_data(reader->wg_parser, data, ret_size); + ERR("Unexpected short read: requested %u bytes, got %u.\n", size, ret_size); + wg_parser_push_data(reader->wg_parser, WG_READ_SUCCESS, data, ret_size); } free(data); @@ -674,7 +674,7 @@ static ULONG WINAPI profile_AddRef(IWMProfile3 *iface) struct wm_reader *reader = impl_from_IWMProfile3(iface); ULONG refcount = InterlockedIncrement(&reader->refcount); - TRACE("%p increasing refcount to %lu.\n", reader, refcount); + TRACE("%p increasing refcount to %u.\n", reader, refcount); return refcount; } @@ -684,7 +684,7 @@ static ULONG WINAPI profile_Release(IWMProfile3 *iface) struct wm_reader *reader = impl_from_IWMProfile3(iface); ULONG refcount = InterlockedDecrement(&reader->refcount); - TRACE("%p decreasing refcount to %lu.\n", reader, refcount); + TRACE("%p decreasing refcount to %u.\n", reader, refcount); if (!refcount) reader->ops->destroy(reader); @@ -742,14 +742,14 @@ static HRESULT WINAPI profile_GetStream(IWMProfile3 *iface, DWORD index, IWMStre struct wm_reader *reader = impl_from_IWMProfile3(iface); struct stream_config *object; - TRACE("reader %p, index %lu, config %p.\n", reader, index, config); + TRACE("reader %p, index %u, config %p.\n", reader, index, config); EnterCriticalSection(&reader->cs); if (index >= reader->stream_count) { LeaveCriticalSection(&reader->cs); - WARN("Index %lu exceeds stream count %u; returning E_INVALIDARG.\n", index, reader->stream_count); + WARN("Index %u exceeds stream count %u; returning E_INVALIDARG.\n", index, reader->stream_count); return E_INVALIDARG; } @@ -816,7 +816,7 @@ static HRESULT WINAPI profile_GetMutualExclusionCount(IWMProfile3 *iface, DWORD static HRESULT WINAPI profile_GetMutualExclusion(IWMProfile3 *iface, DWORD index, IWMMutualExclusion **excl) { - FIXME("iface %p, index %lu, excl %p, stub!\n", iface, index, excl); + FIXME("iface %p, index %u, excl %p, stub!\n", iface, index, excl); return E_NOTIMPL; } @@ -864,7 +864,7 @@ static HRESULT WINAPI profile_GetBandwidthSharingCount(IWMProfile3 *iface, DWORD static HRESULT WINAPI profile_GetBandwidthSharing(IWMProfile3 *iface, DWORD index, IWMBandwidthSharing **sharing) { - FIXME("iface %p, index %lu, sharing %p, stub!\n", iface, index, sharing); + FIXME("iface %p, index %d, sharing %p, stub!\n", iface, index, sharing); return E_NOTIMPL; } @@ -1131,7 +1131,7 @@ static HRESULT WINAPI header_info_GetCodecInfoCount(IWMHeaderInfo3 *iface, DWORD static HRESULT WINAPI header_info_GetCodecInfo(IWMHeaderInfo3 *iface, DWORD index, WORD *name_len, WCHAR *name, WORD *desc_len, WCHAR *desc, WMT_CODEC_INFO_TYPE *type, WORD *size, BYTE *info) { - FIXME("iface %p, index %lu, name_len %p, name %p, desc_len %p, desc %p, type %p, size %p, info %p, stub!\n", + FIXME("iface %p, index %u, name_len %p, name %p, desc_len %p, desc %p, type %p, size %p, info %p, stub!\n", iface, index, name_len, name, desc_len, desc, type, size, info); return E_NOTIMPL; } @@ -1163,7 +1163,7 @@ static HRESULT WINAPI header_info_GetAttributeByIndexEx(IWMHeaderInfo3 *iface, static HRESULT WINAPI header_info_ModifyAttribute(IWMHeaderInfo3 *iface, WORD stream_number, WORD index, WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD size) { - FIXME("iface %p, stream_number %u, index %u, type %#x, lang_index %u, value %p, size %lu, stub!\n", + FIXME("iface %p, stream_number %u, index %u, type %#x, lang_index %u, value %p, size %u, stub!\n", iface, stream_number, index, type, lang_index, value, size); return E_NOTIMPL; } @@ -1172,7 +1172,7 @@ static HRESULT WINAPI header_info_AddAttribute(IWMHeaderInfo3 *iface, WORD stream_number, const WCHAR *name, WORD *index, WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD size) { - FIXME("iface %p, stream_number %u, name %s, index %p, type %#x, lang_index %u, value %p, size %lu, stub!\n", + FIXME("iface %p, stream_number %u, name %s, index %p, type %#x, lang_index %u, value %p, size %u, stub!\n", iface, stream_number, debugstr_w(name), index, type, lang_index, value, size); return E_NOTIMPL; } @@ -1309,7 +1309,7 @@ static HRESULT WINAPI packet_size_GetMaxPacketSize(IWMPacketSize2 *iface, DWORD static HRESULT WINAPI packet_size_SetMaxPacketSize(IWMPacketSize2 *iface, DWORD size) { - FIXME("iface %p, size %lu, stub!\n", iface, size); + FIXME("iface %p, size %u, stub!\n", iface, size); return E_NOTIMPL; } @@ -1321,7 +1321,7 @@ static HRESULT WINAPI packet_size_GetMinPacketSize(IWMPacketSize2 *iface, DWORD static HRESULT WINAPI packet_size_SetMinPacketSize(IWMPacketSize2 *iface, DWORD size) { - FIXME("iface %p, size %lu, stub!\n", iface, size); + FIXME("iface %p, size %u, stub!\n", iface, size); return E_NOTIMPL; } @@ -1365,14 +1365,14 @@ static ULONG WINAPI playlist_Release(IWMReaderPlaylistBurn *iface) static HRESULT WINAPI playlist_InitPlaylistBurn(IWMReaderPlaylistBurn *iface, DWORD count, const WCHAR **filenames, IWMStatusCallback *callback, void *context) { - FIXME("iface %p, count %lu, filenames %p, callback %p, context %p, stub!\n", + FIXME("iface %p, count %u, filenames %p, callback %p, context %p, stub!\n", iface, count, filenames, callback, context); return E_NOTIMPL; } static HRESULT WINAPI playlist_GetInitResults(IWMReaderPlaylistBurn *iface, DWORD count, HRESULT *hrs) { - FIXME("iface %p, count %lu, hrs %p, stub!\n", iface, count, hrs); + FIXME("iface %p, count %u, hrs %p, stub!\n", iface, count, hrs); return E_NOTIMPL; } @@ -1384,7 +1384,7 @@ static HRESULT WINAPI playlist_Cancel(IWMReaderPlaylistBurn *iface) static HRESULT WINAPI playlist_EndPlaylistBurn(IWMReaderPlaylistBurn *iface, HRESULT hr) { - FIXME("iface %p, hr %#lx, stub!\n", iface, hr); + FIXME("iface %p, hr %#x, stub!\n", iface, hr); return E_NOTIMPL; } @@ -1455,7 +1455,7 @@ static HRESULT init_stream(struct wm_reader *reader, QWORD file_size) HRESULT hr; WORD i; - if (!(wg_parser = wg_parser_create(WG_PARSER_DECODEBIN, false))) + if (!(wg_parser = wg_parser_create(WG_PARSER_DECODEBIN, true))) return E_OUTOFMEMORY; reader->wg_parser = wg_parser; @@ -1468,7 +1468,7 @@ static HRESULT init_stream(struct wm_reader *reader, QWORD file_size) if (FAILED(hr = wg_parser_connect(reader->wg_parser, file_size))) { - ERR("Failed to connect parser, hr %#lx.\n", hr); + ERR("Failed to connect parser, hr %#x.\n", hr); goto out_shutdown_thread; } @@ -1484,7 +1484,7 @@ static HRESULT init_stream(struct wm_reader *reader, QWORD file_size) { struct wm_stream *stream = &reader->streams[i]; - stream->wg_stream = wg_parser_get_stream(reader->wg_parser, i); + stream->wg_stream = wg_parser_get_stream(reader->wg_parser, reader->stream_count - i - 1); stream->reader = reader; stream->index = i; stream->selection = WMT_ON; @@ -1508,8 +1508,19 @@ static HRESULT init_stream(struct wm_reader *reader, QWORD file_size) * Shadowgrounds provides wmv3 video and assumes that the initial * video type will be BGR. */ stream->format.u.video.format = WG_VIDEO_FORMAT_BGR; + { + /* HACK: Persona 4 Golden tries to read compressed samples, and + * then autoplug them via quartz to a filter that only accepts + * BGRx. This is not trivial to implement. Return BGRx from the + * wmvcore reader for now. */ + + const char *id = getenv("SteamGameId"); + + if (id && !strcmp(id, "1113000")) + stream->format.u.video.format = WG_VIDEO_FORMAT_BGRx; + } } - wg_parser_stream_enable(stream->wg_stream, &stream->format); + wg_parser_stream_enable(stream->wg_stream, &stream->format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); } /* We probably discarded events because streams weren't enabled yet. @@ -1542,7 +1553,7 @@ HRESULT wm_reader_open_stream(struct wm_reader *reader, IStream *stream) if (FAILED(hr = IStream_Stat(stream, &stat, STATFLAG_NONAME))) { - ERR("Failed to stat stream, hr %#lx.\n", hr); + ERR("Failed to stat stream, hr %#x.\n", hr); return hr; } @@ -1568,13 +1579,13 @@ HRESULT wm_reader_open_file(struct wm_reader *reader, const WCHAR *filename) if ((file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) { - ERR("Failed to open %s, error %lu.\n", debugstr_w(filename), GetLastError()); + ERR("Failed to open %s, error %u.\n", debugstr_w(filename), GetLastError()); return HRESULT_FROM_WIN32(GetLastError()); } if (!GetFileSizeEx(file, &size)) { - ERR("Failed to get the size of %s, error %lu.\n", debugstr_w(filename), GetLastError()); + ERR("Failed to get the size of %s, error %u.\n", debugstr_w(filename), GetLastError()); CloseHandle(file); return HRESULT_FROM_WIN32(GetLastError()); } @@ -1686,10 +1697,6 @@ HRESULT wm_reader_get_output_format_count(struct wm_reader *reader, DWORD output *count = ARRAY_SIZE(video_formats); break; - case WG_MAJOR_TYPE_WMA: - case WG_MAJOR_TYPE_H264: - FIXME("Format %u not implemented!\n", format.major_type); - /* fallthrough */ case WG_MAJOR_TYPE_AUDIO: case WG_MAJOR_TYPE_UNKNOWN: *count = 1; @@ -1736,10 +1743,6 @@ HRESULT wm_reader_get_output_format(struct wm_reader *reader, DWORD output, format.u.audio.format = WG_AUDIO_FORMAT_S16LE; break; - case WG_MAJOR_TYPE_WMA: - case WG_MAJOR_TYPE_H264: - FIXME("Format %u not implemented!\n", format.major_type); - break; case WG_MAJOR_TYPE_UNKNOWN: break; } @@ -1783,7 +1786,7 @@ HRESULT wm_reader_set_output_props(struct wm_reader *reader, DWORD output, } stream->format = format; - wg_parser_stream_enable(stream->wg_stream, &format); + wg_parser_stream_enable(stream->wg_stream, &format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); /* Re-decode any buffers that might have been generated with the old format. * @@ -1815,10 +1818,6 @@ static const char *get_major_type_string(enum wg_major_type type) return "video"; case WG_MAJOR_TYPE_UNKNOWN: return "unknown"; - case WG_MAJOR_TYPE_WMA: - return "wma"; - case WG_MAJOR_TYPE_H264: - return "h264"; } assert(0); return NULL; @@ -1925,7 +1924,7 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number if (FAILED(hr = IWMReaderCallbackAdvanced_AllocateForStream(callback_advanced, stream->index + 1, wg_buffer.size, &sample, NULL))) { - ERR("Failed to allocate stream sample of %u bytes, hr %#lx.\n", wg_buffer.size, hr); + ERR("Failed to allocate stream sample of %u bytes, hr %#x.\n", wg_buffer.size, hr); wg_parser_stream_release_buffer(wg_stream); return hr; } @@ -1935,7 +1934,7 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number if (FAILED(hr = IWMReaderCallbackAdvanced_AllocateForOutput(callback_advanced, stream->index, wg_buffer.size, &sample, NULL))) { - ERR("Failed to allocate output sample of %u bytes, hr %#lx.\n", wg_buffer.size, hr); + ERR("Failed to allocate output sample of %u bytes, hr %#x.\n", wg_buffer.size, hr); wg_parser_stream_release_buffer(wg_stream); return hr; } @@ -1960,11 +1959,11 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number } if (FAILED(hr = INSSBuffer_GetBufferAndLength(sample, &data, &size))) - ERR("Failed to get data pointer, hr %#lx.\n", hr); + ERR("Failed to get data pointer, hr %#x.\n", hr); if (FAILED(hr = INSSBuffer_GetMaxLength(sample, &capacity))) - ERR("Failed to get capacity, hr %#lx.\n", hr); + ERR("Failed to get capacity, hr %#x.\n", hr); if (wg_buffer.size > capacity) - ERR("Returned capacity %lu is less than requested capacity %u.\n", capacity, wg_buffer.size); + ERR("Returned capacity %u is less than requested capacity %u.\n", capacity, wg_buffer.size); if (!wg_parser_stream_copy_buffer(wg_stream, data, 0, wg_buffer.size)) { @@ -1974,7 +1973,7 @@ HRESULT wm_reader_get_stream_sample(struct wm_reader *reader, WORD stream_number } if (FAILED(hr = INSSBuffer_SetLength(sample, wg_buffer.size))) - ERR("Failed to set size %u, hr %#lx.\n", wg_buffer.size, hr); + ERR("Failed to set size %u, hr %#x.\n", wg_buffer.size, hr); wg_parser_stream_release_buffer(wg_stream); @@ -2050,7 +2049,7 @@ HRESULT wm_reader_set_streams_selected(struct wm_reader *reader, WORD count, FIXME("Ignoring selection %#x for stream %u; treating as enabled.\n", selections[i], stream_numbers[i]); TRACE("Enabling stream %u.\n", stream_numbers[i]); - wg_parser_stream_enable(stream->wg_stream, &stream->format); + wg_parser_stream_enable(stream->wg_stream, &stream->format, NULL, STREAM_ENABLE_FLAG_FLIP_RGB); } } diff --git a/dlls/winegstreamer/wm_syncreader.c b/dlls/winegstreamer/wm_syncreader.c index c7cccd52c4f..b03aa69d030 100644 --- wine/dlls/winegstreamer/wm_syncreader.c +++ wine/dlls/winegstreamer/wm_syncreader.c @@ -65,7 +65,7 @@ static HRESULT WINAPI WMSyncReader_Close(IWMSyncReader2 *iface) static HRESULT WINAPI WMSyncReader_GetMaxOutputSampleSize(IWMSyncReader2 *iface, DWORD output, DWORD *max) { struct sync_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%lu %p): stub!\n", This, output, max); + FIXME("(%p)->(%d %p): stub!\n", This, output, max); return E_NOTIMPL; } @@ -119,7 +119,7 @@ static HRESULT WINAPI WMSyncReader_GetOutputFormat(IWMSyncReader2 *iface, { struct sync_reader *reader = impl_from_IWMSyncReader2(iface); - TRACE("reader %p, output %lu, index %lu, props %p.\n", reader, output, index, props); + TRACE("reader %p, output %u, index %u, props %p.\n", reader, output, index, props); return wm_reader_get_output_format(&reader->reader, output, index, props); } @@ -128,7 +128,7 @@ static HRESULT WINAPI WMSyncReader_GetOutputFormatCount(IWMSyncReader2 *iface, D { struct sync_reader *reader = impl_from_IWMSyncReader2(iface); - TRACE("reader %p, output %lu, count %p.\n", reader, output, count); + TRACE("reader %p, output %u, count %p.\n", reader, output, count); return wm_reader_get_output_format_count(&reader->reader, output, count); } @@ -149,7 +149,7 @@ static HRESULT WINAPI WMSyncReader_GetOutputProps(IWMSyncReader2 *iface, { struct sync_reader *reader = impl_from_IWMSyncReader2(iface); - TRACE("reader %p, output %lu, props %p.\n", reader, output, props); + TRACE("reader %p, output %u, props %p.\n", reader, output, props); return wm_reader_get_output_props(&reader->reader, output, props); } @@ -158,7 +158,7 @@ static HRESULT WINAPI WMSyncReader_GetOutputSetting(IWMSyncReader2 *iface, DWORD WMT_ATTR_DATATYPE *type, BYTE *value, WORD *length) { struct sync_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%lu %s %p %p %p): stub!\n", This, output_num, debugstr_w(name), type, value, length); + FIXME("(%p)->(%u %s %p %p %p): stub!\n", This, output_num, debugstr_w(name), type, value, length); return E_NOTIMPL; } @@ -174,7 +174,7 @@ static HRESULT WINAPI WMSyncReader_GetStreamNumberForOutput(IWMSyncReader2 *ifac { struct sync_reader *reader = impl_from_IWMSyncReader2(iface); - TRACE("reader %p, output %lu, stream_number %p.\n", reader, output, stream_number); + TRACE("reader %p, output %u, stream_number %p.\n", reader, output, stream_number); *stream_number = output + 1; return S_OK; @@ -212,7 +212,7 @@ static HRESULT WINAPI WMSyncReader_SetOutputProps(IWMSyncReader2 *iface, DWORD o { struct sync_reader *reader = impl_from_IWMSyncReader2(iface); - TRACE("reader %p, output %lu, props %p.\n", reader, output, props); + TRACE("reader %p, output %u, props %p.\n", reader, output, props); return wm_reader_set_output_props(&reader->reader, output, props); } @@ -222,7 +222,7 @@ static HRESULT WINAPI WMSyncReader_SetOutputSetting(IWMSyncReader2 *iface, DWORD { struct sync_reader *reader = impl_from_IWMSyncReader2(iface); - TRACE("reader %p, output %lu, name %s, type %#x, value %p, size %u.\n", + TRACE("reader %p, output %u, name %s, type %#x, value %p, size %u.\n", reader, output, debugstr_w(name), type, value, size); if (!wcscmp(name, L"VideoSampleDurations")) @@ -230,16 +230,6 @@ static HRESULT WINAPI WMSyncReader_SetOutputSetting(IWMSyncReader2 *iface, DWORD FIXME("Ignoring VideoSampleDurations setting.\n"); return S_OK; } - if (!wcscmp(name, L"EnableDiscreteOutput")) - { - FIXME("Ignoring EnableDiscreteOutput setting.\n"); - return S_OK; - } - if (!wcscmp(name, L"SpeakerConfig")) - { - FIXME("Ignoring SpeakerConfig setting.\n"); - return S_OK; - } else { FIXME("Unknown setting %s; returning E_NOTIMPL.\n", debugstr_w(name)); @@ -305,28 +295,28 @@ static HRESULT WINAPI WMSyncReader2_SetRangeByFrameEx(IWMSyncReader2 *iface, WOR static HRESULT WINAPI WMSyncReader2_SetAllocateForOutput(IWMSyncReader2 *iface, DWORD output_num, IWMReaderAllocatorEx *allocator) { struct sync_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%lu %p): stub!\n", This, output_num, allocator); + FIXME("(%p)->(%d %p): stub!\n", This, output_num, allocator); return E_NOTIMPL; } static HRESULT WINAPI WMSyncReader2_GetAllocateForOutput(IWMSyncReader2 *iface, DWORD output_num, IWMReaderAllocatorEx **allocator) { struct sync_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%lu %p): stub!\n", This, output_num, allocator); + FIXME("(%p)->(%d %p): stub!\n", This, output_num, allocator); return E_NOTIMPL; } static HRESULT WINAPI WMSyncReader2_SetAllocateForStream(IWMSyncReader2 *iface, DWORD stream_num, IWMReaderAllocatorEx *allocator) { struct sync_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%lu %p): stub!\n", This, stream_num, allocator); + FIXME("(%p)->(%d %p): stub!\n", This, stream_num, allocator); return E_NOTIMPL; } static HRESULT WINAPI WMSyncReader2_GetAllocateForStream(IWMSyncReader2 *iface, DWORD stream_num, IWMReaderAllocatorEx **allocator) { struct sync_reader *This = impl_from_IWMSyncReader2(iface); - FIXME("(%p)->(%lu %p): stub!\n", This, stream_num, allocator); + FIXME("(%p)->(%d %p): stub!\n", This, stream_num, allocator); return E_NOTIMPL; } diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c index 57b0f204f9e..021d0beb935 100644 --- wine/dlls/winegstreamer/wma_decoder.c +++ wine/dlls/winegstreamer/wma_decoder.c @@ -1,4 +1,4 @@ -/* WMA Decoder DMO / MF Transform +/* WMA Decoder Transform * * Copyright 2022 RĂ©mi Bernon for CodeWeavers * @@ -28,16 +28,19 @@ #include "wine/debug.h" #include "wine/heap.h" -WINE_DEFAULT_DEBUG_CHANNEL(wmadec); +WINE_DEFAULT_DEBUG_CHANNEL(mfplat); -static const GUID *const wma_decoder_input_types[] = +DEFINE_MEDIATYPE_GUID(MFAudioFormat_XMAudio2, 0x0166); + +static const GUID *wma_decoder_input_types[] = { &MEDIASUBTYPE_MSAUDIO1, &MFAudioFormat_WMAudioV8, &MFAudioFormat_WMAudioV9, &MFAudioFormat_WMAudio_Lossless, + &MFAudioFormat_XMAudio2, }; -static const GUID *const wma_decoder_output_types[] = +static const GUID *wma_decoder_output_types[] = { &MFAudioFormat_Float, &MFAudioFormat_PCM, @@ -48,12 +51,12 @@ struct wma_decoder IUnknown IUnknown_inner; IMFTransform IMFTransform_iface; IMediaObject IMediaObject_iface; - IPropertyBag IPropertyBag_iface; IUnknown *outer; LONG refcount; IMFMediaType *input_type; IMFMediaType *output_type; + IMFSample *input_sample; struct wg_transform *wg_transform; }; @@ -62,29 +65,7 @@ static inline struct wma_decoder *impl_from_IUnknown(IUnknown *iface) return CONTAINING_RECORD(iface, struct wma_decoder, IUnknown_inner); } -static HRESULT try_create_wg_transform(struct wma_decoder *decoder) -{ - struct wg_format input_format, output_format; - - if (decoder->wg_transform) - wg_transform_destroy(decoder->wg_transform); - decoder->wg_transform = NULL; - - mf_media_type_to_wg_format(decoder->input_type, &input_format); - if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - mf_media_type_to_wg_format(decoder->output_type, &output_format); - if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - if (!(decoder->wg_transform = wg_transform_create(&input_format, &output_format))) - return E_FAIL; - - return S_OK; -} - -static HRESULT WINAPI unknown_QueryInterface(IUnknown *iface, REFIID iid, void **out) +static HRESULT WINAPI wma_unknown_QueryInterface(IUnknown *iface, REFIID iid, void **out) { struct wma_decoder *decoder = impl_from_IUnknown(iface); @@ -96,8 +77,6 @@ static HRESULT WINAPI unknown_QueryInterface(IUnknown *iface, REFIID iid, void * *out = &decoder->IMFTransform_iface; else if (IsEqualGUID(iid, &IID_IMediaObject)) *out = &decoder->IMediaObject_iface; - else if (IsEqualIID(iid, &IID_IPropertyBag)) - *out = &decoder->IPropertyBag_iface; else { *out = NULL; @@ -109,25 +88,27 @@ static HRESULT WINAPI unknown_QueryInterface(IUnknown *iface, REFIID iid, void * return S_OK; } -static ULONG WINAPI unknown_AddRef(IUnknown *iface) +static ULONG WINAPI wma_unknown_AddRef(IUnknown *iface) { struct wma_decoder *decoder = impl_from_IUnknown(iface); ULONG refcount = InterlockedIncrement(&decoder->refcount); - TRACE("iface %p increasing refcount to %lu.\n", decoder, refcount); + TRACE("iface %p increasing refcount to %u.\n", decoder, refcount); return refcount; } -static ULONG WINAPI unknown_Release(IUnknown *iface) +static ULONG WINAPI wma_unknown_Release(IUnknown *iface) { struct wma_decoder *decoder = impl_from_IUnknown(iface); ULONG refcount = InterlockedDecrement(&decoder->refcount); - TRACE("iface %p decreasing refcount to %lu.\n", decoder, refcount); + TRACE("iface %p decreasing refcount to %u.\n", decoder, refcount); if (!refcount) { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); if (decoder->wg_transform) wg_transform_destroy(decoder->wg_transform); if (decoder->input_type) @@ -140,11 +121,11 @@ static ULONG WINAPI unknown_Release(IUnknown *iface) return refcount; } -static const IUnknownVtbl unknown_vtbl = +static const IUnknownVtbl wma_unknown_vtbl = { - unknown_QueryInterface, - unknown_AddRef, - unknown_Release, + wma_unknown_QueryInterface, + wma_unknown_AddRef, + wma_unknown_Release, }; static struct wma_decoder *impl_from_IMFTransform(IMFTransform *iface) @@ -152,25 +133,50 @@ static struct wma_decoder *impl_from_IMFTransform(IMFTransform *iface) return CONTAINING_RECORD(iface, struct wma_decoder, IMFTransform_iface); } -static HRESULT WINAPI transform_QueryInterface(IMFTransform *iface, REFIID iid, void **out) +static HRESULT try_create_wg_transform(struct wma_decoder *decoder) +{ + struct wg_encoded_format input_format; + struct wg_format output_format; + + if (decoder->wg_transform) + wg_transform_destroy(decoder->wg_transform); + decoder->wg_transform = NULL; + + mf_media_type_to_wg_encoded_format(decoder->input_type, &input_format); + if (input_format.encoded_type == WG_ENCODED_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + + mf_media_type_to_wg_format(decoder->output_type, &output_format); + if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + + decoder->wg_transform = wg_transform_create(&input_format, &output_format); + if (decoder->wg_transform) + return S_OK; + + WARN("Failed to create wg_transform.\n"); + return E_FAIL; +} + +static HRESULT WINAPI wma_decoder_QueryInterface(IMFTransform *iface, REFIID iid, void **out) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); return IUnknown_QueryInterface(decoder->outer, iid, out); } -static ULONG WINAPI transform_AddRef(IMFTransform *iface) +static ULONG WINAPI wma_decoder_AddRef(IMFTransform *iface) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); return IUnknown_AddRef(decoder->outer); } -static ULONG WINAPI transform_Release(IMFTransform *iface) +static ULONG WINAPI wma_decoder_Release(IMFTransform *iface) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); return IUnknown_Release(decoder->outer); } -static HRESULT WINAPI transform_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, +static HRESULT WINAPI wma_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, DWORD *input_maximum, DWORD *output_minimum, DWORD *output_maximum) { FIXME("iface %p, input_minimum %p, input_maximum %p, output_minimum %p, output_maximum %p stub!\n", @@ -178,27 +184,27 @@ static HRESULT WINAPI transform_GetStreamLimits(IMFTransform *iface, DWORD *inpu return E_NOTIMPL; } -static HRESULT WINAPI transform_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) +static HRESULT WINAPI wma_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) { FIXME("iface %p, inputs %p, outputs %p stub!\n", iface, inputs, outputs); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, +static HRESULT WINAPI wma_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, DWORD output_size, DWORD *outputs) { - FIXME("iface %p, input_size %lu, inputs %p, output_size %lu, outputs %p stub!\n", iface, + FIXME("iface %p, input_size %u, inputs %p, output_size %u, outputs %p stub!\n", iface, input_size, inputs, output_size, outputs); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) +static HRESULT WINAPI wma_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); UINT32 block_alignment; HRESULT hr; - TRACE("iface %p, id %lu, info %p.\n", iface, id, info); + TRACE("iface %p, id %u, info %p.\n", iface, id, info); if (!decoder->input_type || !decoder->output_type) return MF_E_TRANSFORM_TYPE_NOT_SET; @@ -215,13 +221,13 @@ static HRESULT WINAPI transform_GetInputStreamInfo(IMFTransform *iface, DWORD id return S_OK; } -static HRESULT WINAPI transform_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) +static HRESULT WINAPI wma_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); UINT32 channel_count, block_alignment; HRESULT hr; - TRACE("iface %p, id %lu, info %p.\n", iface, id, info); + TRACE("iface %p, id %u, info %p.\n", iface, id, info); if (!decoder->input_type || !decoder->output_type) return MF_E_TRANSFORM_TYPE_NOT_SET; @@ -238,44 +244,44 @@ static HRESULT WINAPI transform_GetOutputStreamInfo(IMFTransform *iface, DWORD i return S_OK; } -static HRESULT WINAPI transform_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) +static HRESULT WINAPI wma_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) { FIXME("iface %p, attributes %p stub!\n", iface, attributes); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetInputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) +static HRESULT WINAPI wma_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) { - FIXME("iface %p, id %lu, attributes %p stub!\n", iface, id, attributes); + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) +static HRESULT WINAPI wma_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) { - FIXME("iface %p, id %lu, attributes %p stub!\n", iface, id, attributes); + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); return E_NOTIMPL; } -static HRESULT WINAPI transform_DeleteInputStream(IMFTransform *iface, DWORD id) +static HRESULT WINAPI wma_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) { - FIXME("iface %p, id %lu stub!\n", iface, id); + FIXME("iface %p, id %u stub!\n", iface, id); return E_NOTIMPL; } -static HRESULT WINAPI transform_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) +static HRESULT WINAPI wma_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) { - FIXME("iface %p, streams %lu, ids %p stub!\n", iface, streams, ids); + FIXME("iface %p, streams %u, ids %p stub!\n", iface, streams, ids); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, +static HRESULT WINAPI wma_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, IMFMediaType **type) { - FIXME("iface %p, id %lu, index %lu, type %p stub!\n", iface, id, index, type); + FIXME("iface %p, id %u, index %u, type %p stub!\n", iface, id, index, type); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, +static HRESULT WINAPI wma_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, IMFMediaType **type) { UINT32 channel_count, sample_size, sample_rate, block_alignment; @@ -284,7 +290,7 @@ static HRESULT WINAPI transform_GetOutputAvailableType(IMFTransform *iface, DWOR const GUID *output_type; HRESULT hr; - TRACE("iface %p, id %lu, index %lu, type %p.\n", iface, id, index, type); + TRACE("iface %p, id %u, index %u, type %p.\n", iface, id, index, type); if (!decoder->input_type) return MF_E_TRANSFORM_TYPE_NOT_SET; @@ -348,7 +354,7 @@ done: return hr; } -static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +static HRESULT WINAPI wma_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); MF_ATTRIBUTE_TYPE item_type; @@ -356,7 +362,7 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM HRESULT hr; ULONG i; - TRACE("iface %p, id %lu, type %p, flags %#lx.\n", iface, id, type, flags); + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) @@ -402,7 +408,7 @@ static HRESULT WINAPI transform_SetInputType(IMFTransform *iface, DWORD id, IMFM return hr; } -static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) +static HRESULT WINAPI wma_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); MF_ATTRIBUTE_TYPE item_type; @@ -410,10 +416,7 @@ static HRESULT WINAPI transform_SetOutputType(IMFTransform *iface, DWORD id, IMF GUID major, subtype; HRESULT hr; - TRACE("iface %p, id %lu, type %p, flags %#lx.\n", iface, id, type, flags); - - if (!decoder->input_type) - return MF_E_TRANSFORM_TYPE_NOT_SET; + TRACE("iface %p, id %u, type %p, flags %#x.\n", iface, id, type, flags); if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)) || FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) @@ -475,96 +478,114 @@ failed: return hr; } -static HRESULT WINAPI transform_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +static HRESULT WINAPI wma_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) { - FIXME("iface %p, id %lu, type %p stub!\n", iface, id, type); + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) +static HRESULT WINAPI wma_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) { - FIXME("iface %p, id %lu, type %p stub!\n", iface, id, type); + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) +static HRESULT WINAPI wma_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) { - FIXME("iface %p, id %lu, flags %p stub!\n", iface, id, flags); + FIXME("iface %p, id %u, flags %p stub!\n", iface, id, flags); return E_NOTIMPL; } -static HRESULT WINAPI transform_GetOutputStatus(IMFTransform *iface, DWORD *flags) +static HRESULT WINAPI wma_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) { FIXME("iface %p, flags %p stub!\n", iface, flags); return E_NOTIMPL; } -static HRESULT WINAPI transform_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) +static HRESULT WINAPI wma_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) { FIXME("iface %p, lower %s, upper %s stub!\n", iface, wine_dbgstr_longlong(lower), wine_dbgstr_longlong(upper)); return E_NOTIMPL; } -static HRESULT WINAPI transform_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) +static HRESULT WINAPI wma_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) { - FIXME("iface %p, id %lu, event %p stub!\n", iface, id, event); + FIXME("iface %p, id %u, event %p stub!\n", iface, id, event); return E_NOTIMPL; } -static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) +static HRESULT WINAPI wma_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) { FIXME("iface %p, message %#x, param %p stub!\n", iface, message, (void *)param); return S_OK; } -static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) +static HRESULT WINAPI wma_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); - struct wg_sample *wg_sample; + IMFMediaBuffer *media_buffer; MFT_INPUT_STREAM_INFO info; + UINT32 buffer_size; + BYTE *buffer; HRESULT hr; - TRACE("iface %p, id %lu, sample %p, flags %#lx.\n", iface, id, sample, flags); + TRACE("iface %p, id %u, sample %p, flags %#x.\n", iface, id, sample, flags); + + if (FAILED(hr = IMFTransform_GetInputStreamInfo(iface, 0, &info))) + return hr; if (!decoder->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET; - if (FAILED(hr = IMFTransform_GetInputStreamInfo(iface, 0, &info))) + if (decoder->input_sample) + return MF_E_NOTACCEPTING; + + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer))) return hr; - if (FAILED(hr = mf_create_wg_sample(sample, &wg_sample))) + if (FAILED(hr = IMFMediaBuffer_GetCurrentLength(media_buffer, &buffer_size))) return hr; - /* WMA transform uses fixed size input samples and ignores samples with invalid sizes */ - if (wg_sample->size % info.cbSize) - hr = S_OK; - else - hr = wg_transform_push_data(decoder->wg_transform, wg_sample); + if (!(buffer_size = (buffer_size / info.cbSize) * info.cbSize)) + return S_OK; - mf_destroy_wg_sample(wg_sample); + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, NULL))) + goto done; + + if (SUCCEEDED(hr = wg_transform_push_data(decoder->wg_transform, buffer, buffer_size))) + IMFSample_AddRef((decoder->input_sample = sample)); + + IMFMediaBuffer_Unlock(media_buffer); + +done: + IMFMediaBuffer_Release(media_buffer); return hr; } -static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, +static HRESULT WINAPI wma_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) { struct wma_decoder *decoder = impl_from_IMFTransform(iface); + struct wg_sample wg_sample = {0}; + IMFMediaBuffer *media_buffer; MFT_OUTPUT_STREAM_INFO info; - struct wg_sample *wg_sample; HRESULT hr; - TRACE("iface %p, flags %#lx, count %lu, samples %p, status %p.\n", iface, flags, count, samples, status); + TRACE("iface %p, flags %#x, count %u, samples %p, status %p.\n", iface, flags, count, samples, status); if (count > 1) - return E_INVALIDARG; - - if (!decoder->wg_transform) - return MF_E_TRANSFORM_TYPE_NOT_SET; + { + FIXME("Not implemented count %u\n", count); + return E_NOTIMPL; + } if (FAILED(hr = IMFTransform_GetOutputStreamInfo(iface, 0, &info))) return hr; + if (!decoder->wg_transform) + return MF_E_TRANSFORM_TYPE_NOT_SET; + *status = 0; samples[0].dwStatus = 0; if (!samples[0].pSample) @@ -573,50 +594,62 @@ static HRESULT WINAPI transform_ProcessOutput(IMFTransform *iface, DWORD flags, return MF_E_TRANSFORM_NEED_MORE_INPUT; } - if (FAILED(hr = mf_create_wg_sample(samples[0].pSample, &wg_sample))) + if (FAILED(hr = IMFSample_ConvertToContiguousBuffer(samples[0].pSample, &media_buffer))) return hr; - wg_sample->size = 0; - if (wg_sample->max_size < info.cbSize) + if (FAILED(hr = IMFMediaBuffer_Lock(media_buffer, &wg_sample.data, &wg_sample.size, NULL))) + goto done; + + if (wg_sample.size < info.cbSize) hr = MF_E_BUFFERTOOSMALL; - else if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, wg_sample))) + else if (SUCCEEDED(hr = wg_transform_read_data(decoder->wg_transform, &wg_sample))) { - if (wg_sample->flags & WG_SAMPLE_FLAG_INCOMPLETE) + if (wg_sample.flags & WG_SAMPLE_FLAG_INCOMPLETE) samples[0].dwStatus |= MFT_OUTPUT_DATA_BUFFER_INCOMPLETE; } + else + { + if (decoder->input_sample) + IMFSample_Release(decoder->input_sample); + decoder->input_sample = NULL; + } + + IMFMediaBuffer_Unlock(media_buffer); - mf_destroy_wg_sample(wg_sample); +done: + IMFMediaBuffer_SetCurrentLength(media_buffer, wg_sample.size); + IMFMediaBuffer_Release(media_buffer); return hr; } -static const IMFTransformVtbl transform_vtbl = -{ - transform_QueryInterface, - transform_AddRef, - transform_Release, - transform_GetStreamLimits, - transform_GetStreamCount, - transform_GetStreamIDs, - transform_GetInputStreamInfo, - transform_GetOutputStreamInfo, - transform_GetAttributes, - transform_GetInputStreamAttributes, - transform_GetOutputStreamAttributes, - transform_DeleteInputStream, - transform_AddInputStreams, - transform_GetInputAvailableType, - transform_GetOutputAvailableType, - transform_SetInputType, - transform_SetOutputType, - transform_GetInputCurrentType, - transform_GetOutputCurrentType, - transform_GetInputStatus, - transform_GetOutputStatus, - transform_SetOutputBounds, - transform_ProcessEvent, - transform_ProcessMessage, - transform_ProcessInput, - transform_ProcessOutput, +static const IMFTransformVtbl mf_transform_vtbl = +{ + wma_decoder_QueryInterface, + wma_decoder_AddRef, + wma_decoder_Release, + wma_decoder_GetStreamLimits, + wma_decoder_GetStreamCount, + wma_decoder_GetStreamIDs, + wma_decoder_GetInputStreamInfo, + wma_decoder_GetOutputStreamInfo, + wma_decoder_GetAttributes, + wma_decoder_GetInputStreamAttributes, + wma_decoder_GetOutputStreamAttributes, + wma_decoder_DeleteInputStream, + wma_decoder_AddInputStreams, + wma_decoder_GetInputAvailableType, + wma_decoder_GetOutputAvailableType, + wma_decoder_SetInputType, + wma_decoder_SetOutputType, + wma_decoder_GetInputCurrentType, + wma_decoder_GetOutputCurrentType, + wma_decoder_GetInputStatus, + wma_decoder_GetOutputStatus, + wma_decoder_SetOutputBounds, + wma_decoder_ProcessEvent, + wma_decoder_ProcessMessage, + wma_decoder_ProcessInput, + wma_decoder_ProcessOutput, }; static inline struct wma_decoder *impl_from_IMediaObject(IMediaObject *iface) @@ -624,231 +657,187 @@ static inline struct wma_decoder *impl_from_IMediaObject(IMediaObject *iface) return CONTAINING_RECORD(iface, struct wma_decoder, IMediaObject_iface); } -static HRESULT WINAPI media_object_QueryInterface(IMediaObject *iface, REFIID iid, void **obj) +static HRESULT WINAPI wma_media_object_QueryInterface(IMediaObject *iface, REFIID iid, void **obj) { struct wma_decoder *decoder = impl_from_IMediaObject(iface); return IUnknown_QueryInterface(decoder->outer, iid, obj); } -static ULONG WINAPI media_object_AddRef(IMediaObject *iface) +static ULONG WINAPI wma_media_object_AddRef(IMediaObject *iface) { struct wma_decoder *decoder = impl_from_IMediaObject(iface); return IUnknown_AddRef(decoder->outer); } -static ULONG WINAPI media_object_Release(IMediaObject *iface) +static ULONG WINAPI wma_media_object_Release(IMediaObject *iface) { struct wma_decoder *decoder = impl_from_IMediaObject(iface); return IUnknown_Release(decoder->outer); } -static HRESULT WINAPI media_object_GetStreamCount(IMediaObject *iface, DWORD *input, DWORD *output) +static HRESULT WINAPI wma_media_object_GetStreamCount(IMediaObject *iface, DWORD *input, DWORD *output) { - FIXME("iface %p, input %p, output %p semi-stub!\n", iface, input, output); + FIXME("iface %p, input %p, output %p stub!\n", iface, input, output); *input = *output = 1; return S_OK; } -static HRESULT WINAPI media_object_GetInputStreamInfo(IMediaObject *iface, DWORD index, DWORD *flags) +static HRESULT WINAPI wma_media_object_GetInputStreamInfo(IMediaObject *iface, DWORD index, DWORD *flags) { - FIXME("iface %p, index %lu, flags %p stub!\n", iface, index, flags); + FIXME("iface %p, index %u, flags %p stub!\n", iface, index, flags); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetOutputStreamInfo(IMediaObject *iface, DWORD index, DWORD *flags) +static HRESULT WINAPI wma_media_object_GetOutputStreamInfo(IMediaObject *iface, DWORD index, DWORD *flags) { - FIXME("iface %p, index %lu, flags %p stub!\n", iface, index, flags); + FIXME("iface %p, index %u, flags %p stub!\n", iface, index, flags); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetInputType(IMediaObject *iface, DWORD index, DWORD type_index, - DMO_MEDIA_TYPE *type) +static HRESULT WINAPI wma_media_object_GetInputType(IMediaObject *iface, DWORD index, + DWORD type_index, DMO_MEDIA_TYPE *type) { - FIXME("iface %p, index %lu, type_index %lu, type %p stub!\n", iface, index, type_index, type); + FIXME("iface %p, index %u, type_index %u, type %p stub!\n", iface, index, type_index, type); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetOutputType(IMediaObject *iface, DWORD index, DWORD type_index, - DMO_MEDIA_TYPE *type) +static HRESULT WINAPI wma_media_object_GetOutputType(IMediaObject *iface, DWORD index, + DWORD type_index, DMO_MEDIA_TYPE *type) { - FIXME("iface %p, index %lu, type_index %lu, type %p stub!\n", iface, index, type_index, type); + FIXME("iface %p, index %u, type_index %u, type %p stub!\n", iface, index, type_index, type); return E_NOTIMPL; } -static HRESULT WINAPI media_object_SetInputType(IMediaObject *iface, DWORD index, +static HRESULT WINAPI wma_media_object_SetInputType(IMediaObject *iface, DWORD index, const DMO_MEDIA_TYPE *type, DWORD flags) { - FIXME("iface %p, index %lu, type %p, flags %#lx stub!\n", iface, index, type, flags); + FIXME("iface %p, index %u, type %p, flags %#x stub!\n", iface, index, type, flags); return E_NOTIMPL; } -static HRESULT WINAPI media_object_SetOutputType(IMediaObject *iface, DWORD index, +static HRESULT WINAPI wma_media_object_SetOutputType(IMediaObject *iface, DWORD index, const DMO_MEDIA_TYPE *type, DWORD flags) { - FIXME("iface %p, index %lu, type %p, flags %#lx stub!\n", iface, index, type, flags); + FIXME("iface %p, index %u, type %p, flags %#x stub!\n", iface, index, type, flags); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetInputCurrentType(IMediaObject *iface, DWORD index, DMO_MEDIA_TYPE *type) +static HRESULT WINAPI wma_media_object_GetInputCurrentType(IMediaObject *iface, DWORD index, DMO_MEDIA_TYPE *type) { - FIXME("iface %p, index %lu, type %p stub!\n", iface, index, type); + FIXME("iface %p, index %u, type %p stub!\n", iface, index, type); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetOutputCurrentType(IMediaObject *iface, DWORD index, DMO_MEDIA_TYPE *type) +static HRESULT WINAPI wma_media_object_GetOutputCurrentType(IMediaObject *iface, DWORD index, DMO_MEDIA_TYPE *type) { - FIXME("iface %p, index %lu, type %p stub!\n", iface, index, type); + FIXME("iface %p, index %u, type %p stub!\n", iface, index, type); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetInputSizeInfo(IMediaObject *iface, DWORD index, DWORD *size, - DWORD *lookahead, DWORD *alignment) +static HRESULT WINAPI wma_media_object_GetInputSizeInfo(IMediaObject *iface, DWORD index, + DWORD *size, DWORD *lookahead, DWORD *alignment) { - FIXME("iface %p, index %lu, size %p, lookahead %p, alignment %p stub!\n", iface, index, size, + FIXME("iface %p, index %u, size %p, lookahead %p, alignment %p stub!\n", iface, index, size, lookahead, alignment); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetOutputSizeInfo(IMediaObject *iface, DWORD index, DWORD *size, DWORD *alignment) +static HRESULT WINAPI wma_media_object_GetOutputSizeInfo(IMediaObject *iface, DWORD index, + DWORD *size, DWORD *alignment) { - FIXME("iface %p, index %lu, size %p, alignment %p stub!\n", iface, index, size, alignment); + FIXME("iface %p, index %u, size %p, alignment %p stub!\n", iface, index, size, alignment); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetInputMaxLatency(IMediaObject *iface, DWORD index, REFERENCE_TIME *latency) +static HRESULT WINAPI wma_media_object_GetInputMaxLatency(IMediaObject *iface, DWORD index, REFERENCE_TIME *latency) { - FIXME("iface %p, index %lu, latency %p stub!\n", iface, index, latency); + FIXME("iface %p, index %u, latency %p stub!\n", iface, index, latency); return E_NOTIMPL; } -static HRESULT WINAPI media_object_SetInputMaxLatency(IMediaObject *iface, DWORD index, REFERENCE_TIME latency) +static HRESULT WINAPI wma_media_object_SetInputMaxLatency(IMediaObject *iface, DWORD index, REFERENCE_TIME latency) { - FIXME("iface %p, index %lu, latency %s stub!\n", iface, index, wine_dbgstr_longlong(latency)); + FIXME("iface %p, index %u, latency %s stub!\n", iface, index, wine_dbgstr_longlong(latency)); return E_NOTIMPL; } -static HRESULT WINAPI media_object_Flush(IMediaObject *iface) +static HRESULT WINAPI wma_media_object_Flush(IMediaObject *iface) { FIXME("iface %p stub!\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI media_object_Discontinuity(IMediaObject *iface, DWORD index) +static HRESULT WINAPI wma_media_object_Discontinuity(IMediaObject *iface, DWORD index) { - FIXME("iface %p, index %lu stub!\n", iface, index); + FIXME("iface %p, index %u stub!\n", iface, index); return E_NOTIMPL; } -static HRESULT WINAPI media_object_AllocateStreamingResources(IMediaObject *iface) +static HRESULT WINAPI wma_media_object_AllocateStreamingResources(IMediaObject *iface) { FIXME("iface %p stub!\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI media_object_FreeStreamingResources(IMediaObject *iface) +static HRESULT WINAPI wma_media_object_FreeStreamingResources(IMediaObject *iface) { FIXME("iface %p stub!\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI media_object_GetInputStatus(IMediaObject *iface, DWORD index, DWORD *flags) +static HRESULT WINAPI wma_media_object_GetInputStatus(IMediaObject *iface, DWORD index, DWORD *flags) { - FIXME("iface %p, index %lu, flags %p stub!\n", iface, index, flags); + FIXME("iface %p, index %u, flags %p stub!\n", iface, index, flags); return E_NOTIMPL; } -static HRESULT WINAPI media_object_ProcessInput(IMediaObject *iface, DWORD index, +static HRESULT WINAPI wma_media_object_ProcessInput(IMediaObject *iface, DWORD index, IMediaBuffer *buffer, DWORD flags, REFERENCE_TIME timestamp, REFERENCE_TIME timelength) { - FIXME("iface %p, index %lu, buffer %p, flags %#lx, timestamp %s, timelength %s stub!\n", iface, + FIXME("iface %p, index %u, buffer %p, flags %#x, timestamp %s, timelength %s stub!\n", iface, index, buffer, flags, wine_dbgstr_longlong(timestamp), wine_dbgstr_longlong(timelength)); return E_NOTIMPL; } -static HRESULT WINAPI media_object_ProcessOutput(IMediaObject *iface, DWORD flags, DWORD count, +static HRESULT WINAPI wma_media_object_ProcessOutput(IMediaObject *iface, DWORD flags, DWORD count, DMO_OUTPUT_DATA_BUFFER *buffers, DWORD *status) { - FIXME("iface %p, flags %#lx, count %lu, buffers %p, status %p stub!\n", iface, flags, count, buffers, status); + FIXME("iface %p, flags %#x, count %u, buffers %p, status %p stub!\n", iface, flags, count, buffers, status); return E_NOTIMPL; } -static HRESULT WINAPI media_object_Lock(IMediaObject *iface, LONG lock) +static HRESULT WINAPI wma_media_object_Lock(IMediaObject *iface, LONG lock) { - FIXME("iface %p, lock %ld stub!\n", iface, lock); + FIXME("iface %p, lock %d stub!\n", iface, lock); return E_NOTIMPL; } -static const IMediaObjectVtbl media_object_vtbl = -{ - media_object_QueryInterface, - media_object_AddRef, - media_object_Release, - media_object_GetStreamCount, - media_object_GetInputStreamInfo, - media_object_GetOutputStreamInfo, - media_object_GetInputType, - media_object_GetOutputType, - media_object_SetInputType, - media_object_SetOutputType, - media_object_GetInputCurrentType, - media_object_GetOutputCurrentType, - media_object_GetInputSizeInfo, - media_object_GetOutputSizeInfo, - media_object_GetInputMaxLatency, - media_object_SetInputMaxLatency, - media_object_Flush, - media_object_Discontinuity, - media_object_AllocateStreamingResources, - media_object_FreeStreamingResources, - media_object_GetInputStatus, - media_object_ProcessInput, - media_object_ProcessOutput, - media_object_Lock, -}; - -static inline struct wma_decoder *impl_from_IPropertyBag(IPropertyBag *iface) -{ - return CONTAINING_RECORD(iface, struct wma_decoder, IPropertyBag_iface); -} - -static HRESULT WINAPI property_bag_QueryInterface(IPropertyBag *iface, REFIID iid, void **out) -{ - struct wma_decoder *filter = impl_from_IPropertyBag(iface); - return IUnknown_QueryInterface(filter->outer, iid, out); -} - -static ULONG WINAPI property_bag_AddRef(IPropertyBag *iface) -{ - struct wma_decoder *filter = impl_from_IPropertyBag(iface); - return IUnknown_AddRef(filter->outer); -} - -static ULONG WINAPI property_bag_Release(IPropertyBag *iface) -{ - struct wma_decoder *filter = impl_from_IPropertyBag(iface); - return IUnknown_Release(filter->outer); -} - -static HRESULT WINAPI property_bag_Read(IPropertyBag *iface, const WCHAR *prop_name, VARIANT *value, - IErrorLog *error_log) -{ - FIXME("iface %p, prop_name %s, value %p, error_log %p stub!\n", iface, debugstr_w(prop_name), value, error_log); - return E_NOTIMPL; -} - -static HRESULT WINAPI property_bag_Write(IPropertyBag *iface, const WCHAR *prop_name, VARIANT *value) -{ - FIXME("iface %p, prop_name %s, value %p stub!\n", iface, debugstr_w(prop_name), value); - return S_OK; -} - -static const IPropertyBagVtbl property_bag_vtbl = +static const IMediaObjectVtbl wma_media_object_vtbl = { - property_bag_QueryInterface, - property_bag_AddRef, - property_bag_Release, - property_bag_Read, - property_bag_Write, + wma_media_object_QueryInterface, + wma_media_object_AddRef, + wma_media_object_Release, + wma_media_object_GetStreamCount, + wma_media_object_GetInputStreamInfo, + wma_media_object_GetOutputStreamInfo, + wma_media_object_GetInputType, + wma_media_object_GetOutputType, + wma_media_object_SetInputType, + wma_media_object_SetOutputType, + wma_media_object_GetInputCurrentType, + wma_media_object_GetOutputCurrentType, + wma_media_object_GetInputSizeInfo, + wma_media_object_GetOutputSizeInfo, + wma_media_object_GetInputMaxLatency, + wma_media_object_SetInputMaxLatency, + wma_media_object_Flush, + wma_media_object_Discontinuity, + wma_media_object_AllocateStreamingResources, + wma_media_object_FreeStreamingResources, + wma_media_object_GetInputStatus, + wma_media_object_ProcessInput, + wma_media_object_ProcessOutput, + wma_media_object_Lock, }; HRESULT wma_decoder_create(IUnknown *outer, IUnknown **out) @@ -860,10 +849,9 @@ HRESULT wma_decoder_create(IUnknown *outer, IUnknown **out) if (!(decoder = calloc(1, sizeof(*decoder)))) return E_OUTOFMEMORY; - decoder->IUnknown_inner.lpVtbl = &unknown_vtbl; - decoder->IMFTransform_iface.lpVtbl = &transform_vtbl; - decoder->IMediaObject_iface.lpVtbl = &media_object_vtbl; - decoder->IPropertyBag_iface.lpVtbl = &property_bag_vtbl; + decoder->IUnknown_inner.lpVtbl = &wma_unknown_vtbl; + decoder->IMFTransform_iface.lpVtbl = &mf_transform_vtbl; + decoder->IMediaObject_iface.lpVtbl = &wma_media_object_vtbl; decoder->refcount = 1; decoder->outer = outer ? outer : &decoder->IUnknown_inner; diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 4d569e1fc6c..319717e9497 100644 --- wine/include/wine/strmbase.h +++ wine/include/wine/strmbase.h @@ -122,6 +122,7 @@ void strmbase_sink_cleanup(struct strmbase_sink *pin); struct strmbase_filter { IBaseFilter IBaseFilter_iface; + IPropertyBag IPropertyBag_iface; IUnknown IUnknown_inner; IUnknown *outer_unk; LONG refcount; diff --git a/libs/strmbase/Makefile.in b/libs/strmbase/Makefile.in index 8b6ea8a3b43..c9b4a9ebb5c 100644 --- wine/libs/strmbase/Makefile.in +++ wine/libs/strmbase/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_LONG_TYPES STATICLIB = libstrmbase.a C_SRCS = \ diff --git a/libs/strmbase/dispatch.c b/libs/strmbase/dispatch.c index 061655d4693..562c8c12ee6 100644 --- wine/libs/strmbase/dispatch.c +++ wine/libs/strmbase/dispatch.c @@ -46,7 +46,7 @@ HRESULT strmbase_get_typeinfo(enum strmbase_type_id tid, ITypeInfo **ret) hr = LoadRegTypeLib(&LIBID_QuartzTypeLib, 1, 0, LOCALE_SYSTEM_DEFAULT, &typelib); if (FAILED(hr)) { - ERR("Failed to load typelib, hr %#lx.\n", hr); + ERR("Failed to load typelib, hr %#x.\n", hr); return hr; } if (InterlockedCompareExchangePointer((void **)&control_typelib, typelib, NULL)) @@ -59,7 +59,7 @@ HRESULT strmbase_get_typeinfo(enum strmbase_type_id tid, ITypeInfo **ret) hr = ITypeLib_GetTypeInfoOfGuid(control_typelib, control_tid_id[tid], &typeinfo); if (FAILED(hr)) { - ERR("Failed to get type info for %s, hr %#lx.\n", debugstr_guid(control_tid_id[tid]), hr); + ERR("Failed to get type info for %s, hr %#x.\n", debugstr_guid(control_tid_id[tid]), hr); return hr; } if (InterlockedCompareExchangePointer((void **)(control_typeinfo + tid), typeinfo, NULL)) diff --git a/libs/strmbase/filter.c b/libs/strmbase/filter.c index ee41611a198..b30ef6daf4f 100644 --- wine/libs/strmbase/filter.c +++ wine/libs/strmbase/filter.c @@ -87,7 +87,7 @@ static ULONG WINAPI enum_pins_AddRef(IEnumPins *iface) { struct enum_pins *enum_pins = impl_from_IEnumPins(iface); ULONG refcount = InterlockedIncrement(&enum_pins->refcount); - TRACE("%p increasing refcount to %lu.\n", enum_pins, refcount); + TRACE("%p increasing refcount to %u.\n", enum_pins, refcount); return refcount; } @@ -96,7 +96,7 @@ static ULONG WINAPI enum_pins_Release(IEnumPins *iface) struct enum_pins *enum_pins = impl_from_IEnumPins(iface); ULONG refcount = InterlockedDecrement(&enum_pins->refcount); - TRACE("%p decreasing refcount to %lu.\n", enum_pins, refcount); + TRACE("%p decreasing refcount to %u.\n", enum_pins, refcount); if (!refcount) { IBaseFilter_Release(&enum_pins->filter->IBaseFilter_iface); @@ -110,7 +110,7 @@ static HRESULT WINAPI enum_pins_Next(IEnumPins *iface, ULONG count, IPin **pins, struct enum_pins *enum_pins = impl_from_IEnumPins(iface); unsigned int i; - TRACE("iface %p, count %lu, pins %p, ret_count %p.\n", iface, count, pins, ret_count); + TRACE("iface %p, count %u, pins %p, ret_count %p.\n", iface, count, pins, ret_count); if (!pins) return E_POINTER; @@ -144,7 +144,7 @@ static HRESULT WINAPI enum_pins_Skip(IEnumPins *iface, ULONG count) { struct enum_pins *enum_pins = impl_from_IEnumPins(iface); - TRACE("iface %p, count %lu.\n", iface, count); + TRACE("iface %p, count %u.\n", iface, count); if (enum_pins->version != enum_pins->filter->pin_version) return VFW_E_ENUM_OUT_OF_SYNC; @@ -226,6 +226,8 @@ static HRESULT WINAPI filter_inner_QueryInterface(IUnknown *iface, REFIID iid, v { *out = &filter->IBaseFilter_iface; } + else if (IsEqualIID(iid, &IID_IPropertyBag)) + *out = &filter->IPropertyBag_iface; else { WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); @@ -241,7 +243,7 @@ static ULONG WINAPI filter_inner_AddRef(IUnknown *iface) struct strmbase_filter *filter = impl_from_IUnknown(iface); ULONG refcount = InterlockedIncrement(&filter->refcount); - TRACE("%p increasing refcount to %lu.\n", filter, refcount); + TRACE("%p increasing refcount to %u.\n", filter, refcount); return refcount; } @@ -251,7 +253,7 @@ static ULONG WINAPI filter_inner_Release(IUnknown *iface) struct strmbase_filter *filter = impl_from_IUnknown(iface); ULONG refcount = InterlockedDecrement(&filter->refcount); - TRACE("%p decreasing refcount to %lu.\n", filter, refcount); + TRACE("%p decreasing refcount to %u.\n", filter, refcount); if (!refcount) filter->ops->filter_destroy(filter); @@ -368,7 +370,7 @@ static HRESULT WINAPI filter_GetState(IBaseFilter *iface, DWORD timeout, FILTER_ struct strmbase_filter *filter = impl_from_IBaseFilter(iface); HRESULT hr = S_OK; - TRACE("filter %p %s, timeout %lu, state %p.\n", filter, debugstr_w(filter->name), timeout, state); + TRACE("filter %p %s, timeout %u, state %p.\n", filter, debugstr_w(filter->name), timeout, state); EnterCriticalSection(&filter->filter_cs); @@ -436,7 +438,7 @@ static HRESULT WINAPI filter_FindPin(IBaseFilter *iface, const WCHAR *id, IPin * for (i = 0; (pin = filter->ops->filter_get_pin(filter, i)); ++i) { - if (!lstrcmpW(id, pin->id)) + if (!lstrcmpW(id, pin->name)) { IPin_AddRef(*ret = &pin->IPin_iface); return S_OK; @@ -509,6 +511,51 @@ static const IBaseFilterVtbl filter_vtbl = filter_QueryVendorInfo, }; +static inline struct strmbase_filter *impl_from_IPropertyBag(IPropertyBag *iface) +{ + return CONTAINING_RECORD(iface, struct strmbase_filter, IPropertyBag_iface); +} + +static HRESULT WINAPI property_bag_QueryInterface(IPropertyBag *iface, REFIID iid, void **out) +{ + struct strmbase_filter *filter = impl_from_IPropertyBag(iface); + return IUnknown_QueryInterface(filter->outer_unk, iid, out); +} + +static ULONG WINAPI property_bag_AddRef(IPropertyBag *iface) +{ + struct strmbase_filter *filter = impl_from_IPropertyBag(iface); + return IUnknown_AddRef(filter->outer_unk); +} + +static ULONG WINAPI property_bag_Release(IPropertyBag *iface) +{ + struct strmbase_filter *filter = impl_from_IPropertyBag(iface); + return IUnknown_Release(filter->outer_unk); +} + +static HRESULT WINAPI property_bag_Read(IPropertyBag *iface, const WCHAR *prop_name, VARIANT *value, + IErrorLog *error_log) +{ + FIXME("iface %p, prop_name %s, value %p, error_log %p stub!\n", iface, debugstr_w(prop_name), value, error_log); + return E_NOTIMPL; +} + +static HRESULT WINAPI property_bag_Write(IPropertyBag *iface, const WCHAR *prop_name, VARIANT *value) +{ + FIXME("iface %p, prop_name %s, value %p stub!\n", iface, debugstr_w(prop_name), value); + return S_OK; +} + +static const IPropertyBagVtbl property_bag_vtbl = +{ + property_bag_QueryInterface, + property_bag_AddRef, + property_bag_Release, + property_bag_Read, + property_bag_Write, +}; + VOID WINAPI BaseFilterImpl_IncrementPinVersion(struct strmbase_filter *filter) { InterlockedIncrement(&filter->pin_version); @@ -520,6 +567,7 @@ void strmbase_filter_init(struct strmbase_filter *filter, IUnknown *outer, memset(filter, 0, sizeof(*filter)); filter->IBaseFilter_iface.lpVtbl = &filter_vtbl; + filter->IPropertyBag_iface.lpVtbl = &property_bag_vtbl; filter->IUnknown_inner.lpVtbl = &filter_inner_vtbl; filter->outer_unk = outer ? outer : &filter->IUnknown_inner; filter->refcount = 1; diff --git a/libs/strmbase/mediatype.c b/libs/strmbase/mediatype.c index 33af6f2e636..6f66999c390 100644 --- wine/libs/strmbase/mediatype.c +++ wine/libs/strmbase/mediatype.c @@ -60,7 +60,7 @@ static const char *debugstr_fourcc(DWORD fourcc) char str[4] = {fourcc, fourcc >> 8, fourcc >> 16, fourcc >> 24}; if (isprint(str[0]) && isprint(str[1]) && isprint(str[2]) && isprint(str[3])) return wine_dbgstr_an(str, 4); - return wine_dbg_sprintf("%#lx", fourcc); + return wine_dbg_sprintf("%#x", fourcc); } void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt) @@ -71,7 +71,7 @@ void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt) mt, strmbase_debugstr_guid(&mt->majortype), strmbase_debugstr_guid(&mt->subtype)); if (mt->bFixedSizeSamples) TRACE(", fixed size samples"); if (mt->bTemporalCompression) TRACE(", temporal compression"); - if (mt->lSampleSize) TRACE(", sample size %ld", mt->lSampleSize); + if (mt->lSampleSize) TRACE(", sample size %d", mt->lSampleSize); if (mt->pUnk) TRACE(", pUnk %p", mt->pUnk); TRACE(", format type %s.\n", strmbase_debugstr_guid(&mt->formattype)); @@ -83,7 +83,7 @@ void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt) { WAVEFORMATEX *wfx = (WAVEFORMATEX *)mt->pbFormat; - TRACE("tag %#x, %u channels, sample rate %lu, %lu bytes/sec, alignment %u, %u bits/sample.\n", + TRACE("tag %#x, %u channels, sample rate %u, %u bytes/sec, alignment %u, %u bits/sample.\n", wfx->wFormatTag, wfx->nChannels, wfx->nSamplesPerSec, wfx->nAvgBytesPerSec, wfx->nBlockAlign, wfx->wBitsPerSample); @@ -107,17 +107,17 @@ void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt) if (!IsRectEmpty(&vih->rcSource)) TRACE("source %s, ", wine_dbgstr_rect(&vih->rcSource)); if (!IsRectEmpty(&vih->rcTarget)) TRACE("target %s, ", wine_dbgstr_rect(&vih->rcTarget)); - if (vih->dwBitRate) TRACE("bitrate %lu, ", vih->dwBitRate); - if (vih->dwBitErrorRate) TRACE("error rate %lu, ", vih->dwBitErrorRate); + if (vih->dwBitRate) TRACE("bitrate %u, ", vih->dwBitRate); + if (vih->dwBitErrorRate) TRACE("error rate %u, ", vih->dwBitErrorRate); TRACE("%s sec/frame, ", debugstr_time(vih->AvgTimePerFrame)); - TRACE("size %ldx%ld, %u planes, %u bpp, compression %s, image size %lu", + TRACE("size %dx%d, %u planes, %u bpp, compression %s, image size %u", vih->bmiHeader.biWidth, vih->bmiHeader.biHeight, vih->bmiHeader.biPlanes, vih->bmiHeader.biBitCount, debugstr_fourcc(vih->bmiHeader.biCompression), vih->bmiHeader.biSizeImage); if (vih->bmiHeader.biXPelsPerMeter || vih->bmiHeader.biYPelsPerMeter) - TRACE(", resolution %ldx%ld", vih->bmiHeader.biXPelsPerMeter, vih->bmiHeader.biYPelsPerMeter); - if (vih->bmiHeader.biClrUsed) TRACE(", %lu colours", vih->bmiHeader.biClrUsed); - if (vih->bmiHeader.biClrImportant) TRACE(", %lu important colours", vih->bmiHeader.biClrImportant); + TRACE(", resolution %dx%d", vih->bmiHeader.biXPelsPerMeter, vih->bmiHeader.biYPelsPerMeter); + if (vih->bmiHeader.biClrUsed) TRACE(", %d colours", vih->bmiHeader.biClrUsed); + if (vih->bmiHeader.biClrImportant) TRACE(", %d important colours", vih->bmiHeader.biClrImportant); TRACE(".\n"); } else if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo2) && mt->cbFormat >= sizeof(VIDEOINFOHEADER2)) @@ -126,13 +126,13 @@ void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt) if (!IsRectEmpty(&vih->rcSource)) TRACE("source %s, ", wine_dbgstr_rect(&vih->rcSource)); if (!IsRectEmpty(&vih->rcTarget)) TRACE("target %s, ", wine_dbgstr_rect(&vih->rcTarget)); - if (vih->dwBitRate) TRACE("bitrate %lu, ", vih->dwBitRate); - if (vih->dwBitErrorRate) TRACE("error rate %lu, ", vih->dwBitErrorRate); + if (vih->dwBitRate) TRACE("bitrate %u, ", vih->dwBitRate); + if (vih->dwBitErrorRate) TRACE("error rate %u, ", vih->dwBitErrorRate); TRACE("%s sec/frame, ", debugstr_time(vih->AvgTimePerFrame)); - if (vih->dwInterlaceFlags) TRACE("interlace flags %#lx, ", vih->dwInterlaceFlags); - if (vih->dwCopyProtectFlags) TRACE("copy-protection flags %#lx, ", vih->dwCopyProtectFlags); - TRACE("aspect ratio %lu/%lu, ", vih->dwPictAspectRatioX, vih->dwPictAspectRatioY); - if (vih->u.dwControlFlags) TRACE("control flags %#lx, ", vih->u.dwControlFlags); + if (vih->dwInterlaceFlags) TRACE("interlace flags %#x, ", vih->dwInterlaceFlags); + if (vih->dwCopyProtectFlags) TRACE("copy-protection flags %#x, ", vih->dwCopyProtectFlags); + TRACE("aspect ratio %u/%u, ", vih->dwPictAspectRatioX, vih->dwPictAspectRatioY); + if (vih->u.dwControlFlags) TRACE("control flags %#x, ", vih->u.dwControlFlags); if (vih->u.dwControlFlags & AMCONTROL_COLORINFO_PRESENT) { const DXVA_ExtendedFormat *colorimetry = (const DXVA_ExtendedFormat *)&vih->u.dwControlFlags; @@ -141,14 +141,14 @@ void strmbase_dump_media_type(const AM_MEDIA_TYPE *mt) colorimetry->VideoChromaSubsampling, colorimetry->NominalRange, colorimetry->VideoTransferMatrix, colorimetry->VideoLighting, colorimetry->VideoPrimaries, colorimetry->VideoTransferFunction); } - TRACE("size %ldx%ld, %u planes, %u bpp, compression %s, image size %lu", + TRACE("size %dx%d, %u planes, %u bpp, compression %s, image size %u", vih->bmiHeader.biWidth, vih->bmiHeader.biHeight, vih->bmiHeader.biPlanes, vih->bmiHeader.biBitCount, debugstr_fourcc(vih->bmiHeader.biCompression), vih->bmiHeader.biSizeImage); if (vih->bmiHeader.biXPelsPerMeter || vih->bmiHeader.biYPelsPerMeter) - TRACE(", resolution %ldx%ld", vih->bmiHeader.biXPelsPerMeter, vih->bmiHeader.biYPelsPerMeter); - if (vih->bmiHeader.biClrUsed) TRACE(", %lu colours", vih->bmiHeader.biClrUsed); - if (vih->bmiHeader.biClrImportant) TRACE(", %lu important colours", vih->bmiHeader.biClrImportant); + TRACE(", resolution %dx%d", vih->bmiHeader.biXPelsPerMeter, vih->bmiHeader.biYPelsPerMeter); + if (vih->bmiHeader.biClrUsed) TRACE(", %d colours", vih->bmiHeader.biClrUsed); + if (vih->bmiHeader.biClrImportant) TRACE(", %d important colours", vih->bmiHeader.biClrImportant); TRACE(".\n"); } else diff --git a/libs/strmbase/pin.c b/libs/strmbase/pin.c index 03330837477..36b3fdf1425 100644 --- wine/libs/strmbase/pin.c +++ wine/libs/strmbase/pin.c @@ -97,7 +97,7 @@ static ULONG WINAPI enum_media_types_AddRef(IEnumMediaTypes *iface) { struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface); ULONG refcount = InterlockedIncrement(&enummt->refcount); - TRACE("%p increasing refcount to %lu.\n", enummt, refcount); + TRACE("%p increasing refcount to %u.\n", enummt, refcount); return refcount; } @@ -106,7 +106,7 @@ static ULONG WINAPI enum_media_types_Release(IEnumMediaTypes *iface) struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface); ULONG refcount = InterlockedDecrement(&enummt->refcount); - TRACE("%p decreasing refcount to %lu.\n", enummt, refcount); + TRACE("%p decreasing refcount to %u.\n", enummt, refcount); if (!refcount) { IPin_Release(&enummt->pin->IPin_iface); @@ -123,7 +123,7 @@ static HRESULT WINAPI enum_media_types_Next(IEnumMediaTypes *iface, ULONG count, unsigned int i; HRESULT hr; - TRACE("enummt %p, count %lu, mts %p, ret_count %p.\n", enummt, count, mts, ret_count); + TRACE("enummt %p, count %u, mts %p, ret_count %p.\n", enummt, count, mts, ret_count); if (!enummt->pin->ops->pin_get_media_type) { @@ -169,7 +169,7 @@ static HRESULT WINAPI enum_media_types_Skip(IEnumMediaTypes *iface, ULONG count) { struct enum_media_types *enummt = impl_from_IEnumMediaTypes(iface); - TRACE("enummt %p, count %lu.\n", enummt, count); + TRACE("enummt %p, count %u.\n", enummt, count); enummt->index += count; @@ -383,10 +383,10 @@ static HRESULT WINAPI pin_QueryId(IPin *iface, WCHAR **id) TRACE("pin %p %s:%s, id %p.\n", pin, debugstr_w(pin->filter->name), debugstr_w(pin->name), id); - if (!(*id = CoTaskMemAlloc((lstrlenW(pin->id) + 1) * sizeof(WCHAR)))) + if (!(*id = CoTaskMemAlloc((lstrlenW(pin->name) + 1) * sizeof(WCHAR)))) return E_OUTOFMEMORY; - lstrcpyW(*id, pin->id); + lstrcpyW(*id, pin->name); return S_OK; } @@ -677,6 +677,31 @@ static const IPinVtbl source_vtbl = source_NewSegment, }; +HRESULT WINAPI BaseOutputPinImpl_GetDeliveryBuffer(struct strmbase_source *This, + IMediaSample **ppSample, REFERENCE_TIME *tStart, REFERENCE_TIME *tStop, DWORD dwFlags) +{ + HRESULT hr; + + TRACE("(%p)->(%p, %p, %p, %x)\n", This, ppSample, tStart, tStop, dwFlags); + + if (!This->pin.peer) + hr = VFW_E_NOT_CONNECTED; + else + { + hr = IMemAllocator_GetBuffer(This->pAllocator, ppSample, tStart, tStop, dwFlags); + + if (SUCCEEDED(hr)) + hr = IMediaSample_SetTime(*ppSample, tStart, tStop); + } + + return hr; +} + +HRESULT WINAPI BaseOutputPinImpl_InitAllocator(struct strmbase_source *This, IMemAllocator **pMemAlloc) +{ + return CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (LPVOID*)pMemAlloc); +} + HRESULT WINAPI BaseOutputPinImpl_DecideAllocator(struct strmbase_source *This, IMemInputPin *pPin, IMemAllocator **pAlloc) { @@ -685,8 +710,8 @@ HRESULT WINAPI BaseOutputPinImpl_DecideAllocator(struct strmbase_source *This, hr = IMemInputPin_GetAllocator(pPin, pAlloc); if (hr == VFW_E_NO_ALLOCATOR) - hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, - CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void **)pAlloc); + /* Input pin provides no allocator, use standard memory allocator */ + hr = BaseOutputPinImpl_InitAllocator(This, pAlloc); if (SUCCEEDED(hr)) { @@ -758,7 +783,7 @@ HRESULT WINAPI BaseOutputPinImpl_AttemptConnection(struct strmbase_source *This, FreeMediaType(&This->pin.mt); } - TRACE("Returning %#lx.\n", hr); + TRACE(" -- %x\n", hr); return hr; } @@ -770,7 +795,6 @@ void strmbase_source_init(struct strmbase_source *pin, struct strmbase_filter *f pin->pin.filter = filter; pin->pin.dir = PINDIR_OUTPUT; lstrcpyW(pin->pin.name, name); - lstrcpyW(pin->pin.id, name); pin->pin.ops = &func_table->base; pin->pFuncsTable = func_table; } @@ -1173,7 +1197,6 @@ void strmbase_sink_init(struct strmbase_sink *pin, struct strmbase_filter *filte pin->pin.filter = filter; pin->pin.dir = PINDIR_INPUT; lstrcpyW(pin->pin.name, name); - lstrcpyW(pin->pin.id, name); pin->pin.ops = &func_table->base; pin->pFuncsTable = func_table; pin->pAllocator = pin->preferred_allocator = allocator; diff --git a/libs/strmbase/pospass.c b/libs/strmbase/pospass.c index 03cb7783f97..7478c0e67c5 100644 --- wine/libs/strmbase/pospass.c +++ wine/libs/strmbase/pospass.c @@ -296,11 +296,7 @@ static HRESULT WINAPI MediaSeekingPassThru_ConvertTimeFormat(IMediaSeeking * ifa struct strmbase_passthrough *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; - - TRACE("iface %p, target %p, target_format %s, source %s, source_format %s.\n", - iface, pTarget, debugstr_guid(pTargetFormat), - wine_dbgstr_longlong(Source), debugstr_guid(pSourceFormat)); - + TRACE("(%p/%p)->(%p,%s,%x%08x,%s)\n", iface, This, pTarget, debugstr_guid(pTargetFormat), (DWORD)(Source>>32), (DWORD)Source, debugstr_guid(pSourceFormat)); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_ConvertTimeFormat(seek, pTarget, pTargetFormat, Source, pSourceFormat); @@ -316,10 +312,7 @@ static HRESULT WINAPI MediaSeekingPassThru_SetPositions(IMediaSeeking * iface, L struct strmbase_passthrough *This = impl_from_IMediaSeeking(iface); IMediaSeeking *seek; HRESULT hr; - - TRACE("iface %p, current %p, current_flags %#lx, stop %p, stop_flags %#lx.\n", - iface, pCurrent, dwCurrentFlags, pStop, dwStopFlags); - + TRACE("(%p/%p)->(%p,%x,%p,%x)\n", iface, This, pCurrent, dwCurrentFlags, pStop, dwStopFlags); hr = get_connected(This, &IID_IMediaSeeking, (LPVOID*)&seek); if (SUCCEEDED(hr)) { hr = IMediaSeeking_SetPositions(seek, pCurrent, dwCurrentFlags, pStop, dwStopFlags); @@ -464,7 +457,7 @@ static HRESULT WINAPI MediaPositionPassThru_GetTypeInfoCount(IMediaPosition *ifa static HRESULT WINAPI MediaPositionPassThru_GetTypeInfo(IMediaPosition *iface, UINT index, LCID lcid, ITypeInfo **typeinfo) { - TRACE("iface %p, index %u, lcid %#lx, typeinfo %p.\n", iface, index, lcid, typeinfo); + TRACE("iface %p, index %u, lcid %#x, typeinfo %p.\n", iface, index, lcid, typeinfo); return strmbase_get_typeinfo(IMediaPosition_tid, typeinfo); } @@ -474,7 +467,7 @@ static HRESULT WINAPI MediaPositionPassThru_GetIDsOfNames(IMediaPosition *iface, ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, iid %s, names %p, count %u, lcid %#lx, ids %p.\n", + TRACE("iface %p, iid %s, names %p, count %u, lcid %#x, ids %p.\n", iface, debugstr_guid(iid), names, count, lcid, ids); if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaPosition_tid, &typeinfo))) @@ -491,7 +484,7 @@ static HRESULT WINAPI MediaPositionPassThru_Invoke(IMediaPosition *iface, DISPID ITypeInfo *typeinfo; HRESULT hr; - TRACE("iface %p, id %ld, iid %s, lcid %#lx, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", + TRACE("iface %p, id %d, iid %s, lcid %#x, flags %#x, params %p, result %p, excepinfo %p, error_arg %p.\n", iface, id, debugstr_guid(iid), lcid, flags, params, result, excepinfo, error_arg); if (SUCCEEDED(hr = strmbase_get_typeinfo(IMediaPosition_tid, &typeinfo))) diff --git a/libs/strmbase/renderer.c b/libs/strmbase/renderer.c index dc421f499ed..da257555a19 100644 --- wine/libs/strmbase/renderer.c +++ wine/libs/strmbase/renderer.c @@ -526,7 +526,7 @@ static HRESULT WINAPI quality_control_Notify(IQualityControl *iface, IBaseFilter struct strmbase_renderer *filter = impl_from_IQualityControl(iface); HRESULT hr = S_FALSE; - TRACE("filter %p, sender %p, type %#x, proportion %ld, late %s, timestamp %s.\n", + TRACE("filter %p, sender %p, type %#x, proportion %u, late %s, timestamp %s.\n", filter, sender, q.Type, q.Proportion, debugstr_time(q.Late), debugstr_time(q.TimeStamp)); if (filter->qc_sink) diff --git a/libs/strmbase/seeking.c b/libs/strmbase/seeking.c index b3991f0a5b3..67ef660ba3d 100644 --- wine/libs/strmbase/seeking.c +++ wine/libs/strmbase/seeking.c @@ -220,10 +220,7 @@ HRESULT WINAPI SourceSeekingImpl_SetPositions(IMediaSeeking * iface, LONGLONG * BOOL bChangeCurrent = FALSE, bChangeStop = FALSE; LONGLONG llNewCurrent, llNewStop; - TRACE("iface %p, current %s, current_flags %#lx, stop %s, stop_flags %#lx.\n", iface, - pCurrent ? debugstr_time(*pCurrent) : "", dwCurrentFlags, - pStop ? debugstr_time(*pStop): "", dwStopFlags); - + TRACE("(%p, %x, %p, %x)\n", pCurrent, dwCurrentFlags, pStop, dwStopFlags); EnterCriticalSection(&This->cs); llNewCurrent = Adjust(This->llCurrent, pCurrent, dwCurrentFlags); @@ -234,7 +231,7 @@ HRESULT WINAPI SourceSeekingImpl_SetPositions(IMediaSeeking * iface, LONGLONG * if (llNewStop != This->llStop) bChangeStop = TRUE; - TRACE("Seeking from %s to %s.\n", debugstr_time(This->llCurrent), debugstr_time(llNewCurrent)); + TRACE("Old: %u, New: %u\n", (DWORD)(This->llCurrent/10000000), (DWORD)(llNewCurrent/10000000)); This->llCurrent = llNewCurrent; This->llStop = llNewStop; diff --git a/libs/strmiids/strmiids.c b/libs/strmiids/strmiids.c index 1a7005bde3c..d07da38bb16 100644 --- wine/libs/strmiids/strmiids.c +++ wine/libs/strmiids/strmiids.c @@ -39,4 +39,4 @@ #include "amstream.h" #include "qedit.h" #include "vmr9.h" -#include "videoacc.h" +#include "videoacc.h" \ No newline at end of file -- 2.39.2 (Apple Git-144) diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index e7b7b55..ea0058b 100644 --- wine/dlls/mfreadwrite/reader.c +++ wine/dlls/mfreadwrite/reader.c @@ -2472,6 +2472,92 @@ failed: return hr; } +static HRESULT bytestream_get_url_hint(IMFByteStream *stream, WCHAR const **url) +{ + static const unsigned char asfmagic[] = {0x30,0x26,0xb2,0x75,0x8e,0x66,0xcf,0x11,0xa6,0xd9,0x00,0xaa,0x00,0x62,0xce,0x6c}; + static const unsigned char wavmagic[] = { 'R', 'I', 'F', 'F',0x00,0x00,0x00,0x00, 'W', 'A', 'V', 'E', 'f', 'm', 't', ' '}; + static const unsigned char wavmask[] = {0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; + static const unsigned char isommagic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'i', 's', 'o', 'm',0x00,0x00,0x00,0x00}; + static const unsigned char mp4_magic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'M', 'S', 'N', 'V',0x00,0x00,0x00,0x00}; + static const unsigned char mp42magic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'm', 'p', '4', '2',0x00,0x00,0x00,0x00}; + static const unsigned char mp4vmagic[] = {0x00,0x00,0x00,0x00, 'f', 't', 'y', 'p', 'M', '4', 'V', ' ',0x00,0x00,0x00,0x00}; + static const unsigned char mp4mask[] = {0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00}; + static const struct stream_content_url_hint + { + const unsigned char *magic; + const WCHAR *url; + const unsigned char *mask; + } + url_hints[] = + { + { asfmagic, L".asf" }, + { wavmagic, L".wav", wavmask }, + { isommagic, L".mp4", mp4mask }, + { mp42magic, L".mp4", mp4mask }, + { mp4_magic, L".mp4", mp4mask }, + { mp4vmagic, L".m4v", mp4mask }, + }; + unsigned char buffer[4 * sizeof(unsigned int)], pattern[4 * sizeof(unsigned int)]; + unsigned int i, j, length = 0, caps = 0; + IMFAttributes *attributes; + QWORD position; + HRESULT hr; + + *url = NULL; + + if (SUCCEEDED(IMFByteStream_QueryInterface(stream, &IID_IMFAttributes, (void **)&attributes))) + { + IMFAttributes_GetStringLength(attributes, &MF_BYTESTREAM_CONTENT_TYPE, &length); + IMFAttributes_Release(attributes); + } + + if (length) + return S_OK; + + if (FAILED(hr = IMFByteStream_GetCapabilities(stream, &caps))) + return hr; + + if (!(caps & MFBYTESTREAM_IS_SEEKABLE)) + return S_OK; + + if (FAILED(hr = IMFByteStream_GetCurrentPosition(stream, &position))) + return hr; + + hr = IMFByteStream_Read(stream, buffer, sizeof(buffer), &length); + IMFByteStream_SetCurrentPosition(stream, position); + if (FAILED(hr)) + return hr; + + if (length < sizeof(buffer)) + return S_OK; + + for (i = 0; i < ARRAY_SIZE(url_hints); ++i) + { + memcpy(pattern, buffer, sizeof(buffer)); + if (url_hints[i].mask) + { + unsigned int *mask = (unsigned int *)url_hints[i].mask; + unsigned int *data = (unsigned int *)pattern; + + for (j = 0; j < sizeof(buffer) / sizeof(unsigned int); ++j) + data[j] &= mask[j]; + + } + if (!memcmp(pattern, url_hints[i].magic, sizeof(pattern))) + { + *url = url_hints[i].url; + break; + } + } + + if (*url) + TRACE("Stream type guessed as %s from %s.\n", debugstr_w(*url), debugstr_an((char *)buffer, length)); + else + WARN("Unrecognized content type %s.\n", debugstr_an((char *)buffer, length)); + + return S_OK; +} + static HRESULT create_source_reader_from_stream(IMFByteStream *stream, IMFAttributes *attributes, REFIID riid, void **out) { @@ -2479,8 +2565,13 @@ static HRESULT create_source_reader_from_stream(IMFByteStream *stream, IMFAttrib IMFSourceResolver *resolver; MF_OBJECT_TYPE obj_type; IMFMediaSource *source; + const WCHAR *url; HRESULT hr; + /* If stream does not have content type set, try to guess from starting byte sequence. */ + if (FAILED(hr = bytestream_get_url_hint(stream, &url))) + return hr; + if (FAILED(hr = MFCreateSourceResolver(&resolver))) return hr; @@ -2488,7 +2579,7 @@ static HRESULT create_source_reader_from_stream(IMFByteStream *stream, IMFAttrib IMFAttributes_GetUnknown(attributes, &MF_SOURCE_READER_MEDIASOURCE_CONFIG, &IID_IPropertyStore, (void **)&props); - hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, NULL, MF_RESOLUTION_MEDIASOURCE + hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, url, MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE, props, &obj_type, (IUnknown **)&source); IMFSourceResolver_Release(resolver); if (props) diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 319717e..02cd1c5 100644 --- wine/include/wine/strmbase.h +++ wine/include/wine/strmbase.h @@ -38,7 +38,6 @@ struct strmbase_pin struct strmbase_filter *filter; PIN_DIRECTION dir; WCHAR name[128]; - WCHAR id[128]; IPin *peer; AM_MEDIA_TYPE mt; @@ -108,6 +107,8 @@ struct strmbase_sink_ops }; /* Base Pin */ +HRESULT WINAPI BaseOutputPinImpl_GetDeliveryBuffer(struct strmbase_source *pin, IMediaSample **sample, REFERENCE_TIME *start, REFERENCE_TIME *stop, DWORD flags); +HRESULT WINAPI BaseOutputPinImpl_InitAllocator(struct strmbase_source *pin, IMemAllocator **allocator); HRESULT WINAPI BaseOutputPinImpl_DecideAllocator(struct strmbase_source *pin, IMemInputPin *peer, IMemAllocator **allocator); HRESULT WINAPI BaseOutputPinImpl_AttemptConnection(struct strmbase_source *pin, IPin *peer, const AM_MEDIA_TYPE *mt); -- 2.39.2 (Apple Git-144) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 51a14338..3626c740 100644 --- wine/dlls/kernel32/kernel32.spec +++ wine/dlls/kernel32/kernel32.spec @@ -370,6 +370,7 @@ @ stdcall -import DeleteProcThreadAttributeList(ptr) # @ stub DisableThreadProfiling @ stdcall DisassociateCurrentThreadFromCallback(ptr) NTDLL.TpDisassociateCallback +@ stdcall DiscardVirtualMemory(ptr long) kernelbase.DiscardVirtualMemory @ stdcall DeleteTimerQueue(long) @ stdcall -import DeleteTimerQueueEx(long long) @ stdcall -import DeleteTimerQueueTimer(long long long) diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 3fb2192b..ae6bc842 100644 --- wine/dlls/kernelbase/kernelbase.spec +++ wine/dlls/kernelbase/kernelbase.spec @@ -269,7 +269,7 @@ @ stdcall DisablePredefinedHandleTableInternal(long) @ stdcall DisableThreadLibraryCalls(long) @ stdcall DisassociateCurrentThreadFromCallback(ptr) ntdll.TpDisassociateCallback -# @ stub DiscardVirtualMemory +@ stdcall DiscardVirtualMemory(ptr long) @ stdcall DisconnectNamedPipe(long) @ stdcall DnsHostnameToComputerNameExW(wstr ptr ptr) # @ stub DsBindWithSpnExW @@ -1247,7 +1247,7 @@ @ stdcall QueryThreadpoolStackInformation(ptr ptr) @ stdcall QueryUnbiasedInterruptTime(ptr) ntdll.RtlQueryUnbiasedInterruptTime # @ stub QueryUnbiasedInterruptTimePrecise -# @ stub QueryVirtualMemoryInformation +@ stdcall QueryVirtualMemoryInformation(long ptr long ptr long ptr) @ stdcall QueryWorkingSet(long ptr long) @ stdcall QueryWorkingSetEx(long ptr long) @ stdcall QueueUserAPC(ptr long long) diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index e5ad1e5a..83a40a7c 100644 --- wine/dlls/kernelbase/memory.c +++ wine/dlls/kernelbase/memory.c @@ -49,6 +49,19 @@ WINE_DECLARE_DEBUG_CHANNEL(globalmem); ***********************************************************************/ +/*********************************************************************** + * DiscardVirtualMemory (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH DiscardVirtualMemory( void *addr, SIZE_T size ) +{ + NTSTATUS status; + LPVOID ret = addr; + + status = NtAllocateVirtualMemory( GetCurrentProcess(), &ret, 0, &size, MEM_RESET, PAGE_NOACCESS ); + return RtlNtStatusToDosError( status ); +} + + /*********************************************************************** * FlushViewOfFile (kernelbase.@) */ @@ -1286,6 +1299,23 @@ LPVOID WINAPI DECLSPEC_HOTPATCH VirtualAllocExNuma( HANDLE process, void *addr, } +/*********************************************************************** + * QueryVirtualMemoryInformation (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH QueryVirtualMemoryInformation( HANDLE process, const void *addr, + WIN32_MEMORY_INFORMATION_CLASS info_class, void *info, SIZE_T size, SIZE_T *ret_size) +{ + switch (info_class) + { + case MemoryRegionInfo: + return set_ntstatus( NtQueryVirtualMemory( process, addr, MemoryRegionInformation, info, size, ret_size )); + default: + FIXME("Unsupported info class %u.\n", info_class); + return FALSE; + } +} + + /*********************************************************************** * CPU functions ***********************************************************************/ diff --git a/include/Makefile.in b/include/Makefile.in index f262c7a9..8cf0db6d 100644 --- wine/include/Makefile.in +++ wine/include/Makefile.in @@ -413,6 +413,7 @@ SOURCES = \ mcx.h \ mediaerr.h \ mediaobj.idl \ + memoryapi.h \ metahost.idl \ mfapi.h \ mfd3d12.idl \ diff --git a/include/memoryapi.h b/include/memoryapi.h new file mode 100644 index 00000000..6728b832 --- /dev/null +++ wine/include/memoryapi.h @@ -0,0 +1,46 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +typedef enum WIN32_MEMORY_INFORMATION_CLASS +{ + MemoryRegionInfo +} WIN32_MEMORY_INFORMATION_CLASS; + +typedef struct WIN32_MEMORY_REGION_INFORMATION +{ + PVOID AllocationBase; + ULONG AllocationProtect; + union + { + ULONG Flags; + struct + { + ULONG Private : 1; + ULONG MappedDataFile : 1; + ULONG MappedImage : 1; + ULONG MappedPageFile : 1; + ULONG MappedPhysical : 1; + ULONG DirectMapped : 1; + ULONG Reserved : 26; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + SIZE_T RegionSize; + SIZE_T CommitSize; +} WIN32_MEMORY_REGION_INFORMATION; + +DWORD WINAPI DiscardVirtualMemory(void *addr, SIZE_T size); +BOOL WINAPI QueryVirtualMemoryInformation(HANDLE process,const void *addr, + WIN32_MEMORY_INFORMATION_CLASS info_class, void *info, SIZE_T size, SIZE_T *ret_size); diff --git a/include/winbase.h b/include/winbase.h index c8c893d8..55a5c59c 100644 --- wine/include/winbase.h +++ wine/include/winbase.h @@ -45,6 +45,7 @@ extern "C" { #include #include #include +#include /* Windows Exit Procedure flag values */ #define WEP_FREE_DLL 0 -- 2.39.2 (Apple Git-144) diff --git a/dlls/winemac.drv/macdrv_main.c b/dlls/winemac.drv/macdrv_main.c index 50e926c6aaa..35f0c3e9204 100644 --- wine/dlls/winemac.drv/macdrv_main.c +++ wine/dlls/winemac.drv/macdrv_main.c @@ -507,3 +507,62 @@ BOOL macdrv_SystemParametersInfo( UINT action, UINT int_param, void *ptr_param, } return FALSE; } + +#if defined(__x86_64__) && !defined(__i386_on_x86_64__) +struct macdrv_functions_t +{ + void (*macdrv_init_display_devices)(BOOL); + struct macdrv_win_data*(*get_win_data)(HWND hwnd); + void (*release_win_data)(struct macdrv_win_data *data); + macdrv_window(*macdrv_get_cocoa_window)(HWND hwnd, BOOL require_on_screen); + macdrv_metal_device (*macdrv_create_metal_device)(void); + void (*macdrv_release_metal_device)(macdrv_metal_device d); + macdrv_metal_view (*macdrv_view_create_metal_view)(macdrv_view v, macdrv_metal_device d); + macdrv_metal_layer (*macdrv_view_get_metal_layer)(macdrv_metal_view v); + void (*macdrv_view_release_metal_view)(macdrv_metal_view v); + void (*on_main_thread)(dispatch_block_t b); + LSTATUS(WINAPI*RegQueryValueExA)(HKEY, LPCSTR, LPDWORD, LPDWORD, BYTE*, LPDWORD); + LSTATUS(WINAPI*RegSetValueExA)(HKEY, LPCSTR, DWORD, DWORD, const BYTE*, DWORD); + LSTATUS(WINAPI*RegOpenKeyExA)(HKEY, LPCSTR, DWORD, DWORD, HKEY*); + LSTATUS(WINAPI*RegCreateKeyExA)(HKEY, LPCSTR, DWORD, LPSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, HKEY*, LPDWORD); + LSTATUS(WINAPI*RegCloseKey)(HKEY); + BOOL(WINAPI*EnumDisplayMonitors)(HDC,LPRECT,MONITORENUMPROC,LPARAM); + BOOL(WINAPI*GetMonitorInfoA)(HMONITOR,LPMONITORINFO); + BOOL(WINAPI*AdjustWindowRectEx)(LPRECT,DWORD,BOOL,DWORD); + LONG_PTR(WINAPI*GetWindowLongPtrW)(HWND,int); + BOOL(WINAPI*GetWindowRect)(HWND,LPRECT); + BOOL(WINAPI*MoveWindow)(HWND,int,int,int,int,BOOL); + BOOL(WINAPI*SetWindowPos)(HWND,HWND,int,int,int,int,UINT); + INT(WINAPI*GetSystemMetrics)(INT); + LONG_PTR(WINAPI*SetWindowLongPtrW)(HWND,INT,LONG_PTR); +}; + +void OnMainThread(dispatch_block_t); + +struct macdrv_functions_t macdrv_functions = { + &macdrv_init_display_devices, + &get_win_data, + &release_win_data, + &macdrv_get_cocoa_window, + &macdrv_create_metal_device, + &macdrv_release_metal_device, + &macdrv_view_create_metal_view, + &macdrv_view_get_metal_layer, + &macdrv_view_release_metal_view, + &OnMainThread, + &RegQueryValueExA, + &RegSetValueExA, + &RegOpenKeyExA, + &RegCreateKeyExA, + &RegCloseKey, + &EnumDisplayMonitors, + &GetMonitorInfoA, + &AdjustWindowRectEx, + &GetWindowLongPtrW, + &GetWindowRect, + &MoveWindow, + &SetWindowPos, + &GetSystemMetrics, + &SetWindowLongPtrW, +}; +#endif \ No newline at end of file -- 2.39.2 (Apple Git-144) diff --git a/loader/preloader_mac.c b/loader/preloader_mac.c index 8b924f78c15..412bd638a3a 100644 --- wine/loader/preloader_mac.c +++ wine/loader/preloader_mac.c @@ -299,6 +299,7 @@ void *wld_munmap( void *start, size_t len ); SYSCALL_FUNC( wld_munmap, 73 /* SYS_munmap */ ); static intptr_t (*p_dyld_get_image_slide)( const struct target_mach_header* mh ); +static void (*p_dyld_make_delayed_module_initializer_calls)(void); #define MAKE_FUNCPTR(f) static typeof(f) * p##f MAKE_FUNCPTR(dlopen); @@ -635,6 +636,7 @@ void *wld_start( void *stack, int *is_unix_thread ) LOAD_POSIX_DYLD_FUNC( dlopen ); LOAD_POSIX_DYLD_FUNC( dlsym ); LOAD_POSIX_DYLD_FUNC( dladdr ); + LOAD_MACHO_DYLD_FUNC( _dyld_make_delayed_module_initializer_calls ); LOAD_MACHO_DYLD_FUNC( _dyld_get_image_slide ); #ifdef __i386__ /* CrossOver Hack #16371 */ @@ -664,6 +666,8 @@ void *wld_start( void *stack, int *is_unix_thread ) if (!map_region( &builtin_dlls )) builtin_dlls.size = 0; + p_dyld_make_delayed_module_initializer_calls(); + /* load the main binary */ if (!(mod = pdlopen( argv[1], RTLD_NOW ))) fatal_error( "%s: could not load binary\n", argv[1] ); -- 2.39.2 (Apple Git-144) diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 3d85d46abfc..950b6da44d3 100644 --- wine/dlls/ntdll/unix/signal_x86_64.c +++ wine/dlls/ntdll/unix/signal_x86_64.c @@ -2949,6 +2949,20 @@ static void usr1_handler( int signal, siginfo_t *siginfo, void *ucontext ) } } +static void sigsys_handler( int signal, siginfo_t *siginfo, void *sigcontext ) +{ + ucontext_t *ctx = sigcontext; + void ***rsp; + + TRACE("SIGSYS, rax %#llx, rip %#llx.\n", RAX_sig(ctx), RIP_sig(ctx)); + + rsp = (void ***)&RSP_sig(ctx); + *rsp -= 1; + **rsp = (void *)(RIP_sig(ctx) + 0xb); + + RIP_sig(ctx) = ((ULONG64)__wine_syscall_dispatcher); +} + /*********************************************************************** * LDT support @@ -3292,6 +3311,8 @@ void signal_init_process(void) if (sigaction( SIGSEGV, &sig_act, NULL ) == -1) goto error; if (sigaction( SIGILL, &sig_act, NULL ) == -1) goto error; if (sigaction( SIGBUS, &sig_act, NULL ) == -1) goto error; + sig_act.sa_sigaction = sigsys_handler; + if (sigaction( SIGSYS, &sig_act, NULL ) == -1) goto error; return; error: -- 2.39.2 (Apple Git-144) diff --git a/dlls/atiadlxx/atiadlxx.spec b/dlls/atiadlxx/atiadlxx.spec index 1e447f38ded..80efd6eebb6 100644 --- wine/dlls/atiadlxx/atiadlxx.spec +++ wine/dlls/atiadlxx/atiadlxx.spec @@ -17,10 +17,10 @@ @ stub ADL2_Adapter_Active_Get @ stub ADL2_Adapter_Active_Set @ stub ADL2_Adapter_Active_SetPrefer -@ stub ADL2_Adapter_AdapterInfoX2_Get +@ stdcall ADL2_Adapter_AdapterInfoX2_Get(ptr ptr) @ stub ADL2_Adapter_AdapterInfoX3_Get @ stub ADL2_Adapter_AdapterInfoX4_Get -@ stub ADL2_Adapter_AdapterInfo_Get +@ stdcall ADL2_Adapter_AdapterInfo_Get(ptr ptr long) @ stub ADL2_Adapter_AdapterList_Disable @ stub ADL2_Adapter_AdapterLocationPath_Get @ stub ADL2_Adapter_Aspects_Get @@ -82,7 +82,7 @@ @ stub ADL2_Adapter_FrameMetrics_Stop @ stub ADL2_Adapter_Gamma_Get @ stub ADL2_Adapter_Gamma_Set -@ stub ADL2_Adapter_Graphic_Core_Info_Get +@ stdcall ADL2_Adapter_Graphic_Core_Info_Get(ptr long ptr) @ stub ADL2_Adapter_HBC_Caps @ stub ADL2_Adapter_HBM_ECC_UC_Check @ stub ADL2_Adapter_Headless_Get @@ -452,7 +452,7 @@ @ stub ADL2_MMD_Video_Caps @ stub ADL2_Main_ControlX2_Create @ stdcall ADL2_Main_Control_Create(ptr long ptr) -@ stub ADL2_Main_Control_Destroy +@ stdcall ADL2_Main_Control_Destroy() @ stub ADL2_Main_Control_GetProcAddress @ stub ADL2_Main_Control_IsFunctionValid @ stub ADL2_Main_Control_Refresh @@ -553,7 +553,7 @@ @ stub ADL2_OverdriveN_ThrottleNotification_Get @ stub ADL2_OverdriveN_ZeroRPMFan_Get @ stub ADL2_OverdriveN_ZeroRPMFan_Set -@ stub ADL2_Overdrive_Caps +@ stdcall ADL2_Overdrive_Caps(ptr long ptr ptr ptr) @ stub ADL2_PPLogSettings_Get @ stub ADL2_PPLogSettings_Set @ stub ADL2_PPW_Caps @@ -745,7 +745,7 @@ @ stdcall ADL_Adapter_NumberOfAdapters_Get(ptr) @ stdcall ADL_Adapter_ObservedClockInfo_Get(long ptr ptr) @ stub ADL_Adapter_ObservedGameClockInfo_Get -@ stub ADL_Adapter_Primary_Get +@ stdcall ADL_Adapter_Primary_Get(long) @ stub ADL_Adapter_Primary_Set @ stub ADL_Adapter_RegValueInt_Get @ stub ADL_Adapter_RegValueInt_Set @@ -853,7 +853,7 @@ @ stub ADL_Display_DitherState_Set @ stub ADL_Display_Downscaling_Caps @ stub ADL_Display_DpMstInfo_Get -@ stub ADL_Display_EdidData_Get +@ stdcall ADL_Display_EdidData_Get(long long ptr) @ stub ADL_Display_EdidData_Set @ stub ADL_Display_EnumDisplays_Get @ stub ADL_Display_FilterSVideo_Get diff --git a/dlls/atiadlxx/atiadlxx_main.c b/dlls/atiadlxx/atiadlxx_main.c index 21dfbe71096..9b35cac4fb1 100644 --- wine/dlls/atiadlxx/atiadlxx_main.c +++ wine/dlls/atiadlxx/atiadlxx_main.c @@ -171,6 +171,24 @@ typedef struct ADLDisplayMap int iDisplayMapValue; } ADLDisplayMap, *LPADLDisplayMap; +typedef struct ADLGraphicInfoCore +{ + union + { + int iNumPEsPerCU; + int iNumPEsPerWGP; + }; + union + { + int iNumCUs; + int iNumWGPs; + }; + int iGCGen; + int iNumROPs; + int iNumSIMDs; + int iReserved[11]; +} ADLGraphicInfoCore, *LPADLGraphicInfoCore; + static const ADLVersionsInfo version = { "22.20.19.16-221003a-384125E-AMD-Software-Adrenalin-Edition", "", @@ -184,10 +202,11 @@ static const ADLVersionsInfoX2 version2 = { "http://support.amd.com/drivers/xml/driver_09_us.xml", }; +int WINAPI ADL_Main_Control_Create(ADL_MAIN_MALLOC_CALLBACK cb, int arg); int WINAPI ADL2_Main_Control_Create(ADL_MAIN_MALLOC_CALLBACK cb, int arg, ADL_CONTEXT_HANDLE *ptr) { FIXME("cb %p, arg %d, ptr %p stub!\n", cb, arg, ptr); - return ADL_OK; + return ADL_Main_Control_Create(cb, arg); } int WINAPI ADL_Main_Control_Create(ADL_MAIN_MALLOC_CALLBACK cb, int arg) @@ -212,15 +231,20 @@ int WINAPI ADL_Main_Control_Destroy(void) return ADL_OK; } -int WINAPI ADL2_Adapter_NumberOfAdapters_Get(ADL_CONTEXT_HANDLE *ptr, int *count) +int WINAPI ADL2_Main_Control_Destroy(void) { - FIXME("ptr %p, count %p stub!\n", ptr, count); - - *count = 0; + FIXME("stub!\n"); return ADL_OK; } +int WINAPI ADL_Adapter_NumberOfAdapters_Get(int *count); +int WINAPI ADL2_Adapter_NumberOfAdapters_Get(ADL_CONTEXT_HANDLE *ptr, int *count) +{ + FIXME("ptr %p, count %p stub!\n", ptr, count); + return ADL_Adapter_NumberOfAdapters_Get(count); +} + int WINAPI ADL2_Graphics_VersionsX2_Get(ADL_CONTEXT_HANDLE *ptr, ADLVersionsInfoX2 *ver) { FIXME("ptr %p, ver %p stub!\n", ptr, ver); @@ -235,6 +259,21 @@ int WINAPI ADL_Graphics_Versions_Get(ADLVersionsInfo *ver) return ADL_OK; } +int WINAPI ADL2_Adapter_Graphic_Core_Info_Get(ADL_CONTEXT_HANDLE *ptr, int iAdapterIndex, LPADLGraphicInfoCore pGraphicsInfo) +{ + FIXME("ptr %p, iAdapterIndex %u, pGraphicsInfo %p\n", ptr, iAdapterIndex, pGraphicsInfo); + return ADL_OK; +} + +int WINAPI ADL2_Overdrive_Caps(ADL_CONTEXT_HANDLE *ptr, int iAdapterIndex, int *iSupported, int *iEnabled, int *iVersion) +{ + FIXME("ptr %p, iAdapterIndex %u\n"); + *iSupported = 0; + *iEnabled = 0; + *iVersion = 0; + return ADL_OK; +} + int WINAPI ADL_Adapter_NumberOfAdapters_Get(int *count) { IDXGIAdapter *adapter; @@ -275,6 +314,36 @@ static int convert_vendor_id(int id) return atoi(str); } +int WINAPI ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo *adapters, int input_size); + +int WINAPI ADL2_Display_EdidData_Get(int adapter_index, int display_index, void* edid_data) +{ + FIXME("adapter_index %d, display_index %p, edid_data %p\n", + adapter_index, display_index, edid_data); + return ADL_ERR_NOT_SUPPORTED; +} + +int WINAPI ADL2_Adapter_AdapterInfoX2_Get(ADL_CONTEXT_HANDLE* ptr, ADLAdapterInfo **adapters) +{ + TRACE("\n"); + *adapters = (ADLAdapterInfo*)adl_malloc(sizeof(ADLAdapterInfo) * 1); + return ADL_Adapter_AdapterInfo_Get(*adapters, sizeof(ADLAdapterInfo) * 1); +} + +int WINAPI ADL2_Adapter_AdapterInfo_Get(ADL_CONTEXT_HANDLE* ptr, ADLAdapterInfo *adapters, int bufferSize) +{ + TRACE("\n"); + ADLAdapterInfo adapterInfo; + ADL_Adapter_AdapterInfo_Get(&adapterInfo, sizeof(ADLAdapterInfo)); + if (bufferSize <= sizeof(ADLAdapterInfo)) + { + memcpy(adapters, &adapterInfo, bufferSize); + return ADL_OK; + } + + return ADL_ERR; +} + int WINAPI ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo *adapters, int input_size) { int count, i; @@ -452,6 +521,13 @@ int WINAPI ADL_Adapter_MemoryInfo_Get(int adapter_index, ADLMemoryInfo *mem_info return ADL_OK; } +int WINAPI ADL_Adapter_Primary_Get(int* adapter_index) +{ + FIXME("stub!\n"); + *adapter_index = 0; + return ADL_OK; +} + int WINAPI ADL_Graphics_Platform_Get(int *platform) { DXGI_ADAPTER_DESC adapter_desc; @@ -491,3 +567,10 @@ int WINAPI ADL_Display_DisplayMapConfig_Get(int adapter_index, int *display_map_ return ADL_ERR; } + +int WINAPI ADL_Display_EdidData_Get(int adapter_index, int display_index, void* edid_data) +{ + FIXME("adapter_index %d, display_index %p, edid_data %p\n", + adapter_index, display_index, edid_data); + return ADL_ERR_NOT_SUPPORTED; +} -- 2.39.2 (Apple Git-144) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index fd0af32e..51c619b7 100644 --- wine/dlls/ntdll/loader.c +++ wine/dlls/ntdll/loader.c @@ -2294,6 +2294,12 @@ static NTSTATUS build_module( LPCWSTR load_path, const UNICODE_STRING *nt_name, TRACE_(loaddll)( "Loaded %s at %p: %s\n", debugstr_w(wm->ldr.FullDllName.Buffer), *module, is_builtin ? "builtin" : "native" ); +#if defined(__x86_64__) + if (is_builtin == FALSE) + { + unix_funcs->pe_module_loaded(*module, (void*)((BYTE*)*module + map_size)); + } +#endif wm->ldr.LoadCount = 1; *pwm = wm; *module = NULL; @@ -3477,8 +3483,8 @@ static NTSTATUS load_dll( const WCHAR *load_path, const WCHAR *libname, DWORD fl case STATUS_SUCCESS: /* valid PE file */ nts = load_native_dll( load_path, &nt_name, mapping, &image_info, &id, flags, system, pwm ); -#ifdef __x86_64__ - if (nts == STATUS_SUCCESS && !wcscmp( libname, L"libcef.dll" )) +#if defined(__APPLE__) && defined(__x86_64__) + if (nts == STATUS_SUCCESS && !wcscmp( libname, L"libcef.dll" ) && unix_funcs->gs_patching_needed()) patch_libcef( pwm ); #endif break; diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index e086c88e..bed76762 100644 --- wine/dlls/ntdll/unix/loader.c +++ wine/dlls/ntdll/unix/loader.c @@ -1544,6 +1544,44 @@ NTSTATUS WINAPI __wine_unix_call( unixlib_handle_t handle, unsigned int code, vo return ((unixlib_entry_t*)(UINT_PTR)handle)[code]( args ); } +#if defined(__APPLE__) && defined(__x86_64__) +static void* non_native_support_lib; +static void (*register_non_native_code_region) (void*, void*); +static bool (*supports_non_native_code_regions) (void); +static void init_non_native_support(void) +{ + register_non_native_code_region = NULL; + register_non_native_code_region = NULL; + non_native_support_lib = dlopen("@rpath/libd3dshared.dylib", RTLD_LOCAL); + if (non_native_support_lib) + { + register_non_native_code_region = dlsym(non_native_support_lib, "register_non_native_code_region"); + supports_non_native_code_regions = dlsym(non_native_support_lib, "supports_non_native_code_regions"); + } +} + +static void CDECL pe_module_loaded(void* start, void* end) +{ + if ((supports_non_native_code_regions && supports_non_native_code_regions())) + { + TRACE("Marking non_native_code_region: %p, %p", start, end); + register_non_native_code_region(start, end); + } +} +static BOOL CDECL gs_patching_needed(void) +{ + return (supports_non_native_code_regions && supports_non_native_code_regions() == false); +} +#elif defined(__x86_64__) +static void CDECL pe_module_loaded(void* start, void* end) +{ + +} +static BOOL CDECL gs_patching_needed(void) +{ + return false; +} +#endif /*********************************************************************** * load_so_dll @@ -2345,6 +2383,10 @@ static struct unix_funcs unix_funcs = #ifdef __aarch64__ NtCurrentTeb, #endif +#if defined(__x86_64__) + pe_module_loaded, + gs_patching_needed, +#endif }; @@ -2460,6 +2502,10 @@ static void start_main_thread(void) dlopen_32on64_opengl32(); #endif } + else + { + init_non_native_support(); + } load_apiset_dll(); ntdll_init_syscalls( 0, &syscall_table, p__wine_syscall_dispatcher ); status = p__wine_set_unix_funcs( NTDLL_UNIXLIB_VERSION, &unix_funcs ); diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index cb184431..1ea1a3b4 100644 --- wine/dlls/ntdll/unixlib.h +++ wine/dlls/ntdll/unixlib.h @@ -26,7 +26,7 @@ struct _DISPATCHER_CONTEXT; /* increment this when you change the function table */ -#define NTDLL_UNIXLIB_VERSION 134 +#define NTDLL_UNIXLIB_VERSION 135 struct unix_funcs { @@ -40,6 +40,10 @@ struct unix_funcs #ifdef __aarch64__ TEB * (WINAPI *NtCurrentTeb)(void); #endif +#if defined(__x86_64__) + void (CDECL *pe_module_loaded)(void* start, void* end); + BOOL (CDECL *gs_patching_needed)(void); +#endif }; #endif /* __NTDLL_UNIXLIB_H */ diff --git a/dlls/atiadlxx/atiadlxx.spec b/dlls/atiadlxx/atiadlxx.spec index 80efd6ee..752e805a 100644 --- wine/dlls/atiadlxx/atiadlxx.spec +++ wine/dlls/atiadlxx/atiadlxx.spec @@ -94,7 +94,7 @@ @ stub ADL2_Adapter_MVPU_Set @ stub ADL2_Adapter_MaxCursorSize_Get @ stub ADL2_Adapter_MemoryInfo2_Get -@ stub ADL2_Adapter_MemoryInfo_Get +@ stdcall ADL2_Adapter_MemoryInfo_Get(ptr long ptr) @ stub ADL2_Adapter_MirabilisSupport_Get @ stub ADL2_Adapter_ModeSwitch @ stub ADL2_Adapter_ModeTimingOverride_Caps @@ -249,7 +249,7 @@ @ stub ADL2_Display_DCE_Get @ stub ADL2_Display_DCE_Set @ stub ADL2_Display_DDCBlockAccess_Get -@ stub ADL2_Display_DDCInfo2_Get +@ stdcall ADL2_Display_DDCInfo2_Get(ptr long long ptr) @ stub ADL2_Display_DDCInfo_Get @ stub ADL2_Display_Deflicker_Get @ stub ADL2_Display_Deflicker_Set @@ -257,9 +257,9 @@ @ stub ADL2_Display_DisplayContent_Cap @ stub ADL2_Display_DisplayContent_Get @ stub ADL2_Display_DisplayContent_Set -@ stub ADL2_Display_DisplayInfo_Get +@ stdcall ADL2_Display_DisplayInfo_Get(ptr long ptr ptr long) @ stub ADL2_Display_DisplayMapConfigX2_Set -@ stub ADL2_Display_DisplayMapConfig_Get +@ stdcall ADL2_Display_DisplayMapConfig_Get(ptr long ptr ptr ptr ptr long) @ stub ADL2_Display_DisplayMapConfig_PossibleAddAndRemove @ stub ADL2_Display_DisplayMapConfig_Set @ stub ADL2_Display_DisplayMapConfig_Validate @@ -281,7 +281,7 @@ @ stub ADL2_Display_FormatsOverride_Set @ stub ADL2_Display_FreeSyncState_Get @ stub ADL2_Display_FreeSyncState_Set -@ stub ADL2_Display_FreeSync_Cap +@ stdcall ADL2_Display_FreeSync_Cap(ptr long long ptr) @ stub ADL2_Display_GamutMapping_Get @ stub ADL2_Display_GamutMapping_Reset @ stub ADL2_Display_GamutMapping_Set @@ -315,7 +315,7 @@ @ stub ADL2_Display_ModeTimingOverride_Delete @ stub ADL2_Display_ModeTimingOverride_Get @ stub ADL2_Display_ModeTimingOverride_Set -@ stub ADL2_Display_Modes_Get +@ stdcall ADL2_Display_Modes_Get(ptr long long ptr ptr) @ stub ADL2_Display_Modes_Set @ stub ADL2_Display_Modes_X2_Get @ stub ADL2_Display_MonitorPowerState_Set @@ -744,7 +744,7 @@ @ stub ADL_Adapter_NumberOfActivatableSources_Get @ stdcall ADL_Adapter_NumberOfAdapters_Get(ptr) @ stdcall ADL_Adapter_ObservedClockInfo_Get(long ptr ptr) -@ stub ADL_Adapter_ObservedGameClockInfo_Get +@ stdcall ADL_Adapter_ObservedGameClockInfo_Get(ptr long ptr ptr ptr ptr) @ stdcall ADL_Adapter_Primary_Get(long) @ stub ADL_Adapter_Primary_Set @ stub ADL_Adapter_RegValueInt_Get diff --git a/dlls/atiadlxx/atiadlxx_main.c b/dlls/atiadlxx/atiadlxx_main.c index 9b35cac4..3018336c 100644 --- wine/dlls/atiadlxx/atiadlxx_main.c +++ wine/dlls/atiadlxx/atiadlxx_main.c @@ -63,6 +63,14 @@ typedef void *ADL_CONTEXT_HANDLE; ADL_MAIN_MALLOC_CALLBACK adl_malloc; #define ADL_MAX_PATH 256 +typedef struct ADLDDCInfo2 { + +} ADLDDCInfo2; + +typedef struct ADLFreeSyncCap { + +} ADLFreeSyncCap; + typedef struct ADLVersionsInfo { char strDriverVer[ADL_MAX_PATH]; @@ -325,15 +333,15 @@ int WINAPI ADL2_Display_EdidData_Get(int adapter_index, int display_index, void* int WINAPI ADL2_Adapter_AdapterInfoX2_Get(ADL_CONTEXT_HANDLE* ptr, ADLAdapterInfo **adapters) { - TRACE("\n"); + FIXME("stub!\n"); *adapters = (ADLAdapterInfo*)adl_malloc(sizeof(ADLAdapterInfo) * 1); return ADL_Adapter_AdapterInfo_Get(*adapters, sizeof(ADLAdapterInfo) * 1); } int WINAPI ADL2_Adapter_AdapterInfo_Get(ADL_CONTEXT_HANDLE* ptr, ADLAdapterInfo *adapters, int bufferSize) { - TRACE("\n"); ADLAdapterInfo adapterInfo; + TRACE("stub!"); ADL_Adapter_AdapterInfo_Get(&adapterInfo, sizeof(ADLAdapterInfo)); if (bufferSize <= sizeof(ADLAdapterInfo)) { @@ -346,7 +354,7 @@ int WINAPI ADL2_Adapter_AdapterInfo_Get(ADL_CONTEXT_HANDLE* ptr, ADLAdapterInfo int WINAPI ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo *adapters, int input_size) { - int count, i; + int count, i, j; DXGI_ADAPTER_DESC adapter_desc; FIXME("adapters %p, input_size %d, stub!\n", adapters, input_size); @@ -362,11 +370,18 @@ int WINAPI ADL_Adapter_AdapterInfo_Get(ADLAdapterInfo *adapters, int input_size) { adapters[i].iSize = sizeof(ADLAdapterInfo); adapters[i].iAdapterIndex = i; if (get_adapter_desc(i, &adapter_desc) != ADL_OK) return ADL_ERR; adapters[i].iVendorID = convert_vendor_id(adapter_desc.VendorId); + + for (j = 0; j < 128; ++j) + { + adapters[i].strAdapterName[j] = (char)adapter_desc.Description[j]; + if (adapters[i].strAdapterName[j] == 0) + break; + } } return ADL_OK; @@ -411,6 +434,12 @@ int WINAPI ADL_Display_DisplayInfo_Get(int adapter_index, int *num_displays, ADL return ADL_OK; } +int WINAPI ADL2_Display_DisplayInfo_Get(ADL_CONTEXT_HANDLE context, int adapter_index, int *num_displays, ADLDisplayInfo **info, int force_detect) +{ + FIXME("adapter: %d, stub!\n", adapter_index); + return ADL_Display_DisplayInfo_Get(adapter_index, num_displays, info, force_detect); +} + int WINAPI ADL_Adapter_Crossfire_Caps(int adapter_index, int *preffered, int *num_comb, ADLCrossfireComb** comb) { FIXME("adapter %d, preffered %p, num_comb %p, comb %p stub!\n", adapter_index, preffered, num_comb, comb); @@ -501,6 +530,23 @@ int WINAPI ADL_Adapter_ObservedClockInfo_Get(int adapter_index, int *core_clock, return ADL_OK; } +int WINAPI ADL_Adapter_ObservedGameClockInfo_Get(ADL_CONTEXT_HANDLE context, int adapter_index, int* base_clock, int* game_clock, int* boost_clock, int* memory_clock) +{ + int retStatus; + FIXME("adapter: %d, stub!\n", adapter_index); + retStatus = ADL_Adapter_ObservedClockInfo_Get(adapter_index, base_clock, memory_clock); + if (retStatus == ADL_OK) + { + *game_clock = *base_clock; + *boost_clock = *base_clock; + + TRACE("*base_clock: %i, *game_clock: %i, *boost_clock: %i, *memory_clock: %i\n", + *base_clock, *game_clock, *boost_clock, *memory_clock); + } + return retStatus; +} + + /* documented in the "Linux Specific APIs" section, present and used on Windows */ int WINAPI ADL_Adapter_MemoryInfo_Get(int adapter_index, ADLMemoryInfo *mem_info) { @@ -521,6 +567,12 @@ int WINAPI ADL_Adapter_MemoryInfo_Get(int adapter_index, ADLMemoryInfo *mem_info return ADL_OK; } +int WINAPI ADL2_Adapter_MemoryInfo_Get(ADL_CONTEXT_HANDLE context, int adapter_index, ADLMemoryInfo *mem_info) +{ + FIXME("adapter %d, stub!\n", adapter_index); + return ADL_Adapter_MemoryInfo_Get(adapter_index, mem_info); +} + int WINAPI ADL_Adapter_Primary_Get(int* adapter_index) { FIXME("stub!\n"); @@ -565,7 +617,14 @@ int WINAPI ADL_Display_DisplayMapConfig_Get(int adapter_index, int *display_map_ adapter_index, display_map_count, display_maps, display_target_count, display_targets, options); - return ADL_ERR; + return ADL_ERR_NOT_SUPPORTED; +} + +int WINAPI ADL2_Display_DisplayMapConfig_Get(ADL_CONTEXT_HANDLE context, int adapter_index, int *display_map_count, ADLDisplayMap **display_maps, + int *display_target_count, ADLDisplayTarget **display_targets, int options) +{ + FIXME("adapter_index %d, stub!\n", adapter_index); + return ADL_Display_DisplayMapConfig_Get(adapter_index, display_map_count, display_maps, display_target_count, display_targets, options); } int WINAPI ADL_Display_EdidData_Get(int adapter_index, int display_index, void* edid_data) @@ -574,3 +633,21 @@ int WINAPI ADL_Display_EdidData_Get(int adapter_index, int display_index, void* adapter_index, display_index, edid_data); return ADL_ERR_NOT_SUPPORTED; } + +int WINAPI ADL2_Display_Modes_Get(ADL_CONTEXT_HANDLE context, int adapter_index, int display_index, int *num_modes, ADLMode *modes) +{ + FIXME("adapter: %d, display: %d, stub!\n", adapter_index, display_index); + return ADL_ERR_NOT_SUPPORTED; +} + +int WINAPI ADL2_Display_DDCInfo2_Get(ADL_CONTEXT_HANDLE context, int adapter_index, int display_index, ADLDDCInfo2 *info) +{ + FIXME("adapter: %d, display: %d, stub!\n", adapter_index, display_index); + return ADL_ERR_NOT_SUPPORTED; +} + +int WINAPI ADL2_Display_FreeSync_Cap(ADL_CONTEXT_HANDLE context, int adapter_index, int display_index, ADLFreeSyncCap *cap) +{ + FIXME("adapter: %d, display: %d, stub!\n", adapter_index, display_index); + return ADL_ERR_NOT_SUPPORTED; +} \ No newline at end of file -- 2.39.2 (Apple Git-144) diff --git a/dlls/atiadlxx/atiadlxx.spec b/dlls/atiadlxx/atiadlxx.spec index 752e805a..147f6bad 100644 --- wine/dlls/atiadlxx/atiadlxx.spec +++ wine/dlls/atiadlxx/atiadlxx.spec @@ -10,17 +10,17 @@ @ stub ADL2_AdapterLimitation_Caps @ stub ADL2_AdapterX2_Caps @ stub ADL2_Adapter_AMDAndNonAMDDIsplayClone_Get -@ stub ADL2_Adapter_ASICFamilyType_Get +@ stdcall ADL2_Adapter_ASICFamilyType_Get(long long ptr ptr) @ stub ADL2_Adapter_ASICInfo_Get @ stub ADL2_Adapter_Accessibility_Get @ stub ADL2_Adapter_AceDefaults_Restore @ stub ADL2_Adapter_Active_Get @ stub ADL2_Adapter_Active_Set @ stub ADL2_Adapter_Active_SetPrefer -@ stdcall ADL2_Adapter_AdapterInfoX2_Get(ptr ptr) +@ stdcall ADL2_Adapter_AdapterInfoX2_Get(long ptr) @ stub ADL2_Adapter_AdapterInfoX3_Get -@ stub ADL2_Adapter_AdapterInfoX4_Get -@ stdcall ADL2_Adapter_AdapterInfo_Get(ptr ptr long) +@ stdcall ADL2_Adapter_AdapterInfoX4_Get(long long ptr ptr) +@ stdcall ADL2_Adapter_AdapterInfo_Get(long ptr long) @ stub ADL2_Adapter_AdapterList_Disable @ stub ADL2_Adapter_AdapterLocationPath_Get @ stub ADL2_Adapter_Aspects_Get @@ -93,7 +93,7 @@ @ stub ADL2_Adapter_LocalDisplayState_Get @ stub ADL2_Adapter_MVPU_Set @ stub ADL2_Adapter_MaxCursorSize_Get -@ stub ADL2_Adapter_MemoryInfo2_Get +@ stdcall ADL2_Adapter_MemoryInfo2_Get(long long ptr) @ stdcall ADL2_Adapter_MemoryInfo_Get(ptr long ptr) @ stub ADL2_Adapter_MirabilisSupport_Get @ stub ADL2_Adapter_ModeSwitch diff --git a/dlls/atiadlxx/atiadlxx_main.c b/dlls/atiadlxx/atiadlxx_main.c index 3018336c..5d35aff2 100644 --- wine/dlls/atiadlxx/atiadlxx_main.c +++ wine/dlls/atiadlxx/atiadlxx_main.c @@ -104,6 +104,26 @@ typedef struct ADLAdapterInfo { int iOSDisplayIndex; } ADLAdapterInfo, *LPADLAdapterInfo; +typedef struct ADLAdapterInfoX2 { //Matches ADLAdapterInfo until iInfoMask + int iSize; + int iAdapterIndex; + char strUDID[ADL_MAX_PATH]; + int iBusNumber; + int iDeviceNumber; + int iFunctionNumber; + int iVendorID; + char strAdapterName[ADL_MAX_PATH]; + char strDisplayName[ADL_MAX_PATH]; + int iPresent; + int iExist; + char strDriverPath[ADL_MAX_PATH]; + char strDriverPathExt[ADL_MAX_PATH]; + char strPNPString[ADL_MAX_PATH]; + int iOSDisplayIndex; + int iInfoMask; + int iInfoValue; +} ADLAdapterInfoX2, *LPADLAdapterInfoX2; + typedef struct ADLDisplayID { int iDisplayLogicalIndex; @@ -145,6 +165,16 @@ typedef struct ADLMemoryInfo long long iMemoryBandwidth; } ADLMemoryInfo, *LPADLMemoryInfo; +typedef struct ADLMemoryInfo2 +{ + long long iHyperMemorySize; + long long iInvisibleMemorySize; + long long iMemoryBandwidth; + long long iMemorySize; + long long iVisibleMemorySize; + char strMemoryType[ADL_MAX_PATH]; +} ADLMemoryInfo2, *LPADLMemoryInfo2; + typedef struct ADLDisplayTarget { ADLDisplayID displayID; @@ -331,14 +361,37 @@ int WINAPI ADL2_Display_EdidData_Get(int adapter_index, int display_index, void* return ADL_ERR_NOT_SUPPORTED; } -int WINAPI ADL2_Adapter_AdapterInfoX2_Get(ADL_CONTEXT_HANDLE* ptr, ADLAdapterInfo **adapters) +int WINAPI ADL2_Adapter_AdapterInfoX2_Get(ADL_CONTEXT_HANDLE handle, ADLAdapterInfo **adapters) { FIXME("stub!\n"); *adapters = (ADLAdapterInfo*)adl_malloc(sizeof(ADLAdapterInfo) * 1); return ADL_Adapter_AdapterInfo_Get(*adapters, sizeof(ADLAdapterInfo) * 1); } -int WINAPI ADL2_Adapter_AdapterInfo_Get(ADL_CONTEXT_HANDLE* ptr, ADLAdapterInfo *adapters, int bufferSize) +int WINAPI ADL2_Adapter_AdapterInfoX4_Get(ADL_CONTEXT_HANDLE handle, int adapter_index, int *num_adapters, ADLAdapterInfoX2 **info) +{ + int status; + FIXME("adapter: %u, stub!\n", adapter_index); + if (adapter_index == -1) + { + adapter_index = 0; + } + if (num_adapters) + { + *num_adapters = 1; + } + *info = (ADLAdapterInfoX2*)adl_malloc(sizeof(ADLAdapterInfoX2) * 1); + memset(*info, 0, sizeof(ADLAdapterInfoX2)); + status = ADL_Adapter_AdapterInfo_Get(*info, sizeof(ADLAdapterInfo)); + if (status == ADL_OK) + { + info[0]->iInfoMask = 1; + info[0]->iInfoValue = 1; + } + return status; +} + +int WINAPI ADL2_Adapter_AdapterInfo_Get(ADL_CONTEXT_HANDLE handle, ADLAdapterInfo *adapters, int bufferSize) { ADLAdapterInfo adapterInfo; TRACE("stub!"); @@ -473,6 +526,12 @@ int WINAPI ADL_Adapter_ASICFamilyType_Get(int adapter_index, int *asic_type, int return ADL_OK; } +int WINAPI ADL2_Adapter_ASICFamilyType_Get(ADL_CONTEXT_HANDLE handle, int adapter_index, int *asic_types, int *valids) +{ + FIXME("adapter_index: %u, stub!\n", adapter_index); + return ADL_Adapter_ASICFamilyType_Get(adapter_index, asic_types, valids); +} + static int get_max_clock(const char *clock, int default_value) { char path[MAX_PATH], line[256]; @@ -573,6 +632,25 @@ int WINAPI ADL2_Adapter_MemoryInfo_Get(ADL_CONTEXT_HANDLE context, int adapter_i return ADL_Adapter_MemoryInfo_Get(adapter_index, mem_info); } +int WINAPI ADL2_Adapter_MemoryInfo2_Get(ADL_CONTEXT_HANDLE context, int adapter_index, ADLMemoryInfo2 *mem_info) +{ + ADLMemoryInfo meminfo1; + int status; + FIXME("adapter %d, stub!\n", adapter_index); + + status = ADL2_Adapter_MemoryInfo_Get(context, adapter_index, &meminfo1); + if (status == ADL_OK) + { + mem_info->iHyperMemorySize = 0; + mem_info->iInvisibleMemorySize = 0; + mem_info->iMemoryBandwidth = meminfo1.iMemoryBandwidth; + mem_info->iMemorySize = meminfo1.iMemorySize; + mem_info->iVisibleMemorySize = mem_info->iMemorySize; + memcpy(mem_info->strMemoryType, meminfo1.strMemoryType, ADL_MAX_PATH); + } + return status; +} + int WINAPI ADL_Adapter_Primary_Get(int* adapter_index) { FIXME("stub!\n"); -- 2.39.2 (Apple Git-144) diff --git a/dlls/atiadlxx/atiadlxx.spec b/dlls/atiadlxx/atiadlxx.spec index 147f6bad..222fb744 100644 --- wine/dlls/atiadlxx/atiadlxx.spec +++ wine/dlls/atiadlxx/atiadlxx.spec @@ -464,7 +464,7 @@ @ stub ADL2_Overdrive5_FanSpeedToDefault_Set @ stub ADL2_Overdrive5_FanSpeed_Get @ stub ADL2_Overdrive5_FanSpeed_Set -@ stub ADL2_Overdrive5_ODParameters_Get +@ stdcall ADL2_Overdrive5_ODParameters_Get(ptr long ptr) @ stub ADL2_Overdrive5_ODPerformanceLevels_Get @ stub ADL2_Overdrive5_ODPerformanceLevels_Set @ stub ADL2_Overdrive5_PowerControlAbsValue_Caps @@ -997,7 +997,7 @@ @ stub ADL_Overdrive5_FanSpeedToDefault_Set @ stub ADL_Overdrive5_FanSpeed_Get @ stub ADL_Overdrive5_FanSpeed_Set -@ stub ADL_Overdrive5_ODParameters_Get +@ stdcall ADL_Overdrive5_ODParameters_Get(long ptr) @ stub ADL_Overdrive5_ODPerformanceLevels_Get @ stub ADL_Overdrive5_ODPerformanceLevels_Set @ stub ADL_Overdrive5_PowerControlAbsValue_Caps diff --git a/dlls/atiadlxx/atiadlxx_main.c b/dlls/atiadlxx/atiadlxx_main.c index d5f8a1b4..9f887387 100644 --- wine/dlls/atiadlxx/atiadlxx_main.c +++ wine/dlls/atiadlxx/atiadlxx_main.c @@ -227,6 +227,25 @@ typedef struct ADLGraphicInfoCore int iReserved[11]; } ADLGraphicInfoCore, *LPADLGraphicInfoCore; +typedef struct ADLODParameterRange +{ + int iMin; + int iMax; + int iStep; +} ADLODParameterRange; + +typedef struct ADLODParameters +{ + int iSize; + int iNumberOfPerformanceLevels; + int iActivityReportingSupported; + int iDiscretePerformanceLevels; + int iReserved; + ADLODParameterRange sEngineClock; + ADLODParameterRange sMemoryClock; + ADLODParameterRange sVddc; +} ADLODParameters; + static const ADLVersionsInfo version = { "22.20.19.16-221003a-384125E-AMD-Software-Adrenalin-Edition", "", @@ -720,4 +739,14 @@ int WINAPI ADL2_Display_FreeSync_Cap(ADL_CONTEXT_HANDLE context, int adapter_ind { FIXME("adapter: %d, display: %d, stub!\n", adapter_index, display_index); return ADL_ERR_NOT_SUPPORTED; -} \ No newline at end of file +} + +int WINAPI ADL_Overdrive5_ODParameters_Get(int iAdapterIndex, ADLODParameters *lpOdParameters) +{ + return ADL_ERR_NOT_SUPPORTED; +} + +int WINAPI ADL2_Overdrive5_ODParameters_Get(ADL_CONTEXT_HANDLE context, int iAdapterIndex, ADLODParameters *lpOdParameters) +{ + return ADL_ERR_NOT_SUPPORTED; +} diff --git a/configure b/configure index 2d57c7e0..6bf83a38 100755 --- wine/configure +++ wine/configure @@ -9933,6 +9933,41 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu wine_can_build_preloader=yes WINEPRELOADER_LDFLAGS="-nostartfiles -nodefaultlibs -e _start -ldylib1.o -Wl,-image_base,0x7d400000,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist,-segaddr,WINE_4GB_RESERVE,0x100000000" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-ld_classic" >&5 +printf %s "checking whether the compiler supports -Wl,-ld_classic... " >&6; } +if test ${ac_cv_cflags__Wl__ld_classic+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_wine_try_cflags_saved=$CFLAGS +CFLAGS="$CFLAGS -Wl,-ld_classic" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(int argc, char **argv) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_cflags__Wl__ld_classic=yes +else $as_nop + ac_cv_cflags__Wl__ld_classic=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +CFLAGS=$ac_wine_try_cflags_saved +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl__ld_classic" >&5 +printf "%s\n" "$ac_cv_cflags__Wl__ld_classic" >&6; } +if test "x$ac_cv_cflags__Wl__ld_classic" = xyes +then : + ld_classic_flags="-Wl,-ld_classic" + ld_classic_flags="-Wl,-ld_classic" +fi + WINELOADER_LDFLAGS="$ld_classic_flags $WINELOADER_LDFLAGS" + WINEPRELOADER_LDFLAGS="$ld_classic_flags $WINEPRELOADER_LDFLAGS" + UNIXLDFLAGS="$ld_classic_flags $WINEPRELOADER_LDFLAGS" + LDDLLFLAGS="$ld_classic_flags $LDDLLFLAGS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-no_new_main -e _main" >&5 printf %s "checking whether the compiler supports -Wl,-no_new_main -e _main... " >&6; } if test ${ac_cv_cflags__Wl__no_new_main__e__main+y} diff --git a/configure.ac b/configure.ac index 50c50d15..f0dff4aa 100644 --- wine/configure.ac +++ wine/configure.ac @@ -724,6 +724,16 @@ case $host_os in wine_can_build_preloader=yes WINEPRELOADER_LDFLAGS="-nostartfiles -nodefaultlibs -e _start -ldylib1.o -Wl,-image_base,0x7d400000,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist,-segaddr,WINE_4GB_RESERVE,0x100000000" + + dnl The linker that ships with Xcode 15 beta 4 doesn’t support -segaddr unless you also pass -ld_classic. + WINE_TRY_CFLAGS([-Wl,-ld_classic], + [ld_classic_flags="-Wl,-ld_classic" + ld_classic_flags="-Wl,-ld_classic"]) + WINELOADER_LDFLAGS="$ld_classic_flags $WINELOADER_LDFLAGS" + WINEPRELOADER_LDFLAGS="$ld_classic_flags $WINEPRELOADER_LDFLAGS" + UNIXLDFLAGS="$ld_classic_flags $WINEPRELOADER_LDFLAGS" + LDDLLFLAGS="$ld_classic_flags $LDDLLFLAGS" + WINE_TRY_CFLAGS([-Wl,-no_new_main -e _main], [WINEPRELOADER_LDFLAGS="-Wl,-no_new_main $WINEPRELOADER_LDFLAGS" WINE_TRY_CFLAGS([-Wl,-no_new_main -e _main -mmacosx-version-min=10.7 -nostartfiles -nodefaultlibs], diff --git a/dlls/ntdll/unix/system.c b/dlls/ntdll/unix/system.c index 970285a..90fedc6 100644 --- wine/dlls/ntdll/unix/system.c +++ wine/dlls/ntdll/unix/system.c @@ -1031,6 +1031,8 @@ static NTSTATUS create_logical_proc_info(void) size = sizeof(cores_no); if (sysctlbyname("hw.physicalcpu", &cores_no, &size, NULL, 0)) cores_no = lcpu_no; + else + cores_no = MIN(cores_no, lcpu_no); TRACE("%u logical CPUs from %u physical cores across %u packages\n", lcpu_no, cores_no, pkgs_no); @@ -1152,6 +1154,19 @@ static NTSTATUS create_logical_proc_info(void) } #endif +#if defined(__APPLE__) && __APPLE__ +unsigned get_cpu_count_override(void) +{ + unsigned count = 4; + const char* ncpu = getenv("WINENCPU"); + if (ncpu) + { + count = atoi(ncpu); + } + return count; +} +#endif + /****************************************************************** * init_cpu_info * @@ -1164,7 +1179,6 @@ void init_cpu_info(void) { NTSTATUS status; long num; - #ifdef _SC_NPROCESSORS_ONLN num = sysconf(_SC_NPROCESSORS_ONLN); if (num < 1) @@ -1186,6 +1200,15 @@ void init_cpu_info(void) num = 1; FIXME("Detecting the number of processors is not supported.\n"); #endif +#if defined(__APPLE__) && __APPLE__ + unsigned num_override = get_cpu_count_override(); + if (num_override != -1) + { + WARN("Overriding cpu count from %u to %u\n", num, num_override); + num = num_override; + } +#endif + peb->NumberOfProcessors = num; get_cpuinfo( &cpu_info ); TRACE( "<- CPU arch %d, level %d, rev %d, features 0x%x\n", diff --git a/dlls/atiadlxx/atiadlxx.spec b/dlls/atiadlxx/atiadlxx.spec index 222fb74..d3bcb38 100644 --- wine/dlls/atiadlxx/atiadlxx.spec +++ wine/dlls/atiadlxx/atiadlxx.spec @@ -433,7 +433,7 @@ @ stub ADL2_Graphics_MantleVersion_Get @ stub ADL2_Graphics_Platform_Get @ stdcall ADL2_Graphics_VersionsX2_Get(ptr ptr) -@ stub ADL2_Graphics_Versions_Get +@ stdcall ADL2_Graphics_Versions_Get(ptr ptr) @ stub ADL2_Graphics_VulkanVersion_Get @ stub ADL2_HybridGraphicsGPU_Set @ stub ADL2_MGPUSLS_Status_Set diff --git a/dlls/atiadlxx/atiadlxx_main.c b/dlls/atiadlxx/atiadlxx_main.c index 9f88738..9e67c74 100644 --- wine/dlls/atiadlxx/atiadlxx_main.c +++ wine/dlls/atiadlxx/atiadlxx_main.c @@ -316,6 +316,11 @@ int WINAPI ADL_Graphics_Versions_Get(ADLVersionsInfo *ver) return ADL_OK; } +int WINAPI ADL2_Graphics_Versions_Get(ADL_CONTEXT_HANDLE *ptr, ADLVersionsInfo *ver) +{ + return ADL_Graphics_Versions_Get(ver); +} + int WINAPI ADL2_Adapter_Graphic_Core_Info_Get(ADL_CONTEXT_HANDLE *ptr, int iAdapterIndex, LPADLGraphicInfoCore pGraphicsInfo) { FIXME("ptr %p, iAdapterIndex %u, pGraphicsInfo %p\n", ptr, iAdapterIndex, pGraphicsInfo);