[vlc-devel] [PATCH 18/42] vdpau: context structure for video surfaces

Rémi Denis-Courmont remi at remlab.net
Fri Jun 28 20:30:06 CEST 2013


---
 modules/hw/vdpau/picture.c   | 63 ++++++++++++++++++++++++++++++++++++++++++++
 modules/hw/vdpau/vlc_vdpau.h | 15 +++++++++++
 2 files changed, 78 insertions(+)
 create mode 100644 modules/hw/vdpau/picture.c

diff --git a/modules/hw/vdpau/picture.c b/modules/hw/vdpau/picture.c
new file mode 100644
index 0000000..bcd4fd2
--- /dev/null
+++ b/modules/hw/vdpau/picture.c
@@ -0,0 +1,63 @@
+/*****************************************************************************
+ * picture.c: VDPAU instance management for VLC
+ *****************************************************************************
+ * Copyright (C) 2013 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <vlc_common.h>
+#include <vlc_picture.h>
+#include "vlc_vdpau.h"
+
+#pragma GCC visibility push(default)
+
+static void SurfaceDestroy(void *opaque)
+{
+    vlc_vdp_video_t *ctx = opaque;
+    VdpStatus err;
+
+    err = vdp_video_surface_destroy(ctx->vdp, ctx->surface);
+    if (err != VDP_STATUS_OK)
+        fprintf(stderr, "video surface destruction failure: %s\n",
+                vdp_get_error_string(ctx->vdp, err));
+    vdp_release_x11(ctx->vdp);
+    free(ctx);
+}
+
+VdpStatus vlc_vdp_video_attach(vdp_t *vdp, VdpVideoSurface surface,
+                               picture_t *pic)
+{
+    vlc_vdp_video_t *ctx = malloc(sizeof (*ctx));
+    if (unlikely(ctx == NULL))
+    {
+        vdp_video_surface_destroy(vdp, surface);
+        return VDP_STATUS_RESOURCES;
+    }
+
+    ctx->destroy = SurfaceDestroy;
+    ctx->surface = surface;
+    ctx->vdp = vdp_hold_x11(vdp, &ctx->device);
+    assert(pic->context == NULL);
+    pic->context = ctx;
+    return VDP_STATUS_OK;
+}
diff --git a/modules/hw/vdpau/vlc_vdpau.h b/modules/hw/vdpau/vlc_vdpau.h
index aa64d38..5a8acf7 100644
--- a/modules/hw/vdpau/vlc_vdpau.h
+++ b/modules/hw/vdpau/vlc_vdpau.h
@@ -244,4 +244,19 @@ struct picture_sys_t
     VdpDevice device;
     const vdp_t *vdp;
 };
+
+typedef struct vlc_vdp_video
+{
+    void (*destroy)(void *); /* must be first @ref picture_Release() */
+    VdpVideoSurface surface;
+    VdpDevice device;
+    vdp_t *vdp;
+} vlc_vdp_video_t;
+
+/**
+ * Attaches a VDPAU video surface as context of a VLC picture.
+ * @note In case of error, the surface is destroyed immediately. Otherwise,
+ * it will be destroyed at the same time as the picture it was attached to.
+ */
+VdpStatus vlc_vdp_video_attach(vdp_t *, VdpVideoSurface, picture_t *);
 #endif
-- 
1.8.3.1




More information about the vlc-devel mailing list