Skip to content

Latest commit

 

History

History
493 lines (427 loc) · 22.6 KB

File metadata and controls

493 lines (427 loc) · 22.6 KB
 
Oct 16, 2018
Oct 16, 2018
1
// Copyright 2010 Google Inc. All Rights Reserved.
Jan 3, 2012
Jan 3, 2012
2
//
Oct 16, 2018
Oct 16, 2018
3
4
5
6
7
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
Jan 3, 2012
Jan 3, 2012
8
9
// -----------------------------------------------------------------------------
//
Oct 16, 2018
Oct 16, 2018
10
// Main decoding functions for WebP images.
Jan 3, 2012
Jan 3, 2012
11
12
13
14
15
16
17
18
//
// Author: Skal (pascal.massimino@gmail.com)
#ifndef WEBP_WEBP_DECODE_H_
#define WEBP_WEBP_DECODE_H_
#include "./types.h"
Oct 16, 2018
Oct 16, 2018
19
#ifdef __cplusplus
Jan 3, 2012
Jan 3, 2012
20
21
22
extern "C" {
#endif
Oct 16, 2018
Oct 16, 2018
23
24
25
26
27
28
29
30
31
32
33
34
35
#define WEBP_DECODER_ABI_VERSION 0x0208 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum VP8StatusCode VP8StatusCode;
// typedef enum WEBP_CSP_MODE WEBP_CSP_MODE;
typedef struct WebPRGBABuffer WebPRGBABuffer;
typedef struct WebPYUVABuffer WebPYUVABuffer;
typedef struct WebPDecBuffer WebPDecBuffer;
typedef struct WebPIDecoder WebPIDecoder;
typedef struct WebPBitstreamFeatures WebPBitstreamFeatures;
typedef struct WebPDecoderOptions WebPDecoderOptions;
typedef struct WebPDecoderConfig WebPDecoderConfig;
Jan 3, 2012
Jan 3, 2012
36
37
38
39
40
41
// Return the decoder's version number, packed in hexadecimal using 8bits for
// each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN(int) WebPGetDecoderVersion(void);
// Retrieve basic header information: width, height.
Oct 16, 2018
Oct 16, 2018
42
43
44
45
// This function will also validate the header, returning true on success,
// false otherwise. '*width' and '*height' are only valid on successful return.
// Pointers 'width' and 'height' can be passed NULL if deemed irrelevant.
WEBP_EXTERN(int) WebPGetInfo(const uint8_t* data, size_t data_size,
Jan 3, 2012
Jan 3, 2012
46
47
int* width, int* height);
Oct 16, 2018
Oct 16, 2018
48
49
50
51
// Decodes WebP images pointed to by 'data' and returns RGBA samples, along
// with the dimensions in *width and *height. The ordering of samples in
// memory is R, G, B, A, R, G, B, A... in scan order (endian-independent).
// The returned pointer should be deleted calling WebPFree().
Jan 3, 2012
Jan 3, 2012
52
// Returns NULL in case of error.
Oct 16, 2018
Oct 16, 2018
53
54
WEBP_EXTERN(uint8_t*) WebPDecodeRGBA(const uint8_t* data, size_t data_size,
int* width, int* height);
Jan 3, 2012
Jan 3, 2012
55
Oct 16, 2018
Oct 16, 2018
56
57
// Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data.
WEBP_EXTERN(uint8_t*) WebPDecodeARGB(const uint8_t* data, size_t data_size,
Jan 3, 2012
Jan 3, 2012
58
59
int* width, int* height);
Oct 16, 2018
Oct 16, 2018
60
61
// Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data.
WEBP_EXTERN(uint8_t*) WebPDecodeBGRA(const uint8_t* data, size_t data_size,
Jan 3, 2012
Jan 3, 2012
62
63
int* width, int* height);
Oct 16, 2018
Oct 16, 2018
64
65
66
// Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data.
// If the bitstream contains transparency, it is ignored.
WEBP_EXTERN(uint8_t*) WebPDecodeRGB(const uint8_t* data, size_t data_size,
Jan 3, 2012
Jan 3, 2012
67
68
int* width, int* height);
Oct 16, 2018
Oct 16, 2018
69
70
71
72
73
74
75
76
77
78
// Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data.
WEBP_EXTERN(uint8_t*) WebPDecodeBGR(const uint8_t* data, size_t data_size,
int* width, int* height);
// Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer
// returned is the Y samples buffer. Upon return, *u and *v will point to
// the U and V chroma data. These U and V buffers need NOT be passed to
// WebPFree(), unlike the returned Y luma one. The dimension of the U and V
// planes are both (*width + 1) / 2 and (*height + 1)/ 2.
Jan 3, 2012
Jan 3, 2012
79
80
81
82
// Upon return, the Y buffer has a stride returned as '*stride', while U and V
// have a common stride returned as '*uv_stride'.
// Return NULL in case of error.
// (*) Also named Y'CbCr. See: http://en.wikipedia.org/wiki/YCbCr
Oct 16, 2018
Oct 16, 2018
83
WEBP_EXTERN(uint8_t*) WebPDecodeYUV(const uint8_t* data, size_t data_size,
Jan 3, 2012
Jan 3, 2012
84
85
86
87
int* width, int* height,
uint8_t** u, uint8_t** v,
int* stride, int* uv_stride);
Oct 16, 2018
Oct 16, 2018
88
89
90
// Releases memory returned by the WebPDecode*() functions above.
WEBP_EXTERN(void) WebPFree(void* ptr);
Jan 3, 2012
Jan 3, 2012
91
92
93
94
95
96
97
98
99
// These five functions are variants of the above ones, that decode the image
// directly into a pre-allocated buffer 'output_buffer'. The maximum storage
// available in this buffer is indicated by 'output_buffer_size'. If this
// storage is not sufficient (or an error occurred), NULL is returned.
// Otherwise, output_buffer is returned, for convenience.
// The parameter 'output_stride' specifies the distance (in bytes)
// between scanlines. Hence, output_buffer_size is expected to be at least
// output_stride x picture-height.
WEBP_EXTERN(uint8_t*) WebPDecodeRGBAInto(
Oct 16, 2018
Oct 16, 2018
100
101
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
Jan 3, 2012
Jan 3, 2012
102
WEBP_EXTERN(uint8_t*) WebPDecodeARGBInto(
Oct 16, 2018
Oct 16, 2018
103
104
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
Jan 3, 2012
Jan 3, 2012
105
WEBP_EXTERN(uint8_t*) WebPDecodeBGRAInto(
Oct 16, 2018
Oct 16, 2018
106
107
108
109
110
111
112
113
114
115
116
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// RGB and BGR variants. Here too the transparency information, if present,
// will be dropped and ignored.
WEBP_EXTERN(uint8_t*) WebPDecodeRGBInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
WEBP_EXTERN(uint8_t*) WebPDecodeBGRInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
Jan 3, 2012
Jan 3, 2012
117
118
119
120
121
122
123
124
125
// WebPDecodeYUVInto() is a variant of WebPDecodeYUV() that operates directly
// into pre-allocated luma/chroma plane buffers. This function requires the
// strides to be passed: one for the luma plane and one for each of the
// chroma ones. The size of each plane buffer is passed as 'luma_size',
// 'u_size' and 'v_size' respectively.
// Pointer to the luma plane ('*luma') is returned or NULL if an error occurred
// during decoding (or because some buffers were found to be too small).
WEBP_EXTERN(uint8_t*) WebPDecodeYUVInto(
Oct 16, 2018
Oct 16, 2018
126
127
128
129
const uint8_t* data, size_t data_size,
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride);
Jan 3, 2012
Jan 3, 2012
130
131
132
133
134
//------------------------------------------------------------------------------
// Output colorspaces and buffer
// Colorspaces
Oct 16, 2018
Oct 16, 2018
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Note: the naming describes the byte-ordering of packed samples in memory.
// For instance, MODE_BGRA relates to samples ordered as B,G,R,A,B,G,R,A,...
// Non-capital names (e.g.:MODE_Argb) relates to pre-multiplied RGB channels.
// RGBA-4444 and RGB-565 colorspaces are represented by following byte-order:
// RGBA-4444: [r3 r2 r1 r0 g3 g2 g1 g0], [b3 b2 b1 b0 a3 a2 a1 a0], ...
// RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ...
// In the case WEBP_SWAP_16BITS_CSP is defined, the bytes are swapped for
// these two modes:
// RGBA-4444: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], ...
// RGB-565: [g2 g1 g0 b4 b3 b2 b1 b0], [r4 r3 r2 r1 r0 g5 g4 g3], ...
typedef enum WEBP_CSP_MODE {
MODE_RGB = 0, MODE_RGBA = 1,
MODE_BGR = 2, MODE_BGRA = 3,
MODE_ARGB = 4, MODE_RGBA_4444 = 5,
MODE_RGB_565 = 6,
// RGB-premultiplied transparent modes (alpha value is preserved)
MODE_rgbA = 7,
MODE_bgrA = 8,
MODE_Argb = 9,
MODE_rgbA_4444 = 10,
// YUV modes must come after RGB ones.
MODE_YUV = 11, MODE_YUVA = 12, // yuv 4:2:0
MODE_LAST = 13
} WEBP_CSP_MODE;
// Some useful macros:
static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) {
return (mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb ||
mode == MODE_rgbA_4444);
}
static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) {
return (mode == MODE_RGBA || mode == MODE_BGRA || mode == MODE_ARGB ||
mode == MODE_RGBA_4444 || mode == MODE_YUVA ||
WebPIsPremultipliedMode(mode));
}
static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) {
return (mode < MODE_YUV);
}
//------------------------------------------------------------------------------
// WebPDecBuffer: Generic structure for describing the output sample buffer.
struct WebPRGBABuffer { // view as RGBA
Jan 3, 2012
Jan 3, 2012
181
182
uint8_t* rgba; // pointer to RGBA samples
int stride; // stride in bytes from one scanline to the next.
Oct 16, 2018
Oct 16, 2018
183
184
size_t size; // total size of the *rgba buffer.
};
Jan 3, 2012
Jan 3, 2012
185
Oct 16, 2018
Oct 16, 2018
186
struct WebPYUVABuffer { // view as YUVA
Jan 3, 2012
Jan 3, 2012
187
188
189
190
uint8_t* y, *u, *v, *a; // pointer to luma, chroma U/V, alpha samples
int y_stride; // luma stride
int u_stride, v_stride; // chroma strides
int a_stride; // alpha stride
Oct 16, 2018
Oct 16, 2018
191
192
193
194
size_t y_size; // luma plane size
size_t u_size, v_size; // chroma planes size
size_t a_size; // alpha-plane size
};
Jan 3, 2012
Jan 3, 2012
195
196
// Output buffer
Oct 16, 2018
Oct 16, 2018
197
struct WebPDecBuffer {
Jan 3, 2012
Jan 3, 2012
198
199
WEBP_CSP_MODE colorspace; // Colorspace.
int width, height; // Dimensions.
Oct 16, 2018
Oct 16, 2018
200
201
202
203
int is_external_memory; // If non-zero, 'internal_memory' pointer is not
// used. If value is '2' or more, the external
// memory is considered 'slow' and multiple
// read/write will be avoided.
Jan 3, 2012
Jan 3, 2012
204
205
206
207
union {
WebPRGBABuffer RGBA;
WebPYUVABuffer YUVA;
} u; // Nameless union of buffer parameters.
Oct 16, 2018
Oct 16, 2018
208
209
uint32_t pad[4]; // padding for later use
Jan 3, 2012
Jan 3, 2012
210
uint8_t* private_memory; // Internally allocated memory (only when
Oct 16, 2018
Oct 16, 2018
211
// is_external_memory is 0). Should not be used
Jan 3, 2012
Jan 3, 2012
212
// externally, but accessed via the buffer union.
Oct 16, 2018
Oct 16, 2018
213
};
Jan 3, 2012
Jan 3, 2012
214
215
// Internal, version-checked, entry point
Oct 16, 2018
Oct 16, 2018
216
WEBP_EXTERN(int) WebPInitDecBufferInternal(WebPDecBuffer*, int);
Jan 3, 2012
Jan 3, 2012
217
218
219
// Initialize the structure as empty. Must be called before any other use.
// Returns false in case of version mismatch
Oct 16, 2018
Oct 16, 2018
220
static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
Jan 3, 2012
Jan 3, 2012
221
222
223
224
225
return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION);
}
// Free any memory associated with the buffer. Must always be called last.
// Note: doesn't free the 'buffer' structure itself.
Oct 16, 2018
Oct 16, 2018
226
WEBP_EXTERN(void) WebPFreeDecBuffer(WebPDecBuffer* buffer);
Jan 3, 2012
Jan 3, 2012
227
228
229
230
//------------------------------------------------------------------------------
// Enumeration of the status codes
Oct 16, 2018
Oct 16, 2018
231
typedef enum VP8StatusCode {
Jan 3, 2012
Jan 3, 2012
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
VP8_STATUS_OK = 0,
VP8_STATUS_OUT_OF_MEMORY,
VP8_STATUS_INVALID_PARAM,
VP8_STATUS_BITSTREAM_ERROR,
VP8_STATUS_UNSUPPORTED_FEATURE,
VP8_STATUS_SUSPENDED,
VP8_STATUS_USER_ABORT,
VP8_STATUS_NOT_ENOUGH_DATA
} VP8StatusCode;
//------------------------------------------------------------------------------
// Incremental decoding
//
// This API allows streamlined decoding of partial data.
// Picture can be incrementally decoded as data become available thanks to the
// WebPIDecoder object. This object can be left in a SUSPENDED state if the
// picture is only partially decoded, pending additional input.
// Code example:
//
Oct 16, 2018
Oct 16, 2018
251
252
253
254
255
256
// WebPInitDecBuffer(&output_buffer);
// output_buffer.colorspace = mode;
// ...
// WebPIDecoder* idec = WebPINewDecoder(&output_buffer);
// while (additional_data_is_available) {
// // ... (get additional data in some new_data[] buffer)
Jan 3, 2012
Jan 3, 2012
257
// status = WebPIAppend(idec, new_data, new_data_size);
Oct 16, 2018
Oct 16, 2018
258
259
// if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
// break; // an error occurred.
Jan 3, 2012
Jan 3, 2012
260
261
262
// }
//
// // The above call decodes the current available buffer.
Oct 16, 2018
Oct 16, 2018
263
264
// // Part of the image can now be refreshed by calling
// // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
Jan 3, 2012
Jan 3, 2012
265
266
267
268
269
270
271
272
// }
// WebPIDelete(idec);
// Creates a new incremental decoder with the supplied buffer parameter.
// This output_buffer can be passed NULL, in which case a default output buffer
// is used (with MODE_RGB). Otherwise, an internal reference to 'output_buffer'
// is kept, which means that the lifespan of 'output_buffer' must be larger than
// that of the returned WebPIDecoder object.
Oct 16, 2018
Oct 16, 2018
273
274
275
276
277
278
// The supplied 'output_buffer' content MUST NOT be changed between calls to
// WebPIAppend() or WebPIUpdate() unless 'output_buffer.is_external_memory' is
// not set to 0. In such a case, it is allowed to modify the pointers, size and
// stride of output_buffer.u.RGBA or output_buffer.u.YUVA, provided they remain
// within valid bounds.
// All other fields of WebPDecBuffer MUST remain constant between calls.
Jan 3, 2012
Jan 3, 2012
279
// Returns NULL if the allocation failed.
Oct 16, 2018
Oct 16, 2018
280
WEBP_EXTERN(WebPIDecoder*) WebPINewDecoder(WebPDecBuffer* output_buffer);
Jan 3, 2012
Jan 3, 2012
281
282
// This function allocates and initializes an incremental-decoder object, which
Oct 16, 2018
Oct 16, 2018
283
// will output the RGB/A samples specified by 'csp' into a preallocated
Jan 3, 2012
Jan 3, 2012
284
285
// buffer 'output_buffer'. The size of this buffer is at least
// 'output_buffer_size' and the stride (distance in bytes between two scanlines)
Oct 16, 2018
Oct 16, 2018
286
287
288
289
290
291
// is specified by 'output_stride'.
// Additionally, output_buffer can be passed NULL in which case the output
// buffer will be allocated automatically when the decoding starts. The
// colorspace 'csp' is taken into account for allocating this buffer. All other
// parameters are ignored.
// Returns NULL if the allocation failed, or if some parameters are invalid.
Jan 3, 2012
Jan 3, 2012
292
WEBP_EXTERN(WebPIDecoder*) WebPINewRGB(
Oct 16, 2018
Oct 16, 2018
293
294
WEBP_CSP_MODE csp,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
Jan 3, 2012
Jan 3, 2012
295
296
// This function allocates and initializes an incremental-decoder object, which
Oct 16, 2018
Oct 16, 2018
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
// will output the raw luma/chroma samples into a preallocated planes if
// supplied. The luma plane is specified by its pointer 'luma', its size
// 'luma_size' and its stride 'luma_stride'. Similarly, the chroma-u plane
// is specified by the 'u', 'u_size' and 'u_stride' parameters, and the chroma-v
// plane by 'v' and 'v_size'. And same for the alpha-plane. The 'a' pointer
// can be pass NULL in case one is not interested in the transparency plane.
// Conversely, 'luma' can be passed NULL if no preallocated planes are supplied.
// In this case, the output buffer will be automatically allocated (using
// MODE_YUVA) when decoding starts. All parameters are then ignored.
// Returns NULL if the allocation failed or if a parameter is invalid.
WEBP_EXTERN(WebPIDecoder*) WebPINewYUVA(
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride,
uint8_t* a, size_t a_size, int a_stride);
// Deprecated version of the above, without the alpha plane.
// Kept for backward compatibility.
Jan 3, 2012
Jan 3, 2012
315
WEBP_EXTERN(WebPIDecoder*) WebPINewYUV(
Oct 16, 2018
Oct 16, 2018
316
317
318
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride);
Jan 3, 2012
Jan 3, 2012
319
320
// Deletes the WebPIDecoder object and associated memory. Must always be called
Oct 16, 2018
Oct 16, 2018
321
322
// if WebPINewDecoder, WebPINewRGB or WebPINewYUV succeeded.
WEBP_EXTERN(void) WebPIDelete(WebPIDecoder* idec);
Jan 3, 2012
Jan 3, 2012
323
324
325
326
327
// Copies and decodes the next available data. Returns VP8_STATUS_OK when
// the image is successfully decoded. Returns VP8_STATUS_SUSPENDED when more
// data is expected. Returns error in other cases.
WEBP_EXTERN(VP8StatusCode) WebPIAppend(
Oct 16, 2018
Oct 16, 2018
328
WebPIDecoder* idec, const uint8_t* data, size_t data_size);
Jan 3, 2012
Jan 3, 2012
329
330
331
332
333
334
335
// A variant of the above function to be used when data buffer contains
// partial data from the beginning. In this case data buffer is not copied
// to the internal memory.
// Note that the value of the 'data' pointer can change between calls to
// WebPIUpdate, for instance when the data buffer is resized to fit larger data.
WEBP_EXTERN(VP8StatusCode) WebPIUpdate(
Oct 16, 2018
Oct 16, 2018
336
337
338
339
340
341
342
343
WebPIDecoder* idec, const uint8_t* data, size_t data_size);
// Returns the RGB/A image decoded so far. Returns NULL if output params
// are not initialized yet. The RGB/A output type corresponds to the colorspace
// specified during call to WebPINewDecoder() or WebPINewRGB().
// *last_y is the index of last decoded row in raster scan order. Some pointers
// (*last_y, *width etc.) can be NULL if corresponding information is not
// needed.
Jan 3, 2012
Jan 3, 2012
344
WEBP_EXTERN(uint8_t*) WebPIDecGetRGB(
Oct 16, 2018
Oct 16, 2018
345
const WebPIDecoder* idec, int* last_y,
Jan 3, 2012
Jan 3, 2012
346
347
int* width, int* height, int* stride);
Oct 16, 2018
Oct 16, 2018
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
// Same as above function to get a YUVA image. Returns pointer to the luma
// plane or NULL in case of error. If there is no alpha information
// the alpha pointer '*a' will be returned NULL.
WEBP_EXTERN(uint8_t*) WebPIDecGetYUVA(
const WebPIDecoder* idec, int* last_y,
uint8_t** u, uint8_t** v, uint8_t** a,
int* width, int* height, int* stride, int* uv_stride, int* a_stride);
// Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the
// alpha information (if present). Kept for backward compatibility.
static WEBP_INLINE uint8_t* WebPIDecGetYUV(
const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v,
int* width, int* height, int* stride, int* uv_stride) {
return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height,
stride, uv_stride, NULL);
}
Jan 3, 2012
Jan 3, 2012
364
365
366
367
368
369
370
371
// Generic call to retrieve information about the displayable area.
// If non NULL, the left/right/width/height pointers are filled with the visible
// rectangular area so far.
// Returns NULL in case the incremental decoder object is in an invalid state.
// Otherwise returns the pointer to the internal representation. This structure
// is read-only, tied to WebPIDecoder's lifespan and should not be modified.
WEBP_EXTERN(const WebPDecBuffer*) WebPIDecodedArea(
Oct 16, 2018
Oct 16, 2018
372
const WebPIDecoder* idec, int* left, int* top, int* width, int* height);
Jan 3, 2012
Jan 3, 2012
373
374
375
376
377
378
379
380
381
382
383
384
385
386
//------------------------------------------------------------------------------
// Advanced decoding parametrization
//
// Code sample for using the advanced decoding API
/*
// A) Init a configuration object
WebPDecoderConfig config;
CHECK(WebPInitDecoderConfig(&config));
// B) optional: retrieve the bitstream's features.
CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
// C) Adjust 'config', if needed
Oct 16, 2018
Oct 16, 2018
387
config.no_fancy_upsampling = 1;
Jan 3, 2012
Jan 3, 2012
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
config.output.colorspace = MODE_BGRA;
// etc.
// Note that you can also make config.output point to an externally
// supplied memory buffer, provided it's big enough to store the decoded
// picture. Otherwise, config.output will just be used to allocate memory
// and store the decoded picture.
// D) Decode!
CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);
// E) Decoded image is now in config.output (and config.output.u.RGBA)
// F) Reclaim memory allocated in config's object. It's safe to call
// this function even if the memory is external and wasn't allocated
// by WebPDecode().
WebPFreeDecBuffer(&config.output);
*/
// Features gathered from the bitstream
Oct 16, 2018
Oct 16, 2018
408
409
410
411
412
413
414
415
416
struct WebPBitstreamFeatures {
int width; // Width in pixels, as read from the bitstream.
int height; // Height in pixels, as read from the bitstream.
int has_alpha; // True if the bitstream contains an alpha channel.
int has_animation; // True if the bitstream is an animation.
int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless
uint32_t pad[5]; // padding for later use
};
Jan 3, 2012
Jan 3, 2012
417
418
419
// Internal, version-checked, entry point
WEBP_EXTERN(VP8StatusCode) WebPGetFeaturesInternal(
Oct 16, 2018
Oct 16, 2018
420
const uint8_t*, size_t, WebPBitstreamFeatures*, int);
Jan 3, 2012
Jan 3, 2012
421
422
423
// Retrieve features from the bitstream. The *features structure is filled
// with information gathered from the bitstream.
Oct 16, 2018
Oct 16, 2018
424
425
426
// Returns VP8_STATUS_OK when the features are successfully retrieved. Returns
// VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the
// features from headers. Returns error in other cases.
Jan 3, 2012
Jan 3, 2012
427
static WEBP_INLINE VP8StatusCode WebPGetFeatures(
Oct 16, 2018
Oct 16, 2018
428
429
const uint8_t* data, size_t data_size,
WebPBitstreamFeatures* features) {
Jan 3, 2012
Jan 3, 2012
430
431
432
433
434
return WebPGetFeaturesInternal(data, data_size, features,
WEBP_DECODER_ABI_VERSION);
}
// Decoding options
Oct 16, 2018
Oct 16, 2018
435
struct WebPDecoderOptions {
Jan 3, 2012
Jan 3, 2012
436
437
438
439
440
441
442
443
444
int bypass_filtering; // if true, skip the in-loop filtering
int no_fancy_upsampling; // if true, use faster pointwise upsampler
int use_cropping; // if true, cropping is applied _first_
int crop_left, crop_top; // top-left position for cropping.
// Will be snapped to even values.
int crop_width, crop_height; // dimension of the cropping area
int use_scaling; // if true, scaling is applied _afterward_
int scaled_width, scaled_height; // final resolution
int use_threads; // if true, use multi-threaded decoding
Oct 16, 2018
Oct 16, 2018
445
446
447
448
449
450
int dithering_strength; // dithering strength (0=Off, 100=full)
int flip; // flip output vertically
int alpha_dithering_strength; // alpha dithering strength in [0..100]
uint32_t pad[5]; // padding for later use
};
Jan 3, 2012
Jan 3, 2012
451
452
// Main object storing the configuration for advanced decoding.
Oct 16, 2018
Oct 16, 2018
453
struct WebPDecoderConfig {
Jan 3, 2012
Jan 3, 2012
454
455
456
WebPBitstreamFeatures input; // Immutable bitstream features (optional)
WebPDecBuffer output; // Output buffer (can point to external mem)
WebPDecoderOptions options; // Decoding options
Oct 16, 2018
Oct 16, 2018
457
};
Jan 3, 2012
Jan 3, 2012
458
459
// Internal, version-checked, entry point
Oct 16, 2018
Oct 16, 2018
460
WEBP_EXTERN(int) WebPInitDecoderConfigInternal(WebPDecoderConfig*, int);
Jan 3, 2012
Jan 3, 2012
461
462
463
464
// Initialize the configuration as empty. This function must always be
// called first, unless WebPGetFeatures() is to be called.
// Returns false in case of mismatched version.
Oct 16, 2018
Oct 16, 2018
465
static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
Jan 3, 2012
Jan 3, 2012
466
467
468
return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION);
}
Oct 16, 2018
Oct 16, 2018
469
470
471
472
473
474
475
476
// Instantiate a new incremental decoder object with the requested
// configuration. The bitstream can be passed using 'data' and 'data_size'
// parameter, in which case the features will be parsed and stored into
// config->input. Otherwise, 'data' can be NULL and no parsing will occur.
// Note that 'config' can be NULL too, in which case a default configuration
// is used. If 'config' is not NULL, it must outlive the WebPIDecoder object
// as some references to its fields will be used. No internal copy of 'config'
// is made.
Jan 3, 2012
Jan 3, 2012
477
478
// The return WebPIDecoder object must always be deleted calling WebPIDelete().
// Returns NULL in case of error (and config->status will then reflect
Oct 16, 2018
Oct 16, 2018
479
480
481
// the error condition, if available).
WEBP_EXTERN(WebPIDecoder*) WebPIDecode(const uint8_t* data, size_t data_size,
WebPDecoderConfig* config);
Jan 3, 2012
Jan 3, 2012
482
483
// Non-incremental version. This version decodes the full data at once, taking
Oct 16, 2018
Oct 16, 2018
484
485
486
487
// 'config' into account. Returns decoding status (which should be VP8_STATUS_OK
// if the decoding was successful). Note that 'config' cannot be NULL.
WEBP_EXTERN(VP8StatusCode) WebPDecode(const uint8_t* data, size_t data_size,
WebPDecoderConfig* config);
Jan 3, 2012
Jan 3, 2012
488
Oct 16, 2018
Oct 16, 2018
489
#ifdef __cplusplus
Jan 3, 2012
Jan 3, 2012
490
491
492
493
} // extern "C"
#endif
#endif /* WEBP_WEBP_DECODE_H_ */