vlc/vlc-1.2 | branch: master | Naohiro KORIYAMA <[email protected]> | Sun Jan 
 8 13:59:33 2012 +0900| [a570c3f448895849d2ada425892d5aa9064432b1] | committer: 
Jean-Baptiste Kempf

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 <[email protected]>
(cherry picked from commit 577b183d295adbea85e03502d73d04fd3f90ef90)

Signed-off-by: Jean-Baptiste Kempf <[email protected]>

> http://git.videolan.org/gitweb.cgi/vlc/vlc-1.2.git/?a=commit;h=a570c3f448895849d2ada425892d5aa9064432b1
---

 modules/video_filter/deinterlace/yadif_template.h |   32 +++++++++-----------
 1 files changed, 14 insertions(+), 18 deletions(-)

diff --git a/modules/video_filter/deinterlace/yadif_template.h 
b/modules/video_filter/deinterlace/yadif_template.h
index de6bb4a..0a4b63b 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),\

_______________________________________________
vlc-commits mailing list
[email protected]
http://mailman.videolan.org/listinfo/vlc-commits

Reply via email to