19e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Copyright 2011 Google Inc. All Rights Reserved.
29e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//
39e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Use of this source code is governed by a BSD-style license
49e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// that can be found in the COPYING file in the root of the source
59e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// tree. An additional intellectual property rights grant can be found
69e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// in the file PATENTS. All contributing project authors may
79e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// be found in the AUTHORS file in the root of the source tree.
89e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// -----------------------------------------------------------------------------
99e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//
109e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//   WebP encoder: main interface
119e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//
129e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Author: Skal (pascal.massimino@gmail.com)
139e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
149e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#ifndef WEBP_WEBP_ENCODE_H_
159e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#define WEBP_WEBP_ENCODE_H_
169e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
179e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#include "./types.h"
189e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
199e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#ifdef __cplusplus
209e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernextern "C" {
219e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#endif
229e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
237c8da7ce66017295a65ec028084b90800be377f8James Zern#define WEBP_ENCODER_ABI_VERSION 0x0209    // MAJOR(8b) + MINOR(8b)
249e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
259e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Note: forward declaring enumerations is not allowed in (strict) C and C++,
269e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// the types are left here for reference.
279e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// typedef enum WebPImageHint WebPImageHint;
289e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// typedef enum WebPEncCSP WebPEncCSP;
299e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// typedef enum WebPPreset WebPPreset;
309e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// typedef enum WebPEncodingError WebPEncodingError;
319e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef struct WebPConfig WebPConfig;
329e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef struct WebPPicture WebPPicture;   // main structure for I/O
339e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef struct WebPAuxStats WebPAuxStats;
349e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef struct WebPMemoryWriter WebPMemoryWriter;
359e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
369e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Return the encoder's version number, packed in hexadecimal using 8bits for
379e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// each of major/minor/revision. E.g: v2.5.7 is 0x020507.
389e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPGetEncoderVersion(void);
399e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
409e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//------------------------------------------------------------------------------
419e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// One-stop-shop call! No questions asked:
429e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
439e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns the size of the compressed data (pointed to by *output), or 0 if
449e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// an error occurred. The compressed data must be released by the caller
457c8da7ce66017295a65ec028084b90800be377f8James Zern// using the call 'WebPFree(*output)'.
469e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// These functions compress using the lossy format, and the quality_factor
479e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// can go from 0 (smaller output, lower quality) to 100 (best quality,
489e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// larger output).
499e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeRGB(const uint8_t* rgb,
509e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                  int width, int height, int stride,
519e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                  float quality_factor, uint8_t** output);
529e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeBGR(const uint8_t* bgr,
539e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                  int width, int height, int stride,
549e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                  float quality_factor, uint8_t** output);
559e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeRGBA(const uint8_t* rgba,
569e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                   int width, int height, int stride,
579e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                   float quality_factor, uint8_t** output);
589e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeBGRA(const uint8_t* bgra,
599e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                   int width, int height, int stride,
609e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                   float quality_factor, uint8_t** output);
619e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
629e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// These functions are the equivalent of the above, but compressing in a
639e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// lossless manner. Files are usually larger than lossy format, but will
649e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// not suffer any compression loss.
659e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeLosslessRGB(const uint8_t* rgb,
669e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                          int width, int height, int stride,
679e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                          uint8_t** output);
689e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeLosslessBGR(const uint8_t* bgr,
699e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                          int width, int height, int stride,
709e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                          uint8_t** output);
719e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeLosslessRGBA(const uint8_t* rgba,
729e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                           int width, int height, int stride,
739e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                           uint8_t** output);
749e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(size_t) WebPEncodeLosslessBGRA(const uint8_t* bgra,
759e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                           int width, int height, int stride,
769e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                           uint8_t** output);
779e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
787c8da7ce66017295a65ec028084b90800be377f8James Zern// Releases memory returned by the WebPEncode*() functions above.
797c8da7ce66017295a65ec028084b90800be377f8James ZernWEBP_EXTERN(void) WebPFree(void* ptr);
807c8da7ce66017295a65ec028084b90800be377f8James Zern
819e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//------------------------------------------------------------------------------
829e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Coding parameters
839e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
849e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Image characteristics hint for the underlying encoder.
859e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef enum WebPImageHint {
869e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_HINT_DEFAULT = 0,  // default preset.
879e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_HINT_PICTURE,      // digital picture, like portrait, inner shot
889e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_HINT_PHOTO,        // outdoor photograph, with natural lighting
899e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_HINT_GRAPH,        // Discrete tone image (graph, map-tile etc).
909e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_HINT_LAST
919e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern} WebPImageHint;
929e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
939e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Compression parameters.
949e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernstruct WebPConfig {
959e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int lossless;           // Lossless encoding (0=lossy(default), 1=lossless).
969e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  float quality;          // between 0 (smallest file) and 100 (biggest)
979e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int method;             // quality/speed trade-off (0=fast, 6=slower-better)
989e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
999e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WebPImageHint image_hint;  // Hint for image type (lossless only for now).
1009e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1019e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // Parameters related to lossy compression only:
1029e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int target_size;        // if non-zero, set the desired target size in bytes.
1039e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // Takes precedence over the 'compression' parameter.
1049e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  float target_PSNR;      // if non-zero, specifies the minimal distortion to
1059e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // try to achieve. Takes precedence over target_size.
1069e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int segments;           // maximum number of segments to use, in [1..4]
1079e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int sns_strength;       // Spatial Noise Shaping. 0=off, 100=maximum.
1089e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int filter_strength;    // range: [0 = off .. 100 = strongest]
1099e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int filter_sharpness;   // range: [0 = off .. 7 = least sharp]
1109e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int filter_type;        // filtering type: 0 = simple, 1 = strong (only used
1119e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // if filter_strength > 0 or autofilter > 0)
1129e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int autofilter;         // Auto adjust filter's strength [0 = off, 1 = on]
1139e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int alpha_compression;  // Algorithm for encoding the alpha plane (0 = none,
1149e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // 1 = compressed with WebP lossless). Default is 1.
1159e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int alpha_filtering;    // Predictive filtering method for alpha plane.
1169e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          //  0: none, 1: fast, 2: best. Default if 1.
1179e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int alpha_quality;      // Between 0 (smallest size) and 100 (lossless).
1189e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // Default is 100.
1199e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int pass;               // number of entropy-analysis passes (in [1..10]).
1209e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1219e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int show_compressed;    // if true, export the compressed picture back.
1229e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // In-loop filtering is not applied.
1239e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int preprocessing;      // preprocessing filter:
1249e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // 0=none, 1=segment-smooth, 2=pseudo-random dithering
1259e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int partitions;         // log2(number of token partitions) in [0..3]. Default
1269e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // is set to 0 for easier progressive decoding.
1279e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int partition_limit;    // quality degradation allowed to fit the 512k limit
1289e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // on prediction modes coding (0: no degradation,
1299e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // 100: maximum possible degradation).
1309e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int emulate_jpeg_size;  // If true, compression parameters will be remapped
1319e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // to better match the expected output size from
1329e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // JPEG compression. Generally, the output size will
1339e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // be similar but the degradation will be lower.
1349e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int thread_level;       // If non-zero, try and use multi-threaded encoding.
1359e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int low_memory;         // If set, reduce memory usage (but increase CPU use).
1369e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1377c8da7ce66017295a65ec028084b90800be377f8James Zern  int near_lossless;      // Near lossless encoding [0 = off(default) .. 100].
1387c8da7ce66017295a65ec028084b90800be377f8James Zern                          // This feature is experimental.
1397c8da7ce66017295a65ec028084b90800be377f8James Zern  int exact;              // if non-zero, preserve the exact RGB values under
1407c8da7ce66017295a65ec028084b90800be377f8James Zern                          // transparent area. Otherwise, discard this invisible
1417c8da7ce66017295a65ec028084b90800be377f8James Zern                          // RGB information for better compression. The default
1427c8da7ce66017295a65ec028084b90800be377f8James Zern                          // value is 0.
1437c8da7ce66017295a65ec028084b90800be377f8James Zern
1447c8da7ce66017295a65ec028084b90800be377f8James Zern#ifdef WEBP_EXPERIMENTAL_FEATURES
1457c8da7ce66017295a65ec028084b90800be377f8James Zern  int delta_palettization;
1467c8da7ce66017295a65ec028084b90800be377f8James Zern  uint32_t pad[2];        // padding for later use
1477c8da7ce66017295a65ec028084b90800be377f8James Zern#else
1487c8da7ce66017295a65ec028084b90800be377f8James Zern  uint32_t pad[3];        // padding for later use
1497c8da7ce66017295a65ec028084b90800be377f8James Zern#endif  // WEBP_EXPERIMENTAL_FEATURES
1509e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern};
1519e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1529e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Enumerate some predefined settings for WebPConfig, depending on the type
1539e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// of source picture. These presets are used when calling WebPConfigPreset().
1549e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef enum WebPPreset {
1559e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_PRESET_DEFAULT = 0,  // default preset.
1569e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_PRESET_PICTURE,      // digital picture, like portrait, inner shot
1579e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_PRESET_PHOTO,        // outdoor photograph, with natural lighting
1589e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_PRESET_DRAWING,      // hand or line drawing, with high-contrast details
1599e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_PRESET_ICON,         // small-sized colorful images
1609e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_PRESET_TEXT          // text-like
1619e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern} WebPPreset;
1629e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1639e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Internal, version-checked, entry point
1649e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int);
1659e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1669e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Should always be called, to initialize a fresh WebPConfig structure before
1679e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// modification. Returns false in case of version mismatch. WebPConfigInit()
1689e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// must have succeeded before using the 'config' object.
1699e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Note that the default values are lossless=0 and quality=75.
1709e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernstatic WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
1719e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f,
1729e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                WEBP_ENCODER_ABI_VERSION);
1739e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern}
1749e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1759e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// This function will initialize the configuration according to a predefined
1769e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// set of parameters (referred to by 'preset') and a given quality factor.
1779e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// This function can be called as a replacement to WebPConfigInit(). Will
1789e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// return false in case of error.
1799e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernstatic WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
1809e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                        WebPPreset preset, float quality) {
1819e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  return WebPConfigInitInternal(config, preset, quality,
1829e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                WEBP_ENCODER_ABI_VERSION);
1839e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern}
1849e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1859e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Activate the lossless compression mode with the desired efficiency level
1869e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// between 0 (fastest, lowest compression) and 9 (slower, best compression).
1879e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// A good default level is '6', providing a fair tradeoff between compression
1889e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// speed and final compressed size.
1899e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// This function will overwrite several fields from config: 'method', 'quality'
1909e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// and 'lossless'. Returns false in case of parameter error.
1919e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPConfigLosslessPreset(WebPConfig* config, int level);
1929e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1939e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns true if 'config' is non-NULL and all configuration parameters are
1949e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// within their valid ranges.
1959e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPValidateConfig(const WebPConfig* config);
1969e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
1979e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//------------------------------------------------------------------------------
1989e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Input / Output
1999e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Structure for storing auxiliary statistics (mostly for lossy encoding).
2009e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2019e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernstruct WebPAuxStats {
2029e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int coded_size;         // final size
2039e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2049e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  float PSNR[5];          // peak-signal-to-noise ratio for Y/U/V/All/Alpha
2059e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int block_count[3];     // number of intra4/intra16/skipped macroblocks
2069e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int header_bytes[2];    // approximate number of bytes spent for header
2079e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // and mode-partition #0
2089e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int residual_bytes[3][4];  // approximate number of bytes spent for
2099e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                             // DC/AC/uv coefficients for each (0..3) segments.
2109e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int segment_size[4];    // number of macroblocks in each segments
2119e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int segment_quant[4];   // quantizer values for each segments
2129e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int segment_level[4];   // filtering strength for each segments [0..63]
2139e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2149e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int alpha_data_size;    // size of the transparency data
2159e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int layer_data_size;    // size of the enhancement layer data
2169e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2179e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // lossless encoder statistics
2189e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint32_t lossless_features;  // bit0:predictor bit1:cross-color transform
2199e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                               // bit2:subtract-green bit3:color indexing
2209e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int histogram_bits;          // number of precision bits of histogram
2219e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int transform_bits;          // precision bits for transform
2229e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int cache_bits;              // number of bits for color cache lookup
2239e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int palette_size;            // number of color in palette, if used
2249e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int lossless_size;           // final lossless size
2257c8da7ce66017295a65ec028084b90800be377f8James Zern  int lossless_hdr_size;       // lossless header (transform, huffman etc) size
2267c8da7ce66017295a65ec028084b90800be377f8James Zern  int lossless_data_size;      // lossless image data size
2279e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2287c8da7ce66017295a65ec028084b90800be377f8James Zern  uint32_t pad[2];        // padding for later use
2299e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern};
2309e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2319e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Signature for output function. Should return true if writing was successful.
2329e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// data/data_size is the segment of data to write, and 'picture' is for
2339e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// reference (and so one can make use of picture->custom_ptr).
2349e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef int (*WebPWriterFunction)(const uint8_t* data, size_t data_size,
2359e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                  const WebPPicture* picture);
2369e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2379e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// WebPMemoryWrite: a special WebPWriterFunction that writes to memory using
2389e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// the following WebPMemoryWriter object (to be set as a custom_ptr).
2399e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernstruct WebPMemoryWriter {
2409e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint8_t* mem;       // final buffer (of size 'max_size', larger than 'size').
2419e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  size_t   size;      // final size
2429e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  size_t   max_size;  // total capacity
2439e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint32_t pad[1];    // padding for later use
2449e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern};
2459e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2469e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// The following must be called first before any use.
2479e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(void) WebPMemoryWriterInit(WebPMemoryWriter* writer);
2489e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2499e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// The following must be called to deallocate writer->mem memory. The 'writer'
2509e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// object itself is not deallocated.
2519e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(void) WebPMemoryWriterClear(WebPMemoryWriter* writer);
2529e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon
2539e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// completion, writer.mem and writer.size will hold the coded data.
2549e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// writer.mem must be freed by calling WebPMemoryWriterClear.
2559e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPMemoryWrite(const uint8_t* data, size_t data_size,
2569e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                 const WebPPicture* picture);
2579e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2589e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Progress hook, called from time to time to report progress. It can return
2599e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// false to request an abort of the encoding process, or true otherwise if
2609e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// everything is OK.
2619e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef int (*WebPProgressHook)(int percent, const WebPPicture* picture);
2629e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2639e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Color spaces.
2649e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef enum WebPEncCSP {
2659e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // chroma sampling
2669e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_YUV420  = 0,        // 4:2:0
2679e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_YUV420A = 4,        // alpha channel variant
2689e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_CSP_UV_MASK = 3,    // bit-mask to get the UV sampling factors
2699e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WEBP_CSP_ALPHA_BIT = 4   // bit that is set if alpha is present
2709e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern} WebPEncCSP;
2719e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2729e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Encoding error conditions.
2739e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zerntypedef enum WebPEncodingError {
2749e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_OK = 0,
2759e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_OUT_OF_MEMORY,            // memory error allocating objects
2769e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY,  // memory error while flushing bits
2779e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_NULL_PARAMETER,           // a pointer parameter is NULL
2789e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_INVALID_CONFIGURATION,    // configuration is invalid
2799e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_BAD_DIMENSION,            // picture has invalid width/height
2809e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_PARTITION0_OVERFLOW,      // partition is bigger than 512k
2819e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_PARTITION_OVERFLOW,       // partition is bigger than 16M
2829e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_BAD_WRITE,                // error while flushing bytes
2839e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_FILE_TOO_BIG,             // file is bigger than 4G
2849e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_USER_ABORT,               // abort request by user
2859e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  VP8_ENC_ERROR_LAST                      // list terminator. always last.
2869e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern} WebPEncodingError;
2879e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2889e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// maximum width/height allowed (inclusive), in pixels
2899e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#define WEBP_MAX_DIMENSION 16383
2909e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
2919e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Main exchange structure (input samples, output bytes, statistics)
2929e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernstruct WebPPicture {
2939e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  //   INPUT
2949e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  //////////////
2959e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // Main flag for encoder selecting between ARGB or YUV input.
2969e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // It is recommended to use ARGB input (*argb, argb_stride) for lossless
2979e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // compression, and YUV input (*y, *u, *v, etc.) for lossy compression
2989e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // since these are the respective native colorspace for these formats.
2999e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int use_argb;
3009e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3019e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // YUV input (mostly used for input to lossy compression)
3029e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WebPEncCSP colorspace;     // colorspace: should be YUV420 for now (=Y'CbCr).
3039e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int width, height;         // dimensions (less or equal to WEBP_MAX_DIMENSION)
3049e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint8_t *y, *u, *v;        // pointers to luma/chroma planes.
3059e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int y_stride, uv_stride;   // luma/chroma strides.
3069e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint8_t* a;                // pointer to the alpha plane
3079e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int a_stride;              // stride of the alpha plane
3089e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint32_t pad1[2];          // padding for later use
3099e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3109e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // ARGB input (mostly used for input to lossless compression)
3119e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint32_t* argb;            // Pointer to argb (32 bit) plane.
3129e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int argb_stride;           // This is stride in pixels units, not bytes.
3139e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint32_t pad2[3];          // padding for later use
3149e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3159e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  //   OUTPUT
3169e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  ///////////////
3179e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // Byte-emission hook, to store compressed bytes as they are ready.
3189e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WebPWriterFunction writer;  // can be NULL
3199e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  void* custom_ptr;           // can be used by the writer.
3209e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3219e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // map for extra information (only for lossy compression mode)
3229e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  int extra_info_type;    // 1: intra type, 2: segment, 3: quant
3239e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // 4: intra-16 prediction mode,
3249e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // 5: chroma prediction mode,
3259e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // 6: bit cost, 7: distortion
3269e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint8_t* extra_info;    // if not NULL, points to an array of size
3279e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // ((width + 15) / 16) * ((height + 15) / 16) that
3289e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // will be filled with a macroblock map, depending
3299e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // on extra_info_type.
3309e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3319e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  //   STATS AND REPORTS
3329e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  ///////////////////////////
3339e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // Pointer to side statistics (updated only if not NULL)
3349e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WebPAuxStats* stats;
3359e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3369e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // Error code for the latest error encountered during encoding
3379e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WebPEncodingError error_code;
3389e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3399e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // If not NULL, report progress during encoding.
3409e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  WebPProgressHook progress_hook;
3419e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3429e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  void* user_data;        // this field is free to be set to any value and
3439e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                          // used during callbacks (like progress-report e.g.).
3449e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3459e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint32_t pad3[3];       // padding for later use
3469e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3479e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // Unused for now
3489e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint8_t *pad4, *pad5;
3499e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  uint32_t pad6[8];       // padding for later use
3509e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3519e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  // PRIVATE FIELDS
3529e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  ////////////////////
3539e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  void* memory_;          // row chunk of memory for yuva planes
3549e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  void* memory_argb_;     // and for argb too.
3559e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  void* pad7[2];          // padding for later use
3569e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern};
3579e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3589e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Internal, version-checked, entry point
3599e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureInitInternal(WebPPicture*, int);
3609e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3619e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Should always be called, to initialize the structure. Returns false in case
3629e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// of version mismatch. WebPPictureInit() must have succeeded before using the
3639e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// 'picture' object.
3649e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Note that, by default, use_argb is false and colorspace is WEBP_YUV420.
3659e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zernstatic WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
3669e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern  return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION);
3679e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern}
3689e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3699e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//------------------------------------------------------------------------------
3709e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// WebPPicture utils
3719e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3729e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Convenience allocation / deallocation based on picture->width/height:
3739e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Allocate y/u/v buffers as per colorspace/width/height specification.
3749e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Note! This function will free the previous buffer if needed.
3759e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of memory error.
3769e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureAlloc(WebPPicture* picture);
3779e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3789e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*().
3799e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Note that this function does _not_ free the memory used by the 'picture'
3809e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// object itself.
3819e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Besides memory (which is reclaimed) all other fields of 'picture' are
3829e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// preserved.
3839e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(void) WebPPictureFree(WebPPicture* picture);
3849e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3859e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Copy the pixels of *src into *dst, using WebPPictureAlloc. Upon return, *dst
3869e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// will fully own the copied pixels (this is not a view). The 'dst' picture need
3879e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// not be initialized as its content is overwritten.
3889e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of memory allocation error.
3899e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureCopy(const WebPPicture* src, WebPPicture* dst);
3909e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
3917c8da7ce66017295a65ec028084b90800be377f8James Zern// Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results
3927c8da7ce66017295a65ec028084b90800be377f8James Zern// are in dB, stored in result[] in the Y/U/V/Alpha/All or B/G/R/A/All order.
3939e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of error (src and ref don't have same dimension, ...)
3949e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Warning: this function is rather CPU-intensive.
3959e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureDistortion(
3969e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    const WebPPicture* src, const WebPPicture* ref,
3979e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    int metric_type,           // 0 = PSNR, 1 = SSIM, 2 = LSIM
3989e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    float result[5]);
3999e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4009e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// self-crops a picture to the rectangle defined by top/left/width/height.
4019e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of memory allocation error, or if the rectangle is
4029e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// outside of the source picture.
4039e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// The rectangle for the view is defined by the top-left corner pixel
4049e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// coordinates (left, top) as well as its width and height. This rectangle
4059e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// must be fully be comprised inside the 'src' source picture. If the source
4069e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// picture uses the YUV420 colorspace, the top and left coordinates will be
4079e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// snapped to even values.
4089e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureCrop(WebPPicture* picture,
4099e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                 int left, int top, int width, int height);
4109e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4119e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Extracts a view from 'src' picture into 'dst'. The rectangle for the view
4129e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// is defined by the top-left corner pixel coordinates (left, top) as well
4139e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// as its width and height. This rectangle must be fully be comprised inside
4149e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// the 'src' source picture. If the source picture uses the YUV420 colorspace,
4159e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// the top and left coordinates will be snapped to even values.
4169e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Picture 'src' must out-live 'dst' picture. Self-extraction of view is allowed
4179e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// ('src' equal to 'dst') as a mean of fast-cropping (but note that doing so,
4189e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// the original dimension will be lost). Picture 'dst' need not be initialized
4199e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// with WebPPictureInit() if it is different from 'src', since its content will
4209e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// be overwritten.
4219e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of memory allocation error or invalid parameters.
4229e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureView(const WebPPicture* src,
4239e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                 int left, int top, int width, int height,
4249e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                 WebPPicture* dst);
4259e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4269e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns true if the 'picture' is actually a view and therefore does
4279e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// not own the memory for pixels.
4289e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureIsView(const WebPPicture* picture);
4299e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4309e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Rescale a picture to new dimension width x height.
4319e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// If either 'width' or 'height' (but not both) is 0 the corresponding
4329e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// dimension will be calculated preserving the aspect ratio.
4339e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// No gamma correction is applied.
4349e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of error (invalid parameter or insufficient memory).
4359e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureRescale(WebPPicture* pic, int width, int height);
4369e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4379e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Colorspace conversion function to import RGB samples.
4389e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Previous buffer will be free'd, if any.
4399e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// *rgb buffer should have a size of at least height * rgb_stride.
4409e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of memory error.
4419e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureImportRGB(
4429e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    WebPPicture* picture, const uint8_t* rgb, int rgb_stride);
4439e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Same, but for RGBA buffer.
4449e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureImportRGBA(
4459e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    WebPPicture* picture, const uint8_t* rgba, int rgba_stride);
4469e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format
4479e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// input buffer ignoring the alpha channel. Avoids needing to copy the data
4489e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// to a temporary 24-bit RGB buffer to import the RGB only.
4499e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureImportRGBX(
4509e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride);
4519e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4529e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Variants of the above, but taking BGR(A|X) input.
4539e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureImportBGR(
4549e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    WebPPicture* picture, const uint8_t* bgr, int bgr_stride);
4559e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureImportBGRA(
4569e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    WebPPicture* picture, const uint8_t* bgra, int bgra_stride);
4579e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureImportBGRX(
4589e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride);
4599e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4609e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Converts picture->argb data to the YUV420A format. The 'colorspace'
4619e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// parameter is deprecated and should be equal to WEBP_YUV420.
4629e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Upon return, picture->use_argb is set to false. The presence of real
4639e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// non-opaque transparent values is detected, and 'colorspace' will be
4649e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// adjusted accordingly. Note that this method is lossy.
4659e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of error.
4669e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureARGBToYUVA(WebPPicture* picture,
4679e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern                                       WebPEncCSP /*colorspace = WEBP_YUV420*/);
4689e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4699e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Same as WebPPictureARGBToYUVA(), but the conversion is done using
4709e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// pseudo-random dithering with a strength 'dithering' between
4719e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// 0.0 (no dithering) and 1.0 (maximum dithering). This is useful
4729e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// for photographic picture.
4739e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureARGBToYUVADithered(
4749e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern    WebPPicture* picture, WebPEncCSP colorspace, float dithering);
4759e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4769e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Performs 'smart' RGBA->YUVA420 downsampling and colorspace conversion.
4779e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Downsampling is handled with extra care in case of color clipping. This
4789e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better
4799e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// YUV representation.
4809e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of error.
4819e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureSmartARGBToYUVA(WebPPicture* picture);
4829e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4839e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Converts picture->yuv to picture->argb and sets picture->use_argb to true.
4849e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// The input format must be YUV_420 or YUV_420A.
4859e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Note that the use of this method is discouraged if one has access to the
4869e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// raw ARGB samples, since using YUV420 is comparatively lossy. Also, the
4879e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// conversion from YUV420 to ARGB incurs a small loss too.
4889e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of error.
4899e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureYUVAToARGB(WebPPicture* picture);
4909e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4919e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Helper function: given a width x height plane of RGBA or YUV(A) samples
4929e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// clean-up the YUV or RGB samples under fully transparent area, to help
4939e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// compressibility (no guarantee, though).
4949e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(void) WebPCleanupTransparentArea(WebPPicture* picture);
4959e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
4969e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Scan the picture 'picture' for the presence of non fully opaque alpha values.
4979e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns true in such case. Otherwise returns false (indicating that the
4989e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// alpha plane can be ignored altogether e.g.).
4999e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPPictureHasTransparency(const WebPPicture* picture);
5009e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
5019e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Remove the transparency information (if present) by blending the color with
5029e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// the background color 'background_rgb' (specified as 24bit RGB triplet).
5039e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// After this call, all alpha values are reset to 0xff.
5049e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(void) WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb);
5059e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
5069e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//------------------------------------------------------------------------------
5079e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Main call
5089e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
5099e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Main encoding call, after config and picture have been initialized.
5109e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// 'picture' must be less than 16384x16384 in dimension (cf WEBP_MAX_DIMENSION),
5119e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// and the 'config' object must be a valid one.
5129e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// Returns false in case of error, true otherwise.
5139e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// In case of error, picture->error_code is updated accordingly.
5149e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// 'picture' can hold the source samples in both YUV(A) or ARGB input, depending
5159e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// on the value of 'picture->use_argb'. It is highly recommended to use
5169e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// the former for lossy encoding, and the latter for lossless encoding
5179e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// (when config.lossless is true). Automatic conversion from one format to
5189e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern// another is provided but they both incur some loss.
5199e80ee991168a0a6c2a906dd2c17c5e17df4566eJames ZernWEBP_EXTERN(int) WebPEncode(const WebPConfig* config, WebPPicture* picture);
5209e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
5219e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern//------------------------------------------------------------------------------
5229e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
5239e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#ifdef __cplusplus
5249e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern}    // extern "C"
5259e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#endif
5269e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern
5279e80ee991168a0a6c2a906dd2c17c5e17df4566eJames Zern#endif  /* WEBP_WEBP_ENCODE_H_ */
528