This intentionally leaves quartz_transform aside as we don't support MF media type conversion for MPEG1 video yet. I have plans to implement it later, but through some media type conversion factorization.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/aac_decoder.c | 18 ++++-------------- dlls/winegstreamer/color_convert.c | 18 ++++-------------- dlls/winegstreamer/gst_private.h | 2 ++ dlls/winegstreamer/main.c | 18 ++++++++++++++++++ dlls/winegstreamer/resampler.c | 18 ++++-------------- dlls/winegstreamer/video_decoder.c | 22 ++++------------------ dlls/winegstreamer/video_processor.c | 18 ++++-------------- 7 files changed, 40 insertions(+), 74 deletions(-)
diff --git a/dlls/winegstreamer/aac_decoder.c b/dlls/winegstreamer/aac_decoder.c index 5844de33ceb..8e5d76f516a 100644 --- a/dlls/winegstreamer/aac_decoder.c +++ b/dlls/winegstreamer/aac_decoder.c @@ -73,25 +73,15 @@ static struct aac_decoder *impl_from_IMFTransform(IMFTransform *iface)
static HRESULT try_create_wg_transform(struct aac_decoder *decoder) { - struct wg_format input_format, output_format; struct wg_transform_attrs attrs = {0};
if (decoder->wg_transform) + { wg_transform_destroy(decoder->wg_transform); - decoder->wg_transform = 0; - - mf_media_type_to_wg_format(decoder->input_type, &input_format); - if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - mf_media_type_to_wg_format(decoder->output_type, &output_format); - if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - if (!(decoder->wg_transform = wg_transform_create(&input_format, &output_format, &attrs))) - return E_FAIL; + decoder->wg_transform = 0; + }
- return S_OK; + return wg_transform_create_mf(decoder->input_type, decoder->output_type, &attrs, &decoder->wg_transform); }
static HRESULT WINAPI transform_QueryInterface(IMFTransform *iface, REFIID iid, void **out) diff --git a/dlls/winegstreamer/color_convert.c b/dlls/winegstreamer/color_convert.c index 41e5bcf3b60..b5a1261b669 100644 --- a/dlls/winegstreamer/color_convert.c +++ b/dlls/winegstreamer/color_convert.c @@ -97,25 +97,15 @@ static inline struct color_convert *impl_from_IUnknown(IUnknown *iface)
static HRESULT try_create_wg_transform(struct color_convert *impl) { - struct wg_format input_format, output_format; struct wg_transform_attrs attrs = {0};
if (impl->wg_transform) + { wg_transform_destroy(impl->wg_transform); - impl->wg_transform = 0; - - mf_media_type_to_wg_format(impl->input_type, &input_format); - if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - mf_media_type_to_wg_format(impl->output_type, &output_format); - if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - if (!(impl->wg_transform = wg_transform_create(&input_format, &output_format, &attrs))) - return E_FAIL; + impl->wg_transform = 0; + }
- return S_OK; + return wg_transform_create_mf(impl->input_type, impl->output_type, &attrs, &impl->wg_transform); }
static HRESULT WINAPI unknown_QueryInterface(IUnknown *iface, REFIID iid, void **out) diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h index 92805818ff4..c594ab99f3f 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -83,6 +83,8 @@ void wg_parser_stream_seek(wg_parser_stream_t stream, double rate,
wg_transform_t wg_transform_create(const struct wg_format *input_format, const struct wg_format *output_format, const struct wg_transform_attrs *attrs); +HRESULT wg_transform_create_mf(IMFMediaType *input_type, IMFMediaType *output_type, + const struct wg_transform_attrs *attrs, wg_transform_t *transform); HRESULT wg_transform_create_quartz(const AM_MEDIA_TYPE *input_format, const AM_MEDIA_TYPE *output_format, const struct wg_transform_attrs *attrs, wg_transform_t *transform); void wg_transform_destroy(wg_transform_t transform); diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index 8c5ad931e83..03f8d658fe6 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -31,6 +31,7 @@ #include "dmoreg.h" #include "gst_guids.h" #include "wmcodecdsp.h" +#include "mferror.h"
WINE_DEFAULT_DEBUG_CHANNEL(quartz); WINE_DECLARE_DEBUG_CHANNEL(mfplat); @@ -357,6 +358,23 @@ wg_transform_t wg_transform_create(const struct wg_format *input_format, return params.transform; }
+HRESULT wg_transform_create_mf(IMFMediaType *input_type, IMFMediaType *output_type, + const struct wg_transform_attrs *attrs, wg_transform_t *transform) +{ + struct wg_format input_format, output_format; + + mf_media_type_to_wg_format(input_type, &input_format); + if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + mf_media_type_to_wg_format(output_type, &output_format); + if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) + return MF_E_INVALIDMEDIATYPE; + + if (!(*transform = wg_transform_create(&input_format, &output_format, attrs))) + return E_FAIL; + return S_OK; +} + HRESULT wg_transform_create_quartz(const AM_MEDIA_TYPE *input_type, const AM_MEDIA_TYPE *output_type, const struct wg_transform_attrs *attrs, wg_transform_t *transform) { diff --git a/dlls/winegstreamer/resampler.c b/dlls/winegstreamer/resampler.c index b5b62d58800..12da0d35c8e 100644 --- a/dlls/winegstreamer/resampler.c +++ b/dlls/winegstreamer/resampler.c @@ -56,25 +56,15 @@ struct resampler
static HRESULT try_create_wg_transform(struct resampler *impl) { - struct wg_format input_format, output_format; struct wg_transform_attrs attrs = {0};
if (impl->wg_transform) + { wg_transform_destroy(impl->wg_transform); - impl->wg_transform = 0; - - mf_media_type_to_wg_format(impl->input_type, &input_format); - if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - mf_media_type_to_wg_format(impl->output_type, &output_format); - if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - if (!(impl->wg_transform = wg_transform_create(&input_format, &output_format, &attrs))) - return E_FAIL; + impl->wg_transform = 0; + }
- return S_OK; + return wg_transform_create_mf(impl->input_type, impl->output_type, &attrs, &impl->wg_transform); }
static inline struct resampler *impl_from_IUnknown(IUnknown *iface) diff --git a/dlls/winegstreamer/video_decoder.c b/dlls/winegstreamer/video_decoder.c index 5b5d0ec6d97..d0ce9b407a8 100644 --- a/dlls/winegstreamer/video_decoder.c +++ b/dlls/winegstreamer/video_decoder.c @@ -245,32 +245,18 @@ static HRESULT try_create_wg_transform(struct video_decoder *decoder) * transform to be able to queue its input buffers. We need to use a buffer list * to match its expectations. */ - struct wg_format input_format; - struct wg_format output_format; UINT32 low_latency;
if (decoder->wg_transform) + { wg_transform_destroy(decoder->wg_transform); - decoder->wg_transform = 0; - - mf_media_type_to_wg_format(decoder->input_type, &input_format); - if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - mf_media_type_to_wg_format(decoder->output_type, &output_format); - if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; + decoder->wg_transform = 0; + }
if (SUCCEEDED(IMFAttributes_GetUINT32(decoder->attributes, &MF_LOW_LATENCY, &low_latency))) decoder->wg_transform_attrs.low_latency = !!low_latency;
- if (!(decoder->wg_transform = wg_transform_create(&input_format, &output_format, &decoder->wg_transform_attrs))) - { - ERR("Failed to create transform with input major_type %u.\n", input_format.major_type); - return E_FAIL; - } - - return S_OK; + return wg_transform_create_mf(decoder->input_type, decoder->output_type, &decoder->wg_transform_attrs, &decoder->wg_transform); }
static HRESULT create_output_media_type(struct video_decoder *decoder, const GUID *subtype, diff --git a/dlls/winegstreamer/video_processor.c b/dlls/winegstreamer/video_processor.c index cce077ae63b..6f0e5bdae11 100644 --- a/dlls/winegstreamer/video_processor.c +++ b/dlls/winegstreamer/video_processor.c @@ -87,25 +87,15 @@ struct video_processor
static HRESULT try_create_wg_transform(struct video_processor *impl) { - struct wg_format input_format, output_format; struct wg_transform_attrs attrs = {0};
if (impl->wg_transform) + { wg_transform_destroy(impl->wg_transform); - impl->wg_transform = 0; - - mf_media_type_to_wg_format(impl->input_type, &input_format); - if (input_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - mf_media_type_to_wg_format(impl->output_type, &output_format); - if (output_format.major_type == WG_MAJOR_TYPE_UNKNOWN) - return MF_E_INVALIDMEDIATYPE; - - if (!(impl->wg_transform = wg_transform_create(&input_format, &output_format, &attrs))) - return E_FAIL; + impl->wg_transform = 0; + }
- return S_OK; + return wg_transform_create_mf(impl->input_type, impl->output_type, &attrs, &impl->wg_transform); }
static struct video_processor *impl_from_IMFTransform(IMFTransform *iface)
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;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/color_convert.c | 31 ++++++---------- dlls/winegstreamer/gst_private.h | 1 + dlls/winegstreamer/main.c | 25 +++++++++++++ dlls/winegstreamer/video_decoder.c | 53 ++++++++++++---------------- dlls/winegstreamer/video_processor.c | 31 ++++++---------- 5 files changed, 68 insertions(+), 73 deletions(-)
diff --git a/dlls/winegstreamer/color_convert.c b/dlls/winegstreamer/color_convert.c index b5a1261b669..949b85943d0 100644 --- a/dlls/winegstreamer/color_convert.c +++ b/dlls/winegstreamer/color_convert.c @@ -907,39 +907,28 @@ static const IPropertyStoreVtbl property_store_vtbl =
HRESULT color_convert_create(IUnknown *outer, IUnknown **out) { - static const struct wg_format input_format = + const MFVIDEOFORMAT input_format = { - .major_type = WG_MAJOR_TYPE_VIDEO, - .u.video = - { - .format = WG_VIDEO_FORMAT_I420, - .width = 1920, - .height = 1080, - }, + .dwSize = sizeof(MFVIDEOFORMAT), + .videoInfo = {.dwWidth = 1920, .dwHeight = 1080}, + .guidFormat = MFVideoFormat_I420, }; - static const struct wg_format output_format = + const MFVIDEOFORMAT output_format = { - .major_type = WG_MAJOR_TYPE_VIDEO, - .u.video = - { - .format = WG_VIDEO_FORMAT_NV12, - .width = 1920, - .height = 1080, - }, + .dwSize = sizeof(MFVIDEOFORMAT), + .videoInfo = {.dwWidth = 1920, .dwHeight = 1080}, + .guidFormat = MFVideoFormat_NV12, }; - struct wg_transform_attrs attrs = {0}; - wg_transform_t transform; struct color_convert *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_video_transform_support(&input_format, &output_format))) { ERR_(winediag)("GStreamer doesn't support video conversion, 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/gst_private.h b/dlls/winegstreamer/gst_private.h index 91020e973ac..78b9c4c3aa0 100644 --- a/dlls/winegstreamer/gst_private.h +++ b/dlls/winegstreamer/gst_private.h @@ -96,6 +96,7 @@ 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 check_video_transform_support(const MFVIDEOFORMAT *input, const MFVIDEOFORMAT *output);
HRESULT wg_muxer_create(const char *format, wg_muxer_t *muxer); void wg_muxer_destroy(wg_muxer_t muxer); diff --git a/dlls/winegstreamer/main.c b/dlls/winegstreamer/main.c index 56c9fb04f0f..91397da8f69 100644 --- a/dlls/winegstreamer/main.c +++ b/dlls/winegstreamer/main.c @@ -661,6 +661,31 @@ HRESULT check_audio_transform_support(const WAVEFORMATEX *input, const WAVEFORMA return hr; }
+HRESULT check_video_transform_support(const MFVIDEOFORMAT *input, const MFVIDEOFORMAT *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 = MFInitMediaTypeFromMFVideoFormat(input_type, input, input->dwSize)) + && SUCCEEDED(hr = MFInitMediaTypeFromMFVideoFormat(output_type, output, output->dwSize)) + && 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/video_decoder.c b/dlls/winegstreamer/video_decoder.c index d0ce9b407a8..60eca8ba6bd 100644 --- a/dlls/winegstreamer/video_decoder.c +++ b/dlls/winegstreamer/video_decoder.c @@ -1530,30 +1530,27 @@ static const GUID *const h264_decoder_input_types[] =
HRESULT h264_decoder_create(REFIID riid, void **out) { - static const struct wg_format output_format = + const MFVIDEOFORMAT output_format = { - .major_type = WG_MAJOR_TYPE_VIDEO, - .u.video = - { - .format = WG_VIDEO_FORMAT_I420, - .width = 1920, - .height = 1080, - }, + .dwSize = sizeof(MFVIDEOFORMAT), + .videoInfo = {.dwWidth = 1920, .dwHeight = 1080}, + .guidFormat = MFVideoFormat_I420, + }; + const MFVIDEOFORMAT input_format = + { + .dwSize = sizeof(MFVIDEOFORMAT), + .guidFormat = MFVideoFormat_H264, }; - static const struct wg_format input_format = {.major_type = WG_MAJOR_TYPE_VIDEO_H264}; - struct wg_transform_attrs attrs = {0}; struct video_decoder *decoder; - wg_transform_t transform; HRESULT hr;
TRACE("riid %s, out %p.\n", debugstr_guid(riid), out);
- if (!(transform = wg_transform_create(&input_format, &output_format, &attrs))) + if (FAILED(hr = check_video_transform_support(&input_format, &output_format))) { ERR_(winediag)("GStreamer doesn't support H.264 decoding, please install appropriate plugins\n"); - return E_FAIL; + return hr; } - wg_transform_destroy(transform);
if (FAILED(hr = video_decoder_create_with_types(h264_decoder_input_types, ARRAY_SIZE(h264_decoder_input_types), video_decoder_output_types, ARRAY_SIZE(video_decoder_output_types), NULL, &decoder))) @@ -1652,34 +1649,28 @@ static const GUID *const wmv_decoder_output_types[] =
HRESULT wmv_decoder_create(IUnknown *outer, IUnknown **out) { - static const struct wg_format input_format = + const MFVIDEOFORMAT output_format = { - .major_type = WG_MAJOR_TYPE_VIDEO_WMV, - .u.video.format = WG_VIDEO_FORMAT_WMV3, + .dwSize = sizeof(MFVIDEOFORMAT), + .videoInfo = {.dwWidth = 1920, .dwHeight = 1080}, + .guidFormat = MFVideoFormat_I420, }; - static const struct wg_format output_format = + const MFVIDEOFORMAT input_format = { - .major_type = WG_MAJOR_TYPE_VIDEO, - .u.video = - { - .format = WG_VIDEO_FORMAT_NV12, - .width = 1920, - .height = 1080, - }, + .dwSize = sizeof(MFVIDEOFORMAT), + .videoInfo = {.dwWidth = 1920, .dwHeight = 1080}, + .guidFormat = MFVideoFormat_WMV3, }; - struct wg_transform_attrs attrs = {0}; struct video_decoder *decoder; - wg_transform_t transform; HRESULT hr;
TRACE("outer %p, out %p.\n", outer, out);
- if (!(transform = wg_transform_create(&input_format, &output_format, &attrs))) + if (FAILED(hr = check_video_transform_support(&input_format, &output_format))) { - ERR_(winediag)("GStreamer doesn't support WMV decoding, please install appropriate plugins.\n"); - return E_FAIL; + ERR_(winediag)("GStreamer doesn't support WMV decoding, please install appropriate plugins\n"); + return hr; } - wg_transform_destroy(transform);
if (FAILED(hr = video_decoder_create_with_types(wmv_decoder_input_types, ARRAY_SIZE(wmv_decoder_input_types), wmv_decoder_output_types, ARRAY_SIZE(wmv_decoder_output_types), outer, &decoder))) diff --git a/dlls/winegstreamer/video_processor.c b/dlls/winegstreamer/video_processor.c index 6f0e5bdae11..5b93bf08396 100644 --- a/dlls/winegstreamer/video_processor.c +++ b/dlls/winegstreamer/video_processor.c @@ -605,39 +605,28 @@ static const IMFTransformVtbl video_processor_vtbl =
HRESULT video_processor_create(REFIID riid, void **ret) { - static const struct wg_format input_format = + const MFVIDEOFORMAT input_format = { - .major_type = WG_MAJOR_TYPE_VIDEO, - .u.video = - { - .format = WG_VIDEO_FORMAT_I420, - .width = 1920, - .height = 1080, - }, + .dwSize = sizeof(MFVIDEOFORMAT), + .videoInfo = {.dwWidth = 1920, .dwHeight = 1080}, + .guidFormat = MFVideoFormat_I420, }; - static const struct wg_format output_format = + const MFVIDEOFORMAT output_format = { - .major_type = WG_MAJOR_TYPE_VIDEO, - .u.video = - { - .format = WG_VIDEO_FORMAT_NV12, - .width = 1920, - .height = 1080, - }, + .dwSize = sizeof(MFVIDEOFORMAT), + .videoInfo = {.dwWidth = 1920, .dwHeight = 1080}, + .guidFormat = MFVideoFormat_NV12, }; - struct wg_transform_attrs attrs = {0}; - wg_transform_t transform; struct video_processor *impl; 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_video_transform_support(&input_format, &output_format))) { ERR_(winediag)("GStreamer doesn't support video conversion, please install appropriate plugins.\n"); - return E_FAIL; + return hr; } - wg_transform_destroy(transform);
if (!(impl = calloc(1, sizeof(*impl)))) return E_OUTOFMEMORY;
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=145290
Your paranoid android.
=== debian11b (64 bit WoW report) ===
devenum: devenum.c:691: Test failed: Got hr 0xc00d36b4.
Report validation errors: devenum:devenum crashed (c0000005)
=== debian11b (build log) ===
0654:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 0654:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 0654:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 0654:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 0654:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0654:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0654:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 06b0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 06b0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 06b0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 01f0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 01f0:err:winediag:wma_decoder_create GStreamer doesn't support WMA decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09d0:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 0838:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 048c:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 0910:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 08ec:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 08ec:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 08ec:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 098c:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09a4:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 03e4:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 09a8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 021c:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 012c:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 098c:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 04b8:err:winediag:mpeg_audio_codec_create GStreamer doesn't support MPEG-1 audio decoding, please install appropriate plugins. 0bac:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 03f4:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 04dc:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins. 0384:err:winediag:mpeg_layer3_decoder_create GStreamer doesn't support MP3 audio decoding, please install appropriate plugins.