mf: Set presentation clock for all node types.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Nikolay Sivov 2020-03-18 16:57:38 +03:00 committed by Alexandre Julliard
parent 69885afbed
commit 92d6a8bf8f
1 changed files with 30 additions and 3 deletions

View File

@ -164,7 +164,7 @@ struct topo_node
enum presentation_flags
{
SESSION_FLAG_SOURCES_SUBSCRIBED = 0x1,
SESSION_FLAG_SINKS_SUBSCRIBED = 0x2,
SESSION_FLAG_PRESENTATION_CLOCK_SET = 0x2,
SESSION_FLAG_FINALIZE_SINKS = 0x4,
};
@ -1911,9 +1911,21 @@ static enum object_state session_get_object_state_for_event(MediaEventType event
}
}
static void session_set_consumed_clock(IUnknown *object, IMFPresentationClock *clock)
{
IMFClockConsumer *consumer;
if (SUCCEEDED(IUnknown_QueryInterface(object, &IID_IMFClockConsumer, (void **)&consumer)))
{
IMFClockConsumer_SetPresentationClock(consumer, clock);
IMFClockConsumer_Release(consumer);
}
}
static HRESULT session_start_clock(struct media_session *session)
{
IMFPresentationTimeSource *time_source = NULL;
struct media_source *source;
LONGLONG start_offset = 0;
struct media_sink *sink;
struct topo_node *node;
@ -1925,8 +1937,9 @@ static HRESULT session_start_clock(struct media_session *session)
IMFTransform_ProcessMessage(node->object.transform, MFT_MESSAGE_NOTIFY_START_OF_STREAM, 0);
}
if (!(session->presentation.flags & SESSION_FLAG_SINKS_SUBSCRIBED))
if (!(session->presentation.flags & SESSION_FLAG_PRESENTATION_CLOCK_SET))
{
/* Attempt to get time source from the sinks. */
LIST_FOR_EACH_ENTRY(sink, &session->presentation.sinks, struct media_sink, entry)
{
if (SUCCEEDED(IMFMediaSink_QueryInterface(sink->sink, &IID_IMFPresentationTimeSource,
@ -1957,6 +1970,12 @@ static HRESULT session_start_clock(struct media_session *session)
}
}
/* Set clock for all topology nodes. */
LIST_FOR_EACH_ENTRY(source, &session->presentation.sources, struct media_source, entry)
{
session_set_consumed_clock((IUnknown *)source->source, session->clock);
}
LIST_FOR_EACH_ENTRY(sink, &session->presentation.sinks, struct media_sink, entry)
{
if (sink->event_generator && FAILED(hr = IMFMediaEventGenerator_BeginGetEvent(sink->event_generator,
@ -1969,7 +1988,15 @@ static HRESULT session_start_clock(struct media_session *session)
WARN("Failed to set presentation clock for the sink, hr %#x.\n", hr);
}
session->presentation.flags |= SESSION_FLAG_SINKS_SUBSCRIBED;
LIST_FOR_EACH_ENTRY(node, &session->presentation.nodes, struct topo_node, entry)
{
if (node->type != MF_TOPOLOGY_TRANSFORM_NODE)
continue;
session_set_consumed_clock(node->object.object, session->clock);
}
session->presentation.flags |= SESSION_FLAG_PRESENTATION_CLOCK_SET;
}
if (IsEqualGUID(&session->presentation.time_format, &GUID_NULL))