From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winedmo/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index dc9829f25b2..3cb638860ac 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -237,7 +237,8 @@ NTSTATUS CDECL winedmo_demuxer_read( struct winedmo_demuxer demuxer, UINT *strea
if (status) { - ERR( "Failed to read sample, status %#lx\n", status ); + if (status == STATUS_END_OF_FILE) WARN( "Reached end of media file.\n" ); + else if (status != STATUS_BUFFER_TOO_SMALL) ERR( "Failed to read sample, status %#lx\n", status ); return status; }
From: Rémi Bernon rbernon@codeweavers.com
To avoid setting it to a size larger than its capacity when buffer too small status is returned. --- dlls/winedmo/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/winedmo/main.c b/dlls/winedmo/main.c index 3cb638860ac..1e91d8e2e51 100644 --- a/dlls/winedmo/main.c +++ b/dlls/winedmo/main.c @@ -131,12 +131,12 @@ static void buffer_lock( DMO_OUTPUT_DATA_BUFFER *buffer, struct sample *sample ) sample->size = size; }
-static void buffer_unlock( DMO_OUTPUT_DATA_BUFFER *buffer, struct sample *sample ) +static void buffer_unlock( DMO_OUTPUT_DATA_BUFFER *buffer, struct sample *sample, NTSTATUS status ) { IMFSample *object; HRESULT hr;
- if (FAILED(hr = IMediaBuffer_SetLength( buffer->pBuffer, sample->size ))) + if (FAILED(hr = IMediaBuffer_SetLength( buffer->pBuffer, status ? 0 : sample->size ))) ERR( "Failed to update buffer length, hr %#lx\n", hr );
buffer->dwStatus = 0; @@ -231,7 +231,7 @@ NTSTATUS CDECL winedmo_demuxer_read( struct winedmo_demuxer demuxer, UINT *strea
buffer_lock( buffer, ¶ms.sample ); status = UNIX_CALL( demuxer_read, ¶ms ); - buffer_unlock( buffer, ¶ms.sample ); + buffer_unlock( buffer, ¶ms.sample, status ); *buffer_size = params.sample.size; *stream = params.stream;
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; }
From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57080 --- dlls/mfsrcsnk/media_source.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/mfsrcsnk/media_source.c b/dlls/mfsrcsnk/media_source.c index 11e46897f39..7bb7f049428 100644 --- a/dlls/mfsrcsnk/media_source.c +++ b/dlls/mfsrcsnk/media_source.c @@ -1432,7 +1432,7 @@ static void media_source_init_stream_map(struct media_source *source, UINT strea for (i = stream_count - 1; i >= 0; i--) { if (FAILED(get_stream_media_type(source->winedmo_demuxer, i, &major, NULL))) - continue; + major = GUID_NULL; if (!IsEqualGUID(&major, &MFMediaType_Audio) && !IsEqualGUID(&major, &MFMediaType_Video)) { TRACE("mapping source %p stream %u to demuxer stream %u\n", source, n, i);