]> granicus.if.org Git - libvpx/commitdiff
vp9/encoder: fix segfault on win32 using vs < 2015
authorJames Zern <jzern@google.com>
Fri, 10 Mar 2017 07:36:11 +0000 (23:36 -0800)
committerJames Zern <jzern@google.com>
Sat, 11 Mar 2017 01:37:17 +0000 (17:37 -0800)
shift the bsse[] member of the macroblock struct to the front to avoid
an incorrect offset (0) to the upper half of bsse[0] which leads to a
negative resulting in a crash. restrict this to visual studio versions
before 2015 (the bug was observed with 2013, fixed in 2015) to avoid any
potential cache impact on other platforms.

https://connect.microsoft.com/VisualStudio/feedback/details/2396360/bad-structure-offset-in-32-bit-code

BUG=webm:1054

Change-Id: I40f68a1d421ccc503cc712192263bab4f7dde076

vp9/encoder/vp9_block.h

index c0c69f6b5cf04cea5a19fc899ddb6fb9aaf34514..c86c818aaadba485fc770fa3dc595e9c9ec3885e 100644 (file)
@@ -63,6 +63,11 @@ typedef struct {
 
 typedef struct macroblock MACROBLOCK;
 struct macroblock {
+// cf. https://bugs.chromium.org/p/webm/issues/detail?id=1054
+#if defined(_MSC_VER) && _MSC_VER < 1900
+  int64_t bsse[MAX_MB_PLANE << 2];
+#endif
+
   struct macroblock_plane plane[MAX_MB_PLANE];
 
   MACROBLOCKD e_mbd;
@@ -149,7 +154,10 @@ struct macroblock {
 #define SKIP_TXFM_AC_DC 1
 #define SKIP_TXFM_AC_ONLY 2
 
+// cf. https://bugs.chromium.org/p/webm/issues/detail?id=1054
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
   int64_t bsse[MAX_MB_PLANE << 2];
+#endif
 
   // Used to store sub partition's choices.
   MV pred_mv[MAX_REF_FRAMES];