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