videoconvert: small cleanups
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 27 Jul 2012 10:19:04 +0000 (12:19 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Fri, 27 Jul 2012 10:19:04 +0000 (12:19 +0200)
Make function pointers NULL when nothing needs to be done.
Pass target pixels to dither and matrix functions so that we can later make
them operate on the target buffer memory directly.

gst/videoconvert/videoconvert.c
gst/videoconvert/videoconvert.h

index 6ab1d95..0213e35 100644 (file)
 
 static void videoconvert_convert_generic (VideoConvert * convert,
     GstVideoFrame * dest, const GstVideoFrame * src);
-static void videoconvert_convert_matrix (VideoConvert * convert);
-static void videoconvert_convert_matrix16 (VideoConvert * convert);
+static void videoconvert_convert_matrix (VideoConvert * convert,
+    guint8 * pixels);
+static void videoconvert_convert_matrix16 (VideoConvert * convert,
+    guint16 * pixels);
 static gboolean videoconvert_convert_lookup_fastpath (VideoConvert * convert);
 static gboolean videoconvert_convert_compute_matrix (VideoConvert * convert);
-static void videoconvert_dither_none (VideoConvert * convert, int j);
-static void videoconvert_dither_verterr (VideoConvert * convert, int j);
-static void videoconvert_dither_halftone (VideoConvert * convert, int j);
+static void videoconvert_dither_verterr (VideoConvert * convert,
+    guint16 * pixels, int j);
+static void videoconvert_dither_halftone (VideoConvert * convert,
+    guint16 * pixels, int j);
 
 
 VideoConvert *
@@ -52,7 +55,7 @@ videoconvert_convert_new (GstVideoInfo * in_info, GstVideoInfo * out_info)
 
   convert->in_info = *in_info;
   convert->out_info = *out_info;
-  convert->dither16 = videoconvert_dither_none;
+  convert->dither16 = NULL;
 
   if (!videoconvert_convert_lookup_fastpath (convert)) {
     convert->convert = videoconvert_convert_generic;
@@ -117,7 +120,7 @@ videoconvert_convert_set_dither (VideoConvert * convert, int type)
   switch (type) {
     case 0:
     default:
-      convert->dither16 = videoconvert_dither_none;
+      convert->dither16 = NULL;
       break;
     case 1:
       convert->dither16 = videoconvert_dither_verterr;
@@ -135,18 +138,17 @@ videoconvert_convert_convert (VideoConvert * convert,
   convert->convert (convert, dest, src);
 }
 
-void
-videoconvert_convert_matrix (VideoConvert * convert)
+static void
+videoconvert_convert_matrix (VideoConvert * convert, guint8 * pixels)
 {
   int i;
   int r, g, b;
   int y, u, v;
-  guint8 *tmpline = convert->tmpline;
 
   for (i = 0; i < convert->width; i++) {
-    r = tmpline[i * 4 + 1];
-    g = tmpline[i * 4 + 2];
-    b = tmpline[i * 4 + 3];
+    r = pixels[i * 4 + 1];
+    g = pixels[i * 4 + 2];
+    b = pixels[i * 4 + 3];
 
     y = (convert->cmatrix[0][0] * r + convert->cmatrix[0][1] * g +
         convert->cmatrix[0][2] * b + convert->cmatrix[0][3]) >> 8;
@@ -155,24 +157,23 @@ videoconvert_convert_matrix (VideoConvert * convert)
     v = (convert->cmatrix[2][0] * r + convert->cmatrix[2][1] * g +
         convert->cmatrix[2][2] * b + convert->cmatrix[2][3]) >> 8;
 
-    tmpline[i * 4 + 1] = CLAMP (y, 0, 255);
-    tmpline[i * 4 + 2] = CLAMP (u, 0, 255);
-    tmpline[i * 4 + 3] = CLAMP (v, 0, 255);
+    pixels[i * 4 + 1] = CLAMP (y, 0, 255);
+    pixels[i * 4 + 2] = CLAMP (u, 0, 255);
+    pixels[i * 4 + 3] = CLAMP (v, 0, 255);
   }
 }
 
-void
-videoconvert_convert_matrix16 (VideoConvert * convert)
+static void
+videoconvert_convert_matrix16 (VideoConvert * convert, guint16 * pixels)
 {
   int i;
   int r, g, b;
   int y, u, v;
-  guint16 *tmpline = convert->tmpline16;
 
   for (i = 0; i < convert->width; i++) {
-    r = tmpline[i * 4 + 1];
-    g = tmpline[i * 4 + 2];
-    b = tmpline[i * 4 + 3];
+    r = pixels[i * 4 + 1];
+    g = pixels[i * 4 + 2];
+    b = pixels[i * 4 + 3];
 
     y = (convert->cmatrix[0][0] * r + convert->cmatrix[0][1] * g +
         convert->cmatrix[0][2] * b + convert->cmatrix[0][3]) >> 8;
@@ -181,18 +182,12 @@ videoconvert_convert_matrix16 (VideoConvert * convert)
     v = (convert->cmatrix[2][0] * r + convert->cmatrix[2][1] * g +
         convert->cmatrix[2][2] * b + convert->cmatrix[2][3]) >> 8;
 
-    tmpline[i * 4 + 1] = CLAMP (y, 0, 65535);
-    tmpline[i * 4 + 2] = CLAMP (u, 0, 65535);
-    tmpline[i * 4 + 3] = CLAMP (v, 0, 65535);
+    pixels[i * 4 + 1] = CLAMP (y, 0, 65535);
+    pixels[i * 4 + 2] = CLAMP (u, 0, 65535);
+    pixels[i * 4 + 3] = CLAMP (v, 0, 65535);
   }
 }
 
-static void
-matrix_identity (VideoConvert * convert)
-{
-  /* do nothing */
-}
-
 static gboolean
 get_Kr_Kb (GstVideoColorMatrix matrix, gdouble * Kr, gdouble * Kb)
 {
@@ -260,8 +255,8 @@ videoconvert_convert_compute_matrix (VideoConvert * convert)
   if (in_info->colorimetry.range == out_info->colorimetry.range &&
       in_info->colorimetry.matrix == out_info->colorimetry.matrix) {
     GST_DEBUG ("using identity color transform");
-    convert->matrix = matrix_identity;
-    convert->matrix16 = matrix_identity;
+    convert->matrix = NULL;
+    convert->matrix16 = NULL;
     return TRUE;
   }
 
@@ -350,12 +345,7 @@ no_pack_func:
 }
 
 static void
-videoconvert_dither_none (VideoConvert * convert, int j)
-{
-}
-
-static void
-videoconvert_dither_verterr (VideoConvert * convert, int j)
+videoconvert_dither_verterr (VideoConvert * convert, guint16 * pixels, int j)
 {
   int i;
   guint16 *tmpline = convert->tmpline16;
@@ -372,7 +362,7 @@ videoconvert_dither_verterr (VideoConvert * convert, int j)
 }
 
 static void
-videoconvert_dither_halftone (VideoConvert * convert, int j)
+videoconvert_dither_halftone (VideoConvert * convert, guint16 * pixels, int j)
 {
   int i;
   guint16 *tmpline = convert->tmpline16;
@@ -431,10 +421,13 @@ videoconvert_convert_generic (VideoConvert * convert, GstVideoFrame * dest,
     }
 
     if (out_bits == 16 || in_bits == 16) {
-      convert->matrix16 (convert);
-      convert->dither16 (convert, j);
+      if (convert->matrix16)
+        convert->matrix16 (convert, convert->tmpline16);
+      if (convert->dither16)
+        convert->dither16 (convert, convert->tmpline16, j);
     } else {
-      convert->matrix (convert);
+      if (convert->matrix)
+        convert->matrix (convert, convert->tmpline);
     }
 
     if (out_bits == 16) {
index 6b2cc18..33138e0 100644 (file)
@@ -53,9 +53,9 @@ struct _VideoConvert {
   guint16 *errline;
 
   void (*convert) (VideoConvert *convert, GstVideoFrame *dest, const GstVideoFrame *src);
-  void (*matrix) (VideoConvert *convert);
-  void (*matrix16) (VideoConvert *convert);
-  void (*dither16) (VideoConvert *convert, int j);
+  void (*matrix) (VideoConvert *convert, guint8 * pixels);
+  void (*matrix16) (VideoConvert *convert, guint16 * pixels);
+  void (*dither16) (VideoConvert *convert, guint16 * pixels, int j);
 };
 
 VideoConvert *   videoconvert_convert_new            (GstVideoInfo *in_info,