1409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan/* 2409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Small jpeg decoder library (Internal header) 3409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 4409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Copyright (c) 2006, Luc Saillard <luc@saillard.org> 5409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Copyright (c) 2012 Intel Corporation. 6409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * All rights reserved. 7409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * Redistribution and use in source and binary forms, with or without 8409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * modification, are permitted provided that the following conditions are met: 9409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 10409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * - Redistributions of source code must retain the above copyright notice, 11409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * this list of conditions and the following disclaimer. 12409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 13409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * - Redistributions in binary form must reproduce the above copyright notice, 14409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * this list of conditions and the following disclaimer in the documentation 15409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * and/or other materials provided with the distribution. 16409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 17409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * - Neither the name of the author nor the names of its contributors may be 18409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * used to endorse or promote products derived from this software without 19409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * specific prior written permission. 20409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 21409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 25409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * POSSIBILITY OF SUCH DAMAGE. 32409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan * 33409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan */ 34409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 35409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 36409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#ifndef __TINYJPEG_INTERNAL_H_ 37409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#define __TINYJPEG_INTERNAL_H_ 38409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 39409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#include <setjmp.h> 40409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 41409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#define SANITY_CHECK 1 42409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 43409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstruct jdec_private; 44409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 45409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#define HUFFMAN_BITS_SIZE 256 46409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 47409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#define HUFFMAN_TABLES 4 48409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#define COMPONENTS 4 49409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#define JPEG_MAX_WIDTH 2048 50409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#define JPEG_MAX_HEIGHT 2048 517d9a3d51091eff4c2c32653ad011ecae99dad4feAustin Yuan#define JPEG_SCAN_MAX 4 52409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 53409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanenum std_markers { 54409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan DQT = 0xDB, /* Define Quantization Table */ 55409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan SOF = 0xC0, /* Start of Frame (size information) */ 56409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan DHT = 0xC4, /* Huffman Table */ 57409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan SOI = 0xD8, /* Start of Image */ 58409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan SOS = 0xDA, /* Start of Scan */ 59409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan RST = 0xD0, /* Reset Marker d0 -> .. */ 60409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan RST7 = 0xD7, /* Reset Marker .. -> d7 */ 61409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan EOI = 0xD9, /* End of Image */ 62409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan DRI = 0xDD, /* Define Restart Interval */ 63409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan APP0 = 0xE0, 64409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}; 65409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 66409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 67409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstruct huffman_table 68409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 69409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan /*bits and values*/ 70409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char bits[16]; 71409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char values[256]; 72409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}; 73409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 74409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstruct component 75409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 76409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int Hfactor; 77409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int Vfactor; 78409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char quant_table_index; 79409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int cid; 80409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}; 81409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 82409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 83409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuantypedef void (*decode_MCU_fct) (struct jdec_private *priv); 84409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuantypedef void (*convert_colorspace_fct) (struct jdec_private *priv); 85409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 86409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstruct jpeg_sos 87409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 88409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int nr_components; 89409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan struct { 90409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int component_id; 91409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int dc_selector; 92409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int ac_selector; 93409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan }components[4]; 94409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}; 95409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 96409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuanstruct jdec_private 97409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan{ 98409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan /* Public variables */ 997d9a3d51091eff4c2c32653ad011ecae99dad4feAustin Yuan unsigned int width[JPEG_SCAN_MAX], height[JPEG_SCAN_MAX]; /* Size of the image */ 100409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 101409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan /* Private variables */ 1027d9a3d51091eff4c2c32653ad011ecae99dad4feAustin Yuan const unsigned char *stream_begin, *stream_end,*stream_scan; 103409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int stream_length; 104409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 105409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan const unsigned char *stream; /* Pointer to the current stream */ 106409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 107409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan struct component component_infos[COMPONENTS]; 108409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned int nf_components; 109409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char Q_tables[COMPONENTS][64]; /* quantization tables, zigzag*/ 110409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char Q_tables_valid[COMPONENTS]; 111409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan struct huffman_table HTDC[HUFFMAN_TABLES]; /* DC huffman tables */ 112409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char HTDC_valid[HUFFMAN_TABLES]; 113409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan struct huffman_table HTAC[HUFFMAN_TABLES]; /* AC huffman tables */ 114409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan unsigned char HTAC_valid[HUFFMAN_TABLES]; 115409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan struct jpeg_sos cur_sos; /* current sos values*/ 116409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan int default_huffman_table_initialized; 117409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan int restart_interval; 118409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan}; 119409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 120409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan#endif 121409de6acb4473c973ed2532e340831dc582e5e0eAustin Yuan 122