15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2011 Google Inc. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ----------------------------------------------------------------------------- 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebP encoder: main interface 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Skal (pascal.massimino@gmail.com) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WEBP_WEBP_ENCODE_H_ 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WEBP_WEBP_ENCODE_H_ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define WEBP_ENCODER_ABI_VERSION 0x0202 // MAJOR(8b) + MINOR(8b) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Note: forward declaring enumerations is not allowed in (strict) C and C++, 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the types are left here for reference. 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// typedef enum WebPImageHint WebPImageHint; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// typedef enum WebPEncCSP WebPEncCSP; 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// typedef enum WebPPreset WebPPreset; 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// typedef enum WebPEncodingError WebPEncodingError; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct WebPConfig WebPConfig; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct WebPPicture WebPPicture; // main structure for I/O 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct WebPAuxStats WebPAuxStats; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct WebPMemoryWriter WebPMemoryWriter; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the encoder's version number, packed in hexadecimal using 8bits for 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each of major/minor/revision. E.g: v2.5.7 is 0x020507. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPGetEncoderVersion(void); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// One-stop-shop call! No questions asked: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the size of the compressed data (pointed to by *output), or 0 if 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// an error occurred. The compressed data must be released by the caller 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// using the call 'free(*output)'. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions compress using the lossy format, and the quality_factor 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can go from 0 (smaller output, lower quality) to 100 (best quality, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// larger output). 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeRGB(const uint8_t* rgb, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float quality_factor, uint8_t** output); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeBGR(const uint8_t* bgr, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float quality_factor, uint8_t** output); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeRGBA(const uint8_t* rgba, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float quality_factor, uint8_t** output); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeBGRA(const uint8_t* bgra, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float quality_factor, uint8_t** output); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions are the equivalent of the above, but compressing in a 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lossless manner. Files are usually larger than lossy format, but will 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not suffer any compression loss. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeLosslessRGB(const uint8_t* rgb, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t** output); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeLosslessBGR(const uint8_t* bgr, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t** output); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeLosslessRGBA(const uint8_t* rgba, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t** output); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(size_t) WebPEncodeLosslessBGRA(const uint8_t* bgra, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, int height, int stride, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t** output); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Coding parameters 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Image characteristics hint for the underlying encoder. 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef enum WebPImageHint { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_HINT_DEFAULT = 0, // default preset. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_HINT_PICTURE, // digital picture, like portrait, inner shot 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_HINT_PHOTO, // outdoor photograph, with natural lighting 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_HINT_GRAPH, // Discrete tone image (graph, map-tile etc). 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_HINT_LAST 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} WebPImageHint; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Compression parameters. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct WebPConfig { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lossless; // Lossless encoding (0=lossy(default), 1=lossless). 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float quality; // between 0 (smallest file) and 100 (biggest) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int method; // quality/speed trade-off (0=fast, 6=slower-better) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPImageHint image_hint; // Hint for image type (lossless only for now). 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parameters related to lossy compression only: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int target_size; // if non-zero, set the desired target size in bytes. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes precedence over the 'compression' parameter. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float target_PSNR; // if non-zero, specifies the minimal distortion to 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // try to achieve. Takes precedence over target_size. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int segments; // maximum number of segments to use, in [1..4] 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sns_strength; // Spatial Noise Shaping. 0=off, 100=maximum. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int filter_strength; // range: [0 = off .. 100 = strongest] 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int filter_sharpness; // range: [0 = off .. 7 = least sharp] 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int filter_type; // filtering type: 0 = simple, 1 = strong (only used 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if filter_strength > 0 or autofilter > 0) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int autofilter; // Auto adjust filter's strength [0 = off, 1 = on] 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int alpha_compression; // Algorithm for encoding the alpha plane (0 = none, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 = compressed with WebP lossless). Default is 1. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int alpha_filtering; // Predictive filtering method for alpha plane. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0: none, 1: fast, 2: best. Default if 1. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int alpha_quality; // Between 0 (smallest size) and 100 (lossless). 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default is 100. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pass; // number of entropy-analysis passes (in [1..10]). 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int show_compressed; // if true, export the compressed picture back. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In-loop filtering is not applied. 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int preprocessing; // preprocessing filter: 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 0=none, 1=segment-smooth, 2=pseudo-random dithering 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int partitions; // log2(number of token partitions) in [0..3]. Default 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is set to 0 for easier progressive decoding. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int partition_limit; // quality degradation allowed to fit the 512k limit 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on prediction modes coding (0: no degradation, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 100: maximum possible degradation). 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int emulate_jpeg_size; // If true, compression parameters will be remapped 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to better match the expected output size from 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // JPEG compression. Generally, the output size will 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // be similar but the degradation will be lower. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int thread_level; // If non-zero, try and use multi-threaded encoding. 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int low_memory; // If set, reduce memory usage (but increase CPU use). 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t pad[5]; // padding for later use 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumerate some predefined settings for WebPConfig, depending on the type 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of source picture. These presets are used when calling WebPConfigPreset(). 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef enum WebPPreset { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_PRESET_DEFAULT = 0, // default preset. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_PRESET_PICTURE, // digital picture, like portrait, inner shot 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_PRESET_PHOTO, // outdoor photograph, with natural lighting 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_PRESET_DRAWING, // hand or line drawing, with high-contrast details 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_PRESET_ICON, // small-sized colorful images 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_PRESET_TEXT // text-like 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} WebPPreset; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Internal, version-checked, entry point 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Should always be called, to initialize a fresh WebPConfig structure before 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification. Returns false in case of version mismatch. WebPConfigInit() 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must have succeeded before using the 'config' object. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that the default values are lossless=0 and quality=75. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int WebPConfigInit(WebPConfig* config) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_ENCODER_ABI_VERSION); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function will initialize the configuration according to a predefined 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set of parameters (referred to by 'preset') and a given quality factor. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function can be called as a replacement to WebPConfigInit(). Will 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return false in case of error. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int WebPConfigPreset(WebPConfig* config, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPreset preset, float quality) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebPConfigInitInternal(config, preset, quality, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_ENCODER_ABI_VERSION); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if WEBP_ENCODER_ABI_VERSION > 0x0202 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Activate the lossless compression mode with the desired efficiency level 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// between 0 (fastest, lowest compression) and 9 (slower, best compression). 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// A good default level is '6', providing a fair tradeoff between compression 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// speed and final compressed size. 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This function will overwrite several fields from config: 'method', 'quality' 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// and 'lossless'. Returns false in case of parameter error. 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WEBP_EXTERN(int) WebPConfigLosslessPreset(WebPConfig* config, int level); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if 'config' is non-NULL and all configuration parameters are 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// within their valid ranges. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPValidateConfig(const WebPConfig* config); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Input / Output 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Structure for storing auxiliary statistics (mostly for lossy encoding). 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct WebPAuxStats { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int coded_size; // final size 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float PSNR[5]; // peak-signal-to-noise ratio for Y/U/V/All/Alpha 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int block_count[3]; // number of intra4/intra16/skipped macroblocks 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int header_bytes[2]; // approximate number of bytes spent for header 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and mode-partition #0 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int residual_bytes[3][4]; // approximate number of bytes spent for 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DC/AC/uv coefficients for each (0..3) segments. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int segment_size[4]; // number of macroblocks in each segments 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int segment_quant[4]; // quantizer values for each segments 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int segment_level[4]; // filtering strength for each segments [0..63] 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int alpha_data_size; // size of the transparency data 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int layer_data_size; // size of the enhancement layer data 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lossless encoder statistics 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t lossless_features; // bit0:predictor bit1:cross-color transform 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // bit2:subtract-green bit3:color indexing 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int histogram_bits; // number of precision bits of histogram 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int transform_bits; // precision bits for transform 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cache_bits; // number of bits for color cache lookup 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int palette_size; // number of color in palette, if used 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int lossless_size; // final lossless size 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t pad[4]; // padding for later use 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Signature for output function. Should return true if writing was successful. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data/data_size is the segment of data to write, and 'picture' is for 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference (and so one can make use of picture->custom_ptr). 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*WebPWriterFunction)(const uint8_t* data, size_t data_size, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPPicture* picture); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebPMemoryWrite: a special WebPWriterFunction that writes to memory using 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the following WebPMemoryWriter object (to be set as a custom_ptr). 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct WebPMemoryWriter { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* mem; // final buffer (of size 'max_size', larger than 'size'). 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size; // final size 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t max_size; // total capacity 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t pad[1]; // padding for later use 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following must be called first before any use. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(void) WebPMemoryWriterInit(WebPMemoryWriter* writer); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if WEBP_ENCODER_ABI_VERSION > 0x0202 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The following must be called to deallocate writer->mem memory. The 'writer' 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// object itself is not deallocated. 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)WEBP_EXTERN(void) WebPMemoryWriterClear(WebPMemoryWriter* writer); 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// completion, writer.mem and writer.size will hold the coded data. 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if WEBP_ENCODER_ABI_VERSION > 0x0202 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// writer.mem must be freed by calling WebPMemoryWriterClear. 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// writer.mem must be freed by calling 'free(writer.mem)'. 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPMemoryWrite(const uint8_t* data, size_t data_size, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebPPicture* picture); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Progress hook, called from time to time to report progress. It can return 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// false to request an abort of the encoding process, or true otherwise if 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// everything is OK. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int (*WebPProgressHook)(int percent, const WebPPicture* picture); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Color spaces. 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef enum WebPEncCSP { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chroma sampling 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WEBP_YUV420 = 0, // 4:2:0 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WEBP_YUV420A = 4, // alpha channel variant 2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WEBP_CSP_ALPHA_BIT = 4 // bit that is set if alpha is present 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} WebPEncCSP; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Encoding error conditions. 264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtypedef enum WebPEncodingError { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_OK = 0, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_OUT_OF_MEMORY, // memory error allocating objects 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY, // memory error while flushing bits 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_NULL_PARAMETER, // a pointer parameter is NULL 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_INVALID_CONFIGURATION, // configuration is invalid 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_BAD_DIMENSION, // picture has invalid width/height 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_PARTITION0_OVERFLOW, // partition is bigger than 512k 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_PARTITION_OVERFLOW, // partition is bigger than 16M 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_BAD_WRITE, // error while flushing bytes 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_FILE_TOO_BIG, // file is bigger than 4G 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_USER_ABORT, // abort request by user 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VP8_ENC_ERROR_LAST // list terminator. always last. 277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} WebPEncodingError; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// maximum width/height allowed (inclusive), in pixels 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WEBP_MAX_DIMENSION 16383 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Main exchange structure (input samples, output bytes, statistics) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct WebPPicture { 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // INPUT 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ////////////// 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Main flag for encoder selecting between ARGB or YUV input. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is recommended to use ARGB input (*argb, argb_stride) for lossless 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compression, and YUV input (*y, *u, *v, etc.) for lossy compression 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since these are the respective native colorspace for these formats. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int use_argb; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // YUV input (mostly used for input to lossy compression) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPEncCSP colorspace; // colorspace: should be YUV420 for now (=Y'CbCr). 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, height; // dimensions (less or equal to WEBP_MAX_DIMENSION) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t *y, *u, *v; // pointers to luma/chroma planes. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y_stride, uv_stride; // luma/chroma strides. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* a; // pointer to the alpha plane 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a_stride; // stride of the alpha plane 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t pad1[2]; // padding for later use 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ARGB input (mostly used for input to lossless compression) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* argb; // Pointer to argb (32 bit) plane. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int argb_stride; // This is stride in pixels units, not bytes. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t pad2[3]; // padding for later use 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OUTPUT 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /////////////// 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Byte-emission hook, to store compressed bytes as they are ready. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPWriterFunction writer; // can be NULL 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* custom_ptr; // can be used by the writer. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // map for extra information (only for lossy compression mode) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int extra_info_type; // 1: intra type, 2: segment, 3: quant 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4: intra-16 prediction mode, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5: chroma prediction mode, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 6: bit cost, 7: distortion 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8_t* extra_info; // if not NULL, points to an array of size 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ((width + 15) / 16) * ((height + 15) / 16) that 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be filled with a macroblock map, depending 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on extra_info_type. 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // STATS AND REPORTS 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /////////////////////////// 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pointer to side statistics (updated only if not NULL) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPAuxStats* stats; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Error code for the latest error encountered during encoding 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPEncodingError error_code; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If not NULL, report progress during encoding. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPProgressHook progress_hook; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* user_data; // this field is free to be set to any value and 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used during callbacks (like progress-report e.g.). 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t pad3[3]; // padding for later use 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Unused for now 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint8_t *pad4, *pad5; 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint32_t pad6[8]; // padding for later use 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PRIVATE FIELDS 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) //////////////////// 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* memory_; // row chunk of memory for yuva planes 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* memory_argb_; // and for argb too. 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void* pad7[2]; // padding for later use 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Internal, version-checked, entry point 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureInitInternal(WebPPicture*, int); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Should always be called, to initialize the structure. Returns false in case 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of version mismatch. WebPPictureInit() must have succeeded before using the 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'picture' object. 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that, by default, use_argb is false and colorspace is WEBP_YUV420. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebPPicture utils 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience allocation / deallocation based on picture->width/height: 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allocate y/u/v buffers as per colorspace/width/height specification. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note! This function will free the previous buffer if needed. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of memory error. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureAlloc(WebPPicture* picture); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*(). 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that this function does _not_ free the memory used by the 'picture' 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// object itself. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Besides memory (which is reclaimed) all other fields of 'picture' are 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preserved. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(void) WebPPictureFree(WebPPicture* picture); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copy the pixels of *src into *dst, using WebPPictureAlloc. Upon return, *dst 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// will fully own the copied pixels (this is not a view). The 'dst' picture need 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// not be initialized as its content is overwritten. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of memory allocation error. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureCopy(const WebPPicture* src, WebPPicture* dst); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Compute PSNR, SSIM or LSIM distortion metric between two pictures. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Result is in dB, stores in result[] in the Y/U/V/Alpha/All order. 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns false in case of error (src and ref don't have same dimension, ...) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Warning: this function is rather CPU-intensive. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureDistortion( 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebPPicture* src, const WebPPicture* ref, 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int metric_type, // 0 = PSNR, 1 = SSIM, 2 = LSIM 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float result[5]); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// self-crops a picture to the rectangle defined by top/left/width/height. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of memory allocation error, or if the rectangle is 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// outside of the source picture. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The rectangle for the view is defined by the top-left corner pixel 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// coordinates (left, top) as well as its width and height. This rectangle 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must be fully be comprised inside the 'src' source picture. If the source 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// picture uses the YUV420 colorspace, the top and left coordinates will be 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// snapped to even values. 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureCrop(WebPPicture* picture, 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int left, int top, int width, int height); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extracts a view from 'src' picture into 'dst'. The rectangle for the view 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is defined by the top-left corner pixel coordinates (left, top) as well 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as its width and height. This rectangle must be fully be comprised inside 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the 'src' source picture. If the source picture uses the YUV420 colorspace, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the top and left coordinates will be snapped to even values. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Picture 'src' must out-live 'dst' picture. Self-extraction of view is allowed 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ('src' equal to 'dst') as a mean of fast-cropping (but note that doing so, 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// the original dimension will be lost). Picture 'dst' need not be initialized 410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// with WebPPictureInit() if it is different from 'src', since its content will 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be overwritten. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of memory allocation error or invalid parameters. 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureView(const WebPPicture* src, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int left, int top, int width, int height, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPicture* dst); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the 'picture' is actually a view and therefore does 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not own the memory for pixels. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureIsView(const WebPPicture* picture); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rescale a picture to new dimension width x height. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Now gamma correction is applied. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of error (invalid parameter or insufficient memory). 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureRescale(WebPPicture* pic, int width, int height); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Colorspace conversion function to import RGB samples. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Previous buffer will be free'd, if any. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *rgb buffer should have a size of at least height * rgb_stride. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of memory error. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureImportRGB( 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPicture* picture, const uint8_t* rgb, int rgb_stride); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same, but for RGBA buffer. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureImportRGBA( 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPicture* picture, const uint8_t* rgba, int rgba_stride); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// input buffer ignoring the alpha channel. Avoids needing to copy the data 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to a temporary 24-bit RGB buffer to import the RGB only. 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureImportRGBX( 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Variants of the above, but taking BGR(A|X) input. 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureImportBGR( 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPicture* picture, const uint8_t* bgr, int bgr_stride); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureImportBGRA( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPicture* picture, const uint8_t* bgra, int bgra_stride); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureImportBGRX( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts picture->argb data to the YUVA format specified by 'colorspace'. 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Upon return, picture->use_argb is set to false. The presence of real 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// non-opaque transparent values is detected, and 'colorspace' will be 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// adjusted accordingly. Note that this method is lossy. 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of error. 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureARGBToYUVA(WebPPicture* picture, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebPEncCSP colorspace); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Same as WebPPictureARGBToYUVA(), but the conversion is done using 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// pseudo-random dithering with a strength 'dithering' between 4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 0.0 (no dithering) and 1.0 (maximum dithering). This is useful 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// for photographic picture. 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureARGBToYUVADithered( 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebPPicture* picture, WebPEncCSP colorspace, float dithering); 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts picture->yuv to picture->argb and sets picture->use_argb to true. 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The input format must be YUV_420 or YUV_420A. 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that the use of this method is discouraged if one has access to the 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// raw ARGB samples, since using YUV420 is comparatively lossy. Also, the 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// conversion from YUV420 to ARGB incurs a small loss too. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of error. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureYUVAToARGB(WebPPicture* picture); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Helper function: given a width x height plane of RGBA or YUV(A) samples 4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// clean-up the YUV or RGB samples under fully transparent area, to help 4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// compressibility (no guarantee, though). 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(void) WebPCleanupTransparentArea(WebPPicture* picture); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Scan the picture 'picture' for the presence of non fully opaque alpha values. 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true in such case. Otherwise returns false (indicating that the 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// alpha plane can be ignored altogether e.g.). 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPPictureHasTransparency(const WebPPicture* picture); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Remove the transparency information (if present) by blending the color with 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// the background color 'background_rgb' (specified as 24bit RGB triplet). 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// After this call, all alpha values are reset to 0xff. 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)WEBP_EXTERN(void) WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb); 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Main call 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Main encoding call, after config and picture have been initialized. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'picture' must be less than 16384x16384 in dimension (cf WEBP_MAX_DIMENSION), 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and the 'config' object must be a valid one. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false in case of error, true otherwise. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In case of error, picture->error_code is updated accordingly. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'picture' can hold the source samples in both YUV(A) or ARGB input, depending 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the value of 'picture->use_argb'. It is highly recommended to use 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the former for lossy encoding, and the latter for lossless encoding 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (when config.lossless is true). Automatic conversion from one format to 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// another is provided but they both incur some loss. 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WEBP_EXTERN(int) WebPEncode(const WebPConfig* config, WebPPicture* picture); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // extern "C" 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* WEBP_WEBP_ENCODE_H_ */ 509