Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
January 2022
- 86 participants
- 2418 messages
Re: [PATCH 2/2] ddraw/tests: Don't insist on a different refresh rate if no refresh rate was requested.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=106025
Your paranoid android.
=== w864 (64 bit report) ===
ddraw:
ddraw2.c:3582: Test failed: Failed to create surface, hr 0x887601c2.
0b2c:ddraw2: unhandled exception c0000005 at 00000000004805F8
=== w1064v1809 (32 bit report) ===
ddraw:
ddraw7.c:18858: Test failed: Got unexpected color 0x00000040.
=== w1064_tsign (32 bit report) ===
ddraw:
ddraw7.c:18858: Test failed: Got unexpected color 0x00000040.
=== debian11 (32 bit report) ===
ddraw:
ddraw2.c:3974: Test failed: Got unexpected screen width 800.
ddraw2.c:3976: Test failed: Got unexpected screen height 600.
ddraw2.c:3981: Test failed: Got unexpected screen width 800.
ddraw2.c:3983: Test failed: Got unexpected screen height 600.
ddraw2.c:4005: Test failed: Got unexpected screen width 800.
ddraw2.c:4007: Test failed: Got unexpected screen height 600.
ddraw2.c:4040: Test failed: Got unexpected screen width 800.
ddraw2.c:4042: Test failed: Got unexpected screen height 600.
ddraw2.c:4063: Test failed: Got unexpected screen width 800.
ddraw2.c:4065: Test failed: Got unexpected screen height 600.
ddraw2.c:4070: Test failed: Got unexpected screen width 800.
ddraw2.c:4072: Test failed: Got unexpected screen height 600.
ddraw4.c:3612: Test failed: Expected (0,0)-(1024,768), got (0,0)-(640,480).
ddraw4.c:3634: Test failed: Expected (0,0)-(1024,768), got (0,0)-(640,480).
ddraw4.c:3660: Test failed: Expected (0,0)-(1024,768), got (0,0)-(640,480).
ddraw4.c:3680: Test failed: Expected (0,0)-(1024,768), got (0,0)-(640,480).
ddraw4.c:3716: Test failed: Expected (0,0)-(1024,768), got (0,0)-(640,480).
=== debian11 (32 bit Arabic:Morocco report) ===
ddraw:
ddraw2.c:4070: Test failed: Got unexpected screen width 800.
ddraw2.c:4072: Test failed: Got unexpected screen height 600.
=== debian11 (32 bit German report) ===
ddraw:
ddraw4.c:3856: Test failed: Expected resolution 1024x768, got 720x480.
ddraw4.c:3873: Test failed: Expected surface width 1024, got 720.
ddraw4.c:3899: Test failed: Expected screen size 1024x768, got 720x480.
ddraw4.c:3906: Test failed: Expected (0,0)-(1024,768), got (0,0)-(720,480).
ddraw4.c:3918: Test failed: Expected surface width 1024, got 720.
ddraw4.c:3920: Test failed: Expected surface height 768, got 480.
ddraw4.c:3971: Test failed: Expected screen size 2 1024x768, got 720x480.
ddraw4.c:3979: Test failed: Expected (0,0)-(1024,768), got (0,0)-(720,480).
ddraw4.c:3991: Test failed: Expected surface width 1024, got 720.
ddraw4.c:3993: Test failed: Expected surface height 768, got 480.
=== debian11 (32 bit French report) ===
ddraw:
ddraw4.c:2956: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw4.c:2989: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw4.c:2992: Test failed: Expected window extended style 0x108, got 0x8.
ddraw4.c:2998: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw4.c:3001: Test failed: Expected window extended style 0x108, got 0x8.
ddraw4.c:3021: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw4.c:3023: Test failed: Expected window extended style 0x100, got 0.
ddraw4.c:3040: Test failed: Expected (0,0)-(640,480), got (-32000,-32000)-(-31840,-31976).
ddraw4.c:3063: Test failed: Expected (0,0)-(640,480), got (-32000,-32000)-(-31840,-31976).
ddraw4.c:3083: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw4.c:3085: Test failed: Expected window extended style 0x100, got 0.
ddraw7.c:3857: Test failed: Got unexpected screen width 800.
ddraw7.c:3859: Test failed: Got unexpected screen height 600.
ddraw7.c:3864: Test failed: Got unexpected screen width 800.
ddraw7.c:3866: Test failed: Got unexpected screen height 600.
ddraw7.c:3888: Test failed: Got unexpected screen width 800.
ddraw7.c:3890: Test failed: Got unexpected screen height 600.
ddraw7.c:3923: Test failed: Got unexpected screen width 800.
ddraw7.c:3925: Test failed: Got unexpected screen height 600.
ddraw7.c:3946: Test failed: Got unexpected screen width 800.
ddraw7.c:3948: Test failed: Got unexpected screen height 600.
ddraw7.c:3953: Test failed: Got unexpected screen width 800.
ddraw7.c:3955: Test failed: Got unexpected screen height 600.
=== debian11 (32 bit Hebrew:Israel report) ===
ddraw:
ddraw4.c:3464: Test failed: Got unexpected screen size 720x480.
ddraw4.c:3518: Test failed: Expected message 0x47, but didn't receive it.
ddraw4.c:3520: Test failed: Expected screen size 640x480, got 0x0.
ddraw4.c:3526: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3550: Test failed: Expected surface width 640, got 720.
ddraw4.c:3556: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3563: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3568: Test failed: Expected surface width 640, got 720.
ddraw4.c:3583: Test failed: Expected surface width 640, got 720.
ddraw4.c:3589: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3612: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3634: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3639: Test failed: Expected surface width 640, got 720.
ddraw4.c:3660: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3680: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3693: Test failed: Expected resolution 640x480, got 720x480.
ddraw4.c:3710: Test failed: Expected surface width 640, got 720.
ddraw4.c:3716: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3726: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3731: Test failed: Expected surface width 640, got 720.
ddraw4.c:3746: Test failed: Expected surface width 640, got 720.
ddraw4.c:3752: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3775: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3788: Test failed: Got unexpected hr 0.
ddraw4.c:3790: Test failed: Got unexpected hr 0.
ddraw4.c:3797: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3802: Test failed: Expected surface width 640, got 720.
ddraw4.c:3823: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3843: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3856: Test failed: Expected resolution 640x480, got 720x480.
ddraw4.c:3873: Test failed: Expected surface width 640, got 720.
ddraw4.c:3880: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3897: Test failed: Expected message 0x5, but didn't receive it.
ddraw4.c:3899: Test failed: Expected screen size 640x480, got 0x0.
ddraw4.c:3906: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3918: Test failed: Expected surface width 640, got 720.
ddraw4.c:3971: Test failed: Expected screen size 2 640x480, got 720x480.
ddraw4.c:3979: Test failed: Expected (0,0)-(640,480), got (0,0)-(720,480).
ddraw4.c:3991: Test failed: Expected surface width 640, got 720.
=== debian11 (32 bit Japanese:Japan report) ===
ddraw:
ddraw4.c:18247: Test failed: Expect clip rect (0,0)-(640,480), got (0,0)-(800,600).
ddraw4.c:18271: Test failed: Expect clip rect (0,0)-(640,480), got (0,0)-(800,600).
ddraw4.c:18312: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw4.c:18368: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw4.c:18375: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw4.c:18312: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,737).
ddraw4.c:18334: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw4.c:18349: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw4.c:18368: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,737).
ddraw4.c:18375: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,737).
ddraw7.c:2616: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw7.c:2649: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw7.c:2652: Test failed: Expected window extended style 0x108, got 0x8.
ddraw7.c:2658: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw7.c:2661: Test failed: Expected window extended style 0x108, got 0x8.
ddraw7.c:2681: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw7.c:2683: Test failed: Expected window extended style 0x100, got 0.
ddraw7.c:2700: Test failed: Expected (0,0)-(800,600), got (-32000,-32000)-(-31840,-31976).
ddraw7.c:2723: Test failed: Expected (0,0)-(800,600), got (-32000,-32000)-(-31840,-31976).
ddraw7.c:2743: Test failed: Expected window style 0x4cf0000, got 0xa40b0000.
ddraw7.c:2745: Test failed: Expected window extended style 0x100, got 0.
ddraw7.c:18586: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw7.c:18642: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw7.c:18649: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw7.c:18586: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,737).
ddraw7.c:18608: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw7.c:18623: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw7.c:18642: Test failed: Expect window rect (0,0)-(800,600), got (1024,0)-(2048,737).
ddraw7.c:18649: Test failed: Expect window rect (0,0)-(800,600), got (1024,0)-(2048,737).
=== debian11 (32 bit Chinese:China report) ===
ddraw:
ddraw2.c:15297: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw2.c:15312: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw4.c:18312: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw4.c:18368: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw4.c:18375: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw4.c:18312: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,737).
ddraw4.c:18334: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw4.c:18349: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw4.c:18368: Test failed: Expect window rect (0,0)-(800,600), got (1024,0)-(2048,737).
ddraw4.c:18375: Test failed: Expect window rect (0,0)-(800,600), got (1024,0)-(2048,737).
ddraw7.c:18586: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw7.c:18642: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw7.c:18649: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,768).
ddraw7.c:18586: Test failed: Expect window rect (0,0)-(800,600), got (0,0)-(1024,737).
ddraw7.c:18608: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw7.c:18623: Test failed: Expected window rect (800,0)-(1824,737), got (0,0)-(1024,737).
ddraw7.c:18642: Test failed: Expect window rect (0,0)-(800,600), got (1024,0)-(2048,737).
ddraw7.c:18649: Test failed: Expect window rect (0,0)-(800,600), got (1024,0)-(2048,737).
=== debian11 (32 bit WoW report) ===
ddraw:
ddraw7.c:3556: Test failed: Expected message 0x5, but didn't receive it.
Jan. 26, 2022
[PATCH] msdasql: Add ITransactionJoin to session interface
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msdasql/session.c | 58 +++++++++++++++++++++++++++++++++++
dlls/msdasql/tests/provider.c | 5 ++-
2 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index f0e915ca710..e58d152a418 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -43,6 +43,7 @@ struct msdasql_session
IOpenRowset IOpenRowset_iface;
ISessionProperties ISessionProperties_iface;
IDBCreateCommand IDBCreateCommand_iface;
+ ITransactionJoin ITransactionJoin_iface;
LONG refs;
IUnknown *datasource;
@@ -75,6 +76,11 @@ static inline struct msdasql_session *impl_from_IDBCreateCommand( IDBCreateComma
return CONTAINING_RECORD( iface, struct msdasql_session, IDBCreateCommand_iface );
}
+static inline struct msdasql_session *impl_from_ITransactionJoin( ITransactionJoin *iface )
+{
+ return CONTAINING_RECORD( iface, struct msdasql_session, ITransactionJoin_iface );
+}
+
static HRESULT WINAPI session_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
struct msdasql_session *session = impl_from_IUnknown( iface );
@@ -107,6 +113,11 @@ static HRESULT WINAPI session_QueryInterface(IUnknown *iface, REFIID riid, void
TRACE("(%p)->(IDBCreateCommand_iface %p)\n", iface, ppv);
*ppv = &session->IDBCreateCommand_iface;
}
+ else if(IsEqualGUID(&IID_ITransactionJoin, riid))
+ {
+ TRACE("(%p)->(ITransactionJoin %p)\n", iface, ppv);
+ *ppv = &session->ITransactionJoin_iface;
+ }
else if(IsEqualGUID(&IID_IBindResource, riid))
{
TRACE("(%p)->(IID_IBindResource not support)\n", iface);
@@ -1191,6 +1202,52 @@ static const IDBCreateCommandVtbl createcommandVtbl =
createcommand_CreateCommand
};
+static HRESULT WINAPI transjoin_QueryInterface(ITransactionJoin *iface, REFIID riid, void **out)
+{
+ struct msdasql_session *session = impl_from_ITransactionJoin( iface );
+ return IUnknown_QueryInterface(&session->session_iface, riid, out);
+}
+
+static ULONG WINAPI transjoin_AddRef(ITransactionJoin *iface)
+{
+ struct msdasql_session *session = impl_from_ITransactionJoin( iface );
+ return IUnknown_AddRef(&session->session_iface);
+}
+
+static ULONG WINAPI transjoin_Release(ITransactionJoin *iface)
+{
+ struct msdasql_session *session = impl_from_ITransactionJoin( iface );
+ return IUnknown_Release(&session->session_iface);
+}
+
+static HRESULT WINAPI transjoin_GetOptionsObject(ITransactionJoin *iface, ITransactionOptions **options)
+{
+ struct msdasql_session *session = impl_from_ITransactionJoin( iface );
+
+ FIXME("%p, %p\n", session, options);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI transjoin_JoinTransaction(ITransactionJoin *iface, IUnknown *unk, ISOLEVEL level,
+ ULONG flags, ITransactionOptions *options)
+{
+ struct msdasql_session *session = impl_from_ITransactionJoin( iface );
+
+ FIXME("%p, %p, %d, 0x%08x, %p\n", session, unk, level, flags, options);
+
+ return E_NOTIMPL;
+}
+
+static const ITransactionJoinVtbl transactionjoinVtbl =
+{
+ transjoin_QueryInterface,
+ transjoin_AddRef,
+ transjoin_Release,
+ transjoin_GetOptionsObject,
+ transjoin_JoinTransaction
+};
+
HRESULT create_db_session(REFIID riid, IUnknown *datasource, HDBC hdbc, void **unk)
{
struct msdasql_session *session;
@@ -1205,6 +1262,7 @@ HRESULT create_db_session(REFIID riid, IUnknown *datasource, HDBC hdbc, void **u
session->IOpenRowset_iface.lpVtbl = &openrowsetVtbl;
session->ISessionProperties_iface.lpVtbl = &propertiesVtbl;
session->IDBCreateCommand_iface.lpVtbl = &createcommandVtbl;
+ session->ITransactionJoin_iface.lpVtbl = &transactionjoinVtbl;
IUnknown_QueryInterface(datasource, &IID_IUnknown, (void**)&session->datasource);
session->refs = 1;
session->hdbc = hdbc;
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index eefddbf6dcb..ee81ad1d311 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -494,9 +494,8 @@ static void test_sessions(void)
ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
hr = IUnknown_QueryInterface(session, &IID_ITransactionJoin, (void**)&join);
- todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
- if(hr == S_OK)
- ITransactionJoin_Release(join);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ITransactionJoin_Release(join);
hr = IUnknown_QueryInterface(session, &IID_IBindResource, (void**)&unimplemented);
ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr);
--
2.34.1
Jan. 26, 2022
Re: [PATCH 5/8] secur32: Add support for setting DTLS timeouts.
by Hans Leidekker
On Tue, 2022-01-25 at 19:24 -0500, Connor McAdams wrote:
> On Tue, Jan 25, 2022 at 10:32:11AM -0500, Connor McAdams wrote:
> > Add support for setting the DTLS timeout values, and set the
> > retransmission timeout value to 0 to allow for retransmission on each
> > call to schan_InitializeSecurityContext.
>
> All patches prior to this one are good, but this one and beyond will
> break things. Maybe this is the universe's way of telling me to send
> smaller patch sets. ;)
>
> Essentially, the issue seems to be that we need to go back to
> non-blocking mode with gnutls on DTLS contexts. We behave in a
> non-blocking manner to begin with, seeing as we return immediately from
> the pull_timeout callback. If we don't do this, it takes all sorts of
> effort to work around it, and make it not get into a weird state when no
> data is received. If it isn't in non-blocking mode, it doesn't seem to
> complete a handshake if retransmission is involved.
>
> Is there any good reason we switched away from GNUTLS_NONBLOCK in the
> first place? If so, I can try to work around it. But from my testing,
> having it enabled doesn't seem to cause issues. But maybe I'm missing
> something.
GnuTLS blocking mode corresponds to the blocking behavior of the underlying
transport (sockets, usually). We don't own the socket, so we can't pull data or
know what mode is used by the client. In that sense the GnuTLS blocking mode is
irrelevant; we always need to return to the caller immediately. If GnuTLS needs
to be in non-blocking mode to handle retransmission correctly then we could
switch back I guess.
Jan. 26, 2022
[PATCH v2 2/2] secur32: Validate output buffer size in schan_InitializeSecurityContextW().
by Hans Leidekker
From: Connor McAdams <cmcadams(a)codeweavers.com>
v2: Remove redundant braces, merge with tests.
Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com>
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/secur32/schannel.c | 12 +++++-
dlls/secur32/tests/schannel.c | 73 ++++++++++++++++++++++++++++++++++-
2 files changed, 82 insertions(+), 3 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index 6b699cccce1..141a191c7c6 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -709,7 +709,7 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW(
SecBuffer *buffer;
SecBuffer alloc_buffer = { 0 };
struct handshake_params params;
- int idx;
+ int idx, i;
TRACE("%p %p %s 0x%08x %d %d %p %d %p %p %p %p\n", phCredential, phContext,
debugstr_w(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput,
@@ -724,6 +724,16 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW(
ptsExpiry->HighPart = 0;
}
+ if (!pOutput || !pOutput->cBuffers) return SEC_E_INVALID_TOKEN;
+ for (i = 0; i < pOutput->cBuffers; i++)
+ {
+ ULONG type = pOutput->pBuffers[i].BufferType;
+
+ if (type != SECBUFFER_TOKEN && type != SECBUFFER_ALERT) continue;
+ if (!pOutput->pBuffers[i].cbBuffer && !(fContextReq & ISC_REQ_ALLOCATE_MEMORY))
+ return SEC_E_INSUFFICIENT_MEMORY;
+ }
+
if (!phContext)
{
ULONG_PTR handle;
diff --git a/dlls/secur32/tests/schannel.c b/dlls/secur32/tests/schannel.c
index f72d71a3af3..6c15addf2fc 100644
--- a/dlls/secur32/tests/schannel.c
+++ b/dlls/secur32/tests/schannel.c
@@ -582,6 +582,12 @@ static void init_buffers(SecBufferDesc *desc, unsigned count, unsigned size)
desc->pBuffers[0].pvBuffer = HeapAlloc(GetProcessHeap(), 0, size);
}
+static void init_sec_buffer(SecBuffer *sec_buf, ULONG count, void *buf)
+{
+ sec_buf->cbBuffer = count;
+ sec_buf->pvBuffer = buf;
+}
+
static void reset_buffers(SecBufferDesc *desc)
{
unsigned i;
@@ -642,6 +648,67 @@ static int receive_data(SOCKET sock, SecBuffer *buf)
return received;
}
+static void test_context_output_buffer_size(DWORD protocol, DWORD flags, ULONG ctxt_flags_req)
+{
+ SCHANNEL_CRED cred;
+ CredHandle cred_handle;
+ CtxtHandle context;
+ SECURITY_STATUS status;
+ SecBuffer in_buffer = {0, SECBUFFER_EMPTY, NULL};
+ SecBufferDesc in_buffers = {SECBUFFER_VERSION, 1, &in_buffer};
+ SecBufferDesc out_buffers;
+ unsigned buf_size = 8192;
+ void *buf, *buf2;
+ ULONG attrs;
+ int i;
+
+ init_cred(&cred);
+ cred.grbitEnabledProtocols = protocol;
+ cred.dwFlags = flags;
+ status = AcquireCredentialsHandleA(NULL, (SEC_CHAR *)UNISP_NAME_A, SECPKG_CRED_OUTBOUND, NULL,
+ &cred, NULL, NULL, &cred_handle, NULL);
+ ok( status == SEC_E_OK, "got %08x\n", status );
+ if (status != SEC_E_OK) return;
+
+ init_buffers(&out_buffers, 4, buf_size);
+ out_buffers.pBuffers[0].BufferType = SECBUFFER_TOKEN;
+ buf = out_buffers.pBuffers[0].pvBuffer;
+ buf2 = out_buffers.pBuffers[1].pvBuffer = HeapAlloc(GetProcessHeap(), 0, buf_size);
+ for (i = 0; i < 2; i++)
+ {
+ SecBuffer *buffer = !i ? &out_buffers.pBuffers[0] : &out_buffers.pBuffers[1];
+
+ init_sec_buffer(&out_buffers.pBuffers[0], buf_size, buf);
+ if (i) buffer->BufferType = SECBUFFER_ALERT;
+
+ buffer->cbBuffer = 0;
+ status = InitializeSecurityContextA(&cred_handle, NULL, (SEC_CHAR *)"localhost", ctxt_flags_req,
+ 0, 0, &in_buffers, 0, &context, &out_buffers, &attrs, NULL);
+ ok(status == SEC_E_INSUFFICIENT_MEMORY, "%d: Expected SEC_E_INSUFFICIENT_MEMORY, got %08x\n", i, status);
+
+ if (i) init_sec_buffer(&out_buffers.pBuffers[0], buf_size, NULL);
+ init_sec_buffer(buffer, 0, NULL);
+ status = InitializeSecurityContextA(&cred_handle, NULL, (SEC_CHAR *)"localhost",
+ ctxt_flags_req | ISC_REQ_ALLOCATE_MEMORY, 0, 0, &in_buffers, 0, &context, &out_buffers, &attrs, NULL);
+ ok(status == SEC_I_CONTINUE_NEEDED, "%d: Expected SEC_I_CONTINUE_NEEDED, got %08x\n", i, status);
+ if (i) FreeContextBuffer(out_buffers.pBuffers[0].pvBuffer);
+ FreeContextBuffer(buffer->pvBuffer);
+ DeleteSecurityContext(&context);
+
+ if (i) init_sec_buffer(&out_buffers.pBuffers[0], buf_size, buf);
+ init_sec_buffer(buffer, buf_size, !i ? buf : buf2);
+ status = InitializeSecurityContextA(&cred_handle, NULL, (SEC_CHAR *)"localhost", ctxt_flags_req,
+ 0, 0, &in_buffers, 0, &context, &out_buffers, &attrs, NULL);
+ ok(status == SEC_I_CONTINUE_NEEDED, "%d: Expected SEC_I_CONTINUE_NEEDED, got %08x\n", i, status);
+ if (i) todo_wine ok(!buffer->cbBuffer, "Expected SECBUFFER_ALERT buffer to be empty\n");
+ DeleteSecurityContext(&context);
+ }
+
+ HeapFree(GetProcessHeap(), 0, buf2);
+ free_buffers(&out_buffers);
+ FreeCredentialsHandle(&cred_handle);
+}
+
static void test_InitializeSecurityContext(void)
{
SCHANNEL_CRED cred;
@@ -974,6 +1041,9 @@ static void test_communication(void)
return;
}
+ test_context_output_buffer_size(SP_PROT_TLS1_CLIENT, SCH_CRED_NO_DEFAULT_CREDS|SCH_CRED_MANUAL_CRED_VALIDATION,
+ ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM);
+
/* Create a socket and connect to test.winehq.org */
if ((sock = create_ssl_socket( "test.winehq.org" )) == -1) return;
@@ -1023,7 +1093,6 @@ todo_wine
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM,
0, 0, &buffers[1], 0, NULL, &buffers[0], &attrs, NULL);
-todo_wine
ok(status == SEC_E_INSUFFICIENT_MEMORY || status == SEC_E_INVALID_TOKEN,
"Expected SEC_E_INSUFFICIENT_MEMORY or SEC_E_INVALID_TOKEN, got %08x\n", status);
ok(buffers[0].pBuffers[0].cbBuffer == 0, "Output buffer size was not set to 0.\n");
@@ -1031,7 +1100,6 @@ todo_wine
status = InitializeSecurityContextA(&cred_handle, NULL, (SEC_CHAR *)"localhost",
ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM,
0, 0, NULL, 0, &context, NULL, &attrs, NULL);
-todo_wine
ok(status == SEC_E_INVALID_TOKEN, "Expected SEC_E_INVALID_TOKEN, got %08x\n", status);
buffers[0].pBuffers[0].cbBuffer = buf_size;
@@ -1571,6 +1639,7 @@ static void test_dtls(void)
flags_req = ISC_REQ_MANUAL_CRED_VALIDATION | ISC_REQ_EXTENDED_ERROR | ISC_REQ_DATAGRAM | ISC_REQ_USE_SUPPLIED_CREDS |
ISC_REQ_CONFIDENTIALITY | ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT;
+ test_context_output_buffer_size(SP_PROT_DTLS_CLIENT | SP_PROT_DTLS1_2_CLIENT, SCH_CRED_NO_DEFAULT_CREDS, flags_req);
init_buffers( &buffers[0], 1, 128 );
buffers[0].pBuffers[0].BufferType = SECBUFFER_DTLS_MTU;
--
2.30.2
Jan. 26, 2022
[PATCH v2 1/2] secur32: Set phNewContext to phContext in schan_InitializeSecurityContextW().
by Hans Leidekker
From: Connor McAdams <cmcadams(a)codeweavers.com>
If a valid pointer for phNewContext is passed in alongside a valid phContext
pointer, initialize phNewContext with the value of phContext on success.
v2: Merge with tests.
Signed-off-by: Connor McAdams <cmcadams(a)codeweavers.com>
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/secur32/schannel.c | 2 ++
dlls/secur32/tests/schannel.c | 35 +++++++++++++++++++++++++++--------
2 files changed, 29 insertions(+), 8 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index 32181b3b35f..6b699cccce1 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -831,6 +831,8 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW(
}
TRACE("Using expected_size %lu.\n", expected_size);
+
+ if (phNewContext) *phNewContext = *phContext;
}
ctx->req_ctx_attr = fContextReq;
diff --git a/dlls/secur32/tests/schannel.c b/dlls/secur32/tests/schannel.c
index 1fceaae6a61..f72d71a3af3 100644
--- a/dlls/secur32/tests/schannel.c
+++ b/dlls/secur32/tests/schannel.c
@@ -953,7 +953,7 @@ static void test_communication(void)
ULONG attrs;
SCHANNEL_CRED cred;
CredHandle cred_handle;
- CtxtHandle context;
+ CtxtHandle context, context2;
SecPkgCredentials_NamesA names;
SecPkgContext_StreamSizes sizes;
SecPkgContext_ConnectionInfo conn_info;
@@ -1044,12 +1044,15 @@ todo_wine
send(sock, buf->pvBuffer, buf->cbBuffer, 0);
buf->cbBuffer = buf_size;
+ context2.dwLower = context2.dwUpper = 0xdeadbeef;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM,
- 0, 0, NULL, 0, NULL, &buffers[0], &attrs, NULL);
+ 0, 0, NULL, 0, &context2, &buffers[0], &attrs, NULL);
ok(status == SEC_E_INCOMPLETE_MESSAGE, "Got unexpected status %#x.\n", status);
ok(buffers[0].pBuffers[0].cbBuffer == buf_size, "Output buffer size changed.\n");
ok(buffers[0].pBuffers[0].BufferType == SECBUFFER_TOKEN, "Output buffer type changed.\n");
+ ok( context2.dwLower == 0xdeadbeef, "Did not expect dwLower to be set on new context\n");
+ ok( context2.dwUpper == 0xdeadbeef, "Did not expect dwUpper to be set on new context\n");
buffers[1].cBuffers = 1;
buffers[1].pBuffers[0].cbBuffer = 0;
@@ -1076,19 +1079,22 @@ todo_wine
ok(buffers[0].pBuffers[0].cbBuffer == buf_size, "Output buffer size changed.\n");
ok(buffers[0].pBuffers[0].BufferType == SECBUFFER_TOKEN, "Output buffer type changed.\n");
+ context2.dwLower = context2.dwUpper = 0xdeadbeef;
buffers[1].pBuffers[0].cbBuffer = 5;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM,
- 0, 0, &buffers[1], 0, NULL, &buffers[0], &attrs, NULL);
+ 0, 0, &buffers[1], 0, &context2, &buffers[0], &attrs, NULL);
ok(status == SEC_E_INCOMPLETE_MESSAGE || status == SEC_E_INVALID_TOKEN,
"Got unexpected status %#x.\n", status);
ok(buffers[0].pBuffers[0].cbBuffer == buf_size, "Output buffer size changed.\n");
ok(buffers[0].pBuffers[0].BufferType == SECBUFFER_TOKEN, "Output buffer type changed.\n");
+ ok( context2.dwLower == 0xdeadbeef, "Did not expect dwLower to be set on new context\n");
+ ok( context2.dwUpper == 0xdeadbeef, "Did not expect dwUpper to be set on new context\n");
buffers[1].pBuffers[0].cbBuffer = ret;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM|ISC_REQ_USE_SUPPLIED_CREDS,
- 0, 0, &buffers[1], 0, NULL, &buffers[0], &attrs, NULL);
+ 0, 0, &buffers[1], 0, &context2, &buffers[0], &attrs, NULL);
buffers[1].pBuffers[0].cbBuffer = buf_size;
while (status == SEC_I_CONTINUE_NEEDED)
{
@@ -1096,11 +1102,15 @@ todo_wine
send(sock, buf->pvBuffer, buf->cbBuffer, 0);
buf->cbBuffer = buf_size;
+ ok( context.dwLower == context2.dwLower, "dwLower mismatch, expected %#lx, got %#lx\n", context.dwLower, context2.dwLower);
+ ok( context.dwUpper == context2.dwUpper, "dwUpper mismatch, expected %#lx, got %#lx\n", context.dwUpper, context2.dwUpper);
+
buf = &buffers[1].pBuffers[0];
ret = receive_data(sock, buf);
if (ret == -1)
return;
+ context2.dwLower = context2.dwUpper = 0xdeadbeef;
buf->BufferType = SECBUFFER_TOKEN;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
@@ -1338,7 +1348,7 @@ todo_wine
buffers[1].pBuffers[0].BufferType = SECBUFFER_TOKEN;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
- ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM|ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, NULL,
+ ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM|ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, &context2,
&buffers[0], &attrs, NULL);
buffers[1].pBuffers[0].cbBuffer = buf_size;
while (status == SEC_I_CONTINUE_NEEDED)
@@ -1347,14 +1357,18 @@ todo_wine
send(sock, buf->pvBuffer, buf->cbBuffer, 0);
buf->cbBuffer = buf_size;
+ todo_wine ok( context.dwLower == context2.dwLower, "dwLower mismatch, expected %#lx, got %#lx\n", context.dwLower, context2.dwLower);
+ todo_wine ok( context.dwUpper == context2.dwUpper, "dwUpper mismatch, expected %#lx, got %#lx\n", context.dwUpper, context2.dwUpper);
+
buf = &buffers[1].pBuffers[0];
ret = receive_data(sock, buf);
if (ret == -1)
return;
+ context2.dwLower = context2.dwUpper = 0xdeadbeef;
buf->BufferType = SECBUFFER_TOKEN;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
- ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, NULL, &buffers[0], &attrs, NULL);
+ ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, &context2, &buffers[0], &attrs, NULL);
buffers[1].pBuffers[0].cbBuffer = buf_size;
}
ok (status == SEC_E_OK, "got %08x\n", status);
@@ -1399,7 +1413,7 @@ static void test_application_protocol_negotiation(void)
ULONG attrs;
SCHANNEL_CRED cred;
CredHandle cred_handle;
- CtxtHandle context;
+ CtxtHandle context, context2;
SecPkgContext_ApplicationProtocol protocol;
SecBufferDesc buffers[3];
SecBuffer *buf;
@@ -1467,9 +1481,10 @@ static void test_application_protocol_negotiation(void)
if (ret == -1)
return;
+ context2.dwLower = context2.dwUpper = 0xdeadbeef;
buffers[1].pBuffers[0].BufferType = SECBUFFER_TOKEN;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
- ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM|ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, NULL,
+ ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM|ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, &context2,
&buffers[0], &attrs, NULL);
buffers[1].pBuffers[0].cbBuffer = buf_size;
while (status == SEC_I_CONTINUE_NEEDED)
@@ -1478,11 +1493,15 @@ static void test_application_protocol_negotiation(void)
send(sock, buf->pvBuffer, buf->cbBuffer, 0);
buf->cbBuffer = buf_size;
+ ok( context.dwLower == context2.dwLower, "dwLower mismatch, expected %#lx, got %#lx\n", context.dwLower, context2.dwLower);
+ ok( context.dwUpper == context2.dwUpper, "dwUpper mismatch, expected %#lx, got %#lx\n", context.dwUpper, context2.dwUpper);
+
buf = &buffers[1].pBuffers[0];
ret = receive_data(sock, buf);
if (ret == -1)
return;
+ context2.dwLower = context2.dwUpper = 0xdeadbeef;
buf->BufferType = SECBUFFER_TOKEN;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, NULL, &buffers[0], &attrs, NULL);
--
2.30.2
Jan. 26, 2022
[PATCH] mfreadwrite/reader: Add m4v format magic.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
Should help with intro video in Wargroove.
dlls/mfreadwrite/reader.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c
index 7bcb52eaaa6..be77e1c5b1d 100644
--- a/dlls/mfreadwrite/reader.c
+++ b/dlls/mfreadwrite/reader.c
@@ -2397,6 +2397,7 @@ static HRESULT bytestream_get_url_hint(IMFByteStream *stream, WCHAR const **url)
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
{
@@ -2411,6 +2412,7 @@ static HRESULT bytestream_get_url_hint(IMFByteStream *stream, WCHAR const **url)
{ 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;
--
2.34.1
Jan. 26, 2022
[PATCH v2 5/5] mf/tests: Add some WMA decoder ProcessOutput tests.
by Rémi Bernon
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/mf/tests/mf.c | 121 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 121 insertions(+)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 6289bfbd993..72cd2e6860a 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -5858,11 +5858,13 @@ static void test_wma_decoder(void)
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_Float};
MFT_OUTPUT_STREAM_INFO output_info;
MFT_INPUT_STREAM_INFO input_info;
+ MFT_OUTPUT_DATA_BUFFER output;
IMFMediaType *media_type;
IMFTransform *transform;
IMFSample *sample;
GUID class_id;
ULONG i, ret;
+ DWORD status;
HRESULT hr;
hr = CoInitialize(NULL);
@@ -6072,6 +6074,125 @@ static void test_wma_decoder(void)
todo_wine
ok(ret == 1, "Release returned %u\n", ret);
+ /* As output_info.dwFlags doesn't have MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES
+ * IMFTransform_ProcessOutput needs a sample or returns MF_E_TRANSFORM_NEED_MORE_INPUT */
+
+ status = 0xdeadbeef;
+ memset(&output, 0, sizeof(output));
+ hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
+ todo_wine
+ ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#x\n", hr);
+ ok(output.dwStreamID == 0, "got dwStreamID %u\n", output.dwStreamID);
+ ok(!output.pSample, "got pSample %p\n", output.pSample);
+ todo_wine
+ ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE,
+ "got dwStatus %#x\n", output.dwStatus);
+ ok(!output.pEvents, "got pEvents %p\n", output.pEvents);
+ todo_wine
+ ok(status == 0, "got status %#x\n", status);
+
+ sample = create_sample(wma_encoded_data[0], wma_block_size);
+ hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+ todo_wine
+ ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#x\n", hr);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+
+ status = 0xdeadbeef;
+ memset(&output, 0, sizeof(output));
+ hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
+ todo_wine
+ ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#x\n", hr);
+ ok(!output.pSample, "got pSample %p\n", output.pSample);
+ todo_wine
+ ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE,
+ "got dwStatus %#x\n", output.dwStatus);
+ todo_wine
+ ok(status == 0, "got status %#x\n", status);
+
+ status = 0xdeadbeef;
+ output_info.cbSize = sizeof(wma_decoded_data);
+ sample = create_sample(NULL, output_info.cbSize);
+ memset(&output, 0, sizeof(output));
+ output.pSample = sample;
+ hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
+ while (hr == MF_E_TRANSFORM_NEED_MORE_INPUT)
+ {
+ ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#x\n", hr);
+ ok(output.pSample == sample, "got pSample %p\n", output.pSample);
+ ok(output.dwStatus == 0, "got dwStatus %#x\n", output.dwStatus);
+ ok(status == 0, "got status %#x\n", status);
+ check_sample(sample, NULL, 0);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+
+ sample = create_sample(wma_encoded_data[0], wma_block_size);
+ hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+ ok(hr == S_OK, "ProcessInput returned %#x\n", hr);
+ ret = IMFSample_Release(sample);
+ ok(ret == 1, "Release returned %u\n", ret);
+
+ status = 0xdeadbeef;
+ sample = create_sample(NULL, output_info.cbSize);
+ memset(&output, 0, sizeof(output));
+ output.pSample = sample;
+ hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
+ }
+
+ todo_wine
+ ok(hr == S_OK, "ProcessOutput returned %#x\n", hr);
+ ok(output.pSample == sample, "got pSample %p\n", output.pSample);
+
+ i = 0;
+ while (output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE)
+ {
+ ok(hr == S_OK, "ProcessOutput returned %#x\n", hr);
+ ok(output.pSample == sample, "got pSample %p\n", output.pSample);
+ ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got dwStatus %#x\n",
+ output.dwStatus);
+ ok(status == 0, "got status %#x\n", status);
+ check_sample(sample, wma_decoded_data, sizeof(wma_decoded_data));
+ i += sizeof(wma_decoded_data);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+
+ status = 0xdeadbeef;
+ sample = create_sample(NULL, output_info.cbSize);
+ memset(&output, 0, sizeof(output));
+ output.pSample = sample;
+ hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
+ }
+
+ todo_wine
+ ok(hr == S_OK, "ProcessOutput returned %#x\n", hr);
+ ok(output.pSample == sample, "got pSample %p\n", output.pSample);
+ ok(output.dwStatus == 0, "got dwStatus %#x\n", output.dwStatus);
+ todo_wine
+ ok(status == 0, "got status %#x\n", status);
+ if (hr == S_OK)
+ {
+ check_sample(sample, wma_decoded_data, sizeof(wma_decoded_data) / 2);
+ i += sizeof(wma_decoded_data) / 2;
+ ok(i == 0xe000, "ProcessOutput produced %#x bytes\n", i);
+ }
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+
+ status = 0xdeadbeef;
+ sample = create_sample(NULL, output_info.cbSize);
+ memset(&output, 0, sizeof(output));
+ output.pSample = sample;
+ hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
+ todo_wine
+ ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#x\n", hr);
+ ok(output.pSample == sample, "got pSample %p\n", output.pSample);
+ ok(output.dwStatus == 0, "got dwStatus %#x\n", output.dwStatus);
+ todo_wine
+ ok(status == 0, "got status %#x\n", status);
+ check_sample(sample, NULL, 0);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+
sample = create_sample(wma_encoded_data[0], wma_block_size);
hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
todo_wine
--
2.34.1
Jan. 26, 2022
[PATCH v2 4/5] mf/tests: Add some WMA decoder ProcessInput tests.
by Rémi Bernon
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/mf/tests/mf.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 4a8644bff4f..6289bfbd993 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -5860,6 +5860,7 @@ static void test_wma_decoder(void)
MFT_INPUT_STREAM_INFO input_info;
IMFMediaType *media_type;
IMFTransform *transform;
+ IMFSample *sample;
GUID class_id;
ULONG i, ret;
HRESULT hr;
@@ -6048,8 +6049,38 @@ static void test_wma_decoder(void)
todo_wine
ok(output_info.cbAlignment == 1, "got cbAlignment %#x\n", output_info.cbAlignment);
+ sample = create_sample(wma_encoded_data[0], wma_block_size / 2);
+ hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+ todo_wine
+ ok(hr == S_OK, "ProcessInput returned %#x\n", hr);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+ sample = create_sample(wma_encoded_data[0] + wma_block_size, wma_block_size - wma_block_size / 2);
+ hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+ todo_wine
+ ok(hr == S_OK, "ProcessInput returned %#x\n", hr);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+ sample = create_sample(wma_encoded_data[0], wma_block_size);
+ hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+ todo_wine
+ ok(hr == S_OK, "ProcessInput returned %#x\n", hr);
+ hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+ todo_wine
+ ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#x\n", hr);
+ ret = IMFSample_Release(sample);
+ todo_wine
+ ok(ret == 1, "Release returned %u\n", ret);
+
+ sample = create_sample(wma_encoded_data[0], wma_block_size);
+ hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+ todo_wine
+ ok(hr == S_OK, "ProcessInput returned %#x\n", hr);
+
ret = IMFTransform_Release(transform);
ok(ret == 0, "Release returned %u\n", ret);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
failed:
CoUninitialize();
--
2.34.1
Jan. 26, 2022
[PATCH v2 3/5] mf/tests: Add some WMA encoder ProcessOutput tests.
by Rémi Bernon
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/mf/tests/mf.c | 130 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 130 insertions(+)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index a9467a7fdb6..4a8644bff4f 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -5491,9 +5491,103 @@ static IMFSample *create_sample(const BYTE *data, ULONG size)
return sample;
}
+#define check_sample(a, b, c) check_sample_(__LINE__, a, b, c)
+static void check_sample_(int line, IMFSample *sample, const void *expect_buf, ULONG expect_len)
+{
+ IMFMediaBuffer *media_buffer;
+ DWORD length;
+ BYTE *buffer;
+ HRESULT hr;
+ ULONG ret;
+
+ hr = IMFSample_ConvertToContiguousBuffer(sample, &media_buffer);
+ ok_(__FILE__, line)(hr == S_OK, "ConvertToContiguousBuffer returned %#x\n", hr);
+ hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &length);
+ ok_(__FILE__, line)(hr == S_OK, "Lock returned %#x\n", hr);
+ ok_(__FILE__, line)(expect_len == length, "got length %u\n", length);
+ if (length && length == expect_len)
+ {
+ ok_(__FILE__, line)(!memcmp(expect_buf, buffer, expect_len),
+ "unexpected buffer data\n");
+ }
+ hr = IMFMediaBuffer_Unlock(media_buffer);
+ ok_(__FILE__, line)(hr == S_OK, "Unlock returned %#x\n", hr);
+ ret = IMFMediaBuffer_Release(media_buffer);
+ ok_(__FILE__, line)(ret == 1, "Release returned %u\n", ret);
+}
+
static const BYTE wma_codec_data[10] = {0, 0x44, 0, 0, 0x17, 0, 0, 0, 0, 0};
static const BYTE wma_decoded_data[0x4000] = {0};
static const ULONG wma_block_size = 1487;
+static const BYTE wma_encoded_data[][1487] =
+{
+ {0x09,0x00,0x00,0x77,0xe9,0x48,0x0c,0x84,0x44,0x88,0x4a,0x40,0x64,0x22,0x24,0x43,
+ 0xd6,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x18,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x28,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x38,0x00,0x00,0x42,0x10,0x84,0x21,0x08,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,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x58,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x44,0x88,0x4a,0x40,0x64,0x22,0x24,0x43,
+ 0xd6,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x68,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x78,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x88,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x98,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xa8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x44,0x88,0x4a,0x40,0x64,0x22,0x24,0x43,
+ 0xd6,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xb8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xc8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xd8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xe8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xf8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x44,0x88,0x4a,0x40,0x64,0x22,0x24,0x43,
+ 0xd6,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x08,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x18,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x28,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x38,0x00,0x00,0x42,0x10,0x84,0x21,0x08,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,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x44,0x88,0x4a,0x40,0x64,0x22,0x24,0x43,
+ 0xd6,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x58,0x00,0x00,0x42,0x10,0x84,0x21,0x08,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,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x78,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x88,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x98,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x44,0x88,0x4a,0x40,0x64,0x22,0x24,0x43,
+ 0xd6,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xa8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xb8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xc8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xd8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xe8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x44,0x88,0x4a,0x40,0x64,0x22,0x24,0x43,
+ 0xd6,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0xf8,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+ {0x03,0x00,0x00,0x42,0x10,0x84,0x21,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
+};
static void test_wma_encoder(void)
{
@@ -5551,10 +5645,12 @@ static void test_wma_encoder(void)
MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float};
MFT_OUTPUT_STREAM_INFO output_info;
MFT_INPUT_STREAM_INFO input_info;
+ MFT_OUTPUT_DATA_BUFFER output;
IMFMediaType *media_type;
IMFTransform *transform;
IMFSample *sample;
GUID class_id;
+ DWORD status;
ULONG i, ret;
HRESULT hr;
@@ -5611,6 +5707,40 @@ static void test_wma_encoder(void)
hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#x\n", hr);
+ status = 0xdeadbeef;
+ sample = create_sample(NULL, output_info.cbSize);
+ memset(&output, 0, sizeof(output));
+ output.pSample = sample;
+
+ i = 0;
+ while (SUCCEEDED(hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status)))
+ {
+ winetest_push_context("%u", i);
+ ok(hr == S_OK, "ProcessOutput returned %#x\n", hr);
+ ok(output.pSample == sample, "got pSample %p\n", output.pSample);
+ ok(output.dwStatus == MFT_OUTPUT_DATA_BUFFER_INCOMPLETE, "got dwStatus %#x\n", output.dwStatus);
+ ok(status == 0, "got status %#x\n", status);
+ check_sample(sample, wma_encoded_data + i, wma_block_size);
+ winetest_pop_context();
+ i++;
+ }
+
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+
+ status = 0xdeadbeef;
+ sample = create_sample(NULL, output_info.cbSize);
+ memset(&output, 0, sizeof(output));
+ output.pSample = sample;
+ hr = IMFTransform_ProcessOutput(transform, 0, 1, &output, &status);
+ ok(hr == MF_E_TRANSFORM_NEED_MORE_INPUT, "ProcessOutput returned %#x\n", hr);
+ ok(output.pSample == sample, "got pSample %p\n", output.pSample);
+ ok(output.dwStatus == 0, "got dwStatus %#x\n", output.dwStatus);
+ ok(status == 0, "got status %#x\n", status);
+ check_sample(sample, NULL, 0);
+ ret = IMFSample_Release(sample);
+ ok(ret == 0, "Release returned %u\n", ret);
+
ret = IMFTransform_Release(transform);
ok(ret == 0, "Release returned %u\n", ret);
--
2.34.1
Jan. 26, 2022
[PATCH v2 2/5] mf/tests: Add some WMA decoder GetOutputStreamInfo tests.
by Rémi Bernon
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/mf/tests/mf.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 5b2f5e60d4b..a9467a7fdb6 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -5726,6 +5726,7 @@ static void test_wma_decoder(void)
MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8};
MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_Float};
+ MFT_OUTPUT_STREAM_INFO output_info;
MFT_INPUT_STREAM_INFO input_info;
IMFMediaType *media_type;
IMFTransform *transform;
@@ -5749,6 +5750,9 @@ static void test_wma_decoder(void)
hr = IMFTransform_GetInputStreamInfo(transform, 0, &input_info);
todo_wine
ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "GetInputStreamInfo returned %#x\n", hr);
+ hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info);
+ todo_wine
+ ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "GetOutputStreamInfo returned %#x\n", hr);
hr = IMFTransform_GetOutputAvailableType(transform, 0, 0, &media_type);
todo_wine
ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "GetOutputAvailableType returned %#x\n", hr);
@@ -5809,6 +5813,9 @@ static void test_wma_decoder(void)
hr = IMFTransform_GetInputStreamInfo(transform, 0, &input_info);
todo_wine
ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "GetInputStreamInfo returned %#x\n", hr);
+ hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info);
+ todo_wine
+ ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "GetOutputStreamInfo returned %#x\n", hr);
/* check new output media types */
@@ -5867,6 +5874,50 @@ static void test_wma_decoder(void)
todo_wine
ok(input_info.cbAlignment == 1, "got cbAlignment %#x\n", input_info.cbAlignment);
+ memset(&output_info, 0xcd, sizeof(output_info));
+ hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info);
+ todo_wine
+ ok(hr == S_OK, "GetOutputStreamInfo returned %#x\n", hr);
+ todo_wine
+ ok(output_info.dwFlags == 0, "got dwFlags %#x\n", output_info.dwFlags);
+ todo_wine
+ ok(output_info.cbSize == 0, "got cbSize %#x\n", output_info.cbSize);
+ todo_wine
+ ok(output_info.cbAlignment == 1, "got cbAlignment %#x\n", output_info.cbAlignment);
+
+ /* MF_MT_AUDIO_AVG_BYTES_PER_SECOND isn't required by SetInputType, but is needed for the transform to work */
+
+ hr = MFCreateMediaType(&media_type);
+ ok(hr == S_OK, "MFCreateMediaType returned %#x\n", hr);
+ init_media_type(media_type, input_type_desc, -1);
+ hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 4003);
+ ok(hr == S_OK, "SetUINT32 returned %#x\n", hr);
+ hr = IMFTransform_SetInputType(transform, 0, media_type, 0);
+ todo_wine
+ ok(hr == S_OK, "SetInputType returned %#x.\n", hr);
+
+ hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info);
+ todo_wine
+ ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "GetOutputStreamInfo returned %#x\n", hr);
+
+ init_media_type(media_type, output_type_desc, -1);
+ hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
+ todo_wine
+ ok(hr == S_OK, "SetInputType returned %#x.\n", hr);
+ ret = IMFMediaType_Release(media_type);
+ ok(ret == 0, "Release returned %u\n", ret);
+
+ memset(&output_info, 0xcd, sizeof(output_info));
+ hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info);
+ todo_wine
+ ok(hr == S_OK, "GetOutputStreamInfo returned %#x\n", hr);
+ todo_wine
+ ok(output_info.dwFlags == 0, "got dwFlags %#x\n", output_info.dwFlags);
+ todo_wine
+ ok(output_info.cbSize == sizeof(wma_decoded_data), "got cbSize %#x\n", output_info.cbSize);
+ todo_wine
+ ok(output_info.cbAlignment == 1, "got cbAlignment %#x\n", output_info.cbAlignment);
+
ret = IMFTransform_Release(transform);
ok(ret == 0, "Release returned %u\n", ret);
--
2.34.1
Jan. 26, 2022