void gst_x_overlay_got_xwindow_id (GstXOverlay * overlay, gulong xwindow_id) { GST_WARNING_OBJECT (overlay, "Using deprecated gst_x_overlay_got_xwindow_id()"); gst_x_overlay_got_window_handle (overlay, xwindow_id); }
static gboolean gst_eglglessink_configure_caps (GstEglGlesSink * eglglessink, GstCaps * caps) { gboolean ret = TRUE; gint width, height; int par_n, par_d; guintptr used_window = 0; if (!(ret = gst_video_format_parse_caps (caps, &eglglessink->format, &width, &height))) { GST_ERROR_OBJECT (eglglessink, "Got weird and/or incomplete caps"); goto HANDLE_ERROR; } if (!(ret = gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d))) { par_n = 1; par_d = 1; GST_WARNING_OBJECT (eglglessink, "Can't parse PAR from caps. Using default: 1"); } eglglessink->size_changed = (GST_VIDEO_SINK_WIDTH (eglglessink) != width || GST_VIDEO_SINK_HEIGHT (eglglessink) != height || eglglessink->par_n != par_n || eglglessink->par_d != par_d); eglglessink->par_n = par_n; eglglessink->par_d = par_d; GST_VIDEO_SINK_WIDTH (eglglessink) = width; GST_VIDEO_SINK_HEIGHT (eglglessink) = height; if (eglglessink->configured_caps) { GST_DEBUG_OBJECT (eglglessink, "Caps were already set"); if (gst_caps_can_intersect (caps, eglglessink->configured_caps)) { GST_DEBUG_OBJECT (eglglessink, "Caps are compatible anyway"); goto SUCCEED; } GST_DEBUG_OBJECT (eglglessink, "Caps are not compatible, reconfiguring"); /* EGL/GLES cleanup */ gst_egl_adaptation_cleanup (eglglessink->egl_context); gst_caps_unref (eglglessink->configured_caps); eglglessink->configured_caps = NULL; } if (!gst_egl_adaptation_choose_config (eglglessink->egl_context)) { GST_ERROR_OBJECT (eglglessink, "Couldn't choose EGL config"); goto HANDLE_ERROR; } gst_caps_replace (&eglglessink->configured_caps, caps); /* By now the application should have set a window * if it meant to do so */ GST_OBJECT_LOCK (eglglessink); if (!eglglessink->have_window) { GST_INFO_OBJECT (eglglessink, "No window. Will attempt internal window creation"); if (!gst_eglglessink_create_window (eglglessink, width, height)) { GST_ERROR_OBJECT (eglglessink, "Internal window creation failed!"); GST_OBJECT_UNLOCK (eglglessink); goto HANDLE_ERROR; } eglglessink->using_own_window = TRUE; gst_egl_adaptation_update_used_window (eglglessink->egl_context); eglglessink->have_window = TRUE; } used_window = gst_egl_adaptation_get_window (eglglessink->egl_context); GST_OBJECT_UNLOCK (eglglessink); gst_x_overlay_got_window_handle (GST_X_OVERLAY (eglglessink), (guintptr) used_window); if (!eglglessink->egl_context->have_surface) { if (!gst_egl_adaptation_init_egl_surface (eglglessink->egl_context, eglglessink->format)) { GST_ERROR_OBJECT (eglglessink, "Couldn't init EGL surface from window"); goto HANDLE_ERROR; } } SUCCEED: GST_INFO_OBJECT (eglglessink, "Configured caps successfully"); return TRUE; HANDLE_ERROR: GST_ERROR_OBJECT (eglglessink, "Configuring caps failed"); return FALSE; }
/* This function handles a GstVdpWindow creation */ static GstVdpWindow * gst_vdp_sink_window_new (VdpSink * vdp_sink, gint width, gint height) { GstVdpDevice *device = vdp_sink->device; GstVdpWindow *window = NULL; Window root; gint screen_num; gulong black; g_return_val_if_fail (GST_IS_VDP_SINK (vdp_sink), NULL); window = g_new0 (GstVdpWindow, 1); window->width = width; window->height = height; window->internal = TRUE; g_mutex_lock (vdp_sink->x_lock); screen_num = DefaultScreen (device->display); root = DefaultRootWindow (device->display); black = XBlackPixel (device->display, screen_num); window->win = XCreateSimpleWindow (vdp_sink->device->display, root, 0, 0, window->width, window->height, 0, 0, black); /* We have to do that to prevent X from redrawing the background on ConfigureNotify. This takes away flickering of video when resizing. */ XSetWindowBackgroundPixmap (vdp_sink->device->display, window->win, None); /* set application name as a title */ gst_vdp_sink_window_set_title (vdp_sink, window, NULL); if (vdp_sink->handle_events) { Atom wm_delete; XSelectInput (vdp_sink->device->display, window->win, ExposureMask | StructureNotifyMask | PointerMotionMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask); /* Tell the window manager we'd like delete client messages instead of * being killed */ wm_delete = XInternAtom (vdp_sink->device->display, "WM_DELETE_WINDOW", False); (void) XSetWMProtocols (vdp_sink->device->display, window->win, &wm_delete, 1); } XMapRaised (vdp_sink->device->display, window->win); XSync (vdp_sink->device->display, FALSE); g_mutex_unlock (vdp_sink->x_lock); gst_vdp_sink_window_decorate (vdp_sink, window); gst_vdp_sink_window_setup_vdpau (vdp_sink, window); gst_x_overlay_got_window_handle (GST_X_OVERLAY (vdp_sink), (guintptr) window->win); return window; }