Nikolay Sivov : mfreadwrite: Handle MEStreamTick event in source reader.
Alexandre Julliard
julliard at winehq.org
Wed Mar 25 17:07:27 CDT 2020
Module: wine
Branch: master
Commit: 63e0b3a71a4c5a78c2196708b67ebdb1306b0caf
URL: https://source.winehq.org/git/wine.git/?a=commit;h=63e0b3a71a4c5a78c2196708b67ebdb1306b0caf
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Wed Mar 25 14:39:58 2020 +0300
mfreadwrite: Handle MEStreamTick event in source reader.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfreadwrite/main.c | 35 +++++++++++++++++++++++++++++------
1 file changed, 29 insertions(+), 6 deletions(-)
diff --git a/dlls/mfreadwrite/main.c b/dlls/mfreadwrite/main.c
index 3faa6c6ee0..ee4d826519 100644
--- a/dlls/mfreadwrite/main.c
+++ b/dlls/mfreadwrite/main.c
@@ -528,12 +528,17 @@ static HRESULT source_reader_media_sample_handler(struct source_reader *reader,
}
static HRESULT source_reader_media_stream_state_handler(struct source_reader *reader, IMFMediaStream *stream,
- MediaEventType event)
+ IMFMediaEvent *event)
{
+ MediaEventType event_type;
+ LONGLONG timestamp;
+ PROPVARIANT value;
unsigned int i;
HRESULT hr;
DWORD id;
+ IMFMediaEvent_GetType(event, &event_type);
+
if (FAILED(hr = media_stream_get_id(stream, &id)))
{
WARN("Unidentified stream %p, hr %#x.\n", stream, hr);
@@ -548,7 +553,7 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re
{
EnterCriticalSection(&stream->cs);
- switch (event)
+ switch (event_type)
{
case MEEndOfStream:
stream->state = STREAM_STATE_EOS;
@@ -565,6 +570,16 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re
case MEStreamStarted:
stream->state = STREAM_STATE_READY;
break;
+ case MEStreamTick:
+ value.vt = VT_EMPTY;
+ hr = SUCCEEDED(IMFMediaEvent_GetValue(event, &value)) && value.vt == VT_I8 ? S_OK : E_UNEXPECTED;
+ timestamp = SUCCEEDED(hr) ? value.u.hVal.QuadPart : 0;
+ PropVariantClear(&value);
+
+ source_reader_queue_response(stream, hr, stream->index, MF_SOURCE_READERF_STREAMTICK, timestamp, NULL);
+
+ WakeAllConditionVariable(&stream->sample_event);
+ break;
default:
;
}
@@ -606,8 +621,9 @@ static HRESULT WINAPI source_reader_stream_events_callback_Invoke(IMFAsyncCallba
break;
case MEStreamSeeked:
case MEStreamStarted:
+ case MEStreamTick:
case MEEndOfStream:
- hr = source_reader_media_stream_state_handler(reader, stream, event_type);
+ hr = source_reader_media_stream_state_handler(reader, stream, event);
break;
default:
;
@@ -664,6 +680,13 @@ static ULONG WINAPI src_reader_AddRef(IMFSourceReader *iface)
return refcount;
}
+static void source_reader_release_response(struct stream_response *response)
+{
+ if (response->sample)
+ IMFSample_Release(response->sample);
+ heap_free(response);
+}
+
static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
@@ -697,10 +720,8 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
LIST_FOR_EACH_ENTRY_SAFE(ptr, next, &stream->responses, struct stream_response, entry)
{
- if (ptr->sample)
- IMFSample_Release(ptr->sample);
list_remove(&ptr->entry);
- heap_free(ptr);
+ source_reader_release_response(ptr);
}
}
heap_free(reader->streams);
@@ -1231,6 +1252,8 @@ static HRESULT source_reader_read_sample(struct source_reader *reader, DWORD ind
*sample = response->sample;
if (*sample)
IMFSample_AddRef(*sample);
+ hr = response->status;
+ source_reader_release_response(response);
}
else
{
More information about the wine-cvs
mailing list