[PATCH 0/6] MR9969: mf: Fix seeking on sample grabber by matching Windows.
This MR changes sample grabber to pass more Wine tests and fixes seeking with the sample grabber. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9969
From: Brendan McGrath <bmcgrath@codeweavers.com> Testing on Windows seems to show a Flush on the sample grabber doesn't actually flush. --- dlls/mf/samplegrabber.c | 12 ------------ dlls/mf/tests/mf.c | 7 +------ 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index a8c797f25ed..3a1c53968db 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -520,7 +520,6 @@ static HRESULT WINAPI sample_grabber_stream_PlaceMarker(IMFStreamSink *iface, MF static HRESULT WINAPI sample_grabber_stream_Flush(IMFStreamSink *iface) { struct sample_grabber *grabber = impl_from_IMFStreamSink(iface); - struct scheduled_item *item, *next_item; HRESULT hr = S_OK; TRACE("%p.\n", iface); @@ -529,17 +528,6 @@ static HRESULT WINAPI sample_grabber_stream_Flush(IMFStreamSink *iface) if (grabber->is_shut_down) hr = MF_E_STREAMSINK_REMOVED; - else - { - LIST_FOR_EACH_ENTRY_SAFE(item, next_item, &grabber->items, struct scheduled_item, entry) - { - /* Samples are discarded, markers are processed immediately. */ - if (item->type == ITEM_TYPE_MARKER) - sample_grabber_stream_report_marker(grabber, &item->u.marker.context, E_ABORT); - - stream_release_pending_item(item); - } - } LeaveCriticalSection(&grabber->cs); diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index d3e191d8721..f10e96eb355 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4313,16 +4313,12 @@ static HRESULT WINAPI timer_SetTimer(IMFTimer *iface, DWORD flags, LONGLONG time struct timer_cancel *tc; HRESULT hr; - todo_wine_if(time == 83334) CHECK_EXPECT(timer_SetTimer); SetEvent(pc->set_timer_event); ok(flags == 0, "Unexpected flags value %#lx\n", flags); - todo_wine_if(time == 83334) ok(time == expected_pts, "Unexpected time value %I64d\n", time); - todo_wine_if(time == 83334) ok(pc->callback_result == NULL, "Unexpected callback result value %p\n", pc->callback_result); - todo_wine_if(time == 83334) ok(pc->cancel_key == NULL, "Unexpected cancel key %p\n", pc->cancel_key); hr = MFCreateAsyncResult(NULL, callback, state, &pc->callback_result); @@ -4824,13 +4820,13 @@ static void test_sample_grabber_seek(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 4, "Unexpected number of samples requested %d\n", samples_requested); /* queue three samples with a marker between the first and second ... */ sample_pts = expected_pts = 0; SET_EXPECT(timer_SetTimer); supply_samples(stream, 1); + todo_wine CHECK_CALLED(timer_SetTimer); hr = IMFStreamSink_PlaceMarker(stream, MFSTREAMSINK_MARKER_DEFAULT, NULL, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); @@ -4956,7 +4952,6 @@ static void test_sample_grabber_seek(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 4, "Unexpected number of samples requested %d\n", samples_requested); /* check contents of collection */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9969
From: Brendan McGrath <bmcgrath@codeweavers.com> --- dlls/mf/samplegrabber.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 3a1c53968db..160125e5910 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -91,6 +91,7 @@ struct sample_grabber CRITICAL_SECTION cs; UINT32 sample_count; IMFSample *samples[MAX_SAMPLE_QUEUE_LENGTH]; + byte samples_queued; }; static IMFSampleGrabberSinkCallback *sample_grabber_get_callback(const struct sample_grabber *sink) @@ -187,13 +188,14 @@ static ULONG WINAPI sample_grabber_stream_AddRef(IMFStreamSink *iface) return IMFMediaSink_AddRef(&grabber->IMFMediaSink_iface); } -static void stream_release_pending_item(struct scheduled_item *item) +static void stream_release_pending_item(struct sample_grabber *grabber, struct scheduled_item *item) { list_remove(&item->entry); switch (item->type) { case ITEM_TYPE_SAMPLE: IMFSample_Release(item->u.sample); + grabber->samples_queued--; break; case ITEM_TYPE_MARKER: PropVariantClear(&item->u.marker.context); @@ -398,13 +400,13 @@ static HRESULT stream_queue_sample(struct sample_grabber *grabber, IMFSample *sa item->u.sample = sample; IMFSample_AddRef(item->u.sample); list_init(&item->entry); - if (list_empty(&grabber->items)) + if (!grabber->samples_queued++) hr = stream_schedule_sample(grabber, item); if (SUCCEEDED(hr)) list_add_tail(&grabber->items, &item->entry); else - stream_release_pending_item(item); + stream_release_pending_item(grabber, item); return hr; } @@ -492,7 +494,7 @@ static HRESULT stream_place_marker(struct sample_grabber *grabber, MFSTREAMSINK_ if (SUCCEEDED(hr)) list_add_tail(&grabber->items, &item->entry); else - stream_release_pending_item(item); + stream_release_pending_item(grabber, item); return hr; } @@ -749,7 +751,7 @@ static HRESULT WINAPI sample_grabber_stream_timer_callback_Invoke(IMFAsyncCallba if (item->type == ITEM_TYPE_MARKER) { sample_grabber_stream_report_marker(grabber, &item->u.marker.context, S_OK); - stream_release_pending_item(item); + stream_release_pending_item(grabber, item); } else if (item->type == ITEM_TYPE_SAMPLE) { @@ -757,7 +759,7 @@ static HRESULT WINAPI sample_grabber_stream_timer_callback_Invoke(IMFAsyncCallba { if (FAILED(hr = sample_grabber_report_sample(grabber, item->u.sample, &sample_delivered))) WARN("Failed to report a sample, hr %#lx.\n", hr); - stream_release_pending_item(item); + stream_release_pending_item(grabber, item); sample_reported = TRUE; } else @@ -840,7 +842,7 @@ static void sample_grabber_release_pending_items(struct sample_grabber *grabber) LIST_FOR_EACH_ENTRY_SAFE(item, next_item, &grabber->items, struct scheduled_item, entry) { - stream_release_pending_item(item); + stream_release_pending_item(grabber, item); } } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9969
From: Brendan McGrath <bmcgrath@codeweavers.com> --- dlls/mf/samplegrabber.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 160125e5910..88da642b25e 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -432,7 +432,7 @@ static HRESULT WINAPI sample_grabber_stream_ProcessSample(IMFStreamSink *iface, if (grabber->is_shut_down) hr = MF_E_STREAMSINK_REMOVED; - else if (grabber->state == SINK_STATE_RUNNING || (grabber->state == SINK_STATE_PAUSED && grabber->ignore_clock)) + else if (grabber->state != SINK_STATE_STOPPED) { hr = IMFSample_GetSampleTime(sample, &sampletime); @@ -450,14 +450,6 @@ static HRESULT WINAPI sample_grabber_stream_ProcessSample(IMFStreamSink *iface, hr = stream_queue_sample(grabber, sample); } } - else if (grabber->state == SINK_STATE_PAUSED) - { - if (grabber->sample_count < MAX_SAMPLE_QUEUE_LENGTH) - { - IMFSample_AddRef(sample); - grabber->samples[grabber->sample_count++] = sample; - } - } LeaveCriticalSection(&grabber->cs); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9969
From: Brendan McGrath <bmcgrath@codeweavers.com> The total of: 1. unsatisfied sample requests made to MF; plus 2. samples queued (i.e. satisfied requests) should always equal 4. Thus, for example, if we flush 3 samples, we need to request 3 more. The stop state appears to flush all samples from sample grabber and all requests outstanding with MF. Hence, starting playback from the stop state always makes four new sample requests. Pause and resume always makes four new sample requests, but will also not flush the queue. This appears to be a Windows bug, as looping pause and resume can therefore result in samples being queued until we are OOM. --- dlls/mf/samplegrabber.c | 37 +++++++++++----------- dlls/mf/tests/mf.c | 68 +++++++++++------------------------------ 2 files changed, 37 insertions(+), 68 deletions(-) diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 88da642b25e..4fc7428b4b7 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -91,7 +91,8 @@ struct sample_grabber CRITICAL_SECTION cs; UINT32 sample_count; IMFSample *samples[MAX_SAMPLE_QUEUE_LENGTH]; - byte samples_queued; + UINT64 samples_queued; + BYTE pending_sample_deliveries; }; static IMFSampleGrabberSinkCallback *sample_grabber_get_callback(const struct sample_grabber *sink) @@ -414,12 +415,13 @@ static HRESULT stream_queue_sample(struct sample_grabber *grabber, IMFSample *sa static void sample_grabber_stream_request_sample(struct sample_grabber *grabber) { IMFStreamSink_QueueEvent(&grabber->IMFStreamSink_iface, MEStreamSinkRequestSample, &GUID_NULL, S_OK, NULL); + grabber->pending_sample_deliveries++; } static HRESULT WINAPI sample_grabber_stream_ProcessSample(IMFStreamSink *iface, IMFSample *sample) { struct sample_grabber *grabber = impl_from_IMFStreamSink(iface); - BOOL sample_delivered; + BOOL sample_delivered = FALSE; LONGLONG sampletime; HRESULT hr = S_OK; @@ -434,6 +436,9 @@ static HRESULT WINAPI sample_grabber_stream_ProcessSample(IMFStreamSink *iface, hr = MF_E_STREAMSINK_REMOVED; else if (grabber->state != SINK_STATE_STOPPED) { + if (grabber->pending_sample_deliveries) + grabber->pending_sample_deliveries--; + hr = IMFSample_GetSampleTime(sample, &sampletime); if (SUCCEEDED(hr)) @@ -1157,6 +1162,7 @@ static HRESULT sample_grabber_set_state(struct sample_grabber *grabber, enum sin [SINK_STATE_RUNNING] = MEStreamSinkStarted, }; BOOL do_callback = FALSE; + byte required_requests; HRESULT hr = S_OK; unsigned int i; @@ -1173,25 +1179,22 @@ static HRESULT sample_grabber_set_state(struct sample_grabber *grabber, enum sin sample_grabber_cancel_timer(grabber); release_samples(grabber); grabber->sample_count = MAX_SAMPLE_QUEUE_LENGTH; + sample_grabber_release_pending_items(grabber); + grabber->pending_sample_deliveries = 0; } - - if (state == SINK_STATE_RUNNING && grabber->state != SINK_STATE_RUNNING) + else if (state == SINK_STATE_RUNNING && + (grabber->state != SINK_STATE_RUNNING || offset != PRESENTATION_CURRENT_POSITION)) { - /* Every transition to running state sends a bunch requests to build up initial queue. */ - for (i = 0; i < grabber->sample_count; ++i) + if (offset != PRESENTATION_CURRENT_POSITION) { - if (grabber->state == SINK_STATE_PAUSED && offset == PRESENTATION_CURRENT_POSITION) - { - assert(grabber->samples[i]); - stream_queue_sample(grabber, grabber->samples[i]); - } - else - { - sample_grabber_stream_request_sample(grabber); - } + sample_grabber_cancel_timer(grabber); + sample_grabber_release_pending_items(grabber); } - release_samples(grabber); - grabber->sample_count = 0; + + required_requests = MAX_SAMPLE_QUEUE_LENGTH - grabber->pending_sample_deliveries; + + for (i = 0; i < required_requests; i++) + sample_grabber_stream_request_sample(grabber); } do_callback = state != grabber->state || state != SINK_STATE_PAUSED; diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index f10e96eb355..acf1ab3d990 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4334,7 +4334,6 @@ static HRESULT WINAPI timer_CancelTimer(IMFTimer *iface, IUnknown *cancel_key) { struct presentation_clock* pc = impl_from_IMFTimer(iface); - todo_wine CHECK_EXPECT(timer_CancelTimer); ok(cancel_key == pc->cancel_key, "Unexpected cancel key %p\n", cancel_key); @@ -4570,8 +4569,6 @@ static void supply_samples(IMFStreamSink *stream, int num_samples) } } -static BOOL ignore_clock = FALSE; - #define count_samples_requested(stream) _count_samples_requested(__LINE__, stream) static int _count_samples_requested(int line, IMFStreamSink *stream) { @@ -4596,7 +4593,6 @@ static int _count_samples_requested(int line, IMFStreamSink *stream) } else if (met == MEStreamSinkMarker) { - todo_wine_if(!ignore_clock) CHECK_EXPECT(MEStreamSinkMarker); break; } @@ -4742,18 +4738,15 @@ static void test_sample_grabber_seek(void) SET_EXPECT(timer_CancelTimer); hr = IMFPresentationClock_Start(clock, 1234); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine CHECK_CALLED(timer_CancelTimer); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 4, "Unexpected number of samples requested %d\n", samples_requested); /* test number of new sample requests on seek when in running state and 3 samples have been provided */ sample_pts = 0; SET_EXPECT(timer_SetTimer); supply_samples(stream, 2); - todo_wine CHECK_CALLED(timer_SetTimer); /* this marker gets silently discarded on the next seek */ hr = IMFStreamSink_PlaceMarker(stream, MFSTREAMSINK_MARKER_DEFAULT, NULL, NULL); @@ -4781,18 +4774,15 @@ static void test_sample_grabber_seek(void) SET_EXPECT(timer_CancelTimer); hr = IMFPresentationClock_Start(clock, 1234); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine CHECK_CALLED(timer_CancelTimer); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 2, "Unexpected number of samples requested %d\n", samples_requested); /* test number of new sample requests after a flush then seek */ sample_pts = expected_pts = 0; SET_EXPECT(timer_SetTimer); supply_samples(stream, 2); - todo_wine CHECK_CALLED(timer_SetTimer); /* there is no cancel timer, or sample requests during a flush */ @@ -4805,11 +4795,9 @@ static void test_sample_grabber_seek(void) SET_EXPECT(timer_CancelTimer); hr = IMFPresentationClock_Start(clock, 1234); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine CHECK_CALLED(timer_CancelTimer); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 3, "Unexpected number of samples requested %d\n", samples_requested); /* test number of new sample requests on seek whilst stopped */ @@ -4826,41 +4814,31 @@ static void test_sample_grabber_seek(void) sample_pts = expected_pts = 0; SET_EXPECT(timer_SetTimer); supply_samples(stream, 1); - todo_wine CHECK_CALLED(timer_SetTimer); hr = IMFStreamSink_PlaceMarker(stream, MFSTREAMSINK_MARKER_DEFAULT, NULL, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); supply_samples(stream, 2); /* ... trigger the time for the first sample ... */ - todo_wine hr = trigger_timer(mock_clock); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = WaitForSingleObject(grabber_callback_impl->ready_event, 1000); - todo_wine ok(hr == WAIT_OBJECT_0, "Unexpected hr %#lx.\n", hr); - if (hr == WAIT_OBJECT_0) - { - expected_pts = 41667; - ResetEvent(mock_clock->set_timer_event); - SET_EXPECT(timer_SetTimer); - SetEvent(grabber_callback_impl->done_event); + expected_pts = 41667; + ResetEvent(mock_clock->set_timer_event); + SET_EXPECT(timer_SetTimer); + SetEvent(grabber_callback_impl->done_event); - SET_EXPECT(MEStreamSinkMarker); - samples_requested = count_samples_requested(stream); - ok(samples_requested == 1, "Unexpected number of samples requested %d\n", samples_requested); - hr = WaitForSingleObject(mock_clock->set_timer_event, 1000); - ok(hr == WAIT_OBJECT_0, "Unexpected hr %#lx.\n", hr); - CHECK_CALLED(MEStreamSinkMarker); - CHECK_CALLED(timer_SetTimer); - } - else - { - skip("skipping MEStreamSinkMarker test\n"); - } + SET_EXPECT(MEStreamSinkMarker); + samples_requested = count_samples_requested(stream); + todo_wine + ok(samples_requested == 1, "Unexpected number of samples requested %d\n", samples_requested); + hr = WaitForSingleObject(mock_clock->set_timer_event, 1000); + ok(hr == WAIT_OBJECT_0, "Unexpected hr %#lx.\n", hr); + CHECK_CALLED(MEStreamSinkMarker); + CHECK_CALLED(timer_SetTimer); /* ... now pause and seek then test the number of samples requested */ hr = IMFPresentationClock_Pause(clock); @@ -4879,17 +4857,14 @@ static void test_sample_grabber_seek(void) sample_pts = expected_pts = 0; SET_EXPECT(timer_SetTimer); supply_samples(stream, 6); - todo_wine CHECK_CALLED(timer_SetTimer); SET_EXPECT(timer_CancelTimer); hr = IMFPresentationClock_Start(clock, 0); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine CHECK_CALLED(timer_CancelTimer); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 4, "Unexpected number of samples requested %d\n", samples_requested); /* test number of new sample requests on seek from paused state where no samples were previously provided */ @@ -4909,14 +4884,12 @@ static void test_sample_grabber_seek(void) expected_pts = sample_pts; SET_EXPECT(timer_SetTimer); supply_samples(stream, 4); - todo_wine CHECK_CALLED(timer_SetTimer); hr = IMFPresentationClock_Start(clock, PRESENTATION_CURRENT_POSITION); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 4, "Unexpected number of samples requested %d\n", samples_requested); /* test pause and resume with 4 samples queued */ @@ -4936,7 +4909,6 @@ static void test_sample_grabber_seek(void) SET_EXPECT(timer_CancelTimer); hr = IMFPresentationClock_Start(clock, 1234567); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine CHECK_CALLED(timer_CancelTimer); samples_requested = count_samples_requested(stream); @@ -4957,24 +4929,19 @@ static void test_sample_grabber_seek(void) /* check contents of collection */ hr = IMFCollection_GetElementCount(grabber_callback_impl->samples, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(count == ARRAY_SIZE(use_clock_samples), "Unexpected total of samples delivered %ld\n", count); for (i = 0; i < ARRAY_SIZE(use_clock_samples); i++) { hr = IMFCollection_GetElement(grabber_callback_impl->samples, i, (IUnknown**)&sample); - todo_wine_if(i) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - hr = IMFSample_GetSampleTime(sample, &pts); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(pts == use_clock_samples[i], "%d: Unexpected pts %I64d, expected %I64d\n", i, pts, use_clock_samples[i]); + hr = IMFSample_GetSampleTime(sample, &pts); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(pts == use_clock_samples[i], "%d: Unexpected pts %I64d, expected %I64d\n", i, pts, use_clock_samples[i]); - ref = IMFSample_Release(sample); - ok(ref == 1, "Release returned %ld\n", ref); - } + ref = IMFSample_Release(sample); + ok(ref == 1, "Release returned %ld\n", ref); } /* required for the sink to be fully released */ @@ -4990,7 +4957,6 @@ static void test_sample_grabber_seek(void) /* test with MF_SAMPLEGRABBERSINK_IGNORE_CLOCK */ - ignore_clock = TRUE; grabber_callback = create_test_grabber_callback(); grabber_callback_impl = impl_from_IMFSampleGrabberSinkCallback(grabber_callback); grabber_callback_impl->do_event = FALSE; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9969
From: Brendan McGrath <bmcgrath@codeweavers.com> All samples are now queued in the 'items' list. --- dlls/mf/samplegrabber.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 4fc7428b4b7..96ddfb63335 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -89,8 +89,6 @@ struct sample_grabber float rate; enum sink_state state; CRITICAL_SECTION cs; - UINT32 sample_count; - IMFSample *samples[MAX_SAMPLE_QUEUE_LENGTH]; UINT64 samples_queued; BYTE pending_sample_deliveries; }; @@ -843,20 +841,6 @@ static void sample_grabber_release_pending_items(struct sample_grabber *grabber) } } -static void release_samples(struct sample_grabber *grabber) -{ - unsigned int i; - - for (i = 0; i < MAX_SAMPLE_QUEUE_LENGTH; ++i) - { - if (grabber->samples[i]) - { - IMFSample_Release(grabber->samples[i]); - grabber->samples[i] = NULL; - } - } -} - static ULONG WINAPI sample_grabber_sink_Release(IMFMediaSink *iface) { struct sample_grabber *grabber = impl_from_IMFMediaSink(iface); @@ -889,7 +873,6 @@ static ULONG WINAPI sample_grabber_sink_Release(IMFMediaSink *iface) if (grabber->sample_attributes) IMFAttributes_Release(grabber->sample_attributes); sample_grabber_release_pending_items(grabber); - release_samples(grabber); DeleteCriticalSection(&grabber->cs); free(grabber); } @@ -1177,8 +1160,6 @@ static HRESULT sample_grabber_set_state(struct sample_grabber *grabber, enum sin if (state == SINK_STATE_STOPPED) { sample_grabber_cancel_timer(grabber); - release_samples(grabber); - grabber->sample_count = MAX_SAMPLE_QUEUE_LENGTH; sample_grabber_release_pending_items(grabber); grabber->pending_sample_deliveries = 0; } @@ -1502,7 +1483,6 @@ static HRESULT sample_grabber_create_object(IMFAttributes *attributes, void *use object->IMFStreamSink_iface.lpVtbl = &sample_grabber_stream_vtbl; object->IMFMediaTypeHandler_iface.lpVtbl = &sample_grabber_stream_type_handler_vtbl; object->timer_callback.lpVtbl = &sample_grabber_stream_timer_callback_vtbl; - object->sample_count = MAX_SAMPLE_QUEUE_LENGTH; object->refcount = 1; object->rate = 1.0f; if (FAILED(IMFSampleGrabberSinkCallback_QueryInterface(context->callback, &IID_IMFSampleGrabberSinkCallback2, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9969
From: Brendan McGrath <bmcgrath@codeweavers.com> This switches the order of the RequestSample and Marker events to match the order on Windows. --- dlls/mf/samplegrabber.c | 4 ++-- dlls/mf/tests/mf.c | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 96ddfb63335..750bb13a743 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -756,6 +756,8 @@ static HRESULT WINAPI sample_grabber_stream_timer_callback_Invoke(IMFAsyncCallba WARN("Failed to report a sample, hr %#lx.\n", hr); stream_release_pending_item(grabber, item); sample_reported = TRUE; + if (sample_delivered) + sample_grabber_stream_request_sample(grabber); } else { @@ -765,8 +767,6 @@ static HRESULT WINAPI sample_grabber_stream_timer_callback_Invoke(IMFAsyncCallba } } } - if (sample_delivered) - sample_grabber_stream_request_sample(grabber); LeaveCriticalSection(&grabber->cs); diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index acf1ab3d990..cf815a794b0 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -4833,7 +4833,6 @@ static void test_sample_grabber_seek(void) SET_EXPECT(MEStreamSinkMarker); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 1, "Unexpected number of samples requested %d\n", samples_requested); hr = WaitForSingleObject(mock_clock->set_timer_event, 1000); ok(hr == WAIT_OBJECT_0, "Unexpected hr %#lx.\n", hr); @@ -4850,7 +4849,6 @@ static void test_sample_grabber_seek(void) CHECK_CALLED(timer_CancelTimer); samples_requested = count_samples_requested(stream); - todo_wine ok(samples_requested == 2, "Unexpected number of samples requested %d\n", samples_requested); /* test over supply */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9969
Nikolay Sivov (@nsivov) commented about dlls/mf/samplegrabber.c:
CRITICAL_SECTION cs; UINT32 sample_count; IMFSample *samples[MAX_SAMPLE_QUEUE_LENGTH]; - byte samples_queued; + UINT64 samples_queued; + BYTE pending_sample_deliveries; };
Why do we need all those different types, instead of some 32-bit unsigned int variant? -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9969#note_127986
participants (3)
-
Brendan McGrath -
Brendan McGrath (@redmcg) -
Nikolay Sivov (@nsivov)