From: Rémi Bernon rbernon@codeweavers.com
--- dlls/mfreadwrite/reader.c | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-)
diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 6c990a17809..b9a5667bc57 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -1864,31 +1864,12 @@ static HRESULT source_reader_setup_sample_allocator(struct source_reader *reader { struct media_stream *stream = &reader->streams[index]; IMFAttributes *attributes = NULL; - GUID major = { 0 }; HRESULT hr;
- IMFMediaType_GetMajorType(stream->current, &major); - if (!IsEqualGUID(&major, &MFMediaType_Video)) - return S_OK; - - if (!(reader->flags & SOURCE_READER_HAS_DEVICE_MANAGER)) - return S_OK; - if (!stream->allocator) - { - if (FAILED(hr = MFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocatorEx, (void **)&stream->allocator))) - { - WARN("Failed to create sample allocator, hr %#lx.\n", hr); - return hr; - } - } + return S_OK;
IMFVideoSampleAllocatorEx_UninitializeSampleAllocator(stream->allocator); - if (FAILED(hr = IMFVideoSampleAllocatorEx_SetDirectXManager(stream->allocator, reader->device_manager))) - { - WARN("Failed to set device manager, hr %#lx.\n", hr); - return hr; - }
if (FAILED(hr = source_reader_create_sample_allocator_attributes(reader, &attributes))) WARN("Failed to create allocator attributes, hr %#lx.\n", hr); @@ -2667,10 +2648,12 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri /* Set initial current media types. */ for (i = 0; i < object->stream_count; ++i) { + IMFVideoSampleAllocatorEx *allocator = NULL; IMFMediaTypeHandler *handler; IMFStreamDescriptor *sd; IMFMediaType *src_type; BOOL selected; + GUID major;
list_init(&object->streams[i].transforms);
@@ -2698,6 +2681,21 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri if (FAILED(hr)) break;
+ if (SUCCEEDED(IMFMediaType_GetMajorType(src_type, &major)) && IsEqualGUID(&major, &MFMediaType_Video) + && (object->flags & SOURCE_READER_HAS_DEVICE_MANAGER)) + { + if (FAILED(hr = MFCreateVideoSampleAllocatorEx(&IID_IMFVideoSampleAllocatorEx, (void **)&allocator))) + WARN("Failed to create sample allocator, hr %#lx.\n", hr); + else if (FAILED(hr = IMFVideoSampleAllocatorEx_SetDirectXManager(allocator, + object->device_manager))) + { + WARN("Failed to set device manager, hr %#lx.\n", hr); + IMFVideoSampleAllocatorEx_Release(allocator); + allocator = NULL; + } + } + + object->streams[i].allocator = allocator; object->streams[i].reader = object; object->streams[i].index = i; }