[vlc-commits] transform: handle chromas with 16-bits or 32-bits per component

Rémi Denis-Courmont git at videolan.org
Sat Mar 17 18:33:00 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Mar 17 19:31:22 2012 +0200| [f866e62138fb4489823b406389c0278f8c30e1d4] | committer: Rémi Denis-Courmont

transform: handle chromas with 16-bits or 32-bits per component

This includes RV15, RV16, RV23 and high depth YUV chromas.

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

 modules/video_filter/transform.c |   64 +++++++++++++++++++++++++++++++++----
 1 files changed, 57 insertions(+), 7 deletions(-)

diff --git a/modules/video_filter/transform.c b/modules/video_filter/transform.c
index c0c3a3b..be055c3 100644
--- a/modules/video_filter/transform.c
+++ b/modules/video_filter/transform.c
@@ -110,6 +110,42 @@ static void Plane8_##f(plane_t *restrict dst, const plane_t *restrict src) \
                 src->p_pixels[sy * src->i_pitch + sx]; \
         } \
     } \
+} \
+ \
+static void Plane16_##f(plane_t *restrict dst, const plane_t *restrict src) \
+{ \
+    const uint16_t *src_pixels = (const uint16_t *)src->p_pixels; \
+    uint16_t *restrict dst_pixels = (uint16_t *)dst->p_pixels; \
+    unsigned src_pitch = src->i_pitch / 2; \
+    unsigned dst_pitch = dst->i_pitch / 2; \
+    unsigned dst_visible_width = dst->i_visible_pitch / 2; \
+ \
+    for (int y = 0; y < dst->i_visible_lines; y++) { \
+        for (unsigned x = 0; x < dst_visible_width; x++) { \
+            int sx, sy; \
+            (f)(&sx, &sy, dst_visible_width, dst->i_visible_lines, x, y);\
+            dst_pixels[y * dst_pitch + x] = \
+                src_pixels[sy * src_pitch + sx]; \
+        } \
+    } \
+} \
+ \
+static void Plane32_##f(plane_t *restrict dst, const plane_t *restrict src) \
+{ \
+    const uint32_t *src_pixels = (const uint32_t *)src->p_pixels; \
+    uint32_t *restrict dst_pixels = (uint32_t *)dst->p_pixels; \
+    unsigned src_pitch = src->i_pitch / 4; \
+    unsigned dst_pitch = dst->i_pitch / 4; \
+    unsigned dst_visible_width = dst->i_visible_pitch / 4; \
+ \
+    for (int y = 0; y < dst->i_visible_lines; y++) { \
+        for (unsigned x = 0; x < dst_visible_width; x++) { \
+            int sx, sy; \
+            (f)(&sx, &sy, dst_visible_width, dst->i_visible_lines, x, y);\
+            dst_pixels[y * dst_pitch + x] = \
+                src_pixels[sy * src_pitch + sx]; \
+        } \
+    } \
 }
 
 PLANAR(HFlip)
@@ -123,11 +159,13 @@ typedef struct {
     bool      is_rotated;
     convert_t convert;
     convert_t iconvert;
-    void      (*plane8)(plane_t *dst, const plane_t *src);
+    void      (*plane8) (plane_t *dst, const plane_t *src);
+    void      (*plane16)(plane_t *dst, const plane_t *src);
+    void      (*plane32)(plane_t *dst, const plane_t *src);
 } transform_description_t;
 
 #define DESC(str, rotated, f, invf) \
-    { str, rotated, f, invf, Plane8_##f, }
+    { str, rotated, f, invf, Plane8_##f, Plane16_##f, Plane32_##f }
 
 static const transform_description_t descriptions[] = {
     DESC("90",    true,  R90,   R270),
@@ -185,9 +223,6 @@ static bool SupportedChroma(const vlc_chroma_description_t *chroma)
     if (chroma == NULL)
         return false;
 
-    if (chroma->pixel_size != 1)
-        return false;
-
     for (unsigned i = 0; i < chroma->plane_count; i++)
         if (chroma->p[i].w.num * chroma->p[i].h.den
          != chroma->p[i].h.num * chroma->p[i].w.den)
@@ -206,7 +241,7 @@ static int Open(vlc_object_t *object)
         vlc_fourcc_GetChromaDescription(src->i_chroma);
     if (!SupportedChroma(chroma)) {
         msg_Err(filter, "Unsupported chroma (%4.4s)", (char*)&src->i_chroma);
-        /* TODO support packed and rgb */
+        /* TODO support I422 ?! */
         return VLC_EGENERIC;
     }
 
@@ -232,7 +267,22 @@ static int Open(vlc_object_t *object)
 
     free(type_name);
 
-    sys->plane = dsc->plane8;
+    switch (chroma->pixel_size) {
+        case 1:
+            sys->plane = dsc->plane8;
+            break;
+        case 2:
+            sys->plane = dsc->plane16;
+            break;
+        case 4:
+            sys->plane = dsc->plane32;
+            break;
+        default:
+            msg_Err(filter, "Unsupported pixel size %u (chroma %4.4s)",
+                    chroma->pixel_size, (char *)&src->i_chroma);
+            goto error;
+    }
+
     sys->convert = dsc->convert;
     if (dsc->is_rotated) {
         if (!filter->b_allow_fmt_out_change) {



More information about the vlc-commits mailing list