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.h" 20#include "../utils/bit_reader.h" 21#include "../utils/color_cache.h" 22#include "../utils/huffman.h" 23 24#ifdef __cplusplus 25extern "C" { 26#endif 27 28typedef enum { 29 READ_DATA = 0, 30 READ_HDR = 1, 31 READ_DIM = 2 32} VP8LDecodeState; 33 34typedef struct VP8LTransform VP8LTransform; 35struct 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 43typedef struct { 44 int color_cache_size_; 45 VP8LColorCache color_cache_; 46 47 int huffman_mask_; 48 int huffman_subsample_bits_; 49 int huffman_xsize_; 50 uint32_t *huffman_image_; 51 int num_htree_groups_; 52 HTreeGroup *htree_groups_; 53} VP8LMetadata; 54 55typedef struct VP8LDecoder VP8LDecoder; 56struct VP8LDecoder { 57 VP8StatusCode status_; 58 VP8LDecodeState action_; 59 VP8LDecodeState state_; 60 VP8Io *io_; 61 62 const WebPDecBuffer *output_; // shortcut to io->opaque->output 63 64 uint32_t *pixels_; // Internal data: either uint8_t* for alpha 65 // or uint32_t* for BGRA. 66 uint32_t *argb_cache_; // Scratch buffer for temporary BGRA storage. 67 68 VP8LBitReader br_; 69 70 int width_; 71 int height_; 72 int last_row_; // last input row decoded so far. 73 int last_pixel_; // last pixel decoded so far. However, it may 74 // not be transformed, scaled and 75 // color-converted yet. 76 int last_out_row_; // last row output so far. 77 78 VP8LMetadata hdr_; 79 80 int next_transform_; 81 VP8LTransform transforms_[NUM_TRANSFORMS]; 82 // or'd bitset storing the transforms types. 83 uint32_t transforms_seen_; 84 85 uint8_t *rescaler_memory; // Working memory for rescaling work. 86 WebPRescaler *rescaler; // Common rescaler for all channels. 87}; 88 89//------------------------------------------------------------------------------ 90// internal functions. Not public. 91 92struct ALPHDecoder; // Defined in dec/alphai.h. 93 94// in vp8l.c 95 96// Decodes image header for alpha data stored using lossless compression. 97// Returns false in case of error. 98int VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec, 99 const uint8_t* const data, size_t data_size, 100 uint8_t* const output); 101 102// Decodes *at least* 'last_row' rows of alpha. If some of the initial rows are 103// already decoded in previous call(s), it will resume decoding from where it 104// was paused. 105// Returns false in case of bitstream error. 106int VP8LDecodeAlphaImageStream(struct ALPHDecoder* const alph_dec, 107 int last_row); 108 109// Allocates and initialize a new lossless decoder instance. 110VP8LDecoder* VP8LNew(void); 111 112// Decodes the image header. Returns false in case of error. 113int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io); 114 115// Decodes an image. It's required to decode the lossless header before calling 116// this function. Returns false in case of error, with updated dec->status_. 117int VP8LDecodeImage(VP8LDecoder* const dec); 118 119// Resets the decoder in its initial state, reclaiming memory. 120// Preserves the dec->status_ value. 121void VP8LClear(VP8LDecoder* const dec); 122 123// Clears and deallocate a lossless decoder instance. 124void VP8LDelete(VP8LDecoder* const dec); 125 126//------------------------------------------------------------------------------ 127 128#ifdef __cplusplus 129} // extern "C" 130#endif 131 132#endif /* WEBP_DEC_VP8LI_H_ */ 133