aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2013-12-30 09:31:57 +0100
committerAnton Khirnov <anton@khirnov.net>2014-01-06 08:19:29 +0100
commit2f97094608cfd2665660f7a26a3291559b186752 (patch)
tree5773a8b758c55ab29b7430a44ff053e00a524c81
parentf4a8a0080537484154bb74e08ec76cbcbd25484b (diff)
downloadffmpeg-2f97094608cfd2665660f7a26a3291559b186752.tar.gz
lagarith: do not call simd functions on unaligned lines
They end up overwriting past the line end. Partially based on a patch by Michael Niedermayer <michaelni@gmx.at> Bug-Id: vlc/9700 Signed-off-by: Luca Barbato <lu_zero@gentoo.org> Signed-off-by: Anton Khirnov <anton@khirnov.net>
-rw-r--r--libavcodec/lagarith.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/libavcodec/lagarith.c b/libavcodec/lagarith.c
index ce2942a5f6..292d952a7d 100644
--- a/libavcodec/lagarith.c
+++ b/libavcodec/lagarith.c
@@ -248,9 +248,12 @@ static void lag_pred_line(LagarithContext *l, uint8_t *buf,
int L, TL;
if (!line) {
+ int i, align_width = (width - 1) & ~31;
/* Left prediction only for first line */
L = l->dsp.add_hfyu_left_prediction(buf + 1, buf + 1,
- width - 1, buf[0]);
+ align_width, buf[0]);
+ for (i = align_width + 1; i < width; i++)
+ buf[i] += buf[i - 1];
} else {
/* Left pixel is actually prev_row[width] */
L = buf[width - stride - 1];
@@ -276,11 +279,18 @@ static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf,
int L, TL;
if (!line) {
+ int i, align_width;
if (is_luma) {
buf++;
width--;
}
- l->dsp.add_hfyu_left_prediction(buf + 1, buf + 1, width - 1, buf[0]);
+
+ align_width = (width - 1) & ~31;
+ l->dsp.add_hfyu_left_prediction(buf + 1, buf + 1, align_width, buf[0]);
+
+ for (i = align_width + 1; i < width; i++)
+ buf[i] += buf[i - 1];
+
return;
}
if (line == 1) {
@@ -293,14 +303,17 @@ static void lag_pred_line_yuy2(LagarithContext *l, uint8_t *buf,
L += buf[i];
buf[i] = L;
}
- buf += HEAD;
- width -= HEAD;
+ for (; i < width; i++) {
+ L = mid_pred(L & 0xFF, buf[i - stride], (L + buf[i - stride] - TL) & 0xFF) + buf[i];
+ TL = buf[i - stride];
+ buf[i] = L;
+ }
} else {
TL = buf[width - (2 * stride) - 1];
L = buf[width - stride - 1];
+ l->dsp.add_hfyu_median_prediction(buf, buf - stride, buf, width,
+ &L, &TL);
}
- l->dsp.add_hfyu_median_prediction(buf, buf - stride, buf, width,
- &L, &TL);
}
static int lag_decode_line(LagarithContext *l, lag_rac *rac,