mfreadwrite: Track source state in reader.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2019-11-05 14:09:43 +03:00 committed by Alexandre Julliard
parent 0cd9878a40
commit a095d15769
1 changed files with 36 additions and 0 deletions

View File

@ -84,6 +84,12 @@ enum media_stream_state
STREAM_STATE_EOS, STREAM_STATE_EOS,
}; };
enum media_source_state
{
SOURCE_STATE_STOPPED = 0,
SOURCE_STATE_STARTED,
};
struct media_stream struct media_stream
{ {
IMFMediaStream *stream; IMFMediaStream *stream;
@ -107,6 +113,7 @@ struct source_reader
DWORD first_video_stream_index; DWORD first_video_stream_index;
IMFSourceReaderCallback *async_callback; IMFSourceReaderCallback *async_callback;
BOOL shutdown_on_release; BOOL shutdown_on_release;
enum media_source_state source_state;
struct media_stream *streams; struct media_stream *streams;
DWORD stream_count; DWORD stream_count;
CRITICAL_SECTION cs; CRITICAL_SECTION cs;
@ -268,6 +275,30 @@ static HRESULT source_reader_new_stream_handler(struct source_reader *reader, IM
return hr; return hr;
} }
static HRESULT source_reader_source_state_handler(struct source_reader *reader, MediaEventType event_type)
{
enum media_source_state state;
switch (event_type)
{
case MESourceStarted:
state = SOURCE_STATE_STARTED;
break;
case MESourceStopped:
state = SOURCE_STATE_STOPPED;
break;
default:
WARN("Unhandled state %d.\n", event_type);
return E_FAIL;
}
EnterCriticalSection(&reader->cs);
reader->source_state = state;
LeaveCriticalSection(&reader->cs);
return S_OK;
}
static HRESULT WINAPI source_reader_source_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) static HRESULT WINAPI source_reader_source_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
{ {
struct source_reader *reader = impl_from_source_callback_IMFAsyncCallback(iface); struct source_reader *reader = impl_from_source_callback_IMFAsyncCallback(iface);
@ -292,6 +323,11 @@ static HRESULT WINAPI source_reader_source_events_callback_Invoke(IMFAsyncCallba
case MENewStream: case MENewStream:
hr = source_reader_new_stream_handler(reader, event); hr = source_reader_new_stream_handler(reader, event);
break; break;
case MESourceStarted:
case MESourcePaused:
case MESourceStopped:
hr = source_reader_source_state_handler(reader, event_type);
break;
default: default:
; ;
} }