Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/tests/mf.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 8272064466f..34090d0a9d4 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -1154,7 +1154,6 @@ static void test_session_events(IMFMediaSession *session) static void test_media_session(void) { IMFRateControl *rate_control, *rate_control2; - IMFLocalMFTRegistration *local_reg; MFCLOCK_PROPERTIES clock_props; IMFRateSupport *rate_support; IMFAttributes *attributes; @@ -1163,7 +1162,6 @@ static void test_media_session(void) IMFShutdown *shutdown; PROPVARIANT propvar; DWORD status, caps; - IMFGetService *gs; IMFClock *clock; IUnknown *unk; HRESULT hr; @@ -1176,23 +1174,19 @@ static void test_media_session(void) hr = MFCreateMediaSession(NULL, &session); ok(hr == S_OK, "Failed to create media session, hr %#x.\n", hr);
- hr = IMFMediaSession_QueryInterface(session, &IID_IMFAttributes, (void **)&unk); - ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr); + check_interface(session, &IID_IMFGetService, TRUE); + check_interface(session, &IID_IMFAttributes, FALSE);
- hr = IMFMediaSession_QueryInterface(session, &IID_IMFGetService, (void **)&gs); - ok(hr == S_OK, "Failed to get interface, hr %#x.\n", hr); - - hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void **)&rate_support); + hr = MFGetService((IUnknown *)session, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void **)&rate_support); ok(hr == S_OK, "Failed to get rate support interface, hr %#x.\n", hr);
- hr = IMFGetService_GetService(gs, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, (void **)&rate_control); + hr = MFGetService((IUnknown *)session, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateControl, (void **)&rate_control); ok(hr == S_OK, "Failed to get rate control interface, hr %#x.\n", hr);
- hr = IMFGetService_GetService(gs, &MF_LOCAL_MFT_REGISTRATION_SERVICE, &IID_IMFLocalMFTRegistration, - (void **)&local_reg); + hr = MFGetService((IUnknown *)session, &MF_LOCAL_MFT_REGISTRATION_SERVICE, &IID_IMFLocalMFTRegistration, (void **)&unk); ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* Vista */, "Failed to get registration service, hr %#x.\n", hr); if (SUCCEEDED(hr)) - IMFLocalMFTRegistration_Release(local_reg); + IUnknown_Release(unk);
hr = IMFRateSupport_QueryInterface(rate_support, &IID_IMFMediaSession, (void **)&unk); ok(hr == S_OK, "Failed to get session interface, hr %#x.\n", hr); @@ -1220,6 +1214,8 @@ static void test_media_session(void) hr = IMFMediaSession_GetClock(session, &clock); ok(hr == S_OK, "Failed to get clock, hr %#x.\n", hr);
+ check_interface(clock, &IID_IMFPresentationClock, TRUE); + hr = IMFClock_QueryInterface(clock, &IID_IMFRateControl, (void **)&rate_control2); ok(hr == S_OK, "Failed to get rate control, hr %#x.\n", hr);
@@ -1241,8 +1237,6 @@ todo_wine IMFRateControl_Release(rate_control); IMFRateSupport_Release(rate_support);
- IMFGetService_Release(gs); - IMFMediaSession_Release(session);
hr = MFCreateMediaSession(NULL, &session);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 6f6811ff9ea..2bf7cf45da1 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -126,7 +126,7 @@ struct media_engine MF_MEDIA_ENGINE_READY ready_state; MF_MEDIA_ENGINE_PRELOAD preload; IMFMediaSession *session; - IMFClock *clock; + IMFPresentationClock *clock; IMFSourceResolver *resolver; BSTR current_source; struct video_frame video_frame; @@ -982,7 +982,7 @@ static void free_media_engine(struct media_engine *engine) if (engine->callback) IMFMediaEngineNotify_Release(engine->callback); if (engine->clock) - IMFClock_Release(engine->clock); + IMFPresentationClock_Release(engine->clock); if (engine->session) IMFMediaSession_Release(engine->session); if (engine->attributes) @@ -1208,16 +1208,14 @@ static BOOL WINAPI media_engine_IsSeeking(IMFMediaEngine *iface) static double WINAPI media_engine_GetCurrentTime(IMFMediaEngine *iface) { struct media_engine *engine = impl_from_IMFMediaEngine(iface); - LONGLONG clocktime; double ret = 0.0; - MFTIME systime; + MFTIME clocktime;
TRACE("%p.\n", iface);
EnterCriticalSection(&engine->cs); - if (SUCCEEDED(IMFClock_GetCorrelatedTime(engine->clock, 0, &clocktime, &systime))) + if (SUCCEEDED(IMFPresentationClock_GetTime(engine->clock, &clocktime))) { - /* Assume 100ns clock. */ ret = (double)clocktime / 10000000.0; } LeaveCriticalSection(&engine->cs); @@ -1854,6 +1852,7 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct { DXGI_FORMAT output_format; UINT64 playback_hwnd; + IMFClock *clock; HRESULT hr;
engine->IMFMediaEngine_iface.lpVtbl = &media_engine_vtbl; @@ -1877,7 +1876,12 @@ static HRESULT init_media_engine(DWORD flags, IMFAttributes *attributes, struct if (FAILED(hr = MFCreateMediaSession(NULL, &engine->session))) return hr;
- if (FAILED(hr = IMFMediaSession_GetClock(engine->session, &engine->clock))) + if (FAILED(hr = IMFMediaSession_GetClock(engine->session, &clock))) + return hr; + + hr = IMFClock_QueryInterface(clock, &IID_IMFPresentationClock, (void **)&engine->clock); + IMFClock_Release(clock); + if (FAILED(hr)) return hr;
if (FAILED(hr = IMFMediaSession_BeginGetEvent(engine->session, &engine->session_events, NULL)))
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 2bf7cf45da1..f9872f43a3b 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -822,10 +822,8 @@ static HRESULT media_engine_create_topology(struct media_engine *engine, IMFMedi return E_UNEXPECTED; }
- if (sd_video) - engine->flags |= FLAGS_ENGINE_HAS_VIDEO; - if (sd_audio) - engine->flags |= FLAGS_ENGINE_HAS_AUDIO; + media_engine_set_flag(engine, FLAGS_ENGINE_HAS_VIDEO, !!sd_video); + media_engine_set_flag(engine, FLAGS_ENGINE_HAS_AUDIO, !!sd_audio);
/* Assume live source if duration was not provided. */ if (SUCCEEDED(IMFPresentationDescriptor_GetUINT64(pd, &MF_PD_DURATION, &duration))) @@ -1421,13 +1419,13 @@ static HRESULT WINAPI media_engine_Play(IMFMediaEngine *iface)
if (!(engine->flags & FLAGS_ENGINE_WAITING)) { - engine->flags &= ~FLAGS_ENGINE_PAUSED; + media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, FALSE); IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PLAY, 0, 0);
var.vt = VT_EMPTY; IMFMediaSession_Start(engine->session, &GUID_NULL, &var);
- engine->flags |= FLAGS_ENGINE_WAITING; + media_engine_set_flag(engine, FLAGS_ENGINE_WAITING, TRUE); }
IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_WAITING, 0, 0); @@ -1447,8 +1445,8 @@ static HRESULT WINAPI media_engine_Pause(IMFMediaEngine *iface)
if (!(engine->flags & FLAGS_ENGINE_PAUSED)) { - engine->flags &= ~FLAGS_ENGINE_WAITING; - engine->flags |= FLAGS_ENGINE_PAUSED; + media_engine_set_flag(engine, FLAGS_ENGINE_WAITING, FALSE); + media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, TRUE);
IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_TIMEUPDATE, 0, 0); IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PAUSE, 0, 0); @@ -1623,7 +1621,7 @@ static HRESULT WINAPI media_engine_Shutdown(IMFMediaEngine *iface) hr = MF_E_SHUTDOWN; else { - engine->flags |= FLAGS_ENGINE_SHUT_DOWN; + media_engine_set_flag(engine, FLAGS_ENGINE_SHUT_DOWN, TRUE); IMFMediaSession_Shutdown(engine->session); } LeaveCriticalSection(&engine->cs); @@ -1794,7 +1792,7 @@ static HRESULT WINAPI media_engine_grabber_callback_OnProcessSample(IMFSampleGra if (!(engine->flags & FLAGS_ENGINE_FIRST_FRAME)) { IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_FIRSTFRAMEREADY, 0, 0); - engine->flags |= FLAGS_ENGINE_FIRST_FRAME; + media_engine_set_flag(engine, FLAGS_ENGINE_FIRST_FRAME, TRUE); } engine->video_frame.pts = sample_time;
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index f9872f43a3b..42aa8a6e92a 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -96,6 +96,7 @@ enum media_engine_flags FLAGS_ENGINE_HAS_AUDIO = 0x800, FLAGS_ENGINE_HAS_VIDEO = 0x1000, FLAGS_ENGINE_FIRST_FRAME = 0x2000, + FLAGS_ENGINE_IS_ENDED = 0x4000, };
struct video_frame @@ -634,6 +635,7 @@ static HRESULT WINAPI media_engine_session_events_Invoke(IMFAsyncCallback *iface
EnterCriticalSection(&engine->cs); media_engine_set_flag(engine, FLAGS_ENGINE_FIRST_FRAME, FALSE); + media_engine_set_flag(engine, FLAGS_ENGINE_IS_ENDED, TRUE); engine->video_frame.pts = MINLONGLONG; LeaveCriticalSection(&engine->cs);
@@ -1347,9 +1349,16 @@ static HRESULT WINAPI media_engine_GetSeekable(IMFMediaEngine *iface, IMFMediaTi
static BOOL WINAPI media_engine_IsEnded(IMFMediaEngine *iface) { - FIXME("(%p): stub.\n", iface); + struct media_engine *engine = impl_from_IMFMediaEngine(iface); + BOOL value;
- return FALSE; + TRACE("%p.\n", iface); + + EnterCriticalSection(&engine->cs); + value = !!(engine->flags & FLAGS_ENGINE_IS_ENDED); + LeaveCriticalSection(&engine->cs); + + return value; }
static BOOL WINAPI media_engine_GetAutoPlay(IMFMediaEngine *iface) @@ -1419,7 +1428,7 @@ static HRESULT WINAPI media_engine_Play(IMFMediaEngine *iface)
if (!(engine->flags & FLAGS_ENGINE_WAITING)) { - media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, FALSE); + media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED | FLAGS_ENGINE_IS_ENDED, FALSE); IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_PLAY, 0, 0);
var.vt = VT_EMPTY; @@ -1445,7 +1454,7 @@ static HRESULT WINAPI media_engine_Pause(IMFMediaEngine *iface)
if (!(engine->flags & FLAGS_ENGINE_PAUSED)) { - media_engine_set_flag(engine, FLAGS_ENGINE_WAITING, FALSE); + media_engine_set_flag(engine, FLAGS_ENGINE_WAITING | FLAGS_ENGINE_IS_ENDED, FALSE); media_engine_set_flag(engine, FLAGS_ENGINE_PAUSED, TRUE);
IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_TIMEUPDATE, 0, 0);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 42aa8a6e92a..8c3b4f41229 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1214,7 +1214,11 @@ static double WINAPI media_engine_GetCurrentTime(IMFMediaEngine *iface) TRACE("%p.\n", iface);
EnterCriticalSection(&engine->cs); - if (SUCCEEDED(IMFPresentationClock_GetTime(engine->clock, &clocktime))) + if (engine->flags & FLAGS_ENGINE_IS_ENDED) + { + ret = engine->duration; + } + else if (SUCCEEDED(IMFPresentationClock_GetTime(engine->clock, &clocktime))) { ret = (double)clocktime / 10000000.0; }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mfmediaengine/main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 8c3b4f41229..65f207bd4b5 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -952,7 +952,7 @@ static const IMFAsyncCallbackVtbl media_engine_load_handler_vtbl =
static HRESULT WINAPI media_engine_QueryInterface(IMFMediaEngine *iface, REFIID riid, void **obj) { - TRACE("(%p, %s, %p).\n", iface, debugstr_guid(riid), obj); + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
if (IsEqualIID(riid, &IID_IMFMediaEngine) || IsEqualIID(riid, &IID_IUnknown)) @@ -972,7 +972,7 @@ static ULONG WINAPI media_engine_AddRef(IMFMediaEngine *iface) struct media_engine *engine = impl_from_IMFMediaEngine(iface); ULONG refcount = InterlockedIncrement(&engine->refcount);
- TRACE("(%p) ref=%u.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount);
return refcount; } @@ -999,7 +999,7 @@ static ULONG WINAPI media_engine_Release(IMFMediaEngine *iface) struct media_engine *engine = impl_from_IMFMediaEngine(iface); ULONG refcount = InterlockedDecrement(&engine->refcount);
- TRACE("(%p) ref=%u.\n", iface, refcount); + TRACE("%p, refcount %u.\n", iface, refcount);
if (!refcount) free_media_engine(engine); @@ -1978,7 +1978,7 @@ static IMFMediaEngineClassFactory media_engine_factory = { &media_engine_factory
static HRESULT WINAPI classfactory_QueryInterface(IClassFactory *iface, REFIID riid, void **obj) { - TRACE("(%s, %p).\n", debugstr_guid(riid), obj); + TRACE("%s, %p.\n", debugstr_guid(riid), obj);
if (IsEqualGUID(riid, &IID_IClassFactory) || IsEqualGUID(riid, &IID_IUnknown)) @@ -2005,7 +2005,7 @@ static ULONG WINAPI classfactory_Release(IClassFactory *iface)
static HRESULT WINAPI classfactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **obj) { - TRACE("(%p, %s, %p).\n", outer, debugstr_guid(riid), obj); + TRACE("%p, %s, %p.\n", outer, debugstr_guid(riid), obj);
*obj = NULL;
@@ -2034,7 +2034,7 @@ static IClassFactory classfactory = { &class_factory_vtbl };
HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void **obj) { - TRACE("(%s, %s, %p).\n", debugstr_guid(clsid), debugstr_guid(riid), obj); + TRACE("%s, %s, %p.\n", debugstr_guid(clsid), debugstr_guid(riid), obj);
if (IsEqualGUID(clsid, &CLSID_MFMediaEngineClassFactory)) return IClassFactory_QueryInterface(&classfactory, riid, obj);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/session.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++ dlls/mf/tests/mf.c | 9 ++++++++ 2 files changed, 66 insertions(+)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c index af0407f6a0b..5034255339c 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -213,6 +213,7 @@ struct media_session IMFGetService IMFGetService_iface; IMFRateSupport IMFRateSupport_iface; IMFRateControl IMFRateControl_iface; + IMFTopologyNodeAttributeEditor IMFTopologyNodeAttributeEditor_iface; IMFAsyncCallback commands_callback; IMFAsyncCallback events_callback; IMFAsyncCallback sink_finalizer_callback; @@ -362,6 +363,11 @@ static struct media_session *impl_session_from_IMFRateControl(IMFRateControl *if return CONTAINING_RECORD(iface, struct media_session, IMFRateControl_iface); }
+static struct media_session *impl_session_from_IMFTopologyNodeAttributeEditor(IMFTopologyNodeAttributeEditor *iface) +{ + return CONTAINING_RECORD(iface, struct media_session, IMFTopologyNodeAttributeEditor_iface); +} + static struct session_op *impl_op_from_IUnknown(IUnknown *iface) { return CONTAINING_RECORD(iface, struct session_op, IUnknown_iface); @@ -1999,6 +2005,10 @@ static HRESULT WINAPI session_get_service_GetService(IMFGetService *iface, REFGU { return IMFLocalMFTRegistration_QueryInterface(&local_mft_registration, riid, obj); } + else if (IsEqualGUID(service, &MF_TOPONODE_ATTRIBUTE_EDITOR_SERVICE)) + { + *obj = &session->IMFTopologyNodeAttributeEditor_iface; + } else if (IsEqualGUID(service, &MR_VIDEO_RENDER_SERVICE)) { IMFStreamSink *stream_sink; @@ -3566,6 +3576,52 @@ static const IMFRateControlVtbl session_rate_control_vtbl = session_rate_control_GetRate, };
+static HRESULT WINAPI node_attribute_editor_QueryInterface(IMFTopologyNodeAttributeEditor *iface, + REFIID riid, void **obj) +{ + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); + + if (IsEqualIID(riid, &IID_IMFTopologyNodeAttributeEditor) || + IsEqualIID(riid, &IID_IUnknown)) + { + *obj = iface; + IMFTopologyNodeAttributeEditor_AddRef(iface); + return S_OK; + } + + WARN("Unsupported interface %s.\n", debugstr_guid(riid)); + *obj = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI node_attribute_editor_AddRef(IMFTopologyNodeAttributeEditor *iface) +{ + struct media_session *session = impl_session_from_IMFTopologyNodeAttributeEditor(iface); + return IMFMediaSession_AddRef(&session->IMFMediaSession_iface); +} + +static ULONG WINAPI node_attribute_editor_Release(IMFTopologyNodeAttributeEditor *iface) +{ + struct media_session *session = impl_session_from_IMFTopologyNodeAttributeEditor(iface); + return IMFMediaSession_Release(&session->IMFMediaSession_iface); +} + +static HRESULT WINAPI node_attribute_editor_UpdateNodeAttributes(IMFTopologyNodeAttributeEditor *iface, + TOPOID id, DWORD count, MFTOPONODE_ATTRIBUTE_UPDATE *updates) +{ + FIXME("%p, %s, %u, %p.\n", iface, wine_dbgstr_longlong(id), count, updates); + + return E_NOTIMPL; +} + +static const IMFTopologyNodeAttributeEditorVtbl node_attribute_editor_vtbl = +{ + node_attribute_editor_QueryInterface, + node_attribute_editor_AddRef, + node_attribute_editor_Release, + node_attribute_editor_UpdateNodeAttributes, +}; + /*********************************************************************** * MFCreateMediaSession (mf.@) */ @@ -3585,6 +3641,7 @@ HRESULT WINAPI MFCreateMediaSession(IMFAttributes *config, IMFMediaSession **ses object->IMFGetService_iface.lpVtbl = &session_get_service_vtbl; object->IMFRateSupport_iface.lpVtbl = &session_rate_support_vtbl; object->IMFRateControl_iface.lpVtbl = &session_rate_control_vtbl; + object->IMFTopologyNodeAttributeEditor_iface.lpVtbl = &node_attribute_editor_vtbl; object->commands_callback.lpVtbl = &session_commands_callback_vtbl; object->events_callback.lpVtbl = &session_events_callback_vtbl; object->sink_finalizer_callback.lpVtbl = &session_sink_finalizer_callback_vtbl; diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 34090d0a9d4..846d311c877 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -1176,6 +1176,15 @@ static void test_media_session(void)
check_interface(session, &IID_IMFGetService, TRUE); check_interface(session, &IID_IMFAttributes, FALSE); + check_interface(session, &IID_IMFTopologyNodeAttributeEditor, FALSE); + + hr = MFGetService((IUnknown *)session, &MF_TOPONODE_ATTRIBUTE_EDITOR_SERVICE, &IID_IMFTopologyNodeAttributeEditor, + (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + check_interface(unk, &IID_IMFMediaSession, FALSE); + + IUnknown_Release(unk);
hr = MFGetService((IUnknown *)session, &MF_RATE_CONTROL_SERVICE, &IID_IMFRateSupport, (void **)&rate_support); ok(hr == S_OK, "Failed to get rate support interface, hr %#x.\n", hr);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=84733
Your paranoid android.
=== wvistau64 (64 bit report) ===
mf: mf: Timeout
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=84726
Your paranoid android.
=== wvistau64 (64 bit report) ===
mf: mf: Timeout