// Copyright 2011 Google Inc. // // This code is licensed under the same terms as WebM: // Software License Agreement: http://www.webmproject.org/license/software/ // Additional IP Rights Grant: http://www.webmproject.org/license/additional/ // ----------------------------------------------------------------------------- // // Alpha-plane decompression. // // Author: Skal (pascal.massimino@gmail.com) #include <stdlib.h> #include "vp8i.h" #ifdef WEBP_EXPERIMENTAL_FEATURES #include "zlib.h" #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif //----------------------------------------------------------------------------- const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec, int row, int num_rows) { uint8_t* output = dec->alpha_plane_; const int stride = dec->pic_hdr_.width_; if (row < 0 || row + num_rows > dec->pic_hdr_.height_) { return NULL; // sanity check } if (row == 0) { // TODO(skal): for now, we just decompress everything during the first call. // Later, we'll decode progressively, but we need to store the // z_stream state. const uint8_t* data = dec->alpha_data_; size_t data_size = dec->alpha_data_size_; const size_t output_size = stride * dec->pic_hdr_.height_; int ret = Z_OK; z_stream strm; memset(&strm, 0, sizeof(strm)); if (inflateInit(&strm) != Z_OK) { return 0; } strm.avail_in = data_size; strm.next_in = (unsigned char*)data; do { strm.avail_out = output_size; strm.next_out = output; ret = inflate(&strm, Z_NO_FLUSH); if (ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR) { break; } } while (strm.avail_out == 0); inflateEnd(&strm); if (ret != Z_STREAM_END) { return NULL; // error } } return output + row * stride; } #if defined(__cplusplus) || defined(c_plusplus) } // extern "C" #endif #endif // WEBP_EXPERIMENTAL_FEATURES