mirror of
https://github.com/webmproject/libwebp.git
synced 2024-12-27 06:08:21 +01:00
Merge changes Iecccb09c,If5ee9fd2,I3e181ce4 into 0.3.0
* changes: dwebp: warn when decoding animated webp's Decode: return more meaningful error for animation WebPBitstreamFeatures: add has_animation field
This commit is contained in:
commit
f43bafc3e6
@ -460,6 +460,13 @@ int main(int argc, const char *argv[]) {
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bitstream->has_animation) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Error! Decoding of an animated WebP file is not supported.\n"
|
||||||
|
" Use webpmux to extract the individual frames or\n"
|
||||||
|
" vwebp to view this image.\n");
|
||||||
|
}
|
||||||
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case PNG:
|
case PNG:
|
||||||
#ifdef HAVE_WINCODEC_H
|
#ifdef HAVE_WINCODEC_H
|
||||||
|
@ -276,6 +276,7 @@ static VP8StatusCode ParseHeadersInternal(const uint8_t* data,
|
|||||||
int* const width,
|
int* const width,
|
||||||
int* const height,
|
int* const height,
|
||||||
int* const has_alpha,
|
int* const has_alpha,
|
||||||
|
int* const has_animation,
|
||||||
WebPHeaderStructure* const headers) {
|
WebPHeaderStructure* const headers) {
|
||||||
int found_riff = 0;
|
int found_riff = 0;
|
||||||
int found_vp8x = 0;
|
int found_vp8x = 0;
|
||||||
@ -309,6 +310,7 @@ static VP8StatusCode ParseHeadersInternal(const uint8_t* data,
|
|||||||
return VP8_STATUS_BITSTREAM_ERROR;
|
return VP8_STATUS_BITSTREAM_ERROR;
|
||||||
}
|
}
|
||||||
if (has_alpha != NULL) *has_alpha = !!(flags & ALPHA_FLAG);
|
if (has_alpha != NULL) *has_alpha = !!(flags & ALPHA_FLAG);
|
||||||
|
if (has_animation != NULL) *has_animation = !!(flags & ANIMATION_FLAG);
|
||||||
if (found_vp8x && headers == NULL) {
|
if (found_vp8x && headers == NULL) {
|
||||||
return VP8_STATUS_OK; // Return features from VP8X header.
|
return VP8_STATUS_OK; // Return features from VP8X header.
|
||||||
}
|
}
|
||||||
@ -370,10 +372,19 @@ static VP8StatusCode ParseHeadersInternal(const uint8_t* data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VP8StatusCode WebPParseHeaders(WebPHeaderStructure* const headers) {
|
VP8StatusCode WebPParseHeaders(WebPHeaderStructure* const headers) {
|
||||||
|
VP8StatusCode status;
|
||||||
|
int has_animation = 0;
|
||||||
assert(headers != NULL);
|
assert(headers != NULL);
|
||||||
// fill out headers, ignore width/height/has_alpha.
|
// fill out headers, ignore width/height/has_alpha.
|
||||||
return ParseHeadersInternal(headers->data, headers->data_size,
|
status = ParseHeadersInternal(headers->data, headers->data_size,
|
||||||
NULL, NULL, NULL, headers);
|
NULL, NULL, NULL, &has_animation, headers);
|
||||||
|
if (status == VP8_STATUS_OK || status == VP8_STATUS_NOT_ENOUGH_DATA) {
|
||||||
|
// TODO(jzern): full support of animation frames will require API additions.
|
||||||
|
if (has_animation) {
|
||||||
|
status = VP8_STATUS_UNSUPPORTED_FEATURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@ -625,10 +636,11 @@ static VP8StatusCode GetFeatures(const uint8_t* const data, size_t data_size,
|
|||||||
}
|
}
|
||||||
DefaultFeatures(features);
|
DefaultFeatures(features);
|
||||||
|
|
||||||
// Only parse enough of the data to retrieve width/height/has_alpha.
|
// Only parse enough of the data to retrieve the features.
|
||||||
return ParseHeadersInternal(data, data_size,
|
return ParseHeadersInternal(data, data_size,
|
||||||
&features->width, &features->height,
|
&features->width, &features->height,
|
||||||
&features->has_alpha, NULL);
|
&features->has_alpha, &features->has_animation,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -395,6 +395,7 @@ struct WebPBitstreamFeatures {
|
|||||||
int width; // Width in pixels, as read from the bitstream.
|
int width; // Width in pixels, as read from the bitstream.
|
||||||
int height; // Height in pixels, as read from the bitstream.
|
int height; // Height in pixels, as read from the bitstream.
|
||||||
int has_alpha; // True if the bitstream contains an alpha channel.
|
int has_alpha; // True if the bitstream contains an alpha channel.
|
||||||
|
int has_animation; // True if the bitstream is an animation.
|
||||||
|
|
||||||
// Unused for now:
|
// Unused for now:
|
||||||
int bitstream_version; // should be 0 for now. TODO(later)
|
int bitstream_version; // should be 0 for now. TODO(later)
|
||||||
@ -402,7 +403,7 @@ struct WebPBitstreamFeatures {
|
|||||||
// recommended.
|
// recommended.
|
||||||
int rotate; // TODO(later)
|
int rotate; // TODO(later)
|
||||||
int uv_sampling; // should be 0 for now. TODO(later)
|
int uv_sampling; // should be 0 for now. TODO(later)
|
||||||
uint32_t pad[3]; // padding for later use
|
uint32_t pad[2]; // padding for later use
|
||||||
};
|
};
|
||||||
|
|
||||||
// Internal, version-checked, entry point
|
// Internal, version-checked, entry point
|
||||||
|
Loading…
Reference in New Issue
Block a user