From: Brendan McGrath <bmcgrath@codeweavers.com> --- dlls/mf/sar.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c index ccc1ad9dccd..4356e8fadd1 100644 --- a/dlls/mf/sar.c +++ b/dlls/mf/sar.c @@ -42,6 +42,7 @@ enum audio_renderer_flags SAR_SHUT_DOWN = 0x1, SAR_PREROLLED = 0x2, SAR_SAMPLE_REQUESTED = 0x4, + SAR_SEEKING = 0x8, }; enum queued_object_type @@ -113,6 +114,7 @@ struct audio_renderer DWORD sample_rate; MFCLOCK_STATE clock_state; LONGLONG pts; + LONGLONG seek_pts; UINT64 position; UINT64 audio_clock_frequency; float rate; @@ -664,6 +666,11 @@ static HRESULT WINAPI audio_renderer_clock_sink_OnClockStart(IMFClockStateSink * EnterCriticalSection(&renderer->cs); if (renderer->audio_client) { + if (offset != PRESENTATION_CURRENT_POSITION) + { + renderer->seek_pts = offset; + renderer->flags |= SAR_SEEKING; + } renderer->clock_state = MFCLOCK_STATE_RUNNING; if (renderer->state != STREAM_STATE_RUNNING) { @@ -1250,6 +1257,14 @@ static HRESULT WINAPI audio_renderer_time_source_GetCorrelatedTime(IMFPresentati return hr; *clock_time = renderer->pts + (INT64)(position - renderer->position) * MFCLOCK_FREQUENCY_HNS / (INT64)renderer->audio_clock_frequency; + if (renderer->flags & SAR_SEEKING) + { + if (*clock_time < renderer->seek_pts) + *clock_time = renderer->seek_pts; + else + renderer->flags &= ~SAR_SEEKING; + } + *system_time = counter; return S_OK; @@ -1525,6 +1540,11 @@ static HRESULT stream_queue_sample(struct audio_renderer *renderer, IMFSample *s sample_frames = sample_len / renderer->frame_size; + /* Discard samples that are prior to our seeking location */ + if (renderer->flags & SAR_SEEKING && start_time + + (LONGLONG)sample_frames * MFCLOCK_FREQUENCY_HNS / renderer->sample_rate < renderer->seek_pts) + return S_OK; + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10126