|
Packit |
9c6abc |
__ __ ____ ____ ____ __ __ _ __ __
|
|
Packit |
9c6abc |
/ \\/ \/ _ \/ _ \/ _ \/ \ \/ \___/_ / _\
|
|
Packit |
9c6abc |
\ / __/ _ \ __/ / / (_/ /__
|
|
Packit |
9c6abc |
\__\__/\_____/_____/__/ \__//_/\_____/__/___/v1.0.0
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Description:
|
|
Packit |
9c6abc |
============
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
WebPMux: set of two libraries 'Mux' and 'Demux' for creation, extraction and
|
|
Packit |
9c6abc |
manipulation of an extended format WebP file, which can have features like
|
|
Packit |
9c6abc |
color profile, metadata and animation. Reference command-line tools 'webpmux'
|
|
Packit |
9c6abc |
and 'vwebp' as well as the WebP container specification
|
|
Packit |
9c6abc |
'doc/webp-container-spec.txt' are also provided in this package.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
WebP Mux tool:
|
|
Packit |
9c6abc |
==============
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
The examples/ directory contains a tool (webpmux) for manipulating WebP
|
|
Packit |
9c6abc |
files. The webpmux tool can be used to create an extended format WebP file and
|
|
Packit |
9c6abc |
also to extract or strip relevant data from such a file.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
A list of options is available using the -help command line flag:
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
> webpmux -help
|
|
Packit |
9c6abc |
Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT
|
|
Packit |
9c6abc |
webpmux -set SET_OPTIONS INPUT -o OUTPUT
|
|
Packit |
9c6abc |
webpmux -duration DURATION_OPTIONS [-duration ...]
|
|
Packit |
9c6abc |
INPUT -o OUTPUT
|
|
Packit |
9c6abc |
webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
|
|
Packit |
9c6abc |
webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT]
|
|
Packit |
9c6abc |
[-bgcolor BACKGROUND_COLOR] -o OUTPUT
|
|
Packit |
9c6abc |
webpmux -info INPUT
|
|
Packit |
9c6abc |
webpmux [-h|-help]
|
|
Packit |
9c6abc |
webpmux -version
|
|
Packit |
9c6abc |
webpmux argument_file_name
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
GET_OPTIONS:
|
|
Packit |
9c6abc |
Extract relevant data:
|
|
Packit |
9c6abc |
icc get ICC profile
|
|
Packit |
9c6abc |
exif get EXIF metadata
|
|
Packit |
9c6abc |
xmp get XMP metadata
|
|
Packit |
9c6abc |
frame n get nth frame
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
SET_OPTIONS:
|
|
Packit |
9c6abc |
Set color profile/metadata:
|
|
Packit |
9c6abc |
icc file.icc set ICC profile
|
|
Packit |
9c6abc |
exif file.exif set EXIF metadata
|
|
Packit |
9c6abc |
xmp file.xmp set XMP metadata
|
|
Packit |
9c6abc |
where: 'file.icc' contains the ICC profile to be set,
|
|
Packit |
9c6abc |
'file.exif' contains the EXIF metadata to be set
|
|
Packit |
9c6abc |
'file.xmp' contains the XMP metadata to be set
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
DURATION_OPTIONS:
|
|
Packit |
9c6abc |
Set duration of selected frames:
|
|
Packit |
9c6abc |
duration set duration for each frames
|
|
Packit |
9c6abc |
duration,frame set duration of a particular frame
|
|
Packit |
9c6abc |
duration,start,end set duration of frames in the
|
|
Packit |
9c6abc |
interval [start,end])
|
|
Packit |
9c6abc |
where: 'duration' is the duration in milliseconds
|
|
Packit |
9c6abc |
'start' is the start frame index
|
|
Packit |
9c6abc |
'end' is the inclusive end frame index
|
|
Packit |
9c6abc |
The special 'end' value '0' means: last frame.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
STRIP_OPTIONS:
|
|
Packit |
9c6abc |
Strip color profile/metadata:
|
|
Packit |
9c6abc |
icc strip ICC profile
|
|
Packit |
9c6abc |
exif strip EXIF metadata
|
|
Packit |
9c6abc |
xmp strip XMP metadata
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
FRAME_OPTIONS(i):
|
|
Packit |
9c6abc |
Create animation:
|
|
Packit |
9c6abc |
file_i +di+[xi+yi[+mi[bi]]]
|
|
Packit |
9c6abc |
where: 'file_i' is the i'th animation frame (WebP format),
|
|
Packit |
9c6abc |
'di' is the pause duration before next frame,
|
|
Packit |
9c6abc |
'xi','yi' specify the image offset for this frame,
|
|
Packit |
9c6abc |
'mi' is the dispose method for this frame (0 or 1),
|
|
Packit |
9c6abc |
'bi' is the blending method for this frame (+b or -b)
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
LOOP_COUNT:
|
|
Packit |
9c6abc |
Number of times to repeat the animation.
|
|
Packit |
9c6abc |
Valid range is 0 to 65535 [Default: 0 (infinite)].
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
BACKGROUND_COLOR:
|
|
Packit |
9c6abc |
Background color of the canvas.
|
|
Packit |
9c6abc |
A,R,G,B
|
|
Packit |
9c6abc |
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying
|
|
Packit |
9c6abc |
the Alpha, Red, Green and Blue component values respectively
|
|
Packit |
9c6abc |
[Default: 255,255,255,255]
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
INPUT & OUTPUT are in WebP format.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Note: The nature of EXIF, XMP and ICC data is not checked and is assumed to be
|
|
Packit |
9c6abc |
valid.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Note: if a single file name is passed as the argument, the arguments will be
|
|
Packit |
9c6abc |
tokenized from this file. The file name must not start with the character '-'.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Visualization tool:
|
|
Packit |
9c6abc |
===================
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
The examples/ directory also contains a tool (vwebp) for viewing WebP files.
|
|
Packit |
9c6abc |
It decodes the image and visualizes it using OpenGL. See the libwebp README
|
|
Packit |
9c6abc |
for details on building and running this program.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Mux API:
|
|
Packit |
9c6abc |
========
|
|
Packit |
9c6abc |
The Mux API contains methods for adding data to and reading data from WebP
|
|
Packit |
9c6abc |
files. This API currently supports XMP/EXIF metadata, ICC profile and animation.
|
|
Packit |
9c6abc |
Other features may be added in subsequent releases.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Example#1 (pseudo code): Creating a WebPMux object with image data, color
|
|
Packit |
9c6abc |
profile and XMP metadata.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
int copy_data = 0;
|
|
Packit |
9c6abc |
WebPMux* mux = WebPMuxNew();
|
|
Packit |
9c6abc |
// ... (Prepare image data).
|
|
Packit |
9c6abc |
WebPMuxSetImage(mux, &image, copy_data);
|
|
Packit |
9c6abc |
// ... (Prepare ICC profile data).
|
|
Packit |
9c6abc |
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
|
|
Packit |
9c6abc |
// ... (Prepare XMP metadata).
|
|
Packit |
9c6abc |
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
|
|
Packit |
9c6abc |
// Get data from mux in WebP RIFF format.
|
|
Packit |
9c6abc |
WebPMuxAssemble(mux, &output_data);
|
|
Packit |
9c6abc |
WebPMuxDelete(mux);
|
|
Packit |
9c6abc |
// ... (Consume output_data; e.g. write output_data.bytes to file).
|
|
Packit |
9c6abc |
WebPDataClear(&output_data);
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Example#2 (pseudo code): Get image and color profile data from a WebP file.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
int copy_data = 0;
|
|
Packit |
9c6abc |
// ... (Read data from file).
|
|
Packit |
9c6abc |
WebPMux* mux = WebPMuxCreate(&data, copy_data);
|
|
Packit |
9c6abc |
WebPMuxGetFrame(mux, 1, &image);
|
|
Packit |
9c6abc |
// ... (Consume image; e.g. call WebPDecode() to decode the data).
|
|
Packit |
9c6abc |
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
|
|
Packit |
9c6abc |
// ... (Consume icc_profile).
|
|
Packit |
9c6abc |
WebPMuxDelete(mux);
|
|
Packit |
9c6abc |
free(data);
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
For a detailed Mux API reference, please refer to the header file
|
|
Packit |
9c6abc |
(src/webp/mux.h).
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Demux API:
|
|
Packit |
9c6abc |
==========
|
|
Packit |
9c6abc |
The Demux API enables extraction of images and extended format data from
|
|
Packit |
9c6abc |
WebP files. This API currently supports reading of XMP/EXIF metadata, ICC
|
|
Packit |
9c6abc |
profile and animated images. Other features may be added in subsequent
|
|
Packit |
9c6abc |
releases.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Code example: Demuxing WebP data to extract all the frames, ICC profile
|
|
Packit |
9c6abc |
and EXIF/XMP metadata.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
WebPDemuxer* demux = WebPDemux(&webp_data);
|
|
Packit |
9c6abc |
uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
|
|
Packit |
9c6abc |
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
|
|
Packit |
9c6abc |
// ... (Get information about the features present in the WebP file).
|
|
Packit |
9c6abc |
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
// ... (Iterate over all frames).
|
|
Packit |
9c6abc |
WebPIterator iter;
|
|
Packit |
9c6abc |
if (WebPDemuxGetFrame(demux, 1, &iter)) {
|
|
Packit |
9c6abc |
do {
|
|
Packit |
9c6abc |
// ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
|
|
Packit |
9c6abc |
// ... and get other frame properties like width, height, offsets etc.
|
|
Packit |
9c6abc |
// ... see 'struct WebPIterator' below for more info).
|
|
Packit |
9c6abc |
} while (WebPDemuxNextFrame(&iter));
|
|
Packit |
9c6abc |
WebPDemuxReleaseIterator(&iter);
|
|
Packit |
9c6abc |
}
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
// ... (Extract metadata).
|
|
Packit |
9c6abc |
WebPChunkIterator chunk_iter;
|
|
Packit |
9c6abc |
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
|
|
Packit |
9c6abc |
// ... (Consume the ICC profile in 'chunk_iter.chunk').
|
|
Packit |
9c6abc |
WebPDemuxReleaseChunkIterator(&chunk_iter);
|
|
Packit |
9c6abc |
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
|
|
Packit |
9c6abc |
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
|
|
Packit |
9c6abc |
WebPDemuxReleaseChunkIterator(&chunk_iter);
|
|
Packit |
9c6abc |
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
|
|
Packit |
9c6abc |
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
|
|
Packit |
9c6abc |
WebPDemuxReleaseChunkIterator(&chunk_iter);
|
|
Packit |
9c6abc |
WebPDemuxDelete(demux);
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
For a detailed Demux API reference, please refer to the header file
|
|
Packit |
9c6abc |
(src/webp/demux.h).
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
AnimEncoder API:
|
|
Packit |
9c6abc |
================
|
|
Packit |
9c6abc |
The AnimEncoder API can be used to create animated WebP images.
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Code example:
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
WebPAnimEncoderOptions enc_options;
|
|
Packit |
9c6abc |
WebPAnimEncoderOptionsInit(&enc_options);
|
|
Packit |
9c6abc |
// ... (Tune 'enc_options' as needed).
|
|
Packit |
9c6abc |
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
|
|
Packit |
9c6abc |
while(<there are more frames>) {
|
|
Packit |
9c6abc |
WebPConfig config;
|
|
Packit |
9c6abc |
WebPConfigInit(&config);
|
|
Packit |
9c6abc |
// ... (Tune 'config' as needed).
|
|
Packit |
9c6abc |
WebPAnimEncoderAdd(enc, frame, duration, &config);
|
|
Packit |
9c6abc |
}
|
|
Packit |
9c6abc |
WebPAnimEncoderAssemble(enc, webp_data);
|
|
Packit |
9c6abc |
WebPAnimEncoderDelete(enc);
|
|
Packit |
9c6abc |
// ... (Write the 'webp_data' to a file, or re-mux it further).
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
For a detailed AnimEncoder API reference, please refer to the header file
|
|
Packit |
9c6abc |
(src/webp/mux.h).
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Bugs:
|
|
Packit |
9c6abc |
=====
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Please report all bugs to the issue tracker:
|
|
Packit |
9c6abc |
https://bugs.chromium.org/p/webp
|
|
Packit |
9c6abc |
Patches welcome! See this page to get started:
|
|
Packit |
9c6abc |
http://www.webmproject.org/code/contribute/submitting-patches/
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Discuss:
|
|
Packit |
9c6abc |
========
|
|
Packit |
9c6abc |
|
|
Packit |
9c6abc |
Email: webp-discuss@webmproject.org
|
|
Packit |
9c6abc |
Web: http://groups.google.com/a/webmproject.org/group/webp-discuss
|