| 1 | // Copyright 2012 Google Inc. All Rights Reserved. | 
|---|
| 2 | // | 
|---|
| 3 | // Use of this source code is governed by a BSD-style license | 
|---|
| 4 | // that can be found in the COPYING file in the root of the source | 
|---|
| 5 | // tree. An additional intellectual property rights grant can be found | 
|---|
| 6 | // in the file PATENTS. All contributing project authors may | 
|---|
| 7 | // be found in the AUTHORS file in the root of the source tree. | 
|---|
| 8 | // ----------------------------------------------------------------------------- | 
|---|
| 9 | // | 
|---|
| 10 | // Lossless decoder: internal header. | 
|---|
| 11 | // | 
|---|
| 12 | // Author: Skal (pascal.massimino@gmail.com) | 
|---|
| 13 | //         Vikas Arora(vikaas.arora@gmail.com) | 
|---|
| 14 |  | 
|---|
| 15 | #ifndef WEBP_DEC_VP8LI_H_ | 
|---|
| 16 | #define WEBP_DEC_VP8LI_H_ | 
|---|
| 17 |  | 
|---|
| 18 | #include <string.h>     // for memcpy() | 
|---|
| 19 | #include "./webpi_dec.h" | 
|---|
| 20 | #include "../utils/bit_reader_utils.h" | 
|---|
| 21 | #include "../utils/color_cache_utils.h" | 
|---|
| 22 | #include "../utils/huffman_utils.h" | 
|---|
| 23 |  | 
|---|
| 24 | #ifdef __cplusplus | 
|---|
| 25 | extern "C"{ | 
|---|
| 26 | #endif | 
|---|
| 27 |  | 
|---|
| 28 | typedef enum { | 
|---|
| 29 | READ_DATA = 0, | 
|---|
| 30 | READ_HDR = 1, | 
|---|
| 31 | READ_DIM = 2 | 
|---|
| 32 | } VP8LDecodeState; | 
|---|
| 33 |  | 
|---|
| 34 | typedef struct VP8LTransform VP8LTransform; | 
|---|
| 35 | struct VP8LTransform { | 
|---|
| 36 | VP8LImageTransformType type_;   // transform type. | 
|---|
| 37 | int                    bits_;   // subsampling bits defining transform window. | 
|---|
| 38 | int                    xsize_;  // transform window X index. | 
|---|
| 39 | int                    ysize_;  // transform window Y index. | 
|---|
| 40 | uint32_t              *data_;   // transform data. | 
|---|
| 41 | }; | 
|---|
| 42 |  | 
|---|
| 43 | typedef struct { | 
|---|
| 44 | int             color_cache_size_; | 
|---|
| 45 | VP8LColorCache  color_cache_; | 
|---|
| 46 | VP8LColorCache  saved_color_cache_;  // for incremental | 
|---|
| 47 |  | 
|---|
| 48 | int             huffman_mask_; | 
|---|
| 49 | int             huffman_subsample_bits_; | 
|---|
| 50 | int             huffman_xsize_; | 
|---|
| 51 | uint32_t       *huffman_image_; | 
|---|
| 52 | int             num_htree_groups_; | 
|---|
| 53 | HTreeGroup     *htree_groups_; | 
|---|
| 54 | HuffmanCode    *huffman_tables_; | 
|---|
| 55 | } VP8LMetadata; | 
|---|
| 56 |  | 
|---|
| 57 | typedef struct VP8LDecoder VP8LDecoder; | 
|---|
| 58 | struct VP8LDecoder { | 
|---|
| 59 | VP8StatusCode    status_; | 
|---|
| 60 | VP8LDecodeState  state_; | 
|---|
| 61 | VP8Io           *io_; | 
|---|
| 62 |  | 
|---|
| 63 | const WebPDecBuffer *output_;    // shortcut to io->opaque->output | 
|---|
| 64 |  | 
|---|
| 65 | uint32_t        *pixels_;        // Internal data: either uint8_t* for alpha | 
|---|
| 66 | // or uint32_t* for BGRA. | 
|---|
| 67 | uint32_t        *argb_cache_;    // Scratch buffer for temporary BGRA storage. | 
|---|
| 68 |  | 
|---|
| 69 | VP8LBitReader    br_; | 
|---|
| 70 | int              incremental_;   // if true, incremental decoding is expected | 
|---|
| 71 | VP8LBitReader    saved_br_;      // note: could be local variables too | 
|---|
| 72 | int              saved_last_pixel_; | 
|---|
| 73 |  | 
|---|
| 74 | int              width_; | 
|---|
| 75 | int              height_; | 
|---|
| 76 | int              last_row_;      // last input row decoded so far. | 
|---|
| 77 | int              last_pixel_;    // last pixel decoded so far. However, it may | 
|---|
| 78 | // not be transformed, scaled and | 
|---|
| 79 | // color-converted yet. | 
|---|
| 80 | int              last_out_row_;  // last row output so far. | 
|---|
| 81 |  | 
|---|
| 82 | VP8LMetadata     hdr_; | 
|---|
| 83 |  | 
|---|
| 84 | int              next_transform_; | 
|---|
| 85 | VP8LTransform    transforms_[NUM_TRANSFORMS]; | 
|---|
| 86 | // or'd bitset storing the transforms types. | 
|---|
| 87 | uint32_t         transforms_seen_; | 
|---|
| 88 |  | 
|---|
| 89 | uint8_t         *rescaler_memory;  // Working memory for rescaling work. | 
|---|
| 90 | WebPRescaler    *rescaler;         // Common rescaler for all channels. | 
|---|
| 91 | }; | 
|---|
| 92 |  | 
|---|
| 93 | //------------------------------------------------------------------------------ | 
|---|
| 94 | // internal functions. Not public. | 
|---|
| 95 |  | 
|---|
| 96 | struct ALPHDecoder;  // Defined in dec/alphai.h. | 
|---|
| 97 |  | 
|---|
| 98 | // in vp8l.c | 
|---|
| 99 |  | 
|---|
| 100 | // Decodes image header for alpha data stored using lossless compression. | 
|---|
| 101 | // Returns false in case of error. | 
|---|
| 102 | int (struct ALPHDecoder* const alph_dec, | 
|---|
| 103 | const uint8_t* const data, size_t data_size); | 
|---|
| 104 |  | 
|---|
| 105 | // Decodes *at least* 'last_row' rows of alpha. If some of the initial rows are | 
|---|
| 106 | // already decoded in previous call(s), it will resume decoding from where it | 
|---|
| 107 | // was paused. | 
|---|
| 108 | // Returns false in case of bitstream error. | 
|---|
| 109 | int VP8LDecodeAlphaImageStream(struct ALPHDecoder* const alph_dec, | 
|---|
| 110 | int last_row); | 
|---|
| 111 |  | 
|---|
| 112 | // Allocates and initialize a new lossless decoder instance. | 
|---|
| 113 | VP8LDecoder* VP8LNew(void); | 
|---|
| 114 |  | 
|---|
| 115 | // Decodes the image header. Returns false in case of error. | 
|---|
| 116 | int (VP8LDecoder* const dec, VP8Io* const io); | 
|---|
| 117 |  | 
|---|
| 118 | // Decodes an image. It's required to decode the lossless header before calling | 
|---|
| 119 | // this function. Returns false in case of error, with updated dec->status_. | 
|---|
| 120 | int VP8LDecodeImage(VP8LDecoder* const dec); | 
|---|
| 121 |  | 
|---|
| 122 | // Resets the decoder in its initial state, reclaiming memory. | 
|---|
| 123 | // Preserves the dec->status_ value. | 
|---|
| 124 | void VP8LClear(VP8LDecoder* const dec); | 
|---|
| 125 |  | 
|---|
| 126 | // Clears and deallocate a lossless decoder instance. | 
|---|
| 127 | void VP8LDelete(VP8LDecoder* const dec); | 
|---|
| 128 |  | 
|---|
| 129 | //------------------------------------------------------------------------------ | 
|---|
| 130 |  | 
|---|
| 131 | #ifdef __cplusplus | 
|---|
| 132 | }    // extern "C" | 
|---|
| 133 | #endif | 
|---|
| 134 |  | 
|---|
| 135 | #endif  /* WEBP_DEC_VP8LI_H_ */ | 
|---|
| 136 |  | 
|---|