[vlc-commits] vdpau/avcodec: add support for 4:4:4 and 4:2:2 chroma types

Rémi Denis-Courmont git at videolan.org
Sat Dec 27 11:06:39 CET 2014


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri Dec 19 23:30:20 2014 +0200| [4e0b9b076eba7a26b77c51c0ac985aa60a125e89] | committer: Rémi Denis-Courmont

vdpau/avcodec: add support for 4:4:4 and 4:2:2 chroma types

This adds support for the H.264 4:4:4 Predictive profile (at 8-bits
per component only).

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4e0b9b076eba7a26b77c51c0ac985aa60a125e89
---

 modules/hw/vdpau/avcodec.c |   59 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 50 insertions(+), 9 deletions(-)

diff --git a/modules/hw/vdpau/avcodec.c b/modules/hw/vdpau/avcodec.c
index 2305f9f..c7c9491 100644
--- a/modules/hw/vdpau/avcodec.c
+++ b/modules/hw/vdpau/avcodec.c
@@ -55,18 +55,37 @@ struct vlc_va_sys_t
 {
     vdp_t *vdp;
     VdpDevice device;
-    uint16_t width;
-    uint16_t height;
+    VdpChromaType type;
+    uint32_t width;
+    uint32_t height;
     vlc_vdp_video_field_t **pool;
 };
 
+#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56, 10, 0))
+static int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
+                                           VdpChromaType *type,
+                                           uint32_t *width, uint32_t *height)
+{
+    if (type != NULL)
+        *type = VDP_CHROMA_TYPE_420;
+    if (width != NULL)
+        *width = (avctx->coded_width + 1) & ~1;
+    if (height != NULL)
+        *height = (avctx->coded_height + 3) & ~3;
+    return 0;
+}
+#endif
+#if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56, 9, 0))
+# define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (0)
+#endif
+
 static vlc_vdp_video_field_t *CreateSurface(vlc_va_t *va)
 {
     vlc_va_sys_t *sys = va->sys;
     VdpVideoSurface surface;
     VdpStatus err;
 
-    err = vdp_video_surface_create(sys->vdp, sys->device, VDP_CHROMA_TYPE_420,
+    err = vdp_video_surface_create(sys->vdp, sys->device, sys->type,
                                    sys->width, sys->height, &surface);
     if (err != VDP_STATUS_OK)
     {
@@ -153,10 +172,14 @@ static int Copy(vlc_va_t *va, picture_t *pic, void *opaque, uint8_t *data)
 static int Setup(vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *chromap)
 {
     vlc_va_sys_t *sys = va->sys;
-    unsigned width = (avctx->coded_width + 1) & ~1;
-    unsigned height = (avctx->coded_height + 3) & ~3;
+    VdpChromaType type;
+    uint32_t width, height;
+
+    if (av_vdpau_get_surface_parameters(avctx, &type, &width, &height))
+        return VLC_EGENERIC;
 
-    if (sys->width == width && sys->height == height && sys->pool != NULL)
+    if (sys->type == type && sys->width == width && sys->height == height
+     && sys->pool != NULL)
         return VLC_SUCCESS;
 
 #if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56, 2, 0))
@@ -179,9 +202,26 @@ static int Setup(vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *chromap)
         sys->pool = NULL;
     }
 
+    sys->type = type;
     sys->width = width;
     sys->height =  height;
 
+    switch (type)
+    {
+        case VDP_CHROMA_TYPE_420:
+            *chromap = VLC_CODEC_VDPAU_VIDEO_420;
+            break;
+        case VDP_CHROMA_TYPE_422:
+            *chromap = VLC_CODEC_VDPAU_VIDEO_422;
+            break;
+        case VDP_CHROMA_TYPE_444:
+            *chromap = VLC_CODEC_VDPAU_VIDEO_444;
+            break;
+        default:
+            msg_Err(va, "unsupported chroma type %"PRIu32, type);
+            return VLC_EGENERIC;
+    }
+
     vlc_vdp_video_field_t **pool = malloc(sizeof (*pool) * (avctx->refs + 6));
     if (unlikely(pool == NULL))
         return VLC_ENOMEM;
@@ -226,8 +266,6 @@ static int Setup(vlc_va_t *va, AVCodecContext *avctx, vlc_fourcc_t *chromap)
         return VLC_EGENERIC;
     }
 #endif
-    /* TODO: select better chromas when appropriate */
-    *chromap = VLC_CODEC_VDPAU_VIDEO_420;
     return VLC_SUCCESS;
 }
 
@@ -283,17 +321,20 @@ static int Open(vlc_va_t *va, AVCodecContext *avctx, const es_format_t *fmt)
         return VLC_EGENERIC;
     }
 
+    sys->type = VDP_CHROMA_TYPE_420;
     sys->width = 0;
     sys->height = 0;
     sys->pool = NULL;
 
 #if (LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(56, 2, 0))
+    unsigned flags = AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH;
+
     err = vdp_get_proc_address(sys->vdp, sys->device,
                                VDP_FUNC_ID_GET_PROC_ADDRESS, &func);
     if (err != VDP_STATUS_OK)
         goto error;
 
-    if (av_vdpau_bind_context(avctx, sys->device, func, 0))
+    if (av_vdpau_bind_context(avctx, sys->device, func, flags))
         goto error;
 
     (void) fmt;



More information about the vlc-commits mailing list