Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 31aee0209f6..4a7d85348d7 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -141,6 +141,10 @@ struct media_engine IMFSourceResolver *resolver; BSTR current_source; struct + { + IMFMediaSource *source; + } presentation; + struct { LONGLONG pts; SIZE size; @@ -1071,6 +1075,16 @@ static HRESULT media_engine_create_video_renderer(struct media_engine *engine, I return hr; }
+static void media_engine_clear_presentation(struct media_engine *engine) +{ + if (engine->presentation.source) + { + IMFMediaSource_Shutdown(engine->presentation.source); + IMFMediaSource_Release(engine->presentation.source); + } + memset(&engine->presentation, 0, sizeof(engine->presentation)); +} + static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMediaSource *source) { IMFStreamDescriptor *sd_audio = NULL, *sd_video = NULL; @@ -1081,6 +1095,7 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi HRESULT hr;
media_engine_release_video_frame_resources(engine); + media_engine_clear_presentation(engine);
if (FAILED(hr = IMFMediaSource_CreatePresentationDescriptor(source, &pd))) return hr; @@ -1134,6 +1149,9 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi return E_UNEXPECTED; }
+ engine->presentation.source = source; + IMFMediaSource_AddRef(engine->presentation.source); + media_engine_set_flag(engine, FLAGS_ENGINE_HAS_VIDEO, !!sd_video); media_engine_set_flag(engine, FLAGS_ENGINE_HAS_AUDIO, !!sd_audio);
@@ -1340,6 +1358,7 @@ static void free_media_engine(struct media_engine *engine) if (engine->resolver) IMFSourceResolver_Release(engine->resolver); media_engine_release_video_frame_resources(engine); + media_engine_clear_presentation(engine); if (engine->device_manager) { IMFDXGIDeviceManager_CloseDeviceHandle(engine->device_manager, engine->device_handle); @@ -2086,6 +2105,7 @@ static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngineEx *iface) else { media_engine_set_flag(engine, FLAGS_ENGINE_SHUT_DOWN, TRUE); + media_engine_clear_presentation(engine); IMFMediaSession_Shutdown(engine->session); } LeaveCriticalSection(&engine->cs);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 14 ++++++++++++-- dlls/mfmediaengine/tests/mfmediaengine.c | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 4a7d85348d7..a78cc130657 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -2453,9 +2453,19 @@ static HRESULT WINAPI media_engine_FrameStep(IMFMediaEngineEx *iface, BOOL forwa
static HRESULT WINAPI media_engine_GetResourceCharacteristics(IMFMediaEngineEx *iface, DWORD *flags) { - FIXME("%p, %p stub.\n", iface, flags); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr = E_FAIL;
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, flags); + + EnterCriticalSection(&engine->cs); + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else if (engine->presentation.source) + hr = IMFMediaSource_GetCharacteristics(engine->presentation.source, flags); + LeaveCriticalSection(&engine->cs); + + return hr; }
static HRESULT WINAPI media_engine_GetPresentationAttribute(IMFMediaEngineEx *iface, REFGUID attribute, diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index f67b6512db7..f05f24b7172 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -295,9 +295,9 @@ static void test_Shutdown(void) IMFMediaEngineEx *media_engine_ex; IMFMediaTimeRange *time_range; IMFMediaEngine *media_engine; + DWORD flags, cx, cy; unsigned int state; UINT32 value; - DWORD cx, cy; double val; HRESULT hr; BSTR str; @@ -451,6 +451,12 @@ static void test_Shutdown(void) hr = IMFMediaEngineEx_SetAudioEndpointRole(media_engine_ex, eConsole); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine_ex, NULL); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine_ex, &flags); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + IMFMediaEngineEx_Release(media_engine_ex); }
@@ -863,6 +869,7 @@ static void test_SetSourceFromByteStream(void) { struct media_engine_notify *notify; IMFMediaEngineEx *media_engine; + DWORD flags; HRESULT hr;
notify = create_callback(); @@ -878,6 +885,12 @@ static void test_SetSourceFromByteStream(void) hr = IMFMediaEngineEx_SetSourceFromByteStream(media_engine, NULL, NULL); ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine, NULL); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine, &flags); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + IMFMediaEngineEx_Release(media_engine); IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 31 ++++++++++++++++--- dlls/mfmediaengine/tests/mfmediaengine.c | 38 +++++++++++++++++++++++- 2 files changed, 64 insertions(+), 5 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index a78cc130657..01ce8cd6437 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1169,6 +1169,9 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi IMFTopologyNode *sar_node = NULL, *audio_src = NULL; IMFTopologyNode *grabber_node = NULL, *video_src = NULL;
+ if (engine->flags & MF_MEDIA_ENGINE_REAL_TIME_MODE) + IMFTopology_SetUINT32(topology, &MF_LOW_LATENCY, TRUE); + if (sd_audio) { if (FAILED(hr = media_engine_create_source_node(source, pd, sd_audio, &audio_src))) @@ -2695,16 +2698,36 @@ static HRESULT WINAPI media_engine_SetAudioEndpointRole(IMFMediaEngineEx *iface,
static HRESULT WINAPI media_engine_GetRealTimeMode(IMFMediaEngineEx *iface, BOOL *enabled) { - FIXME("%p, %p stub.\n", iface, enabled); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr = S_OK;
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, enabled); + + EnterCriticalSection(&engine->cs); + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else + *enabled = !!(engine->flags & MF_MEDIA_ENGINE_REAL_TIME_MODE); + LeaveCriticalSection(&engine->cs); + + return hr; }
static HRESULT WINAPI media_engine_SetRealTimeMode(IMFMediaEngineEx *iface, BOOL enable) { - FIXME("%p, %d stub.\n", iface, enable); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr = S_OK;
- return E_NOTIMPL; + TRACE("%p, %d.\n", iface, enable); + + EnterCriticalSection(&engine->cs); + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else + media_engine_set_flag(engine, MF_MEDIA_ENGINE_REAL_TIME_MODE, enable); + LeaveCriticalSection(&engine->cs); + + return hr; }
static HRESULT WINAPI media_engine_SetCurrentTimeEx(IMFMediaEngineEx *iface, double seektime, MF_MEDIA_ENGINE_SEEK_MODE mode) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index f05f24b7172..e4d9d752f20 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -240,12 +240,14 @@ static void test_factory(void) static void test_CreateInstance(void) { struct media_engine_notify *notify; + IMFMediaEngineEx *media_engine_ex; IMFDXGIDeviceManager *manager; IMFMediaEngine *media_engine; IMFAttributes *attributes; IUnknown *unk; UINT token; HRESULT hr; + BOOL ret;
notify = create_callback();
@@ -273,7 +275,8 @@ static void test_CreateInstance(void) hr = IMFAttributes_SetUINT32(attributes, &MF_MEDIA_ENGINE_VIDEO_OUTPUT_FORMAT, DXGI_FORMAT_UNKNOWN); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); + hr = IMFMediaEngineClassFactory_CreateInstance(factory, MF_MEDIA_ENGINE_REAL_TIME_MODE + | MF_MEDIA_ENGINE_WAITFORSTABLE_STATE, attributes, &media_engine); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
check_interface(media_engine, &IID_IMFMediaEngine, TRUE); @@ -283,6 +286,29 @@ static void test_CreateInstance(void) if (SUCCEEDED(hr)) IUnknown_Release(unk);
+ if (SUCCEEDED(IMFMediaEngine_QueryInterface(media_engine, &IID_IMFMediaEngineEx, (void **)&media_engine_ex))) + { + hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(ret, "Unexpected value.\n"); + + hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, FALSE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!ret, "Unexpected value.\n"); + + hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(ret, "Unexpected value.\n"); + + IMFMediaEngineEx_Release(media_engine_ex); + } + IMFMediaEngine_Release(media_engine); IMFAttributes_Release(attributes); IMFDXGIDeviceManager_Release(manager); @@ -301,6 +327,7 @@ static void test_Shutdown(void) double val; HRESULT hr; BSTR str; + BOOL ret;
notify = create_callback();
@@ -457,6 +484,15 @@ static void test_Shutdown(void) hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine_ex, &flags); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, NULL); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaEngineEx_GetRealTimeMode(media_engine_ex, &ret); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + + hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + IMFMediaEngineEx_Release(media_engine_ex); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 23 +++++++++++++++++++---- dlls/mfmediaengine/tests/mfmediaengine.c | 8 ++++++++ 2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 01ce8cd6437..bb338a4423f 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -143,6 +143,7 @@ struct media_engine struct { IMFMediaSource *source; + IMFPresentationDescriptor *pd; } presentation; struct { @@ -1079,9 +1080,11 @@ static void media_engine_clear_presentation(struct media_engine *engine) { if (engine->presentation.source) { - IMFMediaSource_Shutdown(engine->presentation.source); - IMFMediaSource_Release(engine->presentation.source); + IMFMediaSource_Shutdown(engine->presentation.source); + IMFMediaSource_Release(engine->presentation.source); } + if (engine->presentation.pd) + IMFPresentationDescriptor_Release(engine->presentation.pd); memset(&engine->presentation, 0, sizeof(engine->presentation)); }
@@ -1151,6 +1154,8 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi
engine->presentation.source = source; IMFMediaSource_AddRef(engine->presentation.source); + engine->presentation.pd = pd; + IMFPresentationDescriptor_AddRef(engine->presentation.pd);
media_engine_set_flag(engine, FLAGS_ENGINE_HAS_VIDEO, !!sd_video); media_engine_set_flag(engine, FLAGS_ENGINE_HAS_AUDIO, !!sd_audio); @@ -2474,9 +2479,19 @@ static HRESULT WINAPI media_engine_GetResourceCharacteristics(IMFMediaEngineEx * static HRESULT WINAPI media_engine_GetPresentationAttribute(IMFMediaEngineEx *iface, REFGUID attribute, PROPVARIANT *value) { - FIXME("%p, %s, %p stub.\n", iface, debugstr_guid(attribute), value); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + HRESULT hr = E_FAIL;
- return E_NOTIMPL; + TRACE("%p, %s, %p.\n", iface, debugstr_guid(attribute), value); + + EnterCriticalSection(&engine->cs); + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else if (engine->presentation.pd) + hr = IMFPresentationDescriptor_GetItem(engine->presentation.pd, attribute, value); + LeaveCriticalSection(&engine->cs); + + return hr; }
static HRESULT WINAPI media_engine_GetNumberOfStreams(IMFMediaEngineEx *iface, DWORD *stream_count) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index e4d9d752f20..0eaf614fc66 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -321,6 +321,7 @@ static void test_Shutdown(void) IMFMediaEngineEx *media_engine_ex; IMFMediaTimeRange *time_range; IMFMediaEngine *media_engine; + PROPVARIANT propvar; DWORD flags, cx, cy; unsigned int state; UINT32 value; @@ -493,6 +494,9 @@ static void test_Shutdown(void) hr = IMFMediaEngineEx_SetRealTimeMode(media_engine_ex, TRUE); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine_ex, &MF_PD_DURATION, &propvar); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + IMFMediaEngineEx_Release(media_engine_ex); }
@@ -905,6 +909,7 @@ static void test_SetSourceFromByteStream(void) { struct media_engine_notify *notify; IMFMediaEngineEx *media_engine; + PROPVARIANT propvar; DWORD flags; HRESULT hr;
@@ -927,6 +932,9 @@ static void test_SetSourceFromByteStream(void) hr = IMFMediaEngineEx_GetResourceCharacteristics(media_engine, &flags); ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine, &MF_PD_DURATION, &propvar); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + IMFMediaEngineEx_Release(media_engine); IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 23 +++++++++++++++++++++-- dlls/mfmediaengine/tests/mfmediaengine.c | 6 ++++++ 2 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index bb338a4423f..a191448b69f 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -2504,9 +2504,28 @@ static HRESULT WINAPI media_engine_GetNumberOfStreams(IMFMediaEngineEx *iface, D static HRESULT WINAPI media_engine_GetStreamAttribute(IMFMediaEngineEx *iface, DWORD stream_index, REFGUID attribute, PROPVARIANT *value) { - FIXME("%p, %ld, %s, %p stub.\n", iface, stream_index, debugstr_guid(attribute), value); + struct media_engine *engine = impl_from_IMFMediaEngineEx(iface); + IMFStreamDescriptor *sd; + HRESULT hr = E_FAIL; + BOOL selected;
- return E_NOTIMPL; + TRACE("%p, %ld, %s, %p.\n", iface, stream_index, debugstr_guid(attribute), value); + + EnterCriticalSection(&engine->cs); + if (engine->flags & FLAGS_ENGINE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else if (engine->presentation.pd) + { + if (SUCCEEDED(hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(engine->presentation.pd, + stream_index, &selected, &sd))) + { + hr = IMFStreamDescriptor_GetItem(sd, attribute, value); + IMFStreamDescriptor_Release(sd); + } + } + LeaveCriticalSection(&engine->cs); + + return hr; }
static HRESULT WINAPI media_engine_GetStreamSelection(IMFMediaEngineEx *iface, DWORD stream_index, BOOL *enabled) diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 0eaf614fc66..ea2f570d721 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -497,6 +497,9 @@ static void test_Shutdown(void) hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine_ex, &MF_PD_DURATION, &propvar); ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaEngineEx_GetStreamAttribute(media_engine_ex, 0, &MF_SD_PROTECTED, &propvar); + ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#lx.\n", hr); + IMFMediaEngineEx_Release(media_engine_ex); }
@@ -935,6 +938,9 @@ static void test_SetSourceFromByteStream(void) hr = IMFMediaEngineEx_GetPresentationAttribute(media_engine, &MF_PD_DURATION, &propvar); ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr);
+ hr = IMFMediaEngineEx_GetStreamAttribute(media_engine, 0, &MF_SD_PROTECTED, &propvar); + ok(hr == E_FAIL, "Unexpected hr %#lx.\n", hr); + IMFMediaEngineEx_Release(media_engine); IMFMediaEngineNotify_Release(¬ify->IMFMediaEngineNotify_iface); }