From: Ziqing Hui <zhui@codeweavers.com> --- dlls/mfreadwrite/tests/mfplat.c | 1 + dlls/mfreadwrite/writer.c | 67 ++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index b258b10441e..40e697947f2 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -1950,6 +1950,7 @@ static void test_sink_writer_sample_process(void) hr = IMFSample_SetSampleDuration(sample, 333333); ok(hr == S_OK, "SetSampleDuration returned %#lx.\n", hr); hr = IMFSinkWriter_WriteSample(writer, 0, sample); + todo_wine ok(hr == S_OK, "WriteSample returned %#lx.\n", hr); IMFSample_Release(sample); } diff --git a/dlls/mfreadwrite/writer.c b/dlls/mfreadwrite/writer.c index 5dc85725d3d..43b315d5808 100644 --- a/dlls/mfreadwrite/writer.c +++ b/dlls/mfreadwrite/writer.c @@ -324,6 +324,54 @@ static HRESULT stream_create_transforms(struct stream *stream, return hr; } +static HRESULT stream_queue_sample(struct stream *stream, IMFSample *sample) +{ + struct pending_item *item; + + if (!(item = calloc(1, sizeof(*item)))) + return E_OUTOFMEMORY; + + item->sample = sample; + IMFSample_AddRef(item->sample); + list_add_tail(&stream->queue, &item->entry); + + return S_OK; +} + +static HRESULT stream_drain_transform_output(struct stream *stream, + IMFTransform *transform, IMFTransform *next_transform) +{ + /* TODO: Drain the output of the transforms. */ + return E_NOTIMPL; +} + +static HRESULT stream_encode_sample(struct stream *stream, + IMFSample *sample, IMFTransform *transform, IMFTransform *next_transform) +{ + HRESULT hr; + + if (!transform) + { + if (!next_transform) + return stream_queue_sample(stream, sample); + + transform = next_transform; + next_transform = NULL; + } + + hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + if (hr == MF_E_NOTACCEPTING) + { + if (FAILED(hr = stream_drain_transform_output(stream, transform, next_transform))) + return hr; + hr = IMFTransform_ProcessInput(transform, 0, sample, 0); + } + if (FAILED(hr)) + return hr; + + return stream_drain_transform_output(stream, transform, next_transform); +} + static struct stream *sink_writer_get_stream(const struct sink_writer *writer, DWORD index) { if (index >= writer->streams.count) @@ -718,22 +766,6 @@ static HRESULT sink_writer_process_sample(struct sink_writer *writer, struct str return hr; } -static HRESULT sink_writer_encode_sample(struct sink_writer *writer, struct stream *stream, IMFSample *sample) -{ - struct pending_item *item; - - /* FIXME: call the encoder, queue its output */ - - if (!(item = calloc(1, sizeof(*item)))) - return E_OUTOFMEMORY; - - item->sample = sample; - IMFSample_AddRef(item->sample); - list_add_tail(&stream->queue, &item->entry); - - return S_OK; -} - static HRESULT sink_writer_write_sample(struct sink_writer *writer, struct stream *stream, IMFSample *sample) { LONGLONG timestamp; @@ -750,7 +782,8 @@ static HRESULT sink_writer_write_sample(struct sink_writer *writer, struct strea writer->stats.qwNumSamplesReceived++; writer->stats.dwByteCountQueued += length; - if (FAILED(hr = sink_writer_encode_sample(writer, stream, sample))) return hr; + if (FAILED(hr = stream_encode_sample(stream, sample, stream->converter, stream->encoder))) + return hr; if (stream->stats.dwNumOutstandingSinkSampleRequests) hr = sink_writer_process_sample(writer, stream); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10298