guint is_shown:1;
guint fullscreen_on_show:1;
guint use_vpp:1;
+ guint frame_pending:1;
};
/**
GstVaapiWindowWaylandPrivate *const priv =
GST_VAAPI_WINDOW_WAYLAND_GET_PRIVATE (window);
- if (priv->frame) {
+ if (priv->frame_pending) {
struct wl_display *const wl_display =
GST_VAAPI_OBJECT_NATIVE_DISPLAY (window);
do {
if (wl_display_dispatch_queue (wl_display, priv->event_queue) < 0)
return FALSE;
- } while (priv->frame);
+ } while (priv->frame_pending);
}
return TRUE;
}
GstVaapiWindowWaylandPrivate *const priv =
GST_VAAPI_WINDOW_WAYLAND_GET_PRIVATE (frame->window);
- frame_state_free (frame);
if (priv->frame == frame)
- priv->frame = NULL;
+ priv->frame_pending = FALSE;
}
static const struct wl_callback_listener frame_callback_listener = {
frame_redraw_callback
};
+static void
+frame_release_callback (void *data, struct wl_buffer *wl_buffer)
+{
+ frame_state_free (data);
+}
+
+static const struct wl_buffer_listener frame_buffer_listener = {
+ frame_release_callback
+};
+
static GstVaapiSurface *
vpp_convert (GstVaapiWindow * window,
GstVaapiSurface * surface,
if (!frame)
return FALSE;
priv->frame = frame;
+ priv->frame_pending = TRUE;
if (need_vpp && priv->use_vpp) {
frame->surface = surface;
}
frame->buffer = buffer;
+ wl_proxy_set_queue ((struct wl_proxy *) buffer, priv->event_queue);
+ wl_buffer_add_listener (buffer, &frame_buffer_listener, frame);
+
frame->callback = wl_surface_frame (priv->surface);
wl_callback_add_listener (frame->callback, &frame_callback_listener, frame);