[PATCH 3/5] mfreadwrite/reader: Use attributes from transform.

Giovanni Mascellani gmascellani at codeweavers.com
Fri Mar 18 08:27:17 CDT 2022


Some applications set the output attribute
MF_SA_D3D11_SHARED_WITHOUT_MUTEX on the source reader's transform,
seemingly expecting that it will be picked up by
IMFVideoSampleAllocatorEx::InitializeSampleAllocator(), so that the
generated samples will be shareable.

With this commit we try to emulate the same behavior.

Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
---
I am not completely sure that this is what's happening on Windows, but
unfortunately I see it rather hard to check. In principle I can
create a custom test transform with a custom IMFAttributes object and
then trace the calls to it, but it seems a lot of work for a rather
fragile result.
---
 dlls/mfreadwrite/reader.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c
index 2aaaf013da1..2ff56f6e978 100644
--- a/dlls/mfreadwrite/reader.c
+++ b/dlls/mfreadwrite/reader.c
@@ -2120,6 +2120,7 @@ static HRESULT source_reader_set_compatible_media_type(struct source_reader *rea
 static HRESULT source_reader_setup_sample_allocator(struct source_reader *reader, unsigned int index)
 {
     struct media_stream *stream = &reader->streams[index];
+    IMFAttributes *attributes = NULL;
     IMFVideoSampleAllocatorCallback *callback;
     GUID major = { 0 };
     HRESULT hr;
@@ -2147,7 +2148,16 @@ static HRESULT source_reader_setup_sample_allocator(struct source_reader *reader
         return hr;
     }
 
-    if (FAILED(hr = IMFVideoSampleAllocatorEx_InitializeSampleAllocatorEx(stream->allocator, 2, 8, NULL, stream->current)))
+    if (stream->decoder.transform)
+    {
+        if (FAILED(hr = IMFTransform_GetOutputStreamAttributes(stream->decoder.transform, 0, &attributes)))
+        {
+            WARN("Failed to get output stream attributes, hr %#x.\n", hr);
+            return hr;
+        }
+    }
+
+    if (FAILED(hr = IMFVideoSampleAllocatorEx_InitializeSampleAllocatorEx(stream->allocator, 2, 8, attributes, stream->current)))
         WARN("Failed to initialize sample allocator, hr %#lx.\n", hr);
 
     if (SUCCEEDED(IMFVideoSampleAllocatorEx_QueryInterface(stream->allocator, &IID_IMFVideoSampleAllocatorCallback, (void **)&callback)))
-- 
2.35.1




More information about the wine-devel mailing list