diff vorbis.c @ 6340:575e0a847f0c libavcodec

30% faster ff_vorbis_floor1_render_list, 3% faster overall
author lorenm
date Sat, 09 Feb 2008 13:53:15 +0000
parents 2b72f9bc4f06
children c93570aeb3eb
line wrap: on
line diff
--- a/vorbis.c	Sat Feb 09 05:29:47 2008 +0000
+++ b/vorbis.c	Sat Feb 09 13:53:15 2008 +0000
@@ -141,29 +141,23 @@
     }
 }
 
-static void render_line(int x0, int y0, int x1, int y1, float * buf, int n) {
+static void render_line(int x0, int y0, int x1, int y1, float * buf) {
     int dy = y1 - y0;
     int adx = x1 - x0;
-    int ady = FFABS(dy);
     int base = dy / adx;
+    int ady = FFABS(dy) - FFABS(base) * adx;
     int x = x0;
     int y = y0;
     int err = 0;
-    int sy;
-    if (dy < 0) sy = base - 1;
-    else        sy = base + 1;
-    ady = ady - FFABS(base) * adx;
-    if (x >= n) return;
+    int sy = dy<0 ? -1 : 1;
     buf[x] = ff_vorbis_floor1_inverse_db_table[y];
-    for (x = x0 + 1; x < x1; x++) {
-        if (x >= n) return;
+    while (++x < x1) {
         err += ady;
         if (err >= adx) {
             err -= adx;
             y += sy;
-        } else {
-            y += base;
         }
+        y += base;
         buf[x] = ff_vorbis_floor1_inverse_db_table[y];
     }
 }
@@ -175,11 +169,14 @@
     for (i = 1; i < values; i++) {
         int pos = list[i].sort;
         if (flag[pos]) {
-            render_line(lx, ly, list[pos].x, y_list[pos] * multiplier, out, samples);
-            lx = list[pos].x;
-            ly = y_list[pos] * multiplier;
+            int x1 = list[pos].x;
+            int y1 = y_list[pos] * multiplier;
+            if (lx < samples)
+                render_line(lx, ly, FFMIN(x1,samples), y1, out);
+            lx = x1;
+            ly = y1;
         }
         if (lx >= samples) break;
     }
-    if (lx < samples) render_line(lx, ly, samples, ly, out, samples);
+    if (lx < samples) render_line(lx, ly, samples, ly, out);
 }