File Coverage

blib/lib/Image/ExifTool/Olympus.pm
Criterion Covered Total %
statement 41 46 89.1
branch 10 22 45.4
condition 1 3 33.3
subroutine 8 9 88.8
pod 0 4 0.0
total 60 84 71.4


line stmt bran cond sub pod time code
1             #------------------------------------------------------------------------------
2             # File: Olympus.pm
3             #
4             # Description: Olympus/Epson EXIF maker notes tags
5             #
6             # Revisions: 12/09/2003 - P. Harvey Created
7             # 11/11/2004 - P. Harvey Added Epson support
8             #
9             # References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
10             # 2) http://www.cybercom.net/~dcoffin/dcraw/
11             # 3) http://www.ozhiker.com/electronics/pjmt/jpeg_info/olympus_mn.html
12             # 4) Markku Hanninen private communication (tests with E-1)
13             # 5) Remi Guyomarch from http://forums.dpreview.com/forums/read.asp?forum=1022&message=12790396
14             # 6) Frank Ledwon private communication (tests with E/C-series cameras)
15             # 7) Michael Meissner private communication
16             # 8) Shingo Noguchi, PhotoXP (http://www.daifukuya.com/photoxp/)
17             # 9) Mark Dapoz private communication
18             # 10) Lilo Huang private communication (E-330)
19             # 11) http://olypedia.de/Olympus_Makernotes (May 30, 2013)
20             # 12) Ioannis Panagiotopoulos private communication (E-510)
21             # 13) Chris Shaw private communication (E-3)
22             # 14) Viktor Lushnikov private communication (E-400)
23             # 15) Yrjo Rauste private communication (E-30)
24             # 16) Godfrey DiGiorgi private communication (E-P1) + http://forums.dpreview.com/forums/read.asp?message=33187567
25             # 17) Martin Hibers private communication
26             # 18) Tomasz Kawecki private communication
27             # 19) Brad Grier private communication
28             # 22) Herbert Kauer private communication
29             # 23) Daniel Pollock private communication (PEN-F)
30             # 24) Sebastian private communication (E-M1 Mark III)
31             # IB) Iliah Borg private communication (LibRaw)
32             # NJ) Niels Kristian Bech Jensen private communication
33             #------------------------------------------------------------------------------
34              
35             package Image::ExifTool::Olympus;
36              
37 19     19   4162 use strict;
  19         43  
  19         594  
38 19     19   96 use vars qw($VERSION);
  19         38  
  19         729  
39 19     19   101 use Image::ExifTool qw(:DataAccess :Utils);
  19         37  
  19         3482  
40 19     19   1245 use Image::ExifTool::Exif;
  19         41  
  19         473  
41 19     19   6844 use Image::ExifTool::APP12;
  19         52  
  19         123090  
42              
43             $VERSION = '2.78';
44              
45             sub PrintLensInfo($$$);
46              
47             my %offOn = ( 0 => 'Off', 1 => 'On' );
48              
49             # lookup for Olympus LensType values
50             # (as of ExifTool 9.15, this was the complete list of chipped lenses at www.four-thirds.org)
51             my %olympusLensTypes = (
52             Notes => q{
53             The numerical values below are given in hexadecimal. (Prior to ExifTool
54             9.15 these were in decimal.)
55             },
56             '0 00 00' => 'None',
57             # Olympus lenses (also Kenko Tokina)
58             '0 01 00' => 'Olympus Zuiko Digital ED 50mm F2.0 Macro',
59             '0 01 01' => 'Olympus Zuiko Digital 40-150mm F3.5-4.5', #8
60             '0 01 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6', #PH (E-P1 pre-production)
61             '0 02 00' => 'Olympus Zuiko Digital ED 150mm F2.0',
62             '0 02 10' => 'Olympus M.Zuiko Digital 17mm F2.8 Pancake', #PH (E-P1 pre-production)
63             '0 03 00' => 'Olympus Zuiko Digital ED 300mm F2.8',
64             '0 03 10' => 'Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6 [II]', #11 (The second version of this lens seems to have the same lens ID number as the first version #NJ)
65             '0 04 10' => 'Olympus M.Zuiko Digital ED 9-18mm F4.0-5.6', #11
66             '0 05 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5',
67             '0 05 01' => 'Olympus Zuiko Digital Pro ED 90-250mm F2.8', #9
68             '0 05 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 L', #11 (E-PL1)
69             '0 06 00' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5',
70             '0 06 01' => 'Olympus Zuiko Digital ED 8mm F3.5 Fisheye', #9
71             '0 06 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6', #PH
72             '0 07 00' => 'Olympus Zuiko Digital 11-22mm F2.8-3.5',
73             '0 07 01' => 'Olympus Zuiko Digital 18-180mm F3.5-6.3', #6
74             '0 07 10' => 'Olympus M.Zuiko Digital ED 12mm F2.0', #PH
75             '0 08 01' => 'Olympus Zuiko Digital 70-300mm F4.0-5.6', #7 (seen as release 1 - PH)
76             '0 08 10' => 'Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7', #PH
77             '0 09 10' => 'Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II', #PH (E-PL2)
78             '0 10 01' => 'Kenko Tokina Reflex 300mm F6.3 MF Macro', #NJ
79             '0 10 10' => 'Olympus M.Zuiko Digital ED 12-50mm F3.5-6.3 EZ', #PH
80             '0 11 10' => 'Olympus M.Zuiko Digital 45mm F1.8', #17
81             '0 12 10' => 'Olympus M.Zuiko Digital ED 60mm F2.8 Macro', #NJ
82             '0 13 10' => 'Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II R', #PH/NJ
83             '0 14 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0-5.6 R', #19
84             # '0 14 10.1' => 'Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6 II', #11 (questionable & unconfirmed -- all samples I can find are '0 3 10' - PH)
85             '0 15 00' => 'Olympus Zuiko Digital ED 7-14mm F4.0',
86             '0 15 10' => 'Olympus M.Zuiko Digital ED 75mm F1.8', #PH
87             '0 16 10' => 'Olympus M.Zuiko Digital 17mm F1.8', #NJ
88             '0 17 00' => 'Olympus Zuiko Digital Pro ED 35-100mm F2.0', #7
89             '0 18 00' => 'Olympus Zuiko Digital 14-45mm F3.5-5.6',
90             '0 18 10' => 'Olympus M.Zuiko Digital ED 75-300mm F4.8-6.7 II', #NJ
91             '0 19 10' => 'Olympus M.Zuiko Digital ED 12-40mm F2.8 Pro', #PH
92             '0 20 00' => 'Olympus Zuiko Digital 35mm F3.5 Macro', #9
93             '0 20 10' => 'Olympus M.Zuiko Digital ED 40-150mm F2.8 Pro', #NJ
94             '0 21 10' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6 EZ', #NJ
95             '0 22 00' => 'Olympus Zuiko Digital 17.5-45mm F3.5-5.6', #9
96             '0 22 10' => 'Olympus M.Zuiko Digital 25mm F1.8', #NJ
97             '0 23 00' => 'Olympus Zuiko Digital ED 14-42mm F3.5-5.6', #PH
98             '0 23 10' => 'Olympus M.Zuiko Digital ED 7-14mm F2.8 Pro', #NJ
99             '0 24 00' => 'Olympus Zuiko Digital ED 40-150mm F4.0-5.6', #PH
100             '0 24 10' => 'Olympus M.Zuiko Digital ED 300mm F4.0 IS Pro', #NJ
101             '0 25 10' => 'Olympus M.Zuiko Digital ED 8mm F1.8 Fisheye Pro', #NJ
102             '0 26 10' => 'Olympus M.Zuiko Digital ED 12-100mm F4.0 IS Pro', #IB/NJ
103             '0 27 10' => 'Olympus M.Zuiko Digital ED 30mm F3.5 Macro', #IB/NJ
104             '0 28 10' => 'Olympus M.Zuiko Digital ED 25mm F1.2 Pro', #IB/NJ
105             '0 29 10' => 'Olympus M.Zuiko Digital ED 17mm F1.2 Pro', #IB
106             '0 30 00' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD', #7
107             '0 30 10' => 'Olympus M.Zuiko Digital ED 45mm F1.2 Pro', #IB
108             '0 31 00' => 'Olympus Zuiko Digital ED 12-60mm F2.8-4.0 SWD', #7
109             '0 32 00' => 'Olympus Zuiko Digital ED 14-35mm F2.0 SWD', #PH
110             '0 32 10' => 'Olympus M.Zuiko Digital ED 12-200mm F3.5-6.3', #IB
111             '0 33 00' => 'Olympus Zuiko Digital 25mm F2.8', #PH
112             '0 33 10' => 'Olympus M.Zuiko Digital 150-400mm F4.5 TC1.25x IS Pro', #IB
113             '0 34 00' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
114             '0 34 10' => 'Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro', #IB
115             '0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
116             '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB
117             '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
118             # Sigma lenses
119             '1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8
120             '1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ
121             '1 02 00' => 'Sigma 55-200mm F4.0-5.6 DC',
122             '1 02 10' => 'Sigma 19mm F2.8 EX DN', #NJ
123             '1 03 00' => 'Sigma 18-125mm F3.5-5.6 DC',
124             '1 03 10' => 'Sigma 30mm F2.8 DN | A', #NJ
125             '1 04 00' => 'Sigma 18-125mm F3.5-5.6 DC', #7
126             '1 04 10' => 'Sigma 19mm F2.8 DN | A', #NJ
127             '1 05 00' => 'Sigma 30mm F1.4 EX DC HSM', #10
128             '1 05 10' => 'Sigma 60mm F2.8 DN | A', #NJ
129             '1 06 00' => 'Sigma APO 50-500mm F4.0-6.3 EX DG HSM', #6
130             '1 06 10' => 'Sigma 30mm F1.4 DC DN | C', #NJ
131             '1 07 00' => 'Sigma Macro 105mm F2.8 EX DG', #PH
132             '1 07 10' => 'Sigma 16mm F1.4 DC DN | C (017)', #IB
133             '1 08 00' => 'Sigma APO Macro 150mm F2.8 EX DG HSM', #PH
134             '1 09 00' => 'Sigma 18-50mm F2.8 EX DC Macro', #NJ
135             '1 10 00' => 'Sigma 24mm F1.8 EX DG Aspherical Macro', #PH
136             '1 11 00' => 'Sigma APO 135-400mm F4.5-5.6 DG', #11
137             '1 12 00' => 'Sigma APO 300-800mm F5.6 EX DG HSM', #11
138             '1 13 00' => 'Sigma 30mm F1.4 EX DC HSM', #11
139             '1 14 00' => 'Sigma APO 50-500mm F4.0-6.3 EX DG HSM', #11
140             '1 15 00' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11
141             '1 16 00' => 'Sigma APO 70-200mm F2.8 II EX DG Macro HSM', #11
142             '1 17 00' => 'Sigma 50mm F1.4 EX DG HSM', #11
143             # Panasonic/Leica lenses
144             '2 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
145             '2 01 10' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16
146             '2 02 00' => 'Leica D Summilux 25mm F1.4 Asph.', #11
147             '2 02 10' => 'Lumix G Vario 45-200mm F4.0-5.6 Mega OIS', #16
148             '2 03 00' => 'Leica D Vario Elmar 14-50mm F3.8-5.6 Asph. Mega OIS', #11
149             '2 03 01' => 'Leica D Vario Elmar 14-50mm F3.8-5.6 Asph.', #14 (L10 kit)
150             '2 03 10' => 'Lumix G Vario HD 14-140mm F4.0-5.8 Asph. Mega OIS', #16
151             '2 04 00' => 'Leica D Vario Elmar 14-150mm F3.5-5.6', #13
152             '2 04 10' => 'Lumix G Vario 7-14mm F4.0 Asph.', #PH (E-P1 pre-production)
153             '2 05 10' => 'Lumix G 20mm F1.7 Asph.', #16
154             '2 06 10' => 'Leica DG Macro-Elmarit 45mm F2.8 Asph. Mega OIS', #PH
155             '2 07 10' => 'Lumix G Vario 14-42mm F3.5-5.6 Asph. Mega OIS', #NJ
156             '2 08 10' => 'Lumix G Fisheye 8mm F3.5', #PH
157             '2 09 10' => 'Lumix G Vario 100-300mm F4.0-5.6 Mega OIS', #11
158             '2 10 10' => 'Lumix G 14mm F2.5 Asph.', #17
159             '2 11 10' => 'Lumix G 12.5mm F12 3D', #NJ (H-FT012)
160             '2 12 10' => 'Leica DG Summilux 25mm F1.4 Asph.', #NJ
161             '2 13 10' => 'Lumix G X Vario PZ 45-175mm F4.0-5.6 Asph. Power OIS', #NJ
162             '2 14 10' => 'Lumix G X Vario PZ 14-42mm F3.5-5.6 Asph. Power OIS', #NJ
163             '2 15 10' => 'Lumix G X Vario 12-35mm F2.8 Asph. Power OIS', #PH
164             '2 16 10' => 'Lumix G Vario 45-150mm F4.0-5.6 Asph. Mega OIS', #NJ
165             '2 17 10' => 'Lumix G X Vario 35-100mm F2.8 Power OIS', #PH
166             '2 18 10' => 'Lumix G Vario 14-42mm F3.5-5.6 II Asph. Mega OIS', #NJ
167             '2 19 10' => 'Lumix G Vario 14-140mm F3.5-5.6 Asph. Power OIS', #NJ
168             '2 20 10' => 'Lumix G Vario 12-32mm F3.5-5.6 Asph. Mega OIS', #NJ
169             '2 21 10' => 'Leica DG Nocticron 42.5mm F1.2 Asph. Power OIS', #NJ
170             '2 22 10' => 'Leica DG Summilux 15mm F1.7 Asph.', #NJ
171             '2 23 10' => 'Lumix G Vario 35-100mm F4.0-5.6 Asph. Mega OIS', #NJ
172             '2 24 10' => 'Lumix G Macro 30mm F2.8 Asph. Mega OIS', #NJ
173             '2 25 10' => 'Lumix G 42.5mm F1.7 Asph. Power OIS', #NJ
174             '2 26 10' => 'Lumix G 25mm F1.7 Asph.', #NJ
175             '2 27 10' => 'Leica DG Vario-Elmar 100-400mm F4.0-6.3 Asph. Power OIS', #NJ
176             '2 28 10' => 'Lumix G Vario 12-60mm F3.5-5.6 Asph. Power OIS', #NJ
177             '2 29 10' => 'Leica DG Summilux 12mm F1.4 Asph.', #IB
178             '2 30 10' => 'Leica DG Vario-Elmarit 12-60mm F2.8-4 Asph. Power OIS', #IB
179             '2 31 10' => 'Lumix G Vario 45-200mm F4.0-5.6 II', #forum3833
180             '2 32 10' => 'Lumix G Vario 100-300mm F4.0-5.6 II', #PH
181             '2 33 10' => 'Lumix G X Vario 12-35mm F2.8 II Asph. Power OIS', #IB
182             '2 34 10' => 'Lumix G Vario 35-100mm F2.8 II', #forum3833
183             '2 35 10' => 'Leica DG Vario-Elmarit 8-18mm F2.8-4 Asph.', #IB
184             '2 36 10' => 'Leica DG Elmarit 200mm F2.8 Power OIS', #IB
185             '2 37 10' => 'Leica DG Vario-Elmarit 50-200mm F2.8-4 Asph. Power OIS', #IB
186             '2 38 10' => 'Leica DG Vario-Summilux 10-25mm F1.7 Asph.', #IB
187             '2 40 10' => 'Leica DG Vario-Summilux 25-50mm F1.7 Asph.', #IB (H-X2550)
188             '3 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
189             '3 02 00' => 'Leica D Summilux 25mm F1.4 Asph.', #11
190             # Tamron lenses
191             '5 01 10' => 'Tamron 14-150mm F3.5-5.8 Di III', #NJ (model C001)
192             # '65535 07 40' - Seen for LUMIX S 16-35/F4 on Panasonic DC-S1H (ref PH)
193             # Other makes
194             '24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka
195             );
196              
197             # lookup for Olympus camera types (ref PH)
198             my %olympusCameraTypes = (
199             Notes => q{
200             These values are currently decoded only for Olympus models. Models with
201             Olympus-style maker notes from other brands such as Acer, BenQ, Hitachi, HP,
202             Premier, Konica-Minolta, Maginon, Ricoh, Rollei, SeaLife, Sony, Supra,
203             Vivitar are not listed.
204             },
205             D4028 => 'X-2,C-50Z',
206             D4029 => 'E-20,E-20N,E-20P',
207             D4034 => 'C720UZ',
208             D4040 => 'E-1',
209             D4041 => 'E-300',
210             D4083 => 'C2Z,D520Z,C220Z',
211             D4106 => 'u20D,S400D,u400D',
212             D4120 => 'X-1',
213             D4122 => 'u10D,S300D,u300D',
214             D4125 => 'AZ-1',
215             D4141 => 'C150,D390',
216             D4193 => 'C-5000Z',
217             D4194 => 'X-3,C-60Z',
218             D4199 => 'u30D,S410D,u410D',
219             D4205 => 'X450,D535Z,C370Z',
220             D4210 => 'C160,D395',
221             D4211 => 'C725UZ',
222             D4213 => 'FerrariMODEL2003',
223             D4216 => 'u15D',
224             D4217 => 'u25D',
225             D4220 => 'u-miniD,Stylus V',
226             D4221 => 'u40D,S500,uD500',
227             D4231 => 'FerrariMODEL2004',
228             D4240 => 'X500,D590Z,C470Z',
229             D4244 => 'uD800,S800',
230             D4256 => 'u720SW,S720SW',
231             D4261 => 'X600,D630,FE5500',
232             D4262 => 'uD600,S600',
233             D4301 => 'u810/S810', # (yes, "/". Olympus is not consistent in the notation)
234             D4302 => 'u710,S710',
235             D4303 => 'u700,S700',
236             D4304 => 'FE100,X710',
237             D4305 => 'FE110,X705',
238             D4310 => 'FE-130,X-720',
239             D4311 => 'FE-140,X-725',
240             D4312 => 'FE150,X730',
241             D4313 => 'FE160,X735',
242             D4314 => 'u740,S740',
243             D4315 => 'u750,S750',
244             D4316 => 'u730/S730',
245             D4317 => 'FE115,X715',
246             D4321 => 'SP550UZ',
247             D4322 => 'SP510UZ',
248             D4324 => 'FE170,X760',
249             D4326 => 'FE200',
250             D4327 => 'FE190/X750', # (also SX876)
251             D4328 => 'u760,S760',
252             D4330 => 'FE180/X745', # (also SX875)
253             D4331 => 'u1000/S1000',
254             D4332 => 'u770SW,S770SW',
255             D4333 => 'FE240/X795',
256             D4334 => 'FE210,X775',
257             D4336 => 'FE230/X790',
258             D4337 => 'FE220,X785',
259             D4338 => 'u725SW,S725SW',
260             D4339 => 'FE250/X800',
261             D4341 => 'u780,S780',
262             D4343 => 'u790SW,S790SW',
263             D4344 => 'u1020,S1020',
264             D4346 => 'FE15,X10',
265             D4348 => 'FE280,X820,C520',
266             D4349 => 'FE300,X830',
267             D4350 => 'u820,S820',
268             D4351 => 'u1200,S1200',
269             D4352 => 'FE270,X815,C510',
270             D4353 => 'u795SW,S795SW',
271             D4354 => 'u1030SW,S1030SW',
272             D4355 => 'SP560UZ',
273             D4356 => 'u1010,S1010',
274             D4357 => 'u830,S830',
275             D4359 => 'u840,S840',
276             D4360 => 'FE350WIDE,X865',
277             D4361 => 'u850SW,S850SW',
278             D4362 => 'FE340,X855,C560',
279             D4363 => 'FE320,X835,C540',
280             D4364 => 'SP570UZ',
281             D4366 => 'FE330,X845,C550',
282             D4368 => 'FE310,X840,C530',
283             D4370 => 'u1050SW,S1050SW',
284             D4371 => 'u1060,S1060',
285             D4372 => 'FE370,X880,C575',
286             D4374 => 'SP565UZ',
287             D4377 => 'u1040,S1040',
288             D4378 => 'FE360,X875,C570',
289             D4379 => 'FE20,X15,C25',
290             D4380 => 'uT6000,ST6000',
291             D4381 => 'uT8000,ST8000',
292             D4382 => 'u9000,S9000',
293             D4384 => 'SP590UZ',
294             D4385 => 'FE3010,X895',
295             D4386 => 'FE3000,X890',
296             D4387 => 'FE35,X30',
297             D4388 => 'u550WP,S550WP',
298             D4390 => 'FE5000,X905',
299             D4391 => 'u5000',
300             D4392 => 'u7000,S7000',
301             D4396 => 'FE5010,X915',
302             D4397 => 'FE25,X20',
303             D4398 => 'FE45,X40',
304             D4401 => 'XZ-1',
305             D4402 => 'uT6010,ST6010',
306             D4406 => 'u7010,S7010 / u7020,S7020',
307             D4407 => 'FE4010,X930',
308             D4408 => 'X560WP',
309             D4409 => 'FE26,X21',
310             D4410 => 'FE4000,X920,X925',
311             D4411 => 'FE46,X41,X42',
312             D4412 => 'FE5020,X935',
313             D4413 => 'uTough-3000',
314             D4414 => 'StylusTough-6020',
315             D4415 => 'StylusTough-8010',
316             D4417 => 'u5010,S5010',
317             D4418 => 'u7040,S7040',
318             D4419 => 'u9010,S9010',
319             D4423 => 'FE4040',
320             D4424 => 'FE47,X43',
321             D4426 => 'FE4030,X950',
322             D4428 => 'FE5030,X965,X960',
323             D4430 => 'u7030,S7030',
324             D4432 => 'SP600UZ',
325             D4434 => 'SP800UZ',
326             D4439 => 'FE4020,X940',
327             D4442 => 'FE5035',
328             D4448 => 'FE4050,X970',
329             D4450 => 'FE5050,X985',
330             D4454 => 'u-7050',
331             D4464 => 'T10,X27',
332             D4470 => 'FE5040,X980',
333             D4472 => 'TG-310',
334             D4474 => 'TG-610',
335             D4476 => 'TG-810',
336             D4478 => 'VG145,VG140,D715',
337             D4479 => 'VG130,D710',
338             D4480 => 'VG120,D705',
339             D4482 => 'VR310,D720',
340             D4484 => 'VR320,D725',
341             D4486 => 'VR330,D730',
342             D4488 => 'VG110,D700',
343             D4490 => 'SP-610UZ',
344             D4492 => 'SZ-10',
345             D4494 => 'SZ-20',
346             D4496 => 'SZ-30MR',
347             D4498 => 'SP-810UZ',
348             D4500 => 'SZ-11',
349             D4504 => 'TG-615',
350             D4508 => 'TG-620',
351             D4510 => 'TG-820',
352             D4512 => 'TG-1',
353             D4516 => 'SH-21',
354             D4519 => 'SZ-14',
355             D4520 => 'SZ-31MR',
356             D4521 => 'SH-25MR',
357             D4523 => 'SP-720UZ',
358             D4529 => 'VG170',
359             D4531 => 'XZ-2',
360             D4535 => 'SP-620UZ',
361             D4536 => 'TG-320',
362             D4537 => 'VR340,D750',
363             D4538 => 'VG160,X990,D745',
364             D4541 => 'SZ-12',
365             D4545 => 'VH410',
366             D4546 => 'XZ-10', #IB
367             D4547 => 'TG-2',
368             D4548 => 'TG-830',
369             D4549 => 'TG-630',
370             D4550 => 'SH-50',
371             D4553 => 'SZ-16,DZ-105',
372             D4562 => 'SP-820UZ',
373             D4566 => 'SZ-15',
374             D4572 => 'STYLUS1',
375             D4574 => 'TG-3',
376             D4575 => 'TG-850',
377             D4579 => 'SP-100EE',
378             D4580 => 'SH-60',
379             D4581 => 'SH-1',
380             D4582 => 'TG-835',
381             D4585 => 'SH-2 / SH-3',
382             D4586 => 'TG-4',
383             D4587 => 'TG-860',
384             D4591 => 'TG-870',
385             D4593 => 'TG-5', #IB
386             D4603 => 'TG-6', #IB
387             D4809 => 'C2500L',
388             D4842 => 'E-10',
389             D4856 => 'C-1',
390             D4857 => 'C-1Z,D-150Z',
391             DCHC => 'D500L',
392             DCHT => 'D600L / D620L',
393             K0055 => 'AIR-A01',
394             S0003 => 'E-330',
395             S0004 => 'E-500',
396             S0009 => 'E-400',
397             S0010 => 'E-510',
398             S0011 => 'E-3',
399             S0013 => 'E-410',
400             S0016 => 'E-420',
401             S0017 => 'E-30',
402             S0018 => 'E-520',
403             S0019 => 'E-P1',
404             S0023 => 'E-620',
405             S0026 => 'E-P2',
406             S0027 => 'E-PL1',
407             S0029 => 'E-450',
408             S0030 => 'E-600',
409             S0032 => 'E-P3',
410             S0033 => 'E-5',
411             S0034 => 'E-PL2',
412             S0036 => 'E-M5',
413             S0038 => 'E-PL3',
414             S0039 => 'E-PM1',
415             S0040 => 'E-PL1s',
416             S0042 => 'E-PL5',
417             S0043 => 'E-PM2',
418             S0044 => 'E-P5',
419             S0045 => 'E-PL6',
420             S0046 => 'E-PL7', #IB
421             S0047 => 'E-M1',
422             S0051 => 'E-M10',
423             S0052 => 'E-M5MarkII', #IB
424             S0059 => 'E-M10MarkII',
425             S0061 => 'PEN-F', #forum7005
426             S0065 => 'E-PL8',
427             S0067 => 'E-M1MarkII',
428             S0068 => 'E-M10MarkIII',
429             S0076 => 'E-PL9', #IB
430             S0080 => 'E-M1X', #IB
431             S0085 => 'E-PL10', #IB
432             S0089 => 'E-M5MarkIII',
433             S0092 => 'E-M1MarkIII', #IB
434             S0093 => 'E-P7', #IB
435             S0095 => 'OM-1', #IB
436             SR45 => 'D220',
437             SR55 => 'D320L',
438             SR83 => 'D340L',
439             SR85 => 'C830L,D340R',
440             SR852 => 'C860L,D360L',
441             SR872 => 'C900Z,D400Z',
442             SR874 => 'C960Z,D460Z',
443             SR951 => 'C2000Z',
444             SR952 => 'C21',
445             SR953 => 'C21T.commu',
446             SR954 => 'C2020Z',
447             SR955 => 'C990Z,D490Z',
448             SR956 => 'C211Z',
449             SR959 => 'C990ZS,D490Z',
450             SR95A => 'C2100UZ',
451             SR971 => 'C100,D370',
452             SR973 => 'C2,D230',
453             SX151 => 'E100RS',
454             SX351 => 'C3000Z / C3030Z',
455             SX354 => 'C3040Z',
456             SX355 => 'C2040Z',
457             SX357 => 'C700UZ',
458             SX358 => 'C200Z,D510Z',
459             SX374 => 'C3100Z,C3020Z',
460             SX552 => 'C4040Z',
461             SX553 => 'C40Z,D40Z',
462             SX556 => 'C730UZ',
463             SX558 => 'C5050Z',
464             SX571 => 'C120,D380',
465             SX574 => 'C300Z,D550Z',
466             SX575 => 'C4100Z,C4000Z',
467             SX751 => 'X200,D560Z,C350Z',
468             SX752 => 'X300,D565Z,C450Z',
469             SX753 => 'C750UZ',
470             SX754 => 'C740UZ',
471             SX755 => 'C755UZ',
472             SX756 => 'C5060WZ',
473             SX757 => 'C8080WZ',
474             SX758 => 'X350,D575Z,C360Z',
475             SX759 => 'X400,D580Z,C460Z',
476             SX75A => 'AZ-2ZOOM',
477             SX75B => 'D595Z,C500Z',
478             SX75C => 'X550,D545Z,C480Z',
479             SX75D => 'IR-300',
480             SX75F => 'C55Z,C5500Z',
481             SX75G => 'C170,D425',
482             SX75J => 'C180,D435',
483             SX771 => 'C760UZ',
484             SX772 => 'C770UZ',
485             SX773 => 'C745UZ',
486             SX774 => 'X250,D560Z,C350Z',
487             SX775 => 'X100,D540Z,C310Z',
488             SX776 => 'C460ZdelSol',
489             SX777 => 'C765UZ',
490             SX77A => 'D555Z,C315Z',
491             SX851 => 'C7070WZ',
492             SX852 => 'C70Z,C7000Z',
493             SX853 => 'SP500UZ',
494             SX854 => 'SP310',
495             SX855 => 'SP350',
496             SX873 => 'SP320',
497             SX875 => 'FE180/X745', # (also D4330)
498             SX876 => 'FE190/X750', # (also D4327)
499             # other brands
500             # 4MP9Q3 => 'Camera 4MP-9Q3'
501             # 4MP9T2 => 'BenQ DC C420 / Camera 4MP-9T2'
502             # 5MP9Q3 => 'Camera 5MP-9Q3',
503             # 5MP9X9 => 'Camera 5MP-9X9',
504             # '5MP-9T'=> 'Camera 5MP-9T3',
505             # '5MP-9Y'=> 'Camera 5MP-9Y2',
506             # '6MP-9U'=> 'Camera 6MP-9U9',
507             # 7MP9Q3 => 'Camera 7MP-9Q3',
508             # '8MP-9U'=> 'Camera 8MP-9U4',
509             # CE5330 => 'Acer CE-5330',
510             # 'CP-853'=> 'Acer CP-8531',
511             # CS5531 => 'Acer CS5531',
512             # DC500 => 'SeaLife DC500',
513             # DC7370 => 'Camera 7MP-9GA',
514             # DC7371 => 'Camera 7MP-9GM',
515             # DC7371 => 'Hitachi HDC-751E',
516             # DC7375 => 'Hitachi HDC-763E / Rollei RCP-7330X / Ricoh Caplio RR770 / Vivitar ViviCam 7330',
517             # 'DC E63'=> 'BenQ DC E63+',
518             # 'DC P86'=> 'BenQ DC P860',
519             # DS5340 => 'Maginon Performic S5 / Premier 5MP-9M7',
520             # DS5341 => 'BenQ E53+ / Supra TCM X50 / Maginon X50 / Premier 5MP-9P8',
521             # DS5346 => 'Premier 5MP-9Q2',
522             # E500 => 'Konica Minolta DiMAGE E500',
523             # MAGINO => 'Maginon X60',
524             # Mz60 => 'HP Photosmart Mz60',
525             # Q3DIGI => 'Camera 5MP-9Q3',
526             # SLIMLI => 'Supra Slimline X6',
527             # V8300s => 'Vivitar V8300s',
528             );
529              
530             # ArtFilter, ArtFilterEffect and MagicFilter values (ref PH)
531             my %filters = (
532             0 => 'Off',
533             1 => 'Soft Focus', # (XZ-1)
534             2 => 'Pop Art', # (SZ-10 magic filter 1,SZ-31MR,E-M5,E-PL3)
535             3 => 'Pale & Light Color',
536             4 => 'Light Tone',
537             5 => 'Pin Hole', # (SZ-10 magic filter 2,SZ-31MR,E-PL3)
538             6 => 'Grainy Film',
539             9 => 'Diorama',
540             10 => 'Cross Process',
541             12 => 'Fish Eye', # (SZ-10 magic filter 3)
542             13 => 'Drawing', # (SZ-10 magic filter 4)
543             14 => 'Gentle Sepia', # (E-5)
544             15 => 'Pale & Light Color II', #forum6269 ('Tender Light' ref 11)
545             16 => 'Pop Art II', #11 (E-PL3 "(dark)" - PH)
546             17 => 'Pin Hole II', #11 (E-PL3 "(color 2)" - PH)
547             18 => 'Pin Hole III', #11 (E-M5, E-PL3 "(color 3)" - PH)
548             19 => 'Grainy Film II', #11
549             20 => 'Dramatic Tone', # (XZ-1,SZ-31MR)
550             21 => 'Punk', # (SZ-10 magic filter 6)
551             22 => 'Soft Focus 2', # (SZ-10 magic filter 5)
552             23 => 'Sparkle', # (SZ-10 magic filter 7)
553             24 => 'Watercolor', # (SZ-10 magic filter 8)
554             25 => 'Key Line', # (E-M5)
555             26 => 'Key Line II', #forum6269
556             27 => 'Miniature', # (SZ-31MR)
557             28 => 'Reflection', # (TG-820,SZ-31MR)
558             29 => 'Fragmented', # (TG-820,SZ-31MR)
559             31 => 'Cross Process II', #forum6269
560             32 => 'Dramatic Tone II', #forum6269 (Dramatic Tone B&W for E-M5)
561             33 => 'Watercolor I', # ('Watercolor I' for EM-1 ref forum6269, 'Watercolor II' for E-PM2 ref PH)
562             34 => 'Watercolor II', #forum6269
563             35 => 'Diorama II', #forum6269
564             36 => 'Vintage', #forum6269
565             37 => 'Vintage II', #forum6269
566             38 => 'Vintage III', #forum6269
567             39 => 'Partial Color', #forum6269
568             40 => 'Partial Color II', #forum6269
569             41 => 'Partial Color III', #forum6269
570             );
571              
572             my %toneLevelType = (
573             0 => '0',
574             -31999 => 'Highlights',
575             -31998 => 'Shadows',
576             -31997 => 'Midtones',
577             );
578              
579             # tag information for WAV "Index" tags
580             my %indexInfo = (
581             Format => 'int32u',
582             RawConv => '$val == 0xffffffff ? undef : $val',
583             ValueConv => '$val / 1000',
584             PrintConv => 'ConvertDuration($val)',
585             );
586              
587             # Olympus tags
588             %Image::ExifTool::Olympus::Main = (
589             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
590             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
591             WRITABLE => 1,
592             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
593             #
594             # Tags 0x0000 through 0x0103 are the same as Konica/Minolta cameras (ref 3)
595             # (removed 0x0101-0x0103 because they weren't supported by my samples - PH)
596             #
597             0x0000 => {
598             Name => 'MakerNoteVersion',
599             Writable => 'undef',
600             },
601             0x0001 => {
602             Name => 'MinoltaCameraSettingsOld',
603             SubDirectory => {
604             TagTable => 'Image::ExifTool::Minolta::CameraSettings',
605             ByteOrder => 'BigEndian',
606             },
607             },
608             0x0003 => {
609             Name => 'MinoltaCameraSettings',
610             SubDirectory => {
611             TagTable => 'Image::ExifTool::Minolta::CameraSettings',
612             ByteOrder => 'BigEndian',
613             },
614             },
615             0x0040 => {
616             Name => 'CompressedImageSize',
617             Writable => 'int32u',
618             },
619             0x0081 => {
620             Name => 'PreviewImageData',
621             Binary => 1,
622             Writable => 0,
623             },
624             0x0088 => {
625             Name => 'PreviewImageStart',
626             Flags => 'IsOffset',
627             OffsetPair => 0x0089, # point to associated byte count
628             DataTag => 'PreviewImage',
629             Writable => 0,
630             Protected => 2,
631             },
632             0x0089 => {
633             Name => 'PreviewImageLength',
634             OffsetPair => 0x0088, # point to associated offset
635             DataTag => 'PreviewImage',
636             Writable => 0,
637             Protected => 2,
638             },
639             0x0100 => {
640             Name => 'ThumbnailImage',
641             Groups => { 2 => 'Preview' },
642             Writable => 'undef',
643             WriteCheck => '$self->CheckImage(\$val)',
644             Binary => 1,
645             },
646             0x0104 => { Name => 'BodyFirmwareVersion', Writable => 'string' }, #11
647             #
648             # end Konica/Minolta tags
649             #
650             0x0200 => {
651             Name => 'SpecialMode',
652             Notes => q{
653             3 numbers: 1. Shooting mode: 0=Normal, 2=Fast, 3=Panorama;
654             2. Sequence Number; 3. Panorama Direction: 1=Left-right,
655             2=Right-left, 3=Bottom-Top, 4=Top-Bottom
656             },
657             Writable => 'int32u',
658             Count => 3,
659             PrintConv => sub { #3
660             my $val = shift;
661             my @v = split ' ', $val;
662             return $val unless @v >= 3;
663             my @v0 = ('Normal','Unknown (1)','Fast','Panorama');
664             my @v2 = ('(none)','Left to Right','Right to Left','Bottom to Top','Top to Bottom');
665             $val = $v0[$v[0]] || "Unknown ($v[0])";
666             $val .= ", Sequence: $v[1]";
667             $val .= ', Panorama: ' . ($v2[$v[2]] || "Unknown ($v[2])");
668             return $val;
669             },
670             },
671             0x0201 => {
672             Name => 'Quality',
673             Writable => 'int16u',
674             Notes => q{
675             Quality values are decoded based on the CameraType tag. All types
676             represent SQ, HQ and SHQ as sequential integers, but in general
677             SX-type cameras start with a value of 0 for SQ while others start
678             with 1
679             },
680             # These values are different for different camera types
681             # (can't have Condition based on CameraType because it isn't known
682             # when this tag is extracted)
683             PrintConv => sub {
684             my ($val, $self) = @_;
685             my %t1 = ( # all SX camera types except SX151
686             0 => 'SQ (Low)',
687             1 => 'HQ (Normal)',
688             2 => 'SHQ (Fine)',
689             6 => 'RAW', #PH - C5050WZ
690             );
691             my %t2 = ( # all other types (except D4322, ref 22)
692             1 => 'SQ (Low)',
693             2 => 'HQ (Normal)',
694             3 => 'SHQ (Fine)',
695             4 => 'RAW',
696             5 => 'Medium-Fine', #PH
697             6 => 'Small-Fine', #PH
698             33 => 'Uncompressed', #PH - C2100Z
699             );
700             my $conv = $self->{CameraType} =~ /^(SX(?!151\b)|D4322)/ ? \%t1 : \%t2;
701             return $$conv{$val} ? $$conv{$val} : "Unknown ($val)";
702             },
703             # (no PrintConvInv because we don't know CameraType at write time)
704             },
705             0x0202 => {
706             Name => 'Macro',
707             Writable => 'int16u',
708             PrintConv => {
709             0 => 'Off',
710             1 => 'On',
711             2 => 'Super Macro', #6
712             },
713             },
714             0x0203 => { #6
715             Name => 'BWMode',
716             Description => 'Black And White Mode',
717             Writable => 'int16u',
718             PrintConv => {
719             0 => 'Off',
720             1 => 'On',
721             6 => '(none)', #22
722             },
723             },
724             0x0204 => {
725             Name => 'DigitalZoom',
726             Writable => 'rational64u',
727             PrintConv => '$val=~/\./ or $val.=".0"; $val',
728             PrintConvInv => '$val',
729             },
730             0x0205 => { #6
731             Name => 'FocalPlaneDiagonal',
732             Writable => 'rational64u',
733             PrintConv => '"$val mm"',
734             PrintConvInv => '$val=~s/\s*mm$//;$val',
735             },
736             0x0206 => { Name => 'LensDistortionParams', Writable => 'int16s', Count => 6 }, #6
737             0x0207 => { #PH (was incorrectly FirmwareVersion, ref 1/3)
738             Name => 'CameraType',
739             Condition => '$$valPt ne "NORMAL"', # FE240, SP510, u730 and u1000 write this
740             Writable => 'string',
741             DataMember => 'CameraType',
742             RawConv => '$self->{CameraType} = $val',
743             SeparateTable => 'CameraType',
744             ValueConv => '$val =~ s/\s+$//; $val', # ("SX151 " has trailing space)
745             ValueConvInv => '$val',
746             PrintConv => \%olympusCameraTypes,
747             Priority => 0,
748             # 'NORMAL' for some models: u730,SP510UZ,u1000,FE240
749             },
750             0x0208 => {
751             Name => 'TextInfo',
752             SubDirectory => {
753             TagTable => 'Image::ExifTool::Olympus::TextInfo',
754             },
755             },
756             0x0209 => {
757             Name => 'CameraID',
758             Format => 'string', # this really should have been a string
759             },
760             0x020b => { Name => 'EpsonImageWidth', Writable => 'int32u' }, #PH
761             0x020c => { Name => 'EpsonImageHeight', Writable => 'int32u' }, #PH
762             0x020d => { Name => 'EpsonSoftware', Writable => 'string' }, #PH
763             0x0280 => { #PH
764             %Image::ExifTool::previewImageTagInfo,
765             Groups => { 2 => 'Preview' },
766             Notes => 'found in ERF and JPG images from some Epson models',
767             Format => 'undef',
768             Writable => 'int8u',
769             },
770             0x0300 => { Name => 'PreCaptureFrames', Writable => 'int16u' }, #6
771             0x0301 => { Name => 'WhiteBoard', Writable => 'int16u' }, #11
772             0x0302 => { #6
773             Name => 'OneTouchWB',
774             Writable => 'int16u',
775             PrintConv => {
776             0 => 'Off',
777             1 => 'On',
778             2 => 'On (Preset)',
779             },
780             },
781             0x0303 => { Name => 'WhiteBalanceBracket', Writable => 'int16u' }, #11
782             0x0304 => { Name => 'WhiteBalanceBias', Writable => 'int16u' }, #11
783             # 0x0305 => 'PrintMatching', ? #11
784             0x0400 => { #IB
785             Name => 'SensorArea',
786             Condition => '$$self{TIFF_TYPE} eq "ERF"',
787             Writable => 'undef',
788             Format => 'int16u',
789             Count => 4,
790             Notes => 'found in Epson ERF images',
791             },
792             0x0401 => { #IB
793             Name => 'BlackLevel',
794             Condition => '$$self{TIFF_TYPE} eq "ERF"',
795             Writable => 'int32u',
796             Count => 4,
797             Notes => 'found in Epson ERF images',
798             },
799             # 0x0402 - BitCodedAutoFocus (ref 11)
800             0x0403 => { #11
801             Name => 'SceneMode',
802             Writable => 'int16u',
803             PrintConvColumns => 2,
804             PrintConv => {
805             0 => 'Normal',
806             1 => 'Standard',
807             2 => 'Auto',
808             3 => 'Intelligent Auto', #PH (guess, u7040)
809             4 => 'Portrait',
810             5 => 'Landscape+Portrait',
811             6 => 'Landscape',
812             7 => 'Night Scene',
813             8 => 'Night+Portrait',
814             9 => 'Sport',
815             10 => 'Self Portrait',
816             11 => 'Indoor',
817             12 => 'Beach & Snow',
818             13 => 'Beach',
819             14 => 'Snow',
820             15 => 'Self Portrait+Self Timer',
821             16 => 'Sunset',
822             17 => 'Cuisine',
823             18 => 'Documents',
824             19 => 'Candle',
825             20 => 'Fireworks',
826             21 => 'Available Light',
827             22 => 'Vivid',
828             23 => 'Underwater Wide1',
829             24 => 'Underwater Macro',
830             25 => 'Museum',
831             26 => 'Behind Glass',
832             27 => 'Auction',
833             28 => 'Shoot & Select1',
834             29 => 'Shoot & Select2',
835             30 => 'Underwater Wide2',
836             31 => 'Digital Image Stabilization',
837             32 => 'Face Portrait',
838             33 => 'Pet',
839             34 => 'Smile Shot',
840             35 => 'Quick Shutter',
841             43 => 'Hand-held Starlight', #PH (SH-21)
842             100 => 'Panorama', #PH (SH-21)
843             101 => 'Magic Filter', #PH
844             103 => 'HDR', #PH (XZ-2)
845             },
846             },
847             0x0404 => { Name => 'SerialNumber', Writable => 'string' }, #PH (D595Z, C7070WZ)
848             0x0405 => { Name => 'Firmware', Writable => 'string' }, #11
849             0x0e00 => { # (AFFieldCoord for models XZ-2 and XZ-10, ref 11)
850             Name => 'PrintIM',
851             Description => 'Print Image Matching',
852             Writable => 0,
853             SubDirectory => {
854             TagTable => 'Image::ExifTool::PrintIM::Main',
855             },
856             },
857             # 0x0e80 - undef[256] - offset 0x30: uint16[2] WB_RGBLevels = val[0]*561,65536,val[1]*431 (ref IB)
858             0x0f00 => {
859             Name => 'DataDump',
860             Writable => 0,
861             Binary => 1,
862             },
863             0x0f01 => { #6
864             Name => 'DataDump2',
865             Writable => 0,
866             Binary => 1,
867             },
868             0x0f04 => {
869             Name => 'ZoomedPreviewStart',
870             # NOTE: this tag is currently not updated properly when the image is rewritten!
871             OffsetPair => 0xf05,
872             DataTag => 'ZoomedPreviewImage',
873             Writable => 'int32u',
874             Protected => 2,
875             },
876             0x0f05 => {
877             Name => 'ZoomedPreviewLength',
878             OffsetPair => 0xf04,
879             DataTag => 'ZoomedPreviewImage',
880             Writable => 'int32u',
881             Protected => 2,
882             },
883             0x0f06 => {
884             Name => 'ZoomedPreviewSize',
885             Writable => 'int16u',
886             Count => 2,
887             },
888             0x1000 => { #6
889             Name => 'ShutterSpeedValue',
890             Writable => 'rational64s',
891             Priority => 0,
892             ValueConv => 'abs($val)<100 ? 2**(-$val) : 0',
893             ValueConvInv => '$val>0 ? -log($val)/log(2) : -100',
894             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
895             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
896             },
897             0x1001 => { #6
898             Name => 'ISOValue',
899             Writable => 'rational64s',
900             Priority => 0,
901             ValueConv => '100 * 2 ** ($val - 5)',
902             ValueConvInv => '$val>0 ? log($val/100)/log(2)+5 : 0',
903             PrintConv => 'int($val * 100 + 0.5) / 100',
904             PrintConvInv => '$val',
905             },
906             0x1002 => { #6
907             Name => 'ApertureValue',
908             Writable => 'rational64s',
909             Priority => 0,
910             ValueConv => '2 ** ($val / 2)',
911             ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
912             PrintConv => 'sprintf("%.1f",$val)',
913             PrintConvInv => '$val',
914             },
915             0x1003 => { #6
916             Name => 'BrightnessValue',
917             Writable => 'rational64s',
918             Priority => 0,
919             },
920             0x1004 => { #3
921             Name => 'FlashMode',
922             Writable => 'int16u',
923             PrintConv => {
924             2 => 'On', #PH
925             3 => 'Off', #PH
926             },
927             },
928             0x1005 => { #6
929             Name => 'FlashDevice',
930             Writable => 'int16u',
931             PrintConv => {
932             0 => 'None',
933             1 => 'Internal',
934             4 => 'External',
935             5 => 'Internal + External',
936             },
937             },
938             0x1006 => { #6
939             Name =>'ExposureCompensation',
940             Writable => 'rational64s',
941             },
942             0x1007 => { Name => 'SensorTemperature',Writable => 'int16s' }, #6 (E-10, E-20 and C2500L - numbers usually around 30-40)
943             0x1008 => { Name => 'LensTemperature', Writable => 'int16s' }, #6
944             0x1009 => { Name => 'LightCondition', Writable => 'int16u' }, #11
945             0x100a => { #11
946             Name => 'FocusRange',
947             Writable => 'int16u',
948             PrintConv => {
949             0 => 'Normal',
950             1 => 'Macro',
951             },
952             },
953             0x100b => { #6
954             Name => 'FocusMode',
955             Writable => 'int16u',
956             PrintConv => {
957             0 => 'Auto',
958             1 => 'Manual',
959             },
960             },
961             0x100c => { #6
962             Name => 'ManualFocusDistance',
963             Writable => 'rational64u',
964             PrintConv => '"$val mm"', #11
965             PrintConvInv => '$val=~s/\s*mm$//; $val',
966             },
967             0x100d => { Name => 'ZoomStepCount', Writable => 'int16u' }, #6
968             0x100e => { Name => 'FocusStepCount', Writable => 'int16u' }, #6
969             0x100f => { #6
970             Name => 'Sharpness',
971             Writable => 'int16u',
972             Priority => 0,
973             PrintConv => {
974             0 => 'Normal',
975             1 => 'Hard',
976             2 => 'Soft',
977             },
978             },
979             0x1010 => { Name => 'FlashChargeLevel', Writable => 'int16u' }, #6
980             0x1011 => { #3
981             Name => 'ColorMatrix',
982             Writable => 'int16u',
983             Format => 'int16s',
984             Count => 9,
985             },
986             0x1012 => { Name => 'BlackLevel', Writable => 'int16u', Count => 4 }, #3
987             0x1013 => { #11
988             Name => 'ColorTemperatureBG',
989             Writable => 'int16u',
990             Unknown => 1, # (doesn't look like a temperature)
991             },
992             0x1014 => { #11
993             Name => 'ColorTemperatureRG',
994             Writable => 'int16u',
995             Unknown => 1, # (doesn't look like a temperature)
996             },
997             0x1015 => { #6
998             Name => 'WBMode',
999             Writable => 'int16u',
1000             Count => 2,
1001             PrintConvColumns => 2,
1002             PrintConv => {
1003             '1' => 'Auto',
1004             '1 0' => 'Auto',
1005             '1 2' => 'Auto (2)',
1006             '1 4' => 'Auto (4)',
1007             '2 2' => '3000 Kelvin',
1008             '2 3' => '3700 Kelvin',
1009             '2 4' => '4000 Kelvin',
1010             '2 5' => '4500 Kelvin',
1011             '2 6' => '5500 Kelvin',
1012             '2 7' => '6500 Kelvin',
1013             '2 8' => '7500 Kelvin',
1014             '3 0' => 'One-touch',
1015             },
1016             },
1017             0x1017 => { #2
1018             Name => 'RedBalance',
1019             Writable => 'int16u',
1020             Count => 2,
1021             ValueConv => '$val=~s/ .*//; $val / 256',
1022             ValueConvInv => '$val*=256;"$val 64"',
1023             },
1024             0x1018 => { #2
1025             Name => 'BlueBalance',
1026             Writable => 'int16u',
1027             Count => 2,
1028             ValueConv => '$val=~s/ .*//; $val / 256',
1029             ValueConvInv => '$val*=256;"$val 64"',
1030             },
1031             0x1019 => { Name => 'ColorMatrixNumber', Writable => 'int16u' }, #11
1032             # 0x101a is same as CameraID ("OLYMPUS DIGITAL CAMERA") for C2500L - PH
1033             0x101a => { Name => 'SerialNumber', Writable => 'string' }, #3
1034             0x101b => { #11
1035             Name => 'ExternalFlashAE1_0',
1036             Writable => 'int32u',
1037             Unknown => 1, # (what are these?)
1038             },
1039             0x101c => { Name => 'ExternalFlashAE2_0', Writable => 'int32u', Unknown => 1 }, #11
1040             0x101d => { Name => 'InternalFlashAE1_0', Writable => 'int32u', Unknown => 1 }, #11
1041             0x101e => { Name => 'InternalFlashAE2_0', Writable => 'int32u', Unknown => 1 }, #11
1042             0x101f => { Name => 'ExternalFlashAE1', Writable => 'int32u', Unknown => 1 }, #11
1043             0x1020 => { Name => 'ExternalFlashAE2', Writable => 'int32u', Unknown => 1 }, #11
1044             0x1021 => { Name => 'InternalFlashAE1', Writable => 'int32u', Unknown => 1 }, #11
1045             0x1022 => { Name => 'InternalFlashAE2', Writable => 'int32u', Unknown => 1 }, #11
1046             0x1023 => { Name => 'FlashExposureComp', Writable => 'rational64s' }, #6
1047             0x1024 => { Name => 'InternalFlashTable', Writable => 'int16u' }, #11
1048             0x1025 => { Name => 'ExternalFlashGValue', Writable => 'rational64s' }, #11
1049             0x1026 => { #6
1050             Name => 'ExternalFlashBounce',
1051             Writable => 'int16u',
1052             PrintConv => {
1053             0 => 'No',
1054             1 => 'Yes',
1055             },
1056             },
1057             0x1027 => { Name => 'ExternalFlashZoom', Writable => 'int16u' }, #6
1058             0x1028 => { Name => 'ExternalFlashMode', Writable => 'int16u' }, #6
1059             0x1029 => { #3
1060             Name => 'Contrast',
1061             Writable => 'int16u',
1062             PrintConv => { #PH (works with E1)
1063             0 => 'High',
1064             1 => 'Normal',
1065             2 => 'Low',
1066             },
1067             },
1068             0x102a => { Name => 'SharpnessFactor', Writable => 'int16u' }, #3
1069             0x102b => { Name => 'ColorControl', Writable => 'int16u', Count => 6 }, #3
1070             0x102c => { Name => 'ValidBits', Writable => 'int16u', Count => 2 }, #3
1071             0x102d => { Name => 'CoringFilter', Writable => 'int16u' }, #3
1072             0x102e => { Name => 'OlympusImageWidth', Writable => 'int32u' }, #PH
1073             0x102f => { Name => 'OlympusImageHeight', Writable => 'int32u' }, #PH
1074             0x1030 => { Name => 'SceneDetect', Writable => 'int16u' }, #11
1075             0x1031 => { #11
1076             Name => 'SceneArea',
1077             Writable => 'int32u',
1078             Count => 8,
1079             Unknown => 1, # (numbers don't make much sense?)
1080             },
1081             # 0x1032 HAFFINAL? #11
1082             0x1033 => { #11
1083             Name => 'SceneDetectData',
1084             Writable => 'int32u',
1085             Count => 720,
1086             Binary => 1,
1087             Unknown => 1, # (but what does it mean?)
1088             },
1089             0x1034 => { Name => 'CompressionRatio', Writable => 'rational64u' }, #3
1090             0x1035 => { #6
1091             Name => 'PreviewImageValid',
1092             Writable => 'int32u',
1093             DelValue => 0,
1094             PrintConv => { 0 => 'No', 1 => 'Yes' },
1095             },
1096             0x1036 => { #6
1097             Name => 'PreviewImageStart',
1098             Flags => 'IsOffset',
1099             OffsetPair => 0x1037, # point to associated byte count
1100             DataTag => 'PreviewImage',
1101             Writable => 'int32u',
1102             WriteGroup => 'MakerNotes',
1103             Protected => 2,
1104             },
1105             0x1037 => { #6
1106             # (may contain data from multiple previews - PH, FE320)
1107             Name => 'PreviewImageLength',
1108             OffsetPair => 0x1036, # point to associated offset
1109             DataTag => 'PreviewImage',
1110             Writable => 'int32u',
1111             WriteGroup => 'MakerNotes',
1112             Protected => 2,
1113             },
1114             0x1038 => { Name => 'AFResult', Writable => 'int16u' }, #11
1115             0x1039 => { #6
1116             Name => 'CCDScanMode',
1117             Writable => 'int16u',
1118             PrintConv => {
1119             0 => 'Interlaced',
1120             1 => 'Progressive',
1121             },
1122             },
1123             0x103a => { #6
1124             Name => 'NoiseReduction',
1125             Writable => 'int16u',
1126             PrintConv => \%offOn,
1127             },
1128             0x103b => { Name => 'FocusStepInfinity', Writable => 'int16u' }, #6
1129             0x103c => { Name => 'FocusStepNear', Writable => 'int16u' }, #6
1130             0x103d => { Name => 'LightValueCenter', Writable => 'rational64s' }, #11
1131             0x103e => { Name => 'LightValuePeriphery', Writable => 'rational64s' }, #11
1132             0x103f => { #11
1133             Name => 'FieldCount',
1134             Writable => 'int16u',
1135             Unknown => 1, # (but what does it mean?)
1136             },
1137             #
1138             # Olympus really screwed up the format of the following subdirectories (for the
1139             # E-1 and E-300 anyway). Not only is the subdirectory value data not included in
1140             # the size, but also the count is 2 bytes short for the subdirectory itself
1141             # (presumably the Olympus programmers forgot about the 2-byte entry count at the
1142             # start of the subdirectory). This mess is straightened out and these subdirs
1143             # are written properly when ExifTool rewrites the file. Note that this problem
1144             # has been fixed by Olympus in the new-style IFD maker notes since a standard
1145             # SubIFD offset value is used. As written by the camera, the old style
1146             # directories have format 'undef' or 'string', and the new style has format
1147             # 'ifd'. However, some older versions of exiftool may have rewritten the new
1148             # style as 'int32u', so handle both cases. - PH
1149             #
1150             0x2010 => [ #PH
1151             {
1152             Name => 'Equipment',
1153             Condition => '$format ne "ifd" and $format ne "int32u"',
1154             NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced)
1155             SubDirectory => {
1156             TagTable => 'Image::ExifTool::Olympus::Equipment',
1157             ByteOrder => 'Unknown',
1158             },
1159             },
1160             {
1161             Name => 'EquipmentIFD',
1162             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
1163             Flags => 'SubIFD',
1164             FixFormat => 'ifd',
1165             SubDirectory => {
1166             TagTable => 'Image::ExifTool::Olympus::Equipment',
1167             Start => '$val',
1168             },
1169             },
1170             ],
1171             0x2020 => [ #PH
1172             {
1173             Name => 'CameraSettings',
1174             Condition => '$format ne "ifd" and $format ne "int32u"',
1175             NestedHtmlDump => 2,
1176             SubDirectory => {
1177             TagTable => 'Image::ExifTool::Olympus::CameraSettings',
1178             ByteOrder => 'Unknown',
1179             },
1180             },
1181             {
1182             Name => 'CameraSettingsIFD',
1183             Groups => { 1 => 'MakerNotes' },
1184             Flags => 'SubIFD',
1185             FixFormat => 'ifd',
1186             SubDirectory => {
1187             TagTable => 'Image::ExifTool::Olympus::CameraSettings',
1188             Start => '$val',
1189             },
1190             },
1191             ],
1192             0x2030 => [ #PH
1193             {
1194             Name => 'RawDevelopment',
1195             Condition => '$format ne "ifd" and $format ne "int32u"',
1196             NestedHtmlDump => 2,
1197             SubDirectory => {
1198             TagTable => 'Image::ExifTool::Olympus::RawDevelopment',
1199             ByteOrder => 'Unknown',
1200             },
1201             },
1202             {
1203             Name => 'RawDevelopmentIFD',
1204             Groups => { 1 => 'MakerNotes' },
1205             Flags => 'SubIFD',
1206             FixFormat => 'ifd',
1207             SubDirectory => {
1208             TagTable => 'Image::ExifTool::Olympus::RawDevelopment',
1209             Start => '$val',
1210             },
1211             },
1212             ],
1213             0x2031 => [ #11
1214             {
1215             Name => 'RawDev2',
1216             Condition => '$format ne "ifd" and $format ne "int32u"',
1217             NestedHtmlDump => 2,
1218             SubDirectory => {
1219             TagTable => 'Image::ExifTool::Olympus::RawDevelopment2',
1220             ByteOrder => 'Unknown',
1221             },
1222             },
1223             {
1224             Name => 'RawDev2IFD',
1225             Groups => { 1 => 'MakerNotes' },
1226             Flags => 'SubIFD',
1227             FixFormat => 'ifd',
1228             SubDirectory => {
1229             TagTable => 'Image::ExifTool::Olympus::RawDevelopment2',
1230             Start => '$val',
1231             },
1232             },
1233             ],
1234             0x2040 => [ #PH
1235             {
1236             Name => 'ImageProcessing',
1237             Condition => '$format ne "ifd" and $format ne "int32u"',
1238             NestedHtmlDump => 2,
1239             SubDirectory => {
1240             TagTable => 'Image::ExifTool::Olympus::ImageProcessing',
1241             ByteOrder => 'Unknown',
1242             },
1243             },
1244             {
1245             Name => 'ImageProcessingIFD',
1246             Groups => { 1 => 'MakerNotes' },
1247             Flags => 'SubIFD',
1248             FixFormat => 'ifd',
1249             SubDirectory => {
1250             TagTable => 'Image::ExifTool::Olympus::ImageProcessing',
1251             Start => '$val',
1252             },
1253             },
1254             ],
1255             0x2050 => [ #PH
1256             {
1257             Name => 'FocusInfo',
1258             Condition => '$format ne "ifd" and $format ne "int32u" and not $$self{OlympusCAMER}',
1259             NestedHtmlDump => 2,
1260             SubDirectory => {
1261             TagTable => 'Image::ExifTool::Olympus::FocusInfo',
1262             ByteOrder => 'Unknown',
1263             },
1264             },
1265             {
1266             Name => 'FocusInfoIFD',
1267             Condition => 'not $$self{OlympusCAMER}',
1268             Groups => { 1 => 'MakerNotes' },
1269             Flags => 'SubIFD',
1270             FixFormat => 'ifd',
1271             SubDirectory => {
1272             TagTable => 'Image::ExifTool::Olympus::FocusInfo',
1273             Start => '$val',
1274             },
1275             },
1276             {
1277             # ASCII-based camera parameters if makernotes starts with "CAMER\0"
1278             # (or for Sony models starting with "SONY PI\0" or "PREMI\0")
1279             Name => 'CameraParameters',
1280             Writable => 'undef',
1281             Binary => 1,
1282             },
1283             ],
1284             0x2100 => [
1285             { #11
1286             Name => 'Olympus2100',
1287             Condition => '$format ne "ifd" and $format ne "int32u"',
1288             NestedHtmlDump => 2,
1289             SubDirectory => {
1290             TagTable => 'Image::ExifTool::Olympus::FETags',
1291             ByteOrder => 'Unknown',
1292             },
1293             },
1294             { #PH
1295             Name => 'Olympus2100IFD',
1296             Groups => { 1 => 'MakerNotes' },
1297             Flags => 'SubIFD',
1298             FixFormat => 'ifd',
1299             SubDirectory => {
1300             TagTable => 'Image::ExifTool::Olympus::FETags',
1301             ByteOrder => 'Unknown',
1302             Start => '$val',
1303             },
1304             },
1305             ],
1306             0x2200 => [
1307             { #11
1308             Name => 'Olympus2200',
1309             Condition => '$format ne "ifd" and $format ne "int32u"',
1310             NestedHtmlDump => 2,
1311             SubDirectory => {
1312             TagTable => 'Image::ExifTool::Olympus::FETags',
1313             ByteOrder => 'Unknown',
1314             },
1315             },
1316             { #PH
1317             Name => 'Olympus2200IFD',
1318             Groups => { 1 => 'MakerNotes' },
1319             Flags => 'SubIFD',
1320             FixFormat => 'ifd',
1321             SubDirectory => {
1322             TagTable => 'Image::ExifTool::Olympus::FETags',
1323             ByteOrder => 'Unknown',
1324             Start => '$val',
1325             },
1326             },
1327             ],
1328             0x2300 => [
1329             { #11
1330             Name => 'Olympus2300',
1331             Condition => '$format ne "ifd" and $format ne "int32u"',
1332             NestedHtmlDump => 2,
1333             SubDirectory => {
1334             TagTable => 'Image::ExifTool::Olympus::FETags',
1335             ByteOrder => 'Unknown',
1336             },
1337             },
1338             { #PH
1339             Name => 'Olympus2300IFD',
1340             Groups => { 1 => 'MakerNotes' },
1341             Flags => 'SubIFD',
1342             FixFormat => 'ifd',
1343             SubDirectory => {
1344             TagTable => 'Image::ExifTool::Olympus::FETags',
1345             ByteOrder => 'Unknown',
1346             Start => '$val',
1347             },
1348             },
1349             ],
1350             0x2400 => [
1351             { #11
1352             Name => 'Olympus2400',
1353             Condition => '$format ne "ifd" and $format ne "int32u"',
1354             NestedHtmlDump => 2,
1355             SubDirectory => {
1356             TagTable => 'Image::ExifTool::Olympus::FETags',
1357             ByteOrder => 'Unknown',
1358             },
1359             },
1360             { #PH
1361             Name => 'Olympus2400IFD',
1362             Groups => { 1 => 'MakerNotes' },
1363             Flags => 'SubIFD',
1364             FixFormat => 'ifd',
1365             SubDirectory => {
1366             TagTable => 'Image::ExifTool::Olympus::FETags',
1367             ByteOrder => 'Unknown',
1368             Start => '$val',
1369             },
1370             },
1371             ],
1372             0x2500 => [
1373             { #11
1374             Name => 'Olympus2500',
1375             Condition => '$format ne "ifd" and $format ne "int32u"',
1376             NestedHtmlDump => 2,
1377             SubDirectory => {
1378             TagTable => 'Image::ExifTool::Olympus::FETags',
1379             ByteOrder => 'Unknown',
1380             },
1381             },
1382             { #PH
1383             Name => 'Olympus2500IFD',
1384             Groups => { 1 => 'MakerNotes' },
1385             Flags => 'SubIFD',
1386             FixFormat => 'ifd',
1387             SubDirectory => {
1388             TagTable => 'Image::ExifTool::Olympus::FETags',
1389             ByteOrder => 'Unknown',
1390             Start => '$val',
1391             },
1392             },
1393             ],
1394             0x2600 => [
1395             { #11
1396             Name => 'Olympus2600',
1397             Condition => '$format ne "ifd" and $format ne "int32u"',
1398             NestedHtmlDump => 2,
1399             SubDirectory => {
1400             TagTable => 'Image::ExifTool::Olympus::FETags',
1401             ByteOrder => 'Unknown',
1402             },
1403             },
1404             { #PH
1405             Name => 'Olympus2600IFD',
1406             Groups => { 1 => 'MakerNotes' },
1407             Flags => 'SubIFD',
1408             FixFormat => 'ifd',
1409             SubDirectory => {
1410             TagTable => 'Image::ExifTool::Olympus::FETags',
1411             ByteOrder => 'Unknown',
1412             Start => '$val',
1413             },
1414             },
1415             ],
1416             0x2700 => [
1417             { #11
1418             Name => 'Olympus2700',
1419             Condition => '$format ne "ifd" and $format ne "int32u"',
1420             NestedHtmlDump => 2,
1421             SubDirectory => {
1422             TagTable => 'Image::ExifTool::Olympus::FETags',
1423             ByteOrder => 'Unknown',
1424             },
1425             },
1426             { #PH
1427             Name => 'Olympus2700IFD',
1428             Groups => { 1 => 'MakerNotes' },
1429             Flags => 'SubIFD',
1430             FixFormat => 'ifd',
1431             SubDirectory => {
1432             TagTable => 'Image::ExifTool::Olympus::FETags',
1433             ByteOrder => 'Unknown',
1434             Start => '$val',
1435             },
1436             },
1437             ],
1438             0x2800 => [
1439             { #11
1440             Name => 'Olympus2800',
1441             Condition => '$format ne "ifd" and $format ne "int32u"',
1442             NestedHtmlDump => 2,
1443             SubDirectory => {
1444             TagTable => 'Image::ExifTool::Olympus::FETags',
1445             ByteOrder => 'Unknown',
1446             },
1447             },
1448             { #PH
1449             Name => 'Olympus2800IFD',
1450             Groups => { 1 => 'MakerNotes' },
1451             Flags => 'SubIFD',
1452             FixFormat => 'ifd',
1453             SubDirectory => {
1454             TagTable => 'Image::ExifTool::Olympus::FETags',
1455             ByteOrder => 'Unknown',
1456             Start => '$val',
1457             },
1458             },
1459             ],
1460             0x2900 => [
1461             { #11
1462             Name => 'Olympus2900',
1463             Condition => '$format ne "ifd" and $format ne "int32u"',
1464             NestedHtmlDump => 2,
1465             SubDirectory => {
1466             TagTable => 'Image::ExifTool::Olympus::FETags',
1467             ByteOrder => 'Unknown',
1468             },
1469             },
1470             { #PH
1471             Name => 'Olympus2900IFD',
1472             Groups => { 1 => 'MakerNotes' },
1473             Flags => 'SubIFD',
1474             FixFormat => 'ifd',
1475             SubDirectory => {
1476             TagTable => 'Image::ExifTool::Olympus::FETags',
1477             ByteOrder => 'Unknown',
1478             Start => '$val',
1479             },
1480             },
1481             ],
1482             0x3000 => [
1483             { #6
1484             Name => 'RawInfo',
1485             Condition => '$format ne "ifd" and $format ne "int32u"',
1486             NestedHtmlDump => 2,
1487             SubDirectory => {
1488             TagTable => 'Image::ExifTool::Olympus::RawInfo',
1489             ByteOrder => 'Unknown',
1490             },
1491             },
1492             { #PH
1493             Name => 'RawInfoIFD',
1494             Groups => { 1 => 'MakerNotes' },
1495             Flags => 'SubIFD',
1496             FixFormat => 'ifd',
1497             SubDirectory => {
1498             TagTable => 'Image::ExifTool::Olympus::RawInfo',
1499             Start => '$val',
1500             },
1501             },
1502             ],
1503             0x4000 => [ #PH
1504             {
1505             Name => 'MainInfo',
1506             Condition => '$format ne "ifd" and $format ne "int32u"',
1507             NestedHtmlDump => 2,
1508             SubDirectory => {
1509             TagTable => 'Image::ExifTool::Olympus::Main',
1510             ByteOrder => 'Unknown',
1511             },
1512             },
1513             {
1514             Name => 'MainInfoIFD',
1515             Groups => { 1 => 'MakerNotes' },
1516             Flags => 'SubIFD',
1517             FixFormat => 'ifd',
1518             SubDirectory => {
1519             TagTable => 'Image::ExifTool::Olympus::Main',
1520             Start => '$val',
1521             },
1522             },
1523             ],
1524             0x5000 => [ #PH
1525             {
1526             Name => 'UnknownInfo',
1527             Condition => '$format ne "ifd" and $format ne "int32u"',
1528             NestedHtmlDump => 2,
1529             SubDirectory => {
1530             TagTable => 'Image::ExifTool::Olympus::UnknownInfo',
1531             ByteOrder => 'Unknown',
1532             },
1533             },
1534             {
1535             Name => 'UnknownInfoIFD',
1536             Groups => { 1 => 'MakerNotes' },
1537             Flags => 'SubIFD',
1538             FixFormat => 'ifd',
1539             SubDirectory => {
1540             TagTable => 'Image::ExifTool::Olympus::UnknownInfo',
1541             Start => '$val',
1542             },
1543             },
1544             ],
1545             );
1546              
1547             # TextInfo tags
1548             %Image::ExifTool::Olympus::TextInfo = (
1549             PROCESS_PROC => \&Image::ExifTool::APP12::ProcessAPP12,
1550             NOTES => q{
1551             This information is in text format (similar to APP12 information, but with
1552             spaces instead of linefeeds). Below are tags which have been observed, but
1553             any information found here will be extracted, even if the tag is not listed.
1554             },
1555             GROUPS => { 0 => 'MakerNotes', 1 => 'Olympus', 2 => 'Image' },
1556             Resolution => { },
1557             Type => {
1558             Name => 'CameraType',
1559             Groups => { 2 => 'Camera' },
1560             DataMember => 'CameraType',
1561             RawConv => '$self->{CameraType} = $val',
1562             SeparateTable => 'CameraType',
1563             PrintConv => \%olympusCameraTypes,
1564             },
1565             );
1566              
1567             # Olympus Equipment IFD
1568             %Image::ExifTool::Olympus::Equipment = (
1569             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1570             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1571             WRITABLE => 1,
1572             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1573             0x000 => { #PH
1574             Name => 'EquipmentVersion',
1575             Writable => 'undef',
1576             RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
1577             Count => 4,
1578             },
1579             0x100 => { #6
1580             Name => 'CameraType2',
1581             Writable => 'string',
1582             Count => 6,
1583             SeparateTable => 'CameraType',
1584             PrintConv => \%olympusCameraTypes,
1585             },
1586             0x101 => { #PH
1587             Name => 'SerialNumber',
1588             Writable => 'string',
1589             Count => 32,
1590             PrintConv => '$val=~s/\s+$//;$val',
1591             PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars
1592             },
1593             0x102 => { #6
1594             Name => 'InternalSerialNumber',
1595             Notes => '16 digits: 0-3=model, 4=year, 5-6=month, 8-12=unit number',
1596             Writable => 'string',
1597             Count => 32,
1598             },
1599             0x103 => { #6
1600             Name => 'FocalPlaneDiagonal',
1601             Writable => 'rational64u',
1602             PrintConv => '"$val mm"',
1603             PrintConvInv => '$val=~s/\s*mm$//;$val',
1604             },
1605             0x104 => { #6
1606             Name => 'BodyFirmwareVersion',
1607             Writable => 'int32u',
1608             PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1609             PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1610             },
1611             0x201 => { #6
1612             Name => 'LensType',
1613             Writable => 'int8u',
1614             Count => 6,
1615             Notes => q{
1616             6 numbers: 1. Make, 2. Unknown, 3. Model, 4. Sub-model, 5-6. Unknown. Only
1617             the Make, Model and Sub-model are used to identify the lens type
1618             },
1619             SeparateTable => 'LensType',
1620             # Have seen these values for the unknown numbers:
1621             # 2: 0
1622             # 5: 0, 2(Olympus lenses for which I have also seen 0 for this number)
1623             # 6: 0, 16(new Lumix lenses)
1624             ValueConv => 'my @a=split(" ",$val); sprintf("%x %.2x %.2x",@a[0,2,3])',
1625             # set unknown values to zero when writing
1626             ValueConvInv => 'my @a=split(" ",$val); hex($a[0])." 0 ".hex($a[1])." ".hex($a[2])." 0 0"',
1627             PrintConv => \%olympusLensTypes,
1628             },
1629             # apparently the first 3 digits of the lens s/n give the type (ref 4):
1630             # 010 = 50macro
1631             # 040 = EC-14
1632             # 050 = 14-54
1633             # 060 = 50-200
1634             # 080 = EX-25
1635             # 101 = FL-50
1636             # 272 = EC-20 #7
1637             0x202 => { #PH
1638             Name => 'LensSerialNumber',
1639             Writable => 'string',
1640             Count => 32,
1641             PrintConv => '$val=~s/\s+$//;$val',
1642             PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars
1643             },
1644             0x203 => { Name => 'LensModel', Writable => 'string' }, #17
1645             0x204 => { #6
1646             Name => 'LensFirmwareVersion',
1647             Writable => 'int32u',
1648             PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1649             PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1650             },
1651             0x205 => { #11
1652             Name => 'MaxApertureAtMinFocal',
1653             Writable => 'int16u',
1654             ValueConv => '$val ? sqrt(2)**($val/256) : 0',
1655             ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
1656             PrintConv => 'sprintf("%.1f",$val)',
1657             PrintConvInv => '$val',
1658             },
1659             0x206 => { #5
1660             Name => 'MaxApertureAtMaxFocal',
1661             Writable => 'int16u',
1662             ValueConv => '$val ? sqrt(2)**($val/256) : 0',
1663             ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
1664             PrintConv => 'sprintf("%.1f",$val)',
1665             PrintConvInv => '$val',
1666             },
1667             0x207 => { Name => 'MinFocalLength', Writable => 'int16u' }, #PH
1668             0x208 => { Name => 'MaxFocalLength', Writable => 'int16u' }, #PH
1669             0x20a => { #9
1670             Name => 'MaxAperture', # (at current focal length)
1671             Writable => 'int16u',
1672             ValueConv => '$val ? sqrt(2)**($val/256) : 0',
1673             ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
1674             PrintConv => 'sprintf("%.1f",$val)',
1675             PrintConvInv => '$val',
1676             },
1677             0x20b => { #11
1678             Name => 'LensProperties',
1679             Writable => 'int16u',
1680             PrintConv => 'sprintf("0x%x",$val)',
1681             PrintConvInv => '$val',
1682             },
1683             0x301 => { #6
1684             Name => 'Extender',
1685             Writable => 'int8u',
1686             Count => 6,
1687             Notes => q{
1688             6 numbers: 1. Make, 2. Unknown, 3. Model, 4. Sub-model, 5-6. Unknown. Only
1689             the Make and Model are used to identify the extender
1690             },
1691             ValueConv => 'my @a=split(" ",$val); sprintf("%x %.2x",@a[0,2])',
1692             ValueConvInv => 'my @a=split(" ",$val); hex($a[0])." 0 ".hex($a[1])." 0 0 0"',
1693             PrintConv => {
1694             '0 00' => 'None',
1695             '0 04' => 'Olympus Zuiko Digital EC-14 1.4x Teleconverter',
1696             '0 08' => 'Olympus EX-25 Extension Tube',
1697             '0 10' => 'Olympus Zuiko Digital EC-20 2.0x Teleconverter', #7
1698             },
1699             },
1700             0x302 => { Name => 'ExtenderSerialNumber', Writable => 'string', Count => 32 }, #4
1701             0x303 => { Name => 'ExtenderModel', Writable => 'string' }, #9
1702             0x304 => { #6
1703             Name => 'ExtenderFirmwareVersion',
1704             Writable => 'int32u',
1705             PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1706             PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1707             },
1708             0x403 => { #http://dev.exiv2.org/issues/870
1709             Name => 'ConversionLens',
1710             Writable => 'string',
1711             # (observed values: '','TCON','FCON','WCON')
1712             },
1713             0x1000 => { #6
1714             Name => 'FlashType',
1715             Writable => 'int16u',
1716             PrintConv => {
1717             0 => 'None',
1718             2 => 'Simple E-System',
1719             3 => 'E-System',
1720             4 => 'E-System (body powered)', #forum9740
1721             },
1722             },
1723             0x1001 => { #6
1724             Name => 'FlashModel',
1725             Writable => 'int16u',
1726             PrintConvColumns => 2,
1727             PrintConv => {
1728             0 => 'None',
1729             1 => 'FL-20', # (or subtronic digital or Inon UW flash, ref 11)
1730             2 => 'FL-50', # (or Metzblitz+SCA or Cullmann 34, ref 11)
1731             3 => 'RF-11',
1732             4 => 'TF-22',
1733             5 => 'FL-36',
1734             6 => 'FL-50R', #11 (or Metz mecablitz digital)
1735             7 => 'FL-36R', #11
1736             9 => 'FL-14', #11
1737             11 => 'FL-600R', #11
1738             13 => 'FL-LM3', #forum9740
1739             15 => 'FL-900R', #7
1740             },
1741             },
1742             0x1002 => { #6
1743             Name => 'FlashFirmwareVersion',
1744             Writable => 'int32u',
1745             PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1746             PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1747             },
1748             0x1003 => { Name => 'FlashSerialNumber', Writable => 'string', Count => 32 }, #4
1749             );
1750              
1751             # Olympus camera settings IFD
1752             %Image::ExifTool::Olympus::CameraSettings = (
1753             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1754             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1755             WRITABLE => 1,
1756             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1757             0x000 => { #PH
1758             Name => 'CameraSettingsVersion',
1759             Writable => 'undef',
1760             RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
1761             Count => 4,
1762             },
1763             0x100 => { #6
1764             Name => 'PreviewImageValid',
1765             Writable => 'int32u',
1766             PrintConv => { 0 => 'No', 1 => 'Yes' },
1767             },
1768             0x101 => { #PH
1769             Name => 'PreviewImageStart',
1770             Flags => 'IsOffset',
1771             OffsetPair => 0x102,
1772             DataTag => 'PreviewImage',
1773             Writable => 'int32u',
1774             WriteGroup => 'MakerNotes',
1775             Protected => 2,
1776             },
1777             0x102 => { #PH
1778             Name => 'PreviewImageLength',
1779             OffsetPair => 0x101,
1780             DataTag => 'PreviewImage',
1781             Writable => 'int32u',
1782             WriteGroup => 'MakerNotes',
1783             Protected => 2,
1784             },
1785             0x200 => { #4
1786             Name => 'ExposureMode',
1787             Writable => 'int16u',
1788             PrintConv => {
1789             1 => 'Manual',
1790             2 => 'Program', #6
1791             3 => 'Aperture-priority AE',
1792             4 => 'Shutter speed priority AE',
1793             5 => 'Program-shift', #6
1794             }
1795             },
1796             0x201 => { #6
1797             Name => 'AELock',
1798             Writable => 'int16u',
1799             PrintConv => \%offOn,
1800             },
1801             0x202 => { #PH/4
1802             Name => 'MeteringMode',
1803             Writable => 'int16u',
1804             PrintConv => {
1805             2 => 'Center-weighted average',
1806             3 => 'Spot',
1807             5 => 'ESP',
1808             261 => 'Pattern+AF', #6
1809             515 => 'Spot+Highlight control', #6
1810             1027 => 'Spot+Shadow control', #6
1811             },
1812             },
1813             0x203 => { Name => 'ExposureShift', Writable => 'rational64s' }, #11 (some models only)
1814             0x204 => { #11 (XZ-1)
1815             Name => 'NDFilter',
1816             PrintConv => \%offOn,
1817             },
1818             0x300 => { #6
1819             Name => 'MacroMode',
1820             Writable => 'int16u',
1821             PrintConv => {
1822             0 => 'Off',
1823             1 => 'On',
1824             2 => 'Super Macro', #11
1825             },
1826             },
1827             0x301 => { #6
1828             Name => 'FocusMode',
1829             Writable => 'int16u',
1830             Count => -1,
1831             Notes => '1 or 2 values',
1832             PrintConv => [{
1833             0 => 'Single AF',
1834             1 => 'Sequential shooting AF',
1835             2 => 'Continuous AF',
1836             3 => 'Multi AF',
1837             4 => 'Face detect', #11
1838             10 => 'MF',
1839             }, {
1840             0 => '(none)',
1841             BITMASK => { #11
1842             0 => 'S-AF',
1843             2 => 'C-AF',
1844             4 => 'MF',
1845             5 => 'Face detect',
1846             6 => 'Imager AF',
1847             7 => 'Live View Magnification Frame',
1848             8 => 'AF sensor',
1849             9 => 'Starry Sky AF', #24
1850             },
1851             }],
1852             },
1853             0x302 => { #6
1854             Name => 'FocusProcess',
1855             Writable => 'int16u',
1856             Count => -1,
1857             Notes => '1 or 2 values',
1858             PrintConv => [{
1859             0 => 'AF Not Used',
1860             1 => 'AF Used',
1861             }],
1862             # 2nd value written only by some models (u1050SW, u9000, uT6000, uT6010,
1863             # uT8000, E-30, E-420, E-450, E-520, E-620, E-P1 and E-P2): - PH
1864             # observed values when "AF Not Used": 0, 16
1865             # observed values when "AF Used": 64, 96(face detect on), 256
1866             },
1867             0x303 => { #6
1868             Name => 'AFSearch',
1869             Writable => 'int16u',
1870             PrintConv => {
1871             0 => 'Not Ready',
1872             1 => 'Ready',
1873             },
1874             },
1875             0x304 => { #PH/4
1876             Name => 'AFAreas',
1877             Notes => 'coordinates range from 0 to 255',
1878             Writable => 'int32u',
1879             Count => 64,
1880             PrintConv => 'Image::ExifTool::Olympus::PrintAFAreas($val)',
1881             },
1882             0x0305 => { #PH
1883             Name => 'AFPointSelected',
1884             Notes => 'coordinates expressed as a percent',
1885             Writable => 'rational64s',
1886             Count => 5,
1887             ValueConv => '$val =~ s/\S* //; $val', # ignore first undefined value
1888             ValueConvInv => '"undef $val"',
1889             PrintConv => q{
1890             return 'n/a' if $val =~ /undef/;
1891             sprintf("(%d%%,%d%%) (%d%%,%d%%)", map {$_ * 100} split(" ",$val));
1892             },
1893             PrintConvInv => q{
1894             return 'undef undef undef undef' if $val eq 'n/a';
1895             my @nums = $val =~ /\d+(?:\.\d+)?/g;
1896             return undef unless @nums == 4;
1897             join ' ', map {$_ / 100} @nums;
1898             },
1899             },
1900             0x306 => { #11
1901             Name => 'AFFineTune',
1902             Writable => 'int8u',
1903             PrintConv => { 0 => 'Off', 1 => 'On' },
1904             },
1905             0x307 => { #15
1906             Name => 'AFFineTuneAdj',
1907             Writable => 'int16s',
1908             Count => 3, # not sure what the 3 values mean
1909             },
1910             0x308 => { #forum11578
1911             Name => 'FocusBracketStepSize',
1912             Writable => 'int8u',
1913             },
1914             0x309 => { #forum13341
1915             Name => 'AISubjectTrackingMode',
1916             Writable => 'int16u',
1917             ValueConv => '($val >> 8) . " " . ($val & 0xff)',
1918             ValueConvInv => 'my @a = split " ", $val; $val = $a[0]*256 + $a[1]',
1919             PrintConv => [{
1920             0 => 'Off',
1921             1 => 'Motorsports',
1922             2 => 'Airplnes',
1923             3 => 'Trains',
1924             4 => 'Birds',
1925             5 => 'Dogs & Cats',
1926             },{
1927             0 => 'Object Not Found',
1928             1 => 'Object Found',
1929             }],
1930             },
1931             0x400 => { #6
1932             Name => 'FlashMode',
1933             Writable => 'int16u',
1934             PrintConv => {
1935             0 => 'Off',
1936             BITMASK => {
1937             0 => 'On',
1938             1 => 'Fill-in',
1939             2 => 'Red-eye',
1940             3 => 'Slow-sync',
1941             4 => 'Forced On',
1942             5 => '2nd Curtain',
1943             },
1944             },
1945             },
1946             0x401 => { Name => 'FlashExposureComp', Writable => 'rational64s' }, #6
1947             # 0x402 - FlashMode? bit0=TTL, bit1=auto, bit2=SuperFP (ref 11)
1948             0x403 => { #11
1949             Name => 'FlashRemoteControl',
1950             Writable => 'int16u',
1951             PrintHex => 1,
1952             PrintConvColumns => 2,
1953             PrintConv => {
1954             0 => 'Off',
1955             0x01 => 'Channel 1, Low',
1956             0x02 => 'Channel 2, Low',
1957             0x03 => 'Channel 3, Low',
1958             0x04 => 'Channel 4, Low',
1959             0x09 => 'Channel 1, Mid',
1960             0x0a => 'Channel 2, Mid',
1961             0x0b => 'Channel 3, Mid',
1962             0x0c => 'Channel 4, Mid',
1963             0x11 => 'Channel 1, High',
1964             0x12 => 'Channel 2, High',
1965             0x13 => 'Channel 3, High',
1966             0x14 => 'Channel 4, High',
1967             },
1968             },
1969             0x404 => { #11
1970             Name => 'FlashControlMode',
1971             Writable => 'int16u',
1972             Count => -1,
1973             Notes => '3 or 4 values',
1974             PrintConv => [{
1975             0 => 'Off',
1976             3 => 'TTL',
1977             4 => 'Auto',
1978             5 => 'Manual',
1979             }],
1980             },
1981             0x405 => { #11
1982             Name => 'FlashIntensity',
1983             Writable => 'rational64s',
1984             Count => -1,
1985             Notes => '3 or 4 values',
1986             PrintConv => {
1987             OTHER => sub { shift },
1988             'undef undef undef' => 'n/a',
1989             'undef undef undef undef' => 'n/a (x4)',
1990             },
1991             },
1992             0x406 => { #11
1993             Name => 'ManualFlashStrength',
1994             Writable => 'rational64s',
1995             Count => -1,
1996             Notes => '3 or 4 values',
1997             PrintConv => {
1998             OTHER => sub { shift },
1999             'undef undef undef' => 'n/a',
2000             'undef undef undef undef' => 'n/a (x4)',
2001             },
2002             },
2003             0x500 => { #6
2004             Name => 'WhiteBalance2',
2005             Writable => 'int16u',
2006             PrintConv => {
2007             0 => 'Auto',
2008             1 => 'Auto (Keep Warm Color Off)', #IB
2009             16 => '7500K (Fine Weather with Shade)',
2010             17 => '6000K (Cloudy)',
2011             18 => '5300K (Fine Weather)',
2012             20 => '3000K (Tungsten light)',
2013             21 => '3600K (Tungsten light-like)',
2014             22 => 'Auto Setup', #IB
2015             23 => '5500K (Flash)', #IB
2016             33 => '6600K (Daylight fluorescent)',
2017             34 => '4500K (Neutral white fluorescent)',
2018             35 => '4000K (Cool white fluorescent)',
2019             36 => 'White Fluorescent', #IB
2020             48 => '3600K (Tungsten light-like)',
2021             67 => 'Underwater', #IB
2022             256 => 'One Touch WB 1', #IB
2023             257 => 'One Touch WB 2', #IB
2024             258 => 'One Touch WB 3', #IB
2025             259 => 'One Touch WB 4', #IB
2026             512 => 'Custom WB 1', #IB
2027             513 => 'Custom WB 2', #IB
2028             514 => 'Custom WB 3', #IB
2029             515 => 'Custom WB 4', #IB
2030             },
2031             },
2032             0x501 => { #PH/4
2033             Name => 'WhiteBalanceTemperature',
2034             Writable => 'int16u',
2035             PrintConv => '$val ? $val : "Auto"',
2036             PrintConvInv => '$val=~/^\d+$/ ? $val : 0',
2037             },
2038             0x502 => { #PH/4
2039             Name => 'WhiteBalanceBracket',
2040             Writable => 'int16s',
2041             },
2042             0x503 => { #PH/4/6
2043             Name => 'CustomSaturation',
2044             Writable => 'int16s',
2045             Count => 3,
2046             Notes => '3 numbers: 1. CS Value, 2. Min, 3. Max',
2047             PrintConv => q{
2048             my ($a,$b,$c)=split ' ',$val;
2049             if ($self->{Model} =~ /^E-1\b/) {
2050             $a-=$b; $c-=$b;
2051             return "CS$a (min CS0, max CS$c)";
2052             } else {
2053             return "$a (min $b, max $c)";
2054             }
2055             },
2056             },
2057             0x504 => { #PH/4
2058             Name => 'ModifiedSaturation',
2059             Writable => 'int16u',
2060             PrintConv => {
2061             0 => 'Off',
2062             1 => 'CM1 (Red Enhance)',
2063             2 => 'CM2 (Green Enhance)',
2064             3 => 'CM3 (Blue Enhance)',
2065             4 => 'CM4 (Skin Tones)',
2066             },
2067             },
2068             0x505 => { #PH/4
2069             Name => 'ContrastSetting',
2070             Writable => 'int16s',
2071             Count => 3,
2072             Notes => 'value, min, max',
2073             PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
2074             PrintConvInv => '$val=~tr/-0-9 //dc;$val',
2075             },
2076             0x506 => { #PH/4
2077             Name => 'SharpnessSetting',
2078             Writable => 'int16s',
2079             Count => 3,
2080             Notes => 'value, min, max',
2081             PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
2082             PrintConvInv => '$val=~tr/-0-9 //dc;$val',
2083             },
2084             0x507 => { #PH/4
2085             Name => 'ColorSpace',
2086             Writable => 'int16u',
2087             PrintConv => { #6
2088             0 => 'sRGB',
2089             1 => 'Adobe RGB',
2090             2 => 'Pro Photo RGB',
2091             },
2092             },
2093             0x509 => { #6
2094             Name => 'SceneMode',
2095             Writable => 'int16u',
2096             PrintConvColumns => 2,
2097             PrintConv => {
2098             0 => 'Standard',
2099             6 => 'Auto', #6
2100             7 => 'Sport',
2101             8 => 'Portrait',
2102             9 => 'Landscape+Portrait',
2103             10 => 'Landscape',
2104             11 => 'Night Scene',
2105             12 => 'Self Portrait', #11
2106             13 => 'Panorama', #6
2107             14 => '2 in 1', #11
2108             15 => 'Movie', #11
2109             16 => 'Landscape+Portrait', #6
2110             17 => 'Night+Portrait',
2111             18 => 'Indoor', #11 (Party - PH)
2112             19 => 'Fireworks',
2113             20 => 'Sunset',
2114             21 => 'Beauty Skin', #PH
2115             22 => 'Macro',
2116             23 => 'Super Macro', #11
2117             24 => 'Food', #11
2118             25 => 'Documents',
2119             26 => 'Museum',
2120             27 => 'Shoot & Select', #11
2121             28 => 'Beach & Snow',
2122             29 => 'Self Protrait+Timer', #11
2123             30 => 'Candle',
2124             31 => 'Available Light', #11
2125             32 => 'Behind Glass', #11
2126             33 => 'My Mode', #11
2127             34 => 'Pet', #11
2128             35 => 'Underwater Wide1', #6
2129             36 => 'Underwater Macro', #6
2130             37 => 'Shoot & Select1', #11
2131             38 => 'Shoot & Select2', #11
2132             39 => 'High Key',
2133             40 => 'Digital Image Stabilization', #6
2134             41 => 'Auction', #11
2135             42 => 'Beach', #11
2136             43 => 'Snow', #11
2137             44 => 'Underwater Wide2', #6
2138             45 => 'Low Key', #6
2139             46 => 'Children', #6
2140             47 => 'Vivid', #11
2141             48 => 'Nature Macro', #6
2142             49 => 'Underwater Snapshot', #11
2143             50 => 'Shooting Guide', #11
2144             54 => 'Face Portrait', #11
2145             57 => 'Bulb', #11
2146             59 => 'Smile Shot', #11
2147             60 => 'Quick Shutter', #11
2148             63 => 'Slow Shutter', #11
2149             64 => 'Bird Watching', #11
2150             65 => 'Multiple Exposure', #11
2151             66 => 'e-Portrait', #11
2152             67 => 'Soft Background Shot', #11
2153             142 => 'Hand-held Starlight', #PH (SH-21)
2154             154 => 'HDR', #PH (XZ-2)
2155             197 => 'Panning', #forum11631 (EM5iii)
2156             203 => 'Light Trails', #forum11631 (EM5iii)
2157             204 => 'Backlight HDR', #forum11631 (EM5iii)
2158             205 => 'Silent', #forum11631 (EM5iii)
2159             206 => 'Multi Focus Shot', #forum11631 (EM5iii)
2160             },
2161             },
2162             0x50a => { #PH/4/6
2163             Name => 'NoiseReduction',
2164             Writable => 'int16u',
2165             PrintConv => {
2166             0 => '(none)',
2167             BITMASK => {
2168             0 => 'Noise Reduction',
2169             1 => 'Noise Filter',
2170             2 => 'Noise Filter (ISO Boost)',
2171             3 => 'Auto', #11
2172             },
2173             },
2174             },
2175             0x50b => { #6
2176             Name => 'DistortionCorrection',
2177             Writable => 'int16u',
2178             PrintConv => \%offOn,
2179             },
2180             0x50c => { #PH/4
2181             Name => 'ShadingCompensation',
2182             Writable => 'int16u',
2183             PrintConv => \%offOn,
2184             },
2185             0x50d => { Name => 'CompressionFactor', Writable => 'rational64u' }, #PH/4
2186             0x50f => { #6
2187             Name => 'Gradation',
2188             Writable => 'int16s',
2189             Notes => '3 or 4 values',
2190             Count => -1,
2191             Relist => [ [0..2], 3 ], # join values 0-2 for PrintConv
2192             PrintConv => [{
2193             '0 0 0' => 'n/a', #PH (?)
2194             '-1 -1 1' => 'Low Key',
2195             '0 -1 1' => 'Normal',
2196             '1 -1 1' => 'High Key',
2197             },{
2198             0 => 'User-Selected',
2199             1 => 'Auto-Override',
2200             }],
2201             },
2202             0x520 => { #6
2203             Name => 'PictureMode',
2204             Writable => 'int16u',
2205             Notes => '1 or 2 values',
2206             Count => -1,
2207             PrintConv => [{
2208             1 => 'Vivid',
2209             2 => 'Natural',
2210             3 => 'Muted',
2211             4 => 'Portrait',
2212             5 => 'i-Enhance', #11
2213             6 => 'e-Portrait', #23
2214             7 => 'Color Creator', #23
2215             9 => 'Color Profile 1', #23
2216             10 => 'Color Profile 2', #23
2217             11 => 'Color Profile 3', #23
2218             12 => 'Monochrome Profile 1', #23
2219             13 => 'Monochrome Profile 2', #23
2220             14 => 'Monochrome Profile 3', #23
2221             256 => 'Monotone',
2222             512 => 'Sepia',
2223             }],
2224             },
2225             0x521 => { #6
2226             Name => 'PictureModeSaturation',
2227             Writable => 'int16s',
2228             Count => 3,
2229             Notes => 'value, min, max',
2230             PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
2231             PrintConvInv => '$val=~tr/-0-9 //dc;$val',
2232             },
2233             0x522 => { #6
2234             Name => 'PictureModeHue',
2235             Writable => 'int16s',
2236             Unknown => 1, # (needs verification)
2237             },
2238             0x523 => { #6
2239             Name => 'PictureModeContrast',
2240             Writable => 'int16s',
2241             Count => 3,
2242             Notes => 'value, min, max',
2243             PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
2244             PrintConvInv => '$val=~tr/-0-9 //dc;$val',
2245             },
2246             0x524 => { #6
2247             Name => 'PictureModeSharpness',
2248             # verified as the Sharpness setting in the Picture Mode menu for the E-410
2249             Writable => 'int16s',
2250             Count => 3,
2251             Notes => 'value, min, max',
2252             PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
2253             PrintConvInv => '$val=~tr/-0-9 //dc;$val',
2254             },
2255             0x525 => { #6
2256             Name => 'PictureModeBWFilter',
2257             Writable => 'int16s',
2258             PrintConvColumns => 2,
2259             PrintConv => {
2260             0 => 'n/a',
2261             1 => 'Neutral',
2262             2 => 'Yellow',
2263             3 => 'Orange',
2264             4 => 'Red',
2265             5 => 'Green',
2266             },
2267             },
2268             0x526 => { #6
2269             Name => 'PictureModeTone',
2270             Writable => 'int16s',
2271             PrintConvColumns => 2,
2272             PrintConv => {
2273             0 => 'n/a',
2274             1 => 'Neutral',
2275             2 => 'Sepia',
2276             3 => 'Blue',
2277             4 => 'Purple',
2278             5 => 'Green',
2279             },
2280             },
2281             0x527 => { #12
2282             Name => 'NoiseFilter',
2283             Writable => 'int16s',
2284             Count => 3,
2285             PrintConv => {
2286             '0 0 0' => 'n/a', #PH (?)
2287             '-2 -2 1' => 'Off',
2288             '-1 -2 1' => 'Low',
2289             '0 -2 1' => 'Standard',
2290             '1 -2 1' => 'High',
2291             },
2292             },
2293             0x529 => { #PH
2294             Name => 'ArtFilter',
2295             Writable => 'int16u',
2296             Count => 4,
2297             PrintConvColumns => 2,
2298             PrintConv => [ \%filters ],
2299             },
2300             0x52c => { #PH
2301             Name => 'MagicFilter',
2302             Writable => 'int16u',
2303             Count => 4, # (2nd number is 0, 1280 or 1792, 3rd/4th are 0)
2304             # (1792 observed for E-5 Gentle Sepia and XZ-1 Dramatic Tone)
2305             PrintConvColumns => 2,
2306             PrintConv => [ \%filters ],
2307             },
2308             0x52d => { #11
2309             Name => 'PictureModeEffect',
2310             Writable => 'int16s',
2311             Count => 3,
2312             PrintConv => {
2313             '0 0 0' => 'n/a', #PH (?)
2314             '-1 -1 1' => 'Low',
2315             '0 -1 1' => 'Standard',
2316             '1 -1 1' => 'High',
2317             },
2318             },
2319             0x52e => { #11/PH
2320             Name => 'ToneLevel',
2321             PrintConv => [
2322             \%toneLevelType,
2323             undef, # (highlights value)
2324             undef, # (highlights min)
2325             undef, # (highlights max)
2326             \%toneLevelType,
2327             undef, # (shadows value)
2328             undef, # (shadows min)
2329             undef, # (shadows max)
2330             \%toneLevelType,
2331             undef, # (midtones value)
2332             undef, # (midtones min)
2333             undef, # (midtones max)
2334             \%toneLevelType,
2335             undef,
2336             undef,
2337             undef,
2338             \%toneLevelType,
2339             undef,
2340             undef,
2341             undef,
2342             \%toneLevelType,
2343             undef,
2344             undef,
2345             undef,
2346             \%toneLevelType,
2347             undef,
2348             undef,
2349             undef,
2350             ]
2351             },
2352             0x52f => { #PH
2353             Name => 'ArtFilterEffect',
2354             Writable => 'int16u',
2355             Count => 20,
2356             PrintHex => 1,
2357             PrintConvColumns => 2,
2358             PrintConv => [
2359             \%filters,
2360             undef,
2361             undef,
2362             '"Partial Color $val"', #23
2363             { # there are 5 available art filter effects for the E-PL3...
2364             0x0000 => 'No Effect',
2365             0x8010 => 'Star Light',
2366             0x8020 => 'Pin Hole',
2367             0x8030 => 'Frame',
2368             0x8040 => 'Soft Focus',
2369             0x8050 => 'White Edge',
2370             0x8060 => 'B&W', # (NC - E-PL2 with "Grainy Film" filter)
2371             0x8080 => 'Blur Top and Bottom', #23
2372             0x8081 => 'Blur Left and Right', #23
2373             # (E-PL2 also has "Pict. Tone" effect)
2374             },
2375             undef,
2376             { #23
2377             0 => 'No Color Filter',
2378             1 => 'Yellow Color Filter',
2379             2 => 'Orange Color Filter',
2380             3 => 'Red Color Filter',
2381             4 => 'Green Color Filter',
2382             },
2383             ],
2384             },
2385             0x532 => { #23
2386             Name => 'ColorCreatorEffect',
2387             Writable => 'int16s',
2388             Count => 6,
2389             PrintConv => [
2390             '"Color $val"',
2391             undef, # (Color min)
2392             undef, # (Color max)
2393             '"Strength $val"',
2394             undef, # (Strength min)
2395             undef, # (Strength max)
2396             ],
2397             },
2398             0x537 => { #23
2399             Name => 'MonochromeProfileSettings',
2400             Writable => 'int16s',
2401             Count => 6,
2402             PrintConv => [
2403             {
2404             0 => 'No Filter',
2405             1 => 'Yellow Filter',
2406             2 => 'Orange Filter',
2407             3 => 'Red Filter',
2408             4 => 'Magenta Filter',
2409             5 => 'Blue Filter',
2410             6 => 'Cyan Filter',
2411             7 => 'Green Filter',
2412             8 => 'Yellow-green Filter',
2413             },
2414             undef, # (Filter number min)
2415             undef, # (Filter number max)
2416             '"Strength $val"',
2417             undef, # (Strength min)
2418             undef, # (Strength max)
2419             ],
2420             },
2421             0x538 => { #23
2422             Name => 'FilmGrainEffect',
2423             Writable => 'int16s',
2424             PrintConv => {
2425             0 => 'Off',
2426             1 => 'Low',
2427             2 => 'Medium',
2428             3 => 'High',
2429             },
2430             },
2431             0x539 => { #23
2432             Name => 'ColorProfileSettings',
2433             Writable => 'int16s',
2434             Count => 14,
2435             PrintConv => [
2436             '"Min $val"',
2437             '"Max $val"',
2438             '"Yellow $val"',
2439             '"Orange $val"',
2440             '"Orange-red $val"',
2441             '"Red $val"',
2442             '"Magenta $val"',
2443             '"Violet $val"',
2444             '"Blue $val"',
2445             '"Blue-cyan $val"',
2446             '"Cyan $val"',
2447             '"Green-cyan $val"',
2448             '"Green $val"',
2449             '"Yellow-green $val"',
2450             ],
2451             },
2452             0x53a => { #23
2453             Name => 'MonochromeVignetting',
2454             Writable => 'int16s',
2455             Notes => '-5 to +5: positive is white vignetting, negative is black vignetting',
2456             },
2457             0x53b => { #23
2458             Name => 'MonochromeColor',
2459             Writable => 'int16s',
2460             PrintConv => {
2461             0 => '(none)',
2462             1 => 'Normal',
2463             2 => 'Sepia',
2464             3 => 'Blue',
2465             4 => 'Purple',
2466             5 => 'Green',
2467             },
2468             },
2469             0x600 => { #PH/4/22
2470             Name => 'DriveMode',
2471             Writable => 'int16u',
2472             Count => -1,
2473             Notes => '2, 3 or 5 numbers: 1. Mode, 2. Shot number, 3. Mode bits, 5. Shutter mode',
2474             PrintConv => q{
2475             my ($a,$b,$c,$d,$e) = split ' ',$val;
2476             if ($e) {
2477             $e = '; ' . ({ 2 => 'Anti-shock 0', 4 => 'Electronic shutter' }->{$e} || "Unknown ($e)");
2478             } else {
2479             $e = '';
2480             }
2481             return "Single Shot$e" unless $a;
2482             if ($a == 5 and defined $c) {
2483             $a = DecodeBits($c, { #6
2484             0 => 'AE',
2485             1 => 'WB',
2486             2 => 'FL',
2487             3 => 'MF',
2488             4 => 'ISO', #forum8906
2489             5 => 'AE Auto', #forum8906
2490             6 => 'Focus', #PH
2491             }) . ' Bracketing';
2492             $a =~ s/, /+/g;
2493             } else {
2494             my %a = (
2495             1 => 'Continuous Shooting',
2496             2 => 'Exposure Bracketing',
2497             3 => 'White Balance Bracketing',
2498             4 => 'Exposure+WB Bracketing', #6
2499             );
2500             $a = $a{$a} || "Unknown ($a)";
2501             }
2502             return "$a, Shot $b$e";
2503             },
2504             },
2505             0x601 => { #6
2506             Name => 'PanoramaMode',
2507             Writable => 'int16u',
2508             Notes => '2 numbers: 1. Mode, 2. Shot number',
2509             PrintConv => q{
2510             my ($a,$b) = split ' ',$val;
2511             return 'Off' unless $a;
2512             my %a = (
2513             1 => 'Left to Right',
2514             2 => 'Right to Left',
2515             3 => 'Bottom to Top',
2516             4 => 'Top to Bottom',
2517             );
2518             return(($a{$a} || "Unknown ($a)") . ', Shot ' . $b);
2519             },
2520             },
2521             0x603 => { #PH/4
2522             Name => 'ImageQuality2',
2523             Writable => 'int16u',
2524             PrintConv => {
2525             1 => 'SQ',
2526             2 => 'HQ',
2527             3 => 'SHQ',
2528             4 => 'RAW',
2529             5 => 'SQ (5)', # (E-500)
2530             },
2531             },
2532             0x604 => { #PH
2533             Name => 'ImageStabilization',
2534             Writable => 'int32u',
2535             DataMember => 'ImageStabilization',
2536             RawConv => '$$self{ImageStabilization} = $val',
2537             PrintConv => {
2538             0 => 'Off',
2539             1 => 'On, Mode 1',
2540             2 => 'On, Mode 2',
2541             3 => 'On, Mode 3',
2542             4 => 'On, Mode 4', # (NC, E-P5)
2543             },
2544             },
2545             0x804 => { #PH (E-M1 with firmware update)
2546             Name => 'StackedImage',
2547             Writable => 'int32u',
2548             Count => 2,
2549             PrintConv => {
2550             '0 0' => 'No',
2551             '1 *' => 'Live Composite (* images)', #24
2552             '4 *' => 'Live Time/Bulb (* images)', #24
2553             '3 2' => 'ND2 (1EV)', #IB
2554             '3 4' => 'ND4 (2EV)', #IB
2555             '3 8' => 'ND8 (3EV)', #IB
2556             '3 16' => 'ND16 (4EV)', #IB
2557             '3 32' => 'ND32 (5EV)', #IB
2558             '3 64' => 'ND64 (6EV)', #forum13341
2559             '5 4' => 'HDR1', #forum8906
2560             '6 4' => 'HDR2', #forum8906
2561             '8 8' => 'Tripod high resolution', #IB
2562             '9 *' => 'Focus-stacked (* images)', #IB (* = 2-15)
2563             '11 12' => 'Hand-held high resolution (11 12)', #forum13341 (OM-1)
2564             '11 16' => 'Hand-held high resolution (11 16)', #IB (perhaps '11 15' would be possible, ref 24)
2565             OTHER => sub {
2566             my ($val, $inv, $conv) = @_;
2567             if ($inv) {
2568             $val = lc $val;
2569             return undef unless $val =~ s/(\d+) images/\* images/;
2570             my $num = $1;
2571             foreach (keys %$conv) {
2572             next unless $val eq lc $$conv{$_};
2573             ($val = $_) =~ s/\*/$num/ or return undef;
2574             return $val;
2575             }
2576             } else {
2577             return "Unknown ($_[0])" unless $val =~ s/ (\d+)/ \*/ and $$conv{$val};
2578             my $num = $1;
2579             ($val = $$conv{$val}) =~ s/\*/$num/;
2580             return $val;
2581             }
2582             },
2583             },
2584             },
2585             0x900 => { #11
2586             Name => 'ManometerPressure',
2587             Writable => 'int16u',
2588             ValueConv => '$val / 10',
2589             ValueConvInv => '$val * 10',
2590             PrintConv => '"$val kPa"',
2591             PrintConvInv => '$val=~s/ ?kPa//i; $val',
2592             },
2593             0x901 => { #PH (u770SW)
2594             # 2 numbers: 1st looks like meters above sea level, 2nd is usually 3x the 1st (feet?)
2595             Name => 'ManometerReading',
2596             Writable => 'int32s',
2597             Count => 2,
2598             ValueConv => 'my @a=split(" ",$val); $_ /= 10 foreach @a; "@a"',
2599             ValueConvInv => 'my @a=split(" ",$val); $_ *= 10 foreach @a; "@a"',
2600             PrintConv => '$val=~s/(\S+) (\S+)/$1 m, $2 ft/; $val',
2601             PrintConvInv => '$val=~s/ ?(m|ft)//gi; $val',
2602             },
2603             0x902 => { #11
2604             Name => 'ExtendedWBDetect',
2605             Writable => 'int16u',
2606             PrintConv => \%offOn,
2607             },
2608             0x903 => { #11
2609             Name => 'RollAngle',
2610             Notes => 'converted to degrees of clockwise camera rotation',
2611             Writable => 'int16s',
2612             Count => 2, # (second value is 0 if level gauge is off)
2613             # negate to express as clockwise rotation
2614             ValueConv => '$val=~s/ 1$// ? -$val/10 : "n/a"',
2615             ValueConvInv => 'IsFloat($val) ? sprintf("%.0f 1",-$val*10) : "0 0"',
2616             },
2617             0x904 => { #11
2618             Name => 'PitchAngle',
2619             Notes => 'converted to degrees of upward camera tilt',
2620             Writable => 'int16s',
2621             Count => 2, # (second value is 0 if level gauge is off)
2622             ValueConv => '$val =~ s/ 1$// ? $val / 10 : "n/a"',
2623             ValueConvInv => 'IsFloat($val) ? sprintf("%.0f 1",$val*10) : "0 0"',
2624             },
2625             0x908 => { #PH (NC, E-M1)
2626             Name => 'DateTimeUTC',
2627             Writable => 'string',
2628             Groups => { 2 => 'Time' },
2629             Shift => 'Time',
2630             PrintConv => '$self->ConvertDateTime($val)',
2631             PrintConvInv => '$self->InverseDateTime($val,undef,1)',
2632             },
2633             );
2634              
2635             # Olympus RAW processing IFD (ref 6)
2636             %Image::ExifTool::Olympus::RawDevelopment = (
2637             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2638             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2639             WRITABLE => 1,
2640             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2641             0x000 => { #PH
2642             Name => 'RawDevVersion',
2643             Writable => 'undef',
2644             RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2645             Count => 4,
2646             },
2647             0x100 => { Name => 'RawDevExposureBiasValue', Writable => 'rational64s' },
2648             0x101 => { Name => 'RawDevWhiteBalanceValue', Writable => 'int16u' },
2649             0x102 => { Name => 'RawDevWBFineAdjustment', Writable => 'int16s' },
2650             0x103 => { Name => 'RawDevGrayPoint', Writable => 'int16u', Count => 3 },
2651             0x104 => { Name => 'RawDevSaturationEmphasis', Writable => 'int16s', Count => 3 },
2652             0x105 => { Name => 'RawDevMemoryColorEmphasis', Writable => 'int16u' },
2653             0x106 => { Name => 'RawDevContrastValue', Writable => 'int16s', Count => 3 },
2654             0x107 => { Name => 'RawDevSharpnessValue', Writable => 'int16s', Count => 3 },
2655             0x108 => {
2656             Name => 'RawDevColorSpace',
2657             Writable => 'int16u',
2658             PrintConv => { #11
2659             0 => 'sRGB',
2660             1 => 'Adobe RGB',
2661             2 => 'Pro Photo RGB',
2662             },
2663             },
2664             0x109 => {
2665             Name => 'RawDevEngine',
2666             Writable => 'int16u',
2667             PrintConv => { #11
2668             0 => 'High Speed',
2669             1 => 'High Function',
2670             2 => 'Advanced High Speed',
2671             3 => 'Advanced High Function',
2672             },
2673             },
2674             0x10a => {
2675             Name => 'RawDevNoiseReduction',
2676             Writable => 'int16u',
2677             PrintConv => { #11
2678             0 => '(none)',
2679             BITMASK => {
2680             0 => 'Noise Reduction',
2681             1 => 'Noise Filter',
2682             2 => 'Noise Filter (ISO Boost)',
2683             },
2684             },
2685             },
2686             0x10b => {
2687             Name => 'RawDevEditStatus',
2688             Writable => 'int16u',
2689             PrintConv => { #11
2690             0 => 'Original',
2691             1 => 'Edited (Landscape)',
2692             6 => 'Edited (Portrait)',
2693             8 => 'Edited (Portrait)',
2694             },
2695             },
2696             0x10c => {
2697             Name => 'RawDevSettings',
2698             Writable => 'int16u',
2699             PrintConv => { #11
2700             0 => '(none)',
2701             BITMASK => {
2702             0 => 'WB Color Temp',
2703             1 => 'WB Gray Point',
2704             2 => 'Saturation',
2705             3 => 'Contrast',
2706             4 => 'Sharpness',
2707             5 => 'Color Space',
2708             6 => 'High Function',
2709             7 => 'Noise Reduction',
2710             },
2711             },
2712             },
2713             );
2714              
2715             # Olympus RAW processing B IFD (ref 11)
2716             %Image::ExifTool::Olympus::RawDevelopment2 = (
2717             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2718             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2719             WRITABLE => 1,
2720             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2721             0x000 => {
2722             Name => 'RawDevVersion',
2723             Writable => 'undef',
2724             RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2725             Count => 4,
2726             },
2727             0x100 => { Name => 'RawDevExposureBiasValue', Writable => 'rational64s' },
2728             0x101 => {
2729             Name => 'RawDevWhiteBalance',
2730             Writable => 'int16u',
2731             PrintConv => {
2732             1 => 'Color Temperature',
2733             2 => 'Gray Point',
2734             },
2735             },
2736             0x102 => { Name => 'RawDevWhiteBalanceValue', Writable => 'int16u' },
2737             0x103 => { Name => 'RawDevWBFineAdjustment', Writable => 'int16s' },
2738             0x104 => { Name => 'RawDevGrayPoint', Writable => 'int16u', Count => 3 },
2739             0x105 => { Name => 'RawDevContrastValue', Writable => 'int16s', Count => 3 },
2740             0x106 => { Name => 'RawDevSharpnessValue', Writable => 'int16s', Count => 3 },
2741             0x107 => { Name => 'RawDevSaturationEmphasis', Writable => 'int16s', Count => 3 },
2742             0x108 => { Name => 'RawDevMemoryColorEmphasis', Writable => 'int16u' },
2743             0x109 => {
2744             Name => 'RawDevColorSpace',
2745             Writable => 'int16u',
2746             PrintConv => {
2747             0 => 'sRGB',
2748             1 => 'Adobe RGB',
2749             2 => 'Pro Photo RGB',
2750             },
2751             },
2752             0x10a => {
2753             Name => 'RawDevNoiseReduction',
2754             Writable => 'int16u',
2755             PrintConv => {
2756             0 => '(none)',
2757             BITMASK => {
2758             0 => 'Noise Reduction',
2759             1 => 'Noise Filter',
2760             2 => 'Noise Filter (ISO Boost)',
2761             },
2762             },
2763             },
2764             0x10b => {
2765             Name => 'RawDevEngine',
2766             Writable => 'int16u',
2767             PrintConv => {
2768             0 => 'High Speed',
2769             1 => 'High Function',
2770             },
2771             },
2772             0x10c => {
2773             Name => 'RawDevPictureMode',
2774             Writable => 'int16u',
2775             PrintConv => {
2776             1 => 'Vivid',
2777             2 => 'Natural',
2778             3 => 'Muted',
2779             256 => 'Monotone',
2780             512 => 'Sepia',
2781             },
2782             },
2783             0x10d => { Name => 'RawDevPMSaturation', Writable => 'int16s', Count => 3 },
2784             0x10e => { Name => 'RawDevPMContrast', Writable => 'int16s', Count => 3 },
2785             0x10f => { Name => 'RawDevPMSharpness', Writable => 'int16s', Count => 3 },
2786             0x110 => {
2787             Name => 'RawDevPM_BWFilter',
2788             Writable => 'int16u',
2789             PrintConv => {
2790             1 => 'Neutral',
2791             2 => 'Yellow',
2792             3 => 'Orange',
2793             4 => 'Red',
2794             5 => 'Green',
2795             },
2796             },
2797             0x111 => {
2798             Name => 'RawDevPMPictureTone',
2799             Writable => 'int16u',
2800             PrintConv => {
2801             1 => 'Neutral',
2802             2 => 'Sepia',
2803             3 => 'Blue',
2804             4 => 'Purple',
2805             5 => 'Green',
2806             },
2807             },
2808             0x112 => { Name => 'RawDevGradation', Writable => 'int16s', Count => 3 },
2809             0x113 => { Name => 'RawDevSaturation3', Writable => 'int16s', Count => 3 }, #(NC Count)
2810             0x119 => { Name => 'RawDevAutoGradation', Writable => 'int16u', PrintConv => \%offOn },
2811             0x120 => { Name => 'RawDevPMNoiseFilter', Writable => 'int16u' }, #(NC format)
2812             0x121 => { #PH (E-P5)
2813             Name => 'RawDevArtFilter',
2814             Writable => 'int16u',
2815             Count => 4,
2816             PrintConvColumns => 2,
2817             PrintConv => [ \%filters ],
2818             },
2819             );
2820              
2821             # Olympus Image processing IFD
2822             %Image::ExifTool::Olympus::ImageProcessing = (
2823             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2824             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2825             WRITABLE => 1,
2826             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2827             0x000 => { #PH
2828             Name => 'ImageProcessingVersion',
2829             Writable => 'undef',
2830             RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2831             Count => 4,
2832             },
2833             0x100 => { Name => 'WB_RBLevels', Writable => 'int16u', Count => 2 }, #6
2834             # 0x101 - in-camera AutoWB unless it is all 0's or all 256's (ref IB)
2835             0x102 => { Name => 'WB_RBLevels3000K', Writable => 'int16u', Count => 2 }, #11
2836             0x103 => { Name => 'WB_RBLevels3300K', Writable => 'int16u', Count => 2 }, #11
2837             0x104 => { Name => 'WB_RBLevels3600K', Writable => 'int16u', Count => 2 }, #11
2838             0x105 => { Name => 'WB_RBLevels3900K', Writable => 'int16u', Count => 2 }, #11
2839             0x106 => { Name => 'WB_RBLevels4000K', Writable => 'int16u', Count => 2 }, #11
2840             0x107 => { Name => 'WB_RBLevels4300K', Writable => 'int16u', Count => 2 }, #11
2841             0x108 => { Name => 'WB_RBLevels4500K', Writable => 'int16u', Count => 2 }, #11
2842             0x109 => { Name => 'WB_RBLevels4800K', Writable => 'int16u', Count => 2 }, #11
2843             0x10a => { Name => 'WB_RBLevels5300K', Writable => 'int16u', Count => 2 }, #11
2844             0x10b => { Name => 'WB_RBLevels6000K', Writable => 'int16u', Count => 2 }, #11
2845             0x10c => { Name => 'WB_RBLevels6600K', Writable => 'int16u', Count => 2 }, #11
2846             0x10d => { Name => 'WB_RBLevels7500K', Writable => 'int16u', Count => 2 }, #11
2847             0x10e => { Name => 'WB_RBLevelsCWB1', Writable => 'int16u', Count => 2 }, #11
2848             0x10f => { Name => 'WB_RBLevelsCWB2', Writable => 'int16u', Count => 2 }, #11
2849             0x110 => { Name => 'WB_RBLevelsCWB3', Writable => 'int16u', Count => 2 }, #11
2850             0x111 => { Name => 'WB_RBLevelsCWB4', Writable => 'int16u', Count => 2 }, #11
2851             0x113 => { Name => 'WB_GLevel3000K', Writable => 'int16u' }, #11
2852             0x114 => { Name => 'WB_GLevel3300K', Writable => 'int16u' }, #11
2853             0x115 => { Name => 'WB_GLevel3600K', Writable => 'int16u' }, #11
2854             0x116 => { Name => 'WB_GLevel3900K', Writable => 'int16u' }, #11
2855             0x117 => { Name => 'WB_GLevel4000K', Writable => 'int16u' }, #11
2856             0x118 => { Name => 'WB_GLevel4300K', Writable => 'int16u' }, #11
2857             0x119 => { Name => 'WB_GLevel4500K', Writable => 'int16u' }, #11
2858             0x11a => { Name => 'WB_GLevel4800K', Writable => 'int16u' }, #11
2859             0x11b => { Name => 'WB_GLevel5300K', Writable => 'int16u' }, #11
2860             0x11c => { Name => 'WB_GLevel6000K', Writable => 'int16u' }, #11
2861             0x11d => { Name => 'WB_GLevel6600K', Writable => 'int16u' }, #11
2862             0x11e => { Name => 'WB_GLevel7500K', Writable => 'int16u' }, #11
2863             0x11f => { Name => 'WB_GLevel', Writable => 'int16u' }, #11
2864             # 0x121 = WB preset for flash (about 6000K) (ref IB)
2865             # 0x125 = WB preset for underwater (ref IB)
2866             0x200 => { #6
2867             Name => 'ColorMatrix',
2868             Writable => 'int16u',
2869             Format => 'int16s',
2870             Count => 9,
2871             },
2872             # color matrices (ref 11):
2873             # 0x0201-0x020d are sRGB color matrices
2874             # 0x020e-0x021a are Adobe RGB color matrices
2875             # 0x021b-0x0227 are ProPhoto RGB color matrices
2876             # 0x0228 and 0x0229 are ColorMatrix for E-330
2877             # 0x0250-0x0252 are sRGB color matrices
2878             # 0x0253-0x0255 are Adobe RGB color matrices
2879             # 0x0256-0x0258 are ProPhoto RGB color matrices
2880             0x300 => { Name => 'Enhancer', Writable => 'int16u' }, #11
2881             0x301 => { Name => 'EnhancerValues', Writable => 'int16u', Count => 7 }, #11
2882             0x310 => { Name => 'CoringFilter', Writable => 'int16u' }, #11
2883             0x311 => { Name => 'CoringValues', Writable => 'int16u', Count => 7 }, #11
2884             0x600 => { Name => 'BlackLevel2', Writable => 'int16u', Count => 4 }, #11
2885             0x610 => { Name => 'GainBase', Writable => 'int16u' }, #11
2886             0x611 => { Name => 'ValidBits', Writable => 'int16u', Count => 2 }, #4/6
2887             0x612 => { Name => 'CropLeft', Writable => 'int16u', Count => 2 }, #11
2888             0x613 => { Name => 'CropTop', Writable => 'int16u', Count => 2 }, #11
2889             0x614 => { Name => 'CropWidth', Writable => 'int32u' }, #PH/11
2890             0x615 => { Name => 'CropHeight', Writable => 'int32u' }, #PH/11
2891             0x635 => { #PH (data starts with "CMIO\x01\0")
2892             Name => 'UnknownBlock1',
2893             Writable => 'undef',
2894             Notes => 'large unknown data block in ORF images but not JPG images',
2895             # 'Drop' because too large for APP1 in JPEG images
2896             Flags => [ 'Unknown', 'Binary', 'Drop' ],
2897             },
2898             0x636 => { #PH (data starts with "CMIO\x01\0")
2899             Name => 'UnknownBlock2',
2900             Writable => 'undef',
2901             Notes => 'large unknown data block in ORF images but not JPG images',
2902             # 'Drop' because too large for APP1 in JPEG images
2903             Flags => [ 'Unknown', 'Binary', 'Drop' ],
2904             },
2905             # 0x800 LensDistortionParams, float[9] (ref 11)
2906             # 0x801 LensShadingParams, int16u[16] (ref 11)
2907             0x0805 => { #IB
2908             Name => 'SensorCalibration',
2909             Notes => '2 numbers: 1. Recommended maximum, 2. Calibration midpoint',
2910             Writable => 'int16s',
2911             Count => 2,
2912             },
2913             # 0x1010-0x1012 are the processing options used in camera or in
2914             # Olympus software, which 0x050a-0x050c are in-camera only (ref 6)
2915             0x1010 => { #PH/4
2916             Name => 'NoiseReduction2',
2917             Writable => 'int16u',
2918             PrintConv => {
2919             0 => '(none)',
2920             BITMASK => {
2921             0 => 'Noise Reduction',
2922             1 => 'Noise Filter',
2923             2 => 'Noise Filter (ISO Boost)',
2924             },
2925             },
2926             },
2927             0x1011 => { #6
2928             Name => 'DistortionCorrection2',
2929             Writable => 'int16u',
2930             PrintConv => \%offOn,
2931             },
2932             0x1012 => { #PH/4
2933             Name => 'ShadingCompensation2',
2934             Writable => 'int16u',
2935             PrintConv => \%offOn,
2936             },
2937             0x101c => { #11
2938             Name => 'MultipleExposureMode',
2939             Writable => 'int16u',
2940             Count => 2,
2941             PrintConv => [{
2942             0 => 'Off',
2943             1 => 'Live Composite', #github issue#61
2944             2 => 'On (2 frames)',
2945             3 => 'On (3 frames)',
2946             }],
2947             },
2948             0x1103 => { #PH
2949             Name => 'UnknownBlock3',
2950             Writable => 'undef',
2951             Notes => 'large unknown data block in ORF images but not JPG images',
2952             # 'Drop' because too large for APP1 in JPEG images
2953             Flags => [ 'Unknown', 'Binary', 'Drop' ],
2954             },
2955             0x1104 => { #PH (overlaps data for 0x1103 in E-M5 ORF images)
2956             Name => 'UnknownBlock4',
2957             Writable => 'undef',
2958             Notes => 'large unknown data block in ORF images but not JPG images',
2959             # 'Drop' because too large for APP1 in JPEG images
2960             Flags => [ 'Unknown', 'Binary', 'Drop' ],
2961             },
2962             0x1112 => { #11
2963             Name => 'AspectRatio',
2964             Writable => 'int8u',
2965             Count => 2,
2966             PrintConv => {
2967             # '0 0' - have seen this with a 16:9 XZ-1 image - PH
2968             '1 1' => '4:3',
2969             '1 4' => '1:1', #PH (E-P5 Storyboard effect, does this indicate 4:3 converted to 6:6?)
2970             '2 1' => '3:2 (RAW)', #forum6285
2971             '2 2' => '3:2',
2972             '3 1' => '16:9 (RAW)', #forum6285
2973             '3 3' => '16:9',
2974             '4 1' => '1:1 (RAW)', #forum6285
2975             '4 4' => '6:6',
2976             '5 5' => '5:4',
2977             '6 6' => '7:6',
2978             '7 7' => '6:5',
2979             '8 8' => '7:5',
2980             '9 1' => '3:4 (RAW)', #forum6285
2981             '9 9' => '3:4',
2982             },
2983             },
2984             0x1113 => { Name => 'AspectFrame', Writable => 'int16u', Count => 4 }, #11
2985             0x1200 => { #11/PH
2986             Name => 'FacesDetected',
2987             Writable => 'int32u',
2988             Count => -1,
2989             Notes => '2 or 3 values',
2990             },
2991             0x1201 => { #11/PH
2992             Name => 'FaceDetectArea',
2993             Writable => 'int16s',
2994             Count => -1, # (varies with model)
2995             Binary => 1, # (too long)
2996             Notes => q{
2997             for models with 2 values in FacesDetected this gives X/Y coordinates in the
2998             FaceDetectFrame for all 4 corners of the face rectangle. For models with 3
2999             values in FacesDetected this gives X/Y coordinates, size and rotation angle
3000             of the face detect square
3001             },
3002             },
3003             0x1202 => { Name => 'MaxFaces', Writable => 'int32u', Count => 3 }, #PH
3004             0x1203 => { #PH
3005             Name => 'FaceDetectFrameSize',
3006             Writable => 'int16u',
3007             Count => 6,
3008             Notes => 'width/height of the full face detect frame',
3009             },
3010             0x1207 => { #PH
3011             Name => 'FaceDetectFrameCrop',
3012             Writable => 'int16s',
3013             Count => 12,
3014             Notes => 'X/Y offset and width/height of the cropped face detect frame',
3015             },
3016             0x1306 => { #PH (NC, E-M1)
3017             Name => 'CameraTemperature',
3018             Writable => 'int16u',
3019             Format => 'int16s', #(NC)
3020             ValueConv => '$val ? $val : undef', # zero for some models (how to differentiate from 0 C?)
3021             Notes => 'this seems to be in degrees C only for some models',
3022             },
3023             0x1900 => { #23
3024             Name => 'KeystoneCompensation',
3025             Writable => 'int8u',
3026             Count => 2,
3027             PrintConv => {
3028             '0 0' => 'Off',
3029             '0 1' => 'On',
3030             },
3031             },
3032             0x1901 => { #23
3033             Name => 'KeystoneDirection',
3034             Writable => 'int8u',
3035             Count => 2,
3036             PrintConv => {
3037             0 => 'Vertical',
3038             1 => 'Horizontal',
3039             },
3040             },
3041             # 0x1905 - focal length (PH, E-M1)
3042             0x1906 => { #23
3043             Name => 'KeystoneValue',
3044             Writable => 'int16s',
3045             Count => 3,
3046             # (use in conjunction with KeystoneDirection, -ve is Top or Right, +ve is Bottom or Left)
3047             Notes => '3 numbers: 1. Keystone Value, 2. Min, 3. Max',
3048             },
3049             );
3050              
3051             # Olympus Focus Info IFD
3052             %Image::ExifTool::Olympus::FocusInfo = (
3053             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
3054             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
3055             WRITABLE => 1,
3056             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3057             0x000 => { #PH
3058             Name => 'FocusInfoVersion',
3059             Writable => 'undef',
3060             RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
3061             Count => 4,
3062             },
3063             0x209 => { #PH/4
3064             Name => 'AutoFocus',
3065             Writable => 'int16u',
3066             PrintConv => \%offOn,
3067             Unknown => 1, #6
3068             },
3069             0x210 => { Name => 'SceneDetect', Writable => 'int16u' }, #11
3070             0x211 => { #11
3071             Name => 'SceneArea',
3072             Writable => 'int32u',
3073             Count => 8,
3074             Unknown => 1, # (numbers don't make much sense?)
3075             },
3076             0x212 => { #11
3077             Name => 'SceneDetectData',
3078             Writable => 'int32u',
3079             Count => 720,
3080             Binary => 1,
3081             Unknown => 1, # (but what does it mean?)
3082             },
3083             # 0x214 - int16u: normally 0, but 1 for E-M1 focus-bracketing, and have seen 1 and 256 at other times
3084             0x300 => { Name => 'ZoomStepCount', Writable => 'int16u' }, #6
3085             0x301 => { Name => 'FocusStepCount', Writable => 'int16u' }, #11
3086             0x303 => { Name => 'FocusStepInfinity', Writable => 'int16u' }, #11
3087             0x304 => { Name => 'FocusStepNear', Writable => 'int16u' }, #11
3088             0x305 => { #4
3089             Name => 'FocusDistance',
3090             Writable => 'rational64u',
3091             # this rational value looks like it is in mm when the denominator is
3092             # 1 (E-1), and cm when denominator is 10 (E-300), so if we ignore the
3093             # denominator we are consistently in mm - PH
3094             Format => 'int32u',
3095             Count => 2,
3096             ValueConv => q{
3097             my ($a,$b) = split ' ',$val;
3098             return 0 if $a == 0xffffffff;
3099             return $a / 1000;
3100             },
3101             ValueConvInv => q{
3102             return '4294967295 1' unless $val;
3103             $val = int($val * 1000 + 0.5);
3104             return "$val 1";
3105             },
3106             PrintConv => '$val ? "$val m" : "inf"',
3107             PrintConvInv => '$val eq "inf" ? 0 : $val=~s/\s*m$//, $val',
3108             },
3109             0x308 => [ # NEED A BETTER WAY TO DETERMINE WHICH MODELS USE WHICH ENCODING!
3110             {
3111             Name => 'AFPoint',
3112             Condition => '$$self{Model} =~ /E-(3|5|30)\b/',
3113             Writable => 'int16u',
3114             PrintHex => 1,
3115             # decoded by ref 6
3116             Notes => q{
3117             for the E-3, E-5 and E-30 the value is separated into 2 parts: low 5 bits
3118             give AF point, upper bits give AF target selection mode
3119             },
3120             ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
3121             ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
3122             PrintConvColumns => 2,
3123             PrintConv => [
3124             {
3125             0x00 => '(none)',
3126             0x01 => 'Top-left (horizontal)',
3127             0x02 => 'Top-center (horizontal)',
3128             0x03 => 'Top-right (horizontal)',
3129             0x04 => 'Left (horizontal)',
3130             0x05 => 'Mid-left (horizontal)',
3131             0x06 => 'Center (horizontal)',
3132             0x07 => 'Mid-right (horizontal)',
3133             0x08 => 'Right (horizontal)',
3134             0x09 => 'Bottom-left (horizontal)',
3135             0x0a => 'Bottom-center (horizontal)',
3136             0x0b => 'Bottom-right (horizontal)',
3137             0x0c => 'Top-left (vertical)',
3138             0x0d => 'Top-center (vertical)',
3139             0x0e => 'Top-right (vertical)',
3140             0x0f => 'Left (vertical)',
3141             0x10 => 'Mid-left (vertical)',
3142             0x11 => 'Center (vertical)',
3143             0x12 => 'Mid-right (vertical)',
3144             0x13 => 'Right (vertical)',
3145             0x14 => 'Bottom-left (vertical)',
3146             0x15 => 'Bottom-center (vertical)',
3147             0x16 => 'Bottom-right (vertical)',
3148             0x1f => 'n/a', #PH (NC, E-3)
3149             },
3150             {
3151             0x00 => 'Single Target',
3152             0x40 => 'All Target',
3153             0x80 => 'Dynamic Single Target',
3154             0xe0 => 'n/a', #PH (NC, E-3)
3155             }
3156             ],
3157             },{ #PH (models with 7-point AF)
3158             Name => 'AFPoint',
3159             Condition => '$$self{Model} =~ /E-(520|600|620)\b/',
3160             Notes => 'models with 7-point AF',
3161             Writable => 'int16u',
3162             PrintHex => 1,
3163             ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
3164             ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
3165             PrintConv => [
3166             {
3167             0x00 => '(none)',
3168             0x01 => 'Center',
3169             # need to fill this in...
3170             },
3171             {
3172             0x00 => 'Single Target',
3173             0x40 => 'All Target', # (guess)
3174             },
3175             ]
3176             },{ #11
3177             Name => 'AFPoint',
3178             Writable => 'int16u',
3179             Notes => 'other models',
3180             RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef',
3181             PrintConv => {
3182             # (E-P1 always writes 0, maybe other models do too - PH)
3183             0 => 'Left (or n/a)',
3184             1 => 'Center (horizontal)', #6 (E-510)
3185             2 => 'Right',
3186             3 => 'Center (vertical)', #6 (E-510)
3187             255 => 'None',
3188             },
3189             }
3190             ],
3191             # 0x31a Continuous AF parameters?
3192             0x328 => { #PH
3193             Name => 'AFInfo',
3194             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::AFInfo' },
3195             },
3196             # 0x1200-0x1209 Flash information:
3197             0x1201 => { #6
3198             Name => 'ExternalFlash',
3199             Writable => 'int16u',
3200             Count => 2,
3201             PrintConv => {
3202             '0 0' => 'Off',
3203             '1 0' => 'On',
3204             },
3205             },
3206             0x1203 => { #11
3207             Name => 'ExternalFlashGuideNumber',
3208             Writable => 'rational64s',
3209             Unknown => 1, # (needs verification)
3210             },
3211             0x1204 => { #11(reversed)/7
3212             Name => 'ExternalFlashBounce',
3213             Writable => 'int16u',
3214             PrintConv => {
3215             0 => 'Bounce or Off',
3216             1 => 'Direct',
3217             },
3218             },
3219             0x1205 => { Name => 'ExternalFlashZoom', Writable => 'rational64u' }, #11 (ref converts to mm using table)
3220             0x1208 => { #6
3221             Name => 'InternalFlash',
3222             Writable => 'int16u',
3223             Count => -1,
3224             PrintConv => {
3225             '0' => 'Off',
3226             '1' => 'On',
3227             '0 0' => 'Off',
3228             '1 0' => 'On',
3229             },
3230             },
3231             0x1209 => { #6
3232             Name => 'ManualFlash',
3233             Writable => 'int16u',
3234             Count => 2,
3235             Notes => '2 numbers: 1. 0=Off, 1=On, 2. Flash strength',
3236             PrintConv => q{
3237             my ($a,$b) = split ' ',$val;
3238             return 'Off' unless $a;
3239             $b = ($b == 1) ? 'Full' : "1/$b";
3240             return "On ($b strength)";
3241             },
3242             },
3243             0x120a => { #PH
3244             Name => 'MacroLED',
3245             Writable => 'int16u',
3246             PrintConv => \%offOn,
3247             },
3248             0x1500 => [{ #6
3249             Name => 'SensorTemperature',
3250             # (Stylus 1 stores values like "34 0 0")
3251             Condition => '$$self{Model} =~ /E-(1|M5)\b/ || $count != 1',
3252             Writable => 'int16s',
3253             PrintConv => '$val=~s/ 0 0$//; "$val C"',
3254             PrintConvInv => '$val=~s/ ?C$//; $val',
3255             },{
3256             Name => 'SensorTemperature',
3257             Writable => 'int16s',
3258             RawConv => '($val and $val ne "-32768") ? $val : undef', # ignore 0 and -32768
3259             # ValueConv => '-2*(($val/135)**2)+55', #11
3260             ValueConv => '84 - 3 * $val / 26', #https://exiftool.org/forum/index.php/topic,5423.0.html
3261             ValueConvInv => 'int((84 - $val) * 26 / 3 + 0.5)',
3262             PrintConv => 'sprintf("%.1f C",$val)',
3263             PrintConvInv => '$val=~s/ ?C$//; $val',
3264             # data from test shots by Eric Sibert:
3265             # E-510 E-620
3266             # Raw Ambient Raw Ambient
3267             # --- ------- --- -------
3268             # 534 22.7 518 22.7
3269             # 550 20.6 531 19.3
3270             # 552 20.8 533 17.9
3271             # 558 19.3 582 17.2
3272             # 564 19.1 621 12.3
3273             # 567 17.8 634 9.7
3274             # 576 18.6 650 8.0
3275             # 582 17.2 660 7.7
3276             # 599 13.8 703 3.3
3277             # 631 10.7 880 -20.6
3278             # 642 12.4 880 -20.6
3279             # 652 9.6 892 -24.4
3280             # 692 5.2 892 -22.7
3281             # 714 3.3
3282             # 895 -19.8
3283             # 895 -19.2
3284             # 900 -21.7
3285             }],
3286             0x1600 => { # ref http://fourthirdsphoto.com/vbb/showpost.php?p=107607&postcount=15
3287             Name => 'ImageStabilization',
3288             # (the other value is more reliable, so ignore this totally if the other exists)
3289             Condition => 'not defined $$self{ImageStabilization}',
3290             Writable => 'undef',
3291             # if the first 4 bytes are non-zero, then bit 0x01 of byte 44
3292             # gives the stabilization mode
3293             PrintConv => q{
3294             $val =~ /^\0{4}/ ? 'Off' : 'On, ' .
3295             (unpack('x44C',$val) & 0x01 ? 'Mode 1' : 'Mode 2')
3296             },
3297             },
3298             # 0x102a same as Subdir4-0x300
3299             );
3300              
3301             # AF information (ref PH)
3302             %Image::ExifTool::Olympus::AFInfo = (
3303             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3304             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3305             FIRST_ENTRY => 0,
3306             # 0x2a - int8u: ImagerAFMode? 0=Manual, 1=Auto
3307             # 0x30 - int16u: AFAreaXPosition?
3308             # 0x32 - int16u: AFAreaWidth? (202)
3309             # 0x34 - int16u: AFAreaYPosition?
3310             # 0x36 - int16u: AFAreaHeight? (50)
3311             # (AF area positions above give the top-left coordinates of the AF area in the
3312             # AF frame. Increasing Y is downwards, and the AF frame size is about 1280x256)
3313             );
3314              
3315             # Olympus raw information tags (ref 6)
3316             %Image::ExifTool::Olympus::RawInfo = (
3317             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
3318             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
3319             NOTES => 'These tags are found only in ORF images of some models (eg. C8080WZ).',
3320             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3321             0x000 => {
3322             Name => 'RawInfoVersion',
3323             Writable => 'undef',
3324             RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
3325             Count => 4,
3326             },
3327             0x100 => { Name => 'WB_RBLevelsUsed', Writable => 'int16u', Count => 2 },
3328             0x110 => { Name => 'WB_RBLevelsAuto', Writable => 'int16u', Count => 2 },
3329             0x120 => { Name => 'WB_RBLevelsShade', Writable => 'int16u', Count => 2 },
3330             0x121 => { Name => 'WB_RBLevelsCloudy', Writable => 'int16u', Count => 2 },
3331             0x122 => { Name => 'WB_RBLevelsFineWeather', Writable => 'int16u', Count => 2 },
3332             0x123 => { Name => 'WB_RBLevelsTungsten', Writable => 'int16u', Count => 2 },
3333             0x124 => { Name => 'WB_RBLevelsEveningSunlight',Writable => 'int16u', Count => 2 },
3334             0x130 => { Name => 'WB_RBLevelsDaylightFluor', Writable => 'int16u', Count => 2 },
3335             0x131 => { Name => 'WB_RBLevelsDayWhiteFluor', Writable => 'int16u', Count => 2 },
3336             0x132 => { Name => 'WB_RBLevelsCoolWhiteFluor', Writable => 'int16u', Count => 2 },
3337             0x133 => { Name => 'WB_RBLevelsWhiteFluorescent',Writable => 'int16u', Count => 2 },
3338             0x200 => {
3339             Name => 'ColorMatrix2',
3340             Format => 'int16s',
3341             Writable => 'int16u',
3342             Count => 9,
3343             },
3344             # 0x240 => 'ColorMatrixDefault', ?
3345             # 0x250 => 'ColorMatrixSaturation', ?
3346             # 0x251 => 'ColorMatrixHue', ?
3347             # 0x252 => 'ColorMatrixContrast', ?
3348             # 0x300 => sharpness-related
3349             # 0x301 => list of sharpness-related values
3350             0x310 => { Name => 'CoringFilter', Writable => 'int16u' },
3351             0x311 => { Name => 'CoringValues', Writable => 'int16u', Count => 11 },
3352             0x600 => { Name => 'BlackLevel2', Writable => 'int16u', Count => 4 },
3353             0x601 => {
3354             Name => 'YCbCrCoefficients',
3355             Notes => 'stored as int16u[6], but extracted as rational32u[3]',
3356             Format => 'rational32u',
3357             },
3358             0x611 => { Name => 'ValidPixelDepth', Writable => 'int16u', Count => 2 },
3359             0x612 => { Name => 'CropLeft', Writable => 'int16u' }, #11
3360             0x613 => { Name => 'CropTop', Writable => 'int16u' }, #11
3361             0x614 => { Name => 'CropWidth', Writable => 'int32u' },
3362             0x615 => { Name => 'CropHeight', Writable => 'int32u' },
3363             0x1000 => {
3364             Name => 'LightSource',
3365             Writable => 'int16u',
3366             PrintConv => {
3367             0 => 'Unknown',
3368             16 => 'Shade',
3369             17 => 'Cloudy',
3370             18 => 'Fine Weather',
3371             20 => 'Tungsten (Incandescent)',
3372             22 => 'Evening Sunlight',
3373             33 => 'Daylight Fluorescent',
3374             34 => 'Day White Fluorescent',
3375             35 => 'Cool White Fluorescent',
3376             36 => 'White Fluorescent',
3377             256 => 'One Touch White Balance',
3378             512 => 'Custom 1-4',
3379             },
3380             },
3381             # the following 5 tags all have 3 values: val, min, max
3382             0x1001 => { Name => 'WhiteBalanceComp', Writable => 'int16s', Count => 3 },
3383             0x1010 => { Name => 'SaturationSetting', Writable => 'int16s', Count => 3 },
3384             0x1011 => { Name => 'HueSetting', Writable => 'int16s', Count => 3 },
3385             0x1012 => { Name => 'ContrastSetting', Writable => 'int16s', Count => 3 },
3386             0x1013 => { Name => 'SharpnessSetting', Writable => 'int16s', Count => 3 },
3387             # settings written by Camedia Master 4.x
3388             0x2000 => { Name => 'CMExposureCompensation', Writable => 'rational64s' },
3389             0x2001 => { Name => 'CMWhiteBalance', Writable => 'int16u' },
3390             0x2002 => { Name => 'CMWhiteBalanceComp', Writable => 'int16s' },
3391             0x2010 => { Name => 'CMWhiteBalanceGrayPoint', Writable => 'int16u', Count => 3 },
3392             0x2020 => { Name => 'CMSaturation', Writable => 'int16s', Count => 3 },
3393             0x2021 => { Name => 'CMHue', Writable => 'int16s', Count => 3 },
3394             0x2022 => { Name => 'CMContrast', Writable => 'int16s', Count => 3 },
3395             0x2023 => { Name => 'CMSharpness', Writable => 'int16s', Count => 3 },
3396             );
3397              
3398             # Olympus unknown information tags
3399             %Image::ExifTool::Olympus::UnknownInfo = (
3400             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
3401             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
3402             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3403             );
3404              
3405             # Tags found only in some FE models
3406             %Image::ExifTool::Olympus::FETags = (
3407             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
3408             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
3409             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3410             NOTES => q{
3411             Some FE models write a large number of tags here, but most of this
3412             information remains unknown.
3413             },
3414             0x0100 => {
3415             Name => 'BodyFirmwareVersion',
3416             Writable => 'string',
3417             },
3418             );
3419              
3420             # tags in Olympus QuickTime videos (ref PH)
3421             # (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
3422             %Image::ExifTool::Olympus::MOV1 = (
3423             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3424             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3425             FIRST_ENTRY => 0,
3426             NOTES => q{
3427             This information is found in MOV videos from Olympus models such as the
3428             D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200.
3429             },
3430             0x00 => {
3431             Name => 'Make',
3432             Format => 'string[24]',
3433             },
3434             0x18 => {
3435             Name => 'Model',
3436             Description => 'Camera Model Name',
3437             Format => 'string[8]',
3438             SeparateTable => 'CameraType',
3439             PrintConv => \%olympusCameraTypes,
3440             },
3441             # (01 00 at offset 0x20)
3442             0x26 => {
3443             Name => 'ExposureUnknown',
3444             Unknown => 1,
3445             Format => 'int32u',
3446             # this conversion doesn't work for all models (eg. gives "1/100000")
3447             ValueConv => '$val ? 10 / $val : 0',
3448             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
3449             },
3450             0x2a => {
3451             Name => 'FNumber',
3452             Format => 'rational64u',
3453             PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3454             },
3455             0x32 => { #(NC)
3456             Name => 'ExposureCompensation',
3457             Format => 'rational64s',
3458             PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
3459             },
3460             # 0x44 => WhiteBalance ?
3461             0x48 => {
3462             Name => 'FocalLength',
3463             Format => 'rational64u',
3464             PrintConv => 'sprintf("%.1f mm",$val)',
3465             },
3466             # 0xb1 => 'ISO', #(I don't think this works - PH)
3467             );
3468              
3469             # tags in Olympus QuickTime videos (ref PH)
3470             # (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
3471             %Image::ExifTool::Olympus::MOV2 = (
3472             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3473             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3474             FIRST_ENTRY => 0,
3475             NOTES => q{
3476             This information is found in MOV videos from Olympus models such as the
3477             FE120, FE140 and FE190.
3478             },
3479             0x00 => {
3480             Name => 'Make',
3481             Format => 'string[24]',
3482             },
3483             0x18 => {
3484             Name => 'Model',
3485             Description => 'Camera Model Name',
3486             Format => 'string[24]',
3487             Notes => 'the actual model name, no decoding necessary',
3488             },
3489             # (01 00 at offset 0x30)
3490             0x36 => {
3491             Name => 'ExposureTime',
3492             Format => 'int32u',
3493             ValueConv => '$val ? 10 / $val : 0',
3494             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
3495             },
3496             0x3a => {
3497             Name => 'FNumber',
3498             Format => 'rational64u',
3499             PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3500             },
3501             0x42 => { #(NC)
3502             Name => 'ExposureCompensation',
3503             Format => 'rational64s',
3504             PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
3505             },
3506             0x58 => {
3507             Name => 'FocalLength',
3508             Format => 'rational64u',
3509             PrintConv => 'sprintf("%.1f mm",$val)',
3510             },
3511             0xc1 => {
3512             Name => 'ISO',
3513             Format => 'int16u',
3514             },
3515             );
3516              
3517             # tags in Olympus MP4 videos (ref PH)
3518             %Image::ExifTool::Olympus::MP4 = (
3519             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3520             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3521             FIRST_ENTRY => 0,
3522             NOTES => q{
3523             This information is found in MP4 videos from Olympus models such as the
3524             u7040 and u9010.
3525             },
3526             0x00 => {
3527             Name => 'Make',
3528             Format => 'string[24]',
3529             },
3530             0x18 => {
3531             Name => 'Model',
3532             Description => 'Camera Model Name',
3533             Format => 'string[24]',
3534             Notes => 'oddly different than CameraType values in JPEG images by the same camera',
3535             PrintConv => {
3536             SG472 => 'u7040,S7040',
3537             SG473 => 'u9010,S9010',
3538             SG475 => 'SP800UZ',
3539             SG551 => 'SZ-30MR',
3540             SG553 => 'SP-610UZ',
3541             SG554 => 'SZ-10',
3542             SG555 => 'SZ-20',
3543             SG573 => 'SZ-14',
3544             SG575 => 'SP-620UZ',
3545             },
3546             },
3547             0x28 => {
3548             Name => 'FNumber',
3549             Format => 'rational64u',
3550             PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3551             },
3552             0x30 => { #(NC)
3553             Name => 'ExposureCompensation',
3554             Format => 'rational64s',
3555             PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
3556             },
3557             # 0x38 - int32u: 3
3558             # 0x3c - int32u: 1
3559             # 0x40 - int16u: 5
3560             # 0x42 - int16u: 0,4,9
3561             # 0x64 - int32u: 0,6000,12000
3562             # 0x48 - int32u: 100 (ISO?)
3563             0x68 => {
3564             Name => 'MovableInfo',
3565             Condition => '$$valPt =~ /^DIGI/',
3566             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::MovableInfo' },
3567             },
3568             0x72 => {
3569             Name => 'MovableInfo',
3570             Condition => '$$valPt =~ /^DIGI/',
3571             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::MovableInfo' },
3572             },
3573             );
3574              
3575             # yet a different QuickTime TAGS format (PH, E-M5)
3576             %Image::ExifTool::Olympus::MOV3 = (
3577             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3578             NOTES => 'QuickTime information found in the TAGS atom of MOV videos from the E-M5.',
3579             OLYM => {
3580             Name => 'OlympusAtom',
3581             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::OLYM2' },
3582             },
3583             );
3584              
3585             # yet a different QuickTime OLYM atom format (PH, E-M5)
3586             %Image::ExifTool::Olympus::OLYM2 = (
3587             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3588             prms => {
3589             Name => 'MakerNotes',
3590             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::prms' },
3591             },
3592             thmb =>{
3593             Name => 'ThumbInfo',
3594             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb2' },
3595             },
3596             scrn =>{
3597             Name => 'PreviewInfo',
3598             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn2' },
3599             },
3600             );
3601              
3602             # the "prms" atom in E-M5 MOV videos (PH, E-M5)
3603             %Image::ExifTool::Olympus::prms = (
3604             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3605             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3606             FIRST_ENTRY => 0,
3607             NOTES => q{
3608             Information extracted from the "prms" atom in MOV videos from Olympus models
3609             such as the OM E-M5.
3610             },
3611             0x12 => {
3612             Name => 'Make',
3613             Format => 'string[24]',
3614             },
3615             0x2c => {
3616             Name => 'Model',
3617             Description => 'Camera Model Name',
3618             Format => 'string[24]',
3619             SeparateTable => 'CameraType',
3620             PrintConv => \%olympusCameraTypes,
3621             },
3622             0x83 => {
3623             Name => 'DateTime1',
3624             Format => 'string[24]',
3625             Groups => { 2 => 'Time' },
3626             },
3627             0x9d => {
3628             Name => 'DateTime2',
3629             Format => 'string[24]',
3630             Groups => { 2 => 'Time' },
3631             },
3632             0x17f => {
3633             Name => 'LensModel',
3634             Format => 'string[32]'
3635             },
3636             );
3637              
3638             # yet a different "thmb" atom format (PH, E-M5)
3639             %Image::ExifTool::Olympus::thmb2 = (
3640             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3641             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3642             0 => {
3643             Name => 'ThumbnailWidth',
3644             Format => 'int16u',
3645             },
3646             2 => {
3647             Name => 'ThumbnailHeight',
3648             Format => 'int16u',
3649             },
3650             4 => {
3651             Name => 'ThumbnailLength',
3652             Format => 'int32u',
3653             },
3654             8 => {
3655             Name => 'ThumbnailImage',
3656             Groups => { 2 => 'Preview' },
3657             Format => 'undef[$val{4}]',
3658             Notes => '160x120 JPEG thumbnail image',
3659             RawConv => '$self->ValidateImage(\$val,$tag)',
3660             },
3661             );
3662              
3663             # yet a different "scrn" atom format (PH, E-M5)
3664             %Image::ExifTool::Olympus::scrn2 = (
3665             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3666             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3667             # 0 => int16u: 1 - number of preview images?
3668             2 => {
3669             Name => 'OlympusPreview',
3670             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::scrn' },
3671             },
3672             );
3673              
3674             # movable information found in MP4 videos
3675             %Image::ExifTool::Olympus::MovableInfo = (
3676             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3677             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3678             FIRST_ENTRY => 0,
3679             0x04 => { #(NC)
3680             Name => 'ISO',
3681             Format => 'int32u',
3682             },
3683             0x2c => {
3684             Name => 'EncoderVersion',
3685             Format => 'string[16]',
3686             },
3687             0x3c => {
3688             Name => 'DecoderVersion',
3689             Format => 'string[16]',
3690             },
3691             0x83 => {
3692             Name => 'Thumbnail',
3693             SubDirectory => {
3694             TagTable => 'Image::ExifTool::Olympus::Thumbnail',
3695             Base => '$start', # (use a separate table because of this)
3696             },
3697             },
3698             );
3699              
3700             # thumbnail image information found in MP4 videos (similar in Olympus,Samsung,Sanyo) (ref PH)
3701             %Image::ExifTool::Olympus::Thumbnail = (
3702             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3703             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3704             FIRST_ENTRY => 0,
3705             FORMAT => 'int32u',
3706             1 => 'ThumbnailWidth',
3707             2 => 'ThumbnailHeight',
3708             3 => 'ThumbnailLength',
3709             4 => { Name => 'ThumbnailOffset', IsOffset => 1 },
3710             );
3711              
3712             # thumbnail information found in 'thmb' atom of MP4 videos from the TG-810 (ref PH)
3713             %Image::ExifTool::Olympus::thmb = (
3714             NOTES => 'Information extracted from the "thmb" atom of Olympus MP4 videos.',
3715             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3716             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3717             0 => {
3718             Name => 'ThumbnailLength',
3719             Format => 'int32u',
3720             },
3721             4 => {
3722             Name => 'ThumbnailImage',
3723             Groups => { 2 => 'Preview' },
3724             Format => 'undef[$val{0}]',
3725             Notes => '160x120 JPEG thumbnail image',
3726             RawConv => '$self->ValidateImage(\$val,$tag)',
3727             },
3728             );
3729              
3730             # thumbnail information found in 'scrn' atom of MP4 videos from the TG-810 (ref PH)
3731             %Image::ExifTool::Olympus::scrn = (
3732             NOTES => 'Information extracted from the "scrn" atom of Olympus MP4 videos.',
3733             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3734             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3735             0 => {
3736             Name => 'PreviewImageLength',
3737             Format => 'int32u',
3738             },
3739             4 => {
3740             Name => 'PreviewImage',
3741             Groups => { 2 => 'Preview' },
3742             Format => 'undef[$val{0}]',
3743             Notes => '640x480 JPEG preview image',
3744             RawConv => '$self->ValidateImage(\$val,$tag)',
3745             },
3746             );
3747              
3748             # information in OLYM atom of MP4 videos from the TG-810 (ref PH)
3749             %Image::ExifTool::Olympus::OLYM = (
3750             NOTES => 'Tags found in the OLYM atom of MP4 videos from the TG-810.',
3751             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3752             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3753             0x0e => {
3754             Name => 'Make',
3755             Format => 'string[26]',
3756             },
3757             0x28 => {
3758             Name => 'Model',
3759             Description => 'Camera Model Name',
3760             Format => 'string[24]',
3761             SeparateTable => 'CameraType',
3762             PrintConv => \%olympusCameraTypes,
3763             },
3764             0x5a => {
3765             Name => 'FNumber',
3766             Format => 'rational64u',
3767             PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3768             },
3769             0x7f => {
3770             Name => 'DateTimeOriginal', #(NC)
3771             Description => 'Date/Time Original',
3772             Format => 'string[24]',
3773             Groups => { 2 => 'Time' },
3774             PrintConv => '$self->ConvertDateTime($val)',
3775             },
3776             0x99 => {
3777             Name => 'DateTime2',
3778             Format => 'string[24]',
3779             Groups => { 2 => 'Time' },
3780             },
3781             0x109 => {
3782             Name => 'ThumbnailWidth',
3783             Format => 'int16u',
3784             },
3785             0x10b => {
3786             Name => 'ThumbnailHeight',
3787             Format => 'int16u',
3788             },
3789             );
3790              
3791             # tags in Olympus AVI videos (ref PH)
3792             # (very similar to Pentax::Junk2 tags)
3793             %Image::ExifTool::Olympus::AVI = (
3794             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3795             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3796             FIRST_ENTRY => 0,
3797             NOTES => 'This information is found in Olympus AVI videos.',
3798             0x12 => {
3799             Name => 'Make',
3800             Format => 'string[24]',
3801             },
3802             0x2c => {
3803             Name => 'Model',
3804             Description => 'Camera Model Name',
3805             Format => 'string[24]',
3806             SeparateTable => 'CameraType',
3807             PrintConv => \%olympusCameraTypes,
3808             },
3809             0x5e => {
3810             Name => 'FNumber',
3811             Format => 'rational64u',
3812             PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3813             },
3814             0x83 => {
3815             Name => 'DateTime1',
3816             Format => 'string[24]',
3817             Groups => { 2 => 'Time' },
3818             },
3819             0x9d => {
3820             Name => 'DateTime2',
3821             Format => 'string[24]',
3822             Groups => { 2 => 'Time' },
3823             },
3824             0x129 => {
3825             Name => 'ThumbInfo',
3826             SubDirectory => { TagTable => 'Image::ExifTool::Olympus::thmb2' },
3827             },
3828             );
3829              
3830             # tags in WAV files from Olympus PCM linear recorders (ref 18)
3831             %Image::ExifTool::Olympus::WAV = (
3832             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3833             GROUPS => { 0 => 'MakerNotes', 2 => 'Audio' },
3834             FIRST_ENTRY => 0,
3835             NOTES => q{
3836             This information is found in WAV files from Olympus PCM linear recorders
3837             like the LS-5, LS-10, LS-11.
3838             },
3839             0x0c => {
3840             Name => 'Model',
3841             Description => 'Camera Model Name',
3842             Format => 'string[16]',
3843             },
3844             0x1c => {
3845             Name => 'FileNumber',
3846             Format => 'int32u',
3847             PrintConv => 'sprintf("%.4d", $val)',
3848             },
3849             0x26 => {
3850             Name => 'DateTimeOriginal',
3851             Description => 'Date/Time Original',
3852             Groups => { 2 => 'Time' },
3853             Format => 'undef[12]',
3854             Notes => 'time at start of recording',
3855             ValueConv => q{
3856             return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/;
3857             my $y = $1 < 70 ? "20$1" : "19$1";
3858             return "$y:$2:$3 $4:$5:$6";
3859             },
3860             PrintConv => '$self->ConvertDateTime($val)',
3861             },
3862             0x32 => {
3863             Name => 'DateTimeEnd',
3864             Groups => { 2 => 'Time' },
3865             Format => 'undef[12]',
3866             Notes => 'time at end of recording',
3867             ValueConv => q{
3868             return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/;
3869             my $y = $1 < 70 ? "20$1" : "19$1";
3870             return "$y:$2:$3 $4:$5:$6";
3871             },
3872             PrintConv => '$self->ConvertDateTime($val)',
3873             },
3874             0x3e => {
3875             Name => 'RecordingTime',
3876             Format => 'undef[6]',
3877             ValueConv => '$val =~ s/^(\d{2})(\d{2})/$1:$2:/; $val',
3878             },
3879             0x200 => {
3880             Name => 'Duration',
3881             Format => 'int32u',
3882             ValueConv => '$val / 1000',
3883             PrintConv => 'ConvertDuration($val)',
3884             },
3885             0x20a => { Name => 'Index01', %indexInfo },
3886             0x214 => { Name => 'Index02', %indexInfo },
3887             0x21e => { Name => 'Index03', %indexInfo },
3888             0x228 => { Name => 'Index04', %indexInfo },
3889             0x232 => { Name => 'Index05', %indexInfo },
3890             0x23c => { Name => 'Index06', %indexInfo },
3891             0x246 => { Name => 'Index07', %indexInfo },
3892             0x250 => { Name => 'Index08', %indexInfo },
3893             0x25a => { Name => 'Index09', %indexInfo },
3894             0x264 => { Name => 'Index10', %indexInfo },
3895             0x26e => { Name => 'Index11', %indexInfo },
3896             0x278 => { Name => 'Index12', %indexInfo },
3897             0x282 => { Name => 'Index13', %indexInfo },
3898             0x28c => { Name => 'Index14', %indexInfo },
3899             0x296 => { Name => 'Index15', %indexInfo },
3900             0x2a0 => { Name => 'Index16', %indexInfo },
3901             );
3902              
3903             # DSS information written by Olympus voice recorders (ref PH)
3904             %Image::ExifTool::Olympus::DSS = (
3905             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3906             GROUPS => { 0 => 'MakerNotes', 2 => 'Audio' },
3907             FIRST_ENTRY => 0,
3908             NOTES => q{
3909             Information extracted from DSS/DS2 files and the ID3 XOLY frame of MP3 files
3910             written by some Olympus voice recorders.
3911             },
3912             # 0 - file format:
3913             # "\x02dss"(DSS file and XOLY frame in MP3 file)
3914             # "\x03ds2"(DS2 file)
3915             # "\x03mp3"(ID3 XOLY frame in MP3 file)
3916             12 => { Name => 'Model', Format => 'string[16]' }, # (name truncated by some models)
3917             38 => {
3918             Name => 'StartTime',
3919             Format => 'string[12]',
3920             Groups => { 2 => 'Time' },
3921             ValueConv => '$val =~ s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/20$1:$2:$3 $4:$5:$6/; $val',
3922             PrintConv => '$self->ConvertDateTime($val)',
3923             },
3924             50 => {
3925             Name => 'EndTime',
3926             Format => 'string[12]',
3927             Groups => { 2 => 'Time' },
3928             ValueConv => '$val =~ s/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/20$1:$2:$3 $4:$5:$6/; $val',
3929             PrintConv => '$self->ConvertDateTime($val)',
3930             },
3931             62 => {
3932             Name => 'Duration',
3933             Format => 'string[6]',
3934             ValueConv => '$val =~ /(\d{2})(\d{2})(\d{2})/ ? ($1 * 60 + $2) * 60 + $3 : undef',
3935             PrintConv => 'ConvertDuration($val)',
3936             },
3937             798 => { # (ref http://search.cpan.org/~rgibson/Audio-DSS-0.02/)
3938             Name => 'Comment',
3939             Format => 'string[100]',
3940             },
3941             );
3942              
3943             # Olympus composite tags
3944             %Image::ExifTool::Olympus::Composite = (
3945             GROUPS => { 2 => 'Camera' },
3946             ExtenderStatus => {
3947             Notes => q{
3948             Olympus cameras have the quirk that they may retain the extender settings
3949             after the extender is removed until the camera is powered off. This tag is
3950             an attempt to represent the actual status of the extender.
3951             },
3952             Require => {
3953             0 => 'Olympus:Extender',
3954             1 => 'Olympus:LensType',
3955             2 => 'MaxApertureValue',
3956             },
3957             ValueConv => 'Image::ExifTool::Olympus::ExtenderStatus($val[0],$prt[1],$val[2])',
3958             PrintConv => {
3959             0 => 'Not attached',
3960             1 => 'Attached',
3961             2 => 'Removed',
3962             },
3963             },
3964             ZoomedPreviewImage => {
3965             Groups => { 2 => 'Preview' },
3966             Require => {
3967             0 => 'ZoomedPreviewStart',
3968             1 => 'ZoomedPreviewLength',
3969             },
3970             RawConv => q{
3971             @grps = $self->GetGroup($$val{0}); # set groups from input tag
3972             Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ZoomedPreviewImage");
3973             },
3974             },
3975             # this is actually for PanasonicRaw tags, but it uses the lens lookup here
3976             LensType => {
3977             Require => {
3978             0 => 'LensTypeMake',
3979             1 => 'LensTypeModel',
3980             },
3981             Notes => 'based on tags found in some Panasonic RW2 images',
3982             SeparateTable => 'Olympus LensType',
3983             ValueConv => '"$val[0] $val[1]"',
3984             PrintConv => \%olympusLensTypes,
3985             },
3986             );
3987              
3988             # add our composite tags
3989             Image::ExifTool::AddCompositeTags('Image::ExifTool::Olympus');
3990              
3991              
3992             #------------------------------------------------------------------------------
3993             # Determine if the extender (EX-25/EC-14) was really attached (ref 9)
3994             # Inputs: 0) Extender, 1) LensType string, 2) MaxApertureAtMaxFocal
3995             # Returns: 0=not attached, 1=attached, 2=could have been removed
3996             # Notes: Olympus has a bug in the in-camera firmware which results in the
3997             # extender information being cached and written into the EXIF data even after
3998             # the extender has been removed. You must power cycle the camera to prevent it
3999             # from writing the cached extender information into the EXIF data.
4000             sub ExtenderStatus($$$)
4001             {
4002 2     2 0 8 my ($extender, $lensType, $maxAperture) = @_;
4003 2         9 my @info = split ' ', $extender;
4004             # validate that extender identifier is reasonable
4005 2 50 33     26 return 0 unless @info >= 2 and hex($info[1]);
4006             # if it's not an EC-14 (id '0 04') then assume it was really attached
4007             # (other extenders don't seem to affect the reported max aperture)
4008 0 0       0 return 1 if "$info[0] $info[1]" ne '0 04';
4009             # get the maximum aperture for this lens (in $1)
4010 0 0       0 $lensType =~ / F(\d+(\.\d+)?)/ or return 1;
4011             # If the maximum aperture at the maximum focal length is greater than the
4012             # known max/max aperture of the lens, then the extender must be attached
4013 0 0       0 return(($maxAperture - $1 > 0.2) ? 1 : 2);
4014             }
4015              
4016             #------------------------------------------------------------------------------
4017             # Print AF points
4018             # Inputs: 0) AF point data (string of integers)
4019             # Notes: I'm just guessing that the 2nd and 4th bytes are the Y coordinates,
4020             # and that more AF points will show up in the future (derived from E-1 images,
4021             # and the E-1 uses just one of 3 possible AF points, all centered in Y) - PH
4022             sub PrintAFAreas($)
4023             {
4024 4     4 0 12 my $val = shift;
4025 4         80 my @points = split ' ', $val;
4026 4         27 my %afPointNames = (
4027             0x36794285 => 'Left',
4028             0x79798585 => 'Center',
4029             0xBD79C985 => 'Right',
4030             );
4031 4         8 $val = '';
4032 4         7 my $pt;
4033 4         10 foreach $pt (@points) {
4034 256 100       346 next unless $pt;
4035 2 50       6 $val and $val .= ', ';
4036 2 50       9 $afPointNames{$pt} and $val .= $afPointNames{$pt} . ' ';
4037 2         18 my @coords = unpack('C4',pack('N',$pt));
4038 2         13 $val .= "($coords[0],$coords[1])-($coords[2],$coords[3])";
4039             }
4040 4 100       21 $val or $val = 'none';
4041 4         37 return $val;
4042             }
4043              
4044             #------------------------------------------------------------------------------
4045             # Extract information from a DSS/DS2 voice recorder audio file or ID3 XOLY frame
4046             # Inputs: 0) ExifTool object reference, 1) dirInfo reference
4047             # Returns: 1 on success
4048             sub ProcessDSS($$;$)
4049             {
4050 1     1 0 3 my ($et, $dirInfo) = @_;
4051              
4052             # allow this to be called with either RAF or DataPt
4053 1         3 my $raf = $$dirInfo{RAF};
4054 1 50       4 if ($raf) {
4055 1         2 my $buff;
4056 1 50       4 $raf->Read($buff, 898) > 68 or return 0;
4057 1 50       7 $buff =~ /^(\x02dss|\x03ds2)/ or return 0;
4058 1         4 $dirInfo = { DataPt => \$buff };
4059 1         9 $et->SetFileType(uc substr $buff, 1, 3);
4060             }
4061 1         5 my $tagTablePtr = GetTagTable('Image::ExifTool::Olympus::DSS');
4062 1         9 return $et->ProcessBinaryData($dirInfo, $tagTablePtr);
4063             }
4064              
4065             #------------------------------------------------------------------------------
4066             # Process ORF file
4067             # Inputs: 0) ExifTool object reference, 1) directory information reference
4068             # Returns: 1 if this looked like a valid ORF file, 0 otherwise
4069             sub ProcessORF($$)
4070             {
4071 0     0 0   my ($et, $dirInfo) = @_;
4072 0           return $et->ProcessTIFF($dirInfo);
4073             }
4074              
4075             1; # end
4076              
4077             __END__