From 577b183d295adbea85e03502d73d04fd3f90ef90 Mon Sep 17 00:00:00 2001 From: Naohiro KORIYAMA Date: Sun, 8 Jan 2012 13:59:33 +0900 Subject: [PATCH] Fixed a crash caused by yadif on Windows XP (again #5793) Align stack variables manually in yadif x86 code. This is fixed for the issue that yadif crashes VLC on Windows XP. This issue happens win32 build on Windows 32bit. This issue doesn't happen win32 build on Windows 64bit. Signed-off-by: Jean-Baptiste Kempf --- modules/video_filter/deinterlace/yadif_template.h | 32 ++++++++++------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/modules/video_filter/deinterlace/yadif_template.h b/modules/video_filter/deinterlace/yadif_template.h index de6bb4ae2a..0a4b63bd98 100644 --- a/modules/video_filter/deinterlace/yadif_template.h +++ b/modules/video_filter/deinterlace/yadif_template.h @@ -110,10 +110,8 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, uint8_t *prev, uint8_t *cur, uint8_t *next, int w, int prefs, int mrefs, int parity, int mode) { - DECLARE_ALIGNED(16, uint8_t, tmp0[16]); - DECLARE_ALIGNED(16, uint8_t, tmp1[16]); - DECLARE_ALIGNED(16, uint8_t, tmp2[16]); - DECLARE_ALIGNED(16, uint8_t, tmp3[16]); + uint8_t tmp[5*16]; + uint8_t *tmpA= (uint8_t*)(((uint64_t)(tmp+15)) & ~15); int x; #define FILTER\ @@ -127,9 +125,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, MOVQ" "MM"3, "MM"4 \n\t"\ "paddw "MM"2, "MM"3 \n\t"\ "psraw $1, "MM"3 \n\t" /* d = (prev2[x] + next2[x])>>1 */\ - MOVQ" "MM"0, %[tmp0] \n\t" /* c */\ - MOVQ" "MM"3, %[tmp1] \n\t" /* d */\ - MOVQ" "MM"1, %[tmp2] \n\t" /* e */\ + MOVQ" "MM"0, (%[tmpA]) \n\t" /* c */\ + MOVQ" "MM"3, 16(%[tmpA]) \n\t" /* d */\ + MOVQ" "MM"1, 32(%[tmpA]) \n\t" /* e */\ "psubw "MM"4, "MM"2 \n\t"\ PABS( MM"4", MM"2") /* temporal_diff0 */\ LOAD("(%[prev],%[mrefs])", MM"3") /* prev[x-refs] */\ @@ -151,7 +149,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, "paddw "MM"4, "MM"3 \n\t" /* temporal_diff2 */\ "psrlw $1, "MM"3 \n\t"\ "pmaxsw "MM"3, "MM"2 \n\t"\ - MOVQ" "MM"2, %[tmp3] \n\t" /* diff */\ + MOVQ" "MM"2, 48(%[tmpA]) \n\t" /* diff */\ \ "paddw "MM"0, "MM"1 \n\t"\ "paddw "MM"0, "MM"0 \n\t"\ @@ -182,7 +180,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, CHECK2\ \ /* if(p->mode<2) ... */\ - MOVQ" %[tmp3], "MM"6 \n\t" /* diff */\ + MOVQ" 48(%[tmpA]), "MM"6 \n\t" /* diff */\ "cmpl $2, %[mode] \n\t"\ "jge 1f \n\t"\ LOAD("(%["prev2"],%[mrefs],2)", MM"2") /* prev2[x-2*refs] */\ @@ -193,9 +191,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, "paddw "MM"5, "MM"3 \n\t"\ "psrlw $1, "MM"2 \n\t" /* b */\ "psrlw $1, "MM"3 \n\t" /* f */\ - MOVQ" %[tmp0], "MM"4 \n\t" /* c */\ - MOVQ" %[tmp1], "MM"5 \n\t" /* d */\ - MOVQ" %[tmp2], "MM"7 \n\t" /* e */\ + MOVQ" (%[tmpA]), "MM"4 \n\t" /* c */\ + MOVQ" 16(%[tmpA]), "MM"5 \n\t" /* d */\ + MOVQ" 32(%[tmpA]), "MM"7 \n\t" /* e */\ "psubw "MM"4, "MM"2 \n\t" /* b-c */\ "psubw "MM"7, "MM"3 \n\t" /* f-e */\ MOVQ" "MM"5, "MM"0 \n\t"\ @@ -214,7 +212,7 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, "pmaxsw "MM"4, "MM"6 \n\t" /* diff= MAX3(diff, min, -max); */\ "1: \n\t"\ \ - MOVQ" %[tmp1], "MM"2 \n\t" /* d */\ + MOVQ" 16(%[tmpA]), "MM"2 \n\t" /* d */\ MOVQ" "MM"2, "MM"3 \n\t"\ "psubw "MM"6, "MM"2 \n\t" /* d-diff */\ "paddw "MM"6, "MM"3 \n\t" /* d+diff */\ @@ -222,11 +220,9 @@ VLC_TARGET static void RENAME(yadif_filter_line)(uint8_t *dst, "pminsw "MM"3, "MM"1 \n\t" /* d = clip(spatial_pred, d-diff, d+diff); */\ "packuswb "MM"1, "MM"1 \n\t"\ \ - :[tmp0]"=m"(tmp0),\ - [tmp1]"=m"(tmp1),\ - [tmp2]"=m"(tmp2),\ - [tmp3]"=m"(tmp3)\ - :[prev] "r"(prev),\ + :\ + :[tmpA] "r"(tmpA),\ + [prev] "r"(prev),\ [cur] "r"(cur),\ [next] "r"(next),\ [prefs]"r"((x86_reg)prefs),\ -- 2.11.4.GIT