1 /*
2  * Copyright (c) 2002, 2003, Eric M. Johnston <emj@postal.net>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by Eric M. Johnston.
16  * 4. Neither the name of the author nor the names of any co-contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  * $Id: casio.c,v 1.11 2003/08/06 02:26:42 ejohnst Exp $
33  */
34 
35 /*
36  * Exif tag definitions for Casio maker notes.
37  *
38  */
39 
40 #include <stdio.h>
41 #include <stdlib.h>
42 #include <string.h>
43 
44 #include "makers.h"
45 
46 
47 /* Recording mode. */
48 
49 static struct descrip casio_record[] = {
50 	{ 1,	"Single Shutter" },
51 	{ 7,	"Panorama" },
52 	{ 10,	"Night Scene" },
53 	{ 15,	"Portrait" },
54 	{ 16,	"Landscape" },
55 	{ -1,	"Unknown" },
56 };
57 
58 
59 /* Quality. */
60 
61 static struct descrip casio_qual[] = {
62 	{ 1,	"Economy" },
63 	{ 2,	"Normal" },
64 	{ 3,	"Fine" },
65 	{ -1,	"Unknown" },
66 };
67 
68 
69 /* Focus mode. */
70 
71 static struct descrip casio_focus[] = {
72 	{ 2,	"Macro" },
73 	{ 3,	"Auto" },
74 	{ 4,	"Manual" },
75 	{ 5,	"Infinity" },
76 	{ -1,	"Unknown" },
77 };
78 
79 
80 /* Flash mode. */
81 
82 static struct descrip casio_flash[] = {
83 	{ 1,	"Auto" },
84 	{ 2,	"On" },
85 	{ 4,	"Off" },
86 	{ 5,	"Red Eye Reduction" },
87 	{ -1,	"Unknown" },
88 };
89 
90 
91 /* Flash intensity. */
92 
93 static struct descrip casio_intense[] = {
94 	{ 11,	"Weak" },
95 	{ 13,	"Normal" },
96 	{ 15,	"Strong" },
97 	{ -1,	"Unknown" },
98 };
99 
100 
101 /* White balance. */
102 
103 static struct descrip casio_whiteb[] = {
104 	{ 1,	"Auto" },
105 	{ 2,	"Tungsten" },
106 	{ 3,	"Daylight" },
107 	{ 4,	"Fluorescent" },
108 	{ 5,	"Shade" },
109 	{ 129,	"Manual" },
110 	{ -1,	"Unknown" },
111 };
112 
113 
114 /* Sharpness. */
115 
116 static struct descrip casio_sharp[] = {
117 	{ 0,	"Normal" },
118 	{ 1,	"Soft" },
119 	{ 2,	"Hard" },
120 	{ -1,	"Unknown" },
121 };
122 
123 
124 /* Contrast & saturation. */
125 
126 static struct descrip casio_range[] = {
127 	{ 0,	"Normal" },
128 	{ 1,	"Low" },
129 	{ 2,	"High" },
130 	{ -1,	"Unknown" },
131 };
132 
133 
134 /* Sensitivity. */
135 
136 static struct descrip casio_sensitive[] = {
137 	{ 64,	"Normal" },
138 	{ 80,	"Normal" },
139 	{ 100,	"High" },
140 	{ 125,	"+1.0" },
141 	{ 244,	"+3.0" },
142 	{ 250,	"+2.0" },
143 	{ -1,	"Unknown" },
144 };
145 
146 
147 /* Maker note IFD tags. */
148 
149 static struct exiftag casio_tags0[] = {
150 	{ 0x0001, TIFF_SHORT, 1, ED_IMG, "CasioRecord",
151 	  "Recording Mode", casio_record },
152 	{ 0x0002, TIFF_SHORT, 1, ED_IMG, "CasioQuality",
153 	  "Quality Setting", casio_qual },
154 	{ 0x0003, TIFF_SHORT, 1, ED_IMG, "CasioFocus",
155 	  "Focusing Mode", casio_focus },
156 	{ 0x0004, TIFF_SHORT, 1, ED_IMG, "CasioFlash",
157 	  "Flash Mode", casio_flash },
158 	{ 0x0005, TIFF_SHORT, 1, ED_IMG, "CasioIntensity",
159 	  "Flash Intensity", casio_intense },
160 	{ 0x0006, TIFF_LONG, 1, ED_VRB, "CasioDistance",
161 	  "Object Distance", NULL },
162 	{ 0x0007, TIFF_SHORT, 1, ED_IMG, "CasioWhiteB",
163 	  "White Balance", casio_whiteb },
164 	{ 0x000a, TIFF_LONG, 1, ED_UNK, "CasioDZoom",
165 	  "Digital Zoom", NULL },
166 	{ 0x000b, TIFF_SHORT, 1, ED_IMG, "CasioSharp",
167 	  "Sharpness", casio_sharp },
168 	{ 0x000c, TIFF_SHORT, 1, ED_IMG, "CasioContrast",
169 	  "Contrast", casio_range },
170 	{ 0x000d, TIFF_SHORT, 1, ED_IMG, "CasioSaturate",
171 	  "Saturation", casio_range },
172 	{ 0x0014, TIFF_SHORT, 1, ED_IMG, "CasioSensitive",
173 	  "Sensitivity", casio_sensitive },
174 	{ 0xffff, TIFF_UNKN, 0, ED_UNK, "CasioUnknown",
175 	  "Casio Unknown", NULL },
176 };
177 
178 
179 static struct exiftag casio_tags1[] = {
180 	{ 0x2001, TIFF_ASCII, 1, ED_UNK, "CasioASCII1",
181 	  "Casio ASCII Val 1", NULL },
182 	{ 0x2002, TIFF_ASCII, 1, ED_UNK, "CasioASCII2",
183 	  "Casio ASCII Val 2", NULL },
184 	{ 0x3006, TIFF_ASCII, 1, ED_UNK, "CasioASCII3",
185 	  "Casio ASCII Val 3", NULL },
186 	{ 0xffff, TIFF_UNKN, 0, ED_UNK, "CasioUnknown",
187 	  "Casio Unknown", NULL },
188 };
189 
190 
191 /*
192  * Try to read a Casio maker note IFD.
193  */
194 struct ifd *
casio_ifd(u_int32_t offset,struct tiffmeta * md)195 casio_ifd(u_int32_t offset, struct tiffmeta *md)
196 {
197 	struct ifd *myifd;
198 
199 	/*
200 	 * It appears that there are two different types of maker notes
201 	 * for Casio cameras: one, for older cameras, uses a standard IFD
202 	 * format; the other starts at offset + 6 ("QVC\0\0\0").
203 	 */
204 
205 	if (!memcmp("QVC\0\0\0", md->btiff + offset, 6)) {
206 		readifd(offset + strlen("QVC") + 3, &myifd, casio_tags1, md);
207 		exifwarn("Casio maker note version not supported");
208 	} else
209 		readifd(offset, &myifd, casio_tags0, md);
210 
211 	return (myifd);
212 }
213