/** * gst_vaapi_surface_new_with_dma_buf_handle: * @display: a #GstVaapiDisplay * @fd: the DRM PRIME file descriptor * @size: the underlying DRM buffer size * @format: the desired surface format * @width: the desired surface width in pixels * @height: the desired surface height in pixels * @offset: the offsets to each plane * @stride: the pitches for each plane * * Creates a new #GstVaapiSurface with an external DRM PRIME file * descriptor. The newly created VA surfaces owns the supplied buffer * handle. * * Return value: the newly allocated #GstVaapiSurface object, or %NULL * if creation from DRM PRIME fd failed, or is not supported */ GstVaapiSurface * gst_vaapi_surface_new_with_dma_buf_handle (GstVaapiDisplay * display, gint fd, GstVideoInfo * vi) { GstVaapiBufferProxy *proxy; GstVaapiSurface *surface; proxy = gst_vaapi_buffer_proxy_new ((gintptr) fd, GST_VAAPI_BUFFER_MEMORY_TYPE_DMA_BUF, GST_VIDEO_INFO_SIZE (vi), NULL, NULL); if (!proxy) return NULL; surface = gst_vaapi_surface_new_from_buffer_proxy (display, proxy, vi); gst_vaapi_buffer_proxy_unref (proxy); return surface; }
/** * gst_vaapi_surface_new_with_dma_buf_handle: * @display: a #GstVaapiDisplay * @name: the DRM GEM buffer name * @size: the underlying DRM buffer size * @format: the desired surface format * @width: the desired surface width in pixels * @height: the desired surface height in pixels * @offset: the offsets to each plane * @stride: the pitches for each plane * * Creates a new #GstVaapiSurface with an external DRM GEM buffer * name. The newly created VA surfaces owns the supplied buffer * handle. * * Return value: the newly allocated #GstVaapiSurface object, or %NULL * if creation from DRM PRIME fd failed, or is not supported */ GstVaapiSurface * gst_vaapi_surface_new_with_gem_buf_handle (GstVaapiDisplay * display, guint32 name, guint size, GstVideoFormat format, guint width, guint height, gsize offset[GST_VIDEO_MAX_PLANES], gint stride[GST_VIDEO_MAX_PLANES]) { GstVaapiBufferProxy *proxy; GstVaapiSurface *surface; GstVideoInfo vi; proxy = gst_vaapi_buffer_proxy_new ((guintptr) name, GST_VAAPI_BUFFER_MEMORY_TYPE_GEM_BUF, size, NULL, NULL); if (!proxy) return NULL; fill_video_info (&vi, format, width, height, offset, stride); surface = gst_vaapi_surface_new_from_buffer_proxy (display, proxy, &vi); gst_vaapi_buffer_proxy_unref (proxy); return surface; }
GstMemory * gst_vaapi_dmabuf_memory_new (GstAllocator * allocator, GstVaapiVideoMeta * meta) { GstMemory *mem; GstVaapiDisplay *display; GstVaapiSurface *surface; GstVaapiSurfaceProxy *proxy; GstVaapiBufferProxy *dmabuf_proxy; gint dmabuf_fd; const GstVideoInfo *vip; guint flags; g_return_val_if_fail (allocator != NULL, NULL); g_return_val_if_fail (meta != NULL, NULL); vip = gst_allocator_get_vaapi_video_info (allocator, &flags); if (!vip) return NULL; display = gst_vaapi_video_meta_get_display (meta); if (!meta) return NULL; surface = gst_vaapi_surface_new_full (display, vip, flags); if (!surface) goto error_create_surface; proxy = gst_vaapi_surface_proxy_new (surface); if (!proxy) goto error_create_surface_proxy; dmabuf_proxy = gst_vaapi_surface_get_dma_buf_handle (surface); gst_vaapi_object_unref (surface); if (!dmabuf_proxy) goto error_create_dmabuf_proxy; gst_vaapi_video_meta_set_surface_proxy (meta, proxy); gst_vaapi_surface_proxy_unref (proxy); dmabuf_fd = gst_vaapi_buffer_proxy_get_handle (dmabuf_proxy); if (dmabuf_fd < 0 || (dmabuf_fd = dup (dmabuf_fd)) < 0) goto error_create_dmabuf_handle; mem = gst_dmabuf_allocator_alloc (allocator, dmabuf_fd, gst_vaapi_buffer_proxy_get_size (dmabuf_proxy)); if (!mem) goto error_create_dmabuf_memory; gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (mem), GST_VAAPI_BUFFER_PROXY_QUARK, dmabuf_proxy, (GDestroyNotify) gst_vaapi_buffer_proxy_unref); return mem; /* ERRORS */ error_create_surface: { GST_ERROR ("failed to create VA surface (format:%s size:%ux%u)", gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (vip)), GST_VIDEO_INFO_WIDTH (vip), GST_VIDEO_INFO_HEIGHT (vip)); return NULL; } error_create_surface_proxy: { GST_ERROR ("failed to create VA surface proxy"); gst_vaapi_object_unref (surface); return NULL; } error_create_dmabuf_proxy: { GST_ERROR ("failed to export VA surface to DMABUF"); gst_vaapi_surface_proxy_unref (proxy); return NULL; } error_create_dmabuf_handle: { GST_ERROR ("failed to duplicate DMABUF handle"); gst_vaapi_buffer_proxy_unref (dmabuf_proxy); return NULL; } error_create_dmabuf_memory: { GST_ERROR ("failed to create DMABUF memory"); gst_vaapi_buffer_proxy_unref (dmabuf_proxy); return NULL; } }