<div dir="auto"><div>BTW, the wine-bug tag in the comment is not using usual capitalization.<br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 8, 2020, 10:28 AM Zebediah Figura <<a href="mailto:z.figura12@gmail.com">z.figura12@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Gijs Vermeulen <<a href="mailto:gijsvrm@gmail.com" target="_blank" rel="noreferrer">gijsvrm@gmail.com</a>><br>
<br>
wine-bug: <a href="https://bugs.winehq.org/show_bug.cgi?id=42372" rel="noreferrer noreferrer" target="_blank">https://bugs.winehq.org/show_bug.cgi?id=42372</a><br>
Signed-off-by: Gijs Vermeulen <<a href="mailto:gijsvrm@gmail.com" target="_blank" rel="noreferrer">gijsvrm@gmail.com</a>><br>
Signed-off-by: Zebediah Figura <<a href="mailto:z.figura12@gmail.com" target="_blank" rel="noreferrer">z.figura12@gmail.com</a>><br>
---<br>
v2: Avoid Hungarian notation and "This"; use a more readable trace format.<br>
<br>
dlls/quartz/filtergraph.c | 57 ++++++++++++++++++++++++++++++++-<br>
dlls/quartz/tests/filtergraph.c | 1 +<br>
include/axextend.idl | 13 ++++++++<br>
3 files changed, 70 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c<br>
index 6217516db1..918c41a3d6 100644<br>
--- a/dlls/quartz/filtergraph.c<br>
+++ b/dlls/quartz/filtergraph.c<br>
@@ -181,7 +181,7 @@ typedef struct _IFilterGraphImpl {<br>
/* IRegisterServiceProvider */<br>
/* IResourceManager */<br>
/* IServiceProvider */<br>
- /* IVideoFrameStep */<br>
+ IVideoFrameStep IVideoFrameStep_iface;<br>
<br>
IUnknown *outer_unk;<br>
LONG ref;<br>
@@ -454,6 +454,9 @@ static HRESULT WINAPI FilterGraphInner_QueryInterface(IUnknown *iface, REFIID ri<br>
} else if (IsEqualGUID(&IID_IGraphVersion, riid)) {<br>
*ppvObj = &This->IGraphVersion_iface;<br>
TRACE(" returning IGraphVersion interface (%p)\n", *ppvObj);<br>
+ } else if (IsEqualGUID(&IID_IVideoFrameStep, riid)) {<br>
+ *ppvObj = &This->IVideoFrameStep_iface;<br>
+ TRACE(" returning IVideoFrameStep interface (%p)\n", *ppvObj);<br>
} else {<br>
*ppvObj = NULL;<br>
FIXME("unknown interface %s\n", debugstr_guid(riid));<br>
@@ -5638,6 +5641,57 @@ static const IGraphVersionVtbl IGraphVersion_VTable =<br>
GraphVersion_QueryVersion,<br>
};<br>
<br>
+static IFilterGraphImpl *impl_from_IVideoFrameStep(IVideoFrameStep *iface)<br>
+{<br>
+ return CONTAINING_RECORD(iface, IFilterGraphImpl, IVideoFrameStep_iface);<br>
+}<br>
+<br>
+static HRESULT WINAPI VideoFrameStep_QueryInterface(IVideoFrameStep *iface, REFIID iid, void **out)<br>
+{<br>
+ IFilterGraphImpl *graph = impl_from_IVideoFrameStep(iface);<br>
+ return IUnknown_QueryInterface(graph->outer_unk, iid, out);<br>
+}<br>
+<br>
+static ULONG WINAPI VideoFrameStep_AddRef(IVideoFrameStep *iface)<br>
+{<br>
+ IFilterGraphImpl *graph = impl_from_IVideoFrameStep(iface);<br>
+ return IUnknown_AddRef(graph->outer_unk);<br>
+}<br>
+<br>
+static ULONG WINAPI VideoFrameStep_Release(IVideoFrameStep *iface)<br>
+{<br>
+ IFilterGraphImpl *graph = impl_from_IVideoFrameStep(iface);<br>
+ return IUnknown_Release(graph->outer_unk);<br>
+}<br>
+<br>
+static HRESULT WINAPI VideoFrameStep_Step(IVideoFrameStep *iface, DWORD frame_count, IUnknown *filter)<br>
+{<br>
+ FIXME("iface %p, frame_count %u, filter %p, stub!\n", iface, frame_count, filter);<br>
+ return E_NOTIMPL;<br>
+}<br>
+<br>
+static HRESULT WINAPI VideoFrameStep_CanStep(IVideoFrameStep *iface, LONG multiple, IUnknown *filter)<br>
+{<br>
+ FIXME("iface %p, multiple %d, filter %p, stub!\n", iface, multiple, filter);<br>
+ return E_NOTIMPL;<br>
+}<br>
+<br>
+static HRESULT WINAPI VideoFrameStep_CancelStep(IVideoFrameStep *iface)<br>
+{<br>
+ FIXME("iface %p, stub!\n", iface);<br>
+ return E_NOTIMPL;<br>
+}<br>
+<br>
+static const IVideoFrameStepVtbl VideoFrameStep_vtbl =<br>
+{<br>
+ VideoFrameStep_QueryInterface,<br>
+ VideoFrameStep_AddRef,<br>
+ VideoFrameStep_Release,<br>
+ VideoFrameStep_Step,<br>
+ VideoFrameStep_CanStep,<br>
+ VideoFrameStep_CancelStep<br>
+};<br>
+<br>
static const IUnknownVtbl IInner_VTable =<br>
{<br>
FilterGraphInner_QueryInterface,<br>
@@ -5668,6 +5722,7 @@ static HRESULT filter_graph_common_create(IUnknown *outer, IUnknown **out, BOOL<br>
fimpl->IMediaPosition_iface.lpVtbl = &IMediaPosition_VTable;<br>
fimpl->IObjectWithSite_iface.lpVtbl = &IObjectWithSite_VTable;<br>
fimpl->IGraphVersion_iface.lpVtbl = &IGraphVersion_VTable;<br>
+ fimpl->IVideoFrameStep_iface.lpVtbl = &VideoFrameStep_vtbl;<br>
fimpl->ref = 1;<br>
list_init(&fimpl->filters);<br>
list_init(&fimpl->sorted_filters);<br>
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c<br>
index f0aa084192..a3378efe0b 100644<br>
--- a/dlls/quartz/tests/filtergraph.c<br>
+++ b/dlls/quartz/tests/filtergraph.c<br>
@@ -125,6 +125,7 @@ static void test_interfaces(void)<br>
check_interface(graph, &IID_IMediaPosition, TRUE);<br>
check_interface(graph, &IID_IMediaSeeking, TRUE);<br>
check_interface(graph, &IID_IObjectWithSite, TRUE);<br>
+ check_interface(graph, &IID_IVideoFrameStep, TRUE);<br>
check_interface(graph, &IID_IVideoWindow, TRUE);<br>
<br>
check_interface(graph, &IID_IBaseFilter, FALSE);<br>
diff --git a/include/axextend.idl b/include/axextend.idl<br>
index 8b46d665b5..7630ea247c 100644<br>
--- a/include/axextend.idl<br>
+++ b/include/axextend.idl<br>
@@ -1471,3 +1471,16 @@ interface IAMTVTuner : IAMTuner<br>
HRESULT get_VideoFrequency([out] long *freq);<br>
HRESULT get_AudioFrequency([out] long *freq);<br>
}<br>
+<br>
+[<br>
+ local,<br>
+ object,<br>
+ uuid(e46a9787-2b71-444d-a4b5-1fab7b708d6a),<br>
+ pointer_default(unique),<br>
+]<br>
+interface IVideoFrameStep : IUnknown<br>
+{<br>
+ HRESULT Step(DWORD frame_count, [in] IUnknown *filter);<br>
+ HRESULT CanStep(long multiple, [in] IUnknown *filter);<br>
+ HRESULT CancelStep();<br>
+}<br>
-- <br>
2.27.0<br>
<br>
<br>
</blockquote></div></div></div>