From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/aac_decoder.c | 27 +++--------- dlls/winegstreamer/gst_private.h | 2 + dlls/winegstreamer/main.c | 26 +++++++++++ dlls/winegstreamer/mfplat.c | 3 +- dlls/winegstreamer/quartz_transform.c | 63 +++++++-------------------- dlls/winegstreamer/resampler.c | 29 +++--------- dlls/winegstreamer/wma_decoder.c | 26 +++++------ 7 files changed, 69 insertions(+), 107 deletions(-)
diff --git a/dlls/winegstreamer/aac_decoder.c b/dlls/winegstreamer/aac_decoder.c index 8e5d76f516a..0d012fd710a 100644 --- a/dlls/winegstreamer/aac_decoder.c +++ b/dlls/winegstreamer/aac_decoder.c @@ -36,8 +36,10 @@ WINE_DECLARE_DEBUG_CHANNEL(winediag);
static WAVEFORMATEXTENSIBLE const aac_decoder_output_types[] = { - {.Format = {.wFormatTag = WAVE_FORMAT_IEEE_FLOAT, .wBitsPerSample = 32, .nSamplesPerSec = 48000, .nChannels = 2}}, - {.Format = {.wFormatTag = WAVE_FORMAT_PCM, .wBitsPerSample = 16, .nSamplesPerSec = 48000, .nChannels = 2}}, + {.Format = {.wFormatTag = WAVE_FORMAT_IEEE_FLOAT, .wBitsPerSample = 32, .nSamplesPerSec = 48000, .nChannels = 2, + .cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)}}, + {.Format = {.wFormatTag = WAVE_FORMAT_PCM, .wBitsPerSample = 16, .nSamplesPerSec = 48000, .nChannels = 2, + .cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)}}, };
static const UINT32 default_channel_mask[7] = @@ -575,31 +577,16 @@ static HEAACWAVEINFO aac_decoder_input_types[] =
HRESULT aac_decoder_create(REFIID riid, void **ret) { - static const struct wg_format output_format = - { - .major_type = WG_MAJOR_TYPE_AUDIO, - .u.audio = - { - .format = WG_AUDIO_FORMAT_F32LE, - .channel_mask = 1, - .channels = 1, - .rate = 44100, - }, - }; - static const struct wg_format input_format = {.major_type = WG_MAJOR_TYPE_AUDIO_MPEG4}; - struct wg_transform_attrs attrs = {0}; - wg_transform_t transform; struct aac_decoder *decoder; HRESULT hr;
TRACE("riid %s, ret %p.\n", debugstr_guid(riid), ret);
- if (!(transform = wg_transform_create(&input_format, &output_format, &attrs))) + if (FAILED(hr = check_audio_transform_support(&aac_decoder_input_types[0].wfx, &aac_decoder_output_types[0].Format))) { - ERR_(winediag)("GStreamer doesn't support WMA decoding, please install appropriate plugins\n"); - return E_FAIL; + ERR_(winediag)("GStreamer doesn't support AAC decoding, please install appropriate plugins\n"); + return hr; } - wg_transform_destroy(transform);
if (!(decoder = calloc(1, sizeof(*decoder)))) return E_OUTOFMEMORY; diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index c594ab99f3f..91020e973ac 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -95,6 +95,8 @@ HRESULT wg_transform_flush(wg_transform_t transform); void wg_transform_notify_qos(wg_transform_t transform, bool underflow, double proportion, int64_t diff, uint64_t timestamp);
+HRESULT check_audio_transform_support(const WAVEFORMATEX *input, const WAVEFORMATEX *output); + HRESULT wg_muxer_create(const char *format, wg_muxer_t *muxer); void wg_muxer_destroy(wg_muxer_t muxer); HRESULT wg_muxer_add_stream(wg_muxer_t muxer, UINT32 stream_id, const struct wg_format *format); diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index 03f8d658fe6..56c9fb04f0f 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -32,6 +32,7 @@ #include "gst_guids.h" #include "wmcodecdsp.h" #include "mferror.h" +#include "mfapi.h"
WINE_DEFAULT_DEBUG_CHANNEL(quartz); WINE_DECLARE_DEBUG_CHANNEL(mfplat); @@ -635,6 +636,31 @@ HRESULT wg_muxer_finalize(wg_muxer_t muxer) return S_OK; }
+HRESULT check_audio_transform_support(const WAVEFORMATEX *input, const WAVEFORMATEX *output) +{ + IMFMediaType *input_type, *output_type; + struct wg_transform_attrs attrs = {0}; + wg_transform_t transform; + HRESULT hr; + + if (FAILED(hr = MFCreateMediaType(&input_type))) + return hr; + if (FAILED(hr = MFCreateMediaType(&output_type))) + { + IMFMediaType_Release(input_type); + return hr; + } + + if (SUCCEEDED(hr = MFInitMediaTypeFromWaveFormatEx(input_type, input, sizeof(*input) + input->cbSize)) + && SUCCEEDED(hr = MFInitMediaTypeFromWaveFormatEx(output_type, output, sizeof(*output) + output->cbSize)) + && SUCCEEDED(hr = wg_transform_create_mf(input_type, output_type, &attrs, &transform))) + wg_transform_destroy(transform); + + IMFMediaType_Release(output_type); + IMFMediaType_Release(input_type); + return hr; +} + #define ALIGN(n, alignment) (((n) + (alignment) - 1) & ~((alignment) - 1))
unsigned int wg_format_get_stride(const struct wg_format *format) diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c index 1bf70561df0..879ea0707fc 100644 --- a/dlls/winegstreamer/mfplat.c +++ b/dlls/winegstreamer/mfplat.c @@ -22,7 +22,6 @@ #include "ks.h" #include "ksmedia.h" #include "wmcodecdsp.h" -#include "initguid.h" #include "d3d9types.h" #include "mfapi.h" #include "mmreg.h" @@ -30,6 +29,8 @@ #include "wine/debug.h" #include "wine/list.h"
+#include "initguid.h" + WINE_DEFAULT_DEBUG_CHANNEL(mfplat);
DEFINE_GUID(DMOVideoFormat_RGB32,D3DFMT_X8R8G8B8,0x524f,0x11ce,0x9f,0x53,0x00,0x20,0xaf,0x0b,0xa7,0x70); diff --git a/dlls/winegstreamer/quartz_transform.c b/dlls/winegstreamer/quartz_transform.c index b85b24f4278..31150a71298 100644 --- a/dlls/winegstreamer/quartz_transform.c +++ b/dlls/winegstreamer/quartz_transform.c @@ -737,39 +737,24 @@ static const struct transform_ops mpeg_audio_codec_transform_ops =
HRESULT mpeg_audio_codec_create(IUnknown *outer, IUnknown **out) { - static const struct wg_format output_format = + static const WAVEFORMATEX output_format = { - .major_type = WG_MAJOR_TYPE_AUDIO, - .u.audio = - { - .format = WG_AUDIO_FORMAT_S16LE, - .channel_mask = 1, - .channels = 1, - .rate = 44100, - }, + .wFormatTag = WAVE_FORMAT_PCM, .wBitsPerSample = 16, .nSamplesPerSec = 44100, .nChannels = 1, }; - static const struct wg_format input_format = + static const MPEG1WAVEFORMAT input_format = { - .major_type = WG_MAJOR_TYPE_AUDIO_MPEG1, - .u.audio = - { - .layer = 2, - .channels = 1, - .rate = 44100, - }, + .wfx = {.wFormatTag = WAVE_FORMAT_MPEG, .nSamplesPerSec = 44100, .nChannels = 1, + .cbSize = sizeof(input_format) - sizeof(WAVEFORMATEX)}, + .fwHeadLayer = 2, }; - struct wg_transform_attrs attrs = {0}; - wg_transform_t transform; struct transform *object; HRESULT hr;
- transform = wg_transform_create(&input_format, &output_format, &attrs); - if (!transform) + if (FAILED(hr = check_audio_transform_support(&input_format.wfx, &output_format))) { ERR_(winediag)("GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins.\n"); - return E_FAIL; + return hr; } - wg_transform_destroy(transform);
hr = transform_create(outer, &CLSID_CMpegAudioCodec, &mpeg_audio_codec_transform_ops, &object); if (FAILED(hr)) @@ -1015,39 +1000,23 @@ static const struct transform_ops mpeg_layer3_decoder_transform_ops =
HRESULT mpeg_layer3_decoder_create(IUnknown *outer, IUnknown **out) { - static const struct wg_format output_format = + static const WAVEFORMATEX output_format = { - .major_type = WG_MAJOR_TYPE_AUDIO, - .u.audio = - { - .format = WG_AUDIO_FORMAT_S16LE, - .channel_mask = 1, - .channels = 1, - .rate = 44100, - }, + .wFormatTag = WAVE_FORMAT_PCM, .wBitsPerSample = 16, .nSamplesPerSec = 44100, .nChannels = 1, }; - static const struct wg_format input_format = + static const MPEGLAYER3WAVEFORMAT input_format = { - .major_type = WG_MAJOR_TYPE_AUDIO_MPEG1, - .u.audio = - { - .layer = 3, - .channels = 1, - .rate = 44100, - }, + .wfx = {.wFormatTag = WAVE_FORMAT_MPEGLAYER3, .nSamplesPerSec = 44100, .nChannels = 1, + .cbSize = sizeof(input_format) - sizeof(WAVEFORMATEX)}, }; - struct wg_transform_attrs attrs = {0}; - wg_transform_t transform; struct transform *object; HRESULT hr;
- transform = wg_transform_create(&input_format, &output_format, &attrs); - if (!transform) + if (FAILED(hr = check_audio_transform_support(&input_format.wfx, &output_format))) { - ERR_(winediag)("GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins.\n"); - return E_FAIL; + ERR_(winediag)("GStreamer doesn't support MP3 audio decoding, please install appropriate plugins.\n"); + return hr; } - wg_transform_destroy(transform);
hr = transform_create(outer, &CLSID_mpeg_layer3_decoder, &mpeg_layer3_decoder_transform_ops, &object); if (FAILED(hr)) diff --git a/dlls/winegstreamer/resampler.c b/dlls/winegstreamer/resampler.c index 12da0d35c8e..8df7eb32649 100644 --- a/dlls/winegstreamer/resampler.c +++ b/dlls/winegstreamer/resampler.c @@ -908,41 +908,24 @@ static const IWMResamplerPropsVtbl resampler_props_vtbl =
HRESULT resampler_create(IUnknown *outer, IUnknown **out) { - static const struct wg_format input_format = + static const WAVEFORMATEX output_format = { - .major_type = WG_MAJOR_TYPE_AUDIO, - .u.audio = - { - .format = WG_AUDIO_FORMAT_S16LE, - .channel_mask = 1, - .channels = 1, - .rate = 44100, - }, + .wFormatTag = WAVE_FORMAT_IEEE_FLOAT, .wBitsPerSample = 32, .nSamplesPerSec = 44100, .nChannels = 1, }; - static const struct wg_format output_format = + static const WAVEFORMATEX input_format = { - .major_type = WG_MAJOR_TYPE_AUDIO, - .u.audio = - { - .format = WG_AUDIO_FORMAT_F32LE, - .channel_mask = 1, - .channels = 1, - .rate = 44100, - }, + .wFormatTag = WAVE_FORMAT_PCM, .wBitsPerSample = 16, .nSamplesPerSec = 44100, .nChannels = 1, }; - struct wg_transform_attrs attrs = {0}; - wg_transform_t transform; struct resampler *impl; HRESULT hr;
TRACE("outer %p, out %p.\n", outer, out);
- if (!(transform = wg_transform_create(&input_format, &output_format, &attrs))) + if (FAILED(hr = check_audio_transform_support(&input_format, &output_format))) { ERR_(winediag)("GStreamer doesn't support audio resampling, please install appropriate plugins.\n"); - return E_FAIL; + return hr; } - wg_transform_destroy(transform);
if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY; diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c index ee128dd7905..15815f11374 100644 --- a/dlls/winegstreamer/wma_decoder.c +++ b/dlls/winegstreamer/wma_decoder.c @@ -1026,31 +1026,25 @@ static const IPropertyBagVtbl property_bag_vtbl =
HRESULT wma_decoder_create(IUnknown *outer, IUnknown **out) { - static const struct wg_format output_format = + static const WAVEFORMATEX output_format = { - .major_type = WG_MAJOR_TYPE_AUDIO, - .u.audio = - { - .format = WG_AUDIO_FORMAT_F32LE, - .channel_mask = 1, - .channels = 1, - .rate = 44100, - }, + .wFormatTag = WAVE_FORMAT_IEEE_FLOAT, .wBitsPerSample = 32, .nSamplesPerSec = 44100, .nChannels = 1, + }; + static const WMAUDIO2WAVEFORMAT input_format = + { + .wfx = {.wFormatTag = WAVE_FORMAT_WMAUDIO2, .nSamplesPerSec = 44100, .nChannels = 1, + .cbSize = sizeof(input_format) - sizeof(WAVEFORMATEX)}, }; - static const struct wg_format input_format = {.major_type = WG_MAJOR_TYPE_AUDIO_WMA}; - struct wg_transform_attrs attrs = {0}; - wg_transform_t transform; struct wma_decoder *decoder; HRESULT hr;
TRACE("outer %p, out %p.\n", outer, out);
- if (!(transform = wg_transform_create(&input_format, &output_format, &attrs))) + if (FAILED(hr = check_audio_transform_support(&input_format.wfx, &output_format))) { - ERR_(winediag)("GStreamer doesn't support WMA decoding, please install appropriate plugins\n"); - return E_FAIL; + ERR_(winediag)("GStreamer doesn't support WMA decoding, please install appropriate plugins.\n"); + return hr; } - wg_transform_destroy(transform);
if (!(decoder = calloc(1, sizeof(*decoder)))) return E_OUTOFMEMORY;