[FFmpeg-cvslog] avfilter/vf_sab: fix filtering tiny images
Michael Niedermayer
git at videolan.org
Tue Jan 20 03:36:10 CET 2015
ffmpeg | branch: release/2.2 | Michael Niedermayer <michaelni at gmx.at> | Sun Jan 4 01:03:26 2015 +0100| [92a36a4e78e647523baa01f882e078ed2390b06b] | committer: Michael Niedermayer
avfilter/vf_sab: fix filtering tiny images
Fixes out of array reads
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
(cherry picked from commit 9bff052b51f27f6cce04e8d7d8b405c710d7ad67)
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=92a36a4e78e647523baa01f882e078ed2390b06b
---
libavfilter/vf_sab.c | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/libavfilter/vf_sab.c b/libavfilter/vf_sab.c
index 51bbc5a..f5f8916 100644
--- a/libavfilter/vf_sab.c
+++ b/libavfilter/vf_sab.c
@@ -220,6 +220,19 @@ static int config_props(AVFilterLink *inlink)
#define NB_PLANES 4
+static inline int mirror(int x, int w)
+{
+ if (!w)
+ return 0;
+
+ while ((unsigned)x > (unsigned)w) {
+ x = -x;
+ if (x < 0)
+ x += 2 * w;
+ }
+ return x;
+}
+
static void blur(uint8_t *dst, const int dst_linesize,
const uint8_t *src, const int src_linesize,
const int w, const int h, FilterParam *fp)
@@ -253,8 +266,7 @@ static void blur(uint8_t *dst, const int dst_linesize,
for (dy = 0; dy < radius*2 + 1; dy++) {
int dx;
int iy = y+dy - radius;
- if (iy < 0) iy = -iy;
- else if (iy >= h) iy = h+h-iy-1;
+ iy = mirror(iy, h-1);
for (dx = 0; dx < radius*2 + 1; dx++) {
const int ix = x+dx - radius;
@@ -265,13 +277,11 @@ static void blur(uint8_t *dst, const int dst_linesize,
for (dy = 0; dy < radius*2+1; dy++) {
int dx;
int iy = y+dy - radius;
- if (iy < 0) iy = -iy;
- else if (iy >= h) iy = h+h-iy-1;
+ iy = mirror(iy, h-1);
for (dx = 0; dx < radius*2 + 1; dx++) {
int ix = x+dx - radius;
- if (ix < 0) ix = -ix;
- else if (ix >= w) ix = w+w-ix-1;
+ ix = mirror(ix, w-1);
UPDATE_FACTOR;
}
}
More information about the ffmpeg-cvslog
mailing list