transform: add transposition and anti-transposition transforms
authorRémi Denis-Courmont <remi@remlab.net>
Sun, 18 Mar 2012 08:50:28 +0000 (10:50 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sun, 18 Mar 2012 08:58:49 +0000 (10:58 +0200)
modules/video_filter/transform.c

index 12949a5..ab88b74 100644 (file)
@@ -3,7 +3,7 @@
  *****************************************************************************
  * Copyright (C) 2000-2006 the VideoLAN team
  * Copyright (C) 2010 Laurent Aimar
- * $Id$
+ * Copyright (C) 2012 Rémi Denis-Courmont
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *          Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
@@ -45,10 +45,12 @@ static void Close(vlc_object_t *);
 #define CFG_PREFIX "transform-"
 
 #define TYPE_TEXT N_("Transform type")
-static const char * const type_list[] = { "90", "180", "270", "hflip", "vflip" };
+static const char * const type_list[] = { "90", "180", "270",
+    "hflip", "vflip", "transpose", "antitranspose" };
 static const char * const type_list_text[] = { N_("Rotate by 90 degrees"),
-  N_("Rotate by 180 degrees"), N_("Rotate by 270 degrees"),
-  N_("Flip horizontally"), N_("Flip vertically") };
+    N_("Rotate by 180 degrees"), N_("Rotate by 270 degrees"),
+    N_("Flip horizontally"), N_("Flip vertically"),
+    N_("Transpose"), N_("Anti-transpose") };
 
 vlc_module_begin()
     set_description(N_("Video transformation filter"))
@@ -80,6 +82,17 @@ static void VFlip(int *sx, int *sy, int w, int h, int dx, int dy)
     *sx = dx;
     *sy = h - 1 - dy;
 }
+static void Transpose(int *sx, int *sy, int w, int h, int dx, int dy)
+{
+    VLC_UNUSED( h ); VLC_UNUSED( w );
+    *sx = dy;
+    *sy = dx;
+}
+static void AntiTranspose(int *sx, int *sy, int w, int h, int dx, int dy)
+{
+    *sx = h - 1 - dy;
+    *sy = w - 1 - dx;
+}
 static void R90(int *sx, int *sy, int w, int h, int dx, int dy)
 {
     VLC_UNUSED( h );
@@ -150,12 +163,14 @@ static void Plane32_##f(plane_t *restrict dst, const plane_t *restrict src) \
 
 PLANAR(HFlip)
 PLANAR(VFlip)
+PLANAR(Transpose)
+PLANAR(AntiTranspose)
 PLANAR(R90)
 PLANAR(R180)
 PLANAR(R270)
 
 typedef struct {
-    char      name[8];
+    char      name[16];
     bool      is_rotated;
     convert_t convert;
     convert_t iconvert;
@@ -168,11 +183,13 @@ typedef struct {
     { str, rotated, f, invf, Plane8_##f, Plane16_##f, Plane32_##f }
 
 static const transform_description_t descriptions[] = {
-    DESC("90",    true,  R90,   R270),
-    DESC("180",   false, R180,  R180),
-    DESC("270",   true,  R270,  R90),
-    DESC("hflip", false, HFlip, HFlip),
-    DESC("vflip", false, VFlip, VFlip),
+    DESC("90",            true,  R90,           R270),
+    DESC("180",           false, R180,          R180),
+    DESC("270",           true,  R270,          R90),
+    DESC("hflip",         false, HFlip,         HFlip),
+    DESC("vflip",         false, VFlip,         VFlip),
+    DESC("transpose",     true,  Transpose,     Transpose),
+    DESC("antitranspose", true,  AntiTranspose, AntiTranspose),
 };
 
 static const size_t n_transforms =