15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2012 Google Inc. All Rights Reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// that can be found in the COPYING file in the root of the source
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tree. An additional intellectual property rights grant can be found
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// in the file PATENTS. All contributing project authors may
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// be found in the AUTHORS file in the root of the source tree.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// -----------------------------------------------------------------------------
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lossless decoder: internal header.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: Skal (pascal.massimino@gmail.com)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//         Vikas Arora(vikaas.arora@gmail.com)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef WEBP_DEC_VP8LI_H_
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define WEBP_DEC_VP8LI_H_
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>     // for memcpy()
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "./webpi.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../utils/bit_reader.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../utils/color_cache.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "../utils/huffman.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  READ_DATA = 0,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  READ_HDR = 1,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  READ_DIM = 2
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8LDecodeState;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct VP8LTransform VP8LTransform;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct VP8LTransform {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8LImageTransformType type_;   // transform type.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int                    bits_;   // subsampling bits defining transform window.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int                    xsize_;  // transform window X index.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int                    ysize_;  // transform window Y index.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t              *data_;   // transform data.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int             color_cache_size_;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8LColorCache  color_cache_;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int             huffman_mask_;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int             huffman_subsample_bits_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int             huffman_xsize_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t       *huffman_image_;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int             num_htree_groups_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HTreeGroup     *htree_groups_;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} VP8LMetadata;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef struct VP8LDecoder VP8LDecoder;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct VP8LDecoder {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8StatusCode    status_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8LDecodeState  action_;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8LDecodeState  state_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8Io           *io_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const WebPDecBuffer *output_;    // shortcut to io->opaque->output
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint32_t        *pixels_;        // Internal data: either uint8_t* for alpha
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                   // or uint32_t* for BGRA.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t        *argb_cache_;    // Scratch buffer for temporary BGRA storage.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8LBitReader    br_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int              width_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int              height_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int              last_row_;      // last input row decoded so far.
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int              last_pixel_;    // last pixel decoded so far. However, it may
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   // not be transformed, scaled and
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   // color-converted yet.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int              last_out_row_;  // last row output so far.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8LMetadata     hdr_;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int              next_transform_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VP8LTransform    transforms_[NUM_TRANSFORMS];
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or'd bitset storing the transforms types.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32_t         transforms_seen_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8_t         *rescaler_memory;  // Working memory for rescaling work.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebPRescaler    *rescaler;         // Common rescaler for all channels.
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// internal functions. Not public.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct ALPHDecoder;  // Defined in dec/alphai.h.
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in vp8l.c
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decodes image header for alpha data stored using lossless compression.
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns false in case of error.
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec,
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          const uint8_t* const data, size_t data_size,
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          uint8_t* const output);
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decodes *at least* 'last_row' rows of alpha. If some of the initial rows are
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// already decoded in previous call(s), it will resume decoding from where it
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// was paused.
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns false in case of bitstream error.
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int VP8LDecodeAlphaImageStream(struct ALPHDecoder* const alph_dec,
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               int last_row);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allocates and initialize a new lossless decoder instance.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VP8LDecoder* VP8LNew(void);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Decodes the image header. Returns false in case of error.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Decodes an image. It's required to decode the lossless header before calling
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this function. Returns false in case of error, with updated dec->status_.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int VP8LDecodeImage(VP8LDecoder* const dec);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Resets the decoder in its initial state, reclaiming memory.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Preserves the dec->status_ value.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8LClear(VP8LDecoder* const dec);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clears and deallocate a lossless decoder instance.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void VP8LDelete(VP8LDecoder* const dec);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//------------------------------------------------------------------------------
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifdef __cplusplus
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}    // extern "C"
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /* WEBP_DEC_VP8LI_H_ */
133