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