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" |