[vlc-devel] [PATCH 27/48] vdpau: chroma filter cleanup

Rémi Denis-Courmont remi at remlab.net
Tue Jul 2 19:51:53 CEST 2013


---
 modules/hw/vdpau/Makefile.am |  2 +-
 modules/hw/vdpau/chroma.c    | 60 +++++++++++++++++++++++++++++++++-----------
 modules/hw/vdpau/vlc_vdpau.h |  2 +-
 3 files changed, 47 insertions(+), 17 deletions(-)

diff --git a/modules/hw/vdpau/Makefile.am b/modules/hw/vdpau/Makefile.am
index ad8f024..f81370c 100644
--- a/modules/hw/vdpau/Makefile.am
+++ b/modules/hw/vdpau/Makefile.am
@@ -26,7 +26,7 @@ if HAVE_AVCODEC_VDPAU
 libvlc_LTLIBRARIES += libvdpau_avcodec_plugin.la
 endif
 
-libvdpau_chroma_plugin_la_SOURCES = chroma.c
+libvdpau_chroma_plugin_la_SOURCES = chroma.c picture.c
 libvdpau_chroma_plugin_la_CFLAGS = $(AM_CFLAGS) # dummy
 libvdpau_chroma_plugin_la_LIBADD = $(AM_LIBADD)
 libvlc_LTLIBRARIES += libvdpau_chroma_plugin.la
diff --git a/modules/hw/vdpau/chroma.c b/modules/hw/vdpau/chroma.c
index 8e889ff..8b92b74 100644
--- a/modules/hw/vdpau/chroma.c
+++ b/modules/hw/vdpau/chroma.c
@@ -33,12 +33,12 @@
 
 struct filter_sys_t
 {
-    const vdp_t *vdp;
+    vdp_t *vdp;
     VdpDevice device;
     VdpVideoMixer mixer;
     VdpChromaType chroma;
     VdpYCbCrFormat format;
-    VdpVideoSurface (*import)(filter_t *, picture_t *);
+    picture_t *(*import)(filter_t *, picture_t *);
 };
 
 /** Create VDPAU video mixer */
@@ -140,7 +140,7 @@ static picture_t *VideoExport(filter_t *filter, picture_t *src, picture_t *dst)
 }
 
 /** Import VLC picture into VDPAU video surface */
-static VdpVideoSurface VideoImport(filter_t *filter, picture_t *src)
+static picture_t *VideoImport(filter_t *filter, picture_t *src)
 {
     filter_sys_t *sys = filter->p_sys;
     VdpVideoSurface surface;
@@ -154,7 +154,8 @@ static VdpVideoSurface VideoImport(filter_t *filter, picture_t *src)
     {
         msg_Err(filter, "video %s %s failure: %s", "surface", "creation",
                 vdp_get_error_string(sys->vdp, err));
-        return VDP_INVALID_HANDLE;
+        picture_Release(src);
+        return NULL;
     }
 
     /* Put bits */
@@ -179,21 +180,49 @@ static VdpVideoSurface VideoImport(filter_t *filter, picture_t *src)
         msg_Err(filter, "video %s %s failure: %s", "surface", "import",
                 vdp_get_error_string(sys->vdp, err));
         vdp_video_surface_destroy(sys->vdp, surface);
-        surface = VDP_INVALID_HANDLE;
+        goto error;
     }
-    return surface;
+
+    /* Wrap surface into a picture */
+    video_format_t fmt = src->format;
+    fmt.i_chroma = (sys->chroma == VDP_CHROMA_TYPE_420)
+        ? VLC_CODEC_VDPAU_VIDEO_420 : VLC_CODEC_VDPAU_VIDEO_422;
+
+    picture_t *dst = picture_NewFromFormat(&fmt);
+    if (unlikely(dst == NULL))
+        goto error;
+    picture_CopyProperties(dst, src);
+    picture_Release(src);
+
+    err = vlc_vdp_video_attach(sys->vdp, surface, dst);
+    if (unlikely(err != VDP_STATUS_OK))
+    {
+        picture_Release(dst);
+        dst = NULL;
+    }
+    return dst;
+error:
+    vdp_video_surface_destroy(sys->vdp, surface);
+    picture_Release(src);
+    return NULL;
 }
 
-static VdpVideoSurface VideoPassthrough(filter_t *filter, picture_t *src)
+static picture_t *VideoPassthrough(filter_t *filter, picture_t *src)
 {
     vlc_vdp_video_t *psys = src->context;
 
     if (unlikely(psys == NULL))
     {
         msg_Err(filter, "corrupt VDPAU video surface");
-        return VDP_INVALID_HANDLE;
+        return NULL;
     }
     /* FIXME: deal with mismatched VDPAU devices */
+    return src;
+}
+
+static inline VdpVideoSurface picture_GetVideoSurface(const picture_t *pic)
+{
+    vlc_vdp_video_t *psys = pic->context;
     return psys->surface;
 }
 
@@ -204,13 +233,17 @@ static picture_t *MixerRender(filter_t *filter, picture_t *src)
     picture_t *dst = OutputAllocate(filter);
     if (dst == NULL)
         goto out;
-    picture_CopyProperties(dst, src);
 
-    VdpVideoSurface surface = sys->import(filter, src);
-    if (surface == VDP_INVALID_HANDLE)
-        goto drop;
+    src = sys->import(filter, src);
+    if (src == NULL)
+    {
+        picture_Release(dst);
+        return NULL;
+    }
+    picture_CopyProperties(dst, src);
 
     /* Render video into output */
+    VdpVideoSurface surface = picture_GetVideoSurface(src);
     VdpRect src_rect = {
         filter->fmt_in.video.i_x_offset, filter->fmt_in.video.i_y_offset,
         filter->fmt_in.video.i_visible_width + filter->fmt_in.video.i_x_offset,
@@ -228,13 +261,10 @@ static picture_t *MixerRender(filter_t *filter, picture_t *src)
                                  NULL, VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME,
                                  0, NULL, surface, 0, NULL, &src_rect,
                                  output, &dst_rect, NULL, 0, NULL);
-    if (sys->import != VideoPassthrough)
-        vdp_video_surface_destroy(sys->vdp, surface);
     if (err != VDP_STATUS_OK)
     {
         msg_Err(filter, "video %s %s failure: %s", "mixer", "rendering",
                 vdp_get_error_string(sys->vdp, err));
-drop:
         picture_Release(dst);
         dst = NULL;
     }
diff --git a/modules/hw/vdpau/vlc_vdpau.h b/modules/hw/vdpau/vlc_vdpau.h
index a10a241..a1499fc 100644
--- a/modules/hw/vdpau/vlc_vdpau.h
+++ b/modules/hw/vdpau/vlc_vdpau.h
@@ -242,7 +242,7 @@ struct picture_sys_t
 {
     VdpOutputSurface surface;
     VdpDevice device;
-    const vdp_t *vdp;
+    vdp_t *vdp;
 };
 
 typedef struct vlc_vdp_video
-- 
1.8.3.2




More information about the vlc-devel mailing list