diff options
Diffstat (limited to 'thirdparty/libwebp/src')
27 files changed, 120 insertions, 80 deletions
diff --git a/thirdparty/libwebp/src/dec/frame_dec.c b/thirdparty/libwebp/src/dec/frame_dec.c index bda9e1a6f6..04609a8e56 100644 --- a/thirdparty/libwebp/src/dec/frame_dec.c +++ b/thirdparty/libwebp/src/dec/frame_dec.c @@ -732,7 +732,7 @@ static int AllocateMemory(VP8Decoder* const dec) {    mem += f_info_size;    dec->thread_ctx_.id_ = 0;    dec->thread_ctx_.f_info_ = dec->f_info_; -  if (dec->mt_method_ > 0) { +  if (dec->filter_type_ > 0 && dec->mt_method_ > 0) {      // secondary cache line. The deblocking process need to make use of the      // filtering strength from previous macroblock row, while the new ones      // are being decoded in parallel. We'll just swap the pointers. diff --git a/thirdparty/libwebp/src/dec/idec_dec.c b/thirdparty/libwebp/src/dec/idec_dec.c index 9bc9166808..9035df5659 100644 --- a/thirdparty/libwebp/src/dec/idec_dec.c +++ b/thirdparty/libwebp/src/dec/idec_dec.c @@ -166,9 +166,11 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,    VP8Decoder* const dec = (VP8Decoder*)idec->dec_;    MemBuffer* const mem = &idec->mem_;    const int need_compressed_alpha = NeedCompressedAlpha(idec); -  const uint8_t* const old_start = mem->buf_ + mem->start_; +  const uint8_t* const old_start = +      (mem->buf_ == NULL) ? NULL : mem->buf_ + mem->start_;    const uint8_t* const old_base =        need_compressed_alpha ? dec->alpha_data_ : old_start; +  assert(mem->buf_ != NULL || mem->start_ == 0);    assert(mem->mode_ == MEM_MODE_APPEND);    if (data_size > MAX_CHUNK_PAYLOAD) {      // security safeguard: trying to allocate more than what the format @@ -184,7 +186,7 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,      uint8_t* const new_buf =          (uint8_t*)WebPSafeMalloc(extra_size, sizeof(*new_buf));      if (new_buf == NULL) return 0; -    memcpy(new_buf, old_base, current_size); +    if (old_base != NULL) memcpy(new_buf, old_base, current_size);      WebPSafeFree(mem->buf_);      mem->buf_ = new_buf;      mem->buf_size_ = (size_t)extra_size; @@ -192,6 +194,7 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,      mem->end_ = current_size;    } +  assert(mem->buf_ != NULL);    memcpy(mem->buf_ + mem->end_, data, data_size);    mem->end_ += data_size;    assert(mem->end_ <= mem->buf_size_); @@ -204,7 +207,9 @@ static int RemapMemBuffer(WebPIDecoder* const idec,                            const uint8_t* const data, size_t data_size) {    MemBuffer* const mem = &idec->mem_;    const uint8_t* const old_buf = mem->buf_; -  const uint8_t* const old_start = old_buf + mem->start_; +  const uint8_t* const old_start = +      (old_buf == NULL) ? NULL : old_buf + mem->start_; +  assert(old_buf != NULL || mem->start_ == 0);    assert(mem->mode_ == MEM_MODE_MAP);    if (data_size < mem->buf_size_) return 0;  // can't remap to a shorter buffer! diff --git a/thirdparty/libwebp/src/dec/vp8i_dec.h b/thirdparty/libwebp/src/dec/vp8i_dec.h index 3de8d86f90..600a684410 100644 --- a/thirdparty/libwebp/src/dec/vp8i_dec.h +++ b/thirdparty/libwebp/src/dec/vp8i_dec.h @@ -31,8 +31,8 @@ extern "C" {  // version numbers  #define DEC_MAJ_VERSION 1 -#define DEC_MIN_VERSION 0 -#define DEC_REV_VERSION 3 +#define DEC_MIN_VERSION 1 +#define DEC_REV_VERSION 0  // YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).  // Constraints are: We need to store one 16x16 block of luma samples (y), diff --git a/thirdparty/libwebp/src/dec/vp8l_dec.c b/thirdparty/libwebp/src/dec/vp8l_dec.c index d3e27119ea..93615d4ed2 100644 --- a/thirdparty/libwebp/src/dec/vp8l_dec.c +++ b/thirdparty/libwebp/src/dec/vp8l_dec.c @@ -754,11 +754,11 @@ static WEBP_INLINE HTreeGroup* GetHtreeGroupForPos(VP8LMetadata* const hdr,  typedef void (*ProcessRowsFunc)(VP8LDecoder* const dec, int row); -static void ApplyInverseTransforms(VP8LDecoder* const dec, int num_rows, +static void ApplyInverseTransforms(VP8LDecoder* const dec, +                                   int start_row, int num_rows,                                     const uint32_t* const rows) {    int n = dec->next_transform_;    const int cache_pixs = dec->width_ * num_rows; -  const int start_row = dec->last_row_;    const int end_row = start_row + num_rows;    const uint32_t* rows_in = rows;    uint32_t* const rows_out = dec->argb_cache_; @@ -789,8 +789,7 @@ static void ProcessRows(VP8LDecoder* const dec, int row) {      VP8Io* const io = dec->io_;      uint8_t* rows_data = (uint8_t*)dec->argb_cache_;      const int in_stride = io->width * sizeof(uint32_t);  // in unit of RGBA - -    ApplyInverseTransforms(dec, num_rows, rows); +    ApplyInverseTransforms(dec, dec->last_row_, num_rows, rows);      if (!SetCropWindow(io, dec->last_row_, row, &rows_data, in_stride)) {        // Nothing to output (this time).      } else { @@ -1193,6 +1192,7 @@ static int DecodeImageData(VP8LDecoder* const dec, uint32_t* const data,        VP8LFillBitWindow(br);        dist_code = GetCopyDistance(dist_symbol, br);        dist = PlaneCodeToDistance(width, dist_code); +        if (VP8LIsEndOfStream(br)) break;        if (src - data < (ptrdiff_t)dist || src_end - src < (ptrdiff_t)length) {          goto Error; @@ -1553,7 +1553,7 @@ static void ExtractAlphaRows(VP8LDecoder* const dec, int last_row) {      const int cache_pixs = width * num_rows_to_process;      uint8_t* const dst = output + width * cur_row;      const uint32_t* const src = dec->argb_cache_; -    ApplyInverseTransforms(dec, num_rows_to_process, in); +    ApplyInverseTransforms(dec, cur_row, num_rows_to_process, in);      WebPExtractGreen(src, dst, cache_pixs);      AlphaApplyFilter(alph_dec,                       cur_row, cur_row + num_rows_to_process, dst, width); diff --git a/thirdparty/libwebp/src/dec/vp8li_dec.h b/thirdparty/libwebp/src/dec/vp8li_dec.h index 0a4d613f99..72b2e86120 100644 --- a/thirdparty/libwebp/src/dec/vp8li_dec.h +++ b/thirdparty/libwebp/src/dec/vp8li_dec.h @@ -37,7 +37,7 @@ struct VP8LTransform {    int                    bits_;   // subsampling bits defining transform window.    int                    xsize_;  // transform window X index.    int                    ysize_;  // transform window Y index. -  uint32_t              *data_;   // transform data. +  uint32_t*              data_;   // transform data.  };  typedef struct { @@ -48,23 +48,23 @@ typedef struct {    int             huffman_mask_;    int             huffman_subsample_bits_;    int             huffman_xsize_; -  uint32_t       *huffman_image_; +  uint32_t*       huffman_image_;    int             num_htree_groups_; -  HTreeGroup     *htree_groups_; -  HuffmanCode    *huffman_tables_; +  HTreeGroup*     htree_groups_; +  HuffmanCode*    huffman_tables_;  } VP8LMetadata;  typedef struct VP8LDecoder VP8LDecoder;  struct VP8LDecoder {    VP8StatusCode    status_;    VP8LDecodeState  state_; -  VP8Io           *io_; +  VP8Io*           io_; -  const WebPDecBuffer *output_;    // shortcut to io->opaque->output +  const WebPDecBuffer* output_;    // shortcut to io->opaque->output -  uint32_t        *pixels_;        // Internal data: either uint8_t* for alpha +  uint32_t*        pixels_;        // Internal data: either uint8_t* for alpha                                     // or uint32_t* for BGRA. -  uint32_t        *argb_cache_;    // Scratch buffer for temporary BGRA storage. +  uint32_t*        argb_cache_;    // Scratch buffer for temporary BGRA storage.    VP8LBitReader    br_;    int              incremental_;   // if true, incremental decoding is expected @@ -86,8 +86,8 @@ struct VP8LDecoder {    // or'd bitset storing the transforms types.    uint32_t         transforms_seen_; -  uint8_t         *rescaler_memory;  // Working memory for rescaling work. -  WebPRescaler    *rescaler;         // Common rescaler for all channels. +  uint8_t*         rescaler_memory;  // Working memory for rescaling work. +  WebPRescaler*    rescaler;         // Common rescaler for all channels.  };  //------------------------------------------------------------------------------ diff --git a/thirdparty/libwebp/src/demux/demux.c b/thirdparty/libwebp/src/demux/demux.c index ab6433e54b..1b3cc2e0a8 100644 --- a/thirdparty/libwebp/src/demux/demux.c +++ b/thirdparty/libwebp/src/demux/demux.c @@ -24,8 +24,8 @@  #include "src/webp/format_constants.h"  #define DMUX_MAJ_VERSION 1 -#define DMUX_MIN_VERSION 0 -#define DMUX_REV_VERSION 3 +#define DMUX_MIN_VERSION 1 +#define DMUX_REV_VERSION 0  typedef struct {    size_t start_;        // start location of the data diff --git a/thirdparty/libwebp/src/dsp/dec_neon.c b/thirdparty/libwebp/src/dsp/dec_neon.c index ffa697fcf9..239ec4167e 100644 --- a/thirdparty/libwebp/src/dsp/dec_neon.c +++ b/thirdparty/libwebp/src/dsp/dec_neon.c @@ -1361,7 +1361,8 @@ static void RD4_NEON(uint8_t* dst) {   // Down-right    const uint32_t J = dst[-1 + 1 * BPS];    const uint32_t K = dst[-1 + 2 * BPS];    const uint32_t L = dst[-1 + 3 * BPS]; -  const uint64x1_t LKJI____ = vcreate_u64(L | (K << 8) | (J << 16) | (I << 24)); +  const uint64x1_t LKJI____ = +      vcreate_u64((uint64_t)L | (K << 8) | (J << 16) | (I << 24));    const uint64x1_t LKJIXABC = vorr_u64(LKJI____, ____XABC);    const uint8x8_t KJIXABC_ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 8));    const uint8x8_t JIXABC__ = vreinterpret_u8_u64(vshr_n_u64(LKJIXABC, 16)); @@ -1427,10 +1428,16 @@ static WEBP_INLINE void DC8_NEON(uint8_t* dst, int do_top, int do_left) {    if (do_top) {      const uint8x8_t A = vld1_u8(dst - BPS);  // top row +#if defined(__aarch64__) +    const uint16x8_t B = vmovl_u8(A); +    const uint16_t p2 = vaddvq_u16(B); +    sum_top = vdupq_n_u16(p2); +#else      const uint16x4_t p0 = vpaddl_u8(A);  // cascading summation of the top      const uint16x4_t p1 = vpadd_u16(p0, p0);      const uint16x4_t p2 = vpadd_u16(p1, p1);      sum_top = vcombine_u16(p2, p2); +#endif    }    if (do_left) { diff --git a/thirdparty/libwebp/src/dsp/dsp.h b/thirdparty/libwebp/src/dsp/dsp.h index fafc2d05d3..a784de334a 100644 --- a/thirdparty/libwebp/src/dsp/dsp.h +++ b/thirdparty/libwebp/src/dsp/dsp.h @@ -246,9 +246,9 @@ extern VP8Fdct VP8FTransform2;   // performs two transforms at a time  extern VP8WHT VP8FTransformWHT;  // Predictions  // *dst is the destination block. *top and *left can be NULL. -typedef void (*VP8IntraPreds)(uint8_t *dst, const uint8_t* left, +typedef void (*VP8IntraPreds)(uint8_t* dst, const uint8_t* left,                                const uint8_t* top); -typedef void (*VP8Intra4Preds)(uint8_t *dst, const uint8_t* top); +typedef void (*VP8Intra4Preds)(uint8_t* dst, const uint8_t* top);  extern VP8Intra4Preds VP8EncPredLuma4;  extern VP8IntraPreds VP8EncPredLuma16;  extern VP8IntraPreds VP8EncPredChroma8; diff --git a/thirdparty/libwebp/src/dsp/lossless.c b/thirdparty/libwebp/src/dsp/lossless.c index d05af84e7b..aad5f43ec9 100644 --- a/thirdparty/libwebp/src/dsp/lossless.c +++ b/thirdparty/libwebp/src/dsp/lossless.c @@ -81,7 +81,7 @@ static WEBP_INLINE uint32_t ClampedAddSubtractHalf(uint32_t c0, uint32_t c1,  // gcc <= 4.9 on ARM generates incorrect code in Select() when Sub3() is  // inlined. -#if defined(__arm__) && LOCAL_GCC_VERSION <= 0x409 +#if defined(__arm__) && defined(__GNUC__) && LOCAL_GCC_VERSION <= 0x409  # define LOCAL_INLINE __attribute__ ((noinline))  #else  # define LOCAL_INLINE WEBP_INLINE @@ -167,15 +167,20 @@ static uint32_t Predictor13_C(uint32_t left, const uint32_t* const top) {    return pred;  } -GENERATE_PREDICTOR_ADD(Predictor0_C, PredictorAdd0_C) +static void PredictorAdd0_C(const uint32_t* in, const uint32_t* upper, +                            int num_pixels, uint32_t* out) { +  int x; +  (void)upper; +  for (x = 0; x < num_pixels; ++x) out[x] = VP8LAddPixels(in[x], ARGB_BLACK); +}  static void PredictorAdd1_C(const uint32_t* in, const uint32_t* upper,                              int num_pixels, uint32_t* out) {    int i;    uint32_t left = out[-1]; +  (void)upper;    for (i = 0; i < num_pixels; ++i) {      out[i] = left = VP8LAddPixels(in[i], left);    } -  (void)upper;  }  GENERATE_PREDICTOR_ADD(Predictor2_C, PredictorAdd2_C)  GENERATE_PREDICTOR_ADD(Predictor3_C, PredictorAdd3_C) diff --git a/thirdparty/libwebp/src/dsp/lossless_common.h b/thirdparty/libwebp/src/dsp/lossless_common.h index a2648d1737..9c2ebe6809 100644 --- a/thirdparty/libwebp/src/dsp/lossless_common.h +++ b/thirdparty/libwebp/src/dsp/lossless_common.h @@ -177,6 +177,7 @@ uint32_t VP8LSubPixels(uint32_t a, uint32_t b) {  static void PREDICTOR_ADD(const uint32_t* in, const uint32_t* upper, \                            int num_pixels, uint32_t* out) {           \    int x;                                                             \ +  assert(upper != NULL);                                             \    for (x = 0; x < num_pixels; ++x) {                                 \      const uint32_t pred = (PREDICTOR)(out[x - 1], upper + x);        \      out[x] = VP8LAddPixels(in[x], pred);                             \ @@ -189,6 +190,7 @@ static void PREDICTOR_ADD(const uint32_t* in, const uint32_t* upper, \  static void PREDICTOR_SUB(const uint32_t* in, const uint32_t* upper, \                            int num_pixels, uint32_t* out) {           \    int x;                                                             \ +  assert(upper != NULL);                                             \    for (x = 0; x < num_pixels; ++x) {                                 \      const uint32_t pred = (PREDICTOR)(in[x - 1], upper + x);         \      out[x] = VP8LSubPixels(in[x], pred);                             \ diff --git a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c index 8adc52139b..e676f6fdc9 100644 --- a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c +++ b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c @@ -455,8 +455,9 @@ static void PredictorSub0_SSE2(const uint32_t* in, const uint32_t* upper,      _mm_storeu_si128((__m128i*)&out[i], res);    }    if (i != num_pixels) { -    VP8LPredictorsSub_C[0](in + i, upper + i, num_pixels - i, out + i); +    VP8LPredictorsSub_C[0](in + i, NULL, num_pixels - i, out + i);    } +  (void)upper;  }  #define GENERATE_PREDICTOR_1(X, IN)                                           \ diff --git a/thirdparty/libwebp/src/dsp/lossless_sse2.c b/thirdparty/libwebp/src/dsp/lossless_sse2.c index 17d7576419..aef0cee1b3 100644 --- a/thirdparty/libwebp/src/dsp/lossless_sse2.c +++ b/thirdparty/libwebp/src/dsp/lossless_sse2.c @@ -191,8 +191,9 @@ static void PredictorAdd0_SSE2(const uint32_t* in, const uint32_t* upper,      _mm_storeu_si128((__m128i*)&out[i], res);    }    if (i != num_pixels) { -    VP8LPredictorsAdd_C[0](in + i, upper + i, num_pixels - i, out + i); +    VP8LPredictorsAdd_C[0](in + i, NULL, num_pixels - i, out + i);    } +  (void)upper;  }  // Predictor1: left. diff --git a/thirdparty/libwebp/src/dsp/upsampling_msa.c b/thirdparty/libwebp/src/dsp/upsampling_msa.c index 99eea70e7d..f2e03e85e9 100644 --- a/thirdparty/libwebp/src/dsp/upsampling_msa.c +++ b/thirdparty/libwebp/src/dsp/upsampling_msa.c @@ -576,9 +576,9 @@ static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bot_y,        \    const uint32_t l_uv = ((cur_u[0]) | ((cur_v[0]) << 16));               \    const uint32_t uv0 = (3 * tl_uv + l_uv + 0x00020002u) >> 2;            \    const uint8_t* ptop_y = &top_y[1];                                     \ -  uint8_t *ptop_dst = top_dst + XSTEP;                                   \ +  uint8_t* ptop_dst = top_dst + XSTEP;                                   \    const uint8_t* pbot_y = &bot_y[1];                                     \ -  uint8_t *pbot_dst = bot_dst + XSTEP;                                   \ +  uint8_t* pbot_dst = bot_dst + XSTEP;                                   \                                                                           \    FUNC(top_y[0], uv0 & 0xff, (uv0 >> 16), top_dst);                      \    if (bot_y != NULL) {                                                   \ diff --git a/thirdparty/libwebp/src/dsp/upsampling_neon.c b/thirdparty/libwebp/src/dsp/upsampling_neon.c index 17cbc9f911..6ba71a7de5 100644 --- a/thirdparty/libwebp/src/dsp/upsampling_neon.c +++ b/thirdparty/libwebp/src/dsp/upsampling_neon.c @@ -58,8 +58,8 @@  } while (0)  // Turn the macro into a function for reducing code-size when non-critical -static void Upsample16Pixels_NEON(const uint8_t *r1, const uint8_t *r2, -                                  uint8_t *out) { +static void Upsample16Pixels_NEON(const uint8_t* r1, const uint8_t* r2, +                                  uint8_t* out) {    UPSAMPLE_16PIXELS(r1, r2, out);  } @@ -190,14 +190,14 @@ static const int16_t kCoeffs1[4] = { 19077, 26149, 6419, 13320 };  }  #define NEON_UPSAMPLE_FUNC(FUNC_NAME, FMT, XSTEP)                       \ -static void FUNC_NAME(const uint8_t *top_y, const uint8_t *bottom_y,    \ -                      const uint8_t *top_u, const uint8_t *top_v,       \ -                      const uint8_t *cur_u, const uint8_t *cur_v,       \ -                      uint8_t *top_dst, uint8_t *bottom_dst, int len) { \ +static void FUNC_NAME(const uint8_t* top_y, const uint8_t* bottom_y,    \ +                      const uint8_t* top_u, const uint8_t* top_v,       \ +                      const uint8_t* cur_u, const uint8_t* cur_v,       \ +                      uint8_t* top_dst, uint8_t* bottom_dst, int len) { \    int block;                                                            \    /* 16 byte aligned array to cache reconstructed u and v */            \    uint8_t uv_buf[2 * 32 + 15];                                          \ -  uint8_t *const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15);     \ +  uint8_t* const r_uv = (uint8_t*)((uintptr_t)(uv_buf + 15) & ~15);     \    const int uv_len = (len + 1) >> 1;                                    \    /* 9 pixels must be read-able for each block */                       \    const int num_blocks = (uv_len - 1) >> 3;                             \ diff --git a/thirdparty/libwebp/src/enc/histogram_enc.c b/thirdparty/libwebp/src/enc/histogram_enc.c index d89b98524a..a4e6bf3a98 100644 --- a/thirdparty/libwebp/src/enc/histogram_enc.c +++ b/thirdparty/libwebp/src/enc/histogram_enc.c @@ -641,7 +641,7 @@ static void HistogramAnalyzeEntropyBin(VP8LHistogramSet* const image_histo,  // Merges some histograms with same bin_id together if it's advantageous.  // Sets the remaining histograms to NULL.  static void HistogramCombineEntropyBin(VP8LHistogramSet* const image_histo, -                                       int *num_used, +                                       int* num_used,                                         const uint16_t* const clusters,                                         uint16_t* const cluster_mappings,                                         VP8LHistogram* cur_combo, diff --git a/thirdparty/libwebp/src/enc/picture_csp_enc.c b/thirdparty/libwebp/src/enc/picture_csp_enc.c index 02d9df76d5..718e014ed2 100644 --- a/thirdparty/libwebp/src/enc/picture_csp_enc.c +++ b/thirdparty/libwebp/src/enc/picture_csp_enc.c @@ -29,11 +29,15 @@  #define USE_INVERSE_ALPHA_TABLE  #ifdef WORDS_BIGENDIAN -#define ALPHA_OFFSET 0   // uint32_t 0xff000000 is 0xff,00,00,00 in memory +// uint32_t 0xff000000 is 0xff,00,00,00 in memory +#define CHANNEL_OFFSET(i) (i)  #else -#define ALPHA_OFFSET 3   // uint32_t 0xff000000 is 0x00,00,00,ff in memory +// uint32_t 0xff000000 is 0x00,00,00,ff in memory +#define CHANNEL_OFFSET(i) (3-(i))  #endif +#define ALPHA_OFFSET CHANNEL_OFFSET(0) +  //------------------------------------------------------------------------------  // Detection of non-trivial transparency @@ -997,10 +1001,10 @@ static int PictureARGBToYUVA(WebPPicture* picture, WebPEncCSP colorspace,      return WebPEncodingSetError(picture, VP8_ENC_ERROR_INVALID_CONFIGURATION);    } else {      const uint8_t* const argb = (const uint8_t*)picture->argb; -    const uint8_t* const a = argb + (0 ^ ALPHA_OFFSET); -    const uint8_t* const r = argb + (1 ^ ALPHA_OFFSET); -    const uint8_t* const g = argb + (2 ^ ALPHA_OFFSET); -    const uint8_t* const b = argb + (3 ^ ALPHA_OFFSET); +    const uint8_t* const a = argb + CHANNEL_OFFSET(0); +    const uint8_t* const r = argb + CHANNEL_OFFSET(1); +    const uint8_t* const g = argb + CHANNEL_OFFSET(2); +    const uint8_t* const b = argb + CHANNEL_OFFSET(3);      picture->colorspace = WEBP_YUV420;      return ImportYUVAFromRGBA(r, g, b, a, 4, 4 * picture->argb_stride, @@ -1050,7 +1054,7 @@ int WebPPictureYUVAToARGB(WebPPicture* picture) {      const int height = picture->height;      const int argb_stride = 4 * picture->argb_stride;      uint8_t* dst = (uint8_t*)picture->argb; -    const uint8_t *cur_u = picture->u, *cur_v = picture->v, *cur_y = picture->y; +    const uint8_t* cur_u = picture->u, *cur_v = picture->v, *cur_y = picture->y;      WebPUpsampleLinePairFunc upsample =          WebPGetLinePairConverter(ALPHA_OFFSET > 0); diff --git a/thirdparty/libwebp/src/enc/vp8i_enc.h b/thirdparty/libwebp/src/enc/vp8i_enc.h index 24e1944610..fedcaeea27 100644 --- a/thirdparty/libwebp/src/enc/vp8i_enc.h +++ b/thirdparty/libwebp/src/enc/vp8i_enc.h @@ -31,8 +31,8 @@ extern "C" {  // version numbers  #define ENC_MAJ_VERSION 1 -#define ENC_MIN_VERSION 0 -#define ENC_REV_VERSION 3 +#define ENC_MIN_VERSION 1 +#define ENC_REV_VERSION 0  enum { MAX_LF_LEVELS = 64,       // Maximum loop filter level         MAX_VARIABLE_LEVEL = 67,  // last (inclusive) level with variable cost @@ -249,7 +249,7 @@ typedef struct {    int           percent0_;         // saved initial progress percent    DError        left_derr_;        // left error diffusion (u/v) -  DError       *top_derr_;         // top diffusion error - NULL if disabled +  DError*       top_derr_;         // top diffusion error - NULL if disabled    uint8_t* y_left_;    // left luma samples (addressable from index -1 to 15).    uint8_t* u_left_;    // left u samples (addressable from index -1 to 7) diff --git a/thirdparty/libwebp/src/mux/muxi.h b/thirdparty/libwebp/src/mux/muxi.h index 7bc0b07e9b..ad3e1bdb97 100644 --- a/thirdparty/libwebp/src/mux/muxi.h +++ b/thirdparty/libwebp/src/mux/muxi.h @@ -28,8 +28,8 @@ extern "C" {  // Defines and constants.  #define MUX_MAJ_VERSION 1 -#define MUX_MIN_VERSION 0 -#define MUX_REV_VERSION 3 +#define MUX_MIN_VERSION 1 +#define MUX_REV_VERSION 0  // Chunk object.  typedef struct WebPChunk WebPChunk; diff --git a/thirdparty/libwebp/src/mux/muxread.c b/thirdparty/libwebp/src/mux/muxread.c index 268f6acb53..ae3b876bc5 100644 --- a/thirdparty/libwebp/src/mux/muxread.c +++ b/thirdparty/libwebp/src/mux/muxread.c @@ -100,7 +100,7 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,                           WebPMuxImage* const wpi) {    const uint8_t* bytes = chunk->data_.bytes;    size_t size = chunk->data_.size; -  const uint8_t* const last = bytes + size; +  const uint8_t* const last = (bytes == NULL) ? NULL : bytes + size;    WebPChunk subchunk;    size_t subchunk_size;    WebPChunk** unknown_chunk_list = &wpi->unknown_; diff --git a/thirdparty/libwebp/src/utils/color_cache_utils.h b/thirdparty/libwebp/src/utils/color_cache_utils.h index ec21d5199b..b45d47c2d5 100644 --- a/thirdparty/libwebp/src/utils/color_cache_utils.h +++ b/thirdparty/libwebp/src/utils/color_cache_utils.h @@ -26,7 +26,7 @@ extern "C" {  // Main color cache struct.  typedef struct { -  uint32_t *colors_;  // color entries +  uint32_t* colors_;  // color entries    int hash_shift_;    // Hash shift: 32 - hash_bits_.    int hash_bits_;  } VP8LColorCache; diff --git a/thirdparty/libwebp/src/utils/thread_utils.c b/thirdparty/libwebp/src/utils/thread_utils.c index 438296b45f..4e470e17ac 100644 --- a/thirdparty/libwebp/src/utils/thread_utils.c +++ b/thirdparty/libwebp/src/utils/thread_utils.c @@ -73,7 +73,7 @@ typedef struct {  #endif  static int pthread_create(pthread_t* const thread, const void* attr, -                          unsigned int (__stdcall *start)(void*), void* arg) { +                          unsigned int (__stdcall* start)(void*), void* arg) {    (void)attr;  #ifdef USE_CREATE_THREAD    *thread = CreateThread(NULL,   /* lpThreadAttributes */ diff --git a/thirdparty/libwebp/src/utils/utils.c b/thirdparty/libwebp/src/utils/utils.c index 44d5c14f01..764f752b82 100644 --- a/thirdparty/libwebp/src/utils/utils.c +++ b/thirdparty/libwebp/src/utils/utils.c @@ -216,9 +216,14 @@ void WebPSafeFree(void* const ptr) {    free(ptr);  } -// Public API function. +// Public API functions. + +void* WebPMalloc(size_t size) { +  return WebPSafeMalloc(1, size); +} +  void WebPFree(void* ptr) { -  free(ptr); +  WebPSafeFree(ptr);  }  //------------------------------------------------------------------------------ diff --git a/thirdparty/libwebp/src/webp/decode.h b/thirdparty/libwebp/src/webp/decode.h index ae8bfe840e..80dd0ef0cc 100644 --- a/thirdparty/libwebp/src/webp/decode.h +++ b/thirdparty/libwebp/src/webp/decode.h @@ -20,7 +20,7 @@  extern "C" {  #endif -#define WEBP_DECODER_ABI_VERSION 0x0208    // MAJOR(8b) + MINOR(8b) +#define WEBP_DECODER_ABI_VERSION 0x0209    // MAJOR(8b) + MINOR(8b)  // Note: forward declaring enumerations is not allowed in (strict) C and C++,  // the types are left here for reference. @@ -91,9 +91,6 @@ WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,                                     uint8_t** u, uint8_t** v,                                     int* stride, int* uv_stride); -// Releases memory returned by the WebPDecode*() functions above. -WEBP_EXTERN void WebPFree(void* ptr); -  // These five functions are variants of the above ones, that decode the image  // directly into a pre-allocated buffer 'output_buffer'. The maximum storage  // available in this buffer is indicated by 'output_buffer_size'. If this diff --git a/thirdparty/libwebp/src/webp/encode.h b/thirdparty/libwebp/src/webp/encode.h index 339f8810aa..655166e7d4 100644 --- a/thirdparty/libwebp/src/webp/encode.h +++ b/thirdparty/libwebp/src/webp/encode.h @@ -20,7 +20,7 @@  extern "C" {  #endif -#define WEBP_ENCODER_ABI_VERSION 0x020e    // MAJOR(8b) + MINOR(8b) +#define WEBP_ENCODER_ABI_VERSION 0x020f    // MAJOR(8b) + MINOR(8b)  // Note: forward declaring enumerations is not allowed in (strict) C and C++,  // the types are left here for reference. @@ -79,9 +79,6 @@ WEBP_EXTERN size_t WebPEncodeLosslessBGRA(const uint8_t* bgra,                                            int width, int height, int stride,                                            uint8_t** output); -// Releases memory returned by the WebPEncode*() functions above. -WEBP_EXTERN void WebPFree(void* ptr); -  //------------------------------------------------------------------------------  // Coding parameters @@ -306,7 +303,7 @@ struct WebPPicture {    // YUV input (mostly used for input to lossy compression)    WebPEncCSP colorspace;     // colorspace: should be YUV420 for now (=Y'CbCr).    int width, height;         // dimensions (less or equal to WEBP_MAX_DIMENSION) -  uint8_t *y, *u, *v;        // pointers to luma/chroma planes. +  uint8_t* y, *u, *v;        // pointers to luma/chroma planes.    int y_stride, uv_stride;   // luma/chroma strides.    uint8_t* a;                // pointer to the alpha plane    int a_stride;              // stride of the alpha plane @@ -350,7 +347,7 @@ struct WebPPicture {    uint32_t pad3[3];       // padding for later use    // Unused for now -  uint8_t *pad4, *pad5; +  uint8_t* pad4, *pad5;    uint32_t pad6[8];       // padding for later use    // PRIVATE FIELDS diff --git a/thirdparty/libwebp/src/webp/mux.h b/thirdparty/libwebp/src/webp/mux.h index 66096a92e0..7d27489a40 100644 --- a/thirdparty/libwebp/src/webp/mux.h +++ b/thirdparty/libwebp/src/webp/mux.h @@ -57,7 +57,7 @@ extern "C" {    WebPMuxGetChunk(mux, "ICCP", &icc_profile);    // ... (Consume icc_data).    WebPMuxDelete(mux); -  free(data); +  WebPFree(data);  */  // Note: forward declaring enumerations is not allowed in (strict) C and C++, @@ -245,7 +245,7 @@ WEBP_EXTERN WebPMuxError WebPMuxPushFrame(      WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data);  // Gets the nth frame from the mux object. -// The content of 'frame->bitstream' is allocated using malloc(), and NOT +// The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT  // owned by the 'mux' object. It MUST be deallocated by the caller by calling  // WebPDataClear().  // nth=0 has a special meaning - last position. @@ -376,10 +376,10 @@ WEBP_EXTERN WebPMuxError WebPMuxNumChunks(const WebPMux* mux,  // Assembles all chunks in WebP RIFF format and returns in 'assembled_data'.  // This function also validates the mux object.  // Note: The content of 'assembled_data' will be ignored and overwritten. -// Also, the content of 'assembled_data' is allocated using malloc(), and NOT -// owned by the 'mux' object. It MUST be deallocated by the caller by calling -// WebPDataClear(). It's always safe to call WebPDataClear() upon return, -// even in case of error. +// Also, the content of 'assembled_data' is allocated using WebPMalloc(), and +// NOT owned by the 'mux' object. It MUST be deallocated by the caller by +// calling WebPDataClear(). It's always safe to call WebPDataClear() upon +// return, even in case of error.  // Parameters:  //   mux - (in/out) object whose chunks are to be assembled  //   assembled_data - (out) assembled WebP data diff --git a/thirdparty/libwebp/src/webp/mux_types.h b/thirdparty/libwebp/src/webp/mux_types.h index ceea77dfc6..2fe8195839 100644 --- a/thirdparty/libwebp/src/webp/mux_types.h +++ b/thirdparty/libwebp/src/webp/mux_types.h @@ -14,7 +14,6 @@  #ifndef WEBP_WEBP_MUX_TYPES_H_  #define WEBP_WEBP_MUX_TYPES_H_ -#include <stdlib.h>  // free()  #include <string.h>  // memset()  #include "./types.h" @@ -56,6 +55,7 @@ typedef enum WebPMuxAnimBlend {  // Data type used to describe 'raw' data, e.g., chunk data  // (ICC profile, metadata) and WebP compressed image data. +// 'bytes' memory must be allocated using WebPMalloc() and such.  struct WebPData {    const uint8_t* bytes;    size_t size; @@ -68,11 +68,11 @@ static WEBP_INLINE void WebPDataInit(WebPData* webp_data) {    }  } -// Clears the contents of the 'webp_data' object by calling free(). Does not -// deallocate the object itself. +// Clears the contents of the 'webp_data' object by calling WebPFree(). +// Does not deallocate the object itself.  static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {    if (webp_data != NULL) { -    free((void*)webp_data->bytes); +    WebPFree((void*)webp_data->bytes);      WebPDataInit(webp_data);    }  } @@ -83,7 +83,7 @@ static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {    if (src == NULL || dst == NULL) return 0;    WebPDataInit(dst);    if (src->bytes != NULL && src->size != 0) { -    dst->bytes = (uint8_t*)malloc(src->size); +    dst->bytes = (uint8_t*)WebPMalloc(src->size);      if (dst->bytes == NULL) return 0;      memcpy((void*)dst->bytes, src->bytes, src->size);      dst->size = src->size; diff --git a/thirdparty/libwebp/src/webp/types.h b/thirdparty/libwebp/src/webp/types.h index 0ce2622e41..47f7f2b007 100644 --- a/thirdparty/libwebp/src/webp/types.h +++ b/thirdparty/libwebp/src/webp/types.h @@ -7,7 +7,7 @@  // be found in the AUTHORS file in the root of the source tree.  // -----------------------------------------------------------------------------  // -//  Common types +//  Common types + memory wrappers  //  // Author: Skal (pascal.massimino@gmail.com) @@ -49,4 +49,20 @@ typedef long long int int64_t;  // Macro to check ABI compatibility (same major revision number)  #define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8)) +#ifdef __cplusplus +extern "C" { +#endif + +// Allocates 'size' bytes of memory. Returns NULL upon error. Memory +// must be deallocated by calling WebPFree(). This function is made available +// by the core 'libwebp' library. +WEBP_EXTERN void* WebPMalloc(size_t size); + +// Releases memory returned by the WebPDecode*() functions (from decode.h). +WEBP_EXTERN void WebPFree(void* ptr); + +#ifdef __cplusplus +}    // extern "C" +#endif +  #endif  // WEBP_WEBP_TYPES_H_  |