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