~ppsspp/ppsspp/ppsspp_1.3.0

« back to all changes in this revision

Viewing changes to ext/native/ext/jpge/jpgd.cpp

  • Committer: Sérgio Benjamim
  • Date: 2017-01-02 00:12:05 UTC
  • Revision ID: sergio_br2@yahoo.com.br-20170102001205-cxbta9za203nmjwm
1.3.0 source (from ppsspp_1.3.0-r160.p5.l1762.a165.t83~56~ubuntu16.04.1.tar.xz).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// jpgd.cpp - C++ class for JPEG decompression.
 
2
// Public domain, Rich Geldreich <richgel99@gmail.com>
 
3
// Alex Evans: Linear memory allocator (taken from jpge.h).
 
4
// v1.04, May. 19, 2012: Code tweaks to fix VS2008 static code analysis warnings (all looked harmless)
 
5
//
 
6
// Supports progressive and baseline sequential JPEG image files, and the most common chroma subsampling factors: Y, H1V1, H2V1, H1V2, and H2V2.
 
7
//
 
8
// Chroma upsampling quality: H2V2 is upsampled in the frequency domain, H2V1 and H1V2 are upsampled using point sampling.
 
9
// Chroma upsampling reference: "Fast Scheme for Image Size Change in the Compressed Domain"
 
10
// http://vision.ai.uiuc.edu/~dugad/research/dct/index.html
 
11
 
 
12
#include "jpgd.h"
 
13
#include <string.h>
 
14
 
 
15
#include <assert.h>
 
16
#define JPGD_ASSERT(x) assert(x)
 
17
 
 
18
#ifdef _MSC_VER
 
19
#pragma warning (disable : 4611) // warning C4611: interaction between '_setjmp' and C++ object destruction is non-portable
 
20
#endif
 
21
 
 
22
// Set to 1 to enable freq. domain chroma upsampling on images using H2V2 subsampling (0=faster nearest neighbor sampling).
 
23
// This is slower, but results in higher quality on images with highly saturated colors.
 
24
#define JPGD_SUPPORT_FREQ_DOMAIN_UPSAMPLING 1
 
25
 
 
26
#define JPGD_TRUE (1)
 
27
#define JPGD_FALSE (0)
 
28
 
 
29
#define JPGD_MAX(a,b) (((a)>(b)) ? (a) : (b))
 
30
#define JPGD_MIN(a,b) (((a)<(b)) ? (a) : (b))
 
31
 
 
32
namespace jpgd {
 
33
 
 
34
static inline void *jpgd_malloc(size_t nSize) { return malloc(nSize); }
 
35
static inline void jpgd_free(void *p) { free(p); }
 
36
 
 
37
// DCT coefficients are stored in this sequence.
 
38
static int g_ZAG[64] = {  0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 };
 
39
 
 
40
enum JPEG_MARKER
 
41
{
 
42
  M_SOF0  = 0xC0, M_SOF1  = 0xC1, M_SOF2  = 0xC2, M_SOF3  = 0xC3, M_SOF5  = 0xC5, M_SOF6  = 0xC6, M_SOF7  = 0xC7, M_JPG   = 0xC8,
 
43
  M_SOF9  = 0xC9, M_SOF10 = 0xCA, M_SOF11 = 0xCB, M_SOF13 = 0xCD, M_SOF14 = 0xCE, M_SOF15 = 0xCF, M_DHT   = 0xC4, M_DAC   = 0xCC,
 
44
  M_RST0  = 0xD0, M_RST1  = 0xD1, M_RST2  = 0xD2, M_RST3  = 0xD3, M_RST4  = 0xD4, M_RST5  = 0xD5, M_RST6  = 0xD6, M_RST7  = 0xD7,
 
45
  M_SOI   = 0xD8, M_EOI   = 0xD9, M_SOS   = 0xDA, M_DQT   = 0xDB, M_DNL   = 0xDC, M_DRI   = 0xDD, M_DHP   = 0xDE, M_EXP   = 0xDF,
 
46
  M_APP0  = 0xE0, M_APP15 = 0xEF, M_JPG0  = 0xF0, M_JPG13 = 0xFD, M_COM   = 0xFE, M_TEM   = 0x01, M_ERROR = 0x100, RST0   = 0xD0
 
47
};
 
48
 
 
49
enum JPEG_SUBSAMPLING { JPGD_GRAYSCALE = 0, JPGD_YH1V1, JPGD_YH2V1, JPGD_YH1V2, JPGD_YH2V2 };
 
50
 
 
51
#define CONST_BITS  13
 
52
#define PASS1_BITS  2
 
53
#define SCALEDONE ((int32)1)
 
54
 
 
55
#define FIX_0_298631336  ((int32)2446)        /* FIX(0.298631336) */
 
56
#define FIX_0_390180644  ((int32)3196)        /* FIX(0.390180644) */
 
57
#define FIX_0_541196100  ((int32)4433)        /* FIX(0.541196100) */
 
58
#define FIX_0_765366865  ((int32)6270)        /* FIX(0.765366865) */
 
59
#define FIX_0_899976223  ((int32)7373)        /* FIX(0.899976223) */
 
60
#define FIX_1_175875602  ((int32)9633)        /* FIX(1.175875602) */
 
61
#define FIX_1_501321110  ((int32)12299)       /* FIX(1.501321110) */
 
62
#define FIX_1_847759065  ((int32)15137)       /* FIX(1.847759065) */
 
63
#define FIX_1_961570560  ((int32)16069)       /* FIX(1.961570560) */
 
64
#define FIX_2_053119869  ((int32)16819)       /* FIX(2.053119869) */
 
65
#define FIX_2_562915447  ((int32)20995)       /* FIX(2.562915447) */
 
66
#define FIX_3_072711026  ((int32)25172)       /* FIX(3.072711026) */
 
67
 
 
68
#define DESCALE(x,n)  (((x) + (SCALEDONE << ((n)-1))) >> (n))
 
69
#define DESCALE_ZEROSHIFT(x,n)  (((x) + (128 << (n)) + (SCALEDONE << ((n)-1))) >> (n))
 
70
 
 
71
#define MULTIPLY(var, cnst)  ((var) * (cnst))
 
72
 
 
73
#define CLAMP(i) ((static_cast<uint>(i) > 255) ? (((~i) >> 31) & 0xFF) : (i))
 
74
 
 
75
// Compiler creates a fast path 1D IDCT for X non-zero columns
 
76
template <int NONZERO_COLS>
 
77
struct Row
 
78
{
 
79
  static void idct(int* pTemp, const jpgd_block_t* pSrc)
 
80
  {
 
81
    // ACCESS_COL() will be optimized at compile time to either an array access, or 0.
 
82
    #define ACCESS_COL(x) (((x) < NONZERO_COLS) ? (int)pSrc[x] : 0)
 
83
 
 
84
    const int z2 = ACCESS_COL(2), z3 = ACCESS_COL(6);
 
85
 
 
86
    const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
 
87
    const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
 
88
    const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
 
89
 
 
90
    const int tmp0 = (ACCESS_COL(0) + ACCESS_COL(4)) << CONST_BITS;
 
91
    const int tmp1 = (ACCESS_COL(0) - ACCESS_COL(4)) << CONST_BITS;
 
92
 
 
93
    const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2;
 
94
 
 
95
    const int atmp0 = ACCESS_COL(7), atmp1 = ACCESS_COL(5), atmp2 = ACCESS_COL(3), atmp3 = ACCESS_COL(1);
 
96
 
 
97
    const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3;
 
98
    const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602);
 
99
 
 
100
    const int az1 = MULTIPLY(bz1, - FIX_0_899976223);
 
101
    const int az2 = MULTIPLY(bz2, - FIX_2_562915447);
 
102
    const int az3 = MULTIPLY(bz3, - FIX_1_961570560) + bz5;
 
103
    const int az4 = MULTIPLY(bz4, - FIX_0_390180644) + bz5;
 
104
 
 
105
    const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3;
 
106
    const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4;
 
107
    const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3;
 
108
    const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4;
 
109
 
 
110
    pTemp[0] = DESCALE(tmp10 + btmp3, CONST_BITS-PASS1_BITS);
 
111
    pTemp[7] = DESCALE(tmp10 - btmp3, CONST_BITS-PASS1_BITS);
 
112
    pTemp[1] = DESCALE(tmp11 + btmp2, CONST_BITS-PASS1_BITS);
 
113
    pTemp[6] = DESCALE(tmp11 - btmp2, CONST_BITS-PASS1_BITS);
 
114
    pTemp[2] = DESCALE(tmp12 + btmp1, CONST_BITS-PASS1_BITS);
 
115
    pTemp[5] = DESCALE(tmp12 - btmp1, CONST_BITS-PASS1_BITS);
 
116
    pTemp[3] = DESCALE(tmp13 + btmp0, CONST_BITS-PASS1_BITS);
 
117
    pTemp[4] = DESCALE(tmp13 - btmp0, CONST_BITS-PASS1_BITS);
 
118
  }
 
119
};
 
120
 
 
121
template <>
 
122
struct Row<0>
 
123
{
 
124
  static void idct(int* pTemp, const jpgd_block_t* pSrc)
 
125
  {
 
126
#ifdef _MSC_VER
 
127
    pTemp; pSrc;
 
128
#endif
 
129
  }
 
130
};
 
131
 
 
132
template <>
 
133
struct Row<1>
 
134
{
 
135
  static void idct(int* pTemp, const jpgd_block_t* pSrc)
 
136
  {
 
137
    const int dcval = (pSrc[0] << PASS1_BITS);
 
138
 
 
139
    pTemp[0] = dcval;
 
140
    pTemp[1] = dcval;
 
141
    pTemp[2] = dcval;
 
142
    pTemp[3] = dcval;
 
143
    pTemp[4] = dcval;
 
144
    pTemp[5] = dcval;
 
145
    pTemp[6] = dcval;
 
146
    pTemp[7] = dcval;
 
147
  }
 
148
};
 
149
 
 
150
// Compiler creates a fast path 1D IDCT for X non-zero rows
 
151
template <int NONZERO_ROWS>
 
152
struct Col
 
153
{
 
154
  static void idct(uint8* pDst_ptr, const int* pTemp)
 
155
  {
 
156
    // ACCESS_ROW() will be optimized at compile time to either an array access, or 0.
 
157
    #define ACCESS_ROW(x) (((x) < NONZERO_ROWS) ? pTemp[x * 8] : 0)
 
158
 
 
159
    const int z2 = ACCESS_ROW(2);
 
160
    const int z3 = ACCESS_ROW(6);
 
161
 
 
162
    const int z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
 
163
    const int tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
 
164
    const int tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
 
165
 
 
166
    const int tmp0 = (ACCESS_ROW(0) + ACCESS_ROW(4)) << CONST_BITS;
 
167
    const int tmp1 = (ACCESS_ROW(0) - ACCESS_ROW(4)) << CONST_BITS;
 
168
 
 
169
    const int tmp10 = tmp0 + tmp3, tmp13 = tmp0 - tmp3, tmp11 = tmp1 + tmp2, tmp12 = tmp1 - tmp2;
 
170
 
 
171
    const int atmp0 = ACCESS_ROW(7), atmp1 = ACCESS_ROW(5), atmp2 = ACCESS_ROW(3), atmp3 = ACCESS_ROW(1);
 
172
 
 
173
    const int bz1 = atmp0 + atmp3, bz2 = atmp1 + atmp2, bz3 = atmp0 + atmp2, bz4 = atmp1 + atmp3;
 
174
    const int bz5 = MULTIPLY(bz3 + bz4, FIX_1_175875602);
 
175
 
 
176
    const int az1 = MULTIPLY(bz1, - FIX_0_899976223);
 
177
    const int az2 = MULTIPLY(bz2, - FIX_2_562915447);
 
178
    const int az3 = MULTIPLY(bz3, - FIX_1_961570560) + bz5;
 
179
    const int az4 = MULTIPLY(bz4, - FIX_0_390180644) + bz5;
 
180
 
 
181
    const int btmp0 = MULTIPLY(atmp0, FIX_0_298631336) + az1 + az3;
 
182
    const int btmp1 = MULTIPLY(atmp1, FIX_2_053119869) + az2 + az4;
 
183
    const int btmp2 = MULTIPLY(atmp2, FIX_3_072711026) + az2 + az3;
 
184
    const int btmp3 = MULTIPLY(atmp3, FIX_1_501321110) + az1 + az4;
 
185
 
 
186
    int i = DESCALE_ZEROSHIFT(tmp10 + btmp3, CONST_BITS+PASS1_BITS+3);
 
187
    pDst_ptr[8*0] = (uint8)CLAMP(i);
 
188
 
 
189
    i = DESCALE_ZEROSHIFT(tmp10 - btmp3, CONST_BITS+PASS1_BITS+3);
 
190
    pDst_ptr[8*7] = (uint8)CLAMP(i);
 
191
 
 
192
    i = DESCALE_ZEROSHIFT(tmp11 + btmp2, CONST_BITS+PASS1_BITS+3);
 
193
    pDst_ptr[8*1] = (uint8)CLAMP(i);
 
194
 
 
195
    i = DESCALE_ZEROSHIFT(tmp11 - btmp2, CONST_BITS+PASS1_BITS+3);
 
196
    pDst_ptr[8*6] = (uint8)CLAMP(i);
 
197
 
 
198
    i = DESCALE_ZEROSHIFT(tmp12 + btmp1, CONST_BITS+PASS1_BITS+3);
 
199
    pDst_ptr[8*2] = (uint8)CLAMP(i);
 
200
 
 
201
    i = DESCALE_ZEROSHIFT(tmp12 - btmp1, CONST_BITS+PASS1_BITS+3);
 
202
    pDst_ptr[8*5] = (uint8)CLAMP(i);
 
203
 
 
204
    i = DESCALE_ZEROSHIFT(tmp13 + btmp0, CONST_BITS+PASS1_BITS+3);
 
205
    pDst_ptr[8*3] = (uint8)CLAMP(i);
 
206
 
 
207
    i = DESCALE_ZEROSHIFT(tmp13 - btmp0, CONST_BITS+PASS1_BITS+3);
 
208
    pDst_ptr[8*4] = (uint8)CLAMP(i);
 
209
  }
 
210
};
 
211
 
 
212
template <>
 
213
struct Col<1>
 
214
{
 
215
  static void idct(uint8* pDst_ptr, const int* pTemp)
 
216
  {
 
217
    int dcval = DESCALE_ZEROSHIFT(pTemp[0], PASS1_BITS+3);
 
218
    const uint8 dcval_clamped = (uint8)CLAMP(dcval);
 
219
    pDst_ptr[0*8] = dcval_clamped;
 
220
    pDst_ptr[1*8] = dcval_clamped;
 
221
    pDst_ptr[2*8] = dcval_clamped;
 
222
    pDst_ptr[3*8] = dcval_clamped;
 
223
    pDst_ptr[4*8] = dcval_clamped;
 
224
    pDst_ptr[5*8] = dcval_clamped;
 
225
    pDst_ptr[6*8] = dcval_clamped;
 
226
    pDst_ptr[7*8] = dcval_clamped;
 
227
  }
 
228
};
 
229
 
 
230
static const uint8 s_idct_row_table[] =
 
231
{
 
232
  1,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0, 2,1,0,0,0,0,0,0, 2,1,1,0,0,0,0,0, 2,2,1,0,0,0,0,0, 3,2,1,0,0,0,0,0, 4,2,1,0,0,0,0,0, 4,3,1,0,0,0,0,0,
 
233
  4,3,2,0,0,0,0,0, 4,3,2,1,0,0,0,0, 4,3,2,1,1,0,0,0, 4,3,2,2,1,0,0,0, 4,3,3,2,1,0,0,0, 4,4,3,2,1,0,0,0, 5,4,3,2,1,0,0,0, 6,4,3,2,1,0,0,0,
 
234
  6,5,3,2,1,0,0,0, 6,5,4,2,1,0,0,0, 6,5,4,3,1,0,0,0, 6,5,4,3,2,0,0,0, 6,5,4,3,2,1,0,0, 6,5,4,3,2,1,1,0, 6,5,4,3,2,2,1,0, 6,5,4,3,3,2,1,0,
 
235
  6,5,4,4,3,2,1,0, 6,5,5,4,3,2,1,0, 6,6,5,4,3,2,1,0, 7,6,5,4,3,2,1,0, 8,6,5,4,3,2,1,0, 8,7,5,4,3,2,1,0, 8,7,6,4,3,2,1,0, 8,7,6,5,3,2,1,0,
 
236
  8,7,6,5,4,2,1,0, 8,7,6,5,4,3,1,0, 8,7,6,5,4,3,2,0, 8,7,6,5,4,3,2,1, 8,7,6,5,4,3,2,2, 8,7,6,5,4,3,3,2, 8,7,6,5,4,4,3,2, 8,7,6,5,5,4,3,2,
 
237
  8,7,6,6,5,4,3,2, 8,7,7,6,5,4,3,2, 8,8,7,6,5,4,3,2, 8,8,8,6,5,4,3,2, 8,8,8,7,5,4,3,2, 8,8,8,7,6,4,3,2, 8,8,8,7,6,5,3,2, 8,8,8,7,6,5,4,2,
 
238
  8,8,8,7,6,5,4,3, 8,8,8,7,6,5,4,4, 8,8,8,7,6,5,5,4, 8,8,8,7,6,6,5,4, 8,8,8,7,7,6,5,4, 8,8,8,8,7,6,5,4, 8,8,8,8,8,6,5,4, 8,8,8,8,8,7,5,4,
 
239
  8,8,8,8,8,7,6,4, 8,8,8,8,8,7,6,5, 8,8,8,8,8,7,6,6, 8,8,8,8,8,7,7,6, 8,8,8,8,8,8,7,6, 8,8,8,8,8,8,8,6, 8,8,8,8,8,8,8,7, 8,8,8,8,8,8,8,8,
 
240
};
 
241
 
 
242
static const uint8 s_idct_col_table[] = { 1, 1, 2, 3, 3, 3, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 };
 
243
 
 
244
void idct(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr, int block_max_zag)
 
245
{
 
246
  JPGD_ASSERT(block_max_zag >= 1);
 
247
  JPGD_ASSERT(block_max_zag <= 64);
 
248
 
 
249
  if (block_max_zag <= 1)
 
250
  {
 
251
    int k = ((pSrc_ptr[0] + 4) >> 3) + 128;
 
252
    k = CLAMP(k);
 
253
    k = k | (k<<8);
 
254
    k = k | (k<<16);
 
255
 
 
256
    for (int i = 8; i > 0; i--)
 
257
    {
 
258
      *(int*)&pDst_ptr[0] = k;
 
259
      *(int*)&pDst_ptr[4] = k;
 
260
      pDst_ptr += 8;
 
261
    }
 
262
    return;
 
263
  }
 
264
 
 
265
  int temp[64];
 
266
 
 
267
  const jpgd_block_t* pSrc = pSrc_ptr;
 
268
  int* pTemp = temp;
 
269
 
 
270
  const uint8* pRow_tab = &s_idct_row_table[(block_max_zag - 1) * 8];
 
271
  int i;
 
272
  for (i = 8; i > 0; i--, pRow_tab++)
 
273
  {
 
274
    switch (*pRow_tab)
 
275
    {
 
276
      case 0: Row<0>::idct(pTemp, pSrc); break;
 
277
      case 1: Row<1>::idct(pTemp, pSrc); break;
 
278
      case 2: Row<2>::idct(pTemp, pSrc); break;
 
279
      case 3: Row<3>::idct(pTemp, pSrc); break;
 
280
      case 4: Row<4>::idct(pTemp, pSrc); break;
 
281
      case 5: Row<5>::idct(pTemp, pSrc); break;
 
282
      case 6: Row<6>::idct(pTemp, pSrc); break;
 
283
      case 7: Row<7>::idct(pTemp, pSrc); break;
 
284
      case 8: Row<8>::idct(pTemp, pSrc); break;
 
285
    }
 
286
 
 
287
    pSrc += 8;
 
288
    pTemp += 8;
 
289
  }
 
290
 
 
291
  pTemp = temp;
 
292
 
 
293
  const int nonzero_rows = s_idct_col_table[block_max_zag - 1];
 
294
  for (i = 8; i > 0; i--)
 
295
  {
 
296
    switch (nonzero_rows)
 
297
    {
 
298
      case 1: Col<1>::idct(pDst_ptr, pTemp); break;
 
299
      case 2: Col<2>::idct(pDst_ptr, pTemp); break;
 
300
      case 3: Col<3>::idct(pDst_ptr, pTemp); break;
 
301
      case 4: Col<4>::idct(pDst_ptr, pTemp); break;
 
302
      case 5: Col<5>::idct(pDst_ptr, pTemp); break;
 
303
      case 6: Col<6>::idct(pDst_ptr, pTemp); break;
 
304
      case 7: Col<7>::idct(pDst_ptr, pTemp); break;
 
305
      case 8: Col<8>::idct(pDst_ptr, pTemp); break;
 
306
    }
 
307
 
 
308
    pTemp++;
 
309
    pDst_ptr++;
 
310
  }
 
311
}
 
312
 
 
313
void idct_4x4(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr)
 
314
{
 
315
  int temp[64];
 
316
  int* pTemp = temp;
 
317
  const jpgd_block_t* pSrc = pSrc_ptr;
 
318
 
 
319
  for (int i = 4; i > 0; i--)
 
320
  {
 
321
    Row<4>::idct(pTemp, pSrc);
 
322
    pSrc += 8;
 
323
    pTemp += 8;
 
324
  }
 
325
 
 
326
  pTemp = temp;
 
327
  for (int i = 8; i > 0; i--)
 
328
  {
 
329
    Col<4>::idct(pDst_ptr, pTemp);
 
330
    pTemp++;
 
331
    pDst_ptr++;
 
332
  }
 
333
}
 
334
 
 
335
// Retrieve one character from the input stream.
 
336
inline uint jpeg_decoder::get_char()
 
337
{
 
338
  // Any bytes remaining in buffer?
 
339
  if (!m_in_buf_left)
 
340
  {
 
341
    // Try to get more bytes.
 
342
    prep_in_buffer();
 
343
    // Still nothing to get?
 
344
    if (!m_in_buf_left)
 
345
    {
 
346
      // Pad the end of the stream with 0xFF 0xD9 (EOI marker)
 
347
      int t = m_tem_flag;
 
348
      m_tem_flag ^= 1;
 
349
      if (t)
 
350
        return 0xD9;
 
351
      else
 
352
        return 0xFF;
 
353
    }
 
354
  }
 
355
 
 
356
  uint c = *m_pIn_buf_ofs++;
 
357
  m_in_buf_left--;
 
358
 
 
359
  return c;
 
360
}
 
361
 
 
362
// Same as previous method, except can indicate if the character is a pad character or not.
 
363
inline uint jpeg_decoder::get_char(bool *pPadding_flag)
 
364
{
 
365
  if (!m_in_buf_left)
 
366
  {
 
367
    prep_in_buffer();
 
368
    if (!m_in_buf_left)
 
369
    {
 
370
      *pPadding_flag = true;
 
371
      int t = m_tem_flag;
 
372
      m_tem_flag ^= 1;
 
373
      if (t)
 
374
        return 0xD9;
 
375
      else
 
376
        return 0xFF;
 
377
    }
 
378
  }
 
379
 
 
380
  *pPadding_flag = false;
 
381
 
 
382
  uint c = *m_pIn_buf_ofs++;
 
383
  m_in_buf_left--;
 
384
 
 
385
  return c;
 
386
}
 
387
 
 
388
// Inserts a previously retrieved character back into the input buffer.
 
389
inline void jpeg_decoder::stuff_char(uint8 q)
 
390
{
 
391
  *(--m_pIn_buf_ofs) = q;
 
392
  m_in_buf_left++;
 
393
}
 
394
 
 
395
// Retrieves one character from the input stream, but does not read past markers. Will continue to return 0xFF when a marker is encountered.
 
396
inline uint8 jpeg_decoder::get_octet()
 
397
{
 
398
  bool padding_flag;
 
399
  int c = get_char(&padding_flag);
 
400
 
 
401
  if (c == 0xFF)
 
402
  {
 
403
    if (padding_flag)
 
404
      return 0xFF;
 
405
 
 
406
    c = get_char(&padding_flag);
 
407
    if (padding_flag)
 
408
    {
 
409
      stuff_char(0xFF);
 
410
      return 0xFF;
 
411
    }
 
412
 
 
413
    if (c == 0x00)
 
414
      return 0xFF;
 
415
    else
 
416
    {
 
417
      stuff_char(static_cast<uint8>(c));
 
418
      stuff_char(0xFF);
 
419
      return 0xFF;
 
420
    }
 
421
  }
 
422
 
 
423
  return static_cast<uint8>(c);
 
424
}
 
425
 
 
426
// Retrieves a variable number of bits from the input stream. Does not recognize markers.
 
427
inline uint jpeg_decoder::get_bits(int num_bits)
 
428
{
 
429
  if (!num_bits)
 
430
    return 0;
 
431
 
 
432
  uint i = m_bit_buf >> (32 - num_bits);
 
433
 
 
434
  if ((m_bits_left -= num_bits) <= 0)
 
435
  {
 
436
    m_bit_buf <<= (num_bits += m_bits_left);
 
437
 
 
438
    uint c1 = get_char();
 
439
    uint c2 = get_char();
 
440
    m_bit_buf = (m_bit_buf & 0xFFFF0000) | (c1 << 8) | c2;
 
441
 
 
442
    m_bit_buf <<= -m_bits_left;
 
443
 
 
444
    m_bits_left += 16;
 
445
 
 
446
    JPGD_ASSERT(m_bits_left >= 0);
 
447
  }
 
448
  else
 
449
    m_bit_buf <<= num_bits;
 
450
 
 
451
  return i;
 
452
}
 
453
 
 
454
// Retrieves a variable number of bits from the input stream. Markers will not be read into the input bit buffer. Instead, an infinite number of all 1's will be returned when a marker is encountered.
 
455
inline uint jpeg_decoder::get_bits_no_markers(int num_bits)
 
456
{
 
457
  if (!num_bits)
 
458
    return 0;
 
459
 
 
460
  uint i = m_bit_buf >> (32 - num_bits);
 
461
 
 
462
  if ((m_bits_left -= num_bits) <= 0)
 
463
  {
 
464
    m_bit_buf <<= (num_bits += m_bits_left);
 
465
 
 
466
    if ((m_in_buf_left < 2) || (m_pIn_buf_ofs[0] == 0xFF) || (m_pIn_buf_ofs[1] == 0xFF))
 
467
    {
 
468
      uint c1 = get_octet();
 
469
      uint c2 = get_octet();
 
470
      m_bit_buf |= (c1 << 8) | c2;
 
471
    }
 
472
    else
 
473
    {
 
474
      m_bit_buf |= ((uint)m_pIn_buf_ofs[0] << 8) | m_pIn_buf_ofs[1];
 
475
      m_in_buf_left -= 2;
 
476
      m_pIn_buf_ofs += 2;
 
477
    }
 
478
 
 
479
    m_bit_buf <<= -m_bits_left;
 
480
 
 
481
    m_bits_left += 16;
 
482
 
 
483
    JPGD_ASSERT(m_bits_left >= 0);
 
484
  }
 
485
  else
 
486
    m_bit_buf <<= num_bits;
 
487
 
 
488
  return i;
 
489
}
 
490
 
 
491
// Decodes a Huffman encoded symbol.
 
492
inline int jpeg_decoder::huff_decode(huff_tables *pH)
 
493
{
 
494
  int symbol;
 
495
 
 
496
  // Check first 8-bits: do we have a complete symbol?
 
497
  if ((symbol = pH->look_up[m_bit_buf >> 24]) < 0)
 
498
  {
 
499
    // Decode more bits, use a tree traversal to find symbol.
 
500
    int ofs = 23;
 
501
    do
 
502
    {
 
503
      symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))];
 
504
      ofs--;
 
505
    } while (symbol < 0);
 
506
 
 
507
    get_bits_no_markers(8 + (23 - ofs));
 
508
  }
 
509
  else
 
510
    get_bits_no_markers(pH->code_size[symbol]);
 
511
 
 
512
  return symbol;
 
513
}
 
514
 
 
515
// Decodes a Huffman encoded symbol.
 
516
inline int jpeg_decoder::huff_decode(huff_tables *pH, int& extra_bits)
 
517
{
 
518
  int symbol;
 
519
 
 
520
  // Check first 8-bits: do we have a complete symbol?
 
521
  if ((symbol = pH->look_up2[m_bit_buf >> 24]) < 0)
 
522
  {
 
523
    // Use a tree traversal to find symbol.
 
524
    int ofs = 23;
 
525
    do
 
526
    {
 
527
      symbol = pH->tree[-(int)(symbol + ((m_bit_buf >> ofs) & 1))];
 
528
      ofs--;
 
529
    } while (symbol < 0);
 
530
 
 
531
    get_bits_no_markers(8 + (23 - ofs));
 
532
 
 
533
    extra_bits = get_bits_no_markers(symbol & 0xF);
 
534
  }
 
535
  else
 
536
  {
 
537
    JPGD_ASSERT(((symbol >> 8) & 31) == pH->code_size[symbol & 255] + ((symbol & 0x8000) ? (symbol & 15) : 0));
 
538
 
 
539
    if (symbol & 0x8000)
 
540
    {
 
541
      get_bits_no_markers((symbol >> 8) & 31);
 
542
      extra_bits = symbol >> 16;
 
543
    }
 
544
    else
 
545
    {
 
546
      int code_size = (symbol >> 8) & 31;
 
547
      int num_extra_bits = symbol & 0xF;
 
548
      int bits = code_size + num_extra_bits;
 
549
      if (bits <= (m_bits_left + 16))
 
550
        extra_bits = get_bits_no_markers(bits) & ((1 << num_extra_bits) - 1);
 
551
      else
 
552
      {
 
553
        get_bits_no_markers(code_size);
 
554
        extra_bits = get_bits_no_markers(num_extra_bits);
 
555
      }
 
556
    }
 
557
 
 
558
    symbol &= 0xFF;
 
559
  }
 
560
 
 
561
  return symbol;
 
562
}
 
563
 
 
564
// Tables and macro used to fully decode the DPCM differences.
 
565
static const int s_extend_test[16] = { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 };
 
566
static const int s_extend_offset[16] = { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 };
 
567
//static const int s_extend_mask[] = { 0, (1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7), (1<<8), (1<<9), (1<<10), (1<<11), (1<<12), (1<<13), (1<<14), (1<<15), (1<<16) };
 
568
// The logical AND's in this macro are to shut up static code analysis (aren't really necessary - couldn't find another way to do this)
 
569
#define JPGD_HUFF_EXTEND(x, s) (((x) < s_extend_test[s & 15]) ? ((x) + s_extend_offset[s & 15]) : (x))
 
570
 
 
571
// Clamps a value between 0-255.
 
572
inline uint8 jpeg_decoder::clamp(int i)
 
573
{
 
574
  if (static_cast<uint>(i) > 255)
 
575
    i = (((~i) >> 31) & 0xFF);
 
576
 
 
577
  return static_cast<uint8>(i);
 
578
}
 
579
 
 
580
namespace DCT_Upsample
 
581
{
 
582
  struct Matrix44
 
583
  {
 
584
    typedef int Element_Type;
 
585
    enum { NUM_ROWS = 4, NUM_COLS = 4 };
 
586
 
 
587
    Element_Type v[NUM_ROWS][NUM_COLS];
 
588
 
 
589
    inline int rows() const { return NUM_ROWS; }
 
590
    inline int cols() const { return NUM_COLS; }
 
591
 
 
592
    inline const Element_Type & at(int r, int c) const { return v[r][c]; }
 
593
    inline       Element_Type & at(int r, int c)       { return v[r][c]; }
 
594
 
 
595
    inline Matrix44() { }
 
596
 
 
597
    inline Matrix44& operator += (const Matrix44& a)
 
598
    {
 
599
      for (int r = 0; r < NUM_ROWS; r++)
 
600
      {
 
601
        at(r, 0) += a.at(r, 0);
 
602
        at(r, 1) += a.at(r, 1);
 
603
        at(r, 2) += a.at(r, 2);
 
604
        at(r, 3) += a.at(r, 3);
 
605
      }
 
606
      return *this;
 
607
    }
 
608
 
 
609
    inline Matrix44& operator -= (const Matrix44& a)
 
610
    {
 
611
      for (int r = 0; r < NUM_ROWS; r++)
 
612
      {
 
613
        at(r, 0) -= a.at(r, 0);
 
614
        at(r, 1) -= a.at(r, 1);
 
615
        at(r, 2) -= a.at(r, 2);
 
616
        at(r, 3) -= a.at(r, 3);
 
617
      }
 
618
      return *this;
 
619
    }
 
620
 
 
621
    friend inline Matrix44 operator + (const Matrix44& a, const Matrix44& b)
 
622
    {
 
623
      Matrix44 ret;
 
624
      for (int r = 0; r < NUM_ROWS; r++)
 
625
      {
 
626
        ret.at(r, 0) = a.at(r, 0) + b.at(r, 0);
 
627
        ret.at(r, 1) = a.at(r, 1) + b.at(r, 1);
 
628
        ret.at(r, 2) = a.at(r, 2) + b.at(r, 2);
 
629
        ret.at(r, 3) = a.at(r, 3) + b.at(r, 3);
 
630
      }
 
631
      return ret;
 
632
    }
 
633
 
 
634
    friend inline Matrix44 operator - (const Matrix44& a, const Matrix44& b)
 
635
    {
 
636
      Matrix44 ret;
 
637
      for (int r = 0; r < NUM_ROWS; r++)
 
638
      {
 
639
        ret.at(r, 0) = a.at(r, 0) - b.at(r, 0);
 
640
        ret.at(r, 1) = a.at(r, 1) - b.at(r, 1);
 
641
        ret.at(r, 2) = a.at(r, 2) - b.at(r, 2);
 
642
        ret.at(r, 3) = a.at(r, 3) - b.at(r, 3);
 
643
      }
 
644
      return ret;
 
645
    }
 
646
 
 
647
    static inline void add_and_store(jpgd_block_t* pDst, const Matrix44& a, const Matrix44& b)
 
648
    {
 
649
      for (int r = 0; r < 4; r++)
 
650
      {
 
651
        pDst[0*8 + r] = static_cast<jpgd_block_t>(a.at(r, 0) + b.at(r, 0));
 
652
        pDst[1*8 + r] = static_cast<jpgd_block_t>(a.at(r, 1) + b.at(r, 1));
 
653
        pDst[2*8 + r] = static_cast<jpgd_block_t>(a.at(r, 2) + b.at(r, 2));
 
654
        pDst[3*8 + r] = static_cast<jpgd_block_t>(a.at(r, 3) + b.at(r, 3));
 
655
      }
 
656
    }
 
657
 
 
658
    static inline void sub_and_store(jpgd_block_t* pDst, const Matrix44& a, const Matrix44& b)
 
659
    {
 
660
      for (int r = 0; r < 4; r++)
 
661
      {
 
662
        pDst[0*8 + r] = static_cast<jpgd_block_t>(a.at(r, 0) - b.at(r, 0));
 
663
        pDst[1*8 + r] = static_cast<jpgd_block_t>(a.at(r, 1) - b.at(r, 1));
 
664
        pDst[2*8 + r] = static_cast<jpgd_block_t>(a.at(r, 2) - b.at(r, 2));
 
665
        pDst[3*8 + r] = static_cast<jpgd_block_t>(a.at(r, 3) - b.at(r, 3));
 
666
      }
 
667
    }
 
668
  };
 
669
 
 
670
  const int FRACT_BITS = 10;
 
671
  const int SCALE = 1 << FRACT_BITS;
 
672
 
 
673
  typedef int Temp_Type;
 
674
  #define D(i) (((i) + (SCALE >> 1)) >> FRACT_BITS)
 
675
  #define F(i) ((int)((i) * SCALE + .5f))
 
676
 
 
677
  // Any decent C++ compiler will optimize this at compile time to a 0, or an array access.
 
678
  #define AT(c, r) ((((c)>=NUM_COLS)||((r)>=NUM_ROWS)) ? 0 : pSrc[(c)+(r)*8])
 
679
 
 
680
  // NUM_ROWS/NUM_COLS = # of non-zero rows/cols in input matrix
 
681
  template<int NUM_ROWS, int NUM_COLS>
 
682
  struct P_Q
 
683
  {
 
684
    static void calc(Matrix44& P, Matrix44& Q, const jpgd_block_t* pSrc)
 
685
    {
 
686
      // 4x8 = 4x8 times 8x8, matrix 0 is constant
 
687
      const Temp_Type X000 = AT(0, 0);
 
688
      const Temp_Type X001 = AT(0, 1);
 
689
      const Temp_Type X002 = AT(0, 2);
 
690
      const Temp_Type X003 = AT(0, 3);
 
691
      const Temp_Type X004 = AT(0, 4);
 
692
      const Temp_Type X005 = AT(0, 5);
 
693
      const Temp_Type X006 = AT(0, 6);
 
694
      const Temp_Type X007 = AT(0, 7);
 
695
      const Temp_Type X010 = D(F(0.415735f) * AT(1, 0) + F(0.791065f) * AT(3, 0) + F(-0.352443f) * AT(5, 0) + F(0.277785f) * AT(7, 0));
 
696
      const Temp_Type X011 = D(F(0.415735f) * AT(1, 1) + F(0.791065f) * AT(3, 1) + F(-0.352443f) * AT(5, 1) + F(0.277785f) * AT(7, 1));
 
697
      const Temp_Type X012 = D(F(0.415735f) * AT(1, 2) + F(0.791065f) * AT(3, 2) + F(-0.352443f) * AT(5, 2) + F(0.277785f) * AT(7, 2));
 
698
      const Temp_Type X013 = D(F(0.415735f) * AT(1, 3) + F(0.791065f) * AT(3, 3) + F(-0.352443f) * AT(5, 3) + F(0.277785f) * AT(7, 3));
 
699
      const Temp_Type X014 = D(F(0.415735f) * AT(1, 4) + F(0.791065f) * AT(3, 4) + F(-0.352443f) * AT(5, 4) + F(0.277785f) * AT(7, 4));
 
700
      const Temp_Type X015 = D(F(0.415735f) * AT(1, 5) + F(0.791065f) * AT(3, 5) + F(-0.352443f) * AT(5, 5) + F(0.277785f) * AT(7, 5));
 
701
      const Temp_Type X016 = D(F(0.415735f) * AT(1, 6) + F(0.791065f) * AT(3, 6) + F(-0.352443f) * AT(5, 6) + F(0.277785f) * AT(7, 6));
 
702
      const Temp_Type X017 = D(F(0.415735f) * AT(1, 7) + F(0.791065f) * AT(3, 7) + F(-0.352443f) * AT(5, 7) + F(0.277785f) * AT(7, 7));
 
703
      const Temp_Type X020 = AT(4, 0);
 
704
      const Temp_Type X021 = AT(4, 1);
 
705
      const Temp_Type X022 = AT(4, 2);
 
706
      const Temp_Type X023 = AT(4, 3);
 
707
      const Temp_Type X024 = AT(4, 4);
 
708
      const Temp_Type X025 = AT(4, 5);
 
709
      const Temp_Type X026 = AT(4, 6);
 
710
      const Temp_Type X027 = AT(4, 7);
 
711
      const Temp_Type X030 = D(F(0.022887f) * AT(1, 0) + F(-0.097545f) * AT(3, 0) + F(0.490393f) * AT(5, 0) + F(0.865723f) * AT(7, 0));
 
712
      const Temp_Type X031 = D(F(0.022887f) * AT(1, 1) + F(-0.097545f) * AT(3, 1) + F(0.490393f) * AT(5, 1) + F(0.865723f) * AT(7, 1));
 
713
      const Temp_Type X032 = D(F(0.022887f) * AT(1, 2) + F(-0.097545f) * AT(3, 2) + F(0.490393f) * AT(5, 2) + F(0.865723f) * AT(7, 2));
 
714
      const Temp_Type X033 = D(F(0.022887f) * AT(1, 3) + F(-0.097545f) * AT(3, 3) + F(0.490393f) * AT(5, 3) + F(0.865723f) * AT(7, 3));
 
715
      const Temp_Type X034 = D(F(0.022887f) * AT(1, 4) + F(-0.097545f) * AT(3, 4) + F(0.490393f) * AT(5, 4) + F(0.865723f) * AT(7, 4));
 
716
      const Temp_Type X035 = D(F(0.022887f) * AT(1, 5) + F(-0.097545f) * AT(3, 5) + F(0.490393f) * AT(5, 5) + F(0.865723f) * AT(7, 5));
 
717
      const Temp_Type X036 = D(F(0.022887f) * AT(1, 6) + F(-0.097545f) * AT(3, 6) + F(0.490393f) * AT(5, 6) + F(0.865723f) * AT(7, 6));
 
718
      const Temp_Type X037 = D(F(0.022887f) * AT(1, 7) + F(-0.097545f) * AT(3, 7) + F(0.490393f) * AT(5, 7) + F(0.865723f) * AT(7, 7));
 
719
 
 
720
      // 4x4 = 4x8 times 8x4, matrix 1 is constant
 
721
      P.at(0, 0) = X000;
 
722
      P.at(0, 1) = D(X001 * F(0.415735f) + X003 * F(0.791065f) + X005 * F(-0.352443f) + X007 * F(0.277785f));
 
723
      P.at(0, 2) = X004;
 
724
      P.at(0, 3) = D(X001 * F(0.022887f) + X003 * F(-0.097545f) + X005 * F(0.490393f) + X007 * F(0.865723f));
 
725
      P.at(1, 0) = X010;
 
726
      P.at(1, 1) = D(X011 * F(0.415735f) + X013 * F(0.791065f) + X015 * F(-0.352443f) + X017 * F(0.277785f));
 
727
      P.at(1, 2) = X014;
 
728
      P.at(1, 3) = D(X011 * F(0.022887f) + X013 * F(-0.097545f) + X015 * F(0.490393f) + X017 * F(0.865723f));
 
729
      P.at(2, 0) = X020;
 
730
      P.at(2, 1) = D(X021 * F(0.415735f) + X023 * F(0.791065f) + X025 * F(-0.352443f) + X027 * F(0.277785f));
 
731
      P.at(2, 2) = X024;
 
732
      P.at(2, 3) = D(X021 * F(0.022887f) + X023 * F(-0.097545f) + X025 * F(0.490393f) + X027 * F(0.865723f));
 
733
      P.at(3, 0) = X030;
 
734
      P.at(3, 1) = D(X031 * F(0.415735f) + X033 * F(0.791065f) + X035 * F(-0.352443f) + X037 * F(0.277785f));
 
735
      P.at(3, 2) = X034;
 
736
      P.at(3, 3) = D(X031 * F(0.022887f) + X033 * F(-0.097545f) + X035 * F(0.490393f) + X037 * F(0.865723f));
 
737
      // 40 muls 24 adds
 
738
 
 
739
      // 4x4 = 4x8 times 8x4, matrix 1 is constant
 
740
      Q.at(0, 0) = D(X001 * F(0.906127f) + X003 * F(-0.318190f) + X005 * F(0.212608f) + X007 * F(-0.180240f));
 
741
      Q.at(0, 1) = X002;
 
742
      Q.at(0, 2) = D(X001 * F(-0.074658f) + X003 * F(0.513280f) + X005 * F(0.768178f) + X007 * F(-0.375330f));
 
743
      Q.at(0, 3) = X006;
 
744
      Q.at(1, 0) = D(X011 * F(0.906127f) + X013 * F(-0.318190f) + X015 * F(0.212608f) + X017 * F(-0.180240f));
 
745
      Q.at(1, 1) = X012;
 
746
      Q.at(1, 2) = D(X011 * F(-0.074658f) + X013 * F(0.513280f) + X015 * F(0.768178f) + X017 * F(-0.375330f));
 
747
      Q.at(1, 3) = X016;
 
748
      Q.at(2, 0) = D(X021 * F(0.906127f) + X023 * F(-0.318190f) + X025 * F(0.212608f) + X027 * F(-0.180240f));
 
749
      Q.at(2, 1) = X022;
 
750
      Q.at(2, 2) = D(X021 * F(-0.074658f) + X023 * F(0.513280f) + X025 * F(0.768178f) + X027 * F(-0.375330f));
 
751
      Q.at(2, 3) = X026;
 
752
      Q.at(3, 0) = D(X031 * F(0.906127f) + X033 * F(-0.318190f) + X035 * F(0.212608f) + X037 * F(-0.180240f));
 
753
      Q.at(3, 1) = X032;
 
754
      Q.at(3, 2) = D(X031 * F(-0.074658f) + X033 * F(0.513280f) + X035 * F(0.768178f) + X037 * F(-0.375330f));
 
755
      Q.at(3, 3) = X036;
 
756
      // 40 muls 24 adds
 
757
    }
 
758
  };
 
759
 
 
760
  template<int NUM_ROWS, int NUM_COLS>
 
761
  struct R_S
 
762
  {
 
763
    static void calc(Matrix44& R, Matrix44& S, const jpgd_block_t* pSrc)
 
764
    {
 
765
      // 4x8 = 4x8 times 8x8, matrix 0 is constant
 
766
      const Temp_Type X100 = D(F(0.906127f) * AT(1, 0) + F(-0.318190f) * AT(3, 0) + F(0.212608f) * AT(5, 0) + F(-0.180240f) * AT(7, 0));
 
767
      const Temp_Type X101 = D(F(0.906127f) * AT(1, 1) + F(-0.318190f) * AT(3, 1) + F(0.212608f) * AT(5, 1) + F(-0.180240f) * AT(7, 1));
 
768
      const Temp_Type X102 = D(F(0.906127f) * AT(1, 2) + F(-0.318190f) * AT(3, 2) + F(0.212608f) * AT(5, 2) + F(-0.180240f) * AT(7, 2));
 
769
      const Temp_Type X103 = D(F(0.906127f) * AT(1, 3) + F(-0.318190f) * AT(3, 3) + F(0.212608f) * AT(5, 3) + F(-0.180240f) * AT(7, 3));
 
770
      const Temp_Type X104 = D(F(0.906127f) * AT(1, 4) + F(-0.318190f) * AT(3, 4) + F(0.212608f) * AT(5, 4) + F(-0.180240f) * AT(7, 4));
 
771
      const Temp_Type X105 = D(F(0.906127f) * AT(1, 5) + F(-0.318190f) * AT(3, 5) + F(0.212608f) * AT(5, 5) + F(-0.180240f) * AT(7, 5));
 
772
      const Temp_Type X106 = D(F(0.906127f) * AT(1, 6) + F(-0.318190f) * AT(3, 6) + F(0.212608f) * AT(5, 6) + F(-0.180240f) * AT(7, 6));
 
773
      const Temp_Type X107 = D(F(0.906127f) * AT(1, 7) + F(-0.318190f) * AT(3, 7) + F(0.212608f) * AT(5, 7) + F(-0.180240f) * AT(7, 7));
 
774
      const Temp_Type X110 = AT(2, 0);
 
775
      const Temp_Type X111 = AT(2, 1);
 
776
      const Temp_Type X112 = AT(2, 2);
 
777
      const Temp_Type X113 = AT(2, 3);
 
778
      const Temp_Type X114 = AT(2, 4);
 
779
      const Temp_Type X115 = AT(2, 5);
 
780
      const Temp_Type X116 = AT(2, 6);
 
781
      const Temp_Type X117 = AT(2, 7);
 
782
      const Temp_Type X120 = D(F(-0.074658f) * AT(1, 0) + F(0.513280f) * AT(3, 0) + F(0.768178f) * AT(5, 0) + F(-0.375330f) * AT(7, 0));
 
783
      const Temp_Type X121 = D(F(-0.074658f) * AT(1, 1) + F(0.513280f) * AT(3, 1) + F(0.768178f) * AT(5, 1) + F(-0.375330f) * AT(7, 1));
 
784
      const Temp_Type X122 = D(F(-0.074658f) * AT(1, 2) + F(0.513280f) * AT(3, 2) + F(0.768178f) * AT(5, 2) + F(-0.375330f) * AT(7, 2));
 
785
      const Temp_Type X123 = D(F(-0.074658f) * AT(1, 3) + F(0.513280f) * AT(3, 3) + F(0.768178f) * AT(5, 3) + F(-0.375330f) * AT(7, 3));
 
786
      const Temp_Type X124 = D(F(-0.074658f) * AT(1, 4) + F(0.513280f) * AT(3, 4) + F(0.768178f) * AT(5, 4) + F(-0.375330f) * AT(7, 4));
 
787
      const Temp_Type X125 = D(F(-0.074658f) * AT(1, 5) + F(0.513280f) * AT(3, 5) + F(0.768178f) * AT(5, 5) + F(-0.375330f) * AT(7, 5));
 
788
      const Temp_Type X126 = D(F(-0.074658f) * AT(1, 6) + F(0.513280f) * AT(3, 6) + F(0.768178f) * AT(5, 6) + F(-0.375330f) * AT(7, 6));
 
789
      const Temp_Type X127 = D(F(-0.074658f) * AT(1, 7) + F(0.513280f) * AT(3, 7) + F(0.768178f) * AT(5, 7) + F(-0.375330f) * AT(7, 7));
 
790
      const Temp_Type X130 = AT(6, 0);
 
791
      const Temp_Type X131 = AT(6, 1);
 
792
      const Temp_Type X132 = AT(6, 2);
 
793
      const Temp_Type X133 = AT(6, 3);
 
794
      const Temp_Type X134 = AT(6, 4);
 
795
      const Temp_Type X135 = AT(6, 5);
 
796
      const Temp_Type X136 = AT(6, 6);
 
797
      const Temp_Type X137 = AT(6, 7);
 
798
      // 80 muls 48 adds
 
799
 
 
800
      // 4x4 = 4x8 times 8x4, matrix 1 is constant
 
801
      R.at(0, 0) = X100;
 
802
      R.at(0, 1) = D(X101 * F(0.415735f) + X103 * F(0.791065f) + X105 * F(-0.352443f) + X107 * F(0.277785f));
 
803
      R.at(0, 2) = X104;
 
804
      R.at(0, 3) = D(X101 * F(0.022887f) + X103 * F(-0.097545f) + X105 * F(0.490393f) + X107 * F(0.865723f));
 
805
      R.at(1, 0) = X110;
 
806
      R.at(1, 1) = D(X111 * F(0.415735f) + X113 * F(0.791065f) + X115 * F(-0.352443f) + X117 * F(0.277785f));
 
807
      R.at(1, 2) = X114;
 
808
      R.at(1, 3) = D(X111 * F(0.022887f) + X113 * F(-0.097545f) + X115 * F(0.490393f) + X117 * F(0.865723f));
 
809
      R.at(2, 0) = X120;
 
810
      R.at(2, 1) = D(X121 * F(0.415735f) + X123 * F(0.791065f) + X125 * F(-0.352443f) + X127 * F(0.277785f));
 
811
      R.at(2, 2) = X124;
 
812
      R.at(2, 3) = D(X121 * F(0.022887f) + X123 * F(-0.097545f) + X125 * F(0.490393f) + X127 * F(0.865723f));
 
813
      R.at(3, 0) = X130;
 
814
      R.at(3, 1) = D(X131 * F(0.415735f) + X133 * F(0.791065f) + X135 * F(-0.352443f) + X137 * F(0.277785f));
 
815
      R.at(3, 2) = X134;
 
816
      R.at(3, 3) = D(X131 * F(0.022887f) + X133 * F(-0.097545f) + X135 * F(0.490393f) + X137 * F(0.865723f));
 
817
      // 40 muls 24 adds
 
818
      // 4x4 = 4x8 times 8x4, matrix 1 is constant
 
819
      S.at(0, 0) = D(X101 * F(0.906127f) + X103 * F(-0.318190f) + X105 * F(0.212608f) + X107 * F(-0.180240f));
 
820
      S.at(0, 1) = X102;
 
821
      S.at(0, 2) = D(X101 * F(-0.074658f) + X103 * F(0.513280f) + X105 * F(0.768178f) + X107 * F(-0.375330f));
 
822
      S.at(0, 3) = X106;
 
823
      S.at(1, 0) = D(X111 * F(0.906127f) + X113 * F(-0.318190f) + X115 * F(0.212608f) + X117 * F(-0.180240f));
 
824
      S.at(1, 1) = X112;
 
825
      S.at(1, 2) = D(X111 * F(-0.074658f) + X113 * F(0.513280f) + X115 * F(0.768178f) + X117 * F(-0.375330f));
 
826
      S.at(1, 3) = X116;
 
827
      S.at(2, 0) = D(X121 * F(0.906127f) + X123 * F(-0.318190f) + X125 * F(0.212608f) + X127 * F(-0.180240f));
 
828
      S.at(2, 1) = X122;
 
829
      S.at(2, 2) = D(X121 * F(-0.074658f) + X123 * F(0.513280f) + X125 * F(0.768178f) + X127 * F(-0.375330f));
 
830
      S.at(2, 3) = X126;
 
831
      S.at(3, 0) = D(X131 * F(0.906127f) + X133 * F(-0.318190f) + X135 * F(0.212608f) + X137 * F(-0.180240f));
 
832
      S.at(3, 1) = X132;
 
833
      S.at(3, 2) = D(X131 * F(-0.074658f) + X133 * F(0.513280f) + X135 * F(0.768178f) + X137 * F(-0.375330f));
 
834
      S.at(3, 3) = X136;
 
835
      // 40 muls 24 adds
 
836
    }
 
837
  };
 
838
} // end namespace DCT_Upsample
 
839
 
 
840
// Unconditionally frees all allocated m_blocks.
 
841
void jpeg_decoder::free_all_blocks()
 
842
{
 
843
  m_pStream = NULL;
 
844
  for (mem_block *b = m_pMem_blocks; b; )
 
845
  {
 
846
    mem_block *n = b->m_pNext;
 
847
    jpgd_free(b);
 
848
    b = n;
 
849
  }
 
850
  m_pMem_blocks = NULL;
 
851
}
 
852
 
 
853
// This method handles all errors. It will never return.
 
854
// It could easily be changed to use C++ exceptions.
 
855
JPGD_NORETURN void jpeg_decoder::stop_decoding(jpgd_status status)
 
856
{
 
857
  m_error_code = status;
 
858
  free_all_blocks();
 
859
  longjmp(m_jmp_state, status);
 
860
}
 
861
 
 
862
void *jpeg_decoder::alloc(size_t nSize, bool zero)
 
863
{
 
864
  nSize = (JPGD_MAX(nSize, 1) + 3) & ~3;
 
865
  char *rv = NULL;
 
866
  for (mem_block *b = m_pMem_blocks; b; b = b->m_pNext)
 
867
  {
 
868
    if ((b->m_used_count + nSize) <= b->m_size)
 
869
    {
 
870
      rv = b->m_data + b->m_used_count;
 
871
      b->m_used_count += nSize;
 
872
      break;
 
873
    }
 
874
  }
 
875
  if (!rv)
 
876
  {
 
877
    int capacity = (int)JPGD_MAX(32768 - 256, (nSize + 2047) & ~2047);
 
878
    mem_block *b = (mem_block*)jpgd_malloc(sizeof(mem_block) + capacity);
 
879
    if (!b) { stop_decoding(JPGD_NOTENOUGHMEM); }
 
880
    b->m_pNext = m_pMem_blocks; m_pMem_blocks = b;
 
881
    b->m_used_count = nSize;
 
882
    b->m_size = capacity;
 
883
    rv = b->m_data;
 
884
  }
 
885
  if (zero) memset(rv, 0, nSize);
 
886
  return rv;
 
887
}
 
888
 
 
889
void jpeg_decoder::word_clear(void *p, uint16 c, uint n)
 
890
{
 
891
  uint8 *pD = (uint8*)p;
 
892
  const uint8 l = c & 0xFF, h = (c >> 8) & 0xFF;
 
893
  while (n)
 
894
  {
 
895
    pD[0] = l; pD[1] = h; pD += 2;
 
896
    n--;
 
897
  }
 
898
}
 
899
 
 
900
// Refill the input buffer.
 
901
// This method will sit in a loop until (A) the buffer is full or (B)
 
902
// the stream's read() method reports and end of file condition.
 
903
void jpeg_decoder::prep_in_buffer()
 
904
{
 
905
  m_in_buf_left = 0;
 
906
  m_pIn_buf_ofs = m_in_buf;
 
907
 
 
908
  if (m_eof_flag)
 
909
    return;
 
910
 
 
911
  do
 
912
  {
 
913
    int bytes_read = m_pStream->read(m_in_buf + m_in_buf_left, JPGD_IN_BUF_SIZE - m_in_buf_left, &m_eof_flag);
 
914
    if (bytes_read == -1)
 
915
      stop_decoding(JPGD_STREAM_READ);
 
916
 
 
917
    m_in_buf_left += bytes_read;
 
918
  } while ((m_in_buf_left < JPGD_IN_BUF_SIZE) && (!m_eof_flag));
 
919
 
 
920
  m_total_bytes_read += m_in_buf_left;
 
921
 
 
922
  // Pad the end of the block with M_EOI (prevents the decompressor from going off the rails if the stream is invalid).
 
923
  // (This dates way back to when this decompressor was written in C/asm, and the all-asm Huffman decoder did some fancy things to increase perf.)
 
924
  word_clear(m_pIn_buf_ofs + m_in_buf_left, 0xD9FF, 64);
 
925
}
 
926
 
 
927
// Read a Huffman code table.
 
928
void jpeg_decoder::read_dht_marker()
 
929
{
 
930
  int i, index, count;
 
931
  uint8 huff_num[17];
 
932
  uint8 huff_val[256];
 
933
 
 
934
  uint num_left = get_bits(16);
 
935
 
 
936
  if (num_left < 2)
 
937
    stop_decoding(JPGD_BAD_DHT_MARKER);
 
938
 
 
939
  num_left -= 2;
 
940
 
 
941
  while (num_left)
 
942
  {
 
943
    index = get_bits(8);
 
944
 
 
945
    huff_num[0] = 0;
 
946
 
 
947
    count = 0;
 
948
 
 
949
    for (i = 1; i <= 16; i++)
 
950
    {
 
951
      huff_num[i] = static_cast<uint8>(get_bits(8));
 
952
      count += huff_num[i];
 
953
    }
 
954
 
 
955
    if (count > 255)
 
956
      stop_decoding(JPGD_BAD_DHT_COUNTS);
 
957
 
 
958
    for (i = 0; i < count; i++)
 
959
      huff_val[i] = static_cast<uint8>(get_bits(8));
 
960
 
 
961
    i = 1 + 16 + count;
 
962
 
 
963
    if (num_left < (uint)i)
 
964
      stop_decoding(JPGD_BAD_DHT_MARKER);
 
965
 
 
966
    num_left -= i;
 
967
 
 
968
    if ((index & 0x10) > 0x10)
 
969
      stop_decoding(JPGD_BAD_DHT_INDEX);
 
970
 
 
971
    index = (index & 0x0F) + ((index & 0x10) >> 4) * (JPGD_MAX_HUFF_TABLES >> 1);
 
972
 
 
973
    if (index >= JPGD_MAX_HUFF_TABLES)
 
974
      stop_decoding(JPGD_BAD_DHT_INDEX);
 
975
 
 
976
    if (!m_huff_num[index])
 
977
      m_huff_num[index] = (uint8 *)alloc(17);
 
978
 
 
979
    if (!m_huff_val[index])
 
980
      m_huff_val[index] = (uint8 *)alloc(256);
 
981
 
 
982
    m_huff_ac[index] = (index & 0x10) != 0;
 
983
    memcpy(m_huff_num[index], huff_num, 17);
 
984
    memcpy(m_huff_val[index], huff_val, 256);
 
985
  }
 
986
}
 
987
 
 
988
// Read a quantization table.
 
989
void jpeg_decoder::read_dqt_marker()
 
990
{
 
991
  int n, i, prec;
 
992
  uint num_left;
 
993
  uint temp;
 
994
 
 
995
  num_left = get_bits(16);
 
996
 
 
997
  if (num_left < 2)
 
998
    stop_decoding(JPGD_BAD_DQT_MARKER);
 
999
 
 
1000
  num_left -= 2;
 
1001
 
 
1002
  while (num_left)
 
1003
  {
 
1004
    n = get_bits(8);
 
1005
    prec = n >> 4;
 
1006
    n &= 0x0F;
 
1007
 
 
1008
    if (n >= JPGD_MAX_QUANT_TABLES)
 
1009
      stop_decoding(JPGD_BAD_DQT_TABLE);
 
1010
 
 
1011
    if (!m_quant[n])
 
1012
      m_quant[n] = (jpgd_quant_t *)alloc(64 * sizeof(jpgd_quant_t));
 
1013
 
 
1014
    // read quantization entries, in zag order
 
1015
    for (i = 0; i < 64; i++)
 
1016
    {
 
1017
      temp = get_bits(8);
 
1018
 
 
1019
      if (prec)
 
1020
        temp = (temp << 8) + get_bits(8);
 
1021
 
 
1022
                        m_quant[n][i] = static_cast<jpgd_quant_t>(temp);
 
1023
    }
 
1024
 
 
1025
    i = 64 + 1;
 
1026
 
 
1027
    if (prec)
 
1028
      i += 64;
 
1029
 
 
1030
    if (num_left < (uint)i)
 
1031
      stop_decoding(JPGD_BAD_DQT_LENGTH);
 
1032
 
 
1033
    num_left -= i;
 
1034
  }
 
1035
}
 
1036
 
 
1037
// Read the start of frame (SOF) marker.
 
1038
void jpeg_decoder::read_sof_marker()
 
1039
{
 
1040
  int i;
 
1041
  uint num_left;
 
1042
 
 
1043
  num_left = get_bits(16);
 
1044
 
 
1045
  if (get_bits(8) != 8)   /* precision: sorry, only 8-bit precision is supported right now */
 
1046
    stop_decoding(JPGD_BAD_PRECISION);
 
1047
 
 
1048
  m_image_y_size = get_bits(16);
 
1049
 
 
1050
  if ((m_image_y_size < 1) || (m_image_y_size > JPGD_MAX_HEIGHT))
 
1051
    stop_decoding(JPGD_BAD_HEIGHT);
 
1052
 
 
1053
  m_image_x_size = get_bits(16);
 
1054
 
 
1055
  if ((m_image_x_size < 1) || (m_image_x_size > JPGD_MAX_WIDTH))
 
1056
    stop_decoding(JPGD_BAD_WIDTH);
 
1057
 
 
1058
  m_comps_in_frame = get_bits(8);
 
1059
 
 
1060
  if (m_comps_in_frame > JPGD_MAX_COMPONENTS)
 
1061
    stop_decoding(JPGD_TOO_MANY_COMPONENTS);
 
1062
 
 
1063
  if (num_left != (uint)(m_comps_in_frame * 3 + 8))
 
1064
    stop_decoding(JPGD_BAD_SOF_LENGTH);
 
1065
 
 
1066
  for (i = 0; i < m_comps_in_frame; i++)
 
1067
  {
 
1068
    m_comp_ident[i]  = get_bits(8);
 
1069
    m_comp_h_samp[i] = get_bits(4);
 
1070
    m_comp_v_samp[i] = get_bits(4);
 
1071
    m_comp_quant[i]  = get_bits(8);
 
1072
  }
 
1073
}
 
1074
 
 
1075
// Used to skip unrecognized markers.
 
1076
void jpeg_decoder::skip_variable_marker()
 
1077
{
 
1078
  uint num_left;
 
1079
 
 
1080
  num_left = get_bits(16);
 
1081
 
 
1082
  if (num_left < 2)
 
1083
    stop_decoding(JPGD_BAD_VARIABLE_MARKER);
 
1084
 
 
1085
  num_left -= 2;
 
1086
 
 
1087
  while (num_left)
 
1088
  {
 
1089
    get_bits(8);
 
1090
    num_left--;
 
1091
  }
 
1092
}
 
1093
 
 
1094
// Read a define restart interval (DRI) marker.
 
1095
void jpeg_decoder::read_dri_marker()
 
1096
{
 
1097
  if (get_bits(16) != 4)
 
1098
    stop_decoding(JPGD_BAD_DRI_LENGTH);
 
1099
 
 
1100
  m_restart_interval = get_bits(16);
 
1101
}
 
1102
 
 
1103
// Read a start of scan (SOS) marker.
 
1104
void jpeg_decoder::read_sos_marker()
 
1105
{
 
1106
  uint num_left;
 
1107
  int i, ci, n, c, cc;
 
1108
 
 
1109
  num_left = get_bits(16);
 
1110
 
 
1111
  n = get_bits(8);
 
1112
 
 
1113
  m_comps_in_scan = n;
 
1114
 
 
1115
  num_left -= 3;
 
1116
 
 
1117
  if ( (num_left != (uint)(n * 2 + 3)) || (n < 1) || (n > JPGD_MAX_COMPS_IN_SCAN) )
 
1118
    stop_decoding(JPGD_BAD_SOS_LENGTH);
 
1119
 
 
1120
  for (i = 0; i < n; i++)
 
1121
  {
 
1122
    cc = get_bits(8);
 
1123
    c = get_bits(8);
 
1124
    num_left -= 2;
 
1125
 
 
1126
    for (ci = 0; ci < m_comps_in_frame; ci++)
 
1127
      if (cc == m_comp_ident[ci])
 
1128
        break;
 
1129
 
 
1130
    if (ci >= m_comps_in_frame)
 
1131
      stop_decoding(JPGD_BAD_SOS_COMP_ID);
 
1132
 
 
1133
    m_comp_list[i]    = ci;
 
1134
    m_comp_dc_tab[ci] = (c >> 4) & 15;
 
1135
    m_comp_ac_tab[ci] = (c & 15) + (JPGD_MAX_HUFF_TABLES >> 1);
 
1136
  }
 
1137
 
 
1138
  m_spectral_start  = get_bits(8);
 
1139
  m_spectral_end    = get_bits(8);
 
1140
  m_successive_high = get_bits(4);
 
1141
  m_successive_low  = get_bits(4);
 
1142
 
 
1143
  if (!m_progressive_flag)
 
1144
  {
 
1145
    m_spectral_start = 0;
 
1146
    m_spectral_end = 63;
 
1147
  }
 
1148
 
 
1149
  num_left -= 3;
 
1150
 
 
1151
  while (num_left)                  /* read past whatever is num_left */
 
1152
  {
 
1153
    get_bits(8);
 
1154
    num_left--;
 
1155
  }
 
1156
}
 
1157
 
 
1158
// Finds the next marker.
 
1159
int jpeg_decoder::next_marker()
 
1160
{
 
1161
  uint c, bytes;
 
1162
 
 
1163
  bytes = 0;
 
1164
 
 
1165
  do
 
1166
  {
 
1167
    do
 
1168
    {
 
1169
      bytes++;
 
1170
      c = get_bits(8);
 
1171
    } while (c != 0xFF);
 
1172
 
 
1173
    do
 
1174
    {
 
1175
      c = get_bits(8);
 
1176
    } while (c == 0xFF);
 
1177
 
 
1178
  } while (c == 0);
 
1179
 
 
1180
  // If bytes > 0 here, there where extra bytes before the marker (not good).
 
1181
 
 
1182
  return c;
 
1183
}
 
1184
 
 
1185
// Process markers. Returns when an SOFx, SOI, EOI, or SOS marker is
 
1186
// encountered.
 
1187
int jpeg_decoder::process_markers()
 
1188
{
 
1189
  int c;
 
1190
 
 
1191
  for ( ; ; )
 
1192
  {
 
1193
    c = next_marker();
 
1194
 
 
1195
    switch (c)
 
1196
    {
 
1197
      case M_SOF0:
 
1198
      case M_SOF1:
 
1199
      case M_SOF2:
 
1200
      case M_SOF3:
 
1201
      case M_SOF5:
 
1202
      case M_SOF6:
 
1203
      case M_SOF7:
 
1204
//      case M_JPG:
 
1205
      case M_SOF9:
 
1206
      case M_SOF10:
 
1207
      case M_SOF11:
 
1208
      case M_SOF13:
 
1209
      case M_SOF14:
 
1210
      case M_SOF15:
 
1211
      case M_SOI:
 
1212
      case M_EOI:
 
1213
      case M_SOS:
 
1214
      {
 
1215
        return c;
 
1216
      }
 
1217
      case M_DHT:
 
1218
      {
 
1219
        read_dht_marker();
 
1220
        break;
 
1221
      }
 
1222
      // No arithmitic support - dumb patents!
 
1223
      case M_DAC:
 
1224
      {
 
1225
        stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT);
 
1226
        break;
 
1227
      }
 
1228
      case M_DQT:
 
1229
      {
 
1230
        read_dqt_marker();
 
1231
        break;
 
1232
      }
 
1233
      case M_DRI:
 
1234
      {
 
1235
        read_dri_marker();
 
1236
        break;
 
1237
      }
 
1238
      //case M_APP0:  /* no need to read the JFIF marker */
 
1239
 
 
1240
      case M_JPG:
 
1241
      case M_RST0:    /* no parameters */
 
1242
      case M_RST1:
 
1243
      case M_RST2:
 
1244
      case M_RST3:
 
1245
      case M_RST4:
 
1246
      case M_RST5:
 
1247
      case M_RST6:
 
1248
      case M_RST7:
 
1249
      case M_TEM:
 
1250
      {
 
1251
        stop_decoding(JPGD_UNEXPECTED_MARKER);
 
1252
        break;
 
1253
      }
 
1254
      default:    /* must be DNL, DHP, EXP, APPn, JPGn, COM, or RESn or APP0 */
 
1255
      {
 
1256
        skip_variable_marker();
 
1257
        break;
 
1258
      }
 
1259
    }
 
1260
  }
 
1261
}
 
1262
 
 
1263
// Finds the start of image (SOI) marker.
 
1264
// This code is rather defensive: it only checks the first 512 bytes to avoid
 
1265
// false positives.
 
1266
void jpeg_decoder::locate_soi_marker()
 
1267
{
 
1268
  uint lastchar, thischar;
 
1269
  uint bytesleft;
 
1270
 
 
1271
  lastchar = get_bits(8);
 
1272
 
 
1273
  thischar = get_bits(8);
 
1274
 
 
1275
  /* ok if it's a normal JPEG file without a special header */
 
1276
 
 
1277
  if ((lastchar == 0xFF) && (thischar == M_SOI))
 
1278
    return;
 
1279
 
 
1280
  bytesleft = 4096; //512;
 
1281
 
 
1282
  for ( ; ; )
 
1283
  {
 
1284
    if (--bytesleft == 0)
 
1285
      stop_decoding(JPGD_NOT_JPEG);
 
1286
 
 
1287
    lastchar = thischar;
 
1288
 
 
1289
    thischar = get_bits(8);
 
1290
 
 
1291
    if (lastchar == 0xFF)
 
1292
    {
 
1293
      if (thischar == M_SOI)
 
1294
        break;
 
1295
      else if (thischar == M_EOI) // get_bits will keep returning M_EOI if we read past the end
 
1296
        stop_decoding(JPGD_NOT_JPEG);
 
1297
    }
 
1298
  }
 
1299
 
 
1300
  // Check the next character after marker: if it's not 0xFF, it can't be the start of the next marker, so the file is bad.
 
1301
  thischar = (m_bit_buf >> 24) & 0xFF;
 
1302
 
 
1303
  if (thischar != 0xFF)
 
1304
    stop_decoding(JPGD_NOT_JPEG);
 
1305
}
 
1306
 
 
1307
// Find a start of frame (SOF) marker.
 
1308
void jpeg_decoder::locate_sof_marker()
 
1309
{
 
1310
  locate_soi_marker();
 
1311
 
 
1312
  int c = process_markers();
 
1313
 
 
1314
  switch (c)
 
1315
  {
 
1316
    case M_SOF2:
 
1317
      m_progressive_flag = JPGD_TRUE;
 
1318
    case M_SOF0:  /* baseline DCT */
 
1319
    case M_SOF1:  /* extended sequential DCT */
 
1320
    {
 
1321
      read_sof_marker();
 
1322
      break;
 
1323
    }
 
1324
    case M_SOF9:  /* Arithmitic coding */
 
1325
    {
 
1326
      stop_decoding(JPGD_NO_ARITHMITIC_SUPPORT);
 
1327
      break;
 
1328
    }
 
1329
    default:
 
1330
    {
 
1331
      stop_decoding(JPGD_UNSUPPORTED_MARKER);
 
1332
      break;
 
1333
    }
 
1334
  }
 
1335
}
 
1336
 
 
1337
// Find a start of scan (SOS) marker.
 
1338
int jpeg_decoder::locate_sos_marker()
 
1339
{
 
1340
  int c;
 
1341
 
 
1342
  c = process_markers();
 
1343
 
 
1344
  if (c == M_EOI)
 
1345
    return JPGD_FALSE;
 
1346
  else if (c != M_SOS)
 
1347
    stop_decoding(JPGD_UNEXPECTED_MARKER);
 
1348
 
 
1349
  read_sos_marker();
 
1350
 
 
1351
  return JPGD_TRUE;
 
1352
}
 
1353
 
 
1354
// Reset everything to default/uninitialized state.
 
1355
void jpeg_decoder::init(jpeg_decoder_stream *pStream)
 
1356
{
 
1357
  m_pMem_blocks = NULL;
 
1358
  m_error_code = JPGD_SUCCESS;
 
1359
  m_ready_flag = false;
 
1360
  m_image_x_size = m_image_y_size = 0;
 
1361
  m_pStream = pStream;
 
1362
  m_progressive_flag = JPGD_FALSE;
 
1363
 
 
1364
  memset(m_huff_ac, 0, sizeof(m_huff_ac));
 
1365
  memset(m_huff_num, 0, sizeof(m_huff_num));
 
1366
  memset(m_huff_val, 0, sizeof(m_huff_val));
 
1367
  memset(m_quant, 0, sizeof(m_quant));
 
1368
 
 
1369
  m_scan_type = 0;
 
1370
  m_comps_in_frame = 0;
 
1371
 
 
1372
  memset(m_comp_h_samp, 0, sizeof(m_comp_h_samp));
 
1373
  memset(m_comp_v_samp, 0, sizeof(m_comp_v_samp));
 
1374
  memset(m_comp_quant, 0, sizeof(m_comp_quant));
 
1375
  memset(m_comp_ident, 0, sizeof(m_comp_ident));
 
1376
  memset(m_comp_h_blocks, 0, sizeof(m_comp_h_blocks));
 
1377
  memset(m_comp_v_blocks, 0, sizeof(m_comp_v_blocks));
 
1378
 
 
1379
  m_comps_in_scan = 0;
 
1380
  memset(m_comp_list, 0, sizeof(m_comp_list));
 
1381
  memset(m_comp_dc_tab, 0, sizeof(m_comp_dc_tab));
 
1382
  memset(m_comp_ac_tab, 0, sizeof(m_comp_ac_tab));
 
1383
 
 
1384
  m_spectral_start = 0;
 
1385
  m_spectral_end = 0;
 
1386
  m_successive_low = 0;
 
1387
  m_successive_high = 0;
 
1388
  m_max_mcu_x_size = 0;
 
1389
  m_max_mcu_y_size = 0;
 
1390
  m_blocks_per_mcu = 0;
 
1391
  m_max_blocks_per_row = 0;
 
1392
  m_mcus_per_row = 0;
 
1393
  m_mcus_per_col = 0;
 
1394
  m_expanded_blocks_per_component = 0;
 
1395
  m_expanded_blocks_per_mcu = 0;
 
1396
  m_expanded_blocks_per_row = 0;
 
1397
  m_freq_domain_chroma_upsample = false;
 
1398
 
 
1399
  memset(m_mcu_org, 0, sizeof(m_mcu_org));
 
1400
 
 
1401
  m_total_lines_left = 0;
 
1402
  m_mcu_lines_left = 0;
 
1403
  m_real_dest_bytes_per_scan_line = 0;
 
1404
  m_dest_bytes_per_scan_line = 0;
 
1405
  m_dest_bytes_per_pixel = 0;
 
1406
 
 
1407
  memset(m_pHuff_tabs, 0, sizeof(m_pHuff_tabs));
 
1408
 
 
1409
  memset(m_dc_coeffs, 0, sizeof(m_dc_coeffs));
 
1410
  memset(m_ac_coeffs, 0, sizeof(m_ac_coeffs));
 
1411
  memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu));
 
1412
 
 
1413
  m_eob_run = 0;
 
1414
 
 
1415
  memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu));
 
1416
 
 
1417
  m_pIn_buf_ofs = m_in_buf;
 
1418
  m_in_buf_left = 0;
 
1419
  m_eof_flag = false;
 
1420
  m_tem_flag = 0;
 
1421
 
 
1422
  memset(m_in_buf_pad_start, 0, sizeof(m_in_buf_pad_start));
 
1423
  memset(m_in_buf, 0, sizeof(m_in_buf));
 
1424
  memset(m_in_buf_pad_end, 0, sizeof(m_in_buf_pad_end));
 
1425
 
 
1426
  m_restart_interval = 0;
 
1427
  m_restarts_left    = 0;
 
1428
  m_next_restart_num = 0;
 
1429
 
 
1430
  m_max_mcus_per_row = 0;
 
1431
  m_max_blocks_per_mcu = 0;
 
1432
  m_max_mcus_per_col = 0;
 
1433
 
 
1434
  memset(m_last_dc_val, 0, sizeof(m_last_dc_val));
 
1435
  m_pMCU_coefficients = NULL;
 
1436
  m_pSample_buf = NULL;
 
1437
 
 
1438
  m_total_bytes_read = 0;
 
1439
 
 
1440
  m_pScan_line_0 = NULL;
 
1441
  m_pScan_line_1 = NULL;
 
1442
 
 
1443
  // Ready the input buffer.
 
1444
  prep_in_buffer();
 
1445
 
 
1446
  // Prime the bit buffer.
 
1447
  m_bits_left = 16;
 
1448
  m_bit_buf = 0;
 
1449
 
 
1450
  get_bits(16);
 
1451
  get_bits(16);
 
1452
 
 
1453
  for (int i = 0; i < JPGD_MAX_BLOCKS_PER_MCU; i++)
 
1454
    m_mcu_block_max_zag[i] = 64;
 
1455
}
 
1456
 
 
1457
#define SCALEBITS 16
 
1458
#define ONE_HALF  ((int) 1 << (SCALEBITS-1))
 
1459
#define FIX(x)    ((int) ((x) * (1L<<SCALEBITS) + 0.5f))
 
1460
 
 
1461
// Create a few tables that allow us to quickly convert YCbCr to RGB.
 
1462
void jpeg_decoder::create_look_ups()
 
1463
{
 
1464
  for (int i = 0; i <= 255; i++)
 
1465
  {
 
1466
    int k = i - 128;
 
1467
    m_crr[i] = ( FIX(1.40200f)  * k + ONE_HALF) >> SCALEBITS;
 
1468
    m_cbb[i] = ( FIX(1.77200f)  * k + ONE_HALF) >> SCALEBITS;
 
1469
    m_crg[i] = (-FIX(0.71414f)) * k;
 
1470
    m_cbg[i] = (-FIX(0.34414f)) * k + ONE_HALF;
 
1471
  }
 
1472
}
 
1473
 
 
1474
// This method throws back into the stream any bytes that where read
 
1475
// into the bit buffer during initial marker scanning.
 
1476
void jpeg_decoder::fix_in_buffer()
 
1477
{
 
1478
  // In case any 0xFF's where pulled into the buffer during marker scanning.
 
1479
  JPGD_ASSERT((m_bits_left & 7) == 0);
 
1480
 
 
1481
  if (m_bits_left == 16)
 
1482
    stuff_char( (uint8)(m_bit_buf & 0xFF));
 
1483
 
 
1484
  if (m_bits_left >= 8)
 
1485
    stuff_char( (uint8)((m_bit_buf >> 8) & 0xFF));
 
1486
 
 
1487
  stuff_char((uint8)((m_bit_buf >> 16) & 0xFF));
 
1488
  stuff_char((uint8)((m_bit_buf >> 24) & 0xFF));
 
1489
 
 
1490
  m_bits_left = 16;
 
1491
  get_bits_no_markers(16);
 
1492
  get_bits_no_markers(16);
 
1493
}
 
1494
 
 
1495
void jpeg_decoder::transform_mcu(int mcu_row)
 
1496
{
 
1497
  jpgd_block_t* pSrc_ptr = m_pMCU_coefficients;
 
1498
  uint8* pDst_ptr = m_pSample_buf + mcu_row * m_blocks_per_mcu * 64;
 
1499
 
 
1500
  for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++)
 
1501
  {
 
1502
    idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block]);
 
1503
    pSrc_ptr += 64;
 
1504
    pDst_ptr += 64;
 
1505
  }
 
1506
}
 
1507
 
 
1508
static const uint8 s_max_rc[64] =
 
1509
{
 
1510
  17, 18, 34, 50, 50, 51, 52, 52, 52, 68, 84, 84, 84, 84, 85, 86, 86, 86, 86, 86,
 
1511
  102, 118, 118, 118, 118, 118, 118, 119, 120, 120, 120, 120, 120, 120, 120, 136,
 
1512
  136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136,
 
1513
  136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136
 
1514
};
 
1515
 
 
1516
void jpeg_decoder::transform_mcu_expand(int mcu_row)
 
1517
{
 
1518
  jpgd_block_t* pSrc_ptr = m_pMCU_coefficients;
 
1519
  uint8* pDst_ptr = m_pSample_buf + mcu_row * m_expanded_blocks_per_mcu * 64;
 
1520
 
 
1521
  // Y IDCT
 
1522
        int mcu_block;
 
1523
  for (mcu_block = 0; mcu_block < m_expanded_blocks_per_component; mcu_block++)
 
1524
  {
 
1525
    idct(pSrc_ptr, pDst_ptr, m_mcu_block_max_zag[mcu_block]);
 
1526
    pSrc_ptr += 64;
 
1527
    pDst_ptr += 64;
 
1528
  }
 
1529
 
 
1530
  // Chroma IDCT, with upsampling
 
1531
        jpgd_block_t temp_block[64];
 
1532
 
 
1533
  for (int i = 0; i < 2; i++)
 
1534
  {
 
1535
    DCT_Upsample::Matrix44 P, Q, R, S;
 
1536
 
 
1537
    JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] >= 1);
 
1538
    JPGD_ASSERT(m_mcu_block_max_zag[mcu_block] <= 64);
 
1539
 
 
1540
    int max_zag = m_mcu_block_max_zag[mcu_block++] - 1; 
 
1541
    if (max_zag <= 0) max_zag = 0; // should never happen, only here to shut up static analysis
 
1542
    switch (s_max_rc[max_zag])
 
1543
    {
 
1544
    case 1*16+1:
 
1545
      DCT_Upsample::P_Q<1, 1>::calc(P, Q, pSrc_ptr);
 
1546
      DCT_Upsample::R_S<1, 1>::calc(R, S, pSrc_ptr);
 
1547
      break;
 
1548
    case 1*16+2:
 
1549
      DCT_Upsample::P_Q<1, 2>::calc(P, Q, pSrc_ptr);
 
1550
      DCT_Upsample::R_S<1, 2>::calc(R, S, pSrc_ptr);
 
1551
      break;
 
1552
    case 2*16+2:
 
1553
      DCT_Upsample::P_Q<2, 2>::calc(P, Q, pSrc_ptr);
 
1554
      DCT_Upsample::R_S<2, 2>::calc(R, S, pSrc_ptr);
 
1555
      break;
 
1556
    case 3*16+2:
 
1557
      DCT_Upsample::P_Q<3, 2>::calc(P, Q, pSrc_ptr);
 
1558
      DCT_Upsample::R_S<3, 2>::calc(R, S, pSrc_ptr);
 
1559
      break;
 
1560
    case 3*16+3:
 
1561
      DCT_Upsample::P_Q<3, 3>::calc(P, Q, pSrc_ptr);
 
1562
      DCT_Upsample::R_S<3, 3>::calc(R, S, pSrc_ptr);
 
1563
      break;
 
1564
    case 3*16+4:
 
1565
      DCT_Upsample::P_Q<3, 4>::calc(P, Q, pSrc_ptr);
 
1566
      DCT_Upsample::R_S<3, 4>::calc(R, S, pSrc_ptr);
 
1567
      break;
 
1568
    case 4*16+4:
 
1569
      DCT_Upsample::P_Q<4, 4>::calc(P, Q, pSrc_ptr);
 
1570
      DCT_Upsample::R_S<4, 4>::calc(R, S, pSrc_ptr);
 
1571
      break;
 
1572
    case 5*16+4:
 
1573
      DCT_Upsample::P_Q<5, 4>::calc(P, Q, pSrc_ptr);
 
1574
      DCT_Upsample::R_S<5, 4>::calc(R, S, pSrc_ptr);
 
1575
      break;
 
1576
    case 5*16+5:
 
1577
      DCT_Upsample::P_Q<5, 5>::calc(P, Q, pSrc_ptr);
 
1578
      DCT_Upsample::R_S<5, 5>::calc(R, S, pSrc_ptr);
 
1579
      break;
 
1580
    case 5*16+6:
 
1581
      DCT_Upsample::P_Q<5, 6>::calc(P, Q, pSrc_ptr);
 
1582
      DCT_Upsample::R_S<5, 6>::calc(R, S, pSrc_ptr);
 
1583
      break;
 
1584
    case 6*16+6:
 
1585
      DCT_Upsample::P_Q<6, 6>::calc(P, Q, pSrc_ptr);
 
1586
      DCT_Upsample::R_S<6, 6>::calc(R, S, pSrc_ptr);
 
1587
      break;
 
1588
    case 7*16+6:
 
1589
      DCT_Upsample::P_Q<7, 6>::calc(P, Q, pSrc_ptr);
 
1590
      DCT_Upsample::R_S<7, 6>::calc(R, S, pSrc_ptr);
 
1591
      break;
 
1592
    case 7*16+7:
 
1593
      DCT_Upsample::P_Q<7, 7>::calc(P, Q, pSrc_ptr);
 
1594
      DCT_Upsample::R_S<7, 7>::calc(R, S, pSrc_ptr);
 
1595
      break;
 
1596
    case 7*16+8:
 
1597
      DCT_Upsample::P_Q<7, 8>::calc(P, Q, pSrc_ptr);
 
1598
      DCT_Upsample::R_S<7, 8>::calc(R, S, pSrc_ptr);
 
1599
      break;
 
1600
    case 8*16+8:
 
1601
      DCT_Upsample::P_Q<8, 8>::calc(P, Q, pSrc_ptr);
 
1602
      DCT_Upsample::R_S<8, 8>::calc(R, S, pSrc_ptr);
 
1603
      break;
 
1604
    default:
 
1605
      JPGD_ASSERT(false);
 
1606
    }
 
1607
 
 
1608
    DCT_Upsample::Matrix44 a(P + Q); P -= Q;
 
1609
    DCT_Upsample::Matrix44& b = P;
 
1610
    DCT_Upsample::Matrix44 c(R + S); R -= S;
 
1611
    DCT_Upsample::Matrix44& d = R;
 
1612
 
 
1613
    DCT_Upsample::Matrix44::add_and_store(temp_block, a, c);
 
1614
    idct_4x4(temp_block, pDst_ptr);
 
1615
    pDst_ptr += 64;
 
1616
 
 
1617
    DCT_Upsample::Matrix44::sub_and_store(temp_block, a, c);
 
1618
    idct_4x4(temp_block, pDst_ptr);
 
1619
    pDst_ptr += 64;
 
1620
 
 
1621
    DCT_Upsample::Matrix44::add_and_store(temp_block, b, d);
 
1622
    idct_4x4(temp_block, pDst_ptr);
 
1623
    pDst_ptr += 64;
 
1624
 
 
1625
    DCT_Upsample::Matrix44::sub_and_store(temp_block, b, d);
 
1626
    idct_4x4(temp_block, pDst_ptr);
 
1627
    pDst_ptr += 64;
 
1628
 
 
1629
    pSrc_ptr += 64;
 
1630
  }
 
1631
}
 
1632
 
 
1633
// Loads and dequantizes the next row of (already decoded) coefficients.
 
1634
// Progressive images only.
 
1635
void jpeg_decoder::load_next_row()
 
1636
{
 
1637
  int i;
 
1638
  jpgd_block_t *p;
 
1639
  jpgd_quant_t *q;
 
1640
  int mcu_row, mcu_block, row_block = 0;
 
1641
  int component_num, component_id;
 
1642
  int block_x_mcu[JPGD_MAX_COMPONENTS];
 
1643
 
 
1644
  memset(block_x_mcu, 0, JPGD_MAX_COMPONENTS * sizeof(int));
 
1645
 
 
1646
  for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++)
 
1647
  {
 
1648
    int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
 
1649
 
 
1650
    for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++)
 
1651
    {
 
1652
      component_id = m_mcu_org[mcu_block];
 
1653
      q = m_quant[m_comp_quant[component_id]];
 
1654
 
 
1655
      p = m_pMCU_coefficients + 64 * mcu_block;
 
1656
 
 
1657
      jpgd_block_t* pAC = coeff_buf_getp(m_ac_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs);
 
1658
      jpgd_block_t* pDC = coeff_buf_getp(m_dc_coeffs[component_id], block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs);
 
1659
      p[0] = pDC[0];
 
1660
      memcpy(&p[1], &pAC[1], 63 * sizeof(jpgd_block_t));
 
1661
 
 
1662
      for (i = 63; i > 0; i--)
 
1663
        if (p[g_ZAG[i]])
 
1664
          break;
 
1665
 
 
1666
      m_mcu_block_max_zag[mcu_block] = i + 1;
 
1667
 
 
1668
      for ( ; i >= 0; i--)
 
1669
                                if (p[g_ZAG[i]])
 
1670
                                        p[g_ZAG[i]] = static_cast<jpgd_block_t>(p[g_ZAG[i]] * q[i]);
 
1671
 
 
1672
      row_block++;
 
1673
 
 
1674
      if (m_comps_in_scan == 1)
 
1675
        block_x_mcu[component_id]++;
 
1676
      else
 
1677
      {
 
1678
        if (++block_x_mcu_ofs == m_comp_h_samp[component_id])
 
1679
        {
 
1680
          block_x_mcu_ofs = 0;
 
1681
 
 
1682
          if (++block_y_mcu_ofs == m_comp_v_samp[component_id])
 
1683
          {
 
1684
            block_y_mcu_ofs = 0;
 
1685
 
 
1686
            block_x_mcu[component_id] += m_comp_h_samp[component_id];
 
1687
          }
 
1688
        }
 
1689
      }
 
1690
    }
 
1691
 
 
1692
    if (m_freq_domain_chroma_upsample)
 
1693
      transform_mcu_expand(mcu_row);
 
1694
    else
 
1695
      transform_mcu(mcu_row);
 
1696
  }
 
1697
 
 
1698
  if (m_comps_in_scan == 1)
 
1699
    m_block_y_mcu[m_comp_list[0]]++;
 
1700
  else
 
1701
  {
 
1702
    for (component_num = 0; component_num < m_comps_in_scan; component_num++)
 
1703
    {
 
1704
      component_id = m_comp_list[component_num];
 
1705
 
 
1706
      m_block_y_mcu[component_id] += m_comp_v_samp[component_id];
 
1707
    }
 
1708
  }
 
1709
}
 
1710
 
 
1711
// Restart interval processing.
 
1712
void jpeg_decoder::process_restart()
 
1713
{
 
1714
  int i;
 
1715
  int c = 0;
 
1716
 
 
1717
  // Align to a byte boundry
 
1718
  // FIXME: Is this really necessary? get_bits_no_markers() never reads in markers!
 
1719
  //get_bits_no_markers(m_bits_left & 7);
 
1720
 
 
1721
  // Let's scan a little bit to find the marker, but not _too_ far.
 
1722
  // 1536 is a "fudge factor" that determines how much to scan.
 
1723
  for (i = 1536; i > 0; i--)
 
1724
    if (get_char() == 0xFF)
 
1725
      break;
 
1726
 
 
1727
  if (i == 0)
 
1728
    stop_decoding(JPGD_BAD_RESTART_MARKER);
 
1729
 
 
1730
  for ( ; i > 0; i--)
 
1731
    if ((c = get_char()) != 0xFF)
 
1732
      break;
 
1733
 
 
1734
  if (i == 0)
 
1735
    stop_decoding(JPGD_BAD_RESTART_MARKER);
 
1736
 
 
1737
  // Is it the expected marker? If not, something bad happened.
 
1738
  if (c != (m_next_restart_num + M_RST0))
 
1739
    stop_decoding(JPGD_BAD_RESTART_MARKER);
 
1740
 
 
1741
  // Reset each component's DC prediction values.
 
1742
  memset(&m_last_dc_val, 0, m_comps_in_frame * sizeof(uint));
 
1743
 
 
1744
  m_eob_run = 0;
 
1745
 
 
1746
  m_restarts_left = m_restart_interval;
 
1747
 
 
1748
  m_next_restart_num = (m_next_restart_num + 1) & 7;
 
1749
 
 
1750
  // Get the bit buffer going again...
 
1751
 
 
1752
  m_bits_left = 16;
 
1753
  get_bits_no_markers(16);
 
1754
  get_bits_no_markers(16);
 
1755
}
 
1756
 
 
1757
static inline int dequantize_ac(int c, int q) { c *= q; return c; }
 
1758
 
 
1759
// Decodes and dequantizes the next row of coefficients.
 
1760
void jpeg_decoder::decode_next_row()
 
1761
{
 
1762
  int row_block = 0;
 
1763
 
 
1764
  for (int mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++)
 
1765
  {
 
1766
    if ((m_restart_interval) && (m_restarts_left == 0))
 
1767
      process_restart();
 
1768
 
 
1769
    jpgd_block_t* p = m_pMCU_coefficients;
 
1770
    for (int mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++, p += 64)
 
1771
    {
 
1772
      int component_id = m_mcu_org[mcu_block];
 
1773
      jpgd_quant_t* q = m_quant[m_comp_quant[component_id]];
 
1774
 
 
1775
      int r, s;
 
1776
      s = huff_decode(m_pHuff_tabs[m_comp_dc_tab[component_id]], r);
 
1777
      s = JPGD_HUFF_EXTEND(r, s);
 
1778
 
 
1779
      m_last_dc_val[component_id] = (s += m_last_dc_val[component_id]);
 
1780
 
 
1781
      p[0] = static_cast<jpgd_block_t>(s * q[0]);
 
1782
 
 
1783
      int prev_num_set = m_mcu_block_max_zag[mcu_block];
 
1784
 
 
1785
      huff_tables *pH = m_pHuff_tabs[m_comp_ac_tab[component_id]];
 
1786
 
 
1787
      int k;
 
1788
      for (k = 1; k < 64; k++)
 
1789
      {
 
1790
        int extra_bits;
 
1791
        s = huff_decode(pH, extra_bits);
 
1792
 
 
1793
        r = s >> 4;
 
1794
        s &= 15;
 
1795
 
 
1796
        if (s)
 
1797
        {
 
1798
          if (r)
 
1799
          {
 
1800
            if ((k + r) > 63)
 
1801
              stop_decoding(JPGD_DECODE_ERROR);
 
1802
 
 
1803
            if (k < prev_num_set)
 
1804
            {
 
1805
              int n = JPGD_MIN(r, prev_num_set - k);
 
1806
              int kt = k;
 
1807
              while (n--)
 
1808
                p[g_ZAG[kt++]] = 0;
 
1809
            }
 
1810
 
 
1811
            k += r;
 
1812
          }
 
1813
          
 
1814
          s = JPGD_HUFF_EXTEND(extra_bits, s);
 
1815
 
 
1816
          JPGD_ASSERT(k < 64);
 
1817
 
 
1818
          p[g_ZAG[k]] = static_cast<jpgd_block_t>(dequantize_ac(s, q[k])); //s * q[k];
 
1819
        }
 
1820
        else
 
1821
        {
 
1822
          if (r == 15)
 
1823
          {
 
1824
            if ((k + 16) > 64)
 
1825
              stop_decoding(JPGD_DECODE_ERROR);
 
1826
 
 
1827
            if (k < prev_num_set)
 
1828
            {
 
1829
              int n = JPGD_MIN(16, prev_num_set - k);
 
1830
              int kt = k;
 
1831
              while (n--)
 
1832
              {
 
1833
                JPGD_ASSERT(kt <= 63);
 
1834
                p[g_ZAG[kt++]] = 0;
 
1835
              }
 
1836
            }
 
1837
 
 
1838
            k += 16 - 1; // - 1 because the loop counter is k
 
1839
            JPGD_ASSERT(p[g_ZAG[k]] == 0);
 
1840
          }
 
1841
          else
 
1842
            break;
 
1843
        }
 
1844
      }
 
1845
 
 
1846
      if (k < prev_num_set)
 
1847
      {
 
1848
        int kt = k;
 
1849
        while (kt < prev_num_set)
 
1850
          p[g_ZAG[kt++]] = 0;
 
1851
      }
 
1852
 
 
1853
      m_mcu_block_max_zag[mcu_block] = k;
 
1854
 
 
1855
      row_block++;
 
1856
    }
 
1857
 
 
1858
    if (m_freq_domain_chroma_upsample)
 
1859
      transform_mcu_expand(mcu_row);
 
1860
    else
 
1861
      transform_mcu(mcu_row);
 
1862
 
 
1863
    m_restarts_left--;
 
1864
  }
 
1865
}
 
1866
 
 
1867
// YCbCr H1V1 (1x1:1:1, 3 m_blocks per MCU) to RGB
 
1868
void jpeg_decoder::H1V1Convert()
 
1869
{
 
1870
  int row = m_max_mcu_y_size - m_mcu_lines_left;
 
1871
  uint8 *d = m_pScan_line_0;
 
1872
  uint8 *s = m_pSample_buf + row * 8;
 
1873
 
 
1874
  for (int i = m_max_mcus_per_row; i > 0; i--)
 
1875
  {
 
1876
    for (int j = 0; j < 8; j++)
 
1877
    {
 
1878
      int y = s[j];
 
1879
      int cb = s[64+j];
 
1880
      int cr = s[128+j];
 
1881
 
 
1882
      d[0] = clamp(y + m_crr[cr]);
 
1883
      d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16));
 
1884
      d[2] = clamp(y + m_cbb[cb]);
 
1885
      d[3] = 255;
 
1886
 
 
1887
      d += 4;
 
1888
    }
 
1889
 
 
1890
    s += 64*3;
 
1891
  }
 
1892
}
 
1893
 
 
1894
// YCbCr H2V1 (2x1:1:1, 4 m_blocks per MCU) to RGB
 
1895
void jpeg_decoder::H2V1Convert()
 
1896
{
 
1897
  int row = m_max_mcu_y_size - m_mcu_lines_left;
 
1898
  uint8 *d0 = m_pScan_line_0;
 
1899
  uint8 *y = m_pSample_buf + row * 8;
 
1900
  uint8 *c = m_pSample_buf + 2*64 + row * 8;
 
1901
 
 
1902
  for (int i = m_max_mcus_per_row; i > 0; i--)
 
1903
  {
 
1904
    for (int l = 0; l < 2; l++)
 
1905
    {
 
1906
      for (int j = 0; j < 4; j++)
 
1907
      {
 
1908
        int cb = c[0];
 
1909
        int cr = c[64];
 
1910
 
 
1911
        int rc = m_crr[cr];
 
1912
        int gc = ((m_crg[cr] + m_cbg[cb]) >> 16);
 
1913
        int bc = m_cbb[cb];
 
1914
 
 
1915
        int yy = y[j<<1];
 
1916
        d0[0] = clamp(yy+rc);
 
1917
        d0[1] = clamp(yy+gc);
 
1918
        d0[2] = clamp(yy+bc);
 
1919
        d0[3] = 255;
 
1920
 
 
1921
        yy = y[(j<<1)+1];
 
1922
        d0[4] = clamp(yy+rc);
 
1923
        d0[5] = clamp(yy+gc);
 
1924
        d0[6] = clamp(yy+bc);
 
1925
        d0[7] = 255;
 
1926
 
 
1927
        d0 += 8;
 
1928
 
 
1929
        c++;
 
1930
      }
 
1931
      y += 64;
 
1932
    }
 
1933
 
 
1934
    y += 64*4 - 64*2;
 
1935
    c += 64*4 - 8;
 
1936
  }
 
1937
}
 
1938
 
 
1939
// YCbCr H2V1 (1x2:1:1, 4 m_blocks per MCU) to RGB
 
1940
void jpeg_decoder::H1V2Convert()
 
1941
{
 
1942
  int row = m_max_mcu_y_size - m_mcu_lines_left;
 
1943
  uint8 *d0 = m_pScan_line_0;
 
1944
  uint8 *d1 = m_pScan_line_1;
 
1945
  uint8 *y;
 
1946
  uint8 *c;
 
1947
 
 
1948
  if (row < 8)
 
1949
    y = m_pSample_buf + row * 8;
 
1950
  else
 
1951
    y = m_pSample_buf + 64*1 + (row & 7) * 8;
 
1952
 
 
1953
  c = m_pSample_buf + 64*2 + (row >> 1) * 8;
 
1954
 
 
1955
  for (int i = m_max_mcus_per_row; i > 0; i--)
 
1956
  {
 
1957
    for (int j = 0; j < 8; j++)
 
1958
    {
 
1959
      int cb = c[0+j];
 
1960
      int cr = c[64+j];
 
1961
 
 
1962
      int rc = m_crr[cr];
 
1963
      int gc = ((m_crg[cr] + m_cbg[cb]) >> 16);
 
1964
      int bc = m_cbb[cb];
 
1965
 
 
1966
      int yy = y[j];
 
1967
      d0[0] = clamp(yy+rc);
 
1968
      d0[1] = clamp(yy+gc);
 
1969
      d0[2] = clamp(yy+bc);
 
1970
      d0[3] = 255;
 
1971
 
 
1972
      yy = y[8+j];
 
1973
      d1[0] = clamp(yy+rc);
 
1974
      d1[1] = clamp(yy+gc);
 
1975
      d1[2] = clamp(yy+bc);
 
1976
      d1[3] = 255;
 
1977
 
 
1978
      d0 += 4;
 
1979
      d1 += 4;
 
1980
    }
 
1981
 
 
1982
    y += 64*4;
 
1983
    c += 64*4;
 
1984
  }
 
1985
}
 
1986
 
 
1987
// YCbCr H2V2 (2x2:1:1, 6 m_blocks per MCU) to RGB
 
1988
void jpeg_decoder::H2V2Convert()
 
1989
{
 
1990
        int row = m_max_mcu_y_size - m_mcu_lines_left;
 
1991
        uint8 *d0 = m_pScan_line_0;
 
1992
        uint8 *d1 = m_pScan_line_1;
 
1993
        uint8 *y;
 
1994
        uint8 *c;
 
1995
 
 
1996
        if (row < 8)
 
1997
                y = m_pSample_buf + row * 8;
 
1998
        else
 
1999
                y = m_pSample_buf + 64*2 + (row & 7) * 8;
 
2000
 
 
2001
        c = m_pSample_buf + 64*4 + (row >> 1) * 8;
 
2002
 
 
2003
        for (int i = m_max_mcus_per_row; i > 0; i--)
 
2004
        {
 
2005
                for (int l = 0; l < 2; l++)
 
2006
                {
 
2007
                        for (int j = 0; j < 8; j += 2)
 
2008
                        {
 
2009
                                int cb = c[0];
 
2010
                                int cr = c[64];
 
2011
 
 
2012
                                int rc = m_crr[cr];
 
2013
                                int gc = ((m_crg[cr] + m_cbg[cb]) >> 16);
 
2014
                                int bc = m_cbb[cb];
 
2015
 
 
2016
                                int yy = y[j];
 
2017
                                d0[0] = clamp(yy+rc);
 
2018
                                d0[1] = clamp(yy+gc);
 
2019
                                d0[2] = clamp(yy+bc);
 
2020
                                d0[3] = 255;
 
2021
 
 
2022
                                yy = y[j+1];
 
2023
                                d0[4] = clamp(yy+rc);
 
2024
                                d0[5] = clamp(yy+gc);
 
2025
                                d0[6] = clamp(yy+bc);
 
2026
                                d0[7] = 255;
 
2027
 
 
2028
                                yy = y[j+8];
 
2029
                                d1[0] = clamp(yy+rc);
 
2030
                                d1[1] = clamp(yy+gc);
 
2031
                                d1[2] = clamp(yy+bc);
 
2032
                                d1[3] = 255;
 
2033
 
 
2034
                                yy = y[j+8+1];
 
2035
                                d1[4] = clamp(yy+rc);
 
2036
                                d1[5] = clamp(yy+gc);
 
2037
                                d1[6] = clamp(yy+bc);
 
2038
                                d1[7] = 255;
 
2039
 
 
2040
                                d0 += 8;
 
2041
                                d1 += 8;
 
2042
 
 
2043
                                c++;
 
2044
                        }
 
2045
                        y += 64;
 
2046
                }
 
2047
 
 
2048
                y += 64*6 - 64*2;
 
2049
                c += 64*6 - 8;
 
2050
        }
 
2051
}
 
2052
 
 
2053
// Y (1 block per MCU) to 8-bit grayscale
 
2054
void jpeg_decoder::gray_convert()
 
2055
{
 
2056
  int row = m_max_mcu_y_size - m_mcu_lines_left;
 
2057
  uint8 *d = m_pScan_line_0;
 
2058
  uint8 *s = m_pSample_buf + row * 8;
 
2059
 
 
2060
  for (int i = m_max_mcus_per_row; i > 0; i--)
 
2061
  {
 
2062
    *(uint *)d = *(uint *)s;
 
2063
    *(uint *)(&d[4]) = *(uint *)(&s[4]);
 
2064
 
 
2065
    s += 64;
 
2066
    d += 8;
 
2067
  }
 
2068
}
 
2069
 
 
2070
void jpeg_decoder::expanded_convert()
 
2071
{
 
2072
  int row = m_max_mcu_y_size - m_mcu_lines_left;
 
2073
 
 
2074
  uint8* Py = m_pSample_buf + (row / 8) * 64 * m_comp_h_samp[0] + (row & 7) * 8;
 
2075
 
 
2076
  uint8* d = m_pScan_line_0;
 
2077
 
 
2078
  for (int i = m_max_mcus_per_row; i > 0; i--)
 
2079
  {
 
2080
    for (int k = 0; k < m_max_mcu_x_size; k += 8)
 
2081
    {
 
2082
      const int Y_ofs = k * 8;
 
2083
      const int Cb_ofs = Y_ofs + 64 * m_expanded_blocks_per_component;
 
2084
      const int Cr_ofs = Y_ofs + 64 * m_expanded_blocks_per_component * 2;
 
2085
      for (int j = 0; j < 8; j++)
 
2086
      {
 
2087
        int y = Py[Y_ofs + j];
 
2088
        int cb = Py[Cb_ofs + j];
 
2089
        int cr = Py[Cr_ofs + j];
 
2090
 
 
2091
        d[0] = clamp(y + m_crr[cr]);
 
2092
        d[1] = clamp(y + ((m_crg[cr] + m_cbg[cb]) >> 16));
 
2093
        d[2] = clamp(y + m_cbb[cb]);
 
2094
        d[3] = 255;
 
2095
 
 
2096
        d += 4;
 
2097
      }
 
2098
    }
 
2099
 
 
2100
    Py += 64 * m_expanded_blocks_per_mcu;
 
2101
  }
 
2102
}
 
2103
 
 
2104
// Find end of image (EOI) marker, so we can return to the user the exact size of the input stream.
 
2105
void jpeg_decoder::find_eoi()
 
2106
{
 
2107
  if (!m_progressive_flag)
 
2108
  {
 
2109
    // Attempt to read the EOI marker.
 
2110
    //get_bits_no_markers(m_bits_left & 7);
 
2111
 
 
2112
    // Prime the bit buffer
 
2113
    m_bits_left = 16;
 
2114
    get_bits(16);
 
2115
    get_bits(16);
 
2116
 
 
2117
    // The next marker _should_ be EOI
 
2118
    process_markers();
 
2119
  }
 
2120
 
 
2121
  m_total_bytes_read -= m_in_buf_left;
 
2122
}
 
2123
 
 
2124
int jpeg_decoder::decode(const void** pScan_line, uint* pScan_line_len)
 
2125
{
 
2126
  if ((m_error_code) || (!m_ready_flag))
 
2127
    return JPGD_FAILED;
 
2128
 
 
2129
  if (m_total_lines_left == 0)
 
2130
    return JPGD_DONE;
 
2131
 
 
2132
  if (m_mcu_lines_left == 0)
 
2133
  {
 
2134
    if (setjmp(m_jmp_state))
 
2135
      return JPGD_FAILED;
 
2136
 
 
2137
    if (m_progressive_flag)
 
2138
      load_next_row();
 
2139
    else
 
2140
      decode_next_row();
 
2141
 
 
2142
    // Find the EOI marker if that was the last row.
 
2143
    if (m_total_lines_left <= m_max_mcu_y_size)
 
2144
      find_eoi();
 
2145
 
 
2146
    m_mcu_lines_left = m_max_mcu_y_size;
 
2147
  }
 
2148
 
 
2149
  if (m_freq_domain_chroma_upsample)
 
2150
  {
 
2151
    expanded_convert();
 
2152
    *pScan_line = m_pScan_line_0;
 
2153
  }
 
2154
  else
 
2155
  {
 
2156
    switch (m_scan_type)
 
2157
    {
 
2158
      case JPGD_YH2V2:
 
2159
      {
 
2160
        if ((m_mcu_lines_left & 1) == 0)
 
2161
        {
 
2162
          H2V2Convert();
 
2163
          *pScan_line = m_pScan_line_0;
 
2164
        }
 
2165
        else
 
2166
          *pScan_line = m_pScan_line_1;
 
2167
 
 
2168
        break;
 
2169
      }
 
2170
      case JPGD_YH2V1:
 
2171
      {
 
2172
        H2V1Convert();
 
2173
        *pScan_line = m_pScan_line_0;
 
2174
        break;
 
2175
      }
 
2176
      case JPGD_YH1V2:
 
2177
      {
 
2178
        if ((m_mcu_lines_left & 1) == 0)
 
2179
        {
 
2180
          H1V2Convert();
 
2181
          *pScan_line = m_pScan_line_0;
 
2182
        }
 
2183
        else
 
2184
          *pScan_line = m_pScan_line_1;
 
2185
 
 
2186
        break;
 
2187
      }
 
2188
      case JPGD_YH1V1:
 
2189
      {
 
2190
        H1V1Convert();
 
2191
        *pScan_line = m_pScan_line_0;
 
2192
        break;
 
2193
      }
 
2194
      case JPGD_GRAYSCALE:
 
2195
      {
 
2196
        gray_convert();
 
2197
        *pScan_line = m_pScan_line_0;
 
2198
 
 
2199
        break;
 
2200
      }
 
2201
    }
 
2202
  }
 
2203
 
 
2204
  *pScan_line_len = m_real_dest_bytes_per_scan_line;
 
2205
 
 
2206
  m_mcu_lines_left--;
 
2207
  m_total_lines_left--;
 
2208
 
 
2209
  return JPGD_SUCCESS;
 
2210
}
 
2211
 
 
2212
// Creates the tables needed for efficient Huffman decoding.
 
2213
void jpeg_decoder::make_huff_table(int index, huff_tables *pH)
 
2214
{
 
2215
  int p, i, l, si;
 
2216
  uint8 huffsize[257];
 
2217
  uint huffcode[257];
 
2218
  uint code;
 
2219
  uint subtree;
 
2220
  int code_size;
 
2221
  int lastp;
 
2222
  int nextfreeentry;
 
2223
  int currententry;
 
2224
 
 
2225
  pH->ac_table = m_huff_ac[index] != 0;
 
2226
 
 
2227
  p = 0;
 
2228
 
 
2229
  for (l = 1; l <= 16; l++)
 
2230
  {
 
2231
    for (i = 1; i <= m_huff_num[index][l]; i++)
 
2232
      huffsize[p++] = static_cast<uint8>(l);
 
2233
  }
 
2234
 
 
2235
  huffsize[p] = 0;
 
2236
 
 
2237
  lastp = p;
 
2238
 
 
2239
  code = 0;
 
2240
  si = huffsize[0];
 
2241
  p = 0;
 
2242
 
 
2243
  while (huffsize[p])
 
2244
  {
 
2245
    while (huffsize[p] == si)
 
2246
    {
 
2247
      huffcode[p++] = code;
 
2248
      code++;
 
2249
    }
 
2250
 
 
2251
    code <<= 1;
 
2252
    si++;
 
2253
  }
 
2254
 
 
2255
  memset(pH->look_up, 0, sizeof(pH->look_up));
 
2256
  memset(pH->look_up2, 0, sizeof(pH->look_up2));
 
2257
  memset(pH->tree, 0, sizeof(pH->tree));
 
2258
  memset(pH->code_size, 0, sizeof(pH->code_size));
 
2259
 
 
2260
  nextfreeentry = -1;
 
2261
 
 
2262
  p = 0;
 
2263
 
 
2264
  while (p < lastp)
 
2265
  {
 
2266
    i = m_huff_val[index][p];
 
2267
    code = huffcode[p];
 
2268
    code_size = huffsize[p];
 
2269
 
 
2270
    pH->code_size[i] = static_cast<uint8>(code_size);
 
2271
 
 
2272
    if (code_size <= 8)
 
2273
    {
 
2274
      code <<= (8 - code_size);
 
2275
 
 
2276
      for (l = 1 << (8 - code_size); l > 0; l--)
 
2277
      {
 
2278
        JPGD_ASSERT(i < 256);
 
2279
 
 
2280
        pH->look_up[code] = i;
 
2281
 
 
2282
        bool has_extrabits = false;
 
2283
                                int extra_bits = 0;
 
2284
        int num_extra_bits = i & 15;
 
2285
 
 
2286
        int bits_to_fetch = code_size;
 
2287
        if (num_extra_bits)
 
2288
        {
 
2289
          int total_codesize = code_size + num_extra_bits;
 
2290
          if (total_codesize <= 8)
 
2291
          {
 
2292
            has_extrabits = true;
 
2293
            extra_bits = ((1 << num_extra_bits) - 1) & (code >> (8 - total_codesize));
 
2294
            JPGD_ASSERT(extra_bits <= 0x7FFF);
 
2295
            bits_to_fetch += num_extra_bits;
 
2296
          }
 
2297
        }
 
2298
 
 
2299
        if (!has_extrabits)
 
2300
          pH->look_up2[code] = i | (bits_to_fetch << 8);
 
2301
        else
 
2302
          pH->look_up2[code] = i | 0x8000 | (extra_bits << 16) | (bits_to_fetch << 8);
 
2303
 
 
2304
        code++;
 
2305
      }
 
2306
    }
 
2307
    else
 
2308
    {
 
2309
      subtree = (code >> (code_size - 8)) & 0xFF;
 
2310
 
 
2311
      currententry = pH->look_up[subtree];
 
2312
 
 
2313
      if (currententry == 0)
 
2314
      {
 
2315
        pH->look_up[subtree] = currententry = nextfreeentry;
 
2316
        pH->look_up2[subtree] = currententry = nextfreeentry;
 
2317
 
 
2318
        nextfreeentry -= 2;
 
2319
      }
 
2320
 
 
2321
      code <<= (16 - (code_size - 8));
 
2322
 
 
2323
      for (l = code_size; l > 9; l--)
 
2324
      {
 
2325
        if ((code & 0x8000) == 0)
 
2326
          currententry--;
 
2327
 
 
2328
        if (pH->tree[-currententry - 1] == 0)
 
2329
        {
 
2330
          pH->tree[-currententry - 1] = nextfreeentry;
 
2331
 
 
2332
          currententry = nextfreeentry;
 
2333
 
 
2334
          nextfreeentry -= 2;
 
2335
        }
 
2336
        else
 
2337
          currententry = pH->tree[-currententry - 1];
 
2338
 
 
2339
        code <<= 1;
 
2340
      }
 
2341
 
 
2342
      if ((code & 0x8000) == 0)
 
2343
        currententry--;
 
2344
 
 
2345
      pH->tree[-currententry - 1] = i;
 
2346
    }
 
2347
 
 
2348
    p++;
 
2349
  }
 
2350
}
 
2351
 
 
2352
// Verifies the quantization tables needed for this scan are available.
 
2353
void jpeg_decoder::check_quant_tables()
 
2354
{
 
2355
  for (int i = 0; i < m_comps_in_scan; i++)
 
2356
    if (m_quant[m_comp_quant[m_comp_list[i]]] == NULL)
 
2357
      stop_decoding(JPGD_UNDEFINED_QUANT_TABLE);
 
2358
}
 
2359
 
 
2360
// Verifies that all the Huffman tables needed for this scan are available.
 
2361
void jpeg_decoder::check_huff_tables()
 
2362
{
 
2363
  for (int i = 0; i < m_comps_in_scan; i++)
 
2364
  {
 
2365
    if ((m_spectral_start == 0) && (m_huff_num[m_comp_dc_tab[m_comp_list[i]]] == NULL))
 
2366
      stop_decoding(JPGD_UNDEFINED_HUFF_TABLE);
 
2367
 
 
2368
    if ((m_spectral_end > 0) && (m_huff_num[m_comp_ac_tab[m_comp_list[i]]] == NULL))
 
2369
      stop_decoding(JPGD_UNDEFINED_HUFF_TABLE);
 
2370
  }
 
2371
 
 
2372
  for (int i = 0; i < JPGD_MAX_HUFF_TABLES; i++)
 
2373
    if (m_huff_num[i])
 
2374
    {
 
2375
      if (!m_pHuff_tabs[i])
 
2376
        m_pHuff_tabs[i] = (huff_tables *)alloc(sizeof(huff_tables));
 
2377
 
 
2378
      make_huff_table(i, m_pHuff_tabs[i]);
 
2379
    }
 
2380
}
 
2381
 
 
2382
// Determines the component order inside each MCU.
 
2383
// Also calcs how many MCU's are on each row, etc.
 
2384
void jpeg_decoder::calc_mcu_block_order()
 
2385
{
 
2386
  int component_num, component_id;
 
2387
  int max_h_samp = 0, max_v_samp = 0;
 
2388
 
 
2389
  for (component_id = 0; component_id < m_comps_in_frame; component_id++)
 
2390
  {
 
2391
    if (m_comp_h_samp[component_id] > max_h_samp)
 
2392
      max_h_samp = m_comp_h_samp[component_id];
 
2393
 
 
2394
    if (m_comp_v_samp[component_id] > max_v_samp)
 
2395
      max_v_samp = m_comp_v_samp[component_id];
 
2396
  }
 
2397
 
 
2398
  for (component_id = 0; component_id < m_comps_in_frame; component_id++)
 
2399
  {
 
2400
    m_comp_h_blocks[component_id] = ((((m_image_x_size * m_comp_h_samp[component_id]) + (max_h_samp - 1)) / max_h_samp) + 7) / 8;
 
2401
    m_comp_v_blocks[component_id] = ((((m_image_y_size * m_comp_v_samp[component_id]) + (max_v_samp - 1)) / max_v_samp) + 7) / 8;
 
2402
  }
 
2403
 
 
2404
  if (m_comps_in_scan == 1)
 
2405
  {
 
2406
    m_mcus_per_row = m_comp_h_blocks[m_comp_list[0]];
 
2407
    m_mcus_per_col = m_comp_v_blocks[m_comp_list[0]];
 
2408
  }
 
2409
  else
 
2410
  {
 
2411
    m_mcus_per_row = (((m_image_x_size + 7) / 8) + (max_h_samp - 1)) / max_h_samp;
 
2412
    m_mcus_per_col = (((m_image_y_size + 7) / 8) + (max_v_samp - 1)) / max_v_samp;
 
2413
  }
 
2414
 
 
2415
  if (m_comps_in_scan == 1)
 
2416
  {
 
2417
    m_mcu_org[0] = m_comp_list[0];
 
2418
 
 
2419
    m_blocks_per_mcu = 1;
 
2420
  }
 
2421
  else
 
2422
  {
 
2423
    m_blocks_per_mcu = 0;
 
2424
 
 
2425
    for (component_num = 0; component_num < m_comps_in_scan; component_num++)
 
2426
    {
 
2427
      int num_blocks;
 
2428
 
 
2429
      component_id = m_comp_list[component_num];
 
2430
 
 
2431
      num_blocks = m_comp_h_samp[component_id] * m_comp_v_samp[component_id];
 
2432
 
 
2433
      while (num_blocks--)
 
2434
        m_mcu_org[m_blocks_per_mcu++] = component_id;
 
2435
    }
 
2436
  }
 
2437
}
 
2438
 
 
2439
// Starts a new scan.
 
2440
int jpeg_decoder::init_scan()
 
2441
{
 
2442
  if (!locate_sos_marker())
 
2443
    return JPGD_FALSE;
 
2444
 
 
2445
  calc_mcu_block_order();
 
2446
 
 
2447
  check_huff_tables();
 
2448
 
 
2449
  check_quant_tables();
 
2450
 
 
2451
  memset(m_last_dc_val, 0, m_comps_in_frame * sizeof(uint));
 
2452
 
 
2453
  m_eob_run = 0;
 
2454
 
 
2455
  if (m_restart_interval)
 
2456
  {
 
2457
    m_restarts_left = m_restart_interval;
 
2458
    m_next_restart_num = 0;
 
2459
  }
 
2460
 
 
2461
  fix_in_buffer();
 
2462
 
 
2463
  return JPGD_TRUE;
 
2464
}
 
2465
 
 
2466
// Starts a frame. Determines if the number of components or sampling factors
 
2467
// are supported.
 
2468
void jpeg_decoder::init_frame()
 
2469
{
 
2470
  int i;
 
2471
 
 
2472
  if (m_comps_in_frame == 1)
 
2473
  {
 
2474
    if ((m_comp_h_samp[0] != 1) || (m_comp_v_samp[0] != 1))
 
2475
      stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS);
 
2476
 
 
2477
    m_scan_type = JPGD_GRAYSCALE;
 
2478
    m_max_blocks_per_mcu = 1;
 
2479
    m_max_mcu_x_size = 8;
 
2480
    m_max_mcu_y_size = 8;
 
2481
  }
 
2482
  else if (m_comps_in_frame == 3)
 
2483
  {
 
2484
    if ( ((m_comp_h_samp[1] != 1) || (m_comp_v_samp[1] != 1)) ||
 
2485
         ((m_comp_h_samp[2] != 1) || (m_comp_v_samp[2] != 1)) )
 
2486
      stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS);
 
2487
 
 
2488
    if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 1))
 
2489
    {
 
2490
      m_scan_type = JPGD_YH1V1;
 
2491
 
 
2492
      m_max_blocks_per_mcu = 3;
 
2493
      m_max_mcu_x_size = 8;
 
2494
      m_max_mcu_y_size = 8;
 
2495
    }
 
2496
    else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 1))
 
2497
    {
 
2498
      m_scan_type = JPGD_YH2V1;
 
2499
      m_max_blocks_per_mcu = 4;
 
2500
      m_max_mcu_x_size = 16;
 
2501
      m_max_mcu_y_size = 8;
 
2502
    }
 
2503
    else if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 2))
 
2504
    {
 
2505
      m_scan_type = JPGD_YH1V2;
 
2506
      m_max_blocks_per_mcu = 4;
 
2507
      m_max_mcu_x_size = 8;
 
2508
      m_max_mcu_y_size = 16;
 
2509
    }
 
2510
    else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 2))
 
2511
    {
 
2512
      m_scan_type = JPGD_YH2V2;
 
2513
      m_max_blocks_per_mcu = 6;
 
2514
      m_max_mcu_x_size = 16;
 
2515
      m_max_mcu_y_size = 16;
 
2516
    }
 
2517
    else
 
2518
      stop_decoding(JPGD_UNSUPPORTED_SAMP_FACTORS);
 
2519
  }
 
2520
  else
 
2521
    stop_decoding(JPGD_UNSUPPORTED_COLORSPACE);
 
2522
 
 
2523
  m_max_mcus_per_row = (m_image_x_size + (m_max_mcu_x_size - 1)) / m_max_mcu_x_size;
 
2524
  m_max_mcus_per_col = (m_image_y_size + (m_max_mcu_y_size - 1)) / m_max_mcu_y_size;
 
2525
 
 
2526
  // These values are for the *destination* pixels: after conversion.
 
2527
  if (m_scan_type == JPGD_GRAYSCALE)
 
2528
    m_dest_bytes_per_pixel = 1;
 
2529
  else
 
2530
    m_dest_bytes_per_pixel = 4;
 
2531
 
 
2532
  m_dest_bytes_per_scan_line = ((m_image_x_size + 15) & 0xFFF0) * m_dest_bytes_per_pixel;
 
2533
 
 
2534
  m_real_dest_bytes_per_scan_line = (m_image_x_size * m_dest_bytes_per_pixel);
 
2535
 
 
2536
  // Initialize two scan line buffers.
 
2537
  m_pScan_line_0 = (uint8 *)alloc(m_dest_bytes_per_scan_line, true);
 
2538
  if ((m_scan_type == JPGD_YH1V2) || (m_scan_type == JPGD_YH2V2))
 
2539
    m_pScan_line_1 = (uint8 *)alloc(m_dest_bytes_per_scan_line, true);
 
2540
 
 
2541
  m_max_blocks_per_row = m_max_mcus_per_row * m_max_blocks_per_mcu;
 
2542
 
 
2543
  // Should never happen
 
2544
  if (m_max_blocks_per_row > JPGD_MAX_BLOCKS_PER_ROW)
 
2545
    stop_decoding(JPGD_ASSERTION_ERROR);
 
2546
 
 
2547
  // Allocate the coefficient buffer, enough for one MCU
 
2548
  m_pMCU_coefficients = (jpgd_block_t*)alloc(m_max_blocks_per_mcu * 64 * sizeof(jpgd_block_t));
 
2549
 
 
2550
  for (i = 0; i < m_max_blocks_per_mcu; i++)
 
2551
    m_mcu_block_max_zag[i] = 64;
 
2552
 
 
2553
  m_expanded_blocks_per_component = m_comp_h_samp[0] * m_comp_v_samp[0];
 
2554
  m_expanded_blocks_per_mcu = m_expanded_blocks_per_component * m_comps_in_frame;
 
2555
  m_expanded_blocks_per_row = m_max_mcus_per_row * m_expanded_blocks_per_mcu;
 
2556
        // Freq. domain chroma upsampling is only supported for H2V2 subsampling factor (the most common one I've seen).
 
2557
  m_freq_domain_chroma_upsample = false;
 
2558
#if JPGD_SUPPORT_FREQ_DOMAIN_UPSAMPLING
 
2559
  m_freq_domain_chroma_upsample = (m_expanded_blocks_per_mcu == 4*3);
 
2560
#endif
 
2561
 
 
2562
  if (m_freq_domain_chroma_upsample)
 
2563
    m_pSample_buf = (uint8 *)alloc(m_expanded_blocks_per_row * 64);
 
2564
  else
 
2565
    m_pSample_buf = (uint8 *)alloc(m_max_blocks_per_row * 64);
 
2566
 
 
2567
  m_total_lines_left = m_image_y_size;
 
2568
 
 
2569
  m_mcu_lines_left = 0;
 
2570
 
 
2571
  create_look_ups();
 
2572
}
 
2573
 
 
2574
// The coeff_buf series of methods originally stored the coefficients
 
2575
// into a "virtual" file which was located in EMS, XMS, or a disk file. A cache
 
2576
// was used to make this process more efficient. Now, we can store the entire
 
2577
// thing in RAM.
 
2578
jpeg_decoder::coeff_buf* jpeg_decoder::coeff_buf_open(int block_num_x, int block_num_y, int block_len_x, int block_len_y)
 
2579
{
 
2580
  coeff_buf* cb = (coeff_buf*)alloc(sizeof(coeff_buf));
 
2581
 
 
2582
  cb->block_num_x = block_num_x;
 
2583
  cb->block_num_y = block_num_y;
 
2584
  cb->block_len_x = block_len_x;
 
2585
  cb->block_len_y = block_len_y;
 
2586
  cb->block_size = (block_len_x * block_len_y) * sizeof(jpgd_block_t);
 
2587
  cb->pData = (uint8 *)alloc(cb->block_size * block_num_x * block_num_y, true);
 
2588
  return cb;
 
2589
}
 
2590
 
 
2591
inline jpgd_block_t *jpeg_decoder::coeff_buf_getp(coeff_buf *cb, int block_x, int block_y)
 
2592
{
 
2593
  JPGD_ASSERT((block_x < cb->block_num_x) && (block_y < cb->block_num_y));
 
2594
  return (jpgd_block_t *)(cb->pData + block_x * cb->block_size + block_y * (cb->block_size * cb->block_num_x));
 
2595
}
 
2596
 
 
2597
// The following methods decode the various types of m_blocks encountered
 
2598
// in progressively encoded images.
 
2599
void jpeg_decoder::decode_block_dc_first(jpeg_decoder *pD, int component_id, int block_x, int block_y)
 
2600
{
 
2601
  int s, r;
 
2602
  jpgd_block_t *p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y);
 
2603
 
 
2604
  if ((s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_dc_tab[component_id]])) != 0)
 
2605
  {
 
2606
    r = pD->get_bits_no_markers(s);
 
2607
    s = JPGD_HUFF_EXTEND(r, s);
 
2608
  }
 
2609
 
 
2610
  pD->m_last_dc_val[component_id] = (s += pD->m_last_dc_val[component_id]);
 
2611
 
 
2612
  p[0] = static_cast<jpgd_block_t>(s << pD->m_successive_low);
 
2613
}
 
2614
 
 
2615
void jpeg_decoder::decode_block_dc_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y)
 
2616
{
 
2617
  if (pD->get_bits_no_markers(1))
 
2618
  {
 
2619
    jpgd_block_t *p = pD->coeff_buf_getp(pD->m_dc_coeffs[component_id], block_x, block_y);
 
2620
 
 
2621
    p[0] |= (1 << pD->m_successive_low);
 
2622
  }
 
2623
}
 
2624
 
 
2625
void jpeg_decoder::decode_block_ac_first(jpeg_decoder *pD, int component_id, int block_x, int block_y)
 
2626
{
 
2627
  int k, s, r;
 
2628
 
 
2629
  if (pD->m_eob_run)
 
2630
  {
 
2631
    pD->m_eob_run--;
 
2632
    return;
 
2633
  }
 
2634
 
 
2635
  jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y);
 
2636
 
 
2637
  for (k = pD->m_spectral_start; k <= pD->m_spectral_end; k++)
 
2638
  {
 
2639
    s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]);
 
2640
 
 
2641
    r = s >> 4;
 
2642
    s &= 15;
 
2643
 
 
2644
    if (s)
 
2645
    {
 
2646
      if ((k += r) > 63)
 
2647
        pD->stop_decoding(JPGD_DECODE_ERROR);
 
2648
 
 
2649
      r = pD->get_bits_no_markers(s);
 
2650
      s = JPGD_HUFF_EXTEND(r, s);
 
2651
 
 
2652
      p[g_ZAG[k]] = static_cast<jpgd_block_t>(s << pD->m_successive_low);
 
2653
    }
 
2654
    else
 
2655
    {
 
2656
      if (r == 15)
 
2657
      {
 
2658
        if ((k += 15) > 63)
 
2659
          pD->stop_decoding(JPGD_DECODE_ERROR);
 
2660
      }
 
2661
      else
 
2662
      {
 
2663
        pD->m_eob_run = 1 << r;
 
2664
 
 
2665
        if (r)
 
2666
          pD->m_eob_run += pD->get_bits_no_markers(r);
 
2667
 
 
2668
        pD->m_eob_run--;
 
2669
 
 
2670
        break;
 
2671
      }
 
2672
    }
 
2673
  }
 
2674
}
 
2675
 
 
2676
void jpeg_decoder::decode_block_ac_refine(jpeg_decoder *pD, int component_id, int block_x, int block_y)
 
2677
{
 
2678
  int s, k, r;
 
2679
  int p1 = 1 << pD->m_successive_low;
 
2680
  int m1 = (-1) << pD->m_successive_low;
 
2681
  jpgd_block_t *p = pD->coeff_buf_getp(pD->m_ac_coeffs[component_id], block_x, block_y);
 
2682
  
 
2683
  JPGD_ASSERT(pD->m_spectral_end <= 63);
 
2684
  
 
2685
  k = pD->m_spectral_start;
 
2686
  
 
2687
  if (pD->m_eob_run == 0)
 
2688
  {
 
2689
    for ( ; k <= pD->m_spectral_end; k++)
 
2690
    {
 
2691
      s = pD->huff_decode(pD->m_pHuff_tabs[pD->m_comp_ac_tab[component_id]]);
 
2692
 
 
2693
      r = s >> 4;
 
2694
      s &= 15;
 
2695
 
 
2696
      if (s)
 
2697
      {
 
2698
        if (s != 1)
 
2699
          pD->stop_decoding(JPGD_DECODE_ERROR);
 
2700
 
 
2701
        if (pD->get_bits_no_markers(1))
 
2702
          s = p1;
 
2703
        else
 
2704
          s = m1;
 
2705
      }
 
2706
      else
 
2707
      {
 
2708
        if (r != 15)
 
2709
        {
 
2710
          pD->m_eob_run = 1 << r;
 
2711
 
 
2712
          if (r)
 
2713
            pD->m_eob_run += pD->get_bits_no_markers(r);
 
2714
 
 
2715
          break;
 
2716
        }
 
2717
      }
 
2718
 
 
2719
      do
 
2720
      {
 
2721
        jpgd_block_t *this_coef = p + g_ZAG[k & 63];
 
2722
 
 
2723
        if (*this_coef != 0)
 
2724
        {
 
2725
          if (pD->get_bits_no_markers(1))
 
2726
          {
 
2727
            if ((*this_coef & p1) == 0)
 
2728
            {
 
2729
              if (*this_coef >= 0)
 
2730
                *this_coef = static_cast<jpgd_block_t>(*this_coef + p1);
 
2731
              else
 
2732
                *this_coef = static_cast<jpgd_block_t>(*this_coef + m1);
 
2733
            }
 
2734
          }
 
2735
        }
 
2736
        else
 
2737
        {
 
2738
          if (--r < 0)
 
2739
            break;
 
2740
        }
 
2741
 
 
2742
        k++;
 
2743
 
 
2744
      } while (k <= pD->m_spectral_end);
 
2745
 
 
2746
      if ((s) && (k < 64))
 
2747
      {
 
2748
        p[g_ZAG[k]] = static_cast<jpgd_block_t>(s);
 
2749
      }
 
2750
    }
 
2751
  }
 
2752
 
 
2753
  if (pD->m_eob_run > 0)
 
2754
  {
 
2755
    for ( ; k <= pD->m_spectral_end; k++)
 
2756
    {
 
2757
      jpgd_block_t *this_coef = p + g_ZAG[k & 63]; // logical AND to shut up static code analysis
 
2758
 
 
2759
      if (*this_coef != 0)
 
2760
      {
 
2761
        if (pD->get_bits_no_markers(1))
 
2762
        {
 
2763
          if ((*this_coef & p1) == 0)
 
2764
          {
 
2765
            if (*this_coef >= 0)
 
2766
              *this_coef = static_cast<jpgd_block_t>(*this_coef + p1);
 
2767
            else
 
2768
              *this_coef = static_cast<jpgd_block_t>(*this_coef + m1);
 
2769
          }
 
2770
        }
 
2771
      }
 
2772
    }
 
2773
 
 
2774
    pD->m_eob_run--;
 
2775
  }
 
2776
}
 
2777
 
 
2778
// Decode a scan in a progressively encoded image.
 
2779
void jpeg_decoder::decode_scan(pDecode_block_func decode_block_func)
 
2780
{
 
2781
  int mcu_row, mcu_col, mcu_block;
 
2782
  int block_x_mcu[JPGD_MAX_COMPONENTS], m_block_y_mcu[JPGD_MAX_COMPONENTS];
 
2783
 
 
2784
  memset(m_block_y_mcu, 0, sizeof(m_block_y_mcu));
 
2785
 
 
2786
  for (mcu_col = 0; mcu_col < m_mcus_per_col; mcu_col++)
 
2787
  {
 
2788
    int component_num, component_id;
 
2789
 
 
2790
    memset(block_x_mcu, 0, sizeof(block_x_mcu));
 
2791
 
 
2792
    for (mcu_row = 0; mcu_row < m_mcus_per_row; mcu_row++)
 
2793
    {
 
2794
      int block_x_mcu_ofs = 0, block_y_mcu_ofs = 0;
 
2795
 
 
2796
      if ((m_restart_interval) && (m_restarts_left == 0))
 
2797
        process_restart();
 
2798
 
 
2799
      for (mcu_block = 0; mcu_block < m_blocks_per_mcu; mcu_block++)
 
2800
      {
 
2801
        component_id = m_mcu_org[mcu_block];
 
2802
 
 
2803
        decode_block_func(this, component_id, block_x_mcu[component_id] + block_x_mcu_ofs, m_block_y_mcu[component_id] + block_y_mcu_ofs);
 
2804
 
 
2805
        if (m_comps_in_scan == 1)
 
2806
          block_x_mcu[component_id]++;
 
2807
        else
 
2808
        {
 
2809
          if (++block_x_mcu_ofs == m_comp_h_samp[component_id])
 
2810
          {
 
2811
            block_x_mcu_ofs = 0;
 
2812
 
 
2813
            if (++block_y_mcu_ofs == m_comp_v_samp[component_id])
 
2814
            {
 
2815
              block_y_mcu_ofs = 0;
 
2816
              block_x_mcu[component_id] += m_comp_h_samp[component_id];
 
2817
            }
 
2818
          }
 
2819
        }
 
2820
      }
 
2821
 
 
2822
      m_restarts_left--;
 
2823
    }
 
2824
 
 
2825
    if (m_comps_in_scan == 1)
 
2826
      m_block_y_mcu[m_comp_list[0]]++;
 
2827
    else
 
2828
    {
 
2829
      for (component_num = 0; component_num < m_comps_in_scan; component_num++)
 
2830
      {
 
2831
        component_id = m_comp_list[component_num];
 
2832
        m_block_y_mcu[component_id] += m_comp_v_samp[component_id];
 
2833
      }
 
2834
    }
 
2835
  }
 
2836
}
 
2837
 
 
2838
// Decode a progressively encoded image.
 
2839
void jpeg_decoder::init_progressive()
 
2840
{
 
2841
  int i;
 
2842
 
 
2843
  if (m_comps_in_frame == 4)
 
2844
    stop_decoding(JPGD_UNSUPPORTED_COLORSPACE);
 
2845
 
 
2846
  // Allocate the coefficient buffers.
 
2847
  for (i = 0; i < m_comps_in_frame; i++)
 
2848
  {
 
2849
    m_dc_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 1, 1);
 
2850
    m_ac_coeffs[i] = coeff_buf_open(m_max_mcus_per_row * m_comp_h_samp[i], m_max_mcus_per_col * m_comp_v_samp[i], 8, 8);
 
2851
  }
 
2852
 
 
2853
  for ( ; ; )
 
2854
  {
 
2855
    int dc_only_scan, refinement_scan;
 
2856
    pDecode_block_func decode_block_func;
 
2857
 
 
2858
    if (!init_scan())
 
2859
      break;
 
2860
 
 
2861
    dc_only_scan = (m_spectral_start == 0);
 
2862
    refinement_scan = (m_successive_high != 0);
 
2863
 
 
2864
    if ((m_spectral_start > m_spectral_end) || (m_spectral_end > 63))
 
2865
      stop_decoding(JPGD_BAD_SOS_SPECTRAL);
 
2866
 
 
2867
    if (dc_only_scan)
 
2868
    {
 
2869
      if (m_spectral_end)
 
2870
        stop_decoding(JPGD_BAD_SOS_SPECTRAL);
 
2871
    }
 
2872
    else if (m_comps_in_scan != 1)  /* AC scans can only contain one component */
 
2873
      stop_decoding(JPGD_BAD_SOS_SPECTRAL);
 
2874
 
 
2875
    if ((refinement_scan) && (m_successive_low != m_successive_high - 1))
 
2876
      stop_decoding(JPGD_BAD_SOS_SUCCESSIVE);
 
2877
 
 
2878
    if (dc_only_scan)
 
2879
    {
 
2880
      if (refinement_scan)
 
2881
        decode_block_func = decode_block_dc_refine;
 
2882
      else
 
2883
        decode_block_func = decode_block_dc_first;
 
2884
    }
 
2885
    else
 
2886
    {
 
2887
      if (refinement_scan)
 
2888
        decode_block_func = decode_block_ac_refine;
 
2889
      else
 
2890
        decode_block_func = decode_block_ac_first;
 
2891
    }
 
2892
 
 
2893
    decode_scan(decode_block_func);
 
2894
 
 
2895
    m_bits_left = 16;
 
2896
    get_bits(16);
 
2897
    get_bits(16);
 
2898
  }
 
2899
 
 
2900
  m_comps_in_scan = m_comps_in_frame;
 
2901
 
 
2902
  for (i = 0; i < m_comps_in_frame; i++)
 
2903
    m_comp_list[i] = i;
 
2904
 
 
2905
  calc_mcu_block_order();
 
2906
}
 
2907
 
 
2908
void jpeg_decoder::init_sequential()
 
2909
{
 
2910
  if (!init_scan())
 
2911
    stop_decoding(JPGD_UNEXPECTED_MARKER);
 
2912
}
 
2913
 
 
2914
void jpeg_decoder::decode_start()
 
2915
{
 
2916
  init_frame();
 
2917
 
 
2918
  if (m_progressive_flag)
 
2919
    init_progressive();
 
2920
  else
 
2921
    init_sequential();
 
2922
}
 
2923
 
 
2924
void jpeg_decoder::decode_init(jpeg_decoder_stream *pStream)
 
2925
{
 
2926
  init(pStream);
 
2927
  locate_sof_marker();
 
2928
}
 
2929
 
 
2930
jpeg_decoder::jpeg_decoder(jpeg_decoder_stream *pStream)
 
2931
{
 
2932
  if (setjmp(m_jmp_state))
 
2933
    return;
 
2934
  decode_init(pStream);
 
2935
}
 
2936
 
 
2937
int jpeg_decoder::begin_decoding()
 
2938
{
 
2939
  if (m_ready_flag)
 
2940
    return JPGD_SUCCESS;
 
2941
 
 
2942
  if (m_error_code)
 
2943
    return JPGD_FAILED;
 
2944
 
 
2945
  if (setjmp(m_jmp_state))
 
2946
    return JPGD_FAILED;
 
2947
 
 
2948
  decode_start();
 
2949
 
 
2950
  m_ready_flag = true;
 
2951
 
 
2952
  return JPGD_SUCCESS;
 
2953
}
 
2954
 
 
2955
jpeg_decoder::~jpeg_decoder()
 
2956
{
 
2957
  free_all_blocks();
 
2958
}
 
2959
 
 
2960
jpeg_decoder_file_stream::jpeg_decoder_file_stream()
 
2961
{
 
2962
  m_pFile = NULL;
 
2963
  m_eof_flag = false;
 
2964
  m_error_flag = false;
 
2965
}
 
2966
 
 
2967
void jpeg_decoder_file_stream::close()
 
2968
{
 
2969
  if (m_pFile)
 
2970
  {
 
2971
    fclose(m_pFile);
 
2972
    m_pFile = NULL;
 
2973
  }
 
2974
 
 
2975
  m_eof_flag = false;
 
2976
  m_error_flag = false;
 
2977
}
 
2978
 
 
2979
jpeg_decoder_file_stream::~jpeg_decoder_file_stream()
 
2980
{
 
2981
  close();
 
2982
}
 
2983
 
 
2984
bool jpeg_decoder_file_stream::open(const char *Pfilename)
 
2985
{
 
2986
  close();
 
2987
 
 
2988
  m_eof_flag = false;
 
2989
  m_error_flag = false;
 
2990
 
 
2991
#if defined(_MSC_VER)
 
2992
  m_pFile = NULL;
 
2993
  fopen_s(&m_pFile, Pfilename, "rb");
 
2994
#else
 
2995
  m_pFile = fopen(Pfilename, "rb");
 
2996
#endif
 
2997
  return m_pFile != NULL;
 
2998
}
 
2999
 
 
3000
int jpeg_decoder_file_stream::read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag)
 
3001
{
 
3002
  if (!m_pFile)
 
3003
    return -1;
 
3004
 
 
3005
  if (m_eof_flag)
 
3006
  {
 
3007
    *pEOF_flag = true;
 
3008
    return 0;
 
3009
  }
 
3010
 
 
3011
  if (m_error_flag)
 
3012
    return -1;
 
3013
 
 
3014
  int bytes_read = static_cast<int>(fread(pBuf, 1, max_bytes_to_read, m_pFile));
 
3015
  if (bytes_read < max_bytes_to_read)
 
3016
  {
 
3017
    if (ferror(m_pFile))
 
3018
    {
 
3019
      m_error_flag = true;
 
3020
      return -1;
 
3021
    }
 
3022
 
 
3023
    m_eof_flag = true;
 
3024
    *pEOF_flag = true;
 
3025
  }
 
3026
 
 
3027
  return bytes_read;
 
3028
}
 
3029
 
 
3030
bool jpeg_decoder_mem_stream::open(const uint8 *pSrc_data, uint size)
 
3031
{
 
3032
  close();
 
3033
  m_pSrc_data = pSrc_data;
 
3034
  m_ofs = 0;
 
3035
  m_size = size;
 
3036
  return true;
 
3037
}
 
3038
 
 
3039
int jpeg_decoder_mem_stream::read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag)
 
3040
{
 
3041
  *pEOF_flag = false;
 
3042
 
 
3043
  if (!m_pSrc_data)
 
3044
    return -1;
 
3045
 
 
3046
  uint bytes_remaining = m_size - m_ofs;
 
3047
  if ((uint)max_bytes_to_read > bytes_remaining)
 
3048
  {
 
3049
    max_bytes_to_read = bytes_remaining;
 
3050
    *pEOF_flag = true;
 
3051
  }
 
3052
 
 
3053
  memcpy(pBuf, m_pSrc_data + m_ofs, max_bytes_to_read);
 
3054
  m_ofs += max_bytes_to_read;
 
3055
 
 
3056
  return max_bytes_to_read;
 
3057
}
 
3058
 
 
3059
unsigned char *decompress_jpeg_image_from_stream(jpeg_decoder_stream *pStream, int *width, int *height, int *actual_comps, int req_comps)
 
3060
{
 
3061
  if (!actual_comps)
 
3062
    return NULL;
 
3063
  *actual_comps = 0;
 
3064
 
 
3065
  if ((!pStream) || (!width) || (!height) || (!req_comps))
 
3066
    return NULL;
 
3067
 
 
3068
  if ((req_comps != 1) && (req_comps != 3) && (req_comps != 4))
 
3069
    return NULL;
 
3070
 
 
3071
  jpeg_decoder decoder(pStream);
 
3072
  if (decoder.get_error_code() != JPGD_SUCCESS)
 
3073
    return NULL;
 
3074
 
 
3075
  const int image_width = decoder.get_width(), image_height = decoder.get_height();
 
3076
  *width = image_width;
 
3077
  *height = image_height;
 
3078
  *actual_comps = decoder.get_num_components();
 
3079
 
 
3080
  if (decoder.begin_decoding() != JPGD_SUCCESS)
 
3081
    return NULL;
 
3082
 
 
3083
  const int dst_bpl = image_width * req_comps;
 
3084
 
 
3085
  uint8 *pImage_data = (uint8*)jpgd_malloc(dst_bpl * image_height);
 
3086
  if (!pImage_data)
 
3087
    return NULL;
 
3088
 
 
3089
  for (int y = 0; y < image_height; y++)
 
3090
  {
 
3091
    const uint8* pScan_line;
 
3092
    uint scan_line_len;
 
3093
    if (decoder.decode((const void**)&pScan_line, &scan_line_len) != JPGD_SUCCESS)
 
3094
    {
 
3095
      jpgd_free(pImage_data);
 
3096
      return NULL;
 
3097
    }
 
3098
 
 
3099
    uint8 *pDst = pImage_data + y * dst_bpl;
 
3100
 
 
3101
    if (((req_comps == 1) && (decoder.get_num_components() == 1)) || ((req_comps == 4) && (decoder.get_num_components() == 3)))
 
3102
      memcpy(pDst, pScan_line, dst_bpl);
 
3103
    else if (decoder.get_num_components() == 1)
 
3104
    {
 
3105
      if (req_comps == 3)
 
3106
      {
 
3107
        for (int x = 0; x < image_width; x++)
 
3108
        {
 
3109
          uint8 luma = pScan_line[x];
 
3110
          pDst[0] = luma;
 
3111
          pDst[1] = luma;
 
3112
          pDst[2] = luma;
 
3113
          pDst += 3;
 
3114
        }
 
3115
      }
 
3116
      else
 
3117
      {
 
3118
        for (int x = 0; x < image_width; x++)
 
3119
        {
 
3120
          uint8 luma = pScan_line[x];
 
3121
          pDst[0] = luma;
 
3122
          pDst[1] = luma;
 
3123
          pDst[2] = luma;
 
3124
          pDst[3] = 255;
 
3125
          pDst += 4;
 
3126
        }
 
3127
      }
 
3128
    }
 
3129
    else if (decoder.get_num_components() == 3)
 
3130
    {
 
3131
      if (req_comps == 1)
 
3132
      {
 
3133
        const int YR = 19595, YG = 38470, YB = 7471;
 
3134
        for (int x = 0; x < image_width; x++)
 
3135
        {
 
3136
          int r = pScan_line[x*4+0];
 
3137
          int g = pScan_line[x*4+1];
 
3138
          int b = pScan_line[x*4+2];
 
3139
          *pDst++ = static_cast<uint8>((r * YR + g * YG + b * YB + 32768) >> 16);
 
3140
        }
 
3141
      }
 
3142
      else
 
3143
      {
 
3144
        for (int x = 0; x < image_width; x++)
 
3145
        {
 
3146
          pDst[0] = pScan_line[x*4+0];
 
3147
          pDst[1] = pScan_line[x*4+1];
 
3148
          pDst[2] = pScan_line[x*4+2];
 
3149
          pDst += 3;
 
3150
        }
 
3151
      }
 
3152
    }
 
3153
  }
 
3154
 
 
3155
  return pImage_data;
 
3156
}
 
3157
 
 
3158
unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data, int src_data_size, int *width, int *height, int *actual_comps, int req_comps)
 
3159
{
 
3160
  jpgd::jpeg_decoder_mem_stream mem_stream(pSrc_data, src_data_size);
 
3161
  return decompress_jpeg_image_from_stream(&mem_stream, width, height, actual_comps, req_comps);
 
3162
}
 
3163
 
 
3164
unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename, int *width, int *height, int *actual_comps, int req_comps)
 
3165
{
 
3166
  jpgd::jpeg_decoder_file_stream file_stream;
 
3167
  if (!file_stream.open(pSrc_filename))
 
3168
    return NULL;
 
3169
  return decompress_jpeg_image_from_stream(&file_stream, width, height, actual_comps, req_comps);
 
3170
}
 
3171
 
 
3172
} // namespace jpgd
 
 
b'\\ No newline at end of file'