From: Giovanni Mascellani Subject: Re: [PATCH 5/5] winegstreamer: Stub implement WMA decoder IMFTransform. Message-Id: <10ece0c8-a667-53b4-55e7-fd12c6ec16b5@codeweavers.com> Date: Fri, 21 Jan 2022 13:29:47 +0100 In-Reply-To: <20220120104152.2236851-5-rbernon@codeweavers.com> References: <20220120104152.2236851-1-rbernon@codeweavers.com> <20220120104152.2236851-5-rbernon@codeweavers.com> Signed-off-by: Giovanni Mascellani Il 20/01/22 11:41, Rémi Bernon ha scritto: > Signed-off-by: Rémi Bernon > --- > > Note: As we build FAudio without asserts, this only triggers dbgstr > output each time the transform is used, when WMA is played, > instead of failing the initialization. > > dlls/winegstreamer/wma_decoder.c | 245 ++++++++++++++++++++++++++++++- > 1 file changed, 243 insertions(+), 2 deletions(-) > > diff --git a/dlls/winegstreamer/wma_decoder.c b/dlls/winegstreamer/wma_decoder.c > index 1280d7b1efb..c939691c123 100644 > --- a/dlls/winegstreamer/wma_decoder.c > +++ b/dlls/winegstreamer/wma_decoder.c > @@ -23,14 +23,255 @@ > #include "mferror.h" > #include "mfobjects.h" > #include "mftransform.h" > +#include "wmcodecdsp.h" > > #include "wine/debug.h" > #include "wine/heap.h" > > WINE_DEFAULT_DEBUG_CHANNEL(mfplat); > > -HRESULT wma_decoder_create(REFIID riid, void **ret) > +struct wma_decoder > { > - FIXME("riid %s, ret %p stub!\n", debugstr_guid(riid), ret); > + IMFTransform IMFTransform_iface; > + LONG refcount; > +}; > + > +static struct wma_decoder *impl_from_IMFTransform(IMFTransform *iface) > +{ > + return CONTAINING_RECORD(iface, struct wma_decoder, IMFTransform_iface); > +} > + > +static HRESULT WINAPI wma_decoder_QueryInterface(IMFTransform *iface, REFIID iid, void **out) > +{ > + struct wma_decoder *decoder = impl_from_IMFTransform(iface); > + > + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out); > + > + if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IMFTransform)) > + *out = &decoder->IMFTransform_iface; > + else > + { > + *out = NULL; > + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid)); > + return E_NOINTERFACE; > + } > + > + IUnknown_AddRef((IUnknown *)*out); > + return S_OK; > +} > + > +static ULONG WINAPI wma_decoder_AddRef(IMFTransform *iface) > +{ > + struct wma_decoder *decoder = impl_from_IMFTransform(iface); > + ULONG refcount = InterlockedIncrement(&decoder->refcount); > + > + TRACE("iface %p increasing refcount to %u.\n", decoder, refcount); > + > + return refcount; > +} > + > +static ULONG WINAPI wma_decoder_Release(IMFTransform *iface) > +{ > + struct wma_decoder *decoder = impl_from_IMFTransform(iface); > + ULONG refcount = InterlockedDecrement(&decoder->refcount); > + > + TRACE("iface %p decreasing refcount to %u.\n", decoder, refcount); > + > + if (!refcount) > + free(decoder); > + > + return refcount; > +} > + > +static HRESULT WINAPI wma_decoder_GetStreamLimits(IMFTransform *iface, DWORD *input_minimum, > + DWORD *input_maximum, DWORD *output_minimum, DWORD *output_maximum) > +{ > + FIXME("iface %p, input_minimum %p, input_maximum %p, output_minimum %p, output_maximum %p stub!\n", > + iface, input_minimum, input_maximum, output_minimum, output_maximum); > return E_NOTIMPL; > } > + > +static HRESULT WINAPI wma_decoder_GetStreamCount(IMFTransform *iface, DWORD *inputs, DWORD *outputs) > +{ > + FIXME("iface %p, inputs %p, outputs %p stub!\n", iface, inputs, outputs); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetStreamIDs(IMFTransform *iface, DWORD input_size, DWORD *inputs, > + DWORD output_size, DWORD *outputs) > +{ > + FIXME("iface %p, input_size %u, inputs %p, output_size %u, outputs %p stub!\n", iface, > + input_size, inputs, output_size, outputs); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetInputStreamInfo(IMFTransform *iface, DWORD id, MFT_INPUT_STREAM_INFO *info) > +{ > + FIXME("iface %p, id %u, info %p stub!\n", iface, id, info); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetOutputStreamInfo(IMFTransform *iface, DWORD id, MFT_OUTPUT_STREAM_INFO *info) > +{ > + FIXME("iface %p, id %u, info %p stub!\n", iface, id, info); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetAttributes(IMFTransform *iface, IMFAttributes **attributes) > +{ > + FIXME("iface %p, attributes %p stub!\n", iface, attributes); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetInputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) > +{ > + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetOutputStreamAttributes(IMFTransform *iface, DWORD id, IMFAttributes **attributes) > +{ > + FIXME("iface %p, id %u, attributes %p stub!\n", iface, id, attributes); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_DeleteInputStream(IMFTransform *iface, DWORD id) > +{ > + FIXME("iface %p, id %u stub!\n", iface, id); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_AddInputStreams(IMFTransform *iface, DWORD streams, DWORD *ids) > +{ > + FIXME("iface %p, streams %u, ids %p stub!\n", iface, streams, ids); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetInputAvailableType(IMFTransform *iface, DWORD id, DWORD index, > + IMFMediaType **type) > +{ > + FIXME("iface %p, id %u, index %u, type %p stub!\n", iface, id, index, type); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetOutputAvailableType(IMFTransform *iface, DWORD id, DWORD index, > + IMFMediaType **type) > +{ > + FIXME("iface %p, id %u, index %u, type %p stub!\n", iface, id, index, type); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_SetInputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) > +{ > + FIXME("iface %p, id %u, type %p, flags %#x stub!\n", iface, id, type, flags); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags) > +{ > + FIXME("iface %p, id %u, type %p, flags %#x stub!\n", iface, id, type, flags); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetInputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) > +{ > + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetOutputCurrentType(IMFTransform *iface, DWORD id, IMFMediaType **type) > +{ > + FIXME("iface %p, id %u, type %p stub!\n", iface, id, type); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetInputStatus(IMFTransform *iface, DWORD id, DWORD *flags) > +{ > + FIXME("iface %p, id %u, flags %p stub!\n", iface, id, flags); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_GetOutputStatus(IMFTransform *iface, DWORD *flags) > +{ > + FIXME("iface %p, flags %p stub!\n", iface, flags); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_SetOutputBounds(IMFTransform *iface, LONGLONG lower, LONGLONG upper) > +{ > + FIXME("iface %p, lower %s, upper %s stub!\n", iface, wine_dbgstr_longlong(lower), > + wine_dbgstr_longlong(upper)); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_ProcessEvent(IMFTransform *iface, DWORD id, IMFMediaEvent *event) > +{ > + FIXME("iface %p, id %u, event %p stub!\n", iface, id, event); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param) > +{ > + FIXME("iface %p, message %#x, param %p stub!\n", iface, message, (void *)param); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_ProcessInput(IMFTransform *iface, DWORD id, IMFSample *sample, DWORD flags) > +{ > + FIXME("iface %p, id %u, sample %p, flags %#x stub!\n", iface, id, sample, flags); > + return E_NOTIMPL; > +} > + > +static HRESULT WINAPI wma_decoder_ProcessOutput(IMFTransform *iface, DWORD flags, DWORD count, > + MFT_OUTPUT_DATA_BUFFER *samples, DWORD *status) > +{ > + FIXME("iface %p, flags %#x, count %u, samples %p, status %p stub!\n", iface, flags, count, samples, status); > + return E_NOTIMPL; > +} > + > +static const IMFTransformVtbl wma_decoder_vtbl = > +{ > + wma_decoder_QueryInterface, > + wma_decoder_AddRef, > + wma_decoder_Release, > + wma_decoder_GetStreamLimits, > + wma_decoder_GetStreamCount, > + wma_decoder_GetStreamIDs, > + wma_decoder_GetInputStreamInfo, > + wma_decoder_GetOutputStreamInfo, > + wma_decoder_GetAttributes, > + wma_decoder_GetInputStreamAttributes, > + wma_decoder_GetOutputStreamAttributes, > + wma_decoder_DeleteInputStream, > + wma_decoder_AddInputStreams, > + wma_decoder_GetInputAvailableType, > + wma_decoder_GetOutputAvailableType, > + wma_decoder_SetInputType, > + wma_decoder_SetOutputType, > + wma_decoder_GetInputCurrentType, > + wma_decoder_GetOutputCurrentType, > + wma_decoder_GetInputStatus, > + wma_decoder_GetOutputStatus, > + wma_decoder_SetOutputBounds, > + wma_decoder_ProcessEvent, > + wma_decoder_ProcessMessage, > + wma_decoder_ProcessInput, > + wma_decoder_ProcessOutput, > +}; > + > +HRESULT wma_decoder_create(REFIID riid, void **ret) > +{ > + struct wma_decoder *decoder; > + > + TRACE("riid %s, ret %p.\n", debugstr_guid(riid), ret); > + > + if (!(decoder = calloc(1, sizeof(*decoder)))) > + return E_OUTOFMEMORY; > + > + decoder->IMFTransform_iface.lpVtbl = &wma_decoder_vtbl; > + decoder->refcount = 1; > + > + *ret = &decoder->IMFTransform_iface; > + TRACE("Created decoder %p\n", *ret); > + return S_OK; > +}