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
December 2019
- 73 participants
- 1394 messages
Re: [PATCH 1/5] wined3d: Introduce wined3d_device_apply_stateblock().
by Matteo Bruni
On Sat, Dec 7, 2019 at 5:11 PM Zebediah Figura <z.figura12(a)gmail.com> wrote:
>
> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
> ---
> dlls/wined3d/device.c | 93 +++++++++++++++++++++++++++++++++++++++
> dlls/wined3d/wined3d.spec | 1 +
> include/wine/wined3d.h | 1 +
> 3 files changed, 95 insertions(+)
>
> diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
> index 0ae841d4e35..50029dfbec2 100644
> --- a/dlls/wined3d/device.c
> +++ b/dlls/wined3d/device.c
> @@ -3829,6 +3829,99 @@ struct wined3d_texture * CDECL wined3d_device_get_texture(const struct wined3d_d
> return device->state.textures[stage];
> }
>
> +void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
> + struct wined3d_stateblock *stateblock)
> +{
> + const struct wined3d_d3d_info *d3d_info = &stateblock->device->adapter->d3d_info;
> + const struct wined3d_stateblock_state *state = &stateblock->stateblock_state;
> + unsigned int i, j;
> +
> + TRACE("device %p, stateblock %p.\n", device, stateblock);
> +
> + wined3d_stateblock_init_contained_states(stateblock);
> +
> + wined3d_device_set_vertex_shader(device, state->vs);
> + wined3d_device_set_pixel_shader(device, state->ps);
Can we make use of the stateblock flags to only update the changed
states instead of all of them?
> + for (i = 0; i < d3d_info->limits.vs_uniform_count; ++i)
> + wined3d_device_set_vs_consts_f(device, i, 1, &state->vs_consts_f[i]);
Either only update the changed constants or set all of them in one go, IMO.
Somewhat related, I have a few patches optimizing / improving our
handling of those flags but I don't expect them to be ready before
code freeze (and I don't want to conflict with your patches,
especially now).
Dec. 10, 2019
[PATCH] winecfg: Avoid an unneeded strlen() call.
by Francois Gouget
Note that szLinkTarget is an array field and thus cannot be NULL.
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
programs/winecfg/theme.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/programs/winecfg/theme.c b/programs/winecfg/theme.c
index 66d23448f6f..dffe1861e82 100644
--- a/programs/winecfg/theme.c
+++ b/programs/winecfg/theme.c
@@ -842,7 +842,7 @@ static void on_shell_folder_selection_changed(HWND hDlg, LPNMLISTVIEW lpnm) {
if (lpnm->uNewState & LVIS_SELECTED) {
psfiSelected = (struct ShellFolderInfo *)lpnm->lParam;
EnableWindow(GetDlgItem(hDlg, IDC_LINK_SFPATH), 1);
- if (strlen(psfiSelected->szLinkTarget)) {
+ if (*psfiSelected->szLinkTarget) {
WCHAR *link;
CheckDlgButton(hDlg, IDC_LINK_SFPATH, BST_CHECKED);
EnableWindow(GetDlgItem(hDlg, IDC_EDIT_SFPATH), 1);
--
2.20.1
Dec. 10, 2019
Re: [PATCH v2 3/6] d3d9: Use wined3d_stateblock_get_state() in d3d9_device_GetRenderState().
by Matteo Bruni
On Tue, Dec 10, 2019 at 9:34 AM Matteo Bruni <matteo.mystral(a)gmail.com> wrote:
>
> On Thu, Nov 28, 2019 at 6:54 AM Zebediah Figura <z.figura12(a)gmail.com> wrote:
> >
> > Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
> > ---
> > dlls/d3d9/device.c | 4 +++-
> > 1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
> > index 2d66c569938..51b7f4d6f59 100644
> > --- a/dlls/d3d9/device.c
> > +++ b/dlls/d3d9/device.c
> > @@ -2329,6 +2329,7 @@ static HRESULT WINAPI d3d9_device_GetRenderState(IDirect3DDevice9Ex *iface,
> > D3DRENDERSTATETYPE state, DWORD *value)
> > {
> > struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
> > + const struct wined3d_stateblock_state *device_state;
> > struct wined3d_color factor;
> >
> > TRACE("iface %p, state %#x, value %p.\n", iface, state, value);
> > @@ -2344,7 +2345,8 @@ static HRESULT WINAPI d3d9_device_GetRenderState(IDirect3DDevice9Ex *iface,
> > }
> >
> > wined3d_mutex_lock();
> > - *value = wined3d_device_get_render_state(device->wined3d_device, state);
> > + device_state = wined3d_stateblock_get_state(device->state);
> > + *value = device_state->rs[state];
> > wined3d_mutex_unlock();
> >
> > return D3D_OK;
>
> Just a couple of comments WRT potential future improvements. Obviously
> they apply to the other d3d* versions too.
>
> The state for the stateblock isn't going to change from underneath so
> it could be stored in the d3d9 device once and for all instead of
> getting it from wined3d every time it's needed. It doesn't matter a
> lot I guess (and it's certainly not urgent anyway), especially for
> those Get*() methods, but it would be one less inter-module function
> call per API call.
I guess it was just one comment, after all...
Dec. 10, 2019
Re: [PATCH v2 3/6] d3d9: Use wined3d_stateblock_get_state() in d3d9_device_GetRenderState().
by Matteo Bruni
On Thu, Nov 28, 2019 at 6:54 AM Zebediah Figura <z.figura12(a)gmail.com> wrote:
>
> Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
> ---
> dlls/d3d9/device.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
> index 2d66c569938..51b7f4d6f59 100644
> --- a/dlls/d3d9/device.c
> +++ b/dlls/d3d9/device.c
> @@ -2329,6 +2329,7 @@ static HRESULT WINAPI d3d9_device_GetRenderState(IDirect3DDevice9Ex *iface,
> D3DRENDERSTATETYPE state, DWORD *value)
> {
> struct d3d9_device *device = impl_from_IDirect3DDevice9Ex(iface);
> + const struct wined3d_stateblock_state *device_state;
> struct wined3d_color factor;
>
> TRACE("iface %p, state %#x, value %p.\n", iface, state, value);
> @@ -2344,7 +2345,8 @@ static HRESULT WINAPI d3d9_device_GetRenderState(IDirect3DDevice9Ex *iface,
> }
>
> wined3d_mutex_lock();
> - *value = wined3d_device_get_render_state(device->wined3d_device, state);
> + device_state = wined3d_stateblock_get_state(device->state);
> + *value = device_state->rs[state];
> wined3d_mutex_unlock();
>
> return D3D_OK;
Just a couple of comments WRT potential future improvements. Obviously
they apply to the other d3d* versions too.
The state for the stateblock isn't going to change from underneath so
it could be stored in the d3d9 device once and for all instead of
getting it from wined3d every time it's needed. It doesn't matter a
lot I guess (and it's certainly not urgent anyway), especially for
those Get*() methods, but it would be one less inter-module function
call per API call.
Dec. 10, 2019
[PATCH] ws2_32/tests: Fix the spelling of a couple of ok() messages.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/ws2_32/tests/sock.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index e4b57cfddae..cd97aae4bb8 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -6611,7 +6611,7 @@ static void test_WSASendMsg(void)
ok(!ret, "WSASendMsg should have worked\n");
ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
"Expected 0, got %d\n", GetLastError());
- ok(bytesSent == iovec[0].len, "incorret bytes sent, expected %d, sent %d\n",
+ ok(bytesSent == iovec[0].len, "incorrect bytes sent, expected %d, sent %d\n",
iovec[0].len, bytesSent);
/* receive data */
@@ -6639,7 +6639,7 @@ static void test_WSASendMsg(void)
SetLastError(0xdeadbeef);
ret = pWSASendMsg(sock, &msg, 0, &bytesSent, NULL, NULL);
ok(!ret, "WSASendMsg should have worked\n");
- ok(bytesSent == iovec[0].len + iovec[1].len, "incorret bytes sent, expected %d, sent %d\n",
+ ok(bytesSent == iovec[0].len + iovec[1].len, "incorrect bytes sent, expected %d, sent %d\n",
iovec[0].len + iovec[1].len, bytesSent);
ok(GetLastError() == 0 || broken(GetLastError() == 0xdeadbeef) /* Win <= 2008 */,
"Expected 0, got %d\n", GetLastError());
--
2.20.1
Dec. 10, 2019
[PATCH] winedbg: Fix the spelling of various messages and the README.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
programs/winedbg/README | 2 +-
programs/winedbg/gdbproxy.c | 4 ++--
programs/winedbg/types.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/programs/winedbg/README b/programs/winedbg/README
index e824a1c88ce..66b3953bd22 100644
--- a/programs/winedbg/README
+++ b/programs/winedbg/README
@@ -1,4 +1,4 @@
- This is the core of the Wine debugger. The reverse assember
+ This is the core of the Wine debugger. The reverse assembler
was stolen from Mach more or less intact. It turns out that there are
two variables that are set differently if you are reverse assembling
16 bit code, and on the whole it seems to work.
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 85ebc882a62..052e73b2ad6 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -569,7 +569,7 @@ static void wait_for_debuggee(struct gdb_context* gdbctx)
{
if (check_for_interrupt(gdbctx)) {
if (!DebugBreakProcess(gdbctx->process->handle)) {
- ERR("Failed to break into debugee\n");
+ ERR("Failed to break into debuggee\n");
break;
}
WaitForDebugEvent(&de, INFINITE);
@@ -624,7 +624,7 @@ static void get_process_info(struct gdb_context* gdbctx, char* buffer, size_t le
case ABOVE_NORMAL_PRIORITY_CLASS: strcat(buffer, ", above normal priority"); break;
#endif
#ifdef BELOW_NORMAL_PRIORITY_CLASS
- case BELOW_NORMAL_PRIORITY_CLASS: strcat(buffer, ", below normal priotity"); break;
+ case BELOW_NORMAL_PRIORITY_CLASS: strcat(buffer, ", below normal priority"); break;
#endif
case HIGH_PRIORITY_CLASS: strcat(buffer, ", high priority"); break;
case IDLE_PRIORITY_CLASS: strcat(buffer, ", idle priority"); break;
diff --git a/programs/winedbg/types.c b/programs/winedbg/types.c
index 696a9fd48a5..019554ad1be 100644
--- a/programs/winedbg/types.c
+++ b/programs/winedbg/types.c
@@ -168,7 +168,7 @@ BOOL types_store_value(struct dbg_lvalue* lvalue_to, const struct dbg_lvalue* lv
if (!types_get_info(&lvalue_to->type, TI_GET_LENGTH, &size)) return FALSE;
if (sizeof(val) < size)
{
- dbg_printf("Unsufficient size\n");
+ dbg_printf("Insufficient size\n");
return FALSE;
}
/* FIXME: should support floats as well */
--
2.20.1
Dec. 10, 2019
[PATCH] qcap/tests: Avoid an unneeded lstrlenW() call.
by Francois Gouget
Note that achName is an array field and thus cannot be NULL.
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/qcap/tests/smartteefilter.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/qcap/tests/smartteefilter.c b/dlls/qcap/tests/smartteefilter.c
index 4eac344d537..014c6ee2d13 100644
--- a/dlls/qcap/tests/smartteefilter.c
+++ b/dlls/qcap/tests/smartteefilter.c
@@ -2078,7 +2078,7 @@ static void test_smart_tee_filter(void)
if (FAILED(hr))
goto end;
- ok(lstrlenW(filterInfo.achName) == 0,
+ ok(!*filterInfo.achName,
"filter's name is meant to be empty but it's %s\n", wine_dbgstr_w(filterInfo.achName));
hr = IBaseFilter_EnumPins(smartTeeFilter, &enumPins);
--
2.20.1
Dec. 10, 2019
[PATCH] msvcrt/tests: Avoid an unneeded strlen() call.
by Francois Gouget
Note that buf is an array and thus cannot be NULL.
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
I used the buf[0] == 0 form to match the buf[0] == 'X' test a few lines
up. I'm fine with replacing it with a !*buf too.
dlls/msvcrt/tests/misc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/msvcrt/tests/misc.c b/dlls/msvcrt/tests/misc.c
index c59464f82d6..7e2a7e40690 100644
--- a/dlls/msvcrt/tests/misc.c
+++ b/dlls/msvcrt/tests/misc.c
@@ -211,7 +211,7 @@ static void test_strerror_s(void)
memset(buf, 'X', sizeof(buf));
ret = pstrerror_s(buf, 1, 0);
ok(ret == 0, "Expected strerror_s to return 0, got %d\n", ret);
- ok(strlen(buf) == 0, "Expected output buffer to be null terminated\n");
+ ok(buf[0] == 0, "Expected output buffer to be null terminated\n");
memset(buf, 'X', sizeof(buf));
ret = pstrerror_s(buf, 2, 0);
--
2.20.1
Dec. 10, 2019
[PATCH] riched32/tests: Avoid an unneeded strlen() call.
by Francois Gouget
Note that buffer is an array and thus cannot be NULL.
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/riched32/tests/editor.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c
index 0d55b7cd6ed..950c175bbbe 100644
--- a/dlls/riched32/tests/editor.c
+++ b/dlls/riched32/tests/editor.c
@@ -293,7 +293,7 @@ static void test_EM_STREAMIN(void)
result = SendMessageA(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM)buffer);
ok (result == 0,
"EM_STREAMIN: Test 3 returned %ld, expected 0\n", result);
- ok (strlen(buffer) == 0,
+ ok (!*buffer,
"EM_STREAMIN: Test 3 set wrong text: Result: %s\n",buffer);
ok(es.dwError == -16, "EM_STREAMIN: Test 0 set error %d, expected %d\n", es.dwError, -16);
--
2.20.1
Dec. 10, 2019
[PATCH] msado15: Fix the name of the GetString() delimiter parameters.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/msado15/recordset.c | 6 +++---
include/msado15_backcompat.idl | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index 52282c7e827..84adec406f4 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -526,11 +526,11 @@ static HRESULT WINAPI recordset_get_StayInSync( _Recordset *iface, VARIANT_BOOL
}
static HRESULT WINAPI recordset_GetString( _Recordset *iface, StringFormatEnum string_format, LONG num_rows,
- BSTR column_delimeter, BSTR row_delimeter, BSTR null_expr,
+ BSTR column_delimiter, BSTR row_delimiter, BSTR null_expr,
BSTR *ret_string )
{
- FIXME( "%p, %u, %d, %s, %s, %s, %p\n", iface, string_format, num_rows, debugstr_w(column_delimeter),
- debugstr_w(row_delimeter), debugstr_w(null_expr), ret_string );
+ FIXME( "%p, %u, %d, %s, %s, %s, %p\n", iface, string_format, num_rows, debugstr_w(column_delimiter),
+ debugstr_w(row_delimiter), debugstr_w(null_expr), ret_string );
return E_NOTIMPL;
}
diff --git a/include/msado15_backcompat.idl b/include/msado15_backcompat.idl
index a1d5e28038b..e4a847ab859 100644
--- a/include/msado15_backcompat.idl
+++ b/include/msado15_backcompat.idl
@@ -1068,8 +1068,8 @@ interface Recordset20 : Recordset15
HRESULT GetString(
[in, defaultvalue(adClipString)] StringFormatEnum string_format,
[in, defaultvalue(-1)] LONG num_rows,
- [in, optional] BSTR column_delimeter,
- [in, optional] BSTR row_delimeter,
+ [in, optional] BSTR column_delimiter,
+ [in, optional] BSTR row_delimiter,
[in, optional] BSTR null_expr,
[out, retval] BSTR *ret_string);
--
2.20.1
Dec. 10, 2019
[PATCH] jscript: Fix the spelling of a couple of comments.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/jscript/jsutils.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c
index a36c9c1e5b9..af465300e72 100644
--- a/dlls/jscript/jsutils.c
+++ b/dlls/jscript/jsutils.c
@@ -672,13 +672,13 @@ static INT32 double_to_int32(double number)
* after rounding; if the exponent is > 83 then no bits of precision can be
* left in the low 32-bit range of the result (IEEE-754 doubles have 52 bits
* of fractional precision).
- * Note this case handles 0, -0, and all infinte, NaN, & denormal value. */
+ * Note this case handles 0, -0, and all infinite, NaN & denormal values. */
if(exp < 0 || exp > 83)
return 0;
/* Select the appropriate 32-bits from the floating point mantissa. If the
* exponent is 52 then the bits we need to select are already aligned to the
- * lowest bits of the 64-bit integer representation of tghe number, no need
+ * lowest bits of the 64-bit integer representation of the number, no need
* to shift. If the exponent is greater than 52 we need to shift the value
* left by (exp - 52), if the value is less than 52 we need to shift right
* accordingly. */
--
2.20.1
Dec. 10, 2019
[PATCH] msxml3/tests: Avoid an unneeded lstrlenW() call.
by Francois Gouget
This being a test we have to assume IXMLElement_get_text() could return
a NULL string.
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/msxml3/tests/xmldoc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/msxml3/tests/xmldoc.c b/dlls/msxml3/tests/xmldoc.c
index 359297f592f..693af195717 100644
--- a/dlls/msxml3/tests/xmldoc.c
+++ b/dlls/msxml3/tests/xmldoc.c
@@ -972,7 +972,7 @@ static void test_xmlelem(void)
hr = IXMLElement_get_text(element, &str);
ok(hr == S_OK, "Expected S_OK, got %08x\n", hr);
- ok(lstrlenW(str) == 0, "Expected empty text\n");
+ ok(str && !*str, "Expected empty text\n");
SysFreeString(str);
/* put_text with an ELEMENT */
--
2.20.1
Dec. 10, 2019
[PATCH] kernelbase/tests: Avoid an uneeded lstrlenW() call.
by Francois Gouget
Note that path_outW is an array and thus cannot be NULL.
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/kernelbase/tests/path.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/kernelbase/tests/path.c b/dlls/kernelbase/tests/path.c
index 93303bafc34..d77eaebd913 100644
--- a/dlls/kernelbase/tests/path.c
+++ b/dlls/kernelbase/tests/path.c
@@ -1110,7 +1110,7 @@ static void test_PathCchCanonicalize(void)
hr = pPathCchCanonicalize(path_outW, ARRAY_SIZE(path_outW), path_inW);
ok(hr == HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE), "expect hr %#x, got %#x %s\n",
HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE), hr, wine_dbgstr_w(path_outW));
- ok(lstrlenW(path_outW) == 0, "got %d\n", lstrlenW(path_outW));
+ ok(!*path_outW, "got %d\n", lstrlenW(path_outW));
path_inW[0] = 'C';
path_inW[1] = ':';
--
2.20.1
Dec. 10, 2019
[PATCH] dmloader: Fix the spelling of a TRACE() message and a comment.
by Francois Gouget
Signed-off-by: Francois Gouget <fgouget(a)free.fr>
---
dlls/dmloader/loader.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/dmloader/loader.c b/dlls/dmloader/loader.c
index 9048c02dfc7..60dd6f844b9 100644
--- a/dlls/dmloader/loader.c
+++ b/dlls/dmloader/loader.c
@@ -168,7 +168,7 @@ static struct cache_entry *find_cache_object(IDirectMusicLoaderImpl *This, DMUS_
struct cache_entry *existing;
/*
- * The Object is looked for the the following order.
+ * The Object is looked up in the following order.
* 1. DMUS_OBJ_OBJECT
* 2. DMUS_OBJ_STREAM
* 3. DMUS_OBJ_MEMORY
@@ -682,7 +682,7 @@ static HRESULT WINAPI IDirectMusicLoaderImpl_CacheObject(IDirectMusicLoader8 *if
entry = find_cache_object(This, &desc);
if (entry) {
if ((entry->Desc.dwValidData & DMUS_OBJ_LOADED) && entry->pObject) {
- TRACE("Object already laoded.\n");
+ TRACE("Object already loaded.\n");
return S_FALSE;
}
--
2.20.1
Dec. 10, 2019
Re: [PATCH v3 5/5] strmbase/renderer: Use base sink connection methods.
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=61758
Your paranoid android.
=== debian10 (32 bit report) ===
quartz:
vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.
=== debian10 (32 bit Chinese:China report) ===
quartz:
vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.
=== debian10 (32 bit WoW report) ===
quartz:
vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.
=== debian10 (64 bit WoW report) ===
quartz:
vmr7.c:1395: Test succeeded inside todo block: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7c-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7b-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7d-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:904: Test failed: Got hr 0x80040227.
vmr9.c:1318: Test failed: Got hr 0x80040227 for subtype {e436eb7e-524f-11ce-9f53-0020af0ba770} and bpp 24.
vmr9.c:1322: Test failed: Got hr 0x1.
vmr9.c:1324: Test failed: Got hr 0x1.
vmr9.c:1394: Test succeeded inside todo block: Got hr 0x1.
Dec. 10, 2019
[PATCH v3 5/5] strmbase/renderer: Use base sink connection methods.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/vmr9.c | 8 +++--
dlls/strmbase/renderer.c | 63 ++++++++++++++--------------------------
2 files changed, 26 insertions(+), 45 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index a9b90b322dd..a3391870a76 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -356,7 +356,7 @@ static HRESULT VMR9_maybe_init(struct quartz_vmr *This, BOOL force)
HRESULT hr;
TRACE("my mode: %u, my window: %p, my last window: %p\n", This->mode, This->baseControlWindow.baseWindow.hWnd, This->hWndClippingWindow);
- if (This->num_surfaces || !This->renderer.sink.pin.peer)
+ if (This->num_surfaces)
return S_OK;
if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow)
@@ -410,7 +410,8 @@ static void vmr_start_stream(struct strmbase_renderer *iface)
TRACE("(%p)\n", This);
- VMR9_maybe_init(This, TRUE);
+ if (This->renderer.sink.pin.peer)
+ VMR9_maybe_init(This, TRUE);
IVMRImagePresenter9_StartPresenting(This->presenter, This->cookie);
SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL,
This->source_rect.left,
@@ -1760,7 +1761,8 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoClippingWindow(IVMRWindowles
EnterCriticalSection(&This->renderer.filter.csFilter);
This->hWndClippingWindow = hwnd;
- VMR9_maybe_init(This, FALSE);
+ if (This->renderer.sink.pin.peer)
+ VMR9_maybe_init(This, FALSE);
if (!hwnd)
IVMRSurfaceAllocatorEx9_TerminateDevice(This->allocator, This->cookie);
LeaveCriticalSection(&This->renderer.filter.csFilter);
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 7d8dbdfa936..7b9736ccfb2 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -40,46 +40,6 @@ static inline struct strmbase_renderer *impl_from_IPin(IPin *iface)
return CONTAINING_RECORD(iface, struct strmbase_renderer, sink.pin.IPin_iface);
}
-static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
-{
- struct strmbase_renderer *filter = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("iface %p, peer %p, mt %p.\n", iface, peer, mt);
- strmbase_dump_media_type(mt);
-
- EnterCriticalSection(&filter->filter.csFilter);
- hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt);
- if (SUCCEEDED(hr))
- {
- if (filter->pFuncsTable->renderer_connect)
- hr = filter->pFuncsTable->renderer_connect(filter, mt);
- }
- LeaveCriticalSection(&filter->filter.csFilter);
-
- return hr;
-}
-
-static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
-{
- struct strmbase_renderer *filter = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("iface %p.\n", iface);
-
- EnterCriticalSection(&filter->filter.csFilter);
- hr = BaseInputPinImpl_Disconnect(iface);
- if (SUCCEEDED(hr))
- {
- if (filter->pFuncsTable->pfnBreakConnect)
- hr = filter->pFuncsTable->pfnBreakConnect(filter);
- }
- BaseRendererImpl_ClearPendingSample(filter);
- LeaveCriticalSection(&filter->filter.csFilter);
-
- return hr;
-}
-
static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
{
struct strmbase_renderer *filter = impl_from_IPin(iface);
@@ -157,8 +117,8 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl =
BasePinImpl_AddRef,
BasePinImpl_Release,
BaseInputPinImpl_Connect,
- BaseRenderer_InputPin_ReceiveConnection,
- BaseRenderer_InputPin_Disconnect,
+ BaseInputPinImpl_ReceiveConnection,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
@@ -312,12 +272,31 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp
return BaseRendererImpl_Receive(filter, sample);
}
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+ struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->renderer_connect)
+ return filter->pFuncsTable->renderer_connect(filter, mt);
+ return S_OK;
+}
+
+static void sink_disconnect(struct strmbase_sink *iface)
+{
+ struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->pfnBreakConnect)
+ filter->pFuncsTable->pfnBreakConnect(filter);
+}
+
static const struct strmbase_sink_ops sink_ops =
{
.base.pin_query_accept = sink_query_accept,
.base.pin_query_interface = sink_query_interface,
.base.pin_get_media_type = strmbase_pin_get_media_type,
.pfnReceive = BaseRenderer_Receive,
+ .sink_connect = sink_connect,
+ .sink_disconnect = sink_disconnect,
};
void strmbase_renderer_cleanup(struct strmbase_renderer *filter)
--
2.24.0
Dec. 10, 2019
[PATCH v3 4/5] strmbase/transform: Use base sink connection methods.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/strmbase/transform.c | 56 +++++++++++++++------------------------
1 file changed, 21 insertions(+), 35 deletions(-)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index bf74ad0f491..993e30202bc 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -212,12 +212,31 @@ static HRESULT sink_query_interface(struct strmbase_pin *iface, REFIID iid, void
return S_OK;
}
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+ TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->transform_connect_sink)
+ return filter->pFuncsTable->transform_connect_sink(filter, mt);
+ return S_OK;
+}
+
+static void sink_disconnect(struct strmbase_sink *iface)
+{
+ TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->pfnBreakConnect)
+ filter->pFuncsTable->pfnBreakConnect(filter, PINDIR_INPUT);
+}
+
static const struct strmbase_sink_ops sink_ops =
{
.base.pin_query_accept = sink_query_accept,
.base.pin_get_media_type = strmbase_pin_get_media_type,
.base.pin_query_interface = sink_query_interface,
.pfnReceive = TransformFilter_Input_Receive,
+ .sink_connect = sink_connect,
+ .sink_disconnect = sink_disconnect,
};
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
@@ -397,39 +416,6 @@ static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface)
return VFW_E_NOT_CONNECTED;
}
-static HRESULT WINAPI TransformFilter_InputPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
-{
- TransformFilter *pTransform = impl_from_sink_IPin(iface);
- HRESULT hr = S_OK;
-
- TRACE("(%p)->(%p, %p)\n", iface, pReceivePin, pmt);
- strmbase_dump_media_type(pmt);
-
- if (pTransform->pFuncsTable->transform_connect_sink)
- hr = pTransform->pFuncsTable->transform_connect_sink(pTransform, pmt);
-
- if (SUCCEEDED(hr))
- {
- hr = BaseInputPinImpl_ReceiveConnection(iface, pReceivePin, pmt);
- if (FAILED(hr) && pTransform->pFuncsTable->pfnBreakConnect)
- pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
- }
-
- return hr;
-}
-
-static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface)
-{
- TransformFilter *pTransform = impl_from_sink_IPin(iface);
-
- TRACE("(%p)->()\n", iface);
-
- if (pTransform->pFuncsTable->pfnBreakConnect)
- pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
-
- return BaseInputPinImpl_Disconnect(iface);
-}
-
static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface)
{
TransformFilter *pTransform = impl_from_sink_IPin(iface);
@@ -483,8 +469,8 @@ static const IPinVtbl TransformFilter_InputPin_Vtbl =
BasePinImpl_AddRef,
BasePinImpl_Release,
BaseInputPinImpl_Connect,
- TransformFilter_InputPin_ReceiveConnection,
- TransformFilter_InputPin_Disconnect,
+ BaseInputPinImpl_ReceiveConnection,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
--
2.24.0
Dec. 10, 2019
[PATCH v3 3/5] strmbase: Add callbacks for sink (dis)connection.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/qcap/avico.c | 4 +--
dlls/qcap/avimux.c | 4 +--
dlls/qcap/smartteefilter.c | 2 +-
dlls/qedit/samplegrabber.c | 2 +-
dlls/strmbase/pin.c | 56 +++++++++++++++++++++-----------------
dlls/strmbase/renderer.c | 2 +-
dlls/strmbase/transform.c | 2 +-
include/wine/strmbase.h | 9 +++---
8 files changed, 44 insertions(+), 37 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c
index debe6bca386..f822d4e4616 100644
--- a/dlls/qcap/avico.c
+++ b/dlls/qcap/avico.c
@@ -291,7 +291,7 @@ static HRESULT WINAPI AVICompressorIn_ReceiveConnection(IPin *iface,
hres = fill_format_info(This, (VIDEOINFOHEADER*)pmt->pbFormat);
if(FAILED(hres))
- BasePinImpl_Disconnect(iface);
+ BaseInputPinImpl_Disconnect(iface);
return hres;
}
@@ -302,7 +302,7 @@ static HRESULT WINAPI AVICompressorIn_Disconnect(IPin *iface)
TRACE("(%p)\n", This);
- hres = BasePinImpl_Disconnect(iface);
+ hres = BaseInputPinImpl_Disconnect(iface);
if(FAILED(hres))
return hres;
diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c
index c344ab47266..63e98e8877b 100644
--- a/dlls/qcap/avimux.c
+++ b/dlls/qcap/avimux.c
@@ -1469,7 +1469,7 @@ static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface,
if(SUCCEEDED(hr))
hr = IMemAllocator_Commit(avimuxin->samples_allocator);
if(FAILED(hr)) {
- BasePinImpl_Disconnect(iface);
+ BaseInputPinImpl_Disconnect(iface);
return hr;
}
@@ -1497,7 +1497,7 @@ static HRESULT WINAPI AviMuxIn_Disconnect(IPin *iface)
TRACE("pin %p.\n", avimuxin);
- hr = BasePinImpl_Disconnect(iface);
+ hr = BaseInputPinImpl_Disconnect(iface);
if(FAILED(hr))
return hr;
diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c
index 929929632f1..e1fcea55f91 100644
--- a/dlls/qcap/smartteefilter.c
+++ b/dlls/qcap/smartteefilter.c
@@ -87,7 +87,7 @@ static const IPinVtbl SmartTeeFilterInputVtbl = {
BasePinImpl_Release,
BaseInputPinImpl_Connect,
BaseInputPinImpl_ReceiveConnection,
- BasePinImpl_Disconnect,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index f8d90a5c0df..c65ab9caa70 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -523,7 +523,7 @@ static const IPinVtbl sink_vtbl =
BasePinImpl_Release,
BaseInputPinImpl_Connect,
SampleGrabber_In_IPin_ReceiveConnection,
- BasePinImpl_Disconnect,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index bcac22eb3c4..5255a6c7b0b 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -119,31 +119,6 @@ ULONG WINAPI BasePinImpl_Release(IPin *iface)
return IBaseFilter_Release(&pin->filter->IBaseFilter_iface);
}
-HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface)
-{
- struct strmbase_pin *This = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("(%p)->()\n", This);
-
- EnterCriticalSection(&This->filter->csFilter);
- {
- if (This->peer)
- {
- IPin_Release(This->peer);
- This->peer = NULL;
- FreeMediaType(&This->mt);
- ZeroMemory(&This->mt, sizeof(This->mt));
- hr = S_OK;
- }
- else
- hr = S_FALSE;
- }
- LeaveCriticalSection(&This->filter->csFilter);
-
- return hr;
-}
-
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin)
{
struct strmbase_pin *This = impl_from_IPin(iface);
@@ -685,6 +660,9 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP
}
}
+ if (SUCCEEDED(hr) && This->pFuncsTable->sink_connect)
+ hr = This->pFuncsTable->sink_connect(This, pReceivePin, pmt);
+
if (SUCCEEDED(hr))
{
CopyMediaType(&This->pin.mt, pmt);
@@ -697,6 +675,34 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP
return hr;
}
+HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin *iface)
+{
+ struct strmbase_sink *pin = impl_sink_from_IPin(iface);
+ HRESULT hr;
+
+ TRACE("pin %p.\n", pin);
+
+ EnterCriticalSection(&pin->pin.filter->csFilter);
+
+ if (pin->pin.peer)
+ {
+ if (pin->pFuncsTable->sink_disconnect)
+ pin->pFuncsTable->sink_disconnect(pin);
+
+ IPin_Release(pin->pin.peer);
+ pin->pin.peer = NULL;
+ FreeMediaType(&pin->pin.mt);
+ memset(&pin->pin.mt, 0, sizeof(AM_MEDIA_TYPE));
+ hr = S_OK;
+ }
+ else
+ hr = S_FALSE;
+
+ LeaveCriticalSection(&pin->pin.filter->csFilter);
+
+ return hr;
+}
+
static HRESULT deliver_endofstream(IPin* pin, LPVOID unused)
{
return IPin_EndOfStream( pin );
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index cedcd9a62a0..7d8dbdfa936 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -68,7 +68,7 @@ static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
TRACE("iface %p.\n", iface);
EnterCriticalSection(&filter->filter.csFilter);
- hr = BasePinImpl_Disconnect(iface);
+ hr = BaseInputPinImpl_Disconnect(iface);
if (SUCCEEDED(hr))
{
if (filter->pFuncsTable->pfnBreakConnect)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 30ed0006cb1..bf74ad0f491 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -427,7 +427,7 @@ static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface)
if (pTransform->pFuncsTable->pfnBreakConnect)
pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
- return BasePinImpl_Disconnect(iface);
+ return BaseInputPinImpl_Disconnect(iface);
}
static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface)
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 461214cf082..83ad2e0bd6e 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -91,9 +91,10 @@ typedef HRESULT (WINAPI *BaseInputPin_Receive)(struct strmbase_sink *This, IMedi
struct strmbase_sink_ops
{
- BasePinFuncTable base;
- /* Optional */
- BaseInputPin_Receive pfnReceive;
+ BasePinFuncTable base;
+ BaseInputPin_Receive pfnReceive;
+ HRESULT (*sink_connect)(struct strmbase_sink *pin, IPin *peer, const AM_MEDIA_TYPE *mt);
+ void (*sink_disconnect)(struct strmbase_sink *pin);
};
/* Base Pin */
@@ -102,7 +103,7 @@ LONG WINAPI BasePinImpl_GetMediaTypeVersion(struct strmbase_pin *pin);
HRESULT WINAPI BasePinImpl_QueryInterface(IPin *iface, REFIID iid, void **out);
ULONG WINAPI BasePinImpl_AddRef(IPin *iface);
ULONG WINAPI BasePinImpl_Release(IPin *iface);
-HRESULT WINAPI BasePinImpl_Disconnect(IPin * iface);
+HRESULT WINAPI BaseInputPinImpl_Disconnect(IPin * iface);
HRESULT WINAPI BasePinImpl_ConnectedTo(IPin * iface, IPin ** ppPin);
HRESULT WINAPI BasePinImpl_ConnectionMediaType(IPin * iface, AM_MEDIA_TYPE * pmt);
HRESULT WINAPI BasePinImpl_QueryPinInfo(IPin * iface, PIN_INFO * pInfo);
--
2.24.0
Dec. 10, 2019
[PATCH v3 2/5] strmbase: Pass an AM_MEDIA_TYPE pointer to CompleteConnect().
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/dsoundrender.c | 13 +++-----
dlls/quartz/vmr9.c | 65 +++++++++++++++++++-------------------
dlls/strmbase/renderer.c | 4 +--
include/wine/strmbase.h | 3 +-
4 files changed, 39 insertions(+), 46 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index cad210a8762..6fd49dac9b5 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -413,18 +413,13 @@ static void dsound_render_start_stream(struct strmbase_renderer *iface)
}
}
-static HRESULT WINAPI DSoundRender_CompleteConnect(struct strmbase_renderer *iface, IPin *pReceivePin)
+static HRESULT dsound_render_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt)
{
DSoundRenderImpl *This = impl_from_strmbase_renderer(iface);
- const AM_MEDIA_TYPE *pmt = &This->renderer.sink.pin.mt;
+ const WAVEFORMATEX *format = (WAVEFORMATEX *)mt->pbFormat;
HRESULT hr = S_OK;
- WAVEFORMATEX *format;
DSBUFFERDESC buf_desc;
- TRACE("(%p)->(%p)\n", This, pReceivePin);
-
- format = (WAVEFORMATEX*)pmt->pbFormat;
-
This->buf_size = format->nAvgBytesPerSec;
memset(&buf_desc,0,sizeof(DSBUFFERDESC));
@@ -433,7 +428,7 @@ static HRESULT WINAPI DSoundRender_CompleteConnect(struct strmbase_renderer *ifa
DSBCAPS_CTRLFREQUENCY | DSBCAPS_GLOBALFOCUS |
DSBCAPS_GETCURRENTPOSITION2;
buf_desc.dwBufferBytes = This->buf_size;
- buf_desc.lpwfxFormat = format;
+ buf_desc.lpwfxFormat = (WAVEFORMATEX *)format;
hr = IDirectSound8_CreateSoundBuffer(This->dsound, &buf_desc, &This->dsbuffer, NULL);
This->writepos = This->buf_size;
if (FAILED(hr))
@@ -539,7 +534,7 @@ static const struct strmbase_renderer_ops renderer_ops =
.renderer_stop_stream = dsound_render_stop_stream,
.pfnShouldDrawSampleNow = DSoundRender_ShouldDrawSampleNow,
.pfnPrepareReceive = DSoundRender_PrepareReceive,
- .pfnCompleteConnect = DSoundRender_CompleteConnect,
+ .renderer_connect = dsound_render_connect,
.pfnBreakConnect = DSoundRender_BreakConnect,
.pfnEndOfStream = DSoundRender_EndOfStream,
.pfnEndFlush = DSoundRender_EndFlush,
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index 60c19e00191..a9b90b322dd 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -331,38 +331,20 @@ static HRESULT WINAPI VMR9_DoRenderSample(struct strmbase_renderer *iface, IMedi
return hr;
}
-static HRESULT WINAPI VMR9_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *pmt)
+static HRESULT WINAPI VMR9_CheckMediaType(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt)
{
- struct quartz_vmr *This = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface);
+ const VIDEOINFOHEADER *vih;
- if (!IsEqualIID(&pmt->majortype, &MEDIATYPE_Video) || !pmt->pbFormat)
+ if (!IsEqualIID(&mt->majortype, &MEDIATYPE_Video) || !mt->pbFormat)
return S_FALSE;
- /* Ignore subtype, test for bicompression instead */
- if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
- {
- VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)pmt->pbFormat;
+ if (!IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo)
+ && !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo2))
+ return S_FALSE;
- This->bmiheader = format->bmiHeader;
- This->VideoWidth = format->bmiHeader.biWidth;
- This->VideoHeight = format->bmiHeader.biHeight;
- SetRect(&This->source_rect, 0, 0, This->VideoWidth, This->VideoHeight);
- }
- else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2))
- {
- VIDEOINFOHEADER2 *format = (VIDEOINFOHEADER2 *)pmt->pbFormat;
+ vih = (VIDEOINFOHEADER *)mt->pbFormat;
- This->bmiheader = format->bmiHeader;
- This->VideoWidth = format->bmiHeader.biWidth;
- This->VideoHeight = format->bmiHeader.biHeight;
- SetRect(&This->source_rect, 0, 0, This->VideoWidth, This->VideoHeight);
- }
- else
- {
- ERR("Format type %s not supported\n", debugstr_guid(&pmt->formattype));
- return S_FALSE;
- }
- if (This->bmiheader.biCompression != BI_RGB)
+ if (vih->bmiHeader.biCompression != BI_RGB)
return S_FALSE;
return S_OK;
}
@@ -461,16 +443,33 @@ static HRESULT WINAPI VMR9_ShouldDrawSampleNow(struct strmbase_renderer *iface,
return S_FALSE;
}
-static HRESULT WINAPI VMR9_CompleteConnect(struct strmbase_renderer *This, IPin *pReceivePin)
+static HRESULT vmr_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt)
{
- struct quartz_vmr *pVMR9 = impl_from_IBaseFilter(&This->filter.IBaseFilter_iface);
+ struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface);
HRESULT hr;
- TRACE("(%p)\n", This);
+ if (IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo))
+ {
+ VIDEOINFOHEADER *format = (VIDEOINFOHEADER *)mt->pbFormat;
+
+ filter->bmiheader = format->bmiHeader;
+ filter->VideoWidth = format->bmiHeader.biWidth;
+ filter->VideoHeight = format->bmiHeader.biHeight;
+ SetRect(&filter->source_rect, 0, 0, filter->VideoWidth, filter->VideoHeight);
+ }
+ else if (IsEqualIID(&mt->formattype, &FORMAT_VideoInfo2))
+ {
+ VIDEOINFOHEADER2 *format = (VIDEOINFOHEADER2 *)mt->pbFormat;
+
+ filter->bmiheader = format->bmiHeader;
+ filter->VideoWidth = format->bmiHeader.biWidth;
+ filter->VideoHeight = format->bmiHeader.biHeight;
+ SetRect(&filter->source_rect, 0, 0, filter->VideoWidth, filter->VideoHeight);
+ }
- if (pVMR9->mode ||
- SUCCEEDED(hr = IVMRFilterConfig9_SetRenderingMode(&pVMR9->IVMRFilterConfig9_iface, VMR9Mode_Windowed)))
- hr = VMR9_maybe_init(pVMR9, FALSE);
+ if (filter->mode
+ || SUCCEEDED(hr = IVMRFilterConfig9_SetRenderingMode(&filter->IVMRFilterConfig9_iface, VMR9Mode_Windowed)))
+ hr = VMR9_maybe_init(filter, FALSE);
return hr;
}
@@ -576,7 +575,7 @@ static const struct strmbase_renderer_ops renderer_ops =
.renderer_start_stream = vmr_start_stream,
.renderer_stop_stream = vmr_stop_stream,
.pfnShouldDrawSampleNow = VMR9_ShouldDrawSampleNow,
- .pfnCompleteConnect = VMR9_CompleteConnect,
+ .renderer_connect = vmr_connect,
.pfnBreakConnect = VMR9_BreakConnect,
.renderer_destroy = vmr_destroy,
.renderer_query_interface = vmr_query_interface,
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index d592ab034e6..cedcd9a62a0 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -52,8 +52,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin
hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt);
if (SUCCEEDED(hr))
{
- if (filter->pFuncsTable->pfnCompleteConnect)
- hr = filter->pFuncsTable->pfnCompleteConnect(filter, peer);
+ if (filter->pFuncsTable->renderer_connect)
+ hr = filter->pFuncsTable->renderer_connect(filter, mt);
}
LeaveCriticalSection(&filter->filter.csFilter);
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index 7e3b38b49d5..461214cf082 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -523,7 +523,6 @@ typedef HRESULT (WINAPI *BaseRenderer_EndOfStream)(struct strmbase_renderer *ifa
typedef HRESULT (WINAPI *BaseRenderer_BeginFlush) (struct strmbase_renderer *iface);
typedef HRESULT (WINAPI *BaseRenderer_EndFlush) (struct strmbase_renderer *iface);
typedef HRESULT (WINAPI *BaseRenderer_BreakConnect) (struct strmbase_renderer *iface);
-typedef HRESULT (WINAPI *BaseRenderer_CompleteConnect) (struct strmbase_renderer *iface, IPin *peer);
struct strmbase_renderer_ops
{
@@ -534,7 +533,7 @@ struct strmbase_renderer_ops
void (*renderer_stop_stream)(struct strmbase_renderer *iface);
BaseRenderer_ShouldDrawSampleNow pfnShouldDrawSampleNow;
BaseRenderer_PrepareReceive pfnPrepareReceive;
- BaseRenderer_CompleteConnect pfnCompleteConnect;
+ HRESULT (*renderer_connect)(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt);
BaseRenderer_BreakConnect pfnBreakConnect;
BaseRenderer_EndOfStream pfnEndOfStream;
BaseRenderer_EndFlush pfnEndFlush;
--
2.24.0
Dec. 10, 2019
[PATCH v3 1/5] strmbase: Combine the SetMediaType() and CompleteConnect() callbacks.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/acmwrapper.c | 115 +++++++-----------------
dlls/quartz/avidec.c | 37 ++------
dlls/strmbase/transform.c | 7 +-
dlls/winegstreamer/gsttffilter.c | 146 +++++++++++--------------------
dlls/wineqtdecoder/qtvdecoder.c | 25 ++----
include/wine/strmbase.h | 5 +-
6 files changed, 103 insertions(+), 232 deletions(-)
diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c
index 8eea6ab147d..33d9debe5cd 100644
--- a/dlls/quartz/acmwrapper.c
+++ b/dlls/quartz/acmwrapper.c
@@ -40,7 +40,6 @@ typedef struct ACMWrapperImpl
TransformFilter tf;
HACMSTREAM has;
- LPWAVEFORMATEX pWfIn;
LPWAVEFORMATEX pWfOut;
LONGLONG lasttime_real;
@@ -224,85 +223,43 @@ error:
return hr;
}
-static HRESULT WINAPI ACMWrapper_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static BOOL is_audio_subtype(const GUID *guid)
{
- ACMWrapperImpl* This = impl_from_TransformFilter(tf);
- MMRESULT res;
-
- TRACE("(%p)->(%i %p)\n", This, dir, pmt);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
- /* Check root (GUID w/o FOURCC) */
- if ((IsEqualIID(&pmt->majortype, &MEDIATYPE_Audio)) &&
- (!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Audio)+4, sizeof(GUID)-4)) &&
- (IsEqualIID(&pmt->formattype, &FORMAT_WaveFormatEx)))
- {
- HACMSTREAM drv;
- WAVEFORMATEX *wfx = (WAVEFORMATEX*)pmt->pbFormat;
- AM_MEDIA_TYPE* outpmt = &This->tf.pmt;
-
- if (!wfx || wfx->wFormatTag == WAVE_FORMAT_PCM || wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- return VFW_E_TYPE_NOT_ACCEPTED;
- FreeMediaType(outpmt);
-
- This->pWfIn = (LPWAVEFORMATEX)pmt->pbFormat;
-
- /* HACK */
- /* TRACE("ALIGN = %d\n", pACMWrapper->pWfIn->nBlockAlign); */
- /* pACMWrapper->pWfIn->nBlockAlign = 1; */
-
- /* Set output audio data to PCM */
- CopyMediaType(outpmt, pmt);
- outpmt->subtype.Data1 = WAVE_FORMAT_PCM;
- This->pWfOut = (WAVEFORMATEX*)outpmt->pbFormat;
- This->pWfOut->wFormatTag = WAVE_FORMAT_PCM;
- This->pWfOut->wBitsPerSample = 16;
- This->pWfOut->nBlockAlign = This->pWfOut->wBitsPerSample * This->pWfOut->nChannels / 8;
- This->pWfOut->cbSize = 0;
- This->pWfOut->nAvgBytesPerSec = This->pWfOut->nChannels * This->pWfOut->nSamplesPerSec
- * (This->pWfOut->wBitsPerSample/8);
-
- if (!(res = acmStreamOpen(&drv, NULL, This->pWfIn, This->pWfOut, NULL, 0, 0, 0)))
- {
- This->has = drv;
-
- TRACE("Connection accepted\n");
- return S_OK;
- }
- else
- FIXME("acmStreamOpen returned %d\n", res);
- FreeMediaType(outpmt);
- TRACE("Unable to find a suitable ACM decompressor\n");
- }
-
- TRACE("Connection refused\n");
- return VFW_E_TYPE_NOT_ACCEPTED;
+ return !memcmp(&guid->Data2, &MEDIATYPE_Audio.Data2, sizeof(GUID) - sizeof(int));
}
-static HRESULT WINAPI ACMWrapper_CompleteConnect(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
+static HRESULT acm_wrapper_connect_sink(TransformFilter *iface, const AM_MEDIA_TYPE *mt)
{
- ACMWrapperImpl* This = impl_from_TransformFilter(tf);
- MMRESULT res;
+ ACMWrapperImpl *filter = impl_from_TransformFilter(iface);
+ const WAVEFORMATEX *wfx = (WAVEFORMATEX *)mt->pbFormat;
HACMSTREAM drv;
+ MMRESULT res;
- TRACE("(%p)\n", This);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
- if (!(res = acmStreamOpen(&drv, NULL, This->pWfIn, This->pWfOut, NULL, 0, 0, 0)))
+ if (!IsEqualGUID(&mt->majortype, &MEDIATYPE_Audio) || !is_audio_subtype(&mt->subtype)
+ || !IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx) || !wfx
+ || wfx->wFormatTag == WAVE_FORMAT_PCM || wfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
+ return VFW_E_TYPE_NOT_ACCEPTED;
+
+ CopyMediaType(&filter->tf.pmt, mt);
+ filter->tf.pmt.subtype.Data1 = WAVE_FORMAT_PCM;
+ filter->pWfOut = (WAVEFORMATEX *)filter->tf.pmt.pbFormat;
+ filter->pWfOut->wFormatTag = WAVE_FORMAT_PCM;
+ filter->pWfOut->wBitsPerSample = 16;
+ filter->pWfOut->nBlockAlign = filter->pWfOut->wBitsPerSample * filter->pWfOut->nChannels / 8;
+ filter->pWfOut->cbSize = 0;
+ filter->pWfOut->nAvgBytesPerSec = filter->pWfOut->nChannels * filter->pWfOut->nSamplesPerSec
+ * (filter->pWfOut->wBitsPerSample / 8);
+
+ if ((res = acmStreamOpen(&drv, NULL, (WAVEFORMATEX *)wfx, filter->pWfOut, NULL, 0, 0, 0)))
{
- This->has = drv;
-
- TRACE("Connection accepted\n");
- return S_OK;
+ ERR("Failed to open stream, error %u.\n", res);
+ FreeMediaType(&filter->tf.pmt);
+ return VFW_E_TYPE_NOT_ACCEPTED;
}
- FIXME("acmStreamOpen returned %d\n", res);
- TRACE("Unable to find a suitable ACM decompressor\n");
- return VFW_E_TYPE_NOT_ACCEPTED;
+ filter->has = drv;
+
+ return S_OK;
}
static HRESULT WINAPI ACMWrapper_BreakConnect(TransformFilter *tf, PIN_DIRECTION dir)
@@ -341,18 +298,10 @@ static HRESULT WINAPI ACMWrapper_DecideBufferSize(TransformFilter *tf, IMemAlloc
}
static const TransformFilterFuncTable ACMWrapper_FuncsTable = {
- ACMWrapper_DecideBufferSize,
- NULL,
- ACMWrapper_Receive,
- NULL,
- NULL,
- ACMWrapper_SetMediaType,
- ACMWrapper_CompleteConnect,
- ACMWrapper_BreakConnect,
- NULL,
- NULL,
- NULL,
- NULL
+ .pfnDecideBufferSize = ACMWrapper_DecideBufferSize,
+ .pfnReceive = ACMWrapper_Receive,
+ .transform_connect_sink = acm_wrapper_connect_sink,
+ .pfnBreakConnect = ACMWrapper_BreakConnect,
};
HRESULT ACMWrapper_create(IUnknown *outer, void **out)
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c
index 32969a34730..abed957fa6d 100644
--- a/dlls/quartz/avidec.c
+++ b/dlls/quartz/avidec.c
@@ -210,16 +210,11 @@ static HRESULT WINAPI AVIDec_StopStreaming(TransformFilter* pTransformFilter)
return S_OK;
}
-static HRESULT WINAPI AVIDec_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static HRESULT avi_dec_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *pmt)
{
AVIDecImpl* This = impl_from_TransformFilter(tf);
HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
- TRACE("(%p)->(%p)\n", This, pmt);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
/* Check root (GUID w/o FOURCC) */
if ((IsEqualIID(&pmt->majortype, &MEDIATYPE_Video)) &&
(!memcmp(((const char *)&pmt->subtype)+4, ((const char *)&MEDIATYPE_Video)+4, sizeof(GUID)-4)))
@@ -310,15 +305,6 @@ failed:
return hr;
}
-static HRESULT WINAPI AVIDec_CompleteConnect(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- AVIDecImpl* This = impl_from_TransformFilter(tf);
-
- TRACE("(%p)\n", This);
-
- return S_OK;
-}
-
static HRESULT WINAPI AVIDec_BreakConnect(TransformFilter *tf, PIN_DIRECTION dir)
{
AVIDecImpl *This = impl_from_TransformFilter(tf);
@@ -357,19 +343,14 @@ static HRESULT WINAPI AVIDec_DecideBufferSize(TransformFilter *tf, IMemAllocator
}
static const TransformFilterFuncTable AVIDec_FuncsTable = {
- AVIDec_DecideBufferSize,
- AVIDec_StartStreaming,
- AVIDec_Receive,
- AVIDec_StopStreaming,
- NULL,
- AVIDec_SetMediaType,
- AVIDec_CompleteConnect,
- AVIDec_BreakConnect,
- NULL,
- NULL,
- AVIDec_EndFlush,
- NULL,
- AVIDec_NotifyDrop
+ .pfnDecideBufferSize = AVIDec_DecideBufferSize,
+ .pfnStartStreaming = AVIDec_StartStreaming,
+ .pfnReceive = AVIDec_Receive,
+ .pfnStopStreaming = AVIDec_StopStreaming,
+ .transform_connect_sink = avi_dec_connect_sink,
+ .pfnBreakConnect = AVIDec_BreakConnect,
+ .pfnEndFlush = AVIDec_EndFlush,
+ .pfnNotify = AVIDec_NotifyDrop,
};
HRESULT AVIDec_create(IUnknown *outer, void **out)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 7a79f709055..30ed0006cb1 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -405,11 +405,8 @@ static HRESULT WINAPI TransformFilter_InputPin_ReceiveConnection(IPin * iface, I
TRACE("(%p)->(%p, %p)\n", iface, pReceivePin, pmt);
strmbase_dump_media_type(pmt);
- if (pTransform->pFuncsTable->pfnSetMediaType)
- hr = pTransform->pFuncsTable->pfnSetMediaType(pTransform, PINDIR_INPUT, pmt);
-
- if (SUCCEEDED(hr) && pTransform->pFuncsTable->pfnCompleteConnect)
- hr = pTransform->pFuncsTable->pfnCompleteConnect(pTransform, PINDIR_INPUT, pReceivePin);
+ if (pTransform->pFuncsTable->transform_connect_sink)
+ hr = pTransform->pFuncsTable->transform_connect_sink(pTransform, pmt);
if (SUCCEEDED(hr))
{
diff --git a/dlls/winegstreamer/gsttffilter.c b/dlls/winegstreamer/gsttffilter.c
index ee1851dfdc6..d44a6ae33a6 100644
--- a/dlls/winegstreamer/gsttffilter.c
+++ b/dlls/winegstreamer/gsttffilter.c
@@ -516,7 +516,7 @@ static HRESULT WINAPI Gstreamer_Mp3_QueryConnect(TransformFilter *iface, const A
return S_OK;
}
-static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT mp3_decoder_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -525,13 +525,8 @@ static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECT
HRESULT hr;
int layer;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_Mp3_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return VFW_E_TYPE_NOT_ACCEPTED;
@@ -588,26 +583,19 @@ static HRESULT WINAPI Gstreamer_Mp3_SetMediaType(TransformFilter *tf, PIN_DIRECT
return hr;
}
-static HRESULT WINAPI Gstreamer_Mp3_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- TRACE("%p 0x%x %p\n", tf, dir, pin);
- return S_OK;
-}
-
static const TransformFilterFuncTable Gstreamer_Mp3_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_Mp3_QueryConnect,
- Gstreamer_Mp3_SetMediaType,
- Gstreamer_Mp3_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_Mp3_QueryConnect,
+ .transform_connect_sink = mp3_decoder_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_Mp3_create(IUnknown *punkouter, HRESULT *phr)
@@ -664,13 +652,7 @@ static HRESULT WINAPI Gstreamer_YUV_QueryConnect(TransformFilter *iface, const A
}
}
-static HRESULT WINAPI Gstreamer_YUV_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- TRACE("%p 0x%x %p\n", tf, dir, pin);
- return S_OK;
-}
-
-static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT yuv_to_rgb_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -679,13 +661,8 @@ static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DI
int avgtime;
LONG width, height;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_YUV_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return E_FAIL;
@@ -738,19 +715,18 @@ static HRESULT WINAPI Gstreamer_YUV2RGB_SetMediaType(TransformFilter *tf, PIN_DI
}
static const TransformFilterFuncTable Gstreamer_YUV2RGB_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_YUV_QueryConnect,
- Gstreamer_YUV2RGB_SetMediaType,
- Gstreamer_YUV_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_YUV_QueryConnect,
+ .transform_connect_sink = yuv_to_rgb_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_YUV2RGB_create(IUnknown *punkouter, HRESULT *phr)
@@ -772,7 +748,7 @@ IUnknown * CALLBACK Gstreamer_YUV2RGB_create(IUnknown *punkouter, HRESULT *phr)
return obj;
}
-static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT yuv_to_argb_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -781,13 +757,8 @@ static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_D
int avgtime;
LONG width, height;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_YUV_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return E_FAIL;
@@ -840,19 +811,18 @@ static HRESULT WINAPI Gstreamer_YUV2ARGB_SetMediaType(TransformFilter *tf, PIN_D
}
static const TransformFilterFuncTable Gstreamer_YUV2ARGB_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_YUV_QueryConnect,
- Gstreamer_YUV2ARGB_SetMediaType,
- Gstreamer_YUV_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_YUV_QueryConnect,
+ .transform_connect_sink = yuv_to_argb_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_YUV2ARGB_create(IUnknown *punkouter, HRESULT *phr)
@@ -886,13 +856,7 @@ static HRESULT WINAPI Gstreamer_AudioConvert_QueryConnect(TransformFilter *iface
return S_OK;
}
-static HRESULT WINAPI Gstreamer_AudioConvert_ConnectInput(TransformFilter *tf, PIN_DIRECTION dir, IPin *pin)
-{
- TRACE("%p 0x%x %p\n", tf, dir, pin);
- return S_OK;
-}
-
-static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE *amt)
+static HRESULT audio_converter_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *amt)
{
GstTfImpl *This = (GstTfImpl*)tf;
GstCaps *capsin, *capsout;
@@ -905,13 +869,8 @@ static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, P
BOOL inisfloat = FALSE;
int indepth;
- TRACE("%p 0x%x %p\n", This, dir, amt);
-
mark_wine_thread();
- if (dir != PINDIR_INPUT)
- return S_OK;
-
if (Gstreamer_AudioConvert_QueryConnect(&This->tf, amt) == S_FALSE || !amt->pbFormat)
return E_FAIL;
@@ -972,19 +931,18 @@ static HRESULT WINAPI Gstreamer_AudioConvert_SetMediaType(TransformFilter *tf, P
}
static const TransformFilterFuncTable Gstreamer_AudioConvert_vtbl = {
- Gstreamer_transform_DecideBufferSize,
- Gstreamer_transform_ProcessBegin,
- Gstreamer_transform_ProcessData,
- Gstreamer_transform_ProcessEnd,
- Gstreamer_AudioConvert_QueryConnect,
- Gstreamer_AudioConvert_SetMediaType,
- Gstreamer_AudioConvert_ConnectInput,
- Gstreamer_transform_Cleanup,
- Gstreamer_transform_EndOfStream,
- Gstreamer_transform_BeginFlush,
- Gstreamer_transform_EndFlush,
- Gstreamer_transform_NewSegment,
- Gstreamer_transform_QOS
+ .pfnDecideBufferSize = Gstreamer_transform_DecideBufferSize,
+ .pfnStartStreaming = Gstreamer_transform_ProcessBegin,
+ .pfnReceive = Gstreamer_transform_ProcessData,
+ .pfnStopStreaming = Gstreamer_transform_ProcessEnd,
+ .pfnCheckInputType = Gstreamer_AudioConvert_QueryConnect,
+ .transform_connect_sink = audio_converter_connect_sink,
+ .pfnBreakConnect = Gstreamer_transform_Cleanup,
+ .pfnEndOfStream = Gstreamer_transform_EndOfStream,
+ .pfnBeginFlush = Gstreamer_transform_BeginFlush,
+ .pfnEndFlush = Gstreamer_transform_EndFlush,
+ .pfnNewSegment = Gstreamer_transform_NewSegment,
+ .pfnNotify = Gstreamer_transform_QOS,
};
IUnknown * CALLBACK Gstreamer_AudioConvert_create(IUnknown *punkouter, HRESULT *phr)
diff --git a/dlls/wineqtdecoder/qtvdecoder.c b/dlls/wineqtdecoder/qtvdecoder.c
index 3da0738aecb..4be654e5a10 100644
--- a/dlls/wineqtdecoder/qtvdecoder.c
+++ b/dlls/wineqtdecoder/qtvdecoder.c
@@ -336,7 +336,7 @@ static HRESULT WINAPI QTVDecoder_StopStreaming(TransformFilter* pTransformFilter
return S_OK;
}
-static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION dir, const AM_MEDIA_TYPE * pmt)
+static HRESULT video_decoder_connect_sink(TransformFilter *tf, const AM_MEDIA_TYPE *pmt)
{
QTVDecoderImpl* This = impl_from_TransformFilter(tf);
HRESULT hr = VFW_E_TYPE_NOT_ACCEPTED;
@@ -344,11 +344,6 @@ static HRESULT WINAPI QTVDecoder_SetMediaType(TransformFilter *tf, PIN_DIRECTION
AM_MEDIA_TYPE *outpmt = &This->tf.pmt;
CFNumberRef n = NULL;
- TRACE("(%p)->(%p)\n", This, pmt);
-
- if (dir != PINDIR_INPUT)
- return S_OK;
-
FreeMediaType(outpmt);
CopyMediaType(outpmt, pmt);
@@ -502,18 +497,12 @@ static HRESULT WINAPI QTVDecoder_DecideBufferSize(TransformFilter *tf, IMemAlloc
}
static const TransformFilterFuncTable QTVDecoder_FuncsTable = {
- QTVDecoder_DecideBufferSize,
- QTVDecoder_StartStreaming,
- QTVDecoder_Receive,
- QTVDecoder_StopStreaming,
- NULL,
- QTVDecoder_SetMediaType,
- NULL,
- QTVDecoder_BreakConnect,
- NULL,
- NULL,
- NULL,
- NULL
+ .pfnDecideBufferSize = QTVDecoder_DecideBufferSize,
+ .pfnStartStreaming = QTVDecoder_StartStreaming,
+ .pfnReceive = QTVDecoder_Receive,
+ .pfnStopStreaming = QTVDecoder_StopStreaming,
+ .transform_connect_sink = video_decoder_connect_sink,
+ .pfnBreakConnect = QTVDecoder_BreakConnect,
};
IUnknown * CALLBACK QTVDecoder_create(IUnknown *outer, HRESULT* phr)
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index c3699f19253..7e3b38b49d5 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -197,9 +197,7 @@ typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *ifa
typedef HRESULT (WINAPI *TransformFilter_StartStreaming) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_StopStreaming) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_Receive) (TransformFilter* iface, IMediaSample* pIn);
-typedef HRESULT (WINAPI *TransformFilter_CompleteConnect) (TransformFilter *iface, PIN_DIRECTION dir, IPin *pPin);
typedef HRESULT (WINAPI *TransformFilter_BreakConnect) (TransformFilter *iface, PIN_DIRECTION dir);
-typedef HRESULT (WINAPI *TransformFilter_SetMediaType) (TransformFilter *iface, PIN_DIRECTION dir, const AM_MEDIA_TYPE *pMediaType);
typedef HRESULT (WINAPI *TransformFilter_CheckInputType) (TransformFilter *iface, const AM_MEDIA_TYPE *pMediaType);
typedef HRESULT (WINAPI *TransformFilter_EndOfStream) (TransformFilter *iface);
typedef HRESULT (WINAPI *TransformFilter_BeginFlush) (TransformFilter *iface);
@@ -216,8 +214,7 @@ typedef struct TransformFilterFuncTable {
TransformFilter_Receive pfnReceive;
TransformFilter_StopStreaming pfnStopStreaming;
TransformFilter_CheckInputType pfnCheckInputType;
- TransformFilter_SetMediaType pfnSetMediaType;
- TransformFilter_CompleteConnect pfnCompleteConnect;
+ HRESULT (*transform_connect_sink)(TransformFilter *filter, const AM_MEDIA_TYPE *mt);
TransformFilter_BreakConnect pfnBreakConnect;
TransformFilter_EndOfStream pfnEndOfStream;
TransformFilter_BeginFlush pfnBeginFlush;
--
2.24.0
Dec. 10, 2019
Re: [PATCH v2 5/5] strmbase/renderer: Use base sink connection methods.
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=61749
Your paranoid android.
=== debian10 (build log) ===
../../../wine/dlls/qedit/samplegrabber.c:526:5: error: ‘BasePinImpl_Disconnect’ undeclared here (not in a function); did you mean ‘BaseInputPinImpl_Disconnect’?
Task: The win32 build failed
=== debian10 (build log) ===
../../../wine/dlls/qedit/samplegrabber.c:526:5: error: ‘BasePinImpl_Disconnect’ undeclared here (not in a function); did you mean ‘BaseInputPinImpl_Disconnect’?
Task: The wow64 build failed
Dec. 10, 2019
Re: [PATCH v2 4/5] strmbase/transform: Use base sink connection methods.
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=61748
Your paranoid android.
=== debian10 (build log) ===
/home/winetest/tools/testbot/var/wine-win32/dlls/strmbase/../../../wine/dlls/strmbase/renderer.c:71: undefined reference to `BasePinImpl_Disconnect'
collect2: error: ld returned 1 exit status
../../../wine/dlls/qedit/samplegrabber.c:526:5: error: ‘BasePinImpl_Disconnect’ undeclared here (not in a function); did you mean ‘BaseInputPinImpl_Disconnect’?
Task: The win32 build failed
=== debian10 (build log) ===
/home/winetest/tools/testbot/var/wine-wow64/dlls/strmbase/../../../wine/dlls/strmbase/renderer.c:71: undefined reference to `BasePinImpl_Disconnect'
collect2: error: ld returned 1 exit status
../../../wine/dlls/qedit/samplegrabber.c:526:5: error: ‘BasePinImpl_Disconnect’ undeclared here (not in a function); did you mean ‘BaseInputPinImpl_Disconnect’?
Task: The wow64 build failed
Dec. 10, 2019
Re: [PATCH v2 3/5] strmbase: Add callbacks for sink (dis)connection.
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=61747
Your paranoid android.
=== debian10 (build log) ===
/home/winetest/tools/testbot/var/wine-win32/dlls/strmbase/../../../wine/dlls/strmbase/renderer.c:71: undefined reference to `BasePinImpl_Disconnect'
collect2: error: ld returned 1 exit status
../../../wine/dlls/qedit/samplegrabber.c:526:5: error: ‘BasePinImpl_Disconnect’ undeclared here (not in a function); did you mean ‘BaseInputPinImpl_Disconnect’?
Task: The win32 build failed
=== debian10 (build log) ===
/home/winetest/tools/testbot/var/wine-wow64/dlls/strmbase/../../../wine/dlls/strmbase/renderer.c:71: undefined reference to `BasePinImpl_Disconnect'
collect2: error: ld returned 1 exit status
../../../wine/dlls/qedit/samplegrabber.c:526:5: error: ‘BasePinImpl_Disconnect’ undeclared here (not in a function); did you mean ‘BaseInputPinImpl_Disconnect’?
Task: The wow64 build failed
Dec. 10, 2019
[PATCH v2 5/5] strmbase/renderer: Use base sink connection methods.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/quartz/vmr9.c | 8 +++--
dlls/strmbase/renderer.c | 63 ++++++++++++++--------------------------
2 files changed, 26 insertions(+), 45 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c
index a9b90b322dd..a3391870a76 100644
--- a/dlls/quartz/vmr9.c
+++ b/dlls/quartz/vmr9.c
@@ -356,7 +356,7 @@ static HRESULT VMR9_maybe_init(struct quartz_vmr *This, BOOL force)
HRESULT hr;
TRACE("my mode: %u, my window: %p, my last window: %p\n", This->mode, This->baseControlWindow.baseWindow.hWnd, This->hWndClippingWindow);
- if (This->num_surfaces || !This->renderer.sink.pin.peer)
+ if (This->num_surfaces)
return S_OK;
if (This->mode == VMR9Mode_Windowless && !This->hWndClippingWindow)
@@ -410,7 +410,8 @@ static void vmr_start_stream(struct strmbase_renderer *iface)
TRACE("(%p)\n", This);
- VMR9_maybe_init(This, TRUE);
+ if (This->renderer.sink.pin.peer)
+ VMR9_maybe_init(This, TRUE);
IVMRImagePresenter9_StartPresenting(This->presenter, This->cookie);
SetWindowPos(This->baseControlWindow.baseWindow.hWnd, NULL,
This->source_rect.left,
@@ -1760,7 +1761,8 @@ static HRESULT WINAPI VMR9WindowlessControl_SetVideoClippingWindow(IVMRWindowles
EnterCriticalSection(&This->renderer.filter.csFilter);
This->hWndClippingWindow = hwnd;
- VMR9_maybe_init(This, FALSE);
+ if (This->renderer.sink.pin.peer)
+ VMR9_maybe_init(This, FALSE);
if (!hwnd)
IVMRSurfaceAllocatorEx9_TerminateDevice(This->allocator, This->cookie);
LeaveCriticalSection(&This->renderer.filter.csFilter);
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index cedcd9a62a0..7b9736ccfb2 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -40,46 +40,6 @@ static inline struct strmbase_renderer *impl_from_IPin(IPin *iface)
return CONTAINING_RECORD(iface, struct strmbase_renderer, sink.pin.IPin_iface);
}
-static HRESULT WINAPI BaseRenderer_InputPin_ReceiveConnection(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
-{
- struct strmbase_renderer *filter = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("iface %p, peer %p, mt %p.\n", iface, peer, mt);
- strmbase_dump_media_type(mt);
-
- EnterCriticalSection(&filter->filter.csFilter);
- hr = BaseInputPinImpl_ReceiveConnection(iface, peer, mt);
- if (SUCCEEDED(hr))
- {
- if (filter->pFuncsTable->renderer_connect)
- hr = filter->pFuncsTable->renderer_connect(filter, mt);
- }
- LeaveCriticalSection(&filter->filter.csFilter);
-
- return hr;
-}
-
-static HRESULT WINAPI BaseRenderer_InputPin_Disconnect(IPin * iface)
-{
- struct strmbase_renderer *filter = impl_from_IPin(iface);
- HRESULT hr;
-
- TRACE("iface %p.\n", iface);
-
- EnterCriticalSection(&filter->filter.csFilter);
- hr = BasePinImpl_Disconnect(iface);
- if (SUCCEEDED(hr))
- {
- if (filter->pFuncsTable->pfnBreakConnect)
- hr = filter->pFuncsTable->pfnBreakConnect(filter);
- }
- BaseRendererImpl_ClearPendingSample(filter);
- LeaveCriticalSection(&filter->filter.csFilter);
-
- return hr;
-}
-
static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
{
struct strmbase_renderer *filter = impl_from_IPin(iface);
@@ -157,8 +117,8 @@ static const IPinVtbl BaseRenderer_InputPin_Vtbl =
BasePinImpl_AddRef,
BasePinImpl_Release,
BaseInputPinImpl_Connect,
- BaseRenderer_InputPin_ReceiveConnection,
- BaseRenderer_InputPin_Disconnect,
+ BaseInputPinImpl_ReceiveConnection,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
@@ -312,12 +272,31 @@ static HRESULT WINAPI BaseRenderer_Receive(struct strmbase_sink *pin, IMediaSamp
return BaseRendererImpl_Receive(filter, sample);
}
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+ struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->renderer_connect)
+ return filter->pFuncsTable->renderer_connect(filter, mt);
+ return S_OK;
+}
+
+static void sink_disconnect(struct strmbase_sink *iface)
+{
+ struct strmbase_renderer *filter = impl_from_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->pfnBreakConnect)
+ filter->pFuncsTable->pfnBreakConnect(filter);
+}
+
static const struct strmbase_sink_ops sink_ops =
{
.base.pin_query_accept = sink_query_accept,
.base.pin_query_interface = sink_query_interface,
.base.pin_get_media_type = strmbase_pin_get_media_type,
.pfnReceive = BaseRenderer_Receive,
+ .sink_connect = sink_connect,
+ .sink_disconnect = sink_disconnect,
};
void strmbase_renderer_cleanup(struct strmbase_renderer *filter)
--
2.24.0
Dec. 10, 2019
[PATCH v2 4/5] strmbase/transform: Use base sink connection methods.
by Zebediah Figura
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/strmbase/transform.c | 56 +++++++++++++++------------------------
1 file changed, 21 insertions(+), 35 deletions(-)
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index 30ed0006cb1..993e30202bc 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -212,12 +212,31 @@ static HRESULT sink_query_interface(struct strmbase_pin *iface, REFIID iid, void
return S_OK;
}
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt)
+{
+ TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->transform_connect_sink)
+ return filter->pFuncsTable->transform_connect_sink(filter, mt);
+ return S_OK;
+}
+
+static void sink_disconnect(struct strmbase_sink *iface)
+{
+ TransformFilter *filter = impl_from_sink_IPin(&iface->pin.IPin_iface);
+
+ if (filter->pFuncsTable->pfnBreakConnect)
+ filter->pFuncsTable->pfnBreakConnect(filter, PINDIR_INPUT);
+}
+
static const struct strmbase_sink_ops sink_ops =
{
.base.pin_query_accept = sink_query_accept,
.base.pin_get_media_type = strmbase_pin_get_media_type,
.base.pin_query_interface = sink_query_interface,
.pfnReceive = TransformFilter_Input_Receive,
+ .sink_connect = sink_connect,
+ .sink_disconnect = sink_disconnect,
};
static HRESULT source_query_interface(struct strmbase_pin *iface, REFIID iid, void **out)
@@ -397,39 +416,6 @@ static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface)
return VFW_E_NOT_CONNECTED;
}
-static HRESULT WINAPI TransformFilter_InputPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
-{
- TransformFilter *pTransform = impl_from_sink_IPin(iface);
- HRESULT hr = S_OK;
-
- TRACE("(%p)->(%p, %p)\n", iface, pReceivePin, pmt);
- strmbase_dump_media_type(pmt);
-
- if (pTransform->pFuncsTable->transform_connect_sink)
- hr = pTransform->pFuncsTable->transform_connect_sink(pTransform, pmt);
-
- if (SUCCEEDED(hr))
- {
- hr = BaseInputPinImpl_ReceiveConnection(iface, pReceivePin, pmt);
- if (FAILED(hr) && pTransform->pFuncsTable->pfnBreakConnect)
- pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
- }
-
- return hr;
-}
-
-static HRESULT WINAPI TransformFilter_InputPin_Disconnect(IPin * iface)
-{
- TransformFilter *pTransform = impl_from_sink_IPin(iface);
-
- TRACE("(%p)->()\n", iface);
-
- if (pTransform->pFuncsTable->pfnBreakConnect)
- pTransform->pFuncsTable->pfnBreakConnect(pTransform, PINDIR_INPUT);
-
- return BasePinImpl_Disconnect(iface);
-}
-
static HRESULT WINAPI TransformFilter_InputPin_BeginFlush(IPin * iface)
{
TransformFilter *pTransform = impl_from_sink_IPin(iface);
@@ -483,8 +469,8 @@ static const IPinVtbl TransformFilter_InputPin_Vtbl =
BasePinImpl_AddRef,
BasePinImpl_Release,
BaseInputPinImpl_Connect,
- TransformFilter_InputPin_ReceiveConnection,
- TransformFilter_InputPin_Disconnect,
+ BaseInputPinImpl_ReceiveConnection,
+ BaseInputPinImpl_Disconnect,
BasePinImpl_ConnectedTo,
BasePinImpl_ConnectionMediaType,
BasePinImpl_QueryPinInfo,
--
2.24.0
Dec. 10, 2019