Zebediah Figura : winegstreamer: Handle MPEG-1 audio formats in amt_to_wg_format().
Alexandre Julliard
julliard at winehq.org
Wed Feb 10 15:34:00 CST 2021
Module: wine
Branch: master
Commit: dfeafc74171f116282a4535d4794438bad686771
URL: https://source.winehq.org/git/wine.git/?a=commit;h=dfeafc74171f116282a4535d4794438bad686771
Author: Zebediah Figura <z.figura12 at 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 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list