Index: third_party/libwebp/enc/histogram.c |
diff --git a/third_party/libwebp/enc/histogram.c b/third_party/libwebp/enc/histogram.c |
index 7c6abb4d65aeb734e0b0fc3f1820a941f98aa7f6..a2266b418e60024809c09dae7f089b0671fdf68a 100644 |
--- a/third_party/libwebp/enc/histogram.c |
+++ b/third_party/libwebp/enc/histogram.c |
@@ -20,6 +20,9 @@ |
#include "../dsp/lossless.h" |
#include "../utils/utils.h" |
+#define ALIGN_CST 15 |
+#define DO_ALIGN(PTR) ((uintptr_t)((PTR) + ALIGN_CST) & ~ALIGN_CST) |
+ |
#define MAX_COST 1.e38 |
// Number of partitions for the three dominant (literal, red and blue) symbol |
@@ -101,9 +104,9 @@ VP8LHistogram* VP8LAllocateHistogram(int cache_bits) { |
VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits) { |
int i; |
VP8LHistogramSet* set; |
- const size_t total_size = sizeof(*set) |
- + sizeof(*set->histograms) * size |
- + (size_t)VP8LGetHistogramSize(cache_bits) * size; |
+ const int histo_size = VP8LGetHistogramSize(cache_bits); |
+ const size_t total_size = |
+ sizeof(*set) + size * (sizeof(*set->histograms) + histo_size + ALIGN_CST); |
uint8_t* memory = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*memory)); |
if (memory == NULL) return NULL; |
@@ -114,12 +117,12 @@ VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits) { |
set->max_size = size; |
set->size = size; |
for (i = 0; i < size; ++i) { |
+ memory = (uint8_t*)DO_ALIGN(memory); |
set->histograms[i] = (VP8LHistogram*)memory; |
// literal_ won't necessary be aligned. |
set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram)); |
VP8LHistogramInit(set->histograms[i], cache_bits); |
- // There's no padding/alignment between successive histograms. |
- memory += VP8LGetHistogramSize(cache_bits); |
+ memory += histo_size; |
} |
return set; |
} |