[PATCH 2/6] mf/tests: Add some WMA encoder ProcessInput tests.

Rémi Bernon rbernon at codeweavers.com
Mon Jan 24 03:55:34 CST 2022


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51931
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52391
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/mf/tests/Makefile.in |   2 +-
 dlls/mf/tests/mf.c        | 110 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 110 insertions(+), 2 deletions(-)

diff --git a/dlls/mf/tests/Makefile.in b/dlls/mf/tests/Makefile.in
index 614eb4fbc9e..0b89107e1b4 100644
--- a/dlls/mf/tests/Makefile.in
+++ b/dlls/mf/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL   = mf.dll
-IMPORTS   = mf mfplat mfuuid ole32 user32
+IMPORTS   = mf mfplat mfuuid ole32 user32 propsys
 
 C_SRCS = \
 	mf.c
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 9768491650a..d1d68830176 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -110,6 +110,7 @@ typedef struct attribute_desc media_type_desc[32];
 
 #define ATTR_GUID(k, g)      {.key = &k, .name = #k, {.vt = VT_CLSID, .puuid = (GUID *)&g}}
 #define ATTR_UINT32(k, v)    {.key = &k, .name = #k, {.vt = VT_UI4, .ulVal = v}}
+#define ATTR_BLOB(k, p, n)   {.key = &k, .name = #k, {.vt = VT_VECTOR | VT_UI1, .caub = {.pElems = (void *)p, .cElems = n}}}
 
 static HWND create_window(void)
 {
@@ -5420,6 +5421,43 @@ static BOOL create_transform(GUID category, MFT_REGISTER_TYPE_INFO *input_type,
     return TRUE;
 }
 
+static IMFSample *create_sample(const BYTE *data, ULONG size)
+{
+    IMFMediaBuffer *media_buffer;
+    IMFSample *sample;
+    DWORD length;
+    BYTE *buffer;
+    HRESULT hr;
+    ULONG ret;
+
+    hr = MFCreateSample(&sample);
+    ok(hr == S_OK, "MFCreateSample returned %#x\n", hr);
+    hr = MFCreateMemoryBuffer(size, &media_buffer);
+    ok(hr == S_OK, "MFCreateMemoryBuffer returned %#x\n", hr);
+    if (data)
+    {
+        hr = IMFMediaBuffer_SetCurrentLength(media_buffer, size);
+        ok(hr == S_OK, "SetCurrentLength returned %#x\n", hr);
+        hr = IMFMediaBuffer_Lock(media_buffer, &buffer, NULL, &length);
+        ok(hr == S_OK, "Lock returned %#x\n", hr);
+        ok(length == size, "got size %u\n", length);
+        if (!data) memset(buffer, 0xcd, length);
+        else memcpy(buffer, data, length);
+        hr = IMFMediaBuffer_Unlock(media_buffer);
+        ok(hr == S_OK, "Unlock returned %#x\n", hr);
+    }
+    hr = IMFSample_AddBuffer(sample, media_buffer);
+    ok(hr == S_OK, "AddBuffer returned %#x\n", hr);
+    ret = IMFMediaBuffer_Release(media_buffer);
+    ok(ret == 1, "Release returned %u\n", ret);
+
+    return sample;
+}
+
+static const BYTE wma_codec_data[10] = {0, 0x44, 0, 0, 0x17, 0, 0, 0, 0, 0};
+static const BYTE wma_decoded_data[0x4000] = {0};
+static const ULONG wma_block_size = 1487;
+
 static void test_wma_encoder(void)
 {
     static const media_type_desc transform_inputs[] =
@@ -5449,12 +5487,39 @@ static void test_wma_encoder(void)
         },
     };
 
+    static const struct attribute_desc input_type_desc[] =
+    {
+        ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio),
+        ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_Float),
+        ATTR_UINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 32),
+        ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2),
+        ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 22050),
+        ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 176400),
+        ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, 8),
+        {0},
+    };
+    const struct attribute_desc output_type_desc[] =
+    {
+        ATTR_GUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio),
+        ATTR_GUID(MF_MT_SUBTYPE, MFAudioFormat_WMAudioV8),
+        ATTR_UINT32(MF_MT_AUDIO_NUM_CHANNELS, 2),
+        ATTR_UINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, 22050),
+        ATTR_UINT32(MF_MT_AUDIO_AVG_BYTES_PER_SECOND, 4003),
+        ATTR_UINT32(MF_MT_AUDIO_BLOCK_ALIGNMENT, wma_block_size),
+        ATTR_BLOB(MF_MT_USER_DATA, wma_codec_data, sizeof(wma_codec_data)),
+        {0},
+    };
+
     MFT_REGISTER_TYPE_INFO output_type = {MFMediaType_Audio, MFAudioFormat_WMAudioV8};
     MFT_REGISTER_TYPE_INFO input_type = {MFMediaType_Audio, MFAudioFormat_Float};
+    MFT_OUTPUT_STREAM_INFO output_info;
+    MFT_INPUT_STREAM_INFO input_info;
+    IMFMediaType *media_type;
     IMFTransform *transform;
+    IMFSample *sample;
     GUID class_id;
+    ULONG i, ret;
     HRESULT hr;
-    ULONG ret;
 
     hr = CoInitialize(NULL);
     ok(hr == S_OK, "Failed to initialize, hr %#x.\n", hr);
@@ -5466,6 +5531,49 @@ static void test_wma_encoder(void)
 
     check_interface(transform, &IID_IMediaObject, TRUE);
 
+    hr = MFCreateMediaType(&media_type);
+    ok(hr == S_OK, "MFCreateMediaType returned %#x\n", hr);
+    init_media_type(media_type, input_type_desc, -1);
+    hr = IMFTransform_SetInputType(transform, 0, media_type, 0);
+    ok(hr == S_OK, "SetInputType returned %#x.\n", hr);
+    init_media_type(media_type, output_type_desc, -1);
+    hr = IMFTransform_SetOutputType(transform, 0, media_type, 0);
+    ok(hr == S_OK, "SetOutputType returned %#x.\n", hr);
+    ret = IMFMediaType_Release(media_type);
+    ok(ret == 0, "Release returned %u\n", ret);
+
+    memset(&input_info, 0xcd, sizeof(input_info));
+    hr = IMFTransform_GetInputStreamInfo(transform, 0, &input_info);
+    ok(hr == S_OK, "GetInputStreamInfo returned %#x\n", hr);
+    ok(input_info.hnsMaxLatency == 19969161, "got hnsMaxLatency %s\n",
+            wine_dbgstr_longlong(input_info.hnsMaxLatency));
+    ok(input_info.dwFlags == 0, "got dwFlags %#x\n", input_info.dwFlags);
+    ok(input_info.cbSize == 8, "got cbSize %u\n", input_info.cbSize);
+    ok(input_info.cbMaxLookahead == 0, "got cbMaxLookahead %#x\n", input_info.cbMaxLookahead);
+    ok(input_info.cbAlignment == 1, "got cbAlignment %#x\n", input_info.cbAlignment);
+
+    memset(&output_info, 0xcd, sizeof(output_info));
+    hr = IMFTransform_GetOutputStreamInfo(transform, 0, &output_info);
+    ok(hr == S_OK, "GetOutputStreamInfo returned %#x\n", hr);
+    ok(output_info.dwFlags == 0, "got dwFlags %#x\n", output_info.dwFlags);
+    ok(output_info.cbSize == wma_block_size, "got cbSize %#x\n", output_info.cbSize);
+    ok(output_info.cbAlignment == 1, "got cbAlignment %#x\n", output_info.cbAlignment);
+
+    i = 0;
+    sample = create_sample(wma_decoded_data, sizeof(wma_decoded_data));
+    while (SUCCEEDED(hr = IMFTransform_ProcessInput(transform, 0, sample, 0)))
+    {
+        ok(hr == S_OK, "ProcessInput returned %#x\n", hr);
+        i += sizeof(wma_decoded_data);
+    }
+    ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#x\n", hr);
+    ok(i == 0x204000, "ProcessInput consumed %#x bytes\n", i);
+
+    hr = IMFTransform_ProcessMessage(transform, MFT_MESSAGE_COMMAND_DRAIN, 0);
+    ok(hr == S_OK, "ProcessMessage returned %#x\n", hr);
+    hr = IMFTransform_ProcessInput(transform, 0, sample, 0);
+    ok(hr == MF_E_NOTACCEPTING, "ProcessInput returned %#x\n", hr);
+
     ret = IMFTransform_Release(transform);
     ok(ret == 0, "Release returned %u\n", ret);
 
-- 
2.34.1




More information about the wine-devel mailing list