summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2016-03-29 15:00:45 +0200
committerPaul B Mahol <onemda@gmail.com>2016-03-29 22:02:48 +0200
commit4a80a6ad2129fb2b30610d2a0cde7a9cab9c54a6 (patch)
treee90c7790d284b94f6555ee80a1771103ab7c560a /libavfilter
parentb73c27151eda795932a0169274ed6c2c8bcde062 (diff)
avfilter/vf_waveform: optimize lowpass filter even more
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/vf_waveform.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/libavfilter/vf_waveform.c b/libavfilter/vf_waveform.c
index 62fba6c7b3..26aa809c4c 100644
--- a/libavfilter/vf_waveform.c
+++ b/libavfilter/vf_waveform.c
@@ -698,29 +698,54 @@ static av_always_inline void lowpass(WaveformContext *s,
uint8_t *dst = dst_line;
for (p = src_data; p < src_data_end; p++) {
- int i = 0;
uint8_t *target;
if (column) {
- do {
- target = dst++ + dst_signed_linesize * *p;
- update(target, max, intensity);
- } while (++i < step);
+ target = dst + dst_signed_linesize * *p;
+ dst += step;
+ update(target, max, intensity);
} else {
uint8_t *row = dst_data;
- do {
- if (mirror)
- target = row - *p - 1;
- else
- target = row + *p;
- update(target, max, intensity);
- row += dst_linesize;
- } while (++i < step);
+ if (mirror)
+ target = row - *p - 1;
+ else
+ target = row + *p;
+ update(target, max, intensity);
+ row += dst_linesize;
}
}
src_data += src_linesize;
dst_data += dst_linesize * step;
}
+ if (column && step > 1) {
+ const int dst_w = s->display == PARADE ? out->width / s->acomp : out->width;
+ const int dst_h = 256;
+ uint8_t *dst;
+ int x, z;
+
+ dst = out->data[plane] + offset_y * dst_linesize + offset_x;
+ for (y = 0; y < dst_h; y++) {
+ for (x = 0; x < dst_w; x+=step) {
+ for (z = 1; z < step; z++) {
+ dst[x + z] = dst[x];
+ }
+ }
+ dst += dst_linesize;
+ }
+ } else if (step > 1) {
+ const int dst_h = s->display == PARADE ? out->height / s->acomp : out->height;
+ const int dst_w = 256;
+ uint8_t *dst;
+ int z;
+
+ dst = out->data[plane] + offset_y * dst_linesize + offset_x;
+ for (y = 0; y < dst_h; y+=step) {
+ for (z = 1; z < step; z++)
+ memcpy(dst + dst_linesize * z, dst, dst_w);
+ dst += dst_linesize * step;
+ }
+ }
+
envelope(s, out, plane, plane, column ? offset_x : offset_y);
}