xref: /aosp_15_r20/external/webp/extras/extras.h (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
1 // Copyright 2015 Google Inc. All Rights Reserved.
2 //
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the COPYING file in the root of the source
5 // tree. An additional intellectual property rights grant can be found
6 // in the file PATENTS. All contributing project authors may
7 // be found in the AUTHORS file in the root of the source tree.
8 // -----------------------------------------------------------------------------
9 //
10 
11 #ifndef WEBP_EXTRAS_EXTRAS_H_
12 #define WEBP_EXTRAS_EXTRAS_H_
13 
14 #include "webp/types.h"
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 #include "sharpyuv/sharpyuv.h"
21 #include "webp/encode.h"
22 
23 #define WEBP_EXTRAS_ABI_VERSION 0x0003    // MAJOR(8b) + MINOR(8b)
24 
25 //------------------------------------------------------------------------------
26 
27 // Returns the version number of the extras library, packed in hexadecimal using
28 // 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507.
29 WEBP_EXTERN int WebPGetExtrasVersion(void);
30 
31 //------------------------------------------------------------------------------
32 // Ad-hoc colorspace importers.
33 
34 // Import luma sample (gray scale image) into 'picture'. The 'picture'
35 // width and height must be set prior to calling this function.
36 WEBP_EXTERN int WebPImportGray(const uint8_t* gray, WebPPicture* picture);
37 
38 // Import rgb sample in RGB565 packed format into 'picture'. The 'picture'
39 // width and height must be set prior to calling this function.
40 WEBP_EXTERN int WebPImportRGB565(const uint8_t* rgb565, WebPPicture* pic);
41 
42 // Import rgb sample in RGB4444 packed format into 'picture'. The 'picture'
43 // width and height must be set prior to calling this function.
44 WEBP_EXTERN int WebPImportRGB4444(const uint8_t* rgb4444, WebPPicture* pic);
45 
46 // Import a color mapped image. The number of colors is less or equal to
47 // MAX_PALETTE_SIZE. 'pic' must have been initialized. Its content, if any,
48 // will be discarded. Returns 'false' in case of error, or if indexed[] contains
49 // invalid indices.
50 WEBP_EXTERN int
51 WebPImportColorMappedARGB(const uint8_t* indexed, int indexed_stride,
52                           const uint32_t palette[], int palette_size,
53                           WebPPicture* pic);
54 
55 // Convert the ARGB content of 'pic' from associated to unassociated.
56 // 'pic' can be for instance the result of calling of some WebPPictureImportXXX
57 // functions, with pic->use_argb set to 'true'. It is assumed (and not checked)
58 // that the pre-multiplied r/g/b values as less or equal than the alpha value.
59 // Return false in case of error (invalid parameter, ...).
60 WEBP_EXTERN int WebPUnmultiplyARGB(WebPPicture* pic);
61 
62 //------------------------------------------------------------------------------
63 
64 // Parse a bitstream, search for VP8 (lossy) header and report a
65 // rough estimation of the quality factor used for compressing the bitstream.
66 // If the bitstream is in lossless format, the special value '101' is returned.
67 // Otherwise (lossy bitstream), the returned value is in the range [0..100].
68 // Any error (invalid bitstream, animated WebP, incomplete header, etc.)
69 // will return a value of -1.
70 WEBP_EXTERN int VP8EstimateQuality(const uint8_t* const data, size_t size);
71 
72 //------------------------------------------------------------------------------
73 
74 // Computes a score between 0 and 100 which represents the risk of having visual
75 // quality loss from converting an RGB image to YUV420.
76 // A low score, typically < 40, means there is a low risk of artifacts from
77 // chroma subsampling and a simple averaging algorithm can be used instead of
78 // the more expensive SharpYuvConvert function.
79 // A medium score, typically >= 40 and < 70, means that simple chroma
80 // subsampling will produce artifacts and it may be advisable to use the more
81 // costly SharpYuvConvert for YUV420 conversion.
82 // A high score, typically >= 70, means there is a very high risk of artifacts
83 // from chroma subsampling even with SharpYuvConvert, and best results might be
84 // achieved by using YUV444.
85 // If not using SharpYuvConvert, a threshold of about 50 can be used to decide
86 // between (simple averaging) 420 and 444.
87 // r_ptr, g_ptr, b_ptr: pointers to the source r, g and b channels. Should point
88 //     to uint8_t buffers if rgb_bit_depth is 8, or uint16_t buffers otherwise.
89 // rgb_step: distance in bytes between two horizontally adjacent pixels on the
90 //     r, g and b channels. If rgb_bit_depth is > 8, it should be a
91 //     multiple of 2.
92 // rgb_stride: distance in bytes between two vertically adjacent pixels on the
93 //     r, g, and b channels. If rgb_bit_depth is > 8, it should be a
94 //     multiple of 2.
95 // rgb_bit_depth: number of bits for each r/g/b value. Only a value of 8 is
96 //     currently supported.
97 // width, height: width and height of the image in pixels
98 // Returns 0 on failure.
99 WEBP_EXTERN int SharpYuvEstimate420Risk(
100     const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step,
101     int rgb_stride, int rgb_bit_depth, int width, int height,
102     const SharpYuvOptions* options, float* score);
103 
104 //------------------------------------------------------------------------------
105 
106 #ifdef __cplusplus
107 }    // extern "C"
108 #endif
109 
110 #endif  // WEBP_EXTRAS_EXTRAS_H_
111