| Index: third_party/libwebp/webp/demux.h
|
| diff --git a/third_party/libwebp/webp/demux.h b/third_party/libwebp/webp/demux.h
|
| index 2da3239dd9dc5423f916d5a36f865989e6abee54..454f6914b2ff3f0776b5a181c0eb5682d888d2a2 100644
|
| --- a/third_party/libwebp/webp/demux.h
|
| +++ b/third_party/libwebp/webp/demux.h
|
| @@ -48,13 +48,14 @@
|
| #ifndef WEBP_WEBP_DEMUX_H_
|
| #define WEBP_WEBP_DEMUX_H_
|
|
|
| +#include "./decode.h" // for WEBP_CSP_MODE
|
| #include "./mux_types.h"
|
|
|
| #ifdef __cplusplus
|
| extern "C" {
|
| #endif
|
|
|
| -#define WEBP_DEMUX_ABI_VERSION 0x0101 // MAJOR(8b) + MINOR(8b)
|
| +#define WEBP_DEMUX_ABI_VERSION 0x0107 // MAJOR(8b) + MINOR(8b)
|
|
|
| // Note: forward declaring enumerations is not allowed in (strict) C and C++,
|
| // the types are left here for reference.
|
| @@ -63,6 +64,8 @@ extern "C" {
|
| typedef struct WebPDemuxer WebPDemuxer;
|
| typedef struct WebPIterator WebPIterator;
|
| typedef struct WebPChunkIterator WebPChunkIterator;
|
| +typedef struct WebPAnimInfo WebPAnimInfo;
|
| +typedef struct WebPAnimDecoderOptions WebPAnimDecoderOptions;
|
|
|
| //------------------------------------------------------------------------------
|
|
|
| @@ -85,7 +88,8 @@ typedef enum WebPDemuxState {
|
| WEBP_EXTERN(WebPDemuxer*) WebPDemuxInternal(
|
| const WebPData*, int, WebPDemuxState*, int);
|
|
|
| -// Parses the full WebP file given by 'data'.
|
| +// Parses the full WebP file given by 'data'. For single images the WebP file
|
| +// header alone or the file header and the chunk header may be absent.
|
| // Returns a WebPDemuxer object on successful parse, NULL otherwise.
|
| static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
|
| return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION);
|
| @@ -134,17 +138,15 @@ WEBP_EXTERN(uint32_t) WebPDemuxGetI(
|
| struct WebPIterator {
|
| int frame_num;
|
| int num_frames; // equivalent to WEBP_FF_FRAME_COUNT.
|
| - int fragment_num;
|
| - int num_fragments;
|
| int x_offset, y_offset; // offset relative to the canvas.
|
| - int width, height; // dimensions of this frame or fragment.
|
| + int width, height; // dimensions of this frame.
|
| int duration; // display duration in milliseconds.
|
| WebPMuxAnimDispose dispose_method; // dispose method for the frame.
|
| int complete; // true if 'fragment' contains a full frame. partial images
|
| // may still be decoded with the WebP incremental decoder.
|
| - WebPData fragment; // The frame or fragment given by 'frame_num' and
|
| - // 'fragment_num'.
|
| - int has_alpha; // True if the frame or fragment contains transparency.
|
| + WebPData fragment; // The frame given by 'frame_num'. Note for historical
|
| + // reasons this is called a fragment.
|
| + int has_alpha; // True if the frame contains transparency.
|
| WebPMuxAnimBlend blend_method; // Blend operation for the frame.
|
|
|
| uint32_t pad[2]; // padding for later use.
|
| @@ -152,8 +154,7 @@ struct WebPIterator {
|
| };
|
|
|
| // Retrieves frame 'frame_number' from 'dmux'.
|
| -// 'iter->fragment' points to the first fragment on return from this function.
|
| -// Individual fragments may be extracted using WebPDemuxSelectFragment().
|
| +// 'iter->fragment' points to the frame on return from this function.
|
| // Setting 'frame_number' equal to 0 will return the last frame of the image.
|
| // Returns false if 'dmux' is NULL or frame 'frame_number' is not present.
|
| // Call WebPDemuxReleaseIterator() when use of the iterator is complete.
|
| @@ -167,10 +168,6 @@ WEBP_EXTERN(int) WebPDemuxGetFrame(
|
| WEBP_EXTERN(int) WebPDemuxNextFrame(WebPIterator* iter);
|
| WEBP_EXTERN(int) WebPDemuxPrevFrame(WebPIterator* iter);
|
|
|
| -// Sets 'iter->fragment' to reflect fragment number 'fragment_num'.
|
| -// Returns true if fragment 'fragment_num' is present, false otherwise.
|
| -WEBP_EXTERN(int) WebPDemuxSelectFragment(WebPIterator* iter, int fragment_num);
|
| -
|
| // Releases any memory associated with 'iter'.
|
| // Must be called before any subsequent calls to WebPDemuxGetChunk() on the same
|
| // iter. Also, must be called before destroying the associated WebPDemuxer with
|
| @@ -216,6 +213,143 @@ WEBP_EXTERN(int) WebPDemuxPrevChunk(WebPChunkIterator* iter);
|
| WEBP_EXTERN(void) WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter);
|
|
|
| //------------------------------------------------------------------------------
|
| +// WebPAnimDecoder API
|
| +//
|
| +// This API allows decoding (possibly) animated WebP images.
|
| +//
|
| +// Code Example:
|
| +/*
|
| + WebPAnimDecoderOptions dec_options;
|
| + WebPAnimDecoderOptionsInit(&dec_options);
|
| + // Tune 'dec_options' as needed.
|
| + WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
|
| + WebPAnimInfo anim_info;
|
| + WebPAnimDecoderGetInfo(dec, &anim_info);
|
| + for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
|
| + while (WebPAnimDecoderHasMoreFrames(dec)) {
|
| + uint8_t* buf;
|
| + int timestamp;
|
| + WebPAnimDecoderGetNext(dec, &buf, ×tamp);
|
| + // ... (Render 'buf' based on 'timestamp').
|
| + // ... (Do NOT free 'buf', as it is owned by 'dec').
|
| + }
|
| + WebPAnimDecoderReset(dec);
|
| + }
|
| + const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
|
| + // ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
|
| + WebPAnimDecoderDelete(dec);
|
| +*/
|
| +
|
| +typedef struct WebPAnimDecoder WebPAnimDecoder; // Main opaque object.
|
| +
|
| +// Global options.
|
| +struct WebPAnimDecoderOptions {
|
| + // Output colorspace. Only the following modes are supported:
|
| + // MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA.
|
| + WEBP_CSP_MODE color_mode;
|
| + int use_threads; // If true, use multi-threaded decoding.
|
| + uint32_t padding[7]; // Padding for later use.
|
| +};
|
| +
|
| +// Internal, version-checked, entry point.
|
| +WEBP_EXTERN(int) WebPAnimDecoderOptionsInitInternal(
|
| + WebPAnimDecoderOptions*, int);
|
| +
|
| +// Should always be called, to initialize a fresh WebPAnimDecoderOptions
|
| +// structure before modification. Returns false in case of version mismatch.
|
| +// WebPAnimDecoderOptionsInit() must have succeeded before using the
|
| +// 'dec_options' object.
|
| +static WEBP_INLINE int WebPAnimDecoderOptionsInit(
|
| + WebPAnimDecoderOptions* dec_options) {
|
| + return WebPAnimDecoderOptionsInitInternal(dec_options,
|
| + WEBP_DEMUX_ABI_VERSION);
|
| +}
|
| +
|
| +// Internal, version-checked, entry point.
|
| +WEBP_EXTERN(WebPAnimDecoder*) WebPAnimDecoderNewInternal(
|
| + const WebPData*, const WebPAnimDecoderOptions*, int);
|
| +
|
| +// Creates and initializes a WebPAnimDecoder object.
|
| +// Parameters:
|
| +// webp_data - (in) WebP bitstream. This should remain unchanged during the
|
| +// lifetime of the output WebPAnimDecoder object.
|
| +// dec_options - (in) decoding options. Can be passed NULL to choose
|
| +// reasonable defaults (in particular, color mode MODE_RGBA
|
| +// will be picked).
|
| +// Returns:
|
| +// A pointer to the newly created WebPAnimDecoder object, or NULL in case of
|
| +// parsing error, invalid option or memory error.
|
| +static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
|
| + const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) {
|
| + return WebPAnimDecoderNewInternal(webp_data, dec_options,
|
| + WEBP_DEMUX_ABI_VERSION);
|
| +}
|
| +
|
| +// Global information about the animation..
|
| +struct WebPAnimInfo {
|
| + uint32_t canvas_width;
|
| + uint32_t canvas_height;
|
| + uint32_t loop_count;
|
| + uint32_t bgcolor;
|
| + uint32_t frame_count;
|
| + uint32_t pad[4]; // padding for later use
|
| +};
|
| +
|
| +// Get global information about the animation.
|
| +// Parameters:
|
| +// dec - (in) decoder instance to get information from.
|
| +// info - (out) global information fetched from the animation.
|
| +// Returns:
|
| +// True on success.
|
| +WEBP_EXTERN(int) WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
|
| + WebPAnimInfo* info);
|
| +
|
| +// Fetch the next frame from 'dec' based on options supplied to
|
| +// WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size
|
| +// 'canvas_width * 4 * canvas_height', and not just the frame sub-rectangle. The
|
| +// returned buffer 'buf' is valid only until the next call to
|
| +// WebPAnimDecoderGetNext(), WebPAnimDecoderReset() or WebPAnimDecoderDelete().
|
| +// Parameters:
|
| +// dec - (in/out) decoder instance from which the next frame is to be fetched.
|
| +// buf - (out) decoded frame.
|
| +// timestamp - (out) timestamp of the frame in milliseconds.
|
| +// Returns:
|
| +// False if any of the arguments are NULL, or if there is a parsing or
|
| +// decoding error, or if there are no more frames. Otherwise, returns true.
|
| +WEBP_EXTERN(int) WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
|
| + uint8_t** buf, int* timestamp);
|
| +
|
| +// Check if there are more frames left to decode.
|
| +// Parameters:
|
| +// dec - (in) decoder instance to be checked.
|
| +// Returns:
|
| +// True if 'dec' is not NULL and some frames are yet to be decoded.
|
| +// Otherwise, returns false.
|
| +WEBP_EXTERN(int) WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
|
| +
|
| +// Resets the WebPAnimDecoder object, so that next call to
|
| +// WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be
|
| +// helpful when all frames need to be decoded multiple times (e.g.
|
| +// info.loop_count times) without destroying and recreating the 'dec' object.
|
| +// Parameters:
|
| +// dec - (in/out) decoder instance to be reset
|
| +WEBP_EXTERN(void) WebPAnimDecoderReset(WebPAnimDecoder* dec);
|
| +
|
| +// Grab the internal demuxer object.
|
| +// Getting the demuxer object can be useful if one wants to use operations only
|
| +// available through demuxer; e.g. to get XMP/EXIF/ICC metadata. The returned
|
| +// demuxer object is owned by 'dec' and is valid only until the next call to
|
| +// WebPAnimDecoderDelete().
|
| +//
|
| +// Parameters:
|
| +// dec - (in) decoder instance from which the demuxer object is to be fetched.
|
| +WEBP_EXTERN(const WebPDemuxer*) WebPAnimDecoderGetDemuxer(
|
| + const WebPAnimDecoder* dec);
|
| +
|
| +// Deletes the WebPAnimDecoder object.
|
| +// Parameters:
|
| +// dec - (in/out) decoder instance to be deleted
|
| +WEBP_EXTERN(void) WebPAnimDecoderDelete(WebPAnimDecoder* dec);
|
|
|
| #ifdef __cplusplus
|
| } // extern "C"
|
|
|