mfmediaengine: Keep engine extension pointer.
This commit is contained in:
parent
5617d78f0d
commit
b5d4394913
3 changed files with 162 additions and 3 deletions
|
@ -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 *)¬ify->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(¬ify->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);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue