1a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Copyright 2012 Google Inc. All Rights Reserved.
2a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
30406ce1417f76f2034833414dcecc9f56253640cVikas Arora// Use of this source code is governed by a BSD-style license
40406ce1417f76f2034833414dcecc9f56253640cVikas Arora// that can be found in the COPYING file in the root of the source
50406ce1417f76f2034833414dcecc9f56253640cVikas Arora// tree. An additional intellectual property rights grant can be found
60406ce1417f76f2034833414dcecc9f56253640cVikas Arora// in the file PATENTS. All contributing project authors may
70406ce1417f76f2034833414dcecc9f56253640cVikas Arora// be found in the AUTHORS file in the root of the source tree.
8a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// -----------------------------------------------------------------------------
9a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
10a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Lossless decoder: internal header.
11a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//
12a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Author: Skal (pascal.massimino@gmail.com)
13a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//         Vikas Arora(vikaas.arora@gmail.com)
14a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
15a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#ifndef WEBP_DEC_VP8LI_H_
16a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#define WEBP_DEC_VP8LI_H_
17a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
18a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include <string.h>     // for memcpy()
19a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "./webpi.h"
20a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "../utils/bit_reader.h"
21a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "../utils/color_cache.h"
22a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#include "../utils/huffman.h"
23a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
248b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#ifdef __cplusplus
25a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraextern "C" {
26a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif
27a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
28a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef enum {
29a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  READ_DATA = 0,
30a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  READ_HDR = 1,
31a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  READ_DIM = 2
32a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} VP8LDecodeState;
33a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
34a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef struct VP8LTransform VP8LTransform;
35a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arorastruct VP8LTransform {
36a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8LImageTransformType type_;   // transform type.
37a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int                    bits_;   // subsampling bits defining transform window.
38a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int                    xsize_;  // transform window X index.
39a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int                    ysize_;  // transform window Y index.
40a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint32_t              *data_;   // transform data.
41a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora};
42a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
43a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroratypedef struct {
44a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int             color_cache_size_;
45a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8LColorCache  color_cache_;
46a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
47a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int             huffman_mask_;
48a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int             huffman_subsample_bits_;
49a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int             huffman_xsize_;
50a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint32_t       *huffman_image_;
51a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int             num_htree_groups_;
52a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  HTreeGroup     *htree_groups_;
53a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora} VP8LMetadata;
54a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
558b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroratypedef struct VP8LDecoder VP8LDecoder;
568b720228d581a84fd173b6dcb2fa295b59db489aVikas Arorastruct VP8LDecoder {
57a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8StatusCode    status_;
58a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8LDecodeState  action_;
59a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8LDecodeState  state_;
60a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8Io           *io_;
61a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
62a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  const WebPDecBuffer *output_;    // shortcut to io->opaque->output
63a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
640406ce1417f76f2034833414dcecc9f56253640cVikas Arora  uint32_t        *pixels_;        // Internal data: either uint8_t* for alpha
650406ce1417f76f2034833414dcecc9f56253640cVikas Arora                                   // or uint32_t* for BGRA.
66a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint32_t        *argb_cache_;    // Scratch buffer for temporary BGRA storage.
67a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
68a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8LBitReader    br_;
69a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
70a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int              width_;
71a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int              height_;
72a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int              last_row_;      // last input row decoded so far.
738b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora  int              last_pixel_;    // last pixel decoded so far. However, it may
748b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora                                   // not be transformed, scaled and
758b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora                                   // color-converted yet.
76a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int              last_out_row_;  // last row output so far.
77a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
78a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8LMetadata     hdr_;
79a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
80a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  int              next_transform_;
81a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  VP8LTransform    transforms_[NUM_TRANSFORMS];
82a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  // or'd bitset storing the transforms types.
83a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint32_t         transforms_seen_;
84a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
85a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  uint8_t         *rescaler_memory;  // Working memory for rescaling work.
86a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora  WebPRescaler    *rescaler;         // Common rescaler for all channels.
878b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora};
88a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
89a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
90a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// internal functions. Not public.
91a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
928b720228d581a84fd173b6dcb2fa295b59db489aVikas Arorastruct ALPHDecoder;  // Defined in dec/alphai.h.
938b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora
94a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// in vp8l.c
95a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
968b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Decodes image header for alpha data stored using lossless compression.
978b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Returns false in case of error.
988b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroraint VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec,
998b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora                          const uint8_t* const data, size_t data_size,
1008b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora                          uint8_t* const output);
1018b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora
1028b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Decodes *at least* 'last_row' rows of alpha. If some of the initial rows are
1038b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// already decoded in previous call(s), it will resume decoding from where it
1048b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// was paused.
1058b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora// Returns false in case of bitstream error.
1068b720228d581a84fd173b6dcb2fa295b59db489aVikas Aroraint VP8LDecodeAlphaImageStream(struct ALPHDecoder* const alph_dec,
1078b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora                               int last_row);
108a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
109a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Allocates and initialize a new lossless decoder instance.
110a2415724fb3466168b2af5b08bd94ba732c0e753Vikas AroraVP8LDecoder* VP8LNew(void);
111a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
112a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Decodes the image header. Returns false in case of error.
113a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io);
114a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
115a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Decodes an image. It's required to decode the lossless header before calling
116a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// this function. Returns false in case of error, with updated dec->status_.
117a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroraint VP8LDecodeImage(VP8LDecoder* const dec);
118a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
119a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Resets the decoder in its initial state, reclaiming memory.
120a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Preserves the dec->status_ value.
121a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8LClear(VP8LDecoder* const dec);
122a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
123a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora// Clears and deallocate a lossless decoder instance.
124a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Aroravoid VP8LDelete(VP8LDecoder* const dec);
125a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
126a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora//------------------------------------------------------------------------------
127a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
1288b720228d581a84fd173b6dcb2fa295b59db489aVikas Arora#ifdef __cplusplus
129a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora}    // extern "C"
130a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif
131a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora
132a2415724fb3466168b2af5b08bd94ba732c0e753Vikas Arora#endif  /* WEBP_DEC_VP8LI_H_ */
133