summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/wayland/gstwaylandsink.c25
-rw-r--r--ext/wayland/gstwaylandsink.h2
-rw-r--r--ext/wayland/wlwindow.c4
-rw-r--r--ext/wayland/wlwindow.h1
4 files changed, 18 insertions, 14 deletions
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index fd196b373..4fbb17c9b 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -406,6 +406,14 @@ gst_wayland_sink_change_state (GstElement * element, GstStateChange transition)
gst_wl_window_render (sink->window, NULL, NULL);
}
}
+
+ g_mutex_lock (&sink->render_lock);
+ if (sink->callback) {
+ wl_callback_destroy (sink->callback);
+ sink->callback = NULL;
+ }
+ sink->redraw_pending = FALSE;
+ g_mutex_unlock (&sink->render_lock);
break;
case GST_STATE_CHANGE_READY_TO_NULL:
g_mutex_lock (&sink->display_lock);
@@ -419,12 +427,9 @@ gst_wayland_sink_change_state (GstElement * element, GstStateChange transition)
* to avoid requesting them again from the application if/when we are
* restarted (GstVideoOverlay behaves like that in other sinks)
*/
- if (sink->display && !sink->window) { /* -> the window was toplevel */
+ if (sink->display && !sink->window) /* -> the window was toplevel */
g_clear_object (&sink->display);
- g_mutex_lock (&sink->render_lock);
- sink->redraw_pending = FALSE;
- g_mutex_unlock (&sink->render_lock);
- }
+
g_mutex_unlock (&sink->display_lock);
g_clear_object (&sink->pool);
break;
@@ -639,10 +644,12 @@ frame_redraw_callback (void *data, struct wl_callback *callback, uint32_t time)
g_mutex_lock (&sink->render_lock);
sink->redraw_pending = FALSE;
- sink->window->callback = NULL;
- g_mutex_unlock (&sink->render_lock);
- wl_callback_destroy (callback);
+ if (sink->callback) {
+ wl_callback_destroy (callback);
+ sink->callback = NULL;
+ }
+ g_mutex_unlock (&sink->render_lock);
}
static const struct wl_callback_listener frame_callback_listener = {
@@ -663,7 +670,7 @@ render_last_buffer (GstWaylandSink * sink, gboolean redraw)
sink->redraw_pending = TRUE;
callback = wl_surface_frame (surface);
- sink->window->callback = callback;
+ sink->callback = callback;
wl_callback_add_listener (callback, &frame_callback_listener, sink);
if (G_UNLIKELY (sink->video_info_changed && !redraw)) {
diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
index ce79f9ce1..7aabb6ff0 100644
--- a/ext/wayland/gstwaylandsink.h
+++ b/ext/wayland/gstwaylandsink.h
@@ -67,6 +67,8 @@ struct _GstWaylandSink
gboolean redraw_pending;
GMutex render_lock;
GstBuffer *last_buffer;
+
+ struct wl_callback *callback;
};
struct _GstWaylandSinkClass
diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
index 2a09b93ea..66a05be97 100644
--- a/ext/wayland/wlwindow.c
+++ b/ext/wayland/wlwindow.c
@@ -157,9 +157,6 @@ gst_wl_window_finalize (GObject * gobject)
{
GstWlWindow *self = GST_WL_WINDOW (gobject);
- if (self->callback)
- wl_callback_destroy (self->callback);
-
if (self->wl_shell_surface)
wl_shell_surface_destroy (self->wl_shell_surface);
@@ -200,7 +197,6 @@ gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock)
window->render_lock = render_lock;
g_cond_init (&window->configure_cond);
- window->callback = NULL;
window->area_surface = wl_compositor_create_surface (display->compositor);
window->video_surface = wl_compositor_create_surface (display->compositor);
diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h
index cecbda664..c3f017216 100644
--- a/ext/wayland/wlwindow.h
+++ b/ext/wayland/wlwindow.h
@@ -55,7 +55,6 @@ struct _GstWlWindow
struct wl_shell_surface *wl_shell_surface;
struct xdg_surface *xdg_surface;
struct xdg_toplevel *xdg_toplevel;
- struct wl_callback *callback;
gboolean configured;
GCond configure_cond;
GMutex configure_mutex;