From: Ziqing Hui zhui@codeweavers.com
There is no need to store a presentation clock object. --- dlls/mfreadwrite/writer.c | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-)
diff --git a/dlls/mfreadwrite/writer.c b/dlls/mfreadwrite/writer.c index c708664d2fc..b037c7901de 100644 --- a/dlls/mfreadwrite/writer.c +++ b/dlls/mfreadwrite/writer.c @@ -77,7 +77,6 @@ struct sink_writer DWORD next_id; } streams;
- IMFPresentationClock *clock; IMFMediaSink *sink; enum writer_state state; HRESULT status; @@ -221,8 +220,6 @@ static ULONG WINAPI sink_writer_Release(IMFSinkWriter *iface)
if (!refcount) { - if (writer->clock) - IMFPresentationClock_Release(writer->clock); if (writer->sink) IMFMediaSink_Release(writer->sink); if (writer->callback) @@ -312,28 +309,10 @@ static HRESULT WINAPI sink_writer_SetInputMediaType(IMFSinkWriter *iface, DWORD return E_NOTIMPL; }
-static HRESULT sink_writer_set_presentation_clock(struct sink_writer *writer) -{ - IMFPresentationTimeSource *time_source = NULL; - HRESULT hr; - - if (FAILED(hr = MFCreatePresentationClock(&writer->clock))) return hr; - - if (FAILED(IMFMediaSink_QueryInterface(writer->sink, &IID_IMFPresentationTimeSource, (void **)&time_source))) - hr = MFCreateSystemTimeSource(&time_source); - - if (SUCCEEDED(hr = IMFPresentationClock_SetTimeSource(writer->clock, time_source))) - hr = IMFMediaSink_SetPresentationClock(writer->sink, writer->clock); - - if (time_source) - IMFPresentationTimeSource_Release(time_source); - - return hr; -} - static HRESULT WINAPI sink_writer_BeginWriting(IMFSinkWriter *iface) { struct sink_writer *writer = impl_from_IMFSinkWriter(iface); + IMFClockStateSink *state_sink = NULL; HRESULT hr = S_OK; unsigned int i;
@@ -341,11 +320,9 @@ static HRESULT WINAPI sink_writer_BeginWriting(IMFSinkWriter *iface)
EnterCriticalSection(&writer->cs);
- if (!writer->streams.count) - hr = MF_E_INVALIDREQUEST; - else if (writer->state != SINK_WRITER_STATE_INITIAL) + if (!writer->streams.count || writer->state != SINK_WRITER_STATE_INITIAL) hr = MF_E_INVALIDREQUEST; - else if (SUCCEEDED(hr = sink_writer_set_presentation_clock(writer))) + else if (SUCCEEDED(hr = IMFMediaSink_QueryInterface(writer->sink, &IID_IMFClockStateSink, (void **)&state_sink))) { for (i = 0; i < writer->streams.count; ++i) { @@ -362,11 +339,14 @@ static HRESULT WINAPI sink_writer_BeginWriting(IMFSinkWriter *iface) }
if (SUCCEEDED(hr)) - hr = IMFPresentationClock_Start(writer->clock, 0); + hr = IMFClockStateSink_OnClockStart(state_sink, MFGetSystemTime(), 0);
writer->state = SINK_WRITER_STATE_WRITING; }
+ if (state_sink) + IMFClockStateSink_Release(state_sink); + LeaveCriticalSection(&writer->cs);
return hr;