Index: third_party/libwebp/demux/demux.c |
diff --git a/third_party/libwebp/demux/demux.c b/third_party/libwebp/demux/demux.c |
index 9966399f90dbce08dbaa93b2d08e2a70d0e1cc11..c6e4acdcb866c1984a8accf6329f357ce6eed556 100644 |
--- a/third_party/libwebp/demux/demux.c |
+++ b/third_party/libwebp/demux/demux.c |
@@ -509,8 +509,9 @@ static ParseStatus ParseVP8X(WebPDemuxer* const dmux) { |
case MKFOURCC('A', 'L', 'P', 'H'): |
case MKFOURCC('V', 'P', '8', ' '): |
case MKFOURCC('V', 'P', '8', 'L'): { |
+ const int has_frames = !!(dmux->feature_flags_ & ANIMATION_FLAG); |
fbarchard
2013/11/23 01:01:57
!! is obscure.
const int has_frames = dmux->feat
|
// check that this isn't an animation (all frames should be in an ANMF). |
- if (anim_chunks > 0) return PARSE_ERROR; |
+ if (anim_chunks > 0 || has_frames) return PARSE_ERROR; |
Rewind(mem, CHUNK_HEADER_SIZE); |
status = ParseSingleImage(dmux); |
@@ -599,6 +600,8 @@ static int IsValidSimpleFormat(const WebPDemuxer* const dmux) { |
// If 'exact' is true, check that the image resolution matches the canvas. |
// If 'exact' is false, check that the x/y offsets do not exceed the canvas. |
+// TODO(jzern): this is insufficient in the fragmented image case if the |
fbarchard
2013/11/23 01:01:57
Prefer comments start with uppercase.
This is insu
|
+// expectation is that the fragments completely cover the canvas. |
static int CheckFrameBounds(const Frame* const frame, int exact, |
int canvas_width, int canvas_height) { |
if (exact) { |
@@ -626,6 +629,9 @@ static int IsValidExtendedFormat(const WebPDemuxer* const dmux) { |
if (dmux->canvas_width_ <= 0 || dmux->canvas_height_ <= 0) return 0; |
if (dmux->loop_count_ < 0) return 0; |
if (dmux->state_ == WEBP_DEMUX_DONE && dmux->frames_ == NULL) return 0; |
+#ifndef WEBP_EXPERIMENTAL_FEATURES |
+ if (has_fragments) return 0; |
+#endif |
while (f != NULL) { |
const int cur_frame_set = f->frame_num_; |
@@ -637,8 +643,10 @@ static int IsValidExtendedFormat(const WebPDemuxer* const dmux) { |
const ChunkData* const image = f->img_components_; |
const ChunkData* const alpha = f->img_components_ + 1; |
+ if (has_fragments && !f->is_fragment_) return 0; |
if (!has_fragments && f->is_fragment_) return 0; |
if (!has_frames && f->frame_num_ > 1) return 0; |
+ |
if (f->complete_) { |
if (alpha->size_ == 0 && image->size_ == 0) return 0; |
// Ensure alpha precedes image bitstream. |