From: Rémi Bernon <rbernon(a)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;
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/5558