utils.h revision 0406ce1417f76f2034833414dcecc9f56253640c
1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2012 Google Inc. All Rights Reserved.
2a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
30406ce1417f76f2034833414dcecc9f56253640cVikas Arora// Use of this source code is governed by a BSD-style license
40406ce1417f76f2034833414dcecc9f56253640cVikas Arora// that can be found in the COPYING file in the root of the source
50406ce1417f76f2034833414dcecc9f56253640cVikas Arora// tree. An additional intellectual property rights grant can be found
60406ce1417f76f2034833414dcecc9f56253640cVikas Arora// in the file PATENTS. All contributing project authors may
70406ce1417f76f2034833414dcecc9f56253640cVikas Arora// be found in the AUTHORS file in the root of the source tree.
8a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// -----------------------------------------------------------------------------
9a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
10a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Misc. common utility functions
11a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
121e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Authors: Skal (pascal.massimino@gmail.com)
131e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora//          Urvang (urvang@google.com)
14a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
15a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifndef WEBP_UTILS_UTILS_H_
16a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_UTILS_UTILS_H_
17a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
181e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora#include <assert.h>
191e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
20a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "webp/types.h"
21a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
22a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
23a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern "C" {
24a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif
25a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
26a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
27a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Memory allocation
28a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
29a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// This is the maximum memory amount that libwebp will ever try to allocate.
30a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_MAX_ALLOCABLE_MEMORY (1ULL << 40)
31a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
32a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// size-checking safe malloc/calloc: verify that the requested size is not too
33a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// large, or return NULL. You don't need to call these for constructs like
34a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// malloc(sizeof(foo)), but only if there's picture-dependent size involved
35a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// somewhere (like: malloc(num_pixels * sizeof(*something))). That's why this
36a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// safe malloc() borrows the signature from calloc(), pointing at the dangerous
37a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// underlying multiply involved.
38a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid* WebPSafeMalloc(uint64_t nmemb, size_t size);
39a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Note that WebPSafeCalloc() expects the second argument type to be 'size_t'
40a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// in order to favor the "calloc(num_foo, sizeof(foo))" pattern.
41a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid* WebPSafeCalloc(uint64_t nmemb, size_t size);
42a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
43a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
441e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Reading/writing data.
451e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
461e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Read 16, 24 or 32 bits stored in little-endian order.
471e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastatic WEBP_INLINE int GetLE16(const uint8_t* const data) {
481e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  return (int)(data[0] << 0) | (data[1] << 8);
491e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora}
501e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
511e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastatic WEBP_INLINE int GetLE24(const uint8_t* const data) {
521e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  return GetLE16(data) | (data[2] << 16);
531e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora}
541e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
551e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastatic WEBP_INLINE uint32_t GetLE32(const uint8_t* const data) {
561e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  return (uint32_t)GetLE16(data) | (GetLE16(data + 2) << 16);
571e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora}
581e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
591e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora// Store 16, 24 or 32 bits in little-endian order.
601e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastatic WEBP_INLINE void PutLE16(uint8_t* const data, int val) {
611e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  assert(val < (1 << 16));
621e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  data[0] = (val >> 0);
631e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  data[1] = (val >> 8);
641e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora}
651e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
661e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastatic WEBP_INLINE void PutLE24(uint8_t* const data, int val) {
671e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  assert(val < (1 << 24));
681e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  PutLE16(data, val & 0xffff);
691e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  data[2] = (val >> 16);
701e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora}
711e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
721e7bf8805bd030c19924a5306837ecd72c295751Vikas Arorastatic WEBP_INLINE void PutLE32(uint8_t* const data, uint32_t val) {
731e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  PutLE16(data, (int)(val & 0xffff));
741e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora  PutLE16(data + 2, (int)(val >> 16));
751e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora}
761e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora
771e7bf8805bd030c19924a5306837ecd72c295751Vikas Arora//------------------------------------------------------------------------------
78a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
79a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#if defined(__cplusplus) || defined(c_plusplus)
80a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora}    // extern "C"
81a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif
82a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
83a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif  /* WEBP_UTILS_UTILS_H_ */
84