winegstreamer: Implement output media type enumeration in MPEG audio decoder.
Signed-off-by: Anton Baskanov <baskanov@gmail.com> Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7d28e8ec89
commit
562d8c338d
|
@ -1059,7 +1059,7 @@ static void test_connect_pin(void)
|
|||
init_pcm_mt(&expect_mt, &expect_format, 1, 32000, i ? 8 : 16);
|
||||
|
||||
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL);
|
||||
todo_wine ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
ok(hr == S_OK, "Got hr %#lx.\n", hr);
|
||||
if (hr != S_OK)
|
||||
break;
|
||||
ok(!memcmp(pmt, &expect_mt, offsetof(AM_MEDIA_TYPE, cbFormat)),
|
||||
|
|
|
@ -36,6 +36,7 @@ struct transform_ops
|
|||
{
|
||||
HRESULT (*sink_query_accept)(struct transform *filter, const AM_MEDIA_TYPE *mt);
|
||||
HRESULT (*source_query_accept)(struct transform *filter, const AM_MEDIA_TYPE *mt);
|
||||
HRESULT (*source_get_media_type)(struct transform *filter, unsigned int index, AM_MEDIA_TYPE *mt);
|
||||
};
|
||||
|
||||
static inline struct transform *impl_from_strmbase_filter(struct strmbase_filter *iface)
|
||||
|
@ -103,9 +104,17 @@ static HRESULT transform_source_query_accept(struct strmbase_pin *pin, const AM_
|
|||
return filter->ops->source_query_accept(filter, mt);
|
||||
}
|
||||
|
||||
static HRESULT transform_source_get_media_type(struct strmbase_pin *pin, unsigned int index, AM_MEDIA_TYPE *mt)
|
||||
{
|
||||
struct transform *filter = impl_from_strmbase_filter(pin->filter);
|
||||
|
||||
return filter->ops->source_get_media_type(filter, index, mt);
|
||||
}
|
||||
|
||||
static const struct strmbase_source_ops source_ops =
|
||||
{
|
||||
.base.pin_query_accept = transform_source_query_accept,
|
||||
.base.pin_get_media_type = transform_source_get_media_type,
|
||||
.pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection,
|
||||
.pfnDecideAllocator = BaseOutputPinImpl_DecideAllocator,
|
||||
};
|
||||
|
@ -189,10 +198,48 @@ static HRESULT mpeg_audio_codec_source_query_accept(struct transform *filter, co
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT mpeg_audio_codec_source_get_media_type(struct transform *filter, unsigned int index, AM_MEDIA_TYPE *mt)
|
||||
{
|
||||
const MPEG1WAVEFORMAT *input_format;
|
||||
WAVEFORMATEX *output_format;
|
||||
|
||||
if (!filter->sink.pin.peer)
|
||||
return VFW_S_NO_MORE_ITEMS;
|
||||
|
||||
if (index > 1)
|
||||
return VFW_S_NO_MORE_ITEMS;
|
||||
|
||||
input_format = (const MPEG1WAVEFORMAT *)filter->sink.pin.mt.pbFormat;
|
||||
|
||||
output_format = CoTaskMemAlloc(sizeof(*output_format));
|
||||
if (!output_format)
|
||||
return E_OUTOFMEMORY;
|
||||
|
||||
memset(output_format, 0, sizeof(*output_format));
|
||||
output_format->wFormatTag = WAVE_FORMAT_PCM;
|
||||
output_format->nSamplesPerSec = input_format->wfx.nSamplesPerSec;
|
||||
output_format->nChannels = input_format->wfx.nChannels;
|
||||
output_format->wBitsPerSample = index ? 8 : 16;
|
||||
output_format->nBlockAlign = output_format->nChannels * output_format->wBitsPerSample / 8;
|
||||
output_format->nAvgBytesPerSec = output_format->nBlockAlign * output_format->nSamplesPerSec;
|
||||
|
||||
memset(mt, 0, sizeof(*mt));
|
||||
mt->majortype = MEDIATYPE_Audio;
|
||||
mt->subtype = MEDIASUBTYPE_PCM;
|
||||
mt->bFixedSizeSamples = TRUE;
|
||||
mt->lSampleSize = output_format->nBlockAlign;
|
||||
mt->formattype = FORMAT_WaveFormatEx;
|
||||
mt->cbFormat = sizeof(*output_format);
|
||||
mt->pbFormat = (BYTE *)output_format;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static const struct transform_ops mpeg_audio_codec_transform_ops =
|
||||
{
|
||||
mpeg_audio_codec_sink_query_accept,
|
||||
mpeg_audio_codec_source_query_accept,
|
||||
mpeg_audio_codec_source_get_media_type,
|
||||
};
|
||||
|
||||
HRESULT mpeg_audio_codec_create(IUnknown *outer, IUnknown **out)
|
||||
|
|
Loading…
Reference in New Issue