Nikolay Sivov : mfreadwrite: Handle some of stream state change events.
Alexandre Julliard
julliard at winehq.org
Mon Apr 22 16:30:38 CDT 2019
Module: wine
Branch: master
Commit: f8fff8b29731ab55065260e25ce6f2722367f808
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f8fff8b29731ab55065260e25ce6f2722367f808
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Apr 22 10:52:30 2019 +0300
mfreadwrite: Handle some of stream state change events.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfreadwrite/main.c | 64 ++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 56 insertions(+), 8 deletions(-)
diff --git a/dlls/mfreadwrite/main.c b/dlls/mfreadwrite/main.c
index 490f238..e396dcd 100644
--- a/dlls/mfreadwrite/main.c
+++ b/dlls/mfreadwrite/main.c
@@ -385,6 +385,46 @@ failed:
return hr;
}
+static HRESULT source_reader_media_stream_state_handler(struct source_reader *reader, IMFMediaStream *stream,
+ MediaEventType event)
+{
+ unsigned int i;
+ HRESULT hr;
+ DWORD id;
+
+ if (FAILED(hr = media_stream_get_id(stream, &id)))
+ {
+ WARN("Unidentified stream %p, hr %#x.\n", stream, hr);
+ return hr;
+ }
+
+ for (i = 0; i < reader->stream_count; ++i)
+ {
+ if (id == reader->streams[i].id)
+ {
+ EnterCriticalSection(&reader->streams[i].cs);
+
+ switch (event)
+ {
+ case MEEndOfStream:
+ reader->streams[i].state = STREAM_STATE_EOS;
+ break;
+ case MEStreamSeeked:
+ case MEStreamStarted:
+ reader->streams[i].state = STREAM_STATE_READY;
+ break;
+ default:
+ ;
+ }
+
+ LeaveCriticalSection(&reader->streams[i].cs);
+ break;
+ }
+ }
+
+ return S_OK;
+}
+
static HRESULT WINAPI source_reader_stream_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
{
struct source_reader *reader = impl_from_stream_callback_IMFAsyncCallback(iface);
@@ -409,6 +449,11 @@ static HRESULT WINAPI source_reader_stream_events_callback_Invoke(IMFAsyncCallba
case MEMediaSample:
hr = source_reader_media_sample_handler(reader, stream, event);
break;
+ case MEStreamSeeked:
+ case MEStreamStarted:
+ case MEEndOfStream:
+ hr = source_reader_media_stream_state_handler(reader, stream, event_type);
+ break;
default:
;
}
@@ -735,6 +780,7 @@ static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index,
DWORD *stream_flags, LONGLONG *timestamp, IMFSample **sample)
{
struct source_reader *reader = impl_from_IMFSourceReader(iface);
+ DWORD stream_index;
HRESULT hr;
TRACE("%p, %#x, %#x, %p, %p, %p, %p\n", iface, index, flags, actual_index, stream_flags, timestamp, sample);
@@ -742,16 +788,16 @@ static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index,
switch (index)
{
case MF_SOURCE_READER_FIRST_VIDEO_STREAM:
- index = reader->first_video_stream_index;
+ stream_index = reader->first_video_stream_index;
break;
case MF_SOURCE_READER_FIRST_AUDIO_STREAM:
- index = reader->first_audio_stream_index;
+ stream_index = reader->first_audio_stream_index;
break;
case MF_SOURCE_READER_ANY_STREAM:
FIXME("Non-specific requests are not supported.\n");
return E_NOTIMPL;
default:
- ;
+ stream_index = index;
}
/* FIXME: probably should happen once */
@@ -769,18 +815,20 @@ static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index,
if (!stream_flags || !sample)
return E_POINTER;
- if (actual_index)
- *actual_index = index;
-
*sample = NULL;
- if (index >= reader->stream_count)
+ if (stream_index >= reader->stream_count)
{
*stream_flags = MF_SOURCE_READERF_ERROR;
+ if (actual_index)
+ *actual_index = index;
return MF_E_INVALIDSTREAMNUMBER;
}
- stream = &reader->streams[index];
+ if (actual_index)
+ *actual_index = stream_index;
+
+ stream = &reader->streams[stream_index];
EnterCriticalSection(&stream->cs);
More information about the wine-cvs
mailing list