1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

mfreadwrite/reader: Introduce new source_reader_(drain|flush)_transform_samples helpers.

This commit is contained in:
Rémi Bernon 2024-01-23 22:04:55 +01:00 committed by Alexandre Julliard
parent 8946e6df7e
commit c20fc715e2

View file

@ -714,6 +714,31 @@ static HRESULT source_reader_pull_transform_samples(struct source_reader *reader
return hr; return hr;
} }
static HRESULT source_reader_drain_transform_samples(struct source_reader *reader, struct media_stream *stream,
struct transform_entry *entry)
{
HRESULT hr;
if (FAILED(hr = IMFTransform_ProcessMessage(entry->transform, MFT_MESSAGE_COMMAND_DRAIN, 0)))
WARN("Failed to drain transform %p, hr %#lx\n", entry->transform, hr);
if (FAILED(hr = source_reader_pull_transform_samples(reader, stream, entry))
&& hr != MF_E_TRANSFORM_NEED_MORE_INPUT)
WARN("Failed to pull pending samples, hr %#lx.\n", hr);
return S_OK;
}
static HRESULT source_reader_flush_transform_samples(struct source_reader *reader, struct media_stream *stream,
struct transform_entry *entry)
{
HRESULT hr;
if (FAILED(hr = IMFTransform_ProcessMessage(entry->transform, MFT_MESSAGE_COMMAND_FLUSH, 0)))
WARN("Failed to flush transform %p, hr %#lx\n", entry->transform, hr);
return S_OK;
}
static HRESULT source_reader_process_sample(struct source_reader *reader, struct media_stream *stream, static HRESULT source_reader_process_sample(struct source_reader *reader, struct media_stream *stream,
IMFSample *sample) IMFSample *sample)
{ {
@ -824,11 +849,10 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re
stream->state = STREAM_STATE_EOS; stream->state = STREAM_STATE_EOS;
stream->flags &= ~STREAM_FLAG_SAMPLE_REQUESTED; stream->flags &= ~STREAM_FLAG_SAMPLE_REQUESTED;
if (stream->decoder.transform && SUCCEEDED(IMFTransform_ProcessMessage(stream->decoder.transform, if (stream->decoder.transform)
MFT_MESSAGE_COMMAND_DRAIN, 0)))
{ {
if ((hr = source_reader_pull_transform_samples(reader, stream, &stream->decoder)) != MF_E_TRANSFORM_NEED_MORE_INPUT) if (FAILED(hr = source_reader_drain_transform_samples(reader, stream, &stream->decoder)))
WARN("Failed to pull pending samples, hr %#lx.\n", hr); WARN("Failed to drain pending samples, hr %#lx.\n", hr);
} }
while (stream->requests) while (stream->requests)
@ -1187,10 +1211,16 @@ static void source_reader_release_responses(struct source_reader *reader, struct
static void source_reader_flush_stream(struct source_reader *reader, DWORD stream_index) static void source_reader_flush_stream(struct source_reader *reader, DWORD stream_index)
{ {
struct media_stream *stream = &reader->streams[stream_index]; struct media_stream *stream = &reader->streams[stream_index];
HRESULT hr;
source_reader_release_responses(reader, stream); source_reader_release_responses(reader, stream);
if (stream->decoder.transform) if (stream->decoder.transform)
IMFTransform_ProcessMessage(stream->decoder.transform, MFT_MESSAGE_COMMAND_FLUSH, 0); {
if (FAILED(hr = source_reader_flush_transform_samples(reader, stream, &stream->decoder)))
WARN("Failed to drain pending samples, hr %#lx.\n", hr);
}
stream->requests = 0; stream->requests = 0;
} }