Mercurial > hg > forks > geeqie
annotate src/jpeg_parser.c @ 1977:af653599660d lm
More use of const, fix up a warning.
author | Laurent Monin <zas@norz.org> |
---|---|
date | Mon, 14 May 2012 23:01:01 +0200 |
parents | 4417578c55f9 |
children | 8a09320fe8a7 |
rev | line source |
---|---|
1909
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
1 /* |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
2 * Geeqie |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
3 * (C) 2004 John Ellis |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
4 * Copyright (C) 2008 - 2011 The Geeqie Team |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
5 * |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
6 * Author: Vladimir Nadvornik |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
7 * |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
8 * This software is released under the GNU General Public License (GNU GPL). |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
9 * Please read the included file COPYING for more information. |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
10 * This software comes with no warranty of any kind, use at your own risk! |
caca32ccd945
updated copyright notices
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1908
diff
changeset
|
11 */ |
1902
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
12 |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
13 #include "main.h" |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
14 #include "jpeg_parser.h" |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
15 |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
16 gboolean jpeg_segment_find(const guchar *data, guint size, |
1902
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
17 guchar app_marker, const gchar *magic, guint magic_len, |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
18 guint *seg_offset, guint *seg_length) |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
19 { |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
20 guchar marker = 0; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
21 guint offset = 0; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
22 guint length = 0; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
23 |
1907
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
24 while (marker != JPEG_MARKER_EOI) |
1902
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
25 { |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
26 offset += length; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
27 length = 2; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
28 |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
29 if (offset + 2 >= size || |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
30 data[offset] != JPEG_MARKER) return FALSE; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
31 |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
32 marker = data[offset + 1]; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
33 if (marker != JPEG_MARKER_SOI && |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
34 marker != JPEG_MARKER_EOI) |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
35 { |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
36 if (offset + 4 >= size) return FALSE; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
37 length += ((guint)data[offset + 2] << 8) + data[offset + 3]; |
1907
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
38 |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
39 if (marker == app_marker && |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
40 offset + length < size && |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
41 length >= 4 + magic_len && |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
42 memcmp(data + offset + 4, magic, magic_len) == 0) |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
43 { |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
44 *seg_offset = offset + 4; |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
45 *seg_length = length - 4; |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
46 return TRUE; |
b3238ae21c7a
fixed jpeg_segment_find to support more app2 segments with different signatures
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1903
diff
changeset
|
47 } |
1902
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
48 } |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
49 } |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
50 return FALSE; |
5e5a8f36f019
split jpeg parser functions to separate file
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
diff
changeset
|
51 } |
1903 | 52 |
53 | |
54 typedef enum { | |
55 TIFF_BYTE_ORDER_INTEL, | |
56 TIFF_BYTE_ORDER_MOTOROLA | |
57 } TiffByteOrder; | |
58 | |
59 #define TIFF_TIFD_OFFSET_TAG 0 | |
60 #define TIFF_TIFD_OFFSET_FORMAT 2 | |
61 #define TIFF_TIFD_OFFSET_COUNT 4 | |
62 #define TIFF_TIFD_OFFSET_DATA 8 | |
63 #define TIFF_TIFD_SIZE 12 | |
64 | |
65 | |
66 | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
67 guint16 tiff_byte_get_int16(const guchar *f, TiffByteOrder bo) |
1903 | 68 { |
69 guint16 align_buf; | |
70 | |
71 memcpy(&align_buf, f, sizeof(guint16)); | |
72 | |
73 if (bo == TIFF_BYTE_ORDER_INTEL) | |
74 return GUINT16_FROM_LE(align_buf); | |
75 else | |
76 return GUINT16_FROM_BE(align_buf); | |
77 } | |
78 | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
79 guint32 tiff_byte_get_int32(const guchar *f, TiffByteOrder bo) |
1903 | 80 { |
81 guint32 align_buf; | |
82 | |
83 memcpy(&align_buf, f, sizeof(guint32)); | |
84 | |
85 if (bo == TIFF_BYTE_ORDER_INTEL) | |
86 return GUINT32_FROM_LE(align_buf); | |
87 else | |
88 return GUINT32_FROM_BE(align_buf); | |
89 } | |
90 | |
91 void tiff_byte_put_int16(guchar *f, guint16 n, TiffByteOrder bo) | |
92 { | |
93 guint16 align_buf; | |
94 | |
95 if (bo == TIFF_BYTE_ORDER_INTEL) | |
96 { | |
97 align_buf = GUINT16_TO_LE(n); | |
98 } | |
99 else | |
100 { | |
101 align_buf = GUINT16_TO_BE(n); | |
102 } | |
103 | |
104 memcpy(f, &align_buf, sizeof(guint16)); | |
105 } | |
106 | |
107 void tiff_byte_put_int32(guchar *f, guint32 n, TiffByteOrder bo) | |
108 { | |
109 guint32 align_buf; | |
110 | |
111 if (bo == TIFF_BYTE_ORDER_INTEL) | |
112 { | |
113 align_buf = GUINT32_TO_LE(n); | |
114 } | |
115 else | |
116 { | |
117 align_buf = GUINT32_TO_BE(n); | |
118 } | |
119 | |
120 memcpy(f, &align_buf, sizeof(guint32)); | |
121 } | |
122 | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
123 gint tiff_directory_offset(const guchar *data, const guint len, |
1903 | 124 guint *offset, TiffByteOrder *bo) |
125 { | |
126 if (len < 8) return FALSE; | |
127 | |
128 if (memcmp(data, "II", 2) == 0) | |
129 { | |
130 *bo = TIFF_BYTE_ORDER_INTEL; | |
131 } | |
132 else if (memcmp(data, "MM", 2) == 0) | |
133 { | |
134 *bo = TIFF_BYTE_ORDER_MOTOROLA; | |
135 } | |
136 else | |
137 { | |
138 return FALSE; | |
139 } | |
140 | |
141 if (tiff_byte_get_int16(data + 2, *bo) != 0x002A) | |
142 { | |
143 return FALSE; | |
144 } | |
145 | |
146 *offset = tiff_byte_get_int32(data + 4, *bo); | |
147 | |
148 return (*offset < len); | |
149 } | |
150 | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
151 typedef gint (* FuncParseIFDEntry)(const guchar *tiff, guint offset, |
1903 | 152 guint size, TiffByteOrder bo, |
153 gpointer data); | |
154 | |
155 | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
156 gint tiff_parse_IFD_table(const guchar *tiff, guint offset, |
1903 | 157 guint size, TiffByteOrder bo, |
158 guint *next_offset, | |
159 FuncParseIFDEntry parse_entry, gpointer data) | |
160 { | |
161 guint count; | |
162 guint i; | |
163 guint next; | |
164 | |
165 | |
166 /* We should be able to read number of entries in IFD0) */ | |
167 if (size < offset + 2) return -1; | |
168 | |
169 count = tiff_byte_get_int16(tiff + offset, bo); | |
170 offset += 2; | |
171 /* Entries and next IFD offset must be readable */ | |
172 if (size < offset + count * TIFF_TIFD_SIZE + 4) return -1; | |
173 | |
174 for (i = 0; i < count; i++) | |
175 { | |
176 parse_entry(tiff, offset + i * TIFF_TIFD_SIZE, size, bo, data); | |
177 } | |
178 | |
179 next = tiff_byte_get_int32(tiff + offset + count * TIFF_TIFD_SIZE, bo); | |
180 if (next_offset) *next_offset = next; | |
181 | |
182 return 0; | |
183 } | |
184 | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
185 static gint mpo_parse_Index_IFD_entry(const guchar *tiff, guint offset, |
1903 | 186 guint size, TiffByteOrder bo, |
187 gpointer data) | |
188 { | |
189 guint tag; | |
190 guint format; | |
191 guint count; | |
192 guint data_val; | |
193 guint data_offset; | |
194 guint data_length; | |
195 | |
196 MPOData *mpo = data; | |
197 | |
198 tag = tiff_byte_get_int16(tiff + offset + TIFF_TIFD_OFFSET_TAG, bo); | |
199 format = tiff_byte_get_int16(tiff + offset + TIFF_TIFD_OFFSET_FORMAT, bo); | |
200 count = tiff_byte_get_int32(tiff + offset + TIFF_TIFD_OFFSET_COUNT, bo); | |
201 data_val = tiff_byte_get_int32(tiff + offset + TIFF_TIFD_OFFSET_DATA, bo); | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
202 DEBUG_1(" tag %x format %x count %x data_val %x", tag, format, count, data_val); |
1903 | 203 |
204 if (tag == 0xb000) | |
205 { | |
206 mpo->version = data_val; | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
207 DEBUG_1(" mpo version %x", mpo->version); |
1903 | 208 } |
209 else if (tag == 0xb001) | |
210 { | |
211 mpo->num_images = data_val; | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
212 DEBUG_1(" num images %x", mpo->num_images); |
1903 | 213 } |
214 else if (tag == 0xb002) | |
215 { | |
216 guint i; | |
217 data_offset = data_val; | |
218 data_length = count; | |
219 if (size < data_offset || size < data_offset + data_length) | |
220 { | |
221 return -1; | |
222 } | |
223 if (count != mpo->num_images * 16) | |
224 { | |
225 return -1; | |
226 } | |
227 | |
228 mpo->images = g_new0(MPOEntry, mpo->num_images); | |
229 | |
230 for (i = 0; i < mpo->num_images; i++) { | |
231 guint image_attr = tiff_byte_get_int32(tiff + data_offset + i * 16, bo); | |
232 mpo->images[i].type_code = image_attr & 0xffffff; | |
233 mpo->images[i].representative = !!(image_attr & 0x20000000); | |
234 mpo->images[i].dependent_child = !!(image_attr & 0x40000000); | |
235 mpo->images[i].dependent_parent = !!(image_attr & 0x80000000); | |
236 mpo->images[i].length = tiff_byte_get_int32(tiff + data_offset + i * 16 + 4, bo); | |
237 mpo->images[i].offset = tiff_byte_get_int32(tiff + data_offset + i * 16 + 8, bo); | |
238 mpo->images[i].dep1 = tiff_byte_get_int16(tiff + data_offset + i * 16 + 12, bo); | |
239 mpo->images[i].dep2 = tiff_byte_get_int16(tiff + data_offset + i * 16 + 14, bo); | |
240 | |
241 if (i == 0) | |
242 { | |
243 mpo->images[i].offset = 0; | |
244 } | |
245 else | |
246 { | |
247 mpo->images[i].offset += mpo->mpo_offset; | |
248 } | |
249 | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
250 DEBUG_1(" image %x %x %x", image_attr, mpo->images[i].length, mpo->images[i].offset); |
1903 | 251 } |
252 } | |
253 | |
254 return 0; | |
255 } | |
256 | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
257 static gint mpo_parse_Attributes_IFD_entry(const guchar *tiff, guint offset, |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
258 guint size, TiffByteOrder bo, |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
259 gpointer data) |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
260 { |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
261 guint tag; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
262 guint format; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
263 guint count; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
264 guint data_val; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
265 guint data_offset; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
266 guint data_length; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
267 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
268 MPOEntry *mpe = data; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
269 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
270 tag = tiff_byte_get_int16(tiff + offset + TIFF_TIFD_OFFSET_TAG, bo); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
271 format = tiff_byte_get_int16(tiff + offset + TIFF_TIFD_OFFSET_FORMAT, bo); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
272 count = tiff_byte_get_int32(tiff + offset + TIFF_TIFD_OFFSET_COUNT, bo); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
273 data_val = tiff_byte_get_int32(tiff + offset + TIFF_TIFD_OFFSET_DATA, bo); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
274 DEBUG_1(" tag %x format %x count %x data_val %x", tag, format, count, data_val); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
275 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
276 switch (tag) |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
277 { |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
278 case 0xb000: |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
279 mpe->MPFVersion = data_val; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
280 DEBUG_1(" mpo version %x", data_val); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
281 break; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
282 case 0xb101: |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
283 mpe->MPIndividualNum = data_val; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
284 DEBUG_1(" Individual Image Number %x", mpe->MPIndividualNum); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
285 break; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
286 case 0xb201: |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
287 mpe->PanOrientation = data_val; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
288 break; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
289 /* |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
290 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
291 FIXME: |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
292 Panorama Scanning Orientation PanOrientation 45569 B201 LONG 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
293 Panorama Horizontal Overlap PanOverlap_H 45570 B202 RATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
294 Panorama Vertical Overlap PanOverlap_V 45571 B203 RATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
295 Base Viewpoint Number BaseViewpointNum 45572 B204 LONG 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
296 Convergence Angle ConvergenceAngle 45573 B205 SRATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
297 Baseline Length BaselineLength 45574 B206 RATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
298 Divergence Angle VerticalDivergence 45575 B207 SRATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
299 Horizontal Axis Distance AxisDistance_X 45576 B208 SRATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
300 Vertical Axis Distance AxisDistance_Y 45577 B209 SRATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
301 Collimation Axis Distance AxisDistance_Z 45578 B20A SRATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
302 Yaw Angle YawAngle 45579 B20B SRATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
303 Pitch Angle PitchAngle 45580 B20C SRATIONAL 1 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
304 Roll Angle RollAngle 45581 B20D |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
305 */ |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
306 default: |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
307 break; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
308 } |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
309 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
310 return 0; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
311 } |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
312 |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
313 MPOData *jpeg_get_mpo_data(const guchar *data, guint size) |
1903 | 314 { |
315 guint seg_offset; | |
316 guint seg_size; | |
317 if (jpeg_segment_find(data, size, JPEG_MARKER_APP2, "MPF\x00", 4, &seg_offset, &seg_size) && seg_size >16) | |
318 { | |
319 guint offset; | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
320 guint next_offset; |
1903 | 321 TiffByteOrder bo; |
322 MPOData *mpo; | |
323 guint i; | |
324 | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
325 DEBUG_1("mpo signature found at %x", seg_offset); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
326 seg_offset += 4; |
1903 | 327 seg_size -= 4; |
328 | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
329 if (!tiff_directory_offset(data + seg_offset, seg_size, &offset, &bo)) return NULL; |
1903 | 330 |
331 mpo = g_new0(MPOData, 1); | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
332 mpo->mpo_offset = seg_offset; |
1903 | 333 |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
334 tiff_parse_IFD_table(data + seg_offset, offset , seg_size, bo, &next_offset, mpo_parse_Index_IFD_entry, (gpointer)mpo); |
1903 | 335 if (!mpo->images) mpo->num_images = 0; |
336 | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
337 |
1903 | 338 for (i = 0; i < mpo->num_images; i++) |
339 { | |
340 if (mpo->images[i].offset + mpo->images[i].length > size) | |
341 { | |
342 mpo->num_images = i; | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
343 DEBUG_1("MPO file truncated to %d valid images, %d %d", i, mpo->images[i].offset + mpo->images[i].length, size); |
1903 | 344 break; |
345 } | |
346 } | |
1912
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
347 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
348 for (i = 0; i < mpo->num_images; i++) |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
349 { |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
350 if (i == 0) |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
351 { |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
352 offset = next_offset; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
353 } |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
354 else |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
355 { |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
356 if (!jpeg_segment_find(data + mpo->images[i].offset, mpo->images[i].length, JPEG_MARKER_APP2, "MPF\x00", 4, &seg_offset, &seg_size) || seg_size <=16) |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
357 { |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
358 DEBUG_1("MPO image %d: MPO signature not found", i); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
359 continue; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
360 } |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
361 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
362 seg_offset += 4; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
363 seg_size -= 4; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
364 if (!tiff_directory_offset(data + mpo->images[i].offset + seg_offset, seg_size, &offset, &bo)) |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
365 { |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
366 DEBUG_1("MPO image %d: invalid directory offset", i); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
367 continue; |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
368 } |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
369 |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
370 } |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
371 tiff_parse_IFD_table(data + mpo->images[i].offset + seg_offset, offset , seg_size, bo, NULL, mpo_parse_Attributes_IFD_entry, (gpointer)&mpo->images[i]); |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
372 } |
4417578c55f9
improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents:
1909
diff
changeset
|
373 |
1903 | 374 return mpo; |
375 } | |
376 return NULL; | |
377 } | |
1908 | 378 |
379 void jpeg_mpo_data_free(MPOData *mpo) | |
380 { | |
381 if (mpo) | |
382 { | |
383 if (mpo->images) g_free(mpo->images); | |
384 g_free(mpo); | |
385 } | |
1977
af653599660d
More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents:
1912
diff
changeset
|
386 } |