/src/LibRaw/src/decoders/decoders_dcraw.cpp
Line | Count | Source |
1 | | /* -*- C++ -*- |
2 | | * Copyright 2019-2025 LibRaw LLC (info@libraw.org) |
3 | | * |
4 | | LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, |
5 | | dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. |
6 | | LibRaw do not use RESTRICTED code from dcraw.c |
7 | | |
8 | | LibRaw is free software; you can redistribute it and/or modify |
9 | | it under the terms of the one of two licenses as you choose: |
10 | | |
11 | | 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 |
12 | | (See file LICENSE.LGPL provided in LibRaw distribution archive for details). |
13 | | |
14 | | 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 |
15 | | (See file LICENSE.CDDL provided in LibRaw distribution archive for details). |
16 | | |
17 | | */ |
18 | | |
19 | | #include "../../internal/dcraw_defs.h" |
20 | | #include "../../internal/libraw_cameraids.h" |
21 | | |
22 | | unsigned LibRaw::getbithuff(int nbits, ushort *huff) |
23 | 1.01G | { |
24 | | #ifdef LIBRAW_NOTHREADS |
25 | | static unsigned bitbuf = 0; |
26 | | static int vbits = 0, reset = 0; |
27 | | #else |
28 | 1.01G | #define bitbuf tls->getbits.bitbuf |
29 | 1.01G | #define vbits tls->getbits.vbits |
30 | 1.01G | #define reset tls->getbits.reset |
31 | 1.01G | #endif |
32 | 1.01G | unsigned c; |
33 | | |
34 | 1.01G | if (nbits > 25) |
35 | 541k | return 0; |
36 | 1.01G | if (nbits < 0) |
37 | 18.2k | return bitbuf = vbits = reset = 0; |
38 | 1.01G | if (nbits == 0 || vbits < 0) |
39 | 968M | return 0; |
40 | 51.1M | while (!reset && vbits < nbits && (c = fgetc(ifp)) != (unsigned)EOF && |
41 | 2.60M | !(reset = zero_after_ff && c == 0xff && fgetc(ifp))) |
42 | 2.60M | { |
43 | 2.60M | bitbuf = (bitbuf << 8) + (uchar)c; |
44 | 2.60M | vbits += 8; |
45 | 2.60M | } |
46 | 48.5M | c = vbits == 0 ? 0 : bitbuf << (32 - vbits) >> (32 - nbits); |
47 | 48.5M | if (huff) |
48 | 45.2M | { |
49 | 45.2M | vbits -= huff[c] >> 8; |
50 | 45.2M | c = (uchar)huff[c]; |
51 | 45.2M | } |
52 | 3.29M | else |
53 | 3.29M | vbits -= nbits; |
54 | 48.5M | if (vbits < 0) |
55 | 5.77k | derror(); |
56 | 48.5M | return c; |
57 | 1.01G | #ifndef LIBRAW_NOTHREADS |
58 | 1.01G | #undef bitbuf |
59 | 1.01G | #undef vbits |
60 | 1.01G | #undef reset |
61 | 1.01G | #endif |
62 | 1.01G | } |
63 | | |
64 | | /* |
65 | | Construct a decode tree according the specification in *source. |
66 | | The first 16 bytes specify how many codes should be 1-bit, 2-bit |
67 | | 3-bit, etc. Bytes after that are the leaf values. |
68 | | |
69 | | For example, if the source is |
70 | | |
71 | | { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0, |
72 | | 0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff }, |
73 | | |
74 | | then the code is |
75 | | |
76 | | 00 0x04 |
77 | | 010 0x03 |
78 | | 011 0x05 |
79 | | 100 0x06 |
80 | | 101 0x02 |
81 | | 1100 0x07 |
82 | | 1101 0x01 |
83 | | 11100 0x08 |
84 | | 11101 0x09 |
85 | | 11110 0x00 |
86 | | 111110 0x0a |
87 | | 1111110 0x0b |
88 | | 1111111 0xff |
89 | | */ |
90 | | ushort *LibRaw::make_decoder_ref(const uchar **source) |
91 | 2.15k | { |
92 | 2.15k | int max, len, h, i, j; |
93 | 2.15k | const uchar *count; |
94 | 2.15k | ushort *huff; |
95 | | |
96 | 2.15k | count = (*source += 16) - 17; |
97 | 22.4k | for (max = 16; max && !count[max]; max--) |
98 | 20.3k | ; |
99 | 2.15k | huff = (ushort *)calloc(1 + (1 << max), sizeof *huff); |
100 | 2.15k | huff[0] = max; |
101 | 16.3k | for (h = len = 1; len <= max; len++) |
102 | 297k | for (i = 0; i < count[len]; i++, ++*source) |
103 | 77.3M | for (j = 0; j < 1 << (max - len); j++) |
104 | 77.0M | if (h <= 1 << max) |
105 | 15.9M | huff[h++] = len << 8 | **source; |
106 | 2.15k | return huff; |
107 | 2.15k | } |
108 | | |
109 | | ushort *LibRaw::make_decoder(const uchar *source) |
110 | 861 | { |
111 | 861 | return make_decoder_ref(&source); |
112 | 861 | } |
113 | | |
114 | | void LibRaw::crw_init_tables(unsigned table, ushort *huff[2]) |
115 | 61 | { |
116 | 61 | static const uchar first_tree[3][29] = { |
117 | 61 | {0, 1, 4, 2, 3, 1, 2, 0, 0, 0, |
118 | 61 | 0, 0, 0, 0, 0, 0, 0x04, 0x03, 0x05, 0x06, |
119 | 61 | 0x02, 0x07, 0x01, 0x08, 0x09, 0x00, 0x0a, 0x0b, 0xff}, |
120 | 61 | {0, 2, 2, 3, 1, 1, 1, 1, 2, 0, |
121 | 61 | 0, 0, 0, 0, 0, 0, 0x03, 0x02, 0x04, 0x01, |
122 | 61 | 0x05, 0x00, 0x06, 0x07, 0x09, 0x08, 0x0a, 0x0b, 0xff}, |
123 | 61 | {0, 0, 6, 3, 1, 1, 2, 0, 0, 0, |
124 | 61 | 0, 0, 0, 0, 0, 0, 0x06, 0x05, 0x07, 0x04, |
125 | 61 | 0x08, 0x03, 0x09, 0x02, 0x00, 0x0a, 0x01, 0x0b, 0xff}, |
126 | 61 | }; |
127 | 61 | static const uchar second_tree[3][180] = { |
128 | 61 | {0, 2, 2, 2, 1, 4, 2, 1, 2, 5, 1, 1, |
129 | 61 | 0, 0, 0, 139, 0x03, 0x04, 0x02, 0x05, 0x01, 0x06, 0x07, 0x08, |
130 | 61 | 0x12, 0x13, 0x11, 0x14, 0x09, 0x15, 0x22, 0x00, 0x21, 0x16, 0x0a, 0xf0, |
131 | 61 | 0x23, 0x17, 0x24, 0x31, 0x32, 0x18, 0x19, 0x33, 0x25, 0x41, 0x34, 0x42, |
132 | 61 | 0x35, 0x51, 0x36, 0x37, 0x38, 0x29, 0x79, 0x26, 0x1a, 0x39, 0x56, 0x57, |
133 | 61 | 0x28, 0x27, 0x52, 0x55, 0x58, 0x43, 0x76, 0x59, 0x77, 0x54, 0x61, 0xf9, |
134 | 61 | 0x71, 0x78, 0x75, 0x96, 0x97, 0x49, 0xb7, 0x53, 0xd7, 0x74, 0xb6, 0x98, |
135 | 61 | 0x47, 0x48, 0x95, 0x69, 0x99, 0x91, 0xfa, 0xb8, 0x68, 0xb5, 0xb9, 0xd6, |
136 | 61 | 0xf7, 0xd8, 0x67, 0x46, 0x45, 0x94, 0x89, 0xf8, 0x81, 0xd5, 0xf6, 0xb4, |
137 | 61 | 0x88, 0xb1, 0x2a, 0x44, 0x72, 0xd9, 0x87, 0x66, 0xd4, 0xf5, 0x3a, 0xa7, |
138 | 61 | 0x73, 0xa9, 0xa8, 0x86, 0x62, 0xc7, 0x65, 0xc8, 0xc9, 0xa1, 0xf4, 0xd1, |
139 | 61 | 0xe9, 0x5a, 0x92, 0x85, 0xa6, 0xe7, 0x93, 0xe8, 0xc1, 0xc6, 0x7a, 0x64, |
140 | 61 | 0xe1, 0x4a, 0x6a, 0xe6, 0xb3, 0xf1, 0xd3, 0xa5, 0x8a, 0xb2, 0x9a, 0xba, |
141 | 61 | 0x84, 0xa4, 0x63, 0xe5, 0xc5, 0xf3, 0xd2, 0xc4, 0x82, 0xaa, 0xda, 0xe4, |
142 | 61 | 0xf2, 0xca, 0x83, 0xa3, 0xa2, 0xc3, 0xea, 0xc2, 0xe2, 0xe3, 0xff, 0xff}, |
143 | 61 | {0, 2, 2, 1, 4, 1, 4, 1, 3, 3, 1, 0, |
144 | 61 | 0, 0, 0, 140, 0x02, 0x03, 0x01, 0x04, 0x05, 0x12, 0x11, 0x06, |
145 | 61 | 0x13, 0x07, 0x08, 0x14, 0x22, 0x09, 0x21, 0x00, 0x23, 0x15, 0x31, 0x32, |
146 | 61 | 0x0a, 0x16, 0xf0, 0x24, 0x33, 0x41, 0x42, 0x19, 0x17, 0x25, 0x18, 0x51, |
147 | 61 | 0x34, 0x43, 0x52, 0x29, 0x35, 0x61, 0x39, 0x71, 0x62, 0x36, 0x53, 0x26, |
148 | 61 | 0x38, 0x1a, 0x37, 0x81, 0x27, 0x91, 0x79, 0x55, 0x45, 0x28, 0x72, 0x59, |
149 | 61 | 0xa1, 0xb1, 0x44, 0x69, 0x54, 0x58, 0xd1, 0xfa, 0x57, 0xe1, 0xf1, 0xb9, |
150 | 61 | 0x49, 0x47, 0x63, 0x6a, 0xf9, 0x56, 0x46, 0xa8, 0x2a, 0x4a, 0x78, 0x99, |
151 | 61 | 0x3a, 0x75, 0x74, 0x86, 0x65, 0xc1, 0x76, 0xb6, 0x96, 0xd6, 0x89, 0x85, |
152 | 61 | 0xc9, 0xf5, 0x95, 0xb4, 0xc7, 0xf7, 0x8a, 0x97, 0xb8, 0x73, 0xb7, 0xd8, |
153 | 61 | 0xd9, 0x87, 0xa7, 0x7a, 0x48, 0x82, 0x84, 0xea, 0xf4, 0xa6, 0xc5, 0x5a, |
154 | 61 | 0x94, 0xa4, 0xc6, 0x92, 0xc3, 0x68, 0xb5, 0xc8, 0xe4, 0xe5, 0xe6, 0xe9, |
155 | 61 | 0xa2, 0xa3, 0xe3, 0xc2, 0x66, 0x67, 0x93, 0xaa, 0xd4, 0xd5, 0xe7, 0xf8, |
156 | 61 | 0x88, 0x9a, 0xd7, 0x77, 0xc4, 0x64, 0xe2, 0x98, 0xa5, 0xca, 0xda, 0xe8, |
157 | 61 | 0xf3, 0xf6, 0xa9, 0xb2, 0xb3, 0xf2, 0xd2, 0x83, 0xba, 0xd3, 0xff, 0xff}, |
158 | 61 | {0, 0, 6, 2, 1, 3, 3, 2, 5, 1, 2, 2, |
159 | 61 | 8, 10, 0, 117, 0x04, 0x05, 0x03, 0x06, 0x02, 0x07, 0x01, 0x08, |
160 | 61 | 0x09, 0x12, 0x13, 0x14, 0x11, 0x15, 0x0a, 0x16, 0x17, 0xf0, 0x00, 0x22, |
161 | 61 | 0x21, 0x18, 0x23, 0x19, 0x24, 0x32, 0x31, 0x25, 0x33, 0x38, 0x37, 0x34, |
162 | 61 | 0x35, 0x36, 0x39, 0x79, 0x57, 0x58, 0x59, 0x28, 0x56, 0x78, 0x27, 0x41, |
163 | 61 | 0x29, 0x77, 0x26, 0x42, 0x76, 0x99, 0x1a, 0x55, 0x98, 0x97, 0xf9, 0x48, |
164 | 61 | 0x54, 0x96, 0x89, 0x47, 0xb7, 0x49, 0xfa, 0x75, 0x68, 0xb6, 0x67, 0x69, |
165 | 61 | 0xb9, 0xb8, 0xd8, 0x52, 0xd7, 0x88, 0xb5, 0x74, 0x51, 0x46, 0xd9, 0xf8, |
166 | 61 | 0x3a, 0xd6, 0x87, 0x45, 0x7a, 0x95, 0xd5, 0xf6, 0x86, 0xb4, 0xa9, 0x94, |
167 | 61 | 0x53, 0x2a, 0xa8, 0x43, 0xf5, 0xf7, 0xd4, 0x66, 0xa7, 0x5a, 0x44, 0x8a, |
168 | 61 | 0xc9, 0xe8, 0xc8, 0xe7, 0x9a, 0x6a, 0x73, 0x4a, 0x61, 0xc7, 0xf4, 0xc6, |
169 | 61 | 0x65, 0xe9, 0x72, 0xe6, 0x71, 0x91, 0x93, 0xa6, 0xda, 0x92, 0x85, 0x62, |
170 | 61 | 0xf3, 0xc5, 0xb2, 0xa4, 0x84, 0xba, 0x64, 0xa5, 0xb3, 0xd2, 0x81, 0xe5, |
171 | 61 | 0xd3, 0xaa, 0xc4, 0xca, 0xf2, 0xb1, 0xe4, 0xd1, 0x83, 0x63, 0xea, 0xc3, |
172 | 61 | 0xe2, 0x82, 0xf1, 0xa3, 0xc2, 0xa1, 0xc1, 0xe3, 0xa2, 0xe1, 0xff, 0xff}}; |
173 | 61 | if (table > 2) |
174 | 1 | table = 2; |
175 | 61 | huff[0] = make_decoder(first_tree[table]); |
176 | 61 | huff[1] = make_decoder(second_tree[table]); |
177 | 61 | } |
178 | | |
179 | | /* |
180 | | Return 0 if the image starts with compressed data, |
181 | | 1 if it starts with uncompressed low-order bits. |
182 | | |
183 | | In Canon compressed data, 0xff is always followed by 0x00. |
184 | | */ |
185 | | int LibRaw::canon_has_lowbits() |
186 | 61 | { |
187 | 61 | uchar test[0x4000]; |
188 | 61 | int ret = 1, i; |
189 | | |
190 | 61 | fseek(ifp, 0, SEEK_SET); |
191 | 61 | fread(test, 1, sizeof test, ifp); |
192 | 70.8k | for (i = 540; i < int(sizeof test - 1); i++) |
193 | 70.8k | if (test[i] == 0xff) |
194 | 428 | { |
195 | 428 | if (test[i + 1]) |
196 | 61 | return 1; |
197 | 367 | ret = 0; |
198 | 367 | } |
199 | 0 | return ret; |
200 | 61 | } |
201 | | |
202 | | void LibRaw::canon_load_raw() |
203 | 61 | { |
204 | 61 | ushort *pixel, *prow, *huff[2]; |
205 | 61 | int nblocks, lowbits, i, c, row, r, val; |
206 | 61 | INT64 save; |
207 | 61 | int block, diffbuf[64], leaf, len, diff, carry = 0, pnum = 0, base[2]; |
208 | | |
209 | 61 | crw_init_tables(tiff_compress, huff); |
210 | 61 | lowbits = canon_has_lowbits(); |
211 | 61 | if (!lowbits) |
212 | 0 | maximum = 0x3ff; |
213 | 61 | fseek(ifp, 540 + lowbits * raw_height * raw_width / 4, SEEK_SET); |
214 | 61 | zero_after_ff = 1; |
215 | 61 | getbits(-1); |
216 | 61 | try |
217 | 61 | { |
218 | 18.9k | for (row = 0; row < raw_height; row += 8) |
219 | 18.9k | { |
220 | 18.9k | checkCancel(); |
221 | 18.9k | pixel = raw_image + row * raw_width; |
222 | 18.9k | nblocks = MIN(8, raw_height - row) * raw_width >> 6; |
223 | 80.3k | for (block = 0; block < nblocks; block++) |
224 | 61.4k | { |
225 | 61.4k | memset(diffbuf, 0, sizeof diffbuf); |
226 | 476k | for (i = 0; i < 64; i++) |
227 | 470k | { |
228 | 470k | leaf = gethuff(huff[i > 0]); |
229 | 470k | if (leaf == 0 && i) |
230 | 55.5k | break; |
231 | 415k | if (leaf == 0xff) |
232 | 62 | continue; |
233 | 415k | i += leaf >> 4; |
234 | 415k | len = leaf & 15; |
235 | 415k | if (len == 0) |
236 | 55.6k | continue; |
237 | 359k | diff = getbits(len); |
238 | 359k | if ((diff & (1 << (len - 1))) == 0) |
239 | 188k | diff -= (1 << len) - 1; |
240 | 359k | if (i < 64) |
241 | 359k | diffbuf[i] = diff; |
242 | 359k | } |
243 | 61.4k | diffbuf[0] += carry; |
244 | 61.4k | carry = diffbuf[0]; |
245 | 3.99M | for (i = 0; i < 64; i++) |
246 | 3.93M | { |
247 | 3.93M | if (pnum++ % raw_width == 0) |
248 | 140k | base[0] = base[1] = 512; |
249 | 3.93M | if ((pixel[(block << 6) + i] = base[i & 1] += diffbuf[i]) >> 10) |
250 | 482k | derror(); |
251 | 3.93M | } |
252 | 61.4k | } |
253 | 18.9k | if (lowbits) |
254 | 18.8k | { |
255 | 18.8k | save = ftell(ifp); |
256 | 18.8k | fseek(ifp, 26 + row * raw_width / 4, SEEK_SET); |
257 | 1.09M | for (prow = pixel, i = 0; i < raw_width * 2; i++) |
258 | 1.07M | { |
259 | 1.07M | c = fgetc(ifp); |
260 | 5.35M | for (r = 0; r < 8; r += 2, prow++) |
261 | 4.28M | { |
262 | 4.28M | val = (*prow << 2) + ((c >> r) & 3); |
263 | 4.28M | if (raw_width == 2672 && val < 512) |
264 | 0 | val += 2; |
265 | 4.28M | *prow = val; |
266 | 4.28M | } |
267 | 1.07M | } |
268 | 18.8k | fseek(ifp, save, SEEK_SET); |
269 | 18.8k | } |
270 | 18.9k | } |
271 | 61 | } |
272 | 61 | catch (...) |
273 | 61 | { |
274 | 82 | FORC(2) free(huff[c]); |
275 | 41 | throw; |
276 | 41 | } |
277 | 40 | FORC(2) free(huff[c]); |
278 | 20 | } |
279 | | |
280 | | int LibRaw::ljpeg_start(struct jhead *jh, int info_only) |
281 | 19.0k | { |
282 | 19.0k | ushort c, tag, len; |
283 | 19.0k | int cnt = 0; |
284 | 19.0k | std::vector<uchar> data_buffer(0x10000); |
285 | 19.0k | uchar* data = &data_buffer[0]; |
286 | 19.0k | const uchar *dp; |
287 | | |
288 | 19.0k | memset(jh, 0, sizeof *jh); |
289 | 19.0k | jh->restart = INT_MAX; |
290 | 19.0k | if (fread(data, 2, 1, ifp) != 1 || data[1] != 0xd8) |
291 | 16.8k | return 0; |
292 | 2.18k | do |
293 | 6.35k | { |
294 | 6.35k | if (feof(ifp)) |
295 | 27 | return 0; |
296 | 6.32k | if (cnt++ > 1024) |
297 | 0 | return 0; // 1024 tags limit |
298 | 6.32k | if (fread(data, 2, 2, ifp) != 2) |
299 | 37 | return 0; |
300 | 6.28k | tag = data[0] << 8 | data[1]; |
301 | 6.28k | len = (data[2] << 8 | data[3]) - 2; |
302 | 6.28k | if (tag <= 0xff00) |
303 | 692 | return 0; |
304 | 5.59k | if (fread(data, 1, len, ifp) != len) |
305 | 129 | return 0; |
306 | 5.46k | switch (tag) |
307 | 5.46k | { |
308 | 643 | case 0xffc3: // start of frame; lossless, Huffman |
309 | 643 | jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; |
310 | 672 | case 0xffc1: |
311 | 1.59k | case 0xffc0: |
312 | 1.59k | jh->algo = tag & 0xff; |
313 | 1.59k | jh->bits = data[0]; |
314 | 1.59k | jh->high = data[1] << 8 | data[2]; |
315 | 1.59k | jh->wide = data[3] << 8 | data[4]; |
316 | 1.59k | jh->clrs = data[5] + jh->sraw; |
317 | 1.59k | if (len == 9 && !dng_version) |
318 | 208 | getc(ifp); |
319 | 1.59k | break; |
320 | 1.24k | case 0xffc4: // define Huffman tables |
321 | 1.24k | if (info_only) |
322 | 912 | break; |
323 | 1.62k | for (dp = data; dp < data + len && !((c = *dp++) & -20);) |
324 | 1.29k | jh->free[c] = jh->huff[c] = make_decoder_ref(&dp); |
325 | 330 | break; |
326 | 1.30k | case 0xffda: // start of scan |
327 | 1.30k | jh->psv = data[1 + data[0] * 2]; |
328 | 1.30k | jh->bits -= data[3 + data[0] * 2] & 15; |
329 | 1.30k | break; |
330 | 879 | case 0xffdb: |
331 | 56.2k | FORC(64) jh->quant[c] = data[c * 2 + 1] << 8 | data[c * 2 + 2]; |
332 | 879 | break; |
333 | 220 | case 0xffdd: |
334 | 220 | jh->restart = data[0] << 8 | data[1]; |
335 | 5.46k | } |
336 | 5.46k | } while (tag != 0xffda); |
337 | 1.30k | if (jh->bits > 16 || jh->clrs > 6 || !jh->bits || !jh->high || !jh->wide || |
338 | 979 | !jh->clrs) |
339 | 331 | return 0; |
340 | 972 | if (info_only) |
341 | 726 | return 1; |
342 | 246 | if (!jh->huff[0]) |
343 | 3 | return 0; |
344 | 4.61k | FORC(19) if (!jh->huff[c + 1]) jh->huff[c + 1] = jh->huff[c]; |
345 | 243 | if (jh->sraw) |
346 | 43 | { |
347 | 172 | FORC(4) jh->huff[2 + c] = jh->huff[1]; |
348 | 127 | FORC(jh->sraw) jh->huff[1 + c] = jh->huff[0]; |
349 | 43 | } |
350 | 243 | jh->row = (ushort *)calloc(jh->wide * jh->clrs, 16); |
351 | 243 | return zero_after_ff = 1; |
352 | 246 | } |
353 | | |
354 | | void LibRaw::ljpeg_end(struct jhead *jh) |
355 | 231 | { |
356 | 231 | int c; |
357 | 924 | FORC4 if (jh->free[c]) free(jh->free[c]); |
358 | 231 | free(jh->row); |
359 | 231 | } |
360 | | |
361 | | int LibRaw::ljpeg_diff(ushort *huff) |
362 | 451M | { |
363 | 451M | int len, diff; |
364 | 451M | if (!huff) |
365 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
366 | | |
367 | 451M | len = gethuff(huff); |
368 | 451M | if (len == 16 && (!dng_version || dng_version >= 0x1010000)) |
369 | 14.9k | return -32768; |
370 | 451M | diff = getbits(len); |
371 | | |
372 | | |
373 | 451M | if ((diff & (1 << (len - 1))) == 0) |
374 | 450M | diff -= (1 << len) - 1; |
375 | 451M | return diff; |
376 | 451M | } |
377 | | |
378 | | ushort *LibRaw::ljpeg_row(int jrow, struct jhead *jh) |
379 | 701k | { |
380 | 701k | int col, c, diff, pred, spred = 0; |
381 | 701k | ushort mark = 0, *row[3]; |
382 | | |
383 | | // Use the optimized, unrolled version if possible. |
384 | 701k | if (!jh->sraw) |
385 | 636k | return ljpeg_row_unrolled(jrow, jh); |
386 | | |
387 | 65.2k | if (jh->restart != 0 && jrow * jh->wide % jh->restart == 0) |
388 | 42 | { |
389 | 252 | FORC(6) jh->vpred[c] = 1 << (jh->bits - 1); |
390 | 42 | if (jrow) |
391 | 0 | { |
392 | 0 | fseek(ifp, -2, SEEK_CUR); |
393 | 0 | do |
394 | 0 | mark = (mark << 8) + (c = fgetc(ifp)); |
395 | 0 | while (c != EOF && mark >> 4 != 0xffd); |
396 | 0 | } |
397 | 42 | getbits(-1); |
398 | 42 | } |
399 | 195k | FORC3 row[c] = jh->row + jh->wide * jh->clrs * ((jrow + c) & 1); |
400 | 11.1M | for (col = 0; col < jh->wide; col++) |
401 | 11.1M | FORC(jh->clrs) |
402 | 50.3M | { |
403 | 50.3M | diff = ljpeg_diff(jh->huff[c]); |
404 | 50.3M | if (jh->sraw && c <= jh->sraw && (col | c)) |
405 | 44.3M | pred = spred; |
406 | 5.98M | else if (col) |
407 | 5.86M | pred = row[0][-jh->clrs]; |
408 | 127k | else |
409 | 127k | pred = (jh->vpred[c] += diff) - diff; |
410 | 50.3M | if (jrow && col) |
411 | 49.8M | switch (jh->psv) |
412 | 49.8M | { |
413 | 21.6M | case 1: |
414 | 21.6M | break; |
415 | 102k | case 2: |
416 | 102k | pred = row[1][0]; |
417 | 102k | break; |
418 | 3.70M | case 3: |
419 | 3.70M | pred = row[1][-jh->clrs]; |
420 | 3.70M | break; |
421 | 16.6M | case 4: |
422 | 16.6M | pred = pred + row[1][0] - row[1][-jh->clrs]; |
423 | 16.6M | break; |
424 | 0 | case 5: |
425 | 0 | pred = pred + ((row[1][0] - row[1][-jh->clrs]) >> 1); |
426 | 0 | break; |
427 | 2.12M | case 6: |
428 | 2.12M | pred = row[1][0] + ((pred - row[1][-jh->clrs]) >> 1); |
429 | 2.12M | break; |
430 | 3.94M | case 7: |
431 | 3.94M | pred = (pred + row[1][0]) >> 1; |
432 | 3.94M | break; |
433 | 1.75M | default: |
434 | 1.75M | pred = 0; |
435 | 49.8M | } |
436 | 50.3M | if ((**row = pred + diff) >> jh->bits) |
437 | 11.1M | if(!(load_flags & 512)) |
438 | 11.1M | derror(); |
439 | 50.3M | if (c <= jh->sraw) |
440 | 44.3M | spred = **row; |
441 | 50.3M | row[0]++; |
442 | 50.3M | row[1]++; |
443 | 50.3M | } |
444 | 65.2k | return row[2]; |
445 | 65.2k | } |
446 | | |
447 | | ushort *LibRaw::ljpeg_row_unrolled(int jrow, struct jhead *jh) |
448 | 636k | { |
449 | 636k | int col, c, diff, pred; |
450 | 636k | ushort mark = 0, *row[3]; |
451 | | |
452 | 636k | if (jh->restart != 0 && jrow * jh->wide % jh->restart == 0) |
453 | 1.91k | { |
454 | 11.4k | FORC(6) jh->vpred[c] = 1 << (jh->bits - 1); |
455 | 1.91k | if (jrow) |
456 | 1.72k | { |
457 | 1.72k | fseek(ifp, -2, SEEK_CUR); |
458 | 1.72k | do |
459 | 351k | mark = (mark << 8) + (c = fgetc(ifp)); |
460 | 351k | while (c != EOF && mark >> 4 != 0xffd); |
461 | 1.72k | } |
462 | 1.91k | getbits(-1); |
463 | 1.91k | } |
464 | 1.90M | FORC3 row[c] = jh->row + jh->wide * jh->clrs * ((jrow + c) & 1); |
465 | | |
466 | | // The first column uses one particular predictor. |
467 | 636k | FORC(jh->clrs) |
468 | 1.90M | { |
469 | 1.90M | diff = ljpeg_diff(jh->huff[c]); |
470 | 1.90M | pred = (jh->vpred[c] += diff) - diff; |
471 | 1.90M | if ((**row = pred + diff) >> jh->bits) |
472 | 58.2k | derror(); |
473 | 1.90M | row[0]++; |
474 | 1.90M | row[1]++; |
475 | 1.90M | } |
476 | | |
477 | 636k | if (!jrow) |
478 | 187 | { |
479 | 131k | for (col = 1; col < jh->wide; col++) |
480 | 131k | FORC(jh->clrs) |
481 | 275k | { |
482 | 275k | diff = ljpeg_diff(jh->huff[c]); |
483 | 275k | pred = row[0][-jh->clrs]; |
484 | 275k | if ((**row = pred + diff) >> jh->bits) |
485 | 235k | derror(); |
486 | 275k | row[0]++; |
487 | 275k | row[1]++; |
488 | 275k | } |
489 | 187 | } |
490 | 636k | else if (jh->psv == 1) |
491 | 18.4k | { |
492 | 2.66M | for (col = 1; col < jh->wide; col++) |
493 | 2.64M | FORC(jh->clrs) |
494 | 6.57M | { |
495 | 6.57M | diff = ljpeg_diff(jh->huff[c]); |
496 | 6.57M | pred = row[0][-jh->clrs]; |
497 | 6.57M | if ((**row = pred + diff) >> jh->bits) |
498 | 732k | derror(); |
499 | 6.57M | row[0]++; |
500 | 6.57M | } |
501 | 18.4k | } |
502 | 617k | else |
503 | 617k | { |
504 | 2.03M | for (col = 1; col < jh->wide; col++) |
505 | 1.41M | FORC(jh->clrs) |
506 | 4.84M | { |
507 | 4.84M | diff = ljpeg_diff(jh->huff[c]); |
508 | 4.84M | pred = row[0][-jh->clrs]; |
509 | 4.84M | switch (jh->psv) |
510 | 4.84M | { |
511 | 0 | case 1: |
512 | 0 | break; |
513 | 184k | case 2: |
514 | 184k | pred = row[1][0]; |
515 | 184k | break; |
516 | 922k | case 3: |
517 | 922k | pred = row[1][-jh->clrs]; |
518 | 922k | break; |
519 | 135k | case 4: |
520 | 135k | pred = pred + row[1][0] - row[1][-jh->clrs]; |
521 | 135k | break; |
522 | 68.1k | case 5: |
523 | 68.1k | pred = pred + ((row[1][0] - row[1][-jh->clrs]) >> 1); |
524 | 68.1k | break; |
525 | 327k | case 6: |
526 | 327k | pred = row[1][0] + ((pred - row[1][-jh->clrs]) >> 1); |
527 | 327k | break; |
528 | 3.94k | case 7: |
529 | 3.94k | pred = (pred + row[1][0]) >> 1; |
530 | 3.94k | break; |
531 | 3.20M | default: |
532 | 3.20M | pred = 0; |
533 | 4.84M | } |
534 | 4.84M | if ((**row = pred + diff) >> jh->bits) |
535 | 314k | derror(); |
536 | 4.84M | row[0]++; |
537 | 4.84M | row[1]++; |
538 | 4.84M | } |
539 | 617k | } |
540 | 636k | return row[2]; |
541 | 636k | } |
542 | | |
543 | | void LibRaw::lossless_jpeg_load_raw() |
544 | 234 | { |
545 | 234 | int jwide, jhigh, jrow, jcol, val, jidx, i, j, row = 0, col = 0; |
546 | 234 | struct jhead jh; |
547 | 234 | ushort *rp; |
548 | | |
549 | 234 | if (!ljpeg_start(&jh, 0)) |
550 | 124 | return; |
551 | | |
552 | 110 | if (jh.wide < 1 || jh.high < 1 || jh.clrs < 1 || jh.bits < 1) |
553 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
554 | | |
555 | 110 | if(cr2_slice[0] && !cr2_slice[1]) |
556 | 1 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
557 | | |
558 | 109 | jwide = jh.wide * jh.clrs; |
559 | 109 | jhigh = jh.high; |
560 | 109 | if (jh.clrs == 4 && jwide >= raw_width * 2) |
561 | 4 | jhigh *= 2; |
562 | | |
563 | | |
564 | 109 | try |
565 | 109 | { |
566 | 24.9k | for (jrow = 0; jrow < jh.high; jrow++) |
567 | 24.8k | { |
568 | 24.8k | checkCancel(); |
569 | 24.8k | rp = ljpeg_row(jrow, &jh); |
570 | 24.8k | if (load_flags & 1) |
571 | 0 | row = jrow & 1 ? height - 1 - jrow / 2 : jrow / 2; |
572 | 26.8M | for (jcol = 0; jcol < jwide; jcol++) |
573 | 26.8M | { |
574 | 26.8M | val = curve[*rp++]; |
575 | 26.8M | if (cr2_slice[0]) |
576 | 21.1M | { |
577 | 21.1M | jidx = jrow * jwide + jcol; |
578 | 21.1M | i = jidx / (cr2_slice[1] * raw_height); |
579 | 21.1M | if ((j = i >= cr2_slice[0])) |
580 | 10.3M | i = cr2_slice[0]; |
581 | 21.1M | if(!cr2_slice[1+j]) |
582 | 7 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
583 | | |
584 | 21.1M | jidx -= i * (cr2_slice[1] * raw_height); |
585 | 21.1M | row = jidx / cr2_slice[1 + j]; |
586 | 21.1M | col = jidx % cr2_slice[1 + j] + i * cr2_slice[1]; |
587 | 21.1M | } |
588 | 26.8M | if (raw_width == 3984 && (col -= 2) < 0) |
589 | 0 | col += (row--, raw_width); |
590 | 26.8M | if (row > raw_height) |
591 | 13 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
592 | 26.8M | if (((unsigned)row < raw_height) && ((unsigned)col < raw_width)) |
593 | 26.8M | RAW(row, col) = val; |
594 | 26.8M | if (++col >= raw_width) |
595 | 11.0M | col = (row++, 0); |
596 | 26.8M | } |
597 | 24.8k | } |
598 | 109 | } |
599 | 109 | catch (...) |
600 | 109 | { |
601 | 66 | ljpeg_end(&jh); |
602 | 66 | throw; |
603 | 66 | } |
604 | 43 | ljpeg_end(&jh); |
605 | 43 | } |
606 | | |
607 | | void LibRaw::canon_sraw_load_raw() |
608 | 108 | { |
609 | 108 | struct jhead jh; |
610 | 108 | short *rp = 0, (*ip)[4]; |
611 | 108 | int jwide, slice, scol, ecol, row, col, jrow = 0, jcol = 0, pix[3], c; |
612 | 108 | int v[3] = {0, 0, 0}, ver, hue; |
613 | 108 | int saved_w = width, saved_h = height; |
614 | 108 | char *cp; |
615 | | |
616 | 108 | if(!image) |
617 | 1 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
618 | | |
619 | 107 | if (!ljpeg_start(&jh, 0) || jh.clrs < 4) |
620 | 12 | return; |
621 | 95 | jwide = (jh.wide >>= 1) * jh.clrs; |
622 | | |
623 | 95 | if (jwide < 32 || jwide > 65535) |
624 | 1 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
625 | | |
626 | 94 | if (load_flags & 256) |
627 | 38 | { |
628 | 38 | width = raw_width; |
629 | 38 | height = raw_height; |
630 | 38 | } |
631 | | |
632 | 94 | try |
633 | 94 | { |
634 | 566k | for (ecol = slice = 0; slice <= cr2_slice[0]; slice++) |
635 | 565k | { |
636 | 565k | scol = ecol; |
637 | 565k | ecol += cr2_slice[1] * 2 / jh.clrs; |
638 | 565k | if (!cr2_slice[0] || ecol > raw_width - 1) |
639 | 560k | ecol = raw_width & -2; |
640 | 63.0M | for (row = 0; row < height; row += (jh.clrs >> 1) - 1) |
641 | 62.4M | { |
642 | 62.4M | checkCancel(); |
643 | 62.4M | ip = (short(*)[4])image + row * width; |
644 | 69.1M | for (col = scol; col < ecol; col += 2, jcol += jh.clrs) |
645 | 6.67M | { |
646 | 6.67M | if ((jcol %= jwide) == 0) |
647 | 70.5k | rp = (short *)ljpeg_row(jrow++, &jh); |
648 | 6.67M | if (col >= width) |
649 | 0 | continue; |
650 | 6.67M | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) |
651 | 0 | { |
652 | 0 | FORC(jh.clrs - 2) |
653 | 0 | { |
654 | 0 | ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; |
655 | 0 | ip[col + (c >> 1) * width + (c & 1)][1] = |
656 | 0 | ip[col + (c >> 1) * width + (c & 1)][2] = 8192; |
657 | 0 | } |
658 | 0 | ip[col][1] = rp[jcol + jh.clrs - 2] - 8192; |
659 | 0 | ip[col][2] = rp[jcol + jh.clrs - 1] - 8192; |
660 | 0 | } |
661 | 6.67M | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB) |
662 | 0 | { |
663 | 0 | FORC(jh.clrs - 2) |
664 | 0 | ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; |
665 | 0 | ip[col][1] = rp[jcol + jh.clrs - 2] - 8192; |
666 | 0 | ip[col][2] = rp[jcol + jh.clrs - 1] - 8192; |
667 | 0 | } |
668 | 6.67M | else |
669 | 6.67M | { |
670 | 6.67M | FORC(jh.clrs - 2) |
671 | 20.6M | ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; |
672 | 6.67M | ip[col][1] = rp[jcol + jh.clrs - 2] - 16384; |
673 | 6.67M | ip[col][2] = rp[jcol + jh.clrs - 1] - 16384; |
674 | 6.67M | } |
675 | 6.67M | } |
676 | 62.4M | } |
677 | 565k | } |
678 | 94 | } |
679 | 94 | catch (...) |
680 | 94 | { |
681 | 22 | ljpeg_end(&jh); |
682 | 22 | throw; |
683 | 22 | } |
684 | | |
685 | 72 | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) |
686 | 0 | { |
687 | 0 | ljpeg_end(&jh); |
688 | 0 | maximum = 0x3fff; |
689 | 0 | height = saved_h; |
690 | 0 | width = saved_w; |
691 | 0 | return; |
692 | 0 | } |
693 | | |
694 | 72 | try |
695 | 72 | { |
696 | 812 | for (cp = model2; *cp && !isdigit(*cp); cp++) |
697 | 740 | ; |
698 | 72 | sscanf(cp, "%d.%d.%d", v, v + 1, v + 2); |
699 | 72 | ver = (v[0] * 1000 + v[1]) * 1000 + v[2]; |
700 | 72 | hue = (jh.sraw + 1) << 2; |
701 | 72 | if (unique_id >= 0x80000281ULL || |
702 | 54 | (unique_id == 0x80000218ULL && ver > 1000006)) |
703 | 18 | hue = jh.sraw << 1; |
704 | 72 | ip = (short(*)[4])image; |
705 | 72 | rp = ip[0]; |
706 | 8.90k | for (row = 0; row < height; row++, ip += width) |
707 | 8.83k | { |
708 | 8.83k | checkCancel(); |
709 | 8.83k | if (row & (jh.sraw >> 1)) |
710 | 1.61k | { |
711 | 2.94M | for (col = 0; col < width; col += 2) |
712 | 8.83M | for (c = 1; c < 3; c++) |
713 | 5.89M | if (row == height - 1) |
714 | 91.2k | { |
715 | 91.2k | ip[col][c] = ip[col - width][c]; |
716 | 91.2k | } |
717 | 5.80M | else |
718 | 5.80M | { |
719 | 5.80M | ip[col][c] = (ip[col - width][c] + ip[col + width][c] + 1) >> 1; |
720 | 5.80M | } |
721 | 1.61k | } |
722 | 7.46M | for (col = 1; col < width; col += 2) |
723 | 22.3M | for (c = 1; c < 3; c++) |
724 | 14.9M | if (col == width - 1) |
725 | 12.5k | ip[col][c] = ip[col - 1][c]; |
726 | 14.8M | else |
727 | 14.8M | ip[col][c] = (ip[col - 1][c] + ip[col + 1][c] + 1) >> 1; |
728 | 8.83k | } |
729 | 72 | if (!(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB)) |
730 | 14.9M | for (; rp < ip[0]; rp += 4) |
731 | 14.9M | { |
732 | 14.9M | checkCancel(); |
733 | 14.9M | if ((unique_id == CanonID_EOS_5D_Mark_II) || |
734 | 14.9M | (unique_id == CanonID_EOS_7D) || |
735 | 14.9M | (unique_id == CanonID_EOS_50D) || |
736 | 14.9M | (unique_id == CanonID_EOS_1D_Mark_IV) || |
737 | 14.9M | (unique_id == CanonID_EOS_60D)) |
738 | 0 | { |
739 | 0 | rp[1] = (rp[1] << 2) + hue; |
740 | 0 | rp[2] = (rp[2] << 2) + hue; |
741 | 0 | pix[0] = rp[0] + ((50 * rp[1] + 22929 * rp[2]) >> 14); |
742 | 0 | pix[1] = rp[0] + ((-5640 * rp[1] - 11751 * rp[2]) >> 14); |
743 | 0 | pix[2] = rp[0] + ((29040 * rp[1] - 101 * rp[2]) >> 14); |
744 | 0 | } |
745 | 14.9M | else |
746 | 14.9M | { |
747 | 14.9M | if (unique_id < CanonID_EOS_5D_Mark_II) |
748 | 13.1M | rp[0] -= 512; |
749 | 14.9M | pix[0] = rp[0] + rp[2]; |
750 | 14.9M | pix[2] = rp[0] + rp[1]; |
751 | 14.9M | pix[1] = rp[0] + ((-778 * rp[1] - (rp[2] << 11)) >> 12); |
752 | 14.9M | } |
753 | 44.7M | FORC3 rp[c] = CLIP15(pix[c] * sraw_mul[c] >> 10); |
754 | 14.9M | } |
755 | 72 | } |
756 | 72 | catch (...) |
757 | 72 | { |
758 | 0 | ljpeg_end(&jh); |
759 | 0 | throw; |
760 | 0 | } |
761 | 72 | height = saved_h; |
762 | 72 | width = saved_w; |
763 | 72 | ljpeg_end(&jh); |
764 | 72 | maximum = 0x3fff; |
765 | 72 | } |
766 | | |
767 | | void LibRaw::ljpeg_idct(struct jhead *jh) |
768 | 0 | { |
769 | 0 | int c, i, j, len, skip, coef; |
770 | 0 | float work[3][8][8]; |
771 | 0 | static float cs[106] = {0}; |
772 | 0 | static const uchar zigzag[80] = { |
773 | 0 | 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, |
774 | 0 | 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, |
775 | 0 | 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, |
776 | 0 | 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, |
777 | 0 | 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; |
778 | |
|
779 | 0 | if (!cs[0]) |
780 | 0 | FORC(106) cs[c] = float(cos((c & 31) * M_PI / 16) / 2); |
781 | 0 | memset(work, 0, sizeof work); |
782 | 0 | work[0][0][0] = float(jh->vpred[0] += ljpeg_diff(jh->huff[0]) * jh->quant[0]); |
783 | 0 | for (i = 1; i < 64; i++) |
784 | 0 | { |
785 | 0 | len = gethuff(jh->huff[16]); |
786 | 0 | i += skip = len >> 4; |
787 | 0 | if (!(len &= 15) && skip < 15) |
788 | 0 | break; |
789 | 0 | coef = getbits(len); |
790 | 0 | if ((coef & (1 << (len - 1))) == 0) |
791 | 0 | coef -= (1 << len) - 1; |
792 | 0 | ((float *)work)[zigzag[i]] = float(coef * jh->quant[i]); |
793 | 0 | } |
794 | 0 | FORC(8) work[0][0][c] *= float(M_SQRT1_2); |
795 | 0 | FORC(8) work[0][c][0] *= float(M_SQRT1_2); |
796 | 0 | for (i = 0; i < 8; i++) |
797 | 0 | for (j = 0; j < 8; j++) |
798 | 0 | FORC(8) work[1][i][j] += work[0][i][c] * cs[(j * 2 + 1) * c]; |
799 | 0 | for (i = 0; i < 8; i++) |
800 | 0 | for (j = 0; j < 8; j++) |
801 | 0 | FORC(8) work[2][i][j] += work[1][c][j] * cs[(i * 2 + 1) * c]; |
802 | |
|
803 | 0 | FORC(64) jh->idct[c] = CLIP(((float *)work[2])[c] + 0.5); |
804 | 0 | } |
805 | | |
806 | | void LibRaw::pentax_load_raw() |
807 | 140 | { |
808 | 140 | ushort bit[2][15], huff[4097]; |
809 | 140 | int dep, row, col, diff, c, i; |
810 | 140 | ushort vpred[2][2] = {{0, 0}, {0, 0}}, hpred[2]; |
811 | | |
812 | 140 | fseek(ifp, meta_offset, SEEK_SET); |
813 | 140 | dep = (get2() + 12) & 15; |
814 | 140 | fseek(ifp, 12, SEEK_CUR); |
815 | 726 | FORC(dep) bit[0][c] = get2(); |
816 | 726 | FORC(dep) bit[1][c] = fgetc(ifp); |
817 | 140 | FORC(dep) |
818 | 605k | for (i = bit[0][c]; i <= ((bit[0][c] + (4096 >> bit[1][c]) - 1) & 4095);) |
819 | 604k | huff[++i] = bit[1][c] << 8 | c; |
820 | 140 | huff[0] = 12; |
821 | 140 | fseek(ifp, data_offset, SEEK_SET); |
822 | 140 | getbits(-1); |
823 | 223k | for (row = 0; row < raw_height; row++) |
824 | 223k | { |
825 | 223k | checkCancel(); |
826 | 35.1M | for (col = 0; col < raw_width; col++) |
827 | 34.9M | { |
828 | 34.9M | diff = ljpeg_diff(huff); |
829 | 34.9M | if (col < 2) |
830 | 447k | hpred[col] = vpred[row & 1][col] += diff; |
831 | 34.4M | else |
832 | 34.4M | hpred[col & 1] += diff; |
833 | 34.9M | RAW(row, col) = hpred[col & 1]; |
834 | 34.9M | if (hpred[col & 1] >> tiff_bps) |
835 | 18.1M | derror(); |
836 | 34.9M | } |
837 | 223k | } |
838 | 140 | } |
839 | | void LibRaw::nikon_read_curve() |
840 | 304 | { |
841 | 304 | ushort ver0, ver1, vpred[2][2], csize; |
842 | 304 | int i, step, max; |
843 | | |
844 | 304 | fseek(ifp, meta_offset, SEEK_SET); |
845 | 304 | ver0 = fgetc(ifp); |
846 | 304 | ver1 = fgetc(ifp); |
847 | 304 | if (ver0 == 0x49 || ver1 == 0x58) |
848 | 228 | fseek(ifp, 2110, SEEK_CUR); |
849 | 304 | read_shorts(vpred[0], 4); |
850 | 304 | step = max = 1 << tiff_bps & 0x7fff; |
851 | 304 | if ((csize = get2()) > 1) |
852 | 280 | step = max / (csize - 1); |
853 | 304 | if (ver0 == 0x44 && (ver1 == 0x20 || (ver1 == 0x40 && step > 3)) && step > 0) |
854 | 64 | { |
855 | 64 | if (ver1 == 0x40) |
856 | 60 | { |
857 | 60 | step /= 4; |
858 | 60 | max /= 4; |
859 | 60 | } |
860 | 41.6k | for (i = 0; i < csize; i++) |
861 | 41.5k | curve[i * step] = get2(); |
862 | 75.9k | for (i = 0; i < max; i++) |
863 | 75.9k | curve[i] = (curve[i - i % step] * (step - i % step) + |
864 | 75.9k | curve[i - i % step + step] * (i % step)) / |
865 | 75.9k | step; |
866 | 64 | } |
867 | 240 | else if (ver0 != 0x46 && csize <= 0x4001) |
868 | 172 | read_shorts(curve, max = csize); |
869 | 304 | } |
870 | | |
871 | | void LibRaw::nikon_load_raw() |
872 | 111 | { |
873 | 111 | static const uchar nikon_tree[][32] = { |
874 | 111 | {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, /* 12-bit lossy */ |
875 | 111 | 5, 4, 3, 6, 2, 7, 1, 0, 8, 9, 11, 10, 12}, |
876 | 111 | {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, |
877 | 111 | 0, 0, /* 12-bit lossy after split */ |
878 | 111 | 0x39, 0x5a, 0x38, 0x27, 0x16, 5, 4, 3, 2, 1, 0, 11, 12, 12}, |
879 | | |
880 | 111 | {0, 1, 4, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 12-bit lossless */ |
881 | 111 | 5, 4, 6, 3, 7, 2, 8, 1, 9, 0, 10, 11, 12}, |
882 | 111 | {0, 1, 4, 3, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, /* 14-bit lossy */ |
883 | 111 | 5, 6, 4, 7, 8, 3, 9, 2, 1, 0, 10, 11, 12, 13, 14}, |
884 | 111 | {0, 1, 5, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, |
885 | 111 | 0, /* 14-bit lossy after split */ |
886 | 111 | 8, 0x5c, 0x4b, 0x3a, 0x29, 7, 6, 5, 4, 3, 2, 1, 0, 13, 14}, |
887 | 111 | {0, 1, 4, 2, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* 14-bit lossless */ |
888 | 111 | 7, 6, 8, 5, 9, 4, 10, 3, 11, 12, 2, 0, 1, 13, 14}}; |
889 | 111 | ushort *huff, ver0, ver1, vpred[2][2], hpred[2]; |
890 | 111 | int i, min, max, tree = 0, split = 0, row, col, len, shl, diff; |
891 | | |
892 | 111 | fseek(ifp, meta_offset, SEEK_SET); |
893 | 111 | ver0 = fgetc(ifp); |
894 | 111 | ver1 = fgetc(ifp); |
895 | 111 | if (ver0 == 0x49 || ver1 == 0x58) |
896 | 79 | fseek(ifp, 2110, SEEK_CUR); |
897 | 111 | if (ver0 == 0x46) |
898 | 1 | tree = 2; |
899 | 111 | if (tiff_bps == 14) |
900 | 1 | tree += 3; |
901 | 111 | read_shorts(vpred[0], 4); |
902 | 111 | max = 1 << tiff_bps & 0x7fff; |
903 | 111 | if (ver0 == 0x44 && (ver1 == 0x20 || ver1 == 0x40)) |
904 | 30 | { |
905 | 30 | if (ver1 == 0x40) |
906 | 28 | max /= 4; |
907 | 30 | fseek(ifp, meta_offset + 562, SEEK_SET); |
908 | 30 | split = get2(); |
909 | 30 | } |
910 | | |
911 | 15.3k | while (max > 2 && (curve[max - 2] == curve[max - 1])) |
912 | 15.1k | max--; |
913 | 111 | huff = make_decoder(nikon_tree[tree]); |
914 | 111 | fseek(ifp, data_offset, SEEK_SET); |
915 | 111 | getbits(-1); |
916 | 111 | try |
917 | 111 | { |
918 | 351k | for (min = row = 0; row < height; row++) |
919 | 351k | { |
920 | 351k | checkCancel(); |
921 | 351k | if (split && row == split) |
922 | 14 | { |
923 | 14 | free(huff); |
924 | 14 | huff = make_decoder(nikon_tree[tree + 1]); |
925 | 14 | max += (min = 16) << 1; |
926 | 14 | } |
927 | 56.3M | for (col = 0; col < raw_width; col++) |
928 | 55.9M | { |
929 | 55.9M | i = gethuff(huff); |
930 | 55.9M | len = i & 15; |
931 | 55.9M | shl = i >> 4; |
932 | 55.9M | diff = ((getbits(len - shl) << 1) + 1) << shl >> 1; |
933 | 55.9M | if (len > 0 && (diff & (1 << (len - 1))) == 0) |
934 | 79.3k | diff -= (1 << len) - !shl; |
935 | 55.9M | if (col < 2) |
936 | 702k | hpred[col] = vpred[row & 1][col] += diff; |
937 | 55.2M | else |
938 | 55.2M | hpred[col & 1] += diff; |
939 | 55.9M | if ((ushort)(hpred[col & 1] + min) >= max) |
940 | 34.3M | derror(); |
941 | 55.9M | RAW(row, col) = curve[LIM((short)hpred[col & 1], 0, 0x3fff)]; |
942 | 55.9M | } |
943 | 351k | } |
944 | 111 | } |
945 | 111 | catch (...) |
946 | 111 | { |
947 | 7 | free(huff); |
948 | 7 | throw; |
949 | 7 | } |
950 | 104 | free(huff); |
951 | 104 | } |
952 | | |
953 | | void LibRaw::nikon_yuv_load_raw() |
954 | 0 | { |
955 | 0 | if (!image) |
956 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
957 | 0 | int row, col, yuv[4]={0,0,0,0}, rgb[3], b, c; |
958 | 0 | UINT64 bitbuf = 0; |
959 | 0 | float cmul[4]; |
960 | 0 | FORC4 { cmul[c] = cam_mul[c] > 0.001f ? cam_mul[c] : 1.f; } |
961 | 0 | for (row = 0; row < raw_height; row++) |
962 | 0 | { |
963 | 0 | checkCancel(); |
964 | |
|
965 | 0 | for (col = 0; col < raw_width; col++) |
966 | 0 | { |
967 | 0 | if (!(b = col & 1)) |
968 | 0 | { |
969 | 0 | bitbuf = 0; |
970 | 0 | FORC(6) bitbuf |= (UINT64)fgetc(ifp) << c * 8; |
971 | 0 | FORC(4) yuv[c] = (bitbuf >> c * 12 & 0xfff) - (c >> 1 << 11); |
972 | 0 | } |
973 | 0 | rgb[0] = int(yuv[b] + 1.370705f * yuv[3]); |
974 | 0 | rgb[1] = int(yuv[b] - 0.337633f * yuv[2] - 0.698001f * yuv[3]); |
975 | 0 | rgb[2] = int(yuv[b] + 1.732446f * yuv[2]); |
976 | 0 | FORC3 image[row * width + col][c] = |
977 | 0 | ushort( |
978 | 0 | curve[LIM(rgb[c], 0, 0xfff)] / cmul[c]); |
979 | 0 | } |
980 | 0 | } |
981 | 0 | } |
982 | | |
983 | | void LibRaw::rollei_load_raw() |
984 | 26 | { |
985 | 26 | uchar pixel[10]; |
986 | 26 | unsigned iten = 0, isix, i, buffer = 0, todo[16]; |
987 | 26 | if (raw_width > 16383 || raw_height > 16383) |
988 | 2 | throw LIBRAW_EXCEPTION_IO_BADFILE; |
989 | 24 | unsigned maxpixel = raw_width * (raw_height + 7); |
990 | | |
991 | 24 | isix = raw_width * raw_height * 5 / 8; |
992 | 1.70k | while (fread(pixel, 1, 10, ifp) == 10) |
993 | 1.67k | { |
994 | 1.67k | checkCancel(); |
995 | 10.0k | for (i = 0; i < 10; i += 2) |
996 | 8.39k | { |
997 | 8.39k | todo[i] = iten++; |
998 | 8.39k | todo[i + 1] = pixel[i] << 8 | pixel[i + 1]; |
999 | 8.39k | buffer = pixel[i] >> 2 | buffer << 6; |
1000 | 8.39k | } |
1001 | 6.71k | for (; i < 16; i += 2) |
1002 | 5.03k | { |
1003 | 5.03k | todo[i] = isix++; |
1004 | 5.03k | todo[i + 1] = buffer >> (14 - i) * 5; |
1005 | 5.03k | } |
1006 | 15.1k | for (i = 0; i < 16; i += 2) |
1007 | 13.4k | if (todo[i] < maxpixel) |
1008 | 12.6k | raw_image[todo[i]] = (todo[i + 1] & 0x3ff); |
1009 | 774 | else |
1010 | 774 | derror(); |
1011 | 1.67k | } |
1012 | 24 | maximum = 0x3ff; |
1013 | 24 | } |
1014 | | |
1015 | | void LibRaw::nokia_load_raw() |
1016 | 186 | { |
1017 | 186 | uchar *dp; |
1018 | 186 | int rev, dwide, row, col, c; |
1019 | 186 | double sum[] = {0, 0}; |
1020 | | |
1021 | 186 | rev = 3 * (order == 0x4949); |
1022 | 186 | dwide = (raw_width * 5 + 1) / 4; |
1023 | | #ifdef USE_6BY9RPI |
1024 | | if (raw_stride) |
1025 | | dwide = raw_stride; |
1026 | | #endif |
1027 | 186 | std::vector<uchar> data(dwide * 2 + 4,0); |
1028 | 888 | for (row = 0; row < raw_height; row++) |
1029 | 702 | { |
1030 | 702 | checkCancel(); |
1031 | 702 | if (fread(data.data() + dwide, 1, dwide, ifp) < dwide) |
1032 | 185 | derror(); |
1033 | 28.1k | FORC(dwide) data[c] = data[dwide + (c ^ rev)]; |
1034 | 6.60k | for (dp = data.data(), col = 0; col < raw_width; dp += 5, col += 4) |
1035 | 23.6k | FORC4 RAW(row, col + c) = (dp[c] << 2) | (dp[4] >> (c << 1) & 3); |
1036 | 702 | } |
1037 | 186 | maximum = 0x3ff; |
1038 | | #ifdef USE_6BY9RPI |
1039 | | if (!strcmp(make, "OmniVision") || |
1040 | | !strcmp(make, "Sony") || |
1041 | | !strcmp(make, "RaspberryPi")) return; |
1042 | | #else |
1043 | 186 | if (strncmp(make, "OmniVision", 10)) |
1044 | 1 | return; |
1045 | 185 | #endif |
1046 | 185 | row = raw_height / 2; |
1047 | 185 | FORC(width - 1) |
1048 | 0 | { |
1049 | 0 | sum[c & 1] += SQR(RAW(row, c) - RAW(row + 1, c + 1)); |
1050 | 0 | sum[~c & 1] += SQR(RAW(row + 1, c) - RAW(row, c + 1)); |
1051 | 0 | } |
1052 | 185 | if (sum[1] > sum[0]) |
1053 | 0 | filters = 0x4b4b4b4b; |
1054 | 185 | } |
1055 | | |
1056 | | unsigned LibRaw::pana_data(int nb, unsigned *bytes) |
1057 | 44.4M | { |
1058 | 44.4M | #ifndef LIBRAW_NOTHREADS |
1059 | 222M | #define vpos tls->pana_data.vpos |
1060 | 88.9M | #define buf tls->pana_data.buf |
1061 | | #else |
1062 | | static uchar buf[0x4002]; |
1063 | | static int vpos; |
1064 | | #endif |
1065 | 44.4M | int byte; |
1066 | | |
1067 | 44.4M | if (!nb && !bytes) |
1068 | 70 | { |
1069 | 70 | memset(buf, 0, sizeof(buf)); |
1070 | 70 | return vpos = 0; |
1071 | 70 | } |
1072 | 44.4M | if (load_flags > 0x4000) |
1073 | 0 | throw LIBRAW_EXCEPTION_IO_BADFILE; |
1074 | | |
1075 | 44.4M | if (!vpos) |
1076 | 755 | { |
1077 | 755 | if(load_flags < 0x4000) |
1078 | 755 | fread(buf + load_flags, 1, 0x4000 - load_flags, ifp); |
1079 | 755 | fread(buf, 1, load_flags, ifp); |
1080 | 755 | } |
1081 | | |
1082 | 44.4M | if (pana_encoding == 5) |
1083 | 0 | { |
1084 | 0 | for (byte = 0; byte < 16; byte++) |
1085 | 0 | { |
1086 | 0 | bytes[byte] = buf[vpos++]; |
1087 | 0 | vpos &= 0x3FFF; |
1088 | 0 | } |
1089 | 0 | } |
1090 | 44.4M | else |
1091 | 44.4M | { |
1092 | 44.4M | vpos = (vpos - nb) & 0x1ffff; |
1093 | 44.4M | byte = vpos >> 3 ^ 0x3ff0; |
1094 | 44.4M | return (buf[byte] | buf[byte + 1] << 8) >> (vpos & 7) & ~((~0u) << nb); |
1095 | 44.4M | } |
1096 | 0 | return 0; |
1097 | 44.4M | #ifndef LIBRAW_NOTHREADS |
1098 | 44.4M | #undef vpos |
1099 | 44.4M | #undef buf |
1100 | 44.4M | #endif |
1101 | 44.4M | } |
1102 | | |
1103 | | void LibRaw::panasonic_load_raw() |
1104 | 70 | { |
1105 | 70 | int row, col, i, j, sh = 0, pred[2], nonz[2]; |
1106 | 70 | unsigned bytes[16]; |
1107 | 70 | memset(bytes,0,sizeof(bytes)); // make gcc11 happy |
1108 | 70 | ushort *raw_block_data; |
1109 | | |
1110 | 70 | pana_data(0, 0); |
1111 | | |
1112 | 70 | int enc_blck_size = pana_bpp == 12 ? 10 : 9; |
1113 | 70 | if (pana_encoding == 5) |
1114 | 0 | { |
1115 | 0 | for (row = 0; row < raw_height; row++) |
1116 | 0 | { |
1117 | 0 | raw_block_data = raw_image + row * raw_width; |
1118 | 0 | checkCancel(); |
1119 | 0 | for (col = 0; col < raw_width; col += enc_blck_size) |
1120 | 0 | { |
1121 | 0 | pana_data(0, bytes); |
1122 | |
|
1123 | 0 | if (pana_bpp == 12) |
1124 | 0 | { |
1125 | 0 | raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; |
1126 | 0 | raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); |
1127 | 0 | raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; |
1128 | 0 | raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); |
1129 | 0 | raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; |
1130 | 0 | raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); |
1131 | 0 | raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; |
1132 | 0 | raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); |
1133 | 0 | raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; |
1134 | 0 | raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); |
1135 | 0 | } |
1136 | 0 | else if (pana_bpp == 14) |
1137 | 0 | { |
1138 | 0 | raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); |
1139 | 0 | raw_block_data[col + 1] = |
1140 | 0 | (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); |
1141 | 0 | raw_block_data[col + 2] = |
1142 | 0 | (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); |
1143 | 0 | raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); |
1144 | 0 | raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); |
1145 | 0 | raw_block_data[col + 5] = |
1146 | 0 | (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); |
1147 | 0 | raw_block_data[col + 6] = |
1148 | 0 | (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); |
1149 | 0 | raw_block_data[col + 7] = |
1150 | 0 | ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); |
1151 | 0 | raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); |
1152 | 0 | } |
1153 | 0 | } |
1154 | 0 | } |
1155 | 0 | } |
1156 | 70 | else |
1157 | 70 | { |
1158 | 70 | if (load_flags >= 0x4000) |
1159 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
1160 | 93.4k | for (row = 0; row < raw_height; row++) |
1161 | 93.3k | { |
1162 | 93.3k | checkCancel(); |
1163 | 31.2M | for (col = 0; col < raw_width; col++) |
1164 | 31.1M | { |
1165 | 31.1M | if ((i = col % 14) == 0) |
1166 | 2.28M | pred[0] = pred[1] = nonz[0] = nonz[1] = 0; |
1167 | 31.1M | if (i % 3 == 2) |
1168 | 8.91M | sh = 4 >> (3 - pana_data(2, 0)); |
1169 | 31.1M | if (nonz[i & 1]) |
1170 | 5.77M | { |
1171 | 5.77M | if ((j = pana_data(8, 0))) |
1172 | 3.66M | { |
1173 | 3.66M | if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) |
1174 | 1.31M | pred[i & 1] &= ~((~0u) << sh); |
1175 | 3.66M | pred[i & 1] += j << sh; |
1176 | 3.66M | } |
1177 | 5.77M | } |
1178 | 25.4M | else if ((nonz[i & 1] = pana_data(8, 0)) || i > 11) |
1179 | 4.39M | pred[i & 1] = nonz[i & 1] << 4 | pana_data(4, 0); |
1180 | 31.1M | if ((RAW(row, col) = pred[col & 1]) > 4098 && col < width && |
1181 | 43.3k | row < height) |
1182 | 42.1k | derror(); |
1183 | 31.1M | } |
1184 | 93.3k | } |
1185 | 70 | } |
1186 | 70 | } |
1187 | | |
1188 | | |
1189 | | void LibRaw::minolta_rd175_load_raw() |
1190 | 0 | { |
1191 | 0 | uchar pixel[768]; |
1192 | 0 | unsigned irow, box, row, col; |
1193 | |
|
1194 | 0 | for (irow = 0; irow < 1481; irow++) |
1195 | 0 | { |
1196 | 0 | checkCancel(); |
1197 | 0 | if (fread(pixel, 1, 768, ifp) < 768) |
1198 | 0 | derror(); |
1199 | 0 | box = irow / 82; |
1200 | 0 | row = irow % 82 * 12 + ((box < 12) ? box | 1 : (box - 12) * 2); |
1201 | 0 | switch (irow) |
1202 | 0 | { |
1203 | 0 | case 1477: |
1204 | 0 | case 1479: |
1205 | 0 | continue; |
1206 | 0 | case 1476: |
1207 | 0 | row = 984; |
1208 | 0 | break; |
1209 | 0 | case 1480: |
1210 | 0 | row = 985; |
1211 | 0 | break; |
1212 | 0 | case 1478: |
1213 | 0 | row = 985; |
1214 | 0 | box = 1; |
1215 | 0 | } |
1216 | 0 | if ((box < 12) && (box & 1)) |
1217 | 0 | { |
1218 | 0 | for (col = 0; col < 1533; col++, row ^= 1) |
1219 | 0 | if (col != 1) |
1220 | 0 | RAW(row, col) = (col + 1) & 2 |
1221 | 0 | ? pixel[col / 2 - 1] + pixel[col / 2 + 1] |
1222 | 0 | : pixel[col / 2] << 1; |
1223 | 0 | RAW(row, 1) = pixel[1] << 1; |
1224 | 0 | RAW(row, 1533) = pixel[765] << 1; |
1225 | 0 | } |
1226 | 0 | else |
1227 | 0 | for (col = row & 1; col < 1534; col += 2) |
1228 | 0 | RAW(row, col) = pixel[col / 2] << 1; |
1229 | 0 | } |
1230 | 0 | maximum = 0xff << 1; |
1231 | 0 | } |
1232 | | |
1233 | | void LibRaw::quicktake_100_load_raw() |
1234 | 116 | { |
1235 | 116 | std::vector<uchar> pixel_buffer(484 * 644, 0x80); |
1236 | 116 | uchar* pixel = &pixel_buffer[0]; |
1237 | 116 | static const short gstep[16] = {-89, -60, -44, -32, -22, -15, -8, -2, |
1238 | 116 | 2, 8, 15, 22, 32, 44, 60, 89}; |
1239 | 116 | static const short rstep[6][4] = {{-3, -1, 1, 3}, {-5, -1, 1, 5}, |
1240 | 116 | {-8, -2, 2, 8}, {-13, -3, 3, 13}, |
1241 | 116 | {-19, -4, 4, 19}, {-28, -6, 6, 28}}; |
1242 | 116 | static const short t_curve[256] = { |
1243 | 116 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, |
1244 | 116 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, |
1245 | 116 | 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, |
1246 | 116 | 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, |
1247 | 116 | 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, |
1248 | 116 | 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 88, 90, |
1249 | 116 | 92, 94, 97, 99, 101, 103, 105, 107, 110, 112, 114, 116, 118, 120, |
1250 | 116 | 123, 125, 127, 129, 131, 134, 136, 138, 140, 142, 144, 147, 149, 151, |
1251 | 116 | 153, 155, 158, 160, 162, 164, 166, 168, 171, 173, 175, 177, 179, 181, |
1252 | 116 | 184, 186, 188, 190, 192, 195, 197, 199, 201, 203, 205, 208, 210, 212, |
1253 | 116 | 214, 216, 218, 221, 223, 226, 230, 235, 239, 244, 248, 252, 257, 261, |
1254 | 116 | 265, 270, 274, 278, 283, 287, 291, 296, 300, 305, 309, 313, 318, 322, |
1255 | 116 | 326, 331, 335, 339, 344, 348, 352, 357, 361, 365, 370, 374, 379, 383, |
1256 | 116 | 387, 392, 396, 400, 405, 409, 413, 418, 422, 426, 431, 435, 440, 444, |
1257 | 116 | 448, 453, 457, 461, 466, 470, 474, 479, 483, 487, 492, 496, 500, 508, |
1258 | 116 | 519, 531, 542, 553, 564, 575, 587, 598, 609, 620, 631, 643, 654, 665, |
1259 | 116 | 676, 687, 698, 710, 721, 732, 743, 754, 766, 777, 788, 799, 810, 822, |
1260 | 116 | 833, 844, 855, 866, 878, 889, 900, 911, 922, 933, 945, 956, 967, 978, |
1261 | 116 | 989, 1001, 1012, 1023}; |
1262 | 116 | int rb, row, col, sharp, val = 0; |
1263 | | |
1264 | 116 | if (width > 640 || height > 480) |
1265 | 2 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
1266 | | |
1267 | 114 | getbits(-1); |
1268 | 4.04k | for (row = 2; row < height + 2; row++) |
1269 | 3.93k | { |
1270 | 3.93k | checkCancel(); |
1271 | 334k | for (col = 2 + (row & 1); col < width + 2; col += 2) |
1272 | 330k | { |
1273 | 330k | val = ((pixel[(row - 1) * 644 + col - 1] + 2 * pixel[(row - 1) * 644 + col + 1] + pixel[row * 644 + col - 2]) >> 2) + gstep[getbits(4)]; |
1274 | 330k | pixel[row * 644 + col] = val = LIM(val, 0, 255); |
1275 | 330k | if (col < 4) |
1276 | 3.93k | pixel[row * 644 + col - 2] = pixel[(row + 1) * 644 + (~row & 1)] = val; |
1277 | 330k | if (row == 2) |
1278 | 4.50k | pixel[(row - 1) * 644 + col + 1] = pixel[(row - 1) * 644 + col + 3] = val; |
1279 | 330k | } |
1280 | 3.93k | pixel[row * 644 + col] = val; |
1281 | 3.93k | } |
1282 | 254 | for (rb = 0; rb < 2; rb++) |
1283 | 2.91k | for (row = 2 + rb; row < height + 2; row += 2) |
1284 | 2.77k | { |
1285 | 2.77k | checkCancel(); |
1286 | 274k | for (col = 3 - (row & 1); col < width + 2; col += 2) |
1287 | 272k | { |
1288 | 272k | if (row < 4 || col < 4) |
1289 | 7.28k | sharp = 2; |
1290 | 264k | else |
1291 | 264k | { |
1292 | 264k | val = ABS(pixel[(row - 2) * 644 + col] - pixel[row * 644 + col - 2]) + ABS(pixel[(row - 2) * 644 + col] - pixel[(row - 2) * 644 + col - 2]) + |
1293 | 264k | ABS(pixel[row * 644 + col - 2] - pixel[(row - 2) * 644 + col - 2]); |
1294 | 264k | sharp = val < 4 |
1295 | 264k | ? 0 |
1296 | 264k | : val < 8 |
1297 | 122k | ? 1 |
1298 | 122k | : val < 16 ? 2 : val < 32 ? 3 : val < 48 ? 4 : 5; |
1299 | 264k | } |
1300 | 272k | val = ((pixel[(row - 2) * 644 + col] + pixel[row * 644 + col - 2]) >> 1) + rstep[sharp][getbits(2)]; |
1301 | 272k | pixel[row * 644 + col] = val = LIM(val, 0, 255); |
1302 | 272k | if (row < 4) |
1303 | 4.64k | pixel[(row - 2) * 644 + col + 2] = val; |
1304 | 272k | if (col < 4) |
1305 | 2.76k | pixel[(row + 2) * 644 + col - 2] = val; |
1306 | 272k | } |
1307 | 2.77k | } |
1308 | 2.29k | for (row = 2; row < height + 2; row++) |
1309 | 2.18k | { |
1310 | 2.18k | checkCancel(); |
1311 | 247k | for (col = 3 - (row & 1); col < width + 2; col += 2) |
1312 | 245k | { |
1313 | 245k | val = ((pixel[row * 644 + col - 1] + (pixel[row * 644 + col] << 2) + pixel[row * 644 + col + 1]) >> 1) - 0x100; |
1314 | 245k | pixel[row * 644 + col] = LIM(val, 0, 255); |
1315 | 245k | } |
1316 | 2.18k | } |
1317 | 2.29k | for (row = 0; row < height; row++) |
1318 | 2.18k | { |
1319 | 2.18k | checkCancel(); |
1320 | 493k | for (col = 0; col < width; col++) |
1321 | 491k | RAW(row, col) = t_curve[pixel[(row + 2) * 644 + col + 2]]; |
1322 | 2.18k | } |
1323 | 114 | maximum = 0x3ff; |
1324 | 114 | } |
1325 | | |
1326 | | void LibRaw::sony_load_raw() |
1327 | 32 | { |
1328 | 32 | uchar head[40]; |
1329 | 32 | ushort *pixel; |
1330 | 32 | unsigned i, key, row, col; |
1331 | | |
1332 | 32 | fseek(ifp, 200896, SEEK_SET); |
1333 | 32 | fseek(ifp, (unsigned)fgetc(ifp) * 4 - 1, SEEK_CUR); |
1334 | 32 | order = 0x4d4d; |
1335 | 32 | key = get4(); |
1336 | | |
1337 | 32 | fseek(ifp, 164600, SEEK_SET); |
1338 | 32 | fread(head, 1, 40, ifp); |
1339 | 32 | sony_decrypt((unsigned *)head, 10, 1, key); |
1340 | 160 | for (i = 26; i-- > 22;) |
1341 | 128 | key = key << 8 | head[i]; |
1342 | | |
1343 | 32 | fseek(ifp, data_offset, SEEK_SET); |
1344 | 3.83k | for (row = 0; row < raw_height; row++) |
1345 | 3.80k | { |
1346 | 3.80k | checkCancel(); |
1347 | 3.80k | pixel = raw_image + row * raw_width; |
1348 | 3.80k | if (fread(pixel, 2, raw_width, ifp) < raw_width) |
1349 | 3.53k | derror(); |
1350 | 3.80k | sony_decrypt((unsigned *)pixel, raw_width / 2, !row, key); |
1351 | 12.4M | for (col = 0; col < raw_width; col++) |
1352 | 12.4M | if ((pixel[col] = ntohs(pixel[col])) >> 14) |
1353 | 9.36M | derror(); |
1354 | 3.80k | } |
1355 | 32 | maximum = 0x3ff0; |
1356 | 32 | } |
1357 | | |
1358 | | void LibRaw::sony_arw_load_raw() |
1359 | 108 | { |
1360 | 108 | std::vector<ushort> huff_buffer(32770,0); |
1361 | 108 | ushort* huff = &huff_buffer[0]; |
1362 | 108 | static const ushort tab[18] = {0xf11, 0xf10, 0xe0f, 0xd0e, 0xc0d, 0xb0c, |
1363 | 108 | 0xa0b, 0x90a, 0x809, 0x708, 0x607, 0x506, |
1364 | 108 | 0x405, 0x304, 0x303, 0x300, 0x202, 0x201}; |
1365 | 108 | int i, c, n, col, row, sum = 0; |
1366 | | |
1367 | 108 | huff[0] = 15; |
1368 | 2.05k | for (n = i = 0; i < 18; i++) |
1369 | 3.53M | FORC(32768 >> (tab[i] >> 8)) huff[++n] = tab[i]; |
1370 | 108 | getbits(-1); |
1371 | 591k | for (col = raw_width; col--;) |
1372 | 591k | { |
1373 | 591k | checkCancel(); |
1374 | 266M | for (row = 0; row < raw_height + 1; row += 2) |
1375 | 265M | { |
1376 | 265M | if (row == raw_height) |
1377 | 406k | row = 1; |
1378 | 265M | if ((sum += ljpeg_diff(huff)) >> 12) |
1379 | 265M | derror(); |
1380 | 265M | if (row < height) |
1381 | 265M | RAW(row, col) = sum; |
1382 | 265M | } |
1383 | 591k | } |
1384 | 108 | } |
1385 | | |
1386 | | void LibRaw::sony_arw2_load_raw() |
1387 | 40 | { |
1388 | 40 | uchar *data, *dp; |
1389 | 40 | ushort pix[16]; |
1390 | 40 | int row, col, val, max, min, imax, imin, sh, bit, i; |
1391 | | |
1392 | 40 | data = (uchar *)calloc(raw_width + 1,1); |
1393 | 40 | try |
1394 | 40 | { |
1395 | 3.44k | for (row = 0; row < height; row++) |
1396 | 3.40k | { |
1397 | 3.40k | checkCancel(); |
1398 | 3.40k | fread(data, 1, raw_width, ifp); |
1399 | 37.5k | for (dp = data, col = 0; col < raw_width - 30; dp += 16) |
1400 | 34.1k | { |
1401 | 34.1k | max = 0x7ff & (val = sget4(dp)); |
1402 | 34.1k | min = 0x7ff & val >> 11; |
1403 | 34.1k | imax = 0x0f & val >> 22; |
1404 | 34.1k | imin = 0x0f & val >> 26; |
1405 | 57.1k | for (sh = 0; sh < 4 && 0x80 << sh <= max - min; sh++) |
1406 | 23.0k | ; |
1407 | | /* flag checks if outside of loop */ |
1408 | 34.1k | if (!(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_ALLFLAGS) // no flag set |
1409 | 0 | || (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE)) |
1410 | 34.1k | { |
1411 | 580k | for (bit = 30, i = 0; i < 16; i++) |
1412 | 546k | if (i == imax) |
1413 | 34.1k | pix[i] = max; |
1414 | 511k | else if (i == imin) |
1415 | 14.5k | pix[i] = min; |
1416 | 497k | else |
1417 | 497k | { |
1418 | 497k | pix[i] = |
1419 | 497k | ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh) + min; |
1420 | 497k | if (pix[i] > 0x7ff) |
1421 | 22.0k | pix[i] = 0x7ff; |
1422 | 497k | bit += 7; |
1423 | 497k | } |
1424 | 34.1k | } |
1425 | 0 | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_BASEONLY) |
1426 | 0 | { |
1427 | 0 | for (bit = 30, i = 0; i < 16; i++) |
1428 | 0 | if (i == imax) |
1429 | 0 | pix[i] = max; |
1430 | 0 | else if (i == imin) |
1431 | 0 | pix[i] = min; |
1432 | 0 | else |
1433 | 0 | pix[i] = 0; |
1434 | 0 | } |
1435 | 0 | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTAONLY) |
1436 | 0 | { |
1437 | 0 | for (bit = 30, i = 0; i < 16; i++) |
1438 | 0 | if (i == imax) |
1439 | 0 | pix[i] = 0; |
1440 | 0 | else if (i == imin) |
1441 | 0 | pix[i] = 0; |
1442 | 0 | else |
1443 | 0 | { |
1444 | 0 | pix[i] = |
1445 | 0 | ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh) + min; |
1446 | 0 | if (pix[i] > 0x7ff) |
1447 | 0 | pix[i] = 0x7ff; |
1448 | 0 | bit += 7; |
1449 | 0 | } |
1450 | 0 | } |
1451 | 0 | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTAZEROBASE) |
1452 | 0 | { |
1453 | 0 | for (bit = 30, i = 0; i < 16; i++) |
1454 | 0 | if (i == imax) |
1455 | 0 | pix[i] = 0; |
1456 | 0 | else if (i == imin) |
1457 | 0 | pix[i] = 0; |
1458 | 0 | else |
1459 | 0 | { |
1460 | 0 | pix[i] = ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh); |
1461 | 0 | if (pix[i] > 0x7ff) |
1462 | 0 | pix[i] = 0x7ff; |
1463 | 0 | bit += 7; |
1464 | 0 | } |
1465 | 0 | } |
1466 | | |
1467 | 34.1k | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE) |
1468 | 0 | { |
1469 | 0 | for (i = 0; i < 16; i++, col += 2) |
1470 | 0 | { |
1471 | 0 | unsigned slope = |
1472 | 0 | pix[i] < 1001 ? 2 |
1473 | 0 | : curve[pix[i] << 1] - curve[(pix[i] << 1) - 2]; |
1474 | 0 | unsigned step = 1 << sh; |
1475 | 0 | RAW(row, col) = |
1476 | 0 | curve[pix[i] << 1] > |
1477 | 0 | black + imgdata.rawparams.sony_arw2_posterization_thr |
1478 | 0 | ? LIM(((slope * step * 1000) / |
1479 | 0 | (curve[pix[i] << 1] - black)), |
1480 | 0 | 0, 10000) |
1481 | 0 | : 0; |
1482 | 0 | } |
1483 | 0 | } |
1484 | 34.1k | else |
1485 | 580k | for (i = 0; i < 16; i++, col += 2) |
1486 | 546k | RAW(row, col) = curve[pix[i] << 1]; |
1487 | 34.1k | col -= col & 1 ? 1 : 31; |
1488 | 34.1k | } |
1489 | 3.40k | } |
1490 | 40 | } |
1491 | 40 | catch (...) |
1492 | 40 | { |
1493 | 0 | free(data); |
1494 | 0 | throw; |
1495 | 0 | } |
1496 | 40 | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE) |
1497 | 0 | maximum = 10000; |
1498 | 40 | free(data); |
1499 | 40 | } |
1500 | | |
1501 | | void LibRaw::samsung_load_raw() |
1502 | 78 | { |
1503 | 78 | int row, col, c, i, dir, op[4], len[4]; |
1504 | 78 | if (raw_width > 32768 || |
1505 | 77 | raw_height > 32768) // definitely too much for old samsung |
1506 | 2 | throw LIBRAW_EXCEPTION_IO_BADFILE; |
1507 | 76 | unsigned maxpixels = raw_width * (raw_height + 7); |
1508 | | |
1509 | 76 | order = 0x4949; |
1510 | 76.7k | for (row = 0; row < raw_height; row++) |
1511 | 76.6k | { |
1512 | 76.6k | checkCancel(); |
1513 | 76.6k | fseek(ifp, strip_offset + row * 4, SEEK_SET); |
1514 | 76.6k | fseek(ifp, data_offset + get4(), SEEK_SET); |
1515 | 76.6k | ph1_bits(-1); |
1516 | 306k | FORC4 len[c] = row < 2 ? 7 : 4; |
1517 | 1.60M | for (col = 0; col < raw_width; col += 16) |
1518 | 1.53M | { |
1519 | 1.53M | dir = ph1_bits(1); |
1520 | 6.12M | FORC4 op[c] = ph1_bits(2); |
1521 | 6.12M | FORC4 switch (op[c]) |
1522 | 6.12M | { |
1523 | 5.89M | case 3: |
1524 | 5.89M | len[c] = ph1_bits(4); |
1525 | 5.89M | break; |
1526 | 34.2k | case 2: |
1527 | 34.2k | len[c]--; |
1528 | 34.2k | break; |
1529 | 35.4k | case 1: |
1530 | 35.4k | len[c]++; |
1531 | 6.12M | } |
1532 | 26.0M | for (c = 0; c < 16; c += 2) |
1533 | 24.5M | { |
1534 | 24.5M | i = len[((c & 1) << 1) | (c >> 3)]; |
1535 | 24.5M | unsigned idest = RAWINDEX(row, col + c); |
1536 | 24.5M | unsigned isrc = (dir ? RAWINDEX(row + (~c | -2), col + c) |
1537 | 24.5M | : col ? RAWINDEX(row, col + (c | -2)) : 0); |
1538 | 24.5M | if (idest < maxpixels && |
1539 | 24.5M | isrc < |
1540 | 24.5M | maxpixels) // less than zero is handled by unsigned conversion |
1541 | 24.5M | RAW(row, col + c) = (i > 0 ? ((signed)ph1_bits(i) << (32 - i) >> (32 - i)) : 0) + |
1542 | 24.4M | (dir ? RAW(row + (~c | -2), col + c) : col ? RAW(row, col + (c | -2)) : 128); |
1543 | 88.0k | else |
1544 | 88.0k | derror(); |
1545 | 24.5M | if (c == 14) |
1546 | 1.53M | c = -1; |
1547 | 24.5M | } |
1548 | 1.53M | } |
1549 | 76.6k | } |
1550 | 38.3k | for (row = 0; row < raw_height - 1; row += 2) |
1551 | 6.01M | for (col = 0; col < raw_width - 1; col += 2) |
1552 | 5.97M | SWAP(RAW(row, col + 1), RAW(row + 1, col)); |
1553 | 76 | } |
1554 | | |
1555 | | void LibRaw::samsung2_load_raw() |
1556 | 27 | { |
1557 | 27 | static const ushort tab[14] = {0x304, 0x307, 0x206, 0x205, 0x403, |
1558 | 27 | 0x600, 0x709, 0x80a, 0x90b, 0xa0c, |
1559 | 27 | 0xa0d, 0x501, 0x408, 0x402}; |
1560 | 27 | ushort huff[1026], vpred[2][2] = {{0, 0}, {0, 0}}, hpred[2]; |
1561 | 27 | int i, c, n, row, col, diff; |
1562 | | |
1563 | 27 | huff[0] = 10; |
1564 | 405 | for (n = i = 0; i < 14; i++) |
1565 | 27.6k | FORC(1024 >> (tab[i] >> 8)) huff[++n] = tab[i]; |
1566 | 27 | getbits(-1); |
1567 | 2.93k | for (row = 0; row < raw_height; row++) |
1568 | 2.91k | { |
1569 | 2.91k | checkCancel(); |
1570 | 3.18M | for (col = 0; col < raw_width; col++) |
1571 | 3.18M | { |
1572 | 3.18M | diff = ljpeg_diff(huff); |
1573 | 3.18M | if (col < 2) |
1574 | 5.82k | hpred[col] = vpred[row & 1][col] += diff; |
1575 | 3.18M | else |
1576 | 3.18M | hpred[col & 1] += diff; |
1577 | 3.18M | RAW(row, col) = hpred[col & 1]; |
1578 | 3.18M | if (hpred[col & 1] >> tiff_bps) |
1579 | 105k | derror(); |
1580 | 3.18M | } |
1581 | 2.91k | } |
1582 | 27 | } |
1583 | | |