From: Ziqing Hui zhui@codeweavers.com
--- dlls/winegstreamer/media_sink.c | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)
diff --git a/dlls/winegstreamer/media_sink.c b/dlls/winegstreamer/media_sink.c index 73679123bf3..eab81ff0914 100644 --- a/dlls/winegstreamer/media_sink.c +++ b/dlls/winegstreamer/media_sink.c @@ -542,6 +542,40 @@ static HRESULT media_sink_queue_stream_event(struct media_sink *media_sink, Medi return S_OK; }
+static HRESULT media_sink_write_stream(struct media_sink *media_sink) +{ + BYTE *data = NULL; + ULONG written; + QWORD offset; + UINT32 size; + HRESULT hr; + + while (SUCCEEDED(hr = wg_muxer_get_buffer(media_sink->muxer, &size, &offset))) + { + if (!(data = calloc(1, size))) + return E_OUTOFMEMORY; + + if (FAILED(hr = wg_muxer_copy_buffer(media_sink->muxer, data, size))) + { + free(data); + WARN("Failed to copy buffer, hr %#lx.", hr); + return hr; + } + + if ((offset != UINT64_MAX && FAILED(hr = IMFByteStream_SetCurrentPosition(media_sink->bytestream, offset))) + || FAILED(hr = IMFByteStream_Write(media_sink->bytestream, data, size, &written))) + { + free(data); + return hr; + } + + free(data); + wg_muxer_free_buffer(media_sink->muxer); + } + + return S_OK; +} + static HRESULT media_sink_start(struct media_sink *media_sink) { media_sink->state = STATE_STARTED; @@ -571,6 +605,9 @@ static HRESULT media_sink_process(struct media_sink *media_sink, IMFSample *samp
TRACE("media_sink %p, sample %p, stream_id %u.\n", media_sink, sample, stream_id);
+ if (FAILED(hr = media_sink_write_stream(media_sink))) + WARN("Failed to write output samples to stream, hr %#lx.\n", hr); + if (FAILED(hr = wg_sample_create_mf(sample, &wg_sample))) return hr; wg_sample->stream_id = stream_id;