Commit 9bf8fdaa authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

mfmediaengine: Implement SetSourceFromByteStream().

parent a805782f
...@@ -1202,10 +1202,10 @@ static void media_engine_start_playback(struct media_engine *engine) ...@@ -1202,10 +1202,10 @@ static void media_engine_start_playback(struct media_engine *engine)
static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
{ {
struct media_engine *engine = impl_from_load_handler_IMFAsyncCallback(iface); struct media_engine *engine = impl_from_load_handler_IMFAsyncCallback(iface);
IUnknown *object = NULL, *state;
unsigned int start_playback; unsigned int start_playback;
MF_OBJECT_TYPE obj_type; MF_OBJECT_TYPE obj_type;
IMFMediaSource *source; IMFMediaSource *source;
IUnknown *object = NULL;
HRESULT hr; HRESULT hr;
EnterCriticalSection(&engine->cs); EnterCriticalSection(&engine->cs);
...@@ -1216,7 +1216,15 @@ static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface, ...@@ -1216,7 +1216,15 @@ static HRESULT WINAPI media_engine_load_handler_Invoke(IMFAsyncCallback *iface,
start_playback = engine->flags & FLAGS_ENGINE_PLAY_PENDING; start_playback = engine->flags & FLAGS_ENGINE_PLAY_PENDING;
media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING | FLAGS_ENGINE_PLAY_PENDING, FALSE); media_engine_set_flag(engine, FLAGS_ENGINE_SOURCE_PENDING | FLAGS_ENGINE_PLAY_PENDING, FALSE);
if (FAILED(hr = IMFSourceResolver_EndCreateObjectFromURL(engine->resolver, result, &obj_type, &object))) if (SUCCEEDED(IMFAsyncResult_GetState(result, &state)))
{
hr = IMFSourceResolver_EndCreateObjectFromByteStream(engine->resolver, result, &obj_type, &object);
IUnknown_Release(state);
}
else
hr = IMFSourceResolver_EndCreateObjectFromURL(engine->resolver, result, &obj_type, &object);
if (FAILED(hr))
WARN("Failed to create source object, hr %#x.\n", hr); WARN("Failed to create source object, hr %#x.\n", hr);
if (object) if (object)
...@@ -1384,19 +1392,12 @@ static HRESULT WINAPI media_engine_SetSourceElements(IMFMediaEngineEx *iface, IM ...@@ -1384,19 +1392,12 @@ static HRESULT WINAPI media_engine_SetSourceElements(IMFMediaEngineEx *iface, IM
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT WINAPI media_engine_SetSource(IMFMediaEngineEx *iface, BSTR url) static HRESULT media_engine_set_source(struct media_engine *engine, IMFByteStream *bytestream, BSTR url)
{ {
struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); IPropertyStore *props = NULL;
unsigned int flags;
HRESULT hr = S_OK; HRESULT hr = S_OK;
TRACE("%p, %s.\n", iface, debugstr_w(url));
EnterCriticalSection(&engine->cs);
if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
hr = MF_E_SHUTDOWN;
else
{
SysFreeString(engine->current_source); SysFreeString(engine->current_source);
engine->current_source = NULL; engine->current_source = NULL;
if (url) if (url)
...@@ -1408,17 +1409,18 @@ static HRESULT WINAPI media_engine_SetSource(IMFMediaEngineEx *iface, BSTR url) ...@@ -1408,17 +1409,18 @@ static HRESULT WINAPI media_engine_SetSource(IMFMediaEngineEx *iface, BSTR url)
engine->network_state = MF_MEDIA_ENGINE_NETWORK_NO_SOURCE; engine->network_state = MF_MEDIA_ENGINE_NETWORK_NO_SOURCE;
if (url) if (url || bytestream)
{ {
IPropertyStore *props = NULL;
unsigned int flags;
flags = MF_RESOLUTION_MEDIASOURCE; flags = MF_RESOLUTION_MEDIASOURCE;
if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS) if (engine->flags & MF_MEDIA_ENGINE_DISABLE_LOCAL_PLUGINS)
flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS; flags |= MF_RESOLUTION_DISABLE_LOCAL_PLUGINS;
IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE, IMFAttributes_GetUnknown(engine->attributes, &MF_MEDIA_ENGINE_SOURCE_RESOLVER_CONFIG_STORE,
&IID_IPropertyStore, (void **)&props); &IID_IPropertyStore, (void **)&props);
if (bytestream)
hr = IMFSourceResolver_BeginCreateObjectFromByteStream(engine->resolver, bytestream, url, flags,
props, NULL, &engine->load_handler, (IUnknown *)bytestream);
else
hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL, hr = IMFSourceResolver_BeginCreateObjectFromURL(engine->resolver, url, flags, props, NULL,
&engine->load_handler, NULL); &engine->load_handler, NULL);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
...@@ -1427,7 +1429,23 @@ static HRESULT WINAPI media_engine_SetSource(IMFMediaEngineEx *iface, BSTR url) ...@@ -1427,7 +1429,23 @@ static HRESULT WINAPI media_engine_SetSource(IMFMediaEngineEx *iface, BSTR url)
if (props) if (props)
IPropertyStore_Release(props); IPropertyStore_Release(props);
} }
}
return hr;
}
static HRESULT WINAPI media_engine_SetSource(IMFMediaEngineEx *iface, BSTR url)
{
struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
HRESULT hr;
TRACE("%p, %s.\n", iface, debugstr_w(url));
EnterCriticalSection(&engine->cs);
if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
hr = MF_E_SHUTDOWN;
else
hr = media_engine_set_source(engine, NULL, url);
LeaveCriticalSection(&engine->cs); LeaveCriticalSection(&engine->cs);
...@@ -2257,9 +2275,23 @@ static HRESULT WINAPI media_engine_OnVideoStreamTick(IMFMediaEngineEx *iface, LO ...@@ -2257,9 +2275,23 @@ static HRESULT WINAPI media_engine_OnVideoStreamTick(IMFMediaEngineEx *iface, LO
static HRESULT WINAPI media_engine_SetSourceFromByteStream(IMFMediaEngineEx *iface, IMFByteStream *bytestream, BSTR url) static HRESULT WINAPI media_engine_SetSourceFromByteStream(IMFMediaEngineEx *iface, IMFByteStream *bytestream, BSTR url)
{ {
FIXME("%p, %p, %s stub.\n", iface, bytestream, debugstr_w(url)); struct media_engine *engine = impl_from_IMFMediaEngineEx(iface);
HRESULT hr;
return E_NOTIMPL; TRACE("%p, %p, %s.\n", iface, bytestream, debugstr_w(url));
EnterCriticalSection(&engine->cs);
if (engine->flags & FLAGS_ENGINE_SHUT_DOWN)
hr = MF_E_SHUTDOWN;
else if (!bytestream || !url)
hr = E_POINTER;
else
hr = media_engine_set_source(engine, bytestream, url);
LeaveCriticalSection(&engine->cs);
return hr;
} }
static HRESULT WINAPI media_engine_GetStatistics(IMFMediaEngineEx *iface, MF_MEDIA_ENGINE_STATISTIC stat_id, PROPVARIANT *stat) static HRESULT WINAPI media_engine_GetStatistics(IMFMediaEngineEx *iface, MF_MEDIA_ENGINE_STATISTIC stat_id, PROPVARIANT *stat)
......
...@@ -165,6 +165,20 @@ static IMFMediaEngine *create_media_engine(IMFMediaEngineNotify *callback) ...@@ -165,6 +165,20 @@ static IMFMediaEngine *create_media_engine(IMFMediaEngineNotify *callback)
return media_engine; return media_engine;
} }
static IMFMediaEngineEx *create_media_engine_ex(IMFMediaEngineNotify *callback)
{
IMFMediaEngine *engine = create_media_engine(callback);
IMFMediaEngineEx *engine_ex = NULL;
if (engine)
{
IMFMediaEngine_QueryInterface(engine, &IID_IMFMediaEngineEx, (void **)&engine_ex);
IMFMediaEngine_Release(engine);
}
return engine_ex;
}
static void test_factory(void) static void test_factory(void)
{ {
IMFMediaEngineClassFactory *factory, *factory2; IMFMediaEngineClassFactory *factory, *factory2;
...@@ -279,6 +293,7 @@ static void test_CreateInstance(void) ...@@ -279,6 +293,7 @@ static void test_CreateInstance(void)
static void test_Shutdown(void) static void test_Shutdown(void)
{ {
struct media_engine_notify *notify; struct media_engine_notify *notify;
IMFMediaEngineEx *media_engine_ex;
IMFMediaTimeRange *time_range; IMFMediaTimeRange *time_range;
IMFMediaEngine *media_engine; IMFMediaEngine *media_engine;
unsigned int state; unsigned int state;
...@@ -428,6 +443,14 @@ todo_wine ...@@ -428,6 +443,14 @@ todo_wine
hr = IMFMediaEngine_GetVideoAspectRatio(media_engine, &cx, &cy); hr = IMFMediaEngine_GetVideoAspectRatio(media_engine, &cx, &cy);
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
if (SUCCEEDED(IMFMediaEngine_QueryInterface(media_engine, &IID_IMFMediaEngineEx, (void **)&media_engine_ex)))
{
hr = IMFMediaEngineEx_SetSourceFromByteStream(media_engine_ex, NULL, NULL);
ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr);
IMFMediaEngineEx_Release(media_engine_ex);
}
IMFMediaEngine_Release(media_engine); IMFMediaEngine_Release(media_engine);
IMFMediaEngineNotify_Release(&notify->IMFMediaEngineNotify_iface); IMFMediaEngineNotify_Release(&notify->IMFMediaEngineNotify_iface);
} }
...@@ -754,6 +777,29 @@ todo_wine { ...@@ -754,6 +777,29 @@ todo_wine {
IMFMediaTimeRange_Release(range); IMFMediaTimeRange_Release(range);
} }
static void test_SetSourceFromByteStream(void)
{
struct media_engine_notify *notify;
IMFMediaEngineEx *media_engine;
HRESULT hr;
notify = create_callback();
media_engine = create_media_engine_ex(&notify->IMFMediaEngineNotify_iface);
if (!media_engine)
{
win_skip("IMFMediaEngineEx is not supported.\n");
IMFMediaEngineNotify_Release(&notify->IMFMediaEngineNotify_iface);
return;
}
hr = IMFMediaEngineEx_SetSourceFromByteStream(media_engine, NULL, NULL);
ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
IMFMediaEngineEx_Release(media_engine);
IMFMediaEngineNotify_Release(&notify->IMFMediaEngineNotify_iface);
}
START_TEST(mfmediaengine) START_TEST(mfmediaengine)
{ {
HRESULT hr; HRESULT hr;
...@@ -782,6 +828,7 @@ START_TEST(mfmediaengine) ...@@ -782,6 +828,7 @@ START_TEST(mfmediaengine)
test_mute(); test_mute();
test_error(); test_error();
test_time_range(); test_time_range();
test_SetSourceFromByteStream();
IMFMediaEngineClassFactory_Release(factory); IMFMediaEngineClassFactory_Release(factory);
......
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