static gboolean ensure_texture (GstVaapiWindowEGL * window, guint width, guint height) { GstVaapiTexture *texture; if (window->texture && GST_VAAPI_TEXTURE_WIDTH (window->texture) == width && GST_VAAPI_TEXTURE_HEIGHT (window->texture) == height) return TRUE; texture = gst_vaapi_texture_egl_new (GST_VAAPI_OBJECT_DISPLAY (window), GL_TEXTURE_2D, GL_RGBA, width, height); gst_vaapi_texture_replace (&window->texture, texture); gst_vaapi_texture_replace (&texture, NULL); return window->texture != NULL; }
static void gst_vaapi_window_egl_destroy (GstVaapiWindowEGL * window) { egl_context_run (window->egl_window->context, (EglContextRunFunc) do_destroy_objects, window); gst_vaapi_window_replace (&window->window, NULL); gst_vaapi_texture_replace (&window->texture, NULL); }
static void meta_texture_free (GstVaapiVideoMetaTexture * meta) { if (G_UNLIKELY (!meta)) return; gst_vaapi_texture_replace (&meta->texture, NULL); g_slice_free (GstVaapiVideoMetaTexture, meta); }
static GstVaapiVideoMetaTexture * meta_texture_copy (GstVaapiVideoMetaTexture * meta) { GstVaapiVideoMetaTexture *copy; copy = meta_texture_new (); if (!copy) return NULL; copy->texture_type = meta->texture_type; copy->gl_format = meta->gl_format; copy->width = meta->width; copy->height = meta->height; gst_vaapi_texture_replace (©->texture, meta->texture); return copy; }
static gboolean gst_vaapi_texture_upload (GstVideoGLTextureUploadMeta * meta, guint texture_id[4]) { GstVaapiVideoMeta *const vmeta = gst_buffer_get_vaapi_video_meta (meta->buffer); GstVaapiVideoMetaTexture *const meta_texture = meta->user_data; GstVaapiSurfaceProxy *const proxy = gst_vaapi_video_meta_get_surface_proxy (vmeta); GstVaapiSurface *const surface = gst_vaapi_surface_proxy_get_surface (proxy); GstVaapiDisplay *const dpy = GST_VAAPI_OBJECT_DISPLAY (surface); if (!gst_vaapi_display_has_opengl (dpy)) return FALSE; if (!meta_texture->texture || /* Check whether VA display changed */ GST_VAAPI_OBJECT_DISPLAY (meta_texture->texture) != dpy || /* Check whether texture id changed */ gst_vaapi_texture_get_id (meta_texture->texture) != texture_id[0]) { /* FIXME: should we assume target? */ GstVaapiTexture *const texture = gst_vaapi_texture_new_wrapped (dpy, texture_id[0], GL_TEXTURE_2D, meta_texture->gl_format, meta_texture->width, meta_texture->height); gst_vaapi_texture_replace (&meta_texture->texture, texture); if (!texture) return FALSE; gst_vaapi_texture_unref (texture); } gst_vaapi_texture_set_orientation_flags (meta_texture->texture, get_texture_orientation_flags (meta->texture_orientation)); return gst_vaapi_texture_put_surface (meta_texture->texture, surface, gst_vaapi_surface_proxy_get_crop_rect (proxy), gst_vaapi_video_meta_get_render_flags (vmeta)); }