aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitor Sessak <vitor1001@gmail.com>2011-01-29 14:14:32 +0000
committerMans Rullgard <mans@mansr.com>2011-01-29 15:32:14 +0000
commit3af1fe829ee6db5eafe261947e74b8516ffe5188 (patch)
tree461db73a4b52616078938cc9aeea5fa0e74df33f
parentce20edb7bd6c1768ef5f4d181d7ba27a0e7945bd (diff)
downloadffmpeg-3af1fe829ee6db5eafe261947e74b8516ffe5188.tar.gz
Fix overread in altivec DSP function sad16
Signed-off-by: Mans Rullgard <mans@mansr.com>
-rw-r--r--libavcodec/ppc/dsputil_altivec.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/libavcodec/ppc/dsputil_altivec.c b/libavcodec/ppc/dsputil_altivec.c
index 163323264c..6779312c96 100644
--- a/libavcodec/ppc/dsputil_altivec.c
+++ b/libavcodec/ppc/dsputil_altivec.c
@@ -230,7 +230,7 @@ static int sad16_altivec(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, i
int i;
int s;
const vector unsigned int zero = (const vector unsigned int)vec_splat_u32(0);
- vector unsigned char perm1, perm2, *pix1v, *pix2v;
+ vector unsigned char perm1, perm2, pix1v_low, pix1v_high, pix2v_low, pix2v_high;
vector unsigned char t1, t2, t3,t4, t5;
vector unsigned int sad;
vector signed int sumdiffs;
@@ -241,11 +241,13 @@ static int sad16_altivec(void *v, uint8_t *pix1, uint8_t *pix2, int line_size, i
for (i = 0; i < h; i++) {
/* Read potentially unaligned pixels into t1 and t2 */
perm1 = vec_lvsl(0, pix1);
- pix1v = (vector unsigned char *) pix1;
+ pix1v_high = vec_ld( 0, pix1);
+ pix1v_low = vec_ld(15, pix1);
perm2 = vec_lvsl(0, pix2);
- pix2v = (vector unsigned char *) pix2;
- t1 = vec_perm(pix1v[0], pix1v[1], perm1);
- t2 = vec_perm(pix2v[0], pix2v[1], perm2);
+ pix2v_high = vec_ld( 0, pix2);
+ pix2v_low = vec_ld(15, pix2);
+ t1 = vec_perm(pix1v_high, pix1v_low, perm1);
+ t2 = vec_perm(pix2v_high, pix2v_low, perm2);
/* Calculate a sum of abs differences vector */
t3 = vec_max(t1, t2);