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)); }
int main(int argc, char *argv[]) { GstVaapiDisplay *display; GstVaapiWindow *window; GstVaapiWindowGLX *glx_window; GstVaapiSurface *surface; GstVaapiImage *image; GstVaapiTexture *textures[2]; GstVaapiTexture *texture; GLuint texture_id; GstVaapiRectangle src_rect; GstVaapiRectangle dst_rect; guint flags = GST_VAAPI_PICTURE_STRUCTURE_FRAME; static const GstVaapiChromaType chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420; static const guint width = 320; static const guint height = 240; static const guint win_width = 640; static const guint win_height = 480; gst_init(&argc, &argv); display = gst_vaapi_display_glx_new(NULL); if (!display) g_error("could not create VA display"); surface = gst_vaapi_surface_new(display, chroma_type, width, height); if (!surface) g_error("could not create VA surface"); image = image_generate(display, GST_VAAPI_IMAGE_NV12, width, height); if (!image) g_error("could not create VA image"); if (!image_upload(image, surface)) g_error("could not upload VA image to surface"); window = gst_vaapi_window_glx_new(display, win_width, win_height); if (!window) g_error("could not create window"); glx_window = GST_VAAPI_WINDOW_GLX(window); gst_vaapi_window_show(window); if (!gst_vaapi_window_glx_make_current(glx_window)) g_error("coult not bind GL context"); g_print("#\n"); g_print("# Create texture with gst_vaapi_texture_new()\n"); g_print("#\n"); { texture = gst_vaapi_texture_new( display, GL_TEXTURE_2D, GL_RGBA, width, height ); if (!texture) g_error("could not create VA texture"); textures[0] = texture; texture_id = gst_vaapi_texture_get_id(texture); if (!gst_vaapi_texture_put_surface(texture, surface, flags)) g_error("could not transfer VA surface to texture"); if (!gst_vaapi_window_glx_put_texture(glx_window, texture, NULL, NULL)) g_error("could not render texture into the window"); } g_print("#\n"); g_print("# Create texture with gst_vaapi_texture_new_with_texture()\n"); g_print("#\n"); { const GLenum target = GL_TEXTURE_2D; const GLenum format = GL_BGRA; glEnable(target); glGenTextures(1, &texture_id); glBindTexture(target, texture_id); glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage2D( target, 0, GL_RGBA8, width, height, 0, format, GL_UNSIGNED_BYTE, NULL ); glDisable(target); texture = gst_vaapi_texture_new_with_texture( display, texture_id, target, format ); if (!texture) g_error("could not create VA texture"); if (texture_id != gst_vaapi_texture_get_id(texture)) g_error("invalid texture id"); if (gl_get_current_texture_2d() != texture_id) g_error("gst_vaapi_texture_new_with_texture() altered texture bindings"); textures[1] = texture; if (!gst_vaapi_texture_put_surface(texture, surface, flags)) g_error("could not transfer VA surface to texture"); if (gl_get_current_texture_2d() != texture_id) g_error("gst_vaapi_texture_put_surface() altered texture bindings"); src_rect.x = 0; src_rect.y = 0; src_rect.width = width; src_rect.height = height; dst_rect.x = win_width/2; dst_rect.y = win_height/2; dst_rect.width = win_width/2; dst_rect.height = win_height/2; if (!gst_vaapi_window_glx_put_texture(glx_window, texture, &src_rect, &dst_rect)) g_error("could not render texture into the window"); if (gl_get_current_texture_2d() != texture_id) g_error("gst_vaapi_window_glx_put_texture() altered texture bindings"); } gst_vaapi_window_glx_swap_buffers(glx_window); pause(); g_object_unref(textures[0]); g_object_unref(textures[1]); glDeleteTextures(1, &texture_id); g_object_unref(window); g_object_unref(display); gst_deinit(); return 0; }