Home | History | Annotate | Download | only in dec
      1 // Copyright 2011 Google Inc.
      2 //
      3 // This code is licensed under the same terms as WebM:
      4 //  Software License Agreement:  http://www.webmproject.org/license/software/
      5 //  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
      6 // -----------------------------------------------------------------------------
      7 //
      8 // Alpha-plane decompression.
      9 //
     10 // Author: Skal (pascal.massimino (at) gmail.com)
     11 
     12 #include <stdlib.h>
     13 #include "vp8i.h"
     14 
     15 #ifdef WEBP_EXPERIMENTAL_FEATURES
     16 
     17 #include "zlib.h"
     18 
     19 #if defined(__cplusplus) || defined(c_plusplus)
     20 extern "C" {
     21 #endif
     22 
     23 //-----------------------------------------------------------------------------
     24 
     25 const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
     26                                       int row, int num_rows) {
     27   uint8_t* output = dec->alpha_plane_;
     28   const int stride = dec->pic_hdr_.width_;
     29   if (row < 0 || row + num_rows > dec->pic_hdr_.height_) {
     30     return NULL;    // sanity check
     31   }
     32   if (row == 0) {
     33     // TODO(skal): for now, we just decompress everything during the first call.
     34     // Later, we'll decode progressively, but we need to store the
     35     // z_stream state.
     36     const uint8_t* data = dec->alpha_data_;
     37     size_t data_size = dec->alpha_data_size_;
     38     const size_t output_size = stride * dec->pic_hdr_.height_;
     39     int ret = Z_OK;
     40     z_stream strm;
     41 
     42     memset(&strm, 0, sizeof(strm));
     43     if (inflateInit(&strm) != Z_OK) {
     44       return 0;
     45     }
     46     strm.avail_in = data_size;
     47     strm.next_in = (unsigned char*)data;
     48     do {
     49       strm.avail_out = output_size;
     50       strm.next_out = output;
     51       ret = inflate(&strm, Z_NO_FLUSH);
     52       if (ret == Z_NEED_DICT || ret == Z_DATA_ERROR || ret == Z_MEM_ERROR) {
     53         break;
     54       }
     55     } while (strm.avail_out == 0);
     56 
     57     inflateEnd(&strm);
     58     if (ret != Z_STREAM_END) {
     59       return NULL;    // error
     60     }
     61   }
     62   return output + row * stride;
     63 }
     64 
     65 #if defined(__cplusplus) || defined(c_plusplus)
     66 }    // extern "C"
     67 #endif
     68 
     69 #endif    // WEBP_EXPERIMENTAL_FEATURES
     70