Nikolay Sivov : mfplat: Add partial implementation of ConvertToContiguousBuffer().

Alexandre Julliard julliard at winehq.org
Fri Apr 26 15:31:03 CDT 2019


Module: wine
Branch: master
Commit: 2e9a036f9a263c3a7d66834a44cfc8bdbbcbb346
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2e9a036f9a263c3a7d66834a44cfc8bdbbcbb346

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Apr 26 09:56:49 2019 +0300

mfplat: Add partial implementation of ConvertToContiguousBuffer().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfplat/buffer.c       | 24 +++++++++++++++++++++--
 dlls/mfplat/tests/mfplat.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/dlls/mfplat/buffer.c b/dlls/mfplat/buffer.c
index 524398a..27ae44a 100644
--- a/dlls/mfplat/buffer.c
+++ b/dlls/mfplat/buffer.c
@@ -686,9 +686,29 @@ static HRESULT WINAPI sample_GetBufferByIndex(IMFSample *iface, DWORD index, IMF
 
 static HRESULT WINAPI sample_ConvertToContiguousBuffer(IMFSample *iface, IMFMediaBuffer **buffer)
 {
-    FIXME("%p, %p.\n", iface, buffer);
+    struct sample *sample = impl_from_IMFSample(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, buffer);
+
+    EnterCriticalSection(&sample->cs);
+
+    if (sample->buffer_count == 0)
+        hr = E_UNEXPECTED;
+    else if (sample->buffer_count == 1)
+    {
+        *buffer = sample->buffers[0];
+        IMFMediaBuffer_AddRef(*buffer);
+    }
+    else
+    {
+        FIXME("Samples with multiple buffers are not supported.\n");
+        hr = E_NOTIMPL;
+    }
+
+    LeaveCriticalSection(&sample->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI sample_AddBuffer(IMFSample *iface, IMFMediaBuffer *buffer)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 571d57a..541b236 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -1475,6 +1475,53 @@ static void test_sample(void)
 
     IMFAttributes_Release(attributes);
     IMFSample_Release(sample);
+
+    /* ConvertToContiguousBuffer() */
+    hr = MFCreateSample(&sample);
+    ok(hr == S_OK, "Failed to create a sample, hr %#x.\n", hr);
+
+    hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer);
+    ok(hr == E_UNEXPECTED, "Unexpected hr %#x.\n", hr);
+
+    hr = MFCreateMemoryBuffer(16, &buffer);
+    ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr);
+
+    hr = IMFSample_AddBuffer(sample, buffer);
+    ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr);
+
+    hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer2);
+    ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr);
+    ok(buffer2 == buffer, "Unexpected buffer instance.\n");
+    IMFMediaBuffer_Release(buffer2);
+
+    hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer2);
+    ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr);
+    ok(buffer2 == buffer, "Unexpected buffer instance.\n");
+    IMFMediaBuffer_Release(buffer2);
+
+    hr = MFCreateMemoryBuffer(16, &buffer2);
+    ok(hr == S_OK, "Failed to create a buffer, hr %#x.\n", hr);
+
+    hr = IMFSample_AddBuffer(sample, buffer2);
+    ok(hr == S_OK, "Failed to add buffer, hr %#x.\n", hr);
+    IMFMediaBuffer_Release(buffer2);
+
+    hr = IMFSample_GetBufferCount(sample, &count);
+    ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr);
+    ok(count == 2, "Unexpected buffer count %u.\n", count);
+
+    hr = IMFSample_ConvertToContiguousBuffer(sample, &buffer2);
+todo_wine
+    ok(hr == S_OK, "Failed to convert, hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+        IMFMediaBuffer_Release(buffer2);
+
+    hr = IMFSample_GetBufferCount(sample, &count);
+    ok(hr == S_OK, "Failed to get buffer count, hr %#x.\n", hr);
+todo_wine
+    ok(count == 1, "Unexpected buffer count %u.\n", count);
+
+    IMFSample_Release(sample);
 }
 
 struct test_callback




More information about the wine-cvs mailing list