Module: wine Branch: master Commit: 75fa35ad7fa2e1acaff0f2724bfe08a6242ecc60 URL: https://gitlab.winehq.org/wine/wine/-/commit/75fa35ad7fa2e1acaff0f2724bfe08a...
Author: Rémi Bernon rbernon@codeweavers.com Date: Tue Jan 23 22:16:29 2024 +0100
mfreadwrite/reader: Repeat pushing / pulling samples while it succeeds.
---
dlls/mfreadwrite/reader.c | 51 ++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index c47cd499985..6e895667ef6 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -678,6 +678,26 @@ static HRESULT source_reader_allocate_stream_sample(MFT_OUTPUT_STREAM_INFO *info return hr; }
+static HRESULT source_reader_pull_transform_samples(struct source_reader *reader, struct media_stream *stream, + struct transform_entry *entry); +static HRESULT source_reader_push_transform_samples(struct source_reader *reader, struct media_stream *stream, + struct transform_entry *entry, IMFSample *sample) +{ + HRESULT hr; + + do + { + if (FAILED(hr = source_reader_pull_transform_samples(reader, stream, entry)) + && hr != MF_E_TRANSFORM_NEED_MORE_INPUT) + return hr; + if (SUCCEEDED(hr = IMFTransform_ProcessInput(entry->transform, 0, sample, 0))) + return source_reader_pull_transform_samples(reader, stream, entry); + } + while (hr == MF_E_NOTACCEPTING); + + return hr; +} + static HRESULT source_reader_pull_transform_samples(struct source_reader *reader, struct media_stream *stream, struct transform_entry *entry) { @@ -689,7 +709,7 @@ static HRESULT source_reader_pull_transform_samples(struct source_reader *reader return hr; stream_info.cbSize = max(stream_info.cbSize, entry->min_buffer_size);
- for (;;) + while (SUCCEEDED(hr)) { MFT_OUTPUT_DATA_BUFFER out_buffer = {0};
@@ -697,14 +717,9 @@ static HRESULT source_reader_pull_transform_samples(struct source_reader *reader && FAILED(hr = source_reader_allocate_stream_sample(&stream_info, &out_buffer.pSample))) break;
- if (FAILED(hr = IMFTransform_ProcessOutput(entry->transform, 0, 1, &out_buffer, &status))) - { - if (out_buffer.pSample) - IMFSample_Release(out_buffer.pSample); - break; - } + if (SUCCEEDED(hr = IMFTransform_ProcessOutput(stream->decoder.transform, 0, 1, &out_buffer, &status))) + hr = source_reader_queue_sample(reader, stream, out_buffer.pSample);
- source_reader_queue_sample(reader, stream, out_buffer.pSample); if (out_buffer.pSample) IMFSample_Release(out_buffer.pSample); if (out_buffer.pEvents) @@ -748,19 +763,9 @@ static HRESULT source_reader_process_sample(struct source_reader *reader, struct return source_reader_queue_sample(reader, stream, sample);
/* It's assumed that decoder has 1 input and 1 output, both id's are 0. */ - - hr = source_reader_pull_transform_samples(reader, stream, &stream->decoder); - if (hr == MF_E_TRANSFORM_NEED_MORE_INPUT) - { - if (FAILED(hr = IMFTransform_ProcessInput(stream->decoder.transform, 0, sample, 0))) - { - WARN("Transform failed to process input, hr %#lx.\n", hr); - return hr; - } - - if ((hr = source_reader_pull_transform_samples(reader, stream, &stream->decoder)) == MF_E_TRANSFORM_NEED_MORE_INPUT) - return S_OK; - } + if (SUCCEEDED(hr = source_reader_push_transform_samples(reader, stream, &stream->decoder, sample)) + || hr == MF_E_TRANSFORM_NEED_MORE_INPUT) + hr = stream->requests ? source_reader_request_sample(reader, stream) : S_OK; else WARN("Transform failed to process output, hr %#lx.\n", hr);
@@ -797,12 +802,8 @@ static HRESULT source_reader_media_sample_handler(struct source_reader *reader, if (id == reader->streams[i].id) { /* FIXME: propagate processing errors? */ - reader->streams[i].flags &= ~STREAM_FLAG_SAMPLE_REQUESTED; hr = source_reader_process_sample(reader, &reader->streams[i], sample); - if (reader->streams[i].requests) - source_reader_request_sample(reader, &reader->streams[i]); - break; } }