Commit b5d43949 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

mfmediaengine: Keep engine extension pointer.

parent 5617d78f
......@@ -158,6 +158,7 @@ struct media_engine
IMFMediaSession *session;
IMFPresentationClock *clock;
IMFSourceResolver *resolver;
IMFMediaEngineExtension *extension;
BSTR current_source;
struct
{
......@@ -1460,6 +1461,8 @@ static void free_media_engine(struct media_engine *engine)
IMFAttributes_Release(engine->attributes);
if (engine->resolver)
IMFSourceResolver_Release(engine->resolver);
if (engine->extension)
IMFMediaEngineExtension_Release(engine->extension);
media_engine_clear_effects(&engine->audio_effects);
media_engine_clear_effects(&engine->video_effects);
media_engine_release_video_frame_resources(engine);
......@@ -1559,6 +1562,9 @@ static HRESULT media_engine_set_source(struct media_engine *engine, IMFByteStrea
if (url || bytestream)
{
if (engine->extension)
FIXME("Use extension to load from.\n");
flags = MF_RESOLUTION_MEDIASOURCE | MF_RESOLUTION_CONTENT_DOES_NOT_HAVE_TO_MATCH_EXTENSION_OR_MIME_TYPE;
if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS)
flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS;
......@@ -3246,10 +3252,15 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct
engine->video_frame.pts = MINLONGLONG;
InitializeCriticalSection(&engine->cs);
hr = IMFAttributes_GetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, &IID_IMFMediaEngineNotify,
(void **)&engine->callback);
if (FAILED(hr))
if (FAILED(hr = IMFAttributes_GetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, &IID_IMFMediaEngineNotify,
(void **)&engine->callback)))
{
WARN("Notification callback was not provided.\n");
return hr;
}
IMFAttributes_GetUnknown(attributes, &MF_MEDIA_ENGINE_EXTENSION, &IID_IMFMediaEngineExtension,
(void **)&engine->extension);
IMFAttributes_GetUnknown(attributes, &MF_MEDIA_ENGINE_DXGI_MANAGER, &IID_IMFDXGIDeviceManager,
(void **)&engine->device_manager);
......
......@@ -2373,6 +2373,138 @@ done:
IMFByteStream_Release(stream);
}
struct test_extension
{
IMFMediaEngineExtension IMFMediaEngineExtension_iface;
LONG refcount;
};
static struct test_extension *impl_from_IMFMediaEngineExtension(IMFMediaEngineExtension *iface)
{
return CONTAINING_RECORD(iface, struct test_extension, IMFMediaEngineExtension_iface);
}
static HRESULT WINAPI test_extension_QI(IMFMediaEngineExtension *iface, REFIID riid, void **obj)
{
if (IsEqualIID(riid, &IID_IMFMediaEngineExtension) ||
IsEqualIID(riid, &IID_IUnknown))
{
*obj = iface;
IMFMediaEngineExtension_AddRef(iface);
return S_OK;
}
*obj = NULL;
return E_NOINTERFACE;
}
static ULONG WINAPI test_extension_AddRef(IMFMediaEngineExtension *iface)
{
struct test_extension *extension = impl_from_IMFMediaEngineExtension(iface);
return InterlockedIncrement(&extension->refcount);
}
static ULONG WINAPI test_extension_Release(IMFMediaEngineExtension *iface)
{
struct test_extension *extension = impl_from_IMFMediaEngineExtension(iface);
ULONG refcount = InterlockedDecrement(&extension->refcount);
if (!refcount)
free(extension);
return refcount;
}
static HRESULT WINAPI test_extension_CanPlayType(IMFMediaEngineExtension *iface,
BOOL audio_only, BSTR mime_type, MF_MEDIA_ENGINE_CANPLAY *answer)
{
return 0x80001234;
}
static HRESULT WINAPI test_extension_BeginCreateObject(IMFMediaEngineExtension *iface,
BSTR url, IMFByteStream *bytestream, MF_OBJECT_TYPE type, IUnknown **cancel_cookie,
IMFAsyncCallback *callback, IUnknown *state)
{
return E_NOTIMPL;
}
static HRESULT WINAPI test_extension_CancelObjectCreation(IMFMediaEngineExtension *iface,
IUnknown *cancel_cookie)
{
return E_NOTIMPL;
}
static HRESULT WINAPI test_extension_EndCreateObject(IMFMediaEngineExtension *iface, IMFAsyncResult *result,
IUnknown **object)
{
return E_NOTIMPL;
}
static const IMFMediaEngineExtensionVtbl test_extension_vtbl =
{
test_extension_QI,
test_extension_AddRef,
test_extension_Release,
test_extension_CanPlayType,
test_extension_BeginCreateObject,
test_extension_CancelObjectCreation,
test_extension_EndCreateObject,
};
static struct test_extension *create_extension(void)
{
struct test_extension *object;
object = calloc(1, sizeof(*object));
object->IMFMediaEngineExtension_iface.lpVtbl = &test_extension_vtbl;
object->refcount = 1;
return object;
}
static void test_media_extension(void)
{
struct media_engine_notify *notify;
struct test_extension *extension;
MF_MEDIA_ENGINE_CANPLAY answer;
IMFMediaEngine *media_engine;
IMFAttributes *attributes;
HRESULT hr;
BSTR mime;
notify = create_callback();
hr = MFCreateAttributes(&attributes, 3);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
extension = create_extension();
ok(!!extension, "Failed to create an extension.\n");
hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_CALLBACK, (IUnknown *)&notify->IMFMediaEngineNotify_iface);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFAttributes_SetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, DXGI_FORMAT_UNKNOWN);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFAttributes_SetUnknown(attributes, &MF_MEDIA_ENGINE_EXTENSION, (IUnknown *)&extension->IMFMediaEngineExtension_iface);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_AUDIOONLY, attributes, &media_engine);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
IMFAttributes_Release(attributes);
mime = SysAllocString(L"doesnotexist");
hr = IMFMediaEngine_CanPlayType(media_engine, mime, &answer);
todo_wine
ok(hr == 0x80001234, "Unexpected hr %#lx.\n", hr);
SysFreeString(mime);
IMFMediaEngine_Release(media_engine);
IMFMediaEngineNotify_Release(&notify->IMFMediaEngineNotify_iface);
IMFMediaEngineExtension_Release(&extension->IMFMediaEngineExtension_iface);
}
START_TEST(mfmediaengine)
{
HRESULT hr;
......@@ -2407,6 +2539,7 @@ START_TEST(mfmediaengine)
test_effect();
test_GetDuration();
test_GetSeekable();
test_media_extension();
IMFMediaEngineClassFactory_Release(factory);
......
......@@ -365,3 +365,18 @@ interface IMFMediaEngineAudioEndpointId : IUnknown
HRESULT SetAudioEndpointId([in] LPCWSTR id);
HRESULT GetAudioEndpointId([out] LPWSTR *id);
}
[
object,
uuid(2f69d622-20b5-41e9-afdf-89ced1dda04e),
local,
pointer_default(unique)
]
interface IMFMediaEngineExtension : IUnknown
{
HRESULT CanPlayType([in] BOOL audio_only, [in] BSTR mime_type, [out] MF_MEDIA_ENGINE_CANPLAY *answer);
HRESULT BeginCreateObject([in] BSTR url, [in] IMFByteStream *bytestream, [in] MF_OBJECT_TYPE type,
[out] IUnknown **cancel_cookie, [in] IMFAsyncCallback *callback, [in] IUnknown *state);
HRESULT CancelObjectCreation([in] IUnknown *cancel_cookie);
HRESULT EndCreateObject([in] IMFAsyncResult *result, [out] IUnknown **object);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment