Commit e1813a2f authored by Loren Merritt's avatar Loren Merritt

30% faster ff_vorbis_floor1_render_list, 3% faster overall

Originally committed as revision 11883 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 2c70770e
...@@ -141,29 +141,23 @@ void ff_vorbis_ready_floor1_list(floor1_entry_t * list, int values) { ...@@ -141,29 +141,23 @@ void ff_vorbis_ready_floor1_list(floor1_entry_t * list, int values) {
} }
} }
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 dy = y1 - y0;
int adx = x1 - x0; int adx = x1 - x0;
int ady = FFABS(dy);
int base = dy / adx; int base = dy / adx;
int ady = FFABS(dy) - FFABS(base) * adx;
int x = x0; int x = x0;
int y = y0; int y = y0;
int err = 0; int err = 0;
int sy; int sy = dy<0 ? -1 : 1;
if (dy < 0) sy = base - 1;
else sy = base + 1;
ady = ady - FFABS(base) * adx;
if (x >= n) return;
buf[x] = ff_vorbis_floor1_inverse_db_table[y]; buf[x] = ff_vorbis_floor1_inverse_db_table[y];
for (x = x0 + 1; x < x1; x++) { while (++x < x1) {
if (x >= n) return;
err += ady; err += ady;
if (err >= adx) { if (err >= adx) {
err -= adx; err -= adx;
y += sy; y += sy;
} else {
y += base;
} }
y += base;
buf[x] = ff_vorbis_floor1_inverse_db_table[y]; buf[x] = ff_vorbis_floor1_inverse_db_table[y];
} }
} }
...@@ -175,11 +169,14 @@ void ff_vorbis_floor1_render_list(floor1_entry_t * list, int values, uint_fast16 ...@@ -175,11 +169,14 @@ void ff_vorbis_floor1_render_list(floor1_entry_t * list, int values, uint_fast16
for (i = 1; i < values; i++) { for (i = 1; i < values; i++) {
int pos = list[i].sort; int pos = list[i].sort;
if (flag[pos]) { if (flag[pos]) {
render_line(lx, ly, list[pos].x, y_list[pos] * multiplier, out, samples); int x1 = list[pos].x;
lx = list[pos].x; int y1 = y_list[pos] * multiplier;
ly = 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) break;
} }
if (lx < samples) render_line(lx, ly, samples, ly, out, samples); if (lx < samples) render_line(lx, ly, samples, ly, out);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment