1          __   __  ____  ____  ____
2         /  \\/  \/  _ \/  _ )/  _ \
3         \       /   __/  _  \   __/
4          \__\__/\____/\_____/__/ ____  ___
5                / _/ /    \    \ /  _ \/ _/
6               /  \_/   / /   \ \   __/  \__
7               \____/____/\_____/_____/____/v1.0.2
8
9Description:
10============
11
12WebP codec: library to encode and decode images in WebP format. This package
13contains the library that can be used in other programs to add WebP support,
14as well as the command line tools 'cwebp' and 'dwebp'.
15
16See http://developers.google.com/speed/webp
17
18The latest source tree is available at
19https://chromium.googlesource.com/webm/libwebp
20
21It is released under the same license as the WebM project.
22See http://www.webmproject.org/license/software/ or the
23"COPYING" file for details. An additional intellectual
24property rights grant can be found in the file PATENTS.
25
26Building:
27=========
28
29Windows build:
30--------------
31
32By running:
33
34  nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output
35
36the directory output\release-static\(x64|x86)\bin will contain the tools
37cwebp.exe and dwebp.exe. The directory output\release-static\(x64|x86)\lib will
38contain the libwebp static library.
39The target architecture (x86/x64) is detected by Makefile.vc from the Visual
40Studio compiler (cl.exe) available in the system path.
41
42Unix build using makefile.unix:
43-------------------------------
44
45On platforms with GNU tools installed (gcc and make), running
46
47  make -f makefile.unix
48
49will build the binaries examples/cwebp and examples/dwebp, along
50with the static library src/libwebp.a. No system-wide installation
51is supplied, as this is a simple alternative to the full installation
52system based on the autoconf tools (see below).
53Please refer to makefile.unix for additional details and customizations.
54
55Using autoconf tools:
56---------------------
57Prerequisites:
58A compiler (e.g., gcc), make, autoconf, automake, libtool.
59On a Debian-like system the following should install everything you need for a
60minimal build:
61$ sudo apt-get install gcc make autoconf automake libtool
62
63When building from git sources, you will need to run autogen.sh to generate the
64configure script.
65
66./configure
67make
68make install
69
70should be all you need to have the following files
71
72/usr/local/include/webp/decode.h
73/usr/local/include/webp/encode.h
74/usr/local/include/webp/types.h
75/usr/local/lib/libwebp.*
76/usr/local/bin/cwebp
77/usr/local/bin/dwebp
78
79installed.
80
81Note: A decode-only library, libwebpdecoder, is available using the
82'--enable-libwebpdecoder' flag. The encode library is built separately and can
83be installed independently using a minor modification in the corresponding
84Makefile.am configure files (see comments there). See './configure --help' for
85more options.
86
87Building for MIPS Linux:
88------------------------
89MIPS Linux toolchain stable available releases can be found at:
90https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/
91
92# Add toolchain to PATH
93export PATH=$PATH:/path/to/toolchain/bin
94
95# 32-bit build for mips32r5 (p5600)
96HOST=mips-mti-linux-gnu
97MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64 \
98  -msched-weight -mload-store-pairs -fPIE"
99MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie"
100
101# 64-bit build for mips64r6 (i6400)
102HOST=mips-img-linux-gnu
103MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64 \
104  -msched-weight -mload-store-pairs -fPIE"
105MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie"
106
107./configure --host=${HOST} --build=`config.guess` \
108  CC="${HOST}-gcc -EL" \
109  CFLAGS="$MIPS_CFLAGS" \
110  LDFLAGS="$MIPS_LDFLAGS"
111make
112make install
113
114CMake:
115------
116With CMake, you can compile libwebp, cwebp, dwebp, gif2web, img2webp, webpinfo
117and the JS bindings.
118
119Prerequisites:
120A compiler (e.g., gcc with autotools) and CMake.
121On a Debian-like system the following should install everything you need for a
122minimal build:
123$ sudo apt-get install build-essential cmake
124
125When building from git sources, you will need to run cmake to generate the
126makefiles.
127
128mkdir build && cd build && cmake ../
129make
130make install
131
132If you also want any of the executables, you will need to enable them through
133CMake, e.g.:
134
135cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../
136
137or through your favorite interface (like ccmake or cmake-qt-gui).
138
139Use option -DWEBP_UNICODE=ON for Unicode support on Windows (with chcp 65001).
140
141Finally, once installed, you can also use WebP in your CMake project by doing:
142
143find_package(WebP)
144
145which will define the CMake variables WebP_INCLUDE_DIRS and WebP_LIBRARIES.
146
147Gradle:
148-------
149The support for Gradle is minimal: it only helps you compile libwebp, cwebp and
150dwebp and webpmux_example.
151
152Prerequisites:
153A compiler (e.g., gcc with autotools) and gradle.
154On a Debian-like system the following should install everything you need for a
155minimal build:
156$ sudo apt-get install build-essential gradle
157
158When building from git sources, you will need to run the Gradle wrapper with the
159appropriate target, e.g. :
160
161./gradlew buildAllExecutables
162
163SWIG bindings:
164--------------
165
166To generate language bindings from swig/libwebp.swig at least swig-1.3
167(http://www.swig.org) is required.
168
169Currently the following functions are mapped:
170Decode:
171  WebPGetDecoderVersion
172  WebPGetInfo
173  WebPDecodeRGBA
174  WebPDecodeARGB
175  WebPDecodeBGRA
176  WebPDecodeBGR
177  WebPDecodeRGB
178
179Encode:
180  WebPGetEncoderVersion
181  WebPEncodeRGBA
182  WebPEncodeBGRA
183  WebPEncodeRGB
184  WebPEncodeBGR
185  WebPEncodeLosslessRGBA
186  WebPEncodeLosslessBGRA
187  WebPEncodeLosslessRGB
188  WebPEncodeLosslessBGR
189
190See swig/README for more detailed build instructions.
191
192Java bindings:
193
194To build the swig-generated JNI wrapper code at least JDK-1.5 (or equivalent)
195is necessary for enum support. The output is intended to be a shared object /
196DLL that can be loaded via System.loadLibrary("webp_jni").
197
198Python bindings:
199
200To build the swig-generated Python extension code at least Python 2.6 is
201required. Python < 2.6 may build with some minor changes to libwebp.swig or the
202generated code, but is untested.
203
204Encoding tool:
205==============
206
207The examples/ directory contains tools for encoding (cwebp) and
208decoding (dwebp) images.
209
210The easiest use should look like:
211  cwebp input.png -q 80 -o output.webp
212which will convert the input file to a WebP file using a quality factor of 80
213on a 0->100 scale (0 being the lowest quality, 100 being the best. Default
214value is 75).
215You might want to try the -lossless flag too, which will compress the source
216(in RGBA format) without any loss. The -q quality parameter will in this case
217control the amount of processing time spent trying to make the output file as
218small as possible.
219
220A longer list of options is available using the -longhelp command line flag:
221
222> cwebp -longhelp
223Usage:
224 cwebp [-preset <...>] [options] in_file [-o out_file]
225
226If input size (-s) for an image is not specified, it is
227assumed to be a PNG, JPEG, TIFF or WebP file.
228
229Options:
230  -h / -help ............. short help
231  -H / -longhelp ......... long help
232  -q <float> ............. quality factor (0:small..100:big), default=75
233  -alpha_q <int> ......... transparency-compression quality (0..100),
234                           default=100
235  -preset <string> ....... preset setting, one of:
236                            default, photo, picture,
237                            drawing, icon, text
238     -preset must come first, as it overwrites other parameters
239  -z <int> ............... activates lossless preset with given
240                           level in [0:fast, ..., 9:slowest]
241
242  -m <int> ............... compression method (0=fast, 6=slowest), default=4
243  -segments <int> ........ number of segments to use (1..4), default=4
244  -size <int> ............ target size (in bytes)
245  -psnr <float> .......... target PSNR (in dB. typically: 42)
246
247  -s <int> <int> ......... input size (width x height) for YUV
248  -sns <int> ............. spatial noise shaping (0:off, 100:max), default=50
249  -f <int> ............... filter strength (0=off..100), default=60
250  -sharpness <int> ....... filter sharpness (0:most .. 7:least sharp), default=0
251  -strong ................ use strong filter instead of simple (default)
252  -nostrong .............. use simple filter instead of strong
253  -sharp_yuv ............. use sharper (and slower) RGB->YUV conversion
254  -partition_limit <int> . limit quality to fit the 512k limit on
255                           the first partition (0=no degradation ... 100=full)
256  -pass <int> ............ analysis pass number (1..10)
257  -crop <x> <y> <w> <h> .. crop picture with the given rectangle
258  -resize <w> <h> ........ resize picture (after any cropping)
259  -mt .................... use multi-threading if available
260  -low_memory ............ reduce memory usage (slower encoding)
261  -map <int> ............. print map of extra info
262  -print_psnr ............ prints averaged PSNR distortion
263  -print_ssim ............ prints averaged SSIM distortion
264  -print_lsim ............ prints local-similarity distortion
265  -d <file.pgm> .......... dump the compressed output (PGM file)
266  -alpha_method <int> .... transparency-compression method (0..1), default=1
267  -alpha_filter <string> . predictive filtering for alpha plane,
268                           one of: none, fast (default) or best
269  -exact ................. preserve RGB values in transparent area, default=off
270  -blend_alpha <hex> ..... blend colors against background color
271                           expressed as RGB values written in
272                           hexadecimal, e.g. 0xc0e0d0 for red=0xc0
273                           green=0xe0 and blue=0xd0
274  -noalpha ............... discard any transparency information
275  -lossless .............. encode image losslessly, default=off
276  -near_lossless <int> ... use near-lossless image
277                           preprocessing (0..100=off), default=100
278  -hint <string> ......... specify image characteristics hint,
279                           one of: photo, picture or graph
280
281  -metadata <string> ..... comma separated list of metadata to
282                           copy from the input to the output if present.
283                           Valid values: all, none (default), exif, icc, xmp
284
285  -short ................. condense printed message
286  -quiet ................. don't print anything
287  -version ............... print version number and exit
288  -noasm ................. disable all assembly optimizations
289  -v ..................... verbose, e.g. print encoding/decoding times
290  -progress .............. report encoding progress
291
292Experimental Options:
293  -jpeg_like ............. roughly match expected JPEG size
294  -af .................... auto-adjust filter strength
295  -pre <int> ............. pre-processing filter
296
297The main options you might want to try in order to further tune the
298visual quality are:
299 -preset
300 -sns
301 -f
302 -m
303
304Namely:
305  * 'preset' will set up a default encoding configuration targeting a
306     particular type of input. It should appear first in the list of options,
307     so that subsequent options can take effect on top of this preset.
308     Default value is 'default'.
309  * 'sns' will progressively turn on (when going from 0 to 100) some additional
310     visual optimizations (like: segmentation map re-enforcement). This option
311     will balance the bit allocation differently. It tries to take bits from the
312     "easy" parts of the picture and use them in the "difficult" ones instead.
313     Usually, raising the sns value (at fixed -q value) leads to larger files,
314     but with better quality.
315     Typical value is around '75'.
316  * 'f' option directly links to the filtering strength used by the codec's
317     in-loop processing. The higher the value, the smoother the
318     highly-compressed area will look. This is particularly useful when aiming
319     at very small files. Typical values are around 20-30. Note that using the
320     option -strong/-nostrong will change the type of filtering. Use "-f 0" to
321     turn filtering off.
322  * 'm' controls the trade-off between encoding speed and quality. Default is 4.
323     You can try -m 5 or -m 6 to explore more (time-consuming) encoding
324     possibilities. A lower value will result in faster encoding at the expense
325     of quality.
326
327Decoding tool:
328==============
329
330There is a decoding sample in examples/dwebp.c which will take
331a .webp file and decode it to a PNG image file (amongst other formats).
332This is simply to demonstrate the use of the API. You can verify the
333file test.webp decodes to exactly the same as test_ref.ppm by using:
334
335 cd examples
336 ./dwebp test.webp -ppm -o test.ppm
337 diff test.ppm test_ref.ppm
338
339The full list of options is available using -h:
340
341> dwebp -h
342Usage: dwebp in_file [options] [-o out_file]
343
344Decodes the WebP image file to PNG format [Default]
345Use following options to convert into alternate image formats:
346  -pam ......... save the raw RGBA samples as a color PAM
347  -ppm ......... save the raw RGB samples as a color PPM
348  -bmp ......... save as uncompressed BMP format
349  -tiff ........ save as uncompressed TIFF format
350  -pgm ......... save the raw YUV samples as a grayscale PGM
351                 file with IMC4 layout
352  -yuv ......... save the raw YUV samples in flat layout
353
354 Other options are:
355  -version ..... print version number and exit
356  -nofancy ..... don't use the fancy YUV420 upscaler
357  -nofilter .... disable in-loop filtering
358  -nodither .... disable dithering
359  -dither <d> .. dithering strength (in 0..100)
360  -alpha_dither  use alpha-plane dithering if needed
361  -mt .......... use multi-threading
362  -crop <x> <y> <w> <h> ... crop output with the given rectangle
363  -resize <w> <h> ......... scale the output (*after* any cropping)
364  -flip ........ flip the output vertically
365  -alpha ....... only save the alpha plane
366  -incremental . use incremental decoding (useful for tests)
367  -h ........... this help message
368  -v ........... verbose (e.g. print encoding/decoding times)
369  -quiet ....... quiet mode, don't print anything
370  -noasm ....... disable all assembly optimizations
371
372WebP file analysis tool:
373========================
374
375'webpinfo' can be used to print out the chunk level structure and bitstream
376header information of WebP files. It can also check if the files are of valid
377WebP format.
378
379Usage: webpinfo [options] in_files
380Note: there could be multiple input files;
381      options must come before input files.
382Options:
383  -version ........... Print version number and exit.
384  -quiet ............. Do not show chunk parsing information.
385  -diag .............. Show parsing error diagnosis.
386  -summary ........... Show chunk stats summary.
387  -bitstream_info .... Parse bitstream header.
388
389Visualization tool:
390===================
391
392There's a little self-serve visualization tool called 'vwebp' under the
393examples/ directory. It uses OpenGL to open a simple drawing window and show
394a decoded WebP file. It's not yet integrated in the automake build system, but
395you can try to manually compile it using the recommendations below.
396
397Usage: vwebp in_file [options]
398
399Decodes the WebP image file and visualize it using OpenGL
400Options are:
401  -version ..... print version number and exit
402  -noicc ....... don't use the icc profile if present
403  -nofancy ..... don't use the fancy YUV420 upscaler
404  -nofilter .... disable in-loop filtering
405  -dither <int>  dithering strength (0..100), default=50
406  -noalphadither disable alpha plane dithering
407  -usebgcolor .. display background color
408  -mt .......... use multi-threading
409  -info ........ print info
410  -h ........... this help message
411
412Keyboard shortcuts:
413  'c' ................ toggle use of color profile
414  'b' ................ toggle background color display
415  'i' ................ overlay file information
416  'd' ................ disable blending & disposal (debug)
417  'q' / 'Q' / ESC .... quit
418
419Building:
420---------
421
422Prerequisites:
4231) OpenGL & OpenGL Utility Toolkit (GLUT)
424  Linux:
425    $ sudo apt-get install freeglut3-dev mesa-common-dev
426  Mac + XCode:
427    - These libraries should be available in the OpenGL / GLUT frameworks.
428  Windows:
429    http://freeglut.sourceforge.net/index.php#download
430
4312) (Optional) qcms (Quick Color Management System)
432  i. Download qcms from Mozilla / Chromium:
433    http://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
434    http://src.chromium.org/viewvc/chrome/trunk/src/third_party/qcms
435  ii. Build and archive the source files as libqcms.a / qcms.lib
436  iii. Update makefile.unix / Makefile.vc
437    a) Define WEBP_HAVE_QCMS
438    b) Update include / library paths to reference the qcms directory.
439
440Build using makefile.unix / Makefile.vc:
441$ make -f makefile.unix examples/vwebp
442> nmake /f Makefile.vc CFG=release-static \
443    ../obj/x64/release-static/bin/vwebp.exe
444
445Animation creation tool:
446========================
447The utility 'img2webp' can turn a sequence of input images (PNG, JPEG, ...)
448into an animated WebP file. It offers fine control over duration, encoding
449modes, etc.
450
451Usage:
452
453  img2webp [file-level options] [image files...] [per-frame options...]
454
455File-level options (only used at the start of compression):
456 -min_size ............ minimize size
457 -loop <int> .......... loop count (default: 0, = infinite loop)
458 -kmax <int> .......... maximum number of frame between key-frames
459                        (0=only keyframes)
460 -kmin <int> .......... minimum number of frame between key-frames
461                        (0=disable key-frames altogether)
462 -mixed ............... use mixed lossy/lossless automatic mode
463 -v ................... verbose mode
464 -h ................... this help
465 -version ............. print version number and exit
466
467Per-frame options (only used for subsequent images input):
468 -d <int> ............. frame duration in ms (default: 100)
469 -lossless  ........... use lossless mode (default)
470 -lossy ... ........... use lossy mode
471 -q <float> ........... quality
472 -m <int> ............. method to use
473
474example: img2webp -loop 2 in0.png -lossy in1.jpg
475                  -d 80 in2.tiff -o out.webp
476
477Note: if a single file name is passed as the argument, the arguments will be
478tokenized from this file. The file name must not start with the character '-'.
479
480Animated GIF conversion:
481========================
482Animated GIF files can be converted to WebP files with animation using the
483gif2webp utility available under examples/. The files can then be viewed using
484vwebp.
485
486Usage:
487 gif2webp [options] gif_file -o webp_file
488Options:
489  -h / -help ............. this help
490  -lossy ................. encode image using lossy compression
491  -mixed ................. for each frame in the image, pick lossy
492                           or lossless compression heuristically
493  -q <float> ............. quality factor (0:small..100:big)
494  -m <int> ............... compression method (0=fast, 6=slowest)
495  -min_size .............. minimize output size (default:off)
496                           lossless compression by default; can be
497                           combined with -q, -m, -lossy or -mixed
498                           options
499  -kmin <int> ............ min distance between key frames
500  -kmax <int> ............ max distance between key frames
501  -f <int> ............... filter strength (0=off..100)
502  -metadata <string> ..... comma separated list of metadata to
503                           copy from the input to the output if present
504                           Valid values: all, none, icc, xmp (default)
505  -loop_compatibility .... use compatibility mode for Chrome
506                           version prior to M62 (inclusive)
507  -mt .................... use multi-threading if available
508
509  -version ............... print version number and exit
510  -v ..................... verbose
511  -quiet ................. don't print anything
512
513Building:
514---------
515With the libgif development files installed, gif2webp can be built using
516makefile.unix:
517$ make -f makefile.unix examples/gif2webp
518
519or using autoconf:
520$ ./configure --enable-everything
521$ make
522
523Comparison of animated images:
524==============================
525Test utility anim_diff under examples/ can be used to compare two animated
526images (each can be GIF or WebP).
527
528Usage: anim_diff <image1> <image2> [options]
529
530Options:
531  -dump_frames <folder> dump decoded frames in PAM format
532  -min_psnr <float> ... minimum per-frame PSNR
533  -raw_comparison ..... if this flag is not used, RGB is
534                        premultiplied before comparison
535  -max_diff <int> ..... maximum allowed difference per channel
536                        between corresponding pixels in subsequent
537                        frames
538  -h .................. this help
539  -version ............ print version number and exit
540
541Building:
542---------
543With the libgif development files and a C++ compiler installed, anim_diff can
544be built using makefile.unix:
545$ make -f makefile.unix examples/anim_diff
546
547or using autoconf:
548$ ./configure --enable-everything
549$ make
550
551Encoding API:
552=============
553
554The main encoding functions are available in the header src/webp/encode.h
555The ready-to-use ones are:
556size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride,
557                     float quality_factor, uint8_t** output);
558size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride,
559                     float quality_factor, uint8_t** output);
560size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride,
561                      float quality_factor, uint8_t** output);
562size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride,
563                      float quality_factor, uint8_t** output);
564
565They will convert raw RGB samples to a WebP data. The only control supplied
566is the quality factor.
567
568There are some variants for using the lossless format:
569
570size_t WebPEncodeLosslessRGB(const uint8_t* rgb, int width, int height,
571                             int stride, uint8_t** output);
572size_t WebPEncodeLosslessBGR(const uint8_t* bgr, int width, int height,
573                             int stride, uint8_t** output);
574size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, int width, int height,
575                              int stride, uint8_t** output);
576size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, int width, int height,
577                              int stride, uint8_t** output);
578
579Of course in this case, no quality factor is needed since the compression
580occurs without loss of the input values, at the expense of larger output sizes.
581
582Advanced encoding API:
583----------------------
584
585A more advanced API is based on the WebPConfig and WebPPicture structures.
586
587WebPConfig contains the encoding settings and is not tied to a particular
588picture.
589WebPPicture contains input data, on which some WebPConfig will be used for
590compression.
591The encoding flow looks like:
592
593-------------------------------------- BEGIN PSEUDO EXAMPLE
594
595#include <webp/encode.h>
596
597  // Setup a config, starting form a preset and tuning some additional
598  // parameters
599  WebPConfig config;
600  if (!WebPConfigPreset(&config, WEBP_PRESET_PHOTO, quality_factor))
601    return 0;   // version error
602  }
603  // ... additional tuning
604  config.sns_strength = 90;
605  config.filter_sharpness = 6;
606  config_error = WebPValidateConfig(&config);  // not mandatory, but useful
607
608  // Setup the input data
609  WebPPicture pic;
610  if (!WebPPictureInit(&pic)) {
611    return 0;  // version error
612  }
613  pic.width = width;
614  pic.height = height;
615  // allocated picture of dimension width x height
616  if (!WebPPictureAllocate(&pic)) {
617    return 0;   // memory error
618  }
619  // at this point, 'pic' has been initialized as a container,
620  // and can receive the Y/U/V samples.
621  // Alternatively, one could use ready-made import functions like
622  // WebPPictureImportRGB(), which will take care of memory allocation.
623  // In any case, past this point, one will have to call
624  // WebPPictureFree(&pic) to reclaim memory.
625
626  // Set up a byte-output write method. WebPMemoryWriter, for instance.
627  WebPMemoryWriter wrt;
628  WebPMemoryWriterInit(&wrt);     // initialize 'wrt'
629
630  pic.writer = MyFileWriter;
631  pic.custom_ptr = my_opaque_structure_to_make_MyFileWriter_work;
632
633  // Compress!
634  int ok = WebPEncode(&config, &pic);   // ok = 0 => error occurred!
635  WebPPictureFree(&pic);  // must be called independently of the 'ok' result.
636
637  // output data should have been handled by the writer at that point.
638  // -> compressed data is the memory buffer described by wrt.mem / wrt.size
639
640  // deallocate the memory used by compressed data
641  WebPMemoryWriterClear(&wrt);
642
643-------------------------------------- END PSEUDO EXAMPLE
644
645Decoding API:
646=============
647
648This is mainly just one function to call:
649
650#include "webp/decode.h"
651uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size,
652                       int* width, int* height);
653
654Please have a look at the file src/webp/decode.h for the details.
655There are variants for decoding in BGR/RGBA/ARGB/BGRA order, along with
656decoding to raw Y'CbCr samples. One can also decode the image directly into a
657pre-allocated buffer.
658
659To detect a WebP file and gather the picture's dimensions, the function:
660  int WebPGetInfo(const uint8_t* data, size_t data_size,
661                  int* width, int* height);
662is supplied. No decoding is involved when using it.
663
664Incremental decoding API:
665=========================
666
667In the case when data is being progressively transmitted, pictures can still
668be incrementally decoded using a slightly more complicated API. Decoder state
669is stored into an instance of the WebPIDecoder object. This object can be
670created with the purpose of decoding either RGB or Y'CbCr samples.
671For instance:
672
673  WebPDecBuffer buffer;
674  WebPInitDecBuffer(&buffer);
675  buffer.colorspace = MODE_BGR;
676  ...
677  WebPIDecoder* idec = WebPINewDecoder(&buffer);
678
679As data is made progressively available, this incremental-decoder object
680can be used to decode the picture further. There are two (mutually exclusive)
681ways to pass freshly arrived data:
682
683either by appending the fresh bytes:
684
685  WebPIAppend(idec, fresh_data, size_of_fresh_data);
686
687or by just mentioning the new size of the transmitted data:
688
689  WebPIUpdate(idec, buffer, size_of_transmitted_buffer);
690
691Note that 'buffer' can be modified between each call to WebPIUpdate, in
692particular when the buffer is resized to accommodate larger data.
693
694These functions will return the decoding status: either VP8_STATUS_SUSPENDED if
695decoding is not finished yet or VP8_STATUS_OK when decoding is done. Any other
696status is an error condition.
697
698The 'idec' object must always be released (even upon an error condition) by
699calling: WebPDelete(idec).
700
701To retrieve partially decoded picture samples, one must use the corresponding
702method: WebPIDecGetRGB or WebPIDecGetYUVA.
703It will return the last displayable pixel row.
704
705Lastly, note that decoding can also be performed into a pre-allocated pixel
706buffer. This buffer must be passed when creating a WebPIDecoder, calling
707WebPINewRGB() or WebPINewYUVA().
708
709Please have a look at the src/webp/decode.h header for further details.
710
711Advanced Decoding API:
712======================
713
714WebP decoding supports an advanced API which provides on-the-fly cropping and
715rescaling, something of great usefulness on memory-constrained environments like
716mobile phones. Basically, the memory usage will scale with the output's size,
717not the input's, when one only needs a quick preview or a zoomed in portion of
718an otherwise too-large picture. Some CPU can be saved too, incidentally.
719
720-------------------------------------- BEGIN PSEUDO EXAMPLE
721     // A) Init a configuration object
722     WebPDecoderConfig config;
723     CHECK(WebPInitDecoderConfig(&config));
724
725     // B) optional: retrieve the bitstream's features.
726     CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
727
728     // C) Adjust 'config' options, if needed
729     config.options.no_fancy_upsampling = 1;
730     config.options.use_scaling = 1;
731     config.options.scaled_width = scaledWidth();
732     config.options.scaled_height = scaledHeight();
733     // etc.
734
735     // D) Specify 'config' output options for specifying output colorspace.
736     // Optionally the external image decode buffer can also be specified.
737     config.output.colorspace = MODE_BGRA;
738     // Optionally, the config.output can be pointed to an external buffer as
739     // well for decoding the image. This externally supplied memory buffer
740     // should be big enough to store the decoded picture.
741     config.output.u.RGBA.rgba = (uint8_t*) memory_buffer;
742     config.output.u.RGBA.stride = scanline_stride;
743     config.output.u.RGBA.size = total_size_of_the_memory_buffer;
744     config.output.is_external_memory = 1;
745
746     // E) Decode the WebP image. There are two variants w.r.t decoding image.
747     // The first one (E.1) decodes the full image and the second one (E.2) is
748     // used to incrementally decode the image using small input buffers.
749     // Any one of these steps can be used to decode the WebP image.
750
751     // E.1) Decode full image.
752     CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);
753
754     // E.2) Decode image incrementally.
755     WebPIDecoder* const idec = WebPIDecode(NULL, NULL, &config);
756     CHECK(idec != NULL);
757     while (bytes_remaining > 0) {
758       VP8StatusCode status = WebPIAppend(idec, input, bytes_read);
759       if (status == VP8_STATUS_OK || status == VP8_STATUS_SUSPENDED) {
760         bytes_remaining -= bytes_read;
761       } else {
762         break;
763       }
764     }
765     WebPIDelete(idec);
766
767     // F) Decoded image is now in config.output (and config.output.u.RGBA).
768     // It can be saved, displayed or otherwise processed.
769
770     // G) Reclaim memory allocated in config's object. It's safe to call
771     // this function even if the memory is external and wasn't allocated
772     // by WebPDecode().
773     WebPFreeDecBuffer(&config.output);
774
775-------------------------------------- END PSEUDO EXAMPLE
776
777Bugs:
778=====
779
780Please report all bugs to the issue tracker:
781    https://bugs.chromium.org/p/webp
782Patches welcome! See this page to get started:
783    http://www.webmproject.org/code/contribute/submitting-patches/
784
785Discuss:
786========
787
788Email: webp-discuss@webmproject.org
789Web: http://groups.google.com/a/webmproject.org/group/webp-discuss
790