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