// Copyright 2014 Google Inc. All Rights Reserved. // // Use of this source code is governed by a BSD-style license // that can be found in the COPYING file in the root of the source // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. // ----------------------------------------------------------------------------- // // WebP decode. #include "./webpdec.h" #include #include #include "webp/decode.h" #include "webp/encode.h" #include "./example_util.h" #include "./metadata.h" int ReadWebP(const char* const in_file, WebPPicture* const pic, int keep_alpha, Metadata* const metadata) { int ok = 0; size_t data_size = 0; const uint8_t* data = NULL; VP8StatusCode status = VP8_STATUS_OK; WebPDecoderConfig config; WebPDecBuffer* const output_buffer = &config.output; WebPBitstreamFeatures* const bitstream = &config.input; // TODO(jzern): add Exif/XMP/ICC extraction. if (metadata != NULL) { fprintf(stderr, "Warning: metadata extraction from WebP is unsupported.\n"); } if (!WebPInitDecoderConfig(&config)) { fprintf(stderr, "Library version mismatch!\n"); return 0; } if (ExUtilLoadWebP(in_file, &data, &data_size, bitstream)) { const int has_alpha = keep_alpha && bitstream->has_alpha; output_buffer->colorspace = has_alpha ? MODE_RGBA : MODE_RGB; status = ExUtilDecodeWebP(data, data_size, 0, 0, &config); if (status == VP8_STATUS_OK) { const uint8_t* const rgba = output_buffer->u.RGBA.rgba; const int stride = output_buffer->u.RGBA.stride; pic->width = output_buffer->width; pic->height = output_buffer->height; pic->use_argb = 1; ok = has_alpha ? WebPPictureImportRGBA(pic, rgba, stride) : WebPPictureImportRGB(pic, rgba, stride); } } if (status != VP8_STATUS_OK) { ExUtilPrintWebPError(in_file, status); } free((void*)data); WebPFreeDecBuffer(output_buffer); return ok; } // -----------------------------------------------------------------------------