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:
James Zern 2013-03-20 14:56:29 -07:00 committed by Gerrit Code Review
commit f43bafc3e6
3 changed files with 28 additions and 8 deletions

View File

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

View File

@ -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);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View File

@ -392,9 +392,10 @@ WEBP_EXTERN(const WebPDecBuffer*) WebPIDecodedArea(
// Features gathered from the bitstream // Features gathered from the bitstream
struct WebPBitstreamFeatures { 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