mp3dmod: Implement IMediaObject::GetOutputType().
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
6ef84f2e54
commit
b9b5560a24
|
@ -1,5 +1,5 @@
|
||||||
MODULE = mp3dmod.dll
|
MODULE = mp3dmod.dll
|
||||||
IMPORTS = dmoguids msdmo uuid wmcodecdspuuid
|
IMPORTS = dmoguids msdmo ole32 uuid wmcodecdspuuid
|
||||||
EXTRAINCL = $(MPG123_CFLAGS)
|
EXTRAINCL = $(MPG123_CFLAGS)
|
||||||
EXTRALIBS = $(MPG123_LIBS)
|
EXTRALIBS = $(MPG123_LIBS)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
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)
|
static HRESULT WINAPI MediaObject_SetInputType(IMediaObject *iface, DWORD index, const DMO_MEDIA_TYPE *type, DWORD flags)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
TESTDLL = mp3dmod.dll
|
TESTDLL = mp3dmod.dll
|
||||||
IMPORTS = dmoguids ole32 strmiids uuid wmcodecdspuuid
|
IMPORTS = dmoguids msdmo ole32 strmiids uuid wmcodecdspuuid
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
mp3dmod.c
|
mp3dmod.c
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#include "wingdi.h"
|
#include "wingdi.h"
|
||||||
#include "mmreg.h"
|
#include "mmreg.h"
|
||||||
#include "mmsystem.h"
|
#include "mmsystem.h"
|
||||||
#include "mediaerr.h"
|
#include "dmo.h"
|
||||||
#include "wmcodecdsp.h"
|
#include "wmcodecdsp.h"
|
||||||
#include "uuids.h"
|
#include "uuids.h"
|
||||||
#include "wine/test.h"
|
#include "wine/test.h"
|
||||||
|
@ -330,9 +330,16 @@ static void test_media_types(void)
|
||||||
.pbFormat = (BYTE *)&mp3fmt,
|
.pbFormat = (BYTE *)&mp3fmt,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
WAVEFORMATEX expect_wfx =
|
||||||
|
{
|
||||||
|
.wFormatTag = WAVE_FORMAT_PCM,
|
||||||
|
.nSamplesPerSec = 48000,
|
||||||
|
};
|
||||||
|
|
||||||
DMO_MEDIA_TYPE mt;
|
DMO_MEDIA_TYPE mt;
|
||||||
IMediaObject *dmo;
|
IMediaObject *dmo;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
hr = CoCreateInstance(&CLSID_CMP3DecMediaObject, NULL, CLSCTX_INPROC_SERVER,
|
hr = CoCreateInstance(&CLSID_CMP3DecMediaObject, NULL, CLSCTX_INPROC_SERVER,
|
||||||
&IID_IMediaObject, (void **)&dmo);
|
&IID_IMediaObject, (void **)&dmo);
|
||||||
|
@ -355,6 +362,10 @@ static void test_media_types(void)
|
||||||
hr = IMediaObject_GetInputType(dmo, 0, 1, &mt);
|
hr = IMediaObject_GetInputType(dmo, 0, 1, &mt);
|
||||||
ok(hr == DMO_E_NO_MORE_ITEMS, "Got hr %#x.\n", hr);
|
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);
|
hr = IMediaObject_SetInputType(dmo, 0, &input_mt, DMO_SET_TYPEF_TEST_ONLY);
|
||||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
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);
|
hr = IMediaObject_SetInputType(dmo, 0, &input_mt, 0);
|
||||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
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;
|
mp3fmt.wfx.nChannels = 1;
|
||||||
hr = IMediaObject_SetInputType(dmo, 0, &input_mt, 0);
|
hr = IMediaObject_SetInputType(dmo, 0, &input_mt, 0);
|
||||||
ok(hr == S_OK, "Got hr %#x.\n", hr);
|
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);
|
IMediaObject_Release(dmo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue