From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfsrcsnk/media_source.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/dlls/mfsrcsnk/media_source.c b/dlls/mfsrcsnk/media_source.c index 1ecf3ed1902..11e46897f39 100644 --- a/dlls/mfsrcsnk/media_source.c +++ b/dlls/mfsrcsnk/media_source.c @@ -606,6 +606,28 @@ static HRESULT demuxer_read_sample(struct winedmo_demuxer demuxer, UINT *index, return hr; }
+static HRESULT media_source_send_eos(struct media_source *source, struct media_stream *stream) +{ + PROPVARIANT empty = {.vt = VT_EMPTY}; + UINT i; + + if (stream->active && !stream->eos && list_empty(&stream->samples)) + { + queue_media_event_value(stream->queue, MEEndOfStream, &empty); + stream->eos = TRUE; + } + + for (i = 0; i < source->stream_count; i++) + { + struct media_stream *other = source->streams[i]; + if (other->active && !other->eos) return S_OK; + } + + queue_media_event_value(source->queue, MEEndOfPresentation, &empty); + source->state = SOURCE_STOPPED; + return S_OK; +} + static HRESULT media_source_read(struct media_source *source) { IMFSample *sample; @@ -623,17 +645,8 @@ static HRESULT media_source_read(struct media_source *source)
if (hr == MF_E_END_OF_STREAM) { - PROPVARIANT empty = {.vt = VT_EMPTY}; - for (i = 0; i < source->stream_count; i++) - { - struct media_stream *stream = source->streams[i]; - if (stream->active) queue_media_event_value(stream->queue, MEEndOfStream, &empty); - stream->eos = TRUE; - } - - queue_media_event_value(source->queue, MEEndOfPresentation, &empty); - source->state = SOURCE_STOPPED; + media_source_send_eos(source, source->streams[i]); return S_OK; }