| Index: third_party/libwebp/dec/webp.c
|
| diff --git a/third_party/libwebp/dec/webp.c b/third_party/libwebp/dec/webp.c
|
| index b8eb9993b6bee8de39b8369f48866f5216640615..78220433777f69f12d11d84f428f0ee964ab4c1c 100644
|
| --- a/third_party/libwebp/dec/webp.c
|
| +++ b/third_party/libwebp/dec/webp.c
|
| @@ -16,6 +16,7 @@
|
| #include "./vp8i.h"
|
| #include "./vp8li.h"
|
| #include "./webpi.h"
|
| +#include "../utils/utils.h"
|
| #include "../webp/mux_types.h" // ALPHA_FLAG
|
|
|
| //------------------------------------------------------------------------------
|
| @@ -43,14 +44,6 @@
|
| // All sizes are in little-endian order.
|
| // Note: chunk data size must be padded to multiple of 2 when written.
|
|
|
| -static WEBP_INLINE uint32_t get_le24(const uint8_t* const data) {
|
| - return data[0] | (data[1] << 8) | (data[2] << 16);
|
| -}
|
| -
|
| -static WEBP_INLINE uint32_t get_le32(const uint8_t* const data) {
|
| - return (uint32_t)get_le24(data) | (data[3] << 24);
|
| -}
|
| -
|
| // Validates the RIFF container (if detected) and skips over it.
|
| // If a RIFF container is detected, returns:
|
| // VP8_STATUS_BITSTREAM_ERROR for invalid header,
|
| @@ -70,7 +63,7 @@ static VP8StatusCode ParseRIFF(const uint8_t** const data,
|
| if (memcmp(*data + 8, "WEBP", TAG_SIZE)) {
|
| return VP8_STATUS_BITSTREAM_ERROR; // Wrong image file signature.
|
| } else {
|
| - const uint32_t size = get_le32(*data + TAG_SIZE);
|
| + const uint32_t size = GetLE32(*data + TAG_SIZE);
|
| // Check that we have at least one chunk (i.e "WEBP" + "VP8?nnnn").
|
| if (size < TAG_SIZE + CHUNK_HEADER_SIZE) {
|
| return VP8_STATUS_BITSTREAM_ERROR;
|
| @@ -116,7 +109,7 @@ static VP8StatusCode ParseVP8X(const uint8_t** const data,
|
| if (!memcmp(*data, "VP8X", TAG_SIZE)) {
|
| int width, height;
|
| uint32_t flags;
|
| - const uint32_t chunk_size = get_le32(*data + TAG_SIZE);
|
| + const uint32_t chunk_size = GetLE32(*data + TAG_SIZE);
|
| if (chunk_size != VP8X_CHUNK_SIZE) {
|
| return VP8_STATUS_BITSTREAM_ERROR; // Wrong chunk size.
|
| }
|
| @@ -125,9 +118,9 @@ static VP8StatusCode ParseVP8X(const uint8_t** const data,
|
| if (*data_size < vp8x_size) {
|
| return VP8_STATUS_NOT_ENOUGH_DATA; // Insufficient data.
|
| }
|
| - flags = get_le32(*data + 8);
|
| - width = 1 + get_le24(*data + 12);
|
| - height = 1 + get_le24(*data + 15);
|
| + flags = GetLE32(*data + 8);
|
| + width = 1 + GetLE24(*data + 12);
|
| + height = 1 + GetLE24(*data + 15);
|
| if (width * (uint64_t)height >= MAX_IMAGE_AREA) {
|
| return VP8_STATUS_BITSTREAM_ERROR; // image is too large
|
| }
|
| @@ -181,7 +174,7 @@ static VP8StatusCode ParseOptionalChunks(const uint8_t** const data,
|
| return VP8_STATUS_NOT_ENOUGH_DATA;
|
| }
|
|
|
| - chunk_size = get_le32(buf + TAG_SIZE);
|
| + chunk_size = GetLE32(buf + TAG_SIZE);
|
| if (chunk_size > MAX_CHUNK_PAYLOAD) {
|
| return VP8_STATUS_BITSTREAM_ERROR; // Not a valid chunk size.
|
| }
|
| @@ -247,7 +240,7 @@ static VP8StatusCode ParseVP8Header(const uint8_t** const data_ptr,
|
|
|
| if (is_vp8 || is_vp8l) {
|
| // Bitstream contains VP8/VP8L header.
|
| - const uint32_t size = get_le32(data + TAG_SIZE);
|
| + const uint32_t size = GetLE32(data + TAG_SIZE);
|
| if ((riff_size >= minimal_size) && (size > riff_size - minimal_size)) {
|
| return VP8_STATUS_BITSTREAM_ERROR; // Inconsistent size information.
|
| }
|
| @@ -509,11 +502,9 @@ static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
|
| WebPFreeDecBuffer(params->output);
|
| }
|
|
|
| -#if WEBP_DECODER_ABI_VERSION > 0x0203
|
| if (params->options != NULL && params->options->flip) {
|
| status = WebPFlipBuffer(params->output);
|
| }
|
| -#endif
|
| return status;
|
| }
|
|
|
| @@ -796,11 +787,13 @@ int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
|
| // Scaling
|
| io->use_scaling = (options != NULL) && (options->use_scaling > 0);
|
| if (io->use_scaling) {
|
| - if (options->scaled_width <= 0 || options->scaled_height <= 0) {
|
| + int scaled_width = options->scaled_width;
|
| + int scaled_height = options->scaled_height;
|
| + if (!WebPRescalerGetScaledDimensions(w, h, &scaled_width, &scaled_height)) {
|
| return 0;
|
| }
|
| - io->scaled_width = options->scaled_width;
|
| - io->scaled_height = options->scaled_height;
|
| + io->scaled_width = scaled_width;
|
| + io->scaled_height = scaled_height;
|
| }
|
|
|
| // Filter
|
|
|