static void Display(vout_display_t *vd, picture_t *pic) { vout_display_sys_t *sys = vd->sys; struct wl_display *display = sys->embed->display.wl; struct wl_surface *surface = sys->embed->handle.wl; wl_surface_commit(surface); wl_display_roundtrip_queue(display, sys->eventq); (void) pic; }
static void gst_mfx_window_wayland_destroy (GstMfxWindow * window) { GstMfxWindowWaylandPrivate *const priv = GST_MFX_WINDOW_WAYLAND_GET_PRIVATE (window); struct wl_display *const display = GST_MFX_DISPLAY_HANDLE (GST_MFX_WINDOW_DISPLAY (window)); /* Make sure that the last wl_buffer's callback could be called */ GST_MFX_DISPLAY_LOCK (GST_MFX_WINDOW_DISPLAY (window)); if (priv->surface) { wl_surface_attach (priv->surface, NULL, 0, 0); wl_surface_commit (priv->surface); wl_display_flush (display); } GST_MFX_DISPLAY_UNLOCK (GST_MFX_WINDOW_DISPLAY (window)); gst_poll_set_flushing (priv->poll, TRUE); if (priv->event_queue) { wl_display_roundtrip_queue (display, priv->event_queue); } if (priv->thread) { g_thread_join (priv->thread); priv->thread = NULL; } #ifdef USE_WESTON_4_0 if (priv->wp_viewport) { wp_viewport_destroy (priv->wp_viewport); priv->wp_viewport = NULL; } #else if (priv->viewport) { wl_viewport_destroy (priv->viewport); priv->viewport = NULL; } #endif if (priv->shell_surface) { wl_shell_surface_destroy (priv->shell_surface); priv->shell_surface = NULL; } if (priv->surface) { wl_surface_destroy (priv->surface); priv->surface = NULL; } if (priv->event_queue) { wl_event_queue_destroy (priv->event_queue); priv->event_queue = NULL; } #ifdef USE_EGL if (priv->egl_window) { wl_egl_window_destroy (priv->egl_window); priv->egl_window = NULL; } #endif gst_poll_free (priv->poll); }
static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg, video_format_t *fmtp, vlc_video_context *context) { if (cfg->window->type != VOUT_WINDOW_TYPE_WAYLAND) return VLC_EGENERIC; vout_display_sys_t *sys = malloc(sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; vd->sys = sys; sys->embed = NULL; sys->eventq = NULL; sys->shm = NULL; sys->viewporter = NULL; sys->active_buffers = 0; sys->display_width = cfg->display.width; sys->display_height = cfg->display.height; sys->use_buffer_transform = false; /* Get window */ sys->embed = cfg->window; assert(sys->embed != NULL); struct wl_display *display = sys->embed->display.wl; sys->eventq = wl_display_create_queue(display); if (sys->eventq == NULL) goto error; struct wl_registry *registry = wl_display_get_registry(display); if (registry == NULL) goto error; wl_proxy_set_queue((struct wl_proxy *)registry, sys->eventq); wl_registry_add_listener(registry, ®istry_cbs, vd); wl_display_roundtrip_queue(display, sys->eventq); wl_registry_destroy(registry); if (sys->shm == NULL) goto error; wl_shm_add_listener(sys->shm, &shm_cbs, vd); wl_display_roundtrip_queue(display, sys->eventq); struct wl_surface *surface = sys->embed->handle.wl; if (sys->viewporter != NULL) sys->viewport = wp_viewporter_get_viewport(sys->viewporter, surface); else sys->viewport = NULL; /* Determine our pixel format */ static const enum wl_output_transform transforms[8] = { [ORIENT_TOP_LEFT] = WL_OUTPUT_TRANSFORM_NORMAL, [ORIENT_TOP_RIGHT] = WL_OUTPUT_TRANSFORM_FLIPPED, [ORIENT_BOTTOM_LEFT] = WL_OUTPUT_TRANSFORM_FLIPPED_180, [ORIENT_BOTTOM_RIGHT] = WL_OUTPUT_TRANSFORM_180, [ORIENT_LEFT_TOP] = WL_OUTPUT_TRANSFORM_FLIPPED_270, [ORIENT_LEFT_BOTTOM] = WL_OUTPUT_TRANSFORM_90, [ORIENT_RIGHT_TOP] = WL_OUTPUT_TRANSFORM_270, [ORIENT_RIGHT_BOTTOM] = WL_OUTPUT_TRANSFORM_FLIPPED_90, };