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