Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filtergraph.c | 105 +++++++++++++++++++++++++++----- dlls/quartz/main.c | 4 +- dlls/quartz/quartz_private.h | 4 +- dlls/quartz/tests/filtergraph.c | 5 +- 4 files changed, 97 insertions(+), 21 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index d8db871505b..b4d0164fd3a 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -208,6 +208,9 @@ typedef struct _IFilterGraphImpl { LONG recursioncount; IUnknown *pSite; LONG version; + + HANDLE message_thread, message_thread_ret; + DWORD message_thread_id; } IFilterGraphImpl;
struct enum_filters @@ -489,6 +492,13 @@ static ULONG WINAPI FilterGraphInner_Release(IUnknown *iface) CloseHandle(This->hEventCompletion); EventsQueue_Destroy(&This->evqueue); This->cs.DebugInfo->Spare[0] = 0; + if (This->message_thread) + { + PostThreadMessageW(This->message_thread_id, WM_USER + 1, 0, 0); + WaitForSingleObject(This->message_thread, INFINITE); + CloseHandle(This->message_thread); + CloseHandle(This->message_thread_ret); + } DeleteCriticalSection(&This->cs); CoTaskMemFree(This); } @@ -964,6 +974,63 @@ static HRESULT GetFilterInfo(IMoniker* pMoniker, VARIANT* pvar) return hr; }
+struct filter_create_params +{ + HRESULT hr; + IMoniker *moniker; + IBaseFilter *filter; +}; + +static DWORD WINAPI message_thread_run(void *ctx) +{ + IFilterGraphImpl *graph = ctx; + MSG msg; + + CoInitializeEx(NULL, COINIT_MULTITHREADED); + + for (;;) + { + GetMessageW(&msg, NULL, 0, 0); + + if (!msg.hwnd && msg.message == WM_USER) + { + struct filter_create_params *params = (struct filter_create_params *)msg.wParam; + + params->hr = IMoniker_BindToObject(params->moniker, NULL, NULL, + &IID_IBaseFilter, (void **)¶ms->filter); + SetEvent(graph->message_thread_ret); + } + else if (!msg.hwnd && msg.message == WM_USER + 1) + { + break; + } + else + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + } + + CoUninitialize(); + return 0; +} + +static HRESULT create_filter(IFilterGraphImpl *graph, IMoniker *moniker, IBaseFilter **filter) +{ + if (graph->message_thread) + { + struct filter_create_params params; + + params.moniker = moniker; + PostThreadMessageW(graph->message_thread_id, WM_USER, (WPARAM)¶ms, 0); + WaitForSingleObject(graph->message_thread_ret, INFINITE); + *filter = params.filter; + return params.hr; + } + else + return IMoniker_BindToObject(moniker, NULL, NULL, &IID_IBaseFilter, (void **)filter); +} + /* Attempt to connect one of the output pins on filter to sink. Helper for * FilterGraph2_Connect(). */ static HRESULT connect_output_pin(IFilterGraphImpl *graph, IBaseFilter *filter, IPin *sink) @@ -1164,7 +1231,7 @@ static HRESULT WINAPI FilterGraph2_Connect(IFilterGraph2 *iface, IPin *ppinOut, goto error; }
- hr = IMoniker_BindToObject(pMoniker, NULL, NULL, &IID_IBaseFilter, (LPVOID*)&pfilter); + hr = create_filter(This, pMoniker, &pfilter); IMoniker_Release(pMoniker); if (FAILED(hr)) { WARN("Unable to create filter (%x), trying next one\n", hr); @@ -1497,7 +1564,7 @@ static HRESULT WINAPI FilterGraph2_Render(IFilterGraph2 *iface, IPin *ppinOut) goto error; }
- hr = IMoniker_BindToObject(pMoniker, NULL, NULL, &IID_IBaseFilter, (LPVOID*)&pfilter); + hr = create_filter(This, pMoniker, &pfilter); IMoniker_Release(pMoniker); if (FAILED(hr)) { @@ -5565,15 +5632,12 @@ static const IUnknownVtbl IInner_VTable = FilterGraphInner_Release };
-/* This is the only function that actually creates a FilterGraph class... */ -HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) +static HRESULT filter_graph_common_create(IUnknown *outer, void **out, BOOL threaded) { IFilterGraphImpl *fimpl; HRESULT hr;
- TRACE("(%p,%p)\n", pUnkOuter, ppObj); - - *ppObj = NULL; + *out = NULL;
fimpl = CoTaskMemAlloc(sizeof(*fimpl)); fimpl->defaultclock = TRUE; @@ -5617,10 +5681,15 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) fimpl->recursioncount = 0; fimpl->version = 0;
- if (pUnkOuter) - fimpl->outer_unk = pUnkOuter; + if (threaded) + { + fimpl->message_thread = CreateThread(NULL, 0, message_thread_run, fimpl, 0, &fimpl->message_thread_id); + fimpl->message_thread_ret = CreateEventW(NULL, FALSE, FALSE, NULL); + } else - fimpl->outer_unk = &fimpl->IUnknown_inner; + fimpl->message_thread = NULL; + + fimpl->outer_unk = outer ? outer : &fimpl->IUnknown_inner;
/* create Filtermapper aggregated. */ hr = CoCreateInstance(&CLSID_FilterMapper2, fimpl->outer_unk, CLSCTX_INPROC_SERVER, @@ -5637,12 +5706,20 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) return hr; }
- *ppObj = &fimpl->IUnknown_inner; + *out = &fimpl->IUnknown_inner; return S_OK; }
-HRESULT FilterGraphNoThread_create(IUnknown *pUnkOuter, LPVOID *ppObj) +HRESULT filter_graph_create(IUnknown *outer, void **out) { - FIXME("CLSID_FilterGraphNoThread partially implemented - Forwarding to CLSID_FilterGraph\n"); - return FilterGraph_create(pUnkOuter, ppObj); + TRACE("outer %p, out %p.\n", outer, out); + + return filter_graph_common_create(outer, out, TRUE); +} + +HRESULT filter_graph_no_thread_create(IUnknown *outer, void **out) +{ + TRACE("outer %p, out %p.\n", outer, out); + + return filter_graph_common_create(outer, out, FALSE); } diff --git a/dlls/quartz/main.c b/dlls/quartz/main.c index 36ec59c4e03..9540fa92935 100644 --- a/dlls/quartz/main.c +++ b/dlls/quartz/main.c @@ -63,8 +63,8 @@ struct object_creation_info static const struct object_creation_info object_creation[] = { { &CLSID_SeekingPassThru, SeekingPassThru_create }, - { &CLSID_FilterGraph, FilterGraph_create }, - { &CLSID_FilterGraphNoThread, FilterGraphNoThread_create }, + { &CLSID_FilterGraph, filter_graph_create }, + { &CLSID_FilterGraphNoThread, filter_graph_no_thread_create }, { &CLSID_FilterMapper, FilterMapper_create }, { &CLSID_FilterMapper2, FilterMapper2_create }, { &CLSID_AsyncReader, AsyncReader_create }, diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index 353d1e5a577..1213aea352a 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -40,8 +40,8 @@ #define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000) #define BYTES_FROM_MEDIATIME(time) ((time) / 10000000)
-HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; -HRESULT FilterGraphNoThread_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; +HRESULT filter_graph_create(IUnknown *outer, void **out) DECLSPEC_HIDDEN; +HRESULT filter_graph_no_thread_create(IUnknown *outer, void **out) DECLSPEC_HIDDEN; HRESULT FilterMapper2_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; HRESULT FilterMapper_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; HRESULT AsyncReader_create(IUnknown * pUnkOuter, LPVOID * ppv) DECLSPEC_HIDDEN; diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index 2aca4a91c87..8141d928c61 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -760,10 +760,9 @@ static DWORD WINAPI call_RenderFile_multithread(LPVOID lParam) HRESULT hr;
hr = IFilterGraph2_RenderFile(graph, filename, NULL); - ok(SUCCEEDED(hr), "RenderFile failed: %x\n", hr); + ok(hr == S_OK, "Got hr %#x.\n", hr);
- if (SUCCEEDED(hr)) - rungraph(graph, TRUE); + rungraph(graph, TRUE);
return 0; }
We are not guaranteed to destroy the filter on the same thread it was created on.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/strmbase/window.c b/dlls/strmbase/window.c index bf7a7a3c27b..b7c0bae47b2 100644 --- a/dlls/strmbase/window.c +++ b/dlls/strmbase/window.c @@ -141,7 +141,7 @@ HRESULT WINAPI BaseWindowImpl_DoneWithWindow(BaseWindow *This) ReleaseDC(This->hWnd, This->hDC); This->hDC = NULL;
- DestroyWindow(This->hWnd); + SendMessageW(This->hWnd, WM_CLOSE, 0, 0); This->hWnd = NULL;
return S_OK;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/filtergraph.c | 2 +- dlls/quartz/videorenderer.c | 47 +-------------------------------- 2 files changed, 2 insertions(+), 47 deletions(-)
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index 8141d928c61..cbf447fbd53 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -4117,7 +4117,7 @@ static void test_window_threading(void) if ((hwnd = get_renderer_hwnd(graph))) { tid = GetWindowThreadProcessId(hwnd, NULL); - todo_wine ok(tid == GetCurrentThreadId(), "Window should be created on main thread.\n"); + ok(tid == GetCurrentThreadId(), "Window should be created on main thread.\n"); } else skip("Could not find renderer window.\n"); diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c index 429b59bfe33..87ff9f59bf3 100644 --- a/dlls/quartz/videorenderer.c +++ b/dlls/quartz/videorenderer.c @@ -45,11 +45,8 @@ typedef struct VideoRendererImpl IOverlay IOverlay_iface;
BOOL init; - HANDLE hThread;
- DWORD ThreadID; HANDLE hEvent; - BOOL ThreadResult; RECT SourceRect; RECT DestRect; RECT WindowPos; @@ -83,54 +80,15 @@ static inline VideoRendererImpl *impl_from_BaseControlVideo(BaseControlVideo *if return CONTAINING_RECORD(iface, VideoRendererImpl, baseControlVideo); }
-static DWORD WINAPI MessageLoop(LPVOID lpParameter) -{ - VideoRendererImpl* This = lpParameter; - MSG msg; - BOOL fGotMessage; - - TRACE("Starting message loop\n"); - - if (FAILED(BaseWindowImpl_PrepareWindow(&This->baseControlWindow.baseWindow))) - { - This->ThreadResult = FALSE; - SetEvent(This->hEvent); - return 0; - } - - This->ThreadResult = TRUE; - SetEvent(This->hEvent); - - while ((fGotMessage = GetMessageW(&msg, NULL, 0, 0)) != 0 && fGotMessage != -1) - { - TranslateMessage(&msg); - DispatchMessageW(&msg); - } - - TRACE("End of message loop\n"); - - return msg.wParam; -} - static BOOL CreateRenderingSubsystem(VideoRendererImpl* This) { This->hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); if (!This->hEvent) return FALSE;
- This->hThread = CreateThread(NULL, 0, MessageLoop, This, 0, &This->ThreadID); - if (!This->hThread) - { - CloseHandle(This->hEvent); - return FALSE; - } - - WaitForSingleObject(This->hEvent, INFINITE); - - if (!This->ThreadResult) + if (FAILED(BaseWindowImpl_PrepareWindow(&This->baseControlWindow.baseWindow))) { CloseHandle(This->hEvent); - CloseHandle(This->hThread); return FALSE; }
@@ -379,9 +337,6 @@ static void video_renderer_destroy(BaseRenderer *iface)
BaseControlWindow_Destroy(&filter->baseControlWindow); BaseControlVideo_Destroy(&filter->baseControlVideo); - PostThreadMessageW(filter->ThreadID, WM_QUIT, 0, 0); - WaitForSingleObject(filter->hThread, INFINITE); - CloseHandle(filter->hThread); CloseHandle(filter->hEvent);
strmbase_renderer_cleanup(&filter->renderer);
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=57318
Your paranoid android.
=== wvistau64_zh_CN (32 bit report) ===
quartz: filtergraph.c:781: Test failed: wait failed
=== w7pro64 (32 bit report) ===
quartz: filtergraph.c:781: Test failed: wait failed
=== w8 (32 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0
=== w8adm (32 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0
=== w1064v1507 (64 bit report) ===
quartz: filtergraph.c:781: Test failed: wait failed
=== debian10 (build log) ===
error: patch failed: dlls/quartz/tests/filtergraph.c:4117 error: patch failed: dlls/quartz/videorenderer.c:45 Task: Patch failed to apply
=== debian10 (build log) ===
error: patch failed: dlls/quartz/tests/filtergraph.c:4117 error: patch failed: dlls/quartz/videorenderer.c:45 Task: Patch failed to apply
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/vmr9.c | 44 +------------------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 2c9c825b505..cc7ef69810c 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -153,10 +153,6 @@ typedef struct
LONG refCount;
- HANDLE ack; - DWORD tid; - HANDLE hWndThread; - IDirect3DDevice9 *d3d9_dev; IDirect3D9 *d3d9_ptr; IDirect3DSurface9 **d3d9_surfaces; @@ -2238,7 +2234,6 @@ static ULONG WINAPI VMR9_ImagePresenter_Release(IVMRImagePresenter9 *iface) { DWORD i; TRACE("Destroying\n"); - CloseHandle(This->ack); IDirect3D9_Release(This->d3d9_ptr);
TRACE("Number of surfaces: %u\n", This->num_surfaces); @@ -2476,32 +2471,6 @@ static HRESULT VMR9_SurfaceAllocator_SetAllocationSettings(VMR9DefaultAllocatorP return hr; }
-static DWORD WINAPI MessageLoop(LPVOID lpParameter) -{ - MSG msg; - BOOL fGotMessage; - VMR9DefaultAllocatorPresenterImpl *This = lpParameter; - - TRACE("Starting message loop\n"); - - if (FAILED(BaseWindowImpl_PrepareWindow(&This->pVMR9->baseControlWindow.baseWindow))) - { - FIXME("Failed to prepare window\n"); - return FALSE; - } - - SetEvent(This->ack); - while ((fGotMessage = GetMessageW(&msg, NULL, 0, 0)) != 0 && fGotMessage != -1) - { - TranslateMessage(&msg); - DispatchMessageW(&msg); - } - - TRACE("End of message loop\n"); - - return 0; -} - static UINT d3d9_adapter_from_hwnd(IDirect3D9 *d3d9, HWND hwnd, HMONITOR *mon_out) { UINT d3d9_adapter; @@ -2533,14 +2502,9 @@ static BOOL CreateRenderingWindow(VMR9DefaultAllocatorPresenterImpl *This, VMR9A
TRACE("(%p)->()\n", This);
- This->hWndThread = CreateThread(NULL, 0, MessageLoop, This, 0, &This->tid); - if (!This->hWndThread) + if (FAILED(BaseWindowImpl_PrepareWindow(&This->pVMR9->baseControlWindow.baseWindow))) return FALSE;
- WaitForSingleObject(This->ack, INFINITE); - - if (!This->pVMR9->baseControlWindow.baseWindow.hWnd) return FALSE; - /* Obtain a monitor and d3d9 device */ d3d9_adapter = d3d9_adapter_from_hwnd(This->d3d9_ptr, This->pVMR9->baseControlWindow.baseWindow.hWnd, &This->hMon);
@@ -2617,10 +2581,6 @@ static HRESULT WINAPI VMR9_SurfaceAllocator_TerminateDevice(IVMRSurfaceAllocator return S_OK; }
- SendMessageW(This->pVMR9->baseControlWindow.baseWindow.hWnd, WM_CLOSE, 0, 0); - PostThreadMessageW(This->tid, WM_QUIT, 0, 0); - WaitForSingleObject(This->hWndThread, INFINITE); - This->hWndThread = NULL; BaseWindowImpl_DoneWithWindow(&This->pVMR9->baseControlWindow.baseWindow);
return S_OK; @@ -2839,8 +2799,6 @@ static HRESULT VMR9DefaultAllocatorPresenterImpl_create(struct quartz_vmr *paren This->hMon = 0; This->d3d9_vertex = NULL; This->num_surfaces = 0; - This->hWndThread = NULL; - This->ack = CreateEventW(NULL, 0, 0, NULL); This->SurfaceAllocatorNotify = NULL; This->reset = FALSE;
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=57319
Your paranoid android.
=== debian10 (build log) ===
error: patch failed: dlls/quartz/tests/filtergraph.c:4117 error: patch failed: dlls/quartz/videorenderer.c:45 Task: Patch failed to apply
=== debian10 (build log) ===
error: patch failed: dlls/quartz/tests/filtergraph.c:4117 error: patch failed: dlls/quartz/videorenderer.c:45 Task: Patch failed to apply
Only renderers should ever need to care about this.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/dsoundrender.c | 4 ++-- dlls/strmbase/renderer.c | 10 +++++----- dlls/strmbase/transform.c | 3 --- dlls/winegstreamer/gstdemux.c | 5 ----- dlls/wineqtdecoder/qtsplitter.c | 1 - include/wine/strmbase.h | 2 +- 6 files changed, 8 insertions(+), 17 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index b6eb7ba2587..fd0ff45d9d2 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -158,10 +158,10 @@ static HRESULT DSoundRender_GetWritePos(DSoundRenderImpl *This, DWORD *ret_write if (This->renderer.filter.pClock == &This->IReferenceClock_iface) { max_lag = min_lag; cur = This->play_time + time_from_pos(This, playpos); - cur -= This->renderer.filter.rtStreamStart; + cur -= This->renderer.stream_start; } else if (This->renderer.filter.pClock) { IReferenceClock_GetTime(This->renderer.filter.pClock, &cur); - cur -= This->renderer.filter.rtStreamStart; + cur -= This->renderer.stream_start; } else write_at = -1;
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index 25534154e95..7d8420e73c1 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -363,11 +363,11 @@ HRESULT WINAPI BaseRendererImpl_Receive(BaseRenderer *This, IMediaSample * pSamp
IReferenceClock_GetTime(This->filter.pClock, &now);
- if (now - This->filter.rtStreamStart - start <= -10000) + if (now - This->stream_start - start <= -10000) { HANDLE handles[2] = {This->advise_event, This->flush_event};
- IReferenceClock_AdviseTime(This->filter.pClock, This->filter.rtStreamStart, + IReferenceClock_AdviseTime(This->filter.pClock, This->stream_start, start, (HEVENT)This->advise_event, &cookie);
LeaveCriticalSection(&This->csRenderLock); @@ -429,7 +429,7 @@ HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart) TRACE("(%p)->(%s)\n", This, wine_dbgstr_longlong(tStart));
EnterCriticalSection(&This->csRenderLock); - This->filter.rtStreamStart = tStart; + This->stream_start = tStart; if (This->filter.state == State_Running) goto out;
@@ -440,7 +440,7 @@ HRESULT WINAPI BaseRendererImpl_Run(IBaseFilter * iface, REFERENCE_TIME tStart) This->sink.end_of_stream = FALSE; }
- QualityControlRender_Start(This->qcimpl, This->filter.rtStreamStart); + QualityControlRender_Start(This->qcimpl, This->stream_start); if (This->sink.pin.peer && This->pFuncsTable->renderer_start_stream) This->pFuncsTable->renderer_start_stream(This); if (This->filter.state == State_Stopped) @@ -547,7 +547,7 @@ HRESULT WINAPI BaseRendererImpl_BeginFlush(BaseRenderer* iface) HRESULT WINAPI BaseRendererImpl_EndFlush(BaseRenderer* iface) { TRACE("(%p)\n", iface); - QualityControlRender_Start(iface->qcimpl, iface->filter.rtStreamStart); + QualityControlRender_Start(iface->qcimpl, iface->stream_start); RendererPosPassThru_ResetMediaTime(iface->pPosition); ResetEvent(iface->flush_event); return S_OK; diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c index 77de1227dd9..abf5ed34b3c 100644 --- a/dlls/strmbase/transform.c +++ b/dlls/strmbase/transform.c @@ -268,10 +268,7 @@ static HRESULT WINAPI TransformFilterImpl_Run(IBaseFilter *iface, REFERENCE_TIME }
if (SUCCEEDED(hr)) - { - This->filter.rtStreamStart = tStart; This->filter.state = State_Running; - } } LeaveCriticalSection(&This->csReceive);
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 66b7114c520..4a685b1bd5a 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1406,10 +1406,6 @@ static HRESULT WINAPI GST_Run(IBaseFilter *iface, REFERENCE_TIME tStart) if (!This->container) return VFW_E_NOT_CONNECTED;
- EnterCriticalSection(&This->filter.csFilter); - This->filter.rtStreamStart = tStart; - LeaveCriticalSection(&This->filter.csFilter); - gst_element_get_state(This->container, &now, NULL, -1); if (now == GST_STATE_PLAYING) return S_OK; @@ -1423,7 +1419,6 @@ static HRESULT WINAPI GST_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
EnterCriticalSection(&This->filter.csFilter); gst_element_set_state(This->container, GST_STATE_PLAYING); - This->filter.rtStreamStart = tStart;
for (i = 0; i < This->cStreams; i++) { hr = BaseOutputPinImpl_Active(&This->ppPins[i]->pin); diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c index 218ed5dad70..99539e5c895 100644 --- a/dlls/wineqtdecoder/qtsplitter.c +++ b/dlls/wineqtdecoder/qtsplitter.c @@ -753,7 +753,6 @@ static HRESULT WINAPI QT_Run(IBaseFilter *iface, REFERENCE_TIME tStart) TRACE("(%s)\n", wine_dbgstr_longlong(tStart));
EnterCriticalSection(&This->csReceive); - This->filter.rtStreamStart = tStart;
if (This->pVideo_Pin) hr = BaseOutputPinImpl_Active(&This->pVideo_Pin->pin); diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 5eaf204f471..99d680a365b 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -155,7 +155,6 @@ struct strmbase_filter CRITICAL_SECTION csFilter;
FILTER_STATE state; - REFERENCE_TIME rtStreamStart; IReferenceClock * pClock; FILTER_INFO filterInfo; CLSID clsid; @@ -538,6 +537,7 @@ typedef struct BaseRendererTag * to immediately unblock the streaming thread. */ HANDLE flush_event; IMediaSample *pMediaSample; + REFERENCE_TIME stream_start;
IQualityControl *pQSink; struct QualityControlImpl *qcimpl;
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=57320
Your paranoid android.
=== debian10 (build log) ===
error: patch failed: dlls/quartz/tests/filtergraph.c:4117 error: patch failed: dlls/quartz/videorenderer.c:45 error: patch failed: dlls/strmbase/renderer.c:440 Task: Patch failed to apply
=== debian10 (build log) ===
error: patch failed: dlls/quartz/tests/filtergraph.c:4117 error: patch failed: dlls/quartz/videorenderer.c:45 error: patch failed: dlls/strmbase/renderer.c:440 Task: Patch failed to apply
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=57316
Your paranoid android.
=== w7pro64 (32 bit report) ===
quartz: filtergraph.c:781: Test failed: wait failed
=== w8adm (32 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0
=== w1064v1507 (32 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0
=== w1064v1507 (64 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0 filtergraph.c:781: Test failed: wait failed
=== debian10 (32 bit Japanese:Japan report) ===
quartz: filtergraph: Timeout