Call GDK functions from main thread in wxGStreamerMediaBackend

This fixes another problem similar to the one fixed in be1854c617 (Avoid
UI functions in non-main thread in wxGStreamerMediaBackend, 2020-09-02)
and does it in a similar way: SetupXOverlay(), which calls gdk_flush(),
was called from gst_bus_sync_callback() which is executed in the worker
thread, so use CallAfter() to call it from the main thread later.
This commit is contained in:
Vadim Zeitlin
2020-09-02 23:24:05 +02:00
parent e4333fdeac
commit c2b1dbda83

View File

@@ -149,7 +149,12 @@ public:
void HandleStateChange(GstState oldstate, GstState newstate); void HandleStateChange(GstState oldstate, GstState newstate);
bool QueryVideoSizeFromElement(GstElement* element); bool QueryVideoSizeFromElement(GstElement* element);
bool QueryVideoSizeFromPad(GstPad* caps); bool QueryVideoSizeFromPad(GstPad* caps);
// SetupXOverlay() can only be called from the main thread, use
// CallSetupXOverlay() to call it from another thread.
void SetupXOverlay(); void SetupXOverlay();
void CallSetupXOverlay();
bool SyncStateChange(GstElement* element, GstState state, bool SyncStateChange(GstElement* element, GstState state,
gint64 llTimeout = wxGSTREAMER_TIMEOUT); gint64 llTimeout = wxGSTREAMER_TIMEOUT);
bool TryAudioSink(GstElement* audiosink); bool TryAudioSink(GstElement* audiosink);
@@ -210,6 +215,7 @@ class wxGStreamerMediaEventHandler : public wxEvtHandler
void OnMediaFinish(wxMediaEvent& event); void OnMediaFinish(wxMediaEvent& event);
void NotifyMovieSizeChanged(); void NotifyMovieSizeChanged();
void NotifySetupXOverlay() { return m_be->SetupXOverlay(); }
wxGStreamerMediaBackend* m_be; wxGStreamerMediaBackend* m_be;
}; };
@@ -478,7 +484,7 @@ static GstBusSyncReply gst_bus_sync_callback(GstBus* bus,
} }
wxLogTrace(wxTRACE_GStreamer, wxT("Got prepare-xwindow-id")); wxLogTrace(wxTRACE_GStreamer, wxT("Got prepare-xwindow-id"));
be->SetupXOverlay(); be->CallSetupXOverlay();
return GST_BUS_DROP; // We handled this message - drop from the queue return GST_BUS_DROP; // We handled this message - drop from the queue
} }
} }
@@ -654,6 +660,8 @@ bool wxGStreamerMediaBackend::QueryVideoSizeFromPad(GstPad* pad)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void wxGStreamerMediaBackend::SetupXOverlay() void wxGStreamerMediaBackend::SetupXOverlay()
{ {
wxASSERT( wxIsMainThread() );
// Use the xoverlay extension to tell gstreamer to play in our window // Use the xoverlay extension to tell gstreamer to play in our window
#ifdef __WXGTK__ #ifdef __WXGTK__
if (!gtk_widget_get_realized(m_ctrl->m_wxwindow)) if (!gtk_widget_get_realized(m_ctrl->m_wxwindow))
@@ -693,6 +701,11 @@ void wxGStreamerMediaBackend::SetupXOverlay()
#endif #endif
} }
void wxGStreamerMediaBackend::CallSetupXOverlay()
{
m_eventHandler->CallAfter(&wxGStreamerMediaEventHandler::NotifySetupXOverlay);
}
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxGStreamerMediaBackend::SyncStateChange // wxGStreamerMediaBackend::SyncStateChange
// //