blob: 21c593feb8444c59df2c13d2cfde5caaba990d9c [file] [log] [blame]
Vikas Aroraa2415722012-08-09 16:18:58 -07001// Copyright 2012 Google Inc. All Rights Reserved.
2//
Vikas Arora0406ce12013-08-09 15:57:12 -07003// 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.
Vikas Aroraa2415722012-08-09 16:18:58 -07008// -----------------------------------------------------------------------------
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"
Vikas Aroraa2415722012-08-09 16:18:58 -070023
Vikas Arora8b720222014-01-02 16:48:02 -080024#ifdef __cplusplus
Vikas Aroraa2415722012-08-09 16:18:58 -070025extern "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 {
Vikas Aroraa2415722012-08-09 16:18:58 -070044 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
Vikas Arora8b720222014-01-02 16:48:02 -080055typedef struct VP8LDecoder VP8LDecoder;
56struct VP8LDecoder {
Vikas Aroraa2415722012-08-09 16:18:58 -070057 VP8StatusCode status_;
58 VP8LDecodeState action_;
59 VP8LDecodeState state_;
60 VP8Io *io_;
61
62 const WebPDecBuffer *output_; // shortcut to io->opaque->output
63
Vikas Arora0406ce12013-08-09 15:57:12 -070064 uint32_t *pixels_; // Internal data: either uint8_t* for alpha
65 // or uint32_t* for BGRA.
Vikas Aroraa2415722012-08-09 16:18:58 -070066 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.
Vikas Arora8b720222014-01-02 16:48:02 -080073 int last_pixel_; // last pixel decoded so far. However, it may
74 // not be transformed, scaled and
75 // color-converted yet.
Vikas Aroraa2415722012-08-09 16:18:58 -070076 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.
Vikas Arora8b720222014-01-02 16:48:02 -080087};
Vikas Aroraa2415722012-08-09 16:18:58 -070088
89//------------------------------------------------------------------------------
90// internal functions. Not public.
91
Vikas Arora8b720222014-01-02 16:48:02 -080092struct ALPHDecoder; // Defined in dec/alphai.h.
93
Vikas Aroraa2415722012-08-09 16:18:58 -070094// in vp8l.c
95
Vikas Arora8b720222014-01-02 16:48:02 -080096// 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);
Vikas Aroraa2415722012-08-09 16:18:58 -0700108
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
Vikas Arora8b720222014-01-02 16:48:02 -0800128#ifdef __cplusplus
Vikas Aroraa2415722012-08-09 16:18:58 -0700129} // extern "C"
130#endif
131
132#endif /* WEBP_DEC_VP8LI_H_ */