<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>