[vlc-commits] vaapi: handle VLC_CODEC_VAAPI_420_10BPP <=> VLC_CODEC_I420_10B

Thomas Guillem git at videolan.org
Fri Nov 17 10:23:32 CET 2017


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Tue Nov 14 18:44:11 2017 +0100| [e24d08a054dfb0efac91441620facdde96af17c9] | committer: Thomas Guillem

vaapi: handle VLC_CODEC_VAAPI_420_10BPP <=> VLC_CODEC_I420_10B

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

 modules/hw/vaapi/chroma.c | 84 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 53 insertions(+), 31 deletions(-)

diff --git a/modules/hw/vaapi/chroma.c b/modules/hw/vaapi/chroma.c
index 05c3346344..4ee12fa91b 100644
--- a/modules/hw/vaapi/chroma.c
+++ b/modules/hw/vaapi/chroma.c
@@ -102,8 +102,19 @@ FillPictureFromVAImage(picture_t *dest,
         break;
     }
     case VA_FOURCC_P010:
-        assert(dest->format.i_chroma == VLC_CODEC_P010);
-        Copy420_SP_to_SP(dest, src_planes, src_pitches, src_img->height, cache);
+        switch (dest->format.i_chroma)
+        {
+            case VLC_CODEC_P010:
+                Copy420_SP_to_SP(dest, src_planes, src_pitches, src_img->height,
+                                 cache);
+                break;
+            case VLC_CODEC_I420_10B:
+                Copy420_16_SP_to_P(dest, src_planes, src_pitches,
+                                   src_img->height, cache);
+                break;
+            default:
+                vlc_assert_unreachable();
+        }
         break;
     default:
         vlc_assert_unreachable();
@@ -183,40 +194,36 @@ FillVAImageFromPicture(VAImage *dest_img, uint8_t *dest_buf,
                        picture_t *dest_pic, picture_t *src,
                        copy_cache_t *cache)
 {
+    const uint8_t * src_planes[3] = { src->p[Y_PLANE].p_pixels,
+                                      src->p[U_PLANE].p_pixels,
+                                      src->p[V_PLANE].p_pixels };
+    const size_t    src_pitches[3] = { src->p[Y_PLANE].i_pitch,
+                                       src->p[U_PLANE].i_pitch,
+                                       src->p[V_PLANE].i_pitch };
+    void *const     tmp[2] = { dest_pic->p[0].p_pixels,
+                               dest_pic->p[1].p_pixels };
+
+    dest_pic->p[0].p_pixels = dest_buf + dest_img->offsets[0];
+    dest_pic->p[1].p_pixels = dest_buf + dest_img->offsets[1];
+    dest_pic->p[0].i_pitch = dest_img->pitches[0];
+    dest_pic->p[1].i_pitch = dest_img->pitches[1];
+
     switch (src->format.i_chroma)
     {
     case VLC_CODEC_I420:
-    {
         assert(dest_pic->format.i_chroma == VLC_CODEC_VAAPI_420);
-        const uint8_t * src_planes[3] = { src->p[Y_PLANE].p_pixels,
-                                          src->p[U_PLANE].p_pixels,
-                                          src->p[V_PLANE].p_pixels };
-        const size_t    src_pitches[3] = { src->p[Y_PLANE].i_pitch,
-                                           src->p[U_PLANE].i_pitch,
-                                           src->p[V_PLANE].i_pitch };
-        void *const     tmp[2] = { dest_pic->p[0].p_pixels,
-                                   dest_pic->p[1].p_pixels };
-
-        dest_pic->p[0].p_pixels = dest_buf + dest_img->offsets[0];
-        dest_pic->p[1].p_pixels = dest_buf + dest_img->offsets[1];
-        dest_pic->p[0].i_pitch = dest_img->pitches[0];
-        dest_pic->p[1].i_pitch = dest_img->pitches[1];
-
         Copy420_P_to_SP(dest_pic, src_planes, src_pitches,
-                           src->format.i_height, cache);
-
-        dest_pic->p[0].p_pixels = tmp[0];
-        dest_pic->p[1].p_pixels = tmp[1];
+                        src->format.i_height, cache);
 
         break;
-    }
+    case VLC_CODEC_I420_10B:
+        assert(dest_pic->format.i_chroma == VLC_CODEC_VAAPI_420_10BPP);
+        Copy420_16_P_to_SP(dest_pic, src_planes, src_pitches,
+                           src->format.i_height, cache);
+        break;
     case VLC_CODEC_P010:
     {
         assert(dest_pic->format.i_chroma == VLC_CODEC_VAAPI_420_10BPP);
-        const uint8_t * src_planes[2] = { src->p[0].p_pixels,
-                                          src->p[1].p_pixels };
-        const size_t    src_pitches[2] = { src->p[0].i_pitch,
-                                           src->p[1].i_pitch };
         Copy420_SP_to_SP(dest_pic,  src_planes, src_pitches,
                          src->format.i_height, cache);
         break;
@@ -224,6 +231,9 @@ FillVAImageFromPicture(VAImage *dest_img, uint8_t *dest_buf,
     default:
         vlc_assert_unreachable();
     }
+
+    dest_pic->p[0].p_pixels = tmp[0];
+    dest_pic->p[1].p_pixels = tmp[1];
 }
 
 static picture_t *
@@ -267,8 +277,9 @@ error:
 }
 
 static int CheckFmt(const video_format_t *in, const video_format_t *out,
-                    bool *upload)
+                    bool *upload, uint8_t *pixel_bytes)
 {
+    *pixel_bytes = 1;
     *upload = false;
     switch (in->i_chroma)
     {
@@ -277,8 +288,12 @@ static int CheckFmt(const video_format_t *in, const video_format_t *out,
                 return VLC_SUCCESS;
             break;
         case VLC_CODEC_VAAPI_420_10BPP:
-            if (out->i_chroma == VLC_CODEC_P010)
+            if (out->i_chroma == VLC_CODEC_P010
+             || out->i_chroma == VLC_CODEC_I420_10B)
+            {
+                *pixel_bytes = 2;
                 return VLC_SUCCESS;
+            }
             break;
     }
 
@@ -290,8 +305,12 @@ static int CheckFmt(const video_format_t *in, const video_format_t *out,
                 return VLC_SUCCESS;
             break;
         case VLC_CODEC_VAAPI_420_10BPP:
-            if (in->i_chroma == VLC_CODEC_P010)
+            if (in->i_chroma == VLC_CODEC_P010
+             || in->i_chroma == VLC_CODEC_I420_10B)
+            {
+                *pixel_bytes = 2;
                 return VLC_SUCCESS;
+            }
             break;
     }
     return VLC_EGENERIC;
@@ -309,7 +328,9 @@ vlc_vaapi_OpenChroma(vlc_object_t *obj)
         return VLC_EGENERIC;
 
     bool is_upload;
-    if (CheckFmt(&filter->fmt_in.video, &filter->fmt_out.video, &is_upload))
+    uint8_t pixel_bytes;
+    if (CheckFmt(&filter->fmt_in.video, &filter->fmt_out.video, &is_upload,
+                 &pixel_bytes))
         return VLC_EGENERIC;
 
     filter->pf_video_filter = is_upload ? UploadSurface : DownloadSurface;
@@ -352,7 +373,8 @@ vlc_vaapi_OpenChroma(vlc_object_t *obj)
         filter_sys->dest_pics = NULL;
     }
 
-    if (CopyInitCache(&filter_sys->cache, filter->fmt_in.video.i_width))
+    if (CopyInitCache(&filter_sys->cache, filter->fmt_in.video.i_width
+                      * pixel_bytes))
     {
         if (is_upload)
         {



More information about the vlc-commits mailing list