Zebediah Figura : mp3dmod: Implement IMediaObject::GetOutputType().

Alexandre Julliard julliard at winehq.org
Tue Feb 25 17:23:07 CST 2020


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon Feb 24 23:36:12 2020 -0600

mp3dmod: Implement IMediaObject::GetOutputType().

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mp3dmod/Makefile.in       |  2 +-
 dlls/mp3dmod/mp3dmod.c         | 32 ++++++++++++++++++--
 dlls/mp3dmod/tests/Makefile.in |  2 +-
 dlls/mp3dmod/tests/mp3dmod.c   | 69 +++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 100 insertions(+), 5 deletions(-)

diff --git a/dlls/mp3dmod/Makefile.in b/dlls/mp3dmod/Makefile.in
index 0ac6d9680b..56a5ef38eb 100644
--- a/dlls/mp3dmod/Makefile.in
+++ b/dlls/mp3dmod/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = mp3dmod.dll
-IMPORTS   = dmoguids msdmo uuid wmcodecdspuuid
+IMPORTS   = dmoguids msdmo ole32 uuid wmcodecdspuuid
 EXTRAINCL = $(MPG123_CFLAGS)
 EXTRALIBS = $(MPG123_LIBS)
 
diff --git a/dlls/mp3dmod/mp3dmod.c b/dlls/mp3dmod/mp3dmod.c
index 50b6803ff8..c89f32e9ed 100644
--- a/dlls/mp3dmod/mp3dmod.c
+++ b/dlls/mp3dmod/mp3dmod.c
@@ -187,9 +187,37 @@ static HRESULT WINAPI MediaObject_GetInputType(IMediaObject *iface, DWORD index,
 
 static HRESULT WINAPI MediaObject_GetOutputType(IMediaObject *iface, DWORD index, DWORD type_index, DMO_MEDIA_TYPE *type)
 {
-    FIXME("(%p)->(%d, %d, %p) stub!\n", iface, index, type_index, type);
+    struct mp3_decoder *dmo = impl_from_IMediaObject(iface);
+    const WAVEFORMATEX *input_format;
+    WAVEFORMATEX *format;
 
-    return E_NOTIMPL;
+    TRACE("iface %p, index %u, type_index %u, type %p.\n", iface, index, type_index, type);
+
+    if (!dmo->intype_set)
+        return DMO_E_TYPE_NOT_SET;
+
+    input_format = (WAVEFORMATEX *)dmo->intype.pbFormat;
+
+    if (type_index >= (2 * input_format->nChannels))
+        return DMO_E_NO_MORE_ITEMS;
+
+    type->majortype = WMMEDIATYPE_Audio;
+    type->subtype = WMMEDIASUBTYPE_PCM;
+    type->formattype = WMFORMAT_WaveFormatEx;
+    type->pUnk = NULL;
+    type->cbFormat = sizeof(WAVEFORMATEX);
+    if (!(type->pbFormat = CoTaskMemAlloc(sizeof(WAVEFORMATEX))))
+        return E_OUTOFMEMORY;
+    format = (WAVEFORMATEX *)type->pbFormat;
+    format->wFormatTag = WAVE_FORMAT_PCM;
+    format->nSamplesPerSec = input_format->nSamplesPerSec;
+    format->nChannels = (type_index / 2) ? 1 : input_format->nChannels;
+    format->wBitsPerSample = (type_index % 2) ? 8 : 16;
+    format->nBlockAlign = format->nChannels * format->wBitsPerSample / 8;
+    format->nAvgBytesPerSec = format->nSamplesPerSec * format->nBlockAlign;
+    format->cbSize = 0;
+
+    return S_OK;
 }
 
 static HRESULT WINAPI MediaObject_SetInputType(IMediaObject *iface, DWORD index, const DMO_MEDIA_TYPE *type, DWORD flags)
diff --git a/dlls/mp3dmod/tests/Makefile.in b/dlls/mp3dmod/tests/Makefile.in
index 3cbe4feb01..f5d54e4853 100644
--- a/dlls/mp3dmod/tests/Makefile.in
+++ b/dlls/mp3dmod/tests/Makefile.in
@@ -1,5 +1,5 @@
 TESTDLL = mp3dmod.dll
-IMPORTS = dmoguids ole32 strmiids uuid wmcodecdspuuid
+IMPORTS = dmoguids msdmo ole32 strmiids uuid wmcodecdspuuid
 
 C_SRCS = \
 	mp3dmod.c
diff --git a/dlls/mp3dmod/tests/mp3dmod.c b/dlls/mp3dmod/tests/mp3dmod.c
index dcf0820afb..1e410861ee 100644
--- a/dlls/mp3dmod/tests/mp3dmod.c
+++ b/dlls/mp3dmod/tests/mp3dmod.c
@@ -21,7 +21,7 @@
 #include "wingdi.h"
 #include "mmreg.h"
 #include "mmsystem.h"
-#include "mediaerr.h"
+#include "dmo.h"
 #include "wmcodecdsp.h"
 #include "uuids.h"
 #include "wine/test.h"
@@ -330,9 +330,16 @@ static void test_media_types(void)
         .pbFormat = (BYTE *)&mp3fmt,
     };
 
+    WAVEFORMATEX expect_wfx =
+    {
+        .wFormatTag = WAVE_FORMAT_PCM,
+        .nSamplesPerSec = 48000,
+    };
+
     DMO_MEDIA_TYPE mt;
     IMediaObject *dmo;
     HRESULT hr;
+    DWORD i;
 
     hr = CoCreateInstance(&CLSID_CMP3DecMediaObject, NULL, CLSCTX_INPROC_SERVER,
             &IID_IMediaObject, (void **)&dmo);
@@ -355,6 +362,10 @@ static void test_media_types(void)
     hr = IMediaObject_GetInputType(dmo, 0, 1, &mt);
     ok(hr == DMO_E_NO_MORE_ITEMS, "Got hr %#x.\n", hr);
 
+    memset(&mt, 0xcc, sizeof(DMO_MEDIA_TYPE));
+    hr = IMediaObject_GetOutputType(dmo, 0, 0, &mt);
+    ok(hr == DMO_E_TYPE_NOT_SET, "Got hr %#x.\n", hr);
+
     hr = IMediaObject_SetInputType(dmo, 0, &input_mt, DMO_SET_TYPEF_TEST_ONLY);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
 
@@ -385,10 +396,66 @@ static void test_media_types(void)
     hr = IMediaObject_SetInputType(dmo, 0, &input_mt, 0);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
 
+    for (i = 0; i < 4; ++i)
+    {
+        memset(&mt, 0xcc, sizeof(DMO_MEDIA_TYPE));
+        hr = IMediaObject_GetOutputType(dmo, 0, i, &mt);
+        ok(hr == S_OK, "Got hr %#x.\n", hr);
+        ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio), "Got major type %s.\n", wine_dbgstr_guid(&mt.majortype));
+        ok(IsEqualGUID(&mt.subtype, &MEDIASUBTYPE_PCM), "Got subtype %s.\n", wine_dbgstr_guid(&mt.subtype));
+        ok(mt.bFixedSizeSamples == 0xcccccccc, "Got fixed size %d.\n", mt.bFixedSizeSamples);
+        ok(mt.bTemporalCompression == 0xcccccccc, "Got temporal compression %d.\n", mt.bTemporalCompression);
+        ok(mt.lSampleSize == 0xcccccccc, "Got sample size %u.\n", mt.lSampleSize);
+        ok(IsEqualGUID(&mt.formattype, &FORMAT_WaveFormatEx), "Got format type %s.\n",
+                wine_dbgstr_guid(&mt.formattype));
+        ok(!mt.pUnk, "Got pUnk %p.\n", mt.pUnk);
+        ok(mt.cbFormat >= sizeof(WAVEFORMATEX), "Got format size %u.\n", mt.cbFormat);
+        ok(!!mt.pbFormat, "Got format block %p.\n", mt.pbFormat);
+
+        expect_wfx.nChannels = (i / 2) ? 1 : 2;
+        expect_wfx.wBitsPerSample = (i % 2) ? 8 : 16;
+        expect_wfx.nBlockAlign = expect_wfx.nChannels * expect_wfx.wBitsPerSample / 8;
+        expect_wfx.nAvgBytesPerSec = 48000 * expect_wfx.nBlockAlign;
+        ok(!memcmp(mt.pbFormat, &expect_wfx, sizeof(WAVEFORMATEX)), "Format blocks didn't match.\n");
+
+        MoFreeMediaType(&mt);
+    }
+
+    hr = IMediaObject_GetOutputType(dmo, 0, 4, &mt);
+    ok(hr == DMO_E_NO_MORE_ITEMS, "Got hr %#x.\n", hr);
+
     mp3fmt.wfx.nChannels = 1;
     hr = IMediaObject_SetInputType(dmo, 0, &input_mt, 0);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
 
+    for (i = 0; i < 2; ++i)
+    {
+        memset(&mt, 0xcc, sizeof(DMO_MEDIA_TYPE));
+        hr = IMediaObject_GetOutputType(dmo, 0, i, &mt);
+        ok(hr == S_OK, "Got hr %#x.\n", hr);
+        ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio), "Got major type %s.\n", wine_dbgstr_guid(&mt.majortype));
+        ok(IsEqualGUID(&mt.subtype, &MEDIASUBTYPE_PCM), "Got subtype %s.\n", wine_dbgstr_guid(&mt.subtype));
+        ok(mt.bFixedSizeSamples == 0xcccccccc, "Got fixed size %d.\n", mt.bFixedSizeSamples);
+        ok(mt.bTemporalCompression == 0xcccccccc, "Got temporal compression %d.\n", mt.bTemporalCompression);
+        ok(mt.lSampleSize == 0xcccccccc, "Got sample size %u.\n", mt.lSampleSize);
+        ok(IsEqualGUID(&mt.formattype, &FORMAT_WaveFormatEx), "Got format type %s.\n",
+                wine_dbgstr_guid(&mt.formattype));
+        ok(!mt.pUnk, "Got pUnk %p.\n", mt.pUnk);
+        ok(mt.cbFormat >= sizeof(WAVEFORMATEX), "Got format size %u.\n", mt.cbFormat);
+        ok(!!mt.pbFormat, "Got format block %p.\n", mt.pbFormat);
+
+        expect_wfx.nChannels = 1;
+        expect_wfx.wBitsPerSample = (i % 2) ? 8 : 16;
+        expect_wfx.nBlockAlign = expect_wfx.nChannels * expect_wfx.wBitsPerSample / 8;
+        expect_wfx.nAvgBytesPerSec = 48000 * expect_wfx.nBlockAlign;
+        ok(!memcmp(mt.pbFormat, &expect_wfx, sizeof(WAVEFORMATEX)), "Format blocks didn't match.\n");
+
+        MoFreeMediaType(&mt);
+    }
+
+    hr = IMediaObject_GetOutputType(dmo, 0, 2, &mt);
+    ok(hr == DMO_E_NO_MORE_ITEMS, "Got hr %#x.\n", hr);
+
     IMediaObject_Release(dmo);
 }
 




More information about the wine-cvs mailing list