Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58717 Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
-- v2: mf: Implement MFTranscodeGetAudioOutputAvailableTypes().
From: Nikolay Sivov nsivov@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=58717 Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/main.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++ dlls/mf/mf.spec | 2 +- include/mfidl.idl | 2 ++ 3 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/main.c b/dlls/mf/main.c index e74a4ae8e4c..537db3174cf 100644 --- a/dlls/mf/main.c +++ b/dlls/mf/main.c @@ -1071,3 +1071,65 @@ HRESULT WINAPI MFCreateFMPEG4MediaSink(IMFByteStream *stream, IMFMediaType *vide
return create_media_sink(&CLSID_MFFMPEG4SinkClassFactory, stream, video_type, audio_type, sink); } + +/******************************************************************************* + * MFTranscodeGetAudioOutputAvailableTypes (mf.@) + */ +HRESULT WINAPI MFTranscodeGetAudioOutputAvailableTypes(REFGUID subtype, DWORD flags, + IMFAttributes *config, IMFCollection **ret) +{ + IMFCollection *media_types = NULL; + MFT_REGISTER_TYPE_INFO output; + IMFTransform *encoder = NULL; + IMFMediaType *media_type; + IMFActivate **transforms; + UINT32 i, count; + DWORD index; + HRESULT hr; + + TRACE("%s, %#lx, %p, %p.\n", debugstr_guid(subtype), flags, config, ret); + + if (config) + FIXME("Ignoring configuration attributes.\n"); + + output.guidMajorType = MFMediaType_Audio; + output.guidSubtype = *subtype; + if (FAILED(hr = MFTEnumEx(MFT_CATEGORY_AUDIO_ENCODER, flags, NULL, &output, &transforms, &count))) + return hr; + + if (!count) + return MF_E_TRANSCODE_NO_MATCHING_ENCODER; + + hr = MFCreateCollection(&media_types); + + if (SUCCEEDED(hr)) + hr = IMFActivate_ActivateObject(transforms[0], &IID_IMFTransform, (void **)&encoder); + + if (encoder) + { + index = 0; + while (IMFTransform_GetOutputAvailableType(encoder, 0, index++, &media_type) == S_OK) + { + hr = IMFCollection_AddElement(media_types, (IUnknown *)media_type); + IMFMediaType_Release(media_type); + if (FAILED(hr)) break; + } + + MFShutdownObject((IUnknown *)encoder); + IMFTransform_Release(encoder); + } + + if (SUCCEEDED(hr)) + { + *ret = media_types; + IMFCollection_AddRef(*ret); + } + + for (i = 0; i < count; ++i) + IMFActivate_Release(transforms[i]); + CoTaskMemFree(transforms); + if (media_types) + IMFCollection_Release(media_types); + + return hr; +} diff --git a/dlls/mf/mf.spec b/dlls/mf/mf.spec index 9477cdda61e..de607f1d322 100644 --- a/dlls/mf/mf.spec +++ b/dlls/mf/mf.spec @@ -82,5 +82,5 @@ @ stub MFReadSequencerSegmentOffset @ stdcall MFRequireProtectedEnvironment(ptr) @ stdcall MFShutdownObject(ptr) -@ stub MFTranscodeGetAudioOutputAvailableTypes +@ stdcall MFTranscodeGetAudioOutputAvailableTypes(ptr long ptr ptr) @ stub MergePropertyStore diff --git a/include/mfidl.idl b/include/mfidl.idl index 666af53c6e3..23bfeb532b7 100644 --- a/include/mfidl.idl +++ b/include/mfidl.idl @@ -737,6 +737,8 @@ cpp_quote("HRESULT WINAPI MFGetTopoNodeCurrentType(IMFTopologyNode *node, DWORD cpp_quote("HRESULT WINAPI MFShutdownObject(IUnknown *object);") cpp_quote("HRESULT WINAPI MFCreateTrackedSample(IMFTrackedSample **sample);") cpp_quote("HRESULT WINAPI MFRequireProtectedEnvironment(IMFPresentationDescriptor *pd);") +cpp_quote("HRESULT WINAPI MFTranscodeGetAudioOutputAvailableTypes(REFGUID subtype, DWORD flags,") +cpp_quote(" IMFAttributes *config, IMFCollection **types);")
typedef enum _MFMEDIASOURCE_CHARACTERISTICS {