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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
52
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
53
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
54 typedef enum {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
55 TIFF_BYTE_ORDER_INTEL,
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
56 TIFF_BYTE_ORDER_MOTOROLA
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
57 } TiffByteOrder;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
58
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
59 #define TIFF_TIFD_OFFSET_TAG 0
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
60 #define TIFF_TIFD_OFFSET_FORMAT 2
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
61 #define TIFF_TIFD_OFFSET_COUNT 4
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
62 #define TIFF_TIFD_OFFSET_DATA 8
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
63 #define TIFF_TIFD_SIZE 12
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
64
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
65
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
68 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
69 guint16 align_buf;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
70
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
71 memcpy(&align_buf, f, sizeof(guint16));
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
72
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
73 if (bo == TIFF_BYTE_ORDER_INTEL)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
74 return GUINT16_FROM_LE(align_buf);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
75 else
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
76 return GUINT16_FROM_BE(align_buf);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
77 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
80 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
81 guint32 align_buf;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
82
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
83 memcpy(&align_buf, f, sizeof(guint32));
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
84
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
85 if (bo == TIFF_BYTE_ORDER_INTEL)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
86 return GUINT32_FROM_LE(align_buf);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
87 else
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
88 return GUINT32_FROM_BE(align_buf);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
89 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
90
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
91 void tiff_byte_put_int16(guchar *f, guint16 n, TiffByteOrder bo)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
92 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
93 guint16 align_buf;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
94
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
95 if (bo == TIFF_BYTE_ORDER_INTEL)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
96 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
97 align_buf = GUINT16_TO_LE(n);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
98 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
99 else
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
100 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
101 align_buf = GUINT16_TO_BE(n);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
102 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
103
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
104 memcpy(f, &align_buf, sizeof(guint16));
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
105 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
106
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
107 void tiff_byte_put_int32(guchar *f, guint32 n, TiffByteOrder bo)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
108 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
109 guint32 align_buf;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
110
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
111 if (bo == TIFF_BYTE_ORDER_INTEL)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
112 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
113 align_buf = GUINT32_TO_LE(n);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
114 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
115 else
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
116 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
117 align_buf = GUINT32_TO_BE(n);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
118 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
119
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
120 memcpy(f, &align_buf, sizeof(guint32));
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
121 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
124 guint *offset, TiffByteOrder *bo)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
125 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
126 if (len < 8) return FALSE;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
127
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
128 if (memcmp(data, "II", 2) == 0)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
129 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
130 *bo = TIFF_BYTE_ORDER_INTEL;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
131 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
132 else if (memcmp(data, "MM", 2) == 0)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
133 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
134 *bo = TIFF_BYTE_ORDER_MOTOROLA;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
135 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
136 else
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
137 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
138 return FALSE;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
139 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
140
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
141 if (tiff_byte_get_int16(data + 2, *bo) != 0x002A)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
142 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
143 return FALSE;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
144 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
145
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
146 *offset = tiff_byte_get_int32(data + 4, *bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
147
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
148 return (*offset < len);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
149 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
152 guint size, TiffByteOrder bo,
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
153 gpointer data);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
154
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
157 guint size, TiffByteOrder bo,
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
158 guint *next_offset,
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
159 FuncParseIFDEntry parse_entry, gpointer data)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
160 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
161 guint count;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
162 guint i;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
163 guint next;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
164
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
165
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
166 /* We should be able to read number of entries in IFD0) */
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
167 if (size < offset + 2) return -1;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
168
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
169 count = tiff_byte_get_int16(tiff + offset, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
170 offset += 2;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
171 /* Entries and next IFD offset must be readable */
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
172 if (size < offset + count * TIFF_TIFD_SIZE + 4) return -1;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
173
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
174 for (i = 0; i < count; i++)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
175 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
176 parse_entry(tiff, offset + i * TIFF_TIFD_SIZE, size, bo, data);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
177 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
178
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
179 next = tiff_byte_get_int32(tiff + offset + count * TIFF_TIFD_SIZE, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
180 if (next_offset) *next_offset = next;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
181
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
182 return 0;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
183 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
186 guint size, TiffByteOrder bo,
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
187 gpointer data)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
188 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
189 guint tag;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
190 guint format;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
191 guint count;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
192 guint data_val;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
193 guint data_offset;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
194 guint data_length;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
195
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
196 MPOData *mpo = data;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
197
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
198 tag = tiff_byte_get_int16(tiff + offset + TIFF_TIFD_OFFSET_TAG, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
199 format = tiff_byte_get_int16(tiff + offset + TIFF_TIFD_OFFSET_FORMAT, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
200 count = tiff_byte_get_int32(tiff + offset + TIFF_TIFD_OFFSET_COUNT, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
203
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
204 if (tag == 0xb000)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
205 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
208 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
209 else if (tag == 0xb001)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
210 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
213 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
214 else if (tag == 0xb002)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
215 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
216 guint i;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
217 data_offset = data_val;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
218 data_length = count;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
219 if (size < data_offset || size < data_offset + data_length)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
220 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
221 return -1;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
222 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
223 if (count != mpo->num_images * 16)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
224 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
225 return -1;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
226 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
227
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
228 mpo->images = g_new0(MPOEntry, mpo->num_images);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
229
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
230 for (i = 0; i < mpo->num_images; i++) {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
231 guint image_attr = tiff_byte_get_int32(tiff + data_offset + i * 16, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
232 mpo->images[i].type_code = image_attr & 0xffffff;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
233 mpo->images[i].representative = !!(image_attr & 0x20000000);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
234 mpo->images[i].dependent_child = !!(image_attr & 0x40000000);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
235 mpo->images[i].dependent_parent = !!(image_attr & 0x80000000);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
236 mpo->images[i].length = tiff_byte_get_int32(tiff + data_offset + i * 16 + 4, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
237 mpo->images[i].offset = tiff_byte_get_int32(tiff + data_offset + i * 16 + 8, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
238 mpo->images[i].dep1 = tiff_byte_get_int16(tiff + data_offset + i * 16 + 12, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
239 mpo->images[i].dep2 = tiff_byte_get_int16(tiff + data_offset + i * 16 + 14, bo);
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
240
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
241 if (i == 0)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
242 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
243 mpo->images[i].offset = 0;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
244 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
245 else
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
246 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
247 mpo->images[i].offset += mpo->mpo_offset;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
248 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
251 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
252 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
253
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
254 return 0;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
255 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
314 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
315 guint seg_offset;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
316 guint seg_size;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
317 if (jpeg_segment_find(data, size, JPEG_MARKER_APP2, "MPF\x00", 4, &seg_offset, &seg_size) && seg_size >16)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
318 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
321 TiffByteOrder bo;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
322 MPOData *mpo;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
323 guint i;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
327 seg_size -= 4;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
330
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
335 if (!mpo->images) mpo->num_images = 0;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
336
1912
4417578c55f9 improved mpo parser, consider individual image type code
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1909
diff changeset
337
1903
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
338 for (i = 0; i < mpo->num_images; i++)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
339 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
340 if (mpo->images[i].offset + mpo->images[i].length > size)
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
341 {
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
344 break;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
345 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
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
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
374 return mpo;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
375 }
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
376 return NULL;
16b0afb2347c added mpo parser
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1902
diff changeset
377 }
1908
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
378
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
379 void jpeg_mpo_data_free(MPOData *mpo)
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
380 {
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
381 if (mpo)
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
382 {
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
383 if (mpo->images) g_free(mpo->images);
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
384 g_free(mpo);
b5b95dd93eea free mpo data
Vladimir Nadvornik <nadvornik@suse.cz>
parents: 1907
diff changeset
385 }
1977
af653599660d More use of const, fix up a warning.
Laurent Monin <zas@norz.org>
parents: 1912
diff changeset
386 }