Module: wine Branch: master Commit: dfeafc74171f116282a4535d4794438bad686771 URL: https://source.winehq.org/git/wine.git/?a=commit;h=dfeafc74171f116282a4535d4...
Author: Zebediah Figura z.figura12@gmail.com Date: Tue Feb 9 17:13:53 2021 -0600
winegstreamer: Handle MPEG-1 audio formats in amt_to_wg_format().
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winegstreamer/gstdemux.c | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 82801900a15..0389edc4c13 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -686,6 +686,57 @@ static bool amt_to_wg_format_audio(const AM_MEDIA_TYPE *mt, struct wg_format *fo return false; }
+static bool amt_to_wg_format_audio_mpeg1(const AM_MEDIA_TYPE *mt, struct wg_format *format) +{ + const MPEG1WAVEFORMAT *audio_format = (const MPEG1WAVEFORMAT *)mt->pbFormat; + + if (!IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx)) + { + FIXME("Unknown format type %s.\n", debugstr_guid(&mt->formattype)); + return false; + } + if (mt->cbFormat < sizeof(*audio_format) || !mt->pbFormat) + { + ERR("Unexpected format size %u.\n", mt->cbFormat); + return false; + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.channels = audio_format->wfx.nChannels; + format->u.audio.rate = audio_format->wfx.nSamplesPerSec; + if (audio_format->fwHeadLayer == 1) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER1; + else if (audio_format->fwHeadLayer == 2) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER2; + else if (audio_format->fwHeadLayer == 3) + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER3; + else + return false; + return true; +} + +static bool amt_to_wg_format_audio_mpeg1_layer3(const AM_MEDIA_TYPE *mt, struct wg_format *format) +{ + const MPEGLAYER3WAVEFORMAT *audio_format = (const MPEGLAYER3WAVEFORMAT *)mt->pbFormat; + + if (!IsEqualGUID(&mt->formattype, &FORMAT_WaveFormatEx)) + { + FIXME("Unknown format type %s.\n", debugstr_guid(&mt->formattype)); + return false; + } + if (mt->cbFormat < sizeof(*audio_format) || !mt->pbFormat) + { + ERR("Unexpected format size %u.\n", mt->cbFormat); + return false; + } + + format->major_type = WG_MAJOR_TYPE_AUDIO; + format->u.audio.channels = audio_format->wfx.nChannels; + format->u.audio.rate = audio_format->wfx.nSamplesPerSec; + format->u.audio.format = WG_AUDIO_FORMAT_MPEG1_LAYER3; + return true; +} + static bool amt_to_wg_format_video(const AM_MEDIA_TYPE *mt, struct wg_format *format) { static const struct @@ -750,7 +801,13 @@ static bool amt_to_wg_format(const AM_MEDIA_TYPE *mt, struct wg_format *format) if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Video)) return amt_to_wg_format_video(mt, format); if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Audio)) + { + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MPEG1AudioPayload)) + return amt_to_wg_format_audio_mpeg1(mt, format); + if (IsEqualGUID(&mt->subtype, &MEDIASUBTYPE_MP3)) + return amt_to_wg_format_audio_mpeg1_layer3(mt, format); return amt_to_wg_format_audio(mt, format); + }
FIXME("Unknown major type %s.\n", debugstr_guid(&mt->majortype)); return false;