source: gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/Olympus.pm@ 24626

Last change on this file since 24626 was 24626, checked in by jmt12, 13 years ago

An (almost) complete copy of the perllib directory from a (circa SEP2011) head checkout from Greenstone 2 trunk - in order to try and make merging in this extension a little easier later on (as there have been some major changes to buildcol.pl commited in the main trunk but not in the x64 branch)

File size: 100.4 KB
Line 
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 HŠnninen private communication (tests with E-1)
13# 5) RŽmi 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
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 communcation (E-P1) + http://forums.dpreview.com/forums/read.asp?message=33187567
25# 17) Martin Hibers private communication
26# 18) Tomasz Kawecki private communication
27#------------------------------------------------------------------------------
28
29package Image::ExifTool::Olympus;
30
31use strict;
32use vars qw($VERSION);
33use Image::ExifTool::Exif;
34use Image::ExifTool::APP12;
35
36$VERSION = '1.79';
37
38sub PrintLensInfo($$$);
39
40my %offOn = ( 0 => 'Off', 1 => 'On' );
41
42# lookup for Olympus LensType values
43my %olympusLensTypes = (
44 '0 0 0' => 'None',
45 # Olympus lenses
46 '0 1 0' => 'Olympus Zuiko Digital ED 50mm F2.0 Macro',
47 '0 1 1' => 'Olympus Zuiko Digital 40-150mm F3.5-4.5', #8
48 '0 1 16' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6', #PH (E-P1 pre-production)
49 '0 2 0' => 'Olympus Zuiko Digital ED 150mm F2.0',
50 '0 2 16' => 'Olympus M.Zuiko Digital 17mm F2.8 Pancake', #PH (E-P1 pre-production)
51 '0 3 0' => 'Olympus Zuiko Digital ED 300mm F2.8',
52 '0 3 16' => 'Olympus M.Zuiko Digital ED 14-150mm F4.0-5.6', #11
53 '0 4 16' => 'Olympus M.Zuiko Digital ED 9-18mm F4.0-5.6', #11
54 '0 5 0' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5',
55 '0 5 1' => 'Olympus Zuiko Digital Pro ED 90-250mm F2.8', #9
56 '0 5 16' => 'Olympus M.Zuiko Digital ED 14-42mm F3.5-5.6', #11
57 '0 6 0' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5',
58 '0 6 1' => 'Olympus Zuiko Digital ED 8mm F3.5 Fisheye', #9
59 '0 7 0' => 'Olympus Zuiko Digital 11-22mm F2.8-3.5',
60 '0 7 1' => 'Olympus Zuiko Digital 18-180mm F3.5-6.3', #6
61 '0 8 1' => 'Olympus Zuiko Digital 70-300mm F4.0-5.6', #7 (seen as release 1 - PH)
62 '0 9 16' => 'Olympus M.Zuiko Digital 14-42mm F3.5-5.6 II', #PH (E-PL2)
63 '0 21 0' => 'Olympus Zuiko Digital ED 7-14mm F4.0',
64 '0 23 0' => 'Olympus Zuiko Digital Pro ED 35-100mm F2.0', #7
65 '0 24 0' => 'Olympus Zuiko Digital 14-45mm F3.5-5.6',
66 '0 32 0' => 'Olympus Zuiko Digital 35mm F3.5 Macro', #9
67 '0 34 0' => 'Olympus Zuiko Digital 17.5-45mm F3.5-5.6', #9
68 '0 35 0' => 'Olympus Zuiko Digital ED 14-42mm F3.5-5.6', #PH
69 '0 36 0' => 'Olympus Zuiko Digital ED 40-150mm F4.0-5.6', #PH
70 '0 48 0' => 'Olympus Zuiko Digital ED 50-200mm F2.8-3.5 SWD', #7
71 '0 49 0' => 'Olympus Zuiko Digital ED 12-60mm F2.8-4.0 SWD', #7
72 '0 50 0' => 'Olympus Zuiko Digital ED 14-35mm F2.0 SWD', #PH
73 '0 51 0' => 'Olympus Zuiko Digital 25mm F2.8', #PH
74 '0 52 0' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
75 '0 53 0' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
76 # Sigma lenses
77 '1 1 0' => 'Sigma 18-50mm F3.5-5.6', #8
78 '1 2 0' => 'Sigma 55-200mm F4.0-5.6 DC',
79 '1 3 0' => 'Sigma 18-125mm F3.5-5.6 DC',
80 '1 4 0' => 'Sigma 18-125mm F3.5-5.6', #7
81 '1 5 0' => 'Sigma 30mm F1.4', #10
82 '1 6 0' => 'Sigma 50-500mm F4.0-6.3 EX DG APO HSM RF', #6
83 '1 7 0' => 'Sigma 105mm F2.8 DG', #PH
84 '1 8 0' => 'Sigma 150mm F2.8 DG HSM', #PH
85 '1 16 0' => 'Sigma 24mm F1.8 EX DG Aspherical Macro', #PH
86 '1 17 0' => 'Sigma 135-400mm F4.5-5.6 DG ASP APO RF', #11
87 '1 18 0' => 'Sigma 300-800mm F5.6 EX DG APO', #11
88 '1 20 0' => 'Sigma 50-500mm F4.0-6.3 EX DG APO HSM RF', #11
89 '1 21 0' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11
90 '1 22 0' => 'Sigma 70-200mm F2.8 EX DG Macro HSM II', #11
91 '1 23 0' => 'Sigma 50mm F1.4 EX DG HSM', #11
92 # Leica lenses (ref 11)
93 '2 1 0' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.',
94 '2 1 16' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16
95 '2 2 0' => 'Leica D Summilux 25mm F1.4 Asph.',
96 '2 2 16' => 'Lumix G Vario 45-200mm F4-5.6 Mega OIS', #16
97 '2 3 1' => 'Leica D Vario Elmar 14-50mm F3.8-5.6 Asph.', #14 (L10 kit)
98 '2 3 16' => 'Lumix G Vario HD 14-140mm F4-5.8 Asph. Mega OIS', #16
99 '2 4 0' => 'Leica D Vario Elmar 14-150mm F3.5-5.6', #13
100 '2 4 16' => 'Lumix G Vario 7-14mm F4 Asph.', #PH (E-P1 pre-production)
101 '2 5 16' => 'Lumix G 20mm F1.7 Asph.', #16
102 '2 6 16' => 'Leica DG Macro-Elmarit 45mm F2.8', #PH
103 '2 8 16' => 'Lumix G Fisheye 8mm F3.5', #PH
104 '3 1 0' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.',
105 '3 2 0' => 'Leica D Summilux 25mm F1.4 Asph.',
106);
107
108# ArtFilter and MagicFilter values (ref PH)
109my %filters = (
110 '0' => 'Off',
111 '1' => 'Soft Focus',
112 '2' => 'Pop Art',
113 '3' => 'Pale & Light Color',
114 '4' => 'Light Tone',
115 '5' => 'Pin Hole',
116 '6' => 'Grainy Film',
117 '9' => 'Diorama',
118 '10' => 'Cross Process',
119 '12' => 'Fish Eye',
120 '13' => 'Drawing',
121 # Punk? Sparkle?
122);
123
124# tag information for WAV "Index" tags
125my %indexInfo = (
126 Format => 'int32u',
127 RawConv => '$val == 0xffffffff ? undef : $val',
128 ValueConv => '$val / 1000',
129 PrintConv => 'ConvertDuration($val)',
130);
131
132# Olympus tags
133%Image::ExifTool::Olympus::Main = (
134 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
135 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
136 WRITABLE => 1,
137 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
138#
139# Tags 0x0000 through 0x0103 are the same as Konica/Minolta cameras (ref 3)
140# (removed 0x0101-0x0103 because they weren't supported by my samples - PH)
141#
142 0x0000 => {
143 Name => 'MakerNoteVersion',
144 Writable => 'undef',
145 },
146 0x0001 => {
147 Name => 'MinoltaCameraSettingsOld',
148 SubDirectory => {
149 TagTable => 'Image::ExifTool::Minolta::CameraSettings',
150 ByteOrder => 'BigEndian',
151 },
152 },
153 0x0003 => {
154 Name => 'MinoltaCameraSettings',
155 SubDirectory => {
156 TagTable => 'Image::ExifTool::Minolta::CameraSettings',
157 ByteOrder => 'BigEndian',
158 },
159 },
160 0x0040 => {
161 Name => 'CompressedImageSize',
162 Writable => 'int32u',
163 },
164 0x0081 => {
165 Name => 'PreviewImageData',
166 Binary => 1,
167 Writable => 0,
168 },
169 0x0088 => {
170 Name => 'PreviewImageStart',
171 Flags => 'IsOffset',
172 OffsetPair => 0x0089, # point to associated byte count
173 DataTag => 'PreviewImage',
174 Writable => 0,
175 Protected => 2,
176 },
177 0x0089 => {
178 Name => 'PreviewImageLength',
179 OffsetPair => 0x0088, # point to associated offset
180 DataTag => 'PreviewImage',
181 Writable => 0,
182 Protected => 2,
183 },
184 0x0100 => {
185 Name => 'ThumbnailImage',
186 Writable => 'undef',
187 WriteCheck => '$self->CheckImage(\$val)',
188 Binary => 1,
189 },
190 0x0104 => { #11
191 Name => 'BodyFirmwareVersion',
192 Writable => 'string',
193 },
194#
195# end Konica/Minolta tags
196#
197 0x0200 => {
198 Name => 'SpecialMode',
199 Notes => q{
200 3 numbers: 1. Shooting mode: 0=Normal, 2=Fast, 3=Panorama;
201 2. Sequence Number; 3. Panorama Direction: 1=Left-Right,
202 2=Right-Left, 3=Bottom-Top, 4=Top-Bottom
203 },
204 Writable => 'int32u',
205 Count => 3,
206 PrintConv => sub { #3
207 my $val = shift;
208 my @v = split ' ', $val;
209 return $val unless @v >= 3;
210 my @v0 = ('Normal','Unknown (1)','Fast','Panorama');
211 my @v2 = ('(none)','Left to Right','Right to Left','Bottom to Top','Top to Bottom');
212 $val = $v0[$v[0]] || "Unknown ($v[0])";
213 $val .= ", Sequence: $v[1]";
214 $val .= ', Panorama: ' . ($v2[$v[2]] || "Unknown ($v[2])");
215 return $val;
216 },
217 },
218 0x0201 => {
219 Name => 'Quality',
220 Writable => 'int16u',
221 Notes => q{
222 Quality values are decoded based on the CameraType tag. All types
223 represent SQ, HQ and SHQ as sequential integers, but in general
224 SX-type cameras start with a value of 0 for SQ while others start
225 with 1
226 },
227 # These values are different for different camera types
228 # (can't have Condition based on CameraType because it isn't known
229 # when this tag is extracted)
230 PrintConv => sub {
231 my ($val, $self) = @_;
232 my %t1 = ( # all SX camera types except SX151
233 0 => 'SQ (Low)',
234 1 => 'HQ (Normal)',
235 2 => 'SHQ (Fine)',
236 6 => 'RAW', #PH - C5050WZ
237 );
238 my %t2 = ( # all other types
239 1 => 'SQ (Low)',
240 2 => 'HQ (Normal)',
241 3 => 'SHQ (Fine)',
242 4 => 'RAW',
243 5 => 'Medium-Fine', #PH
244 6 => 'Small-Fine', #PH
245 33 => 'Uncompressed', #PH - C2100Z
246 );
247 my $conv = $self->{CameraType} =~ /^SX(?!151\b)/ ? \%t1 : \%t2;
248 return $$conv{$val} ? $$conv{$val} : "Unknown ($val)";
249 },
250 # (no PrintConvInv because we don't know CameraType at write time)
251 },
252 0x0202 => {
253 Name => 'Macro',
254 Writable => 'int16u',
255 PrintConv => {
256 0 => 'Off',
257 1 => 'On',
258 2 => 'Super Macro', #6
259 },
260 },
261 0x0203 => { #6
262 Name => 'BWMode',
263 Description => 'Black And White Mode',
264 Writable => 'int16u',
265 PrintConv => \%offOn,
266 },
267 0x0204 => {
268 Name => 'DigitalZoom',
269 Writable => 'rational64u',
270 PrintConv => '$val=~/\./ or $val.=".0"; $val',
271 PrintConvInv => '$val',
272 },
273 0x0205 => { #6
274 Name => 'FocalPlaneDiagonal',
275 Writable => 'rational64u',
276 PrintConv => '"$val mm"',
277 PrintConvInv => '$val=~s/\s*mm$//;$val',
278 },
279 0x0206 => { #6
280 Name => 'LensDistortionParams',
281 Writable => 'int16s',
282 Count => 6,
283 },
284 0x0207 => { #PH (was incorrectly FirmwareVersion, ref 1,3)
285 Name => 'CameraType',
286 Writable => 'string',
287 DataMember => 'CameraType',
288 RawConv => '$self->{CameraType} = $val',
289 },
290 0x0208 => {
291 Name => 'TextInfo',
292 SubDirectory => {
293 TagTable => 'Image::ExifTool::Olympus::TextInfo',
294 },
295 },
296 0x0209 => {
297 Name => 'CameraID',
298 Format => 'string', # this really should have been a string
299 },
300 0x020b => { #PH
301 Name => 'EpsonImageWidth',
302 Writable => 'int16u',
303 },
304 0x020c => { #PH
305 Name => 'EpsonImageHeight',
306 Writable => 'int16u',
307 },
308 0x020d => { #PH
309 Name => 'EpsonSoftware',
310 Writable => 'string',
311 },
312 0x0280 => { #PH
313 %Image::ExifTool::previewImageTagInfo,
314 Notes => 'found in ERF and JPG images from some Epson models',
315 Format => 'undef',
316 Writable => 'int8u',
317 },
318 0x0300 => { #6
319 Name => 'PreCaptureFrames',
320 Writable => 'int16u',
321 },
322 0x0301 => { #11
323 Name => 'WhiteBoard',
324 Writable => 'int16u',
325 },
326 0x0302 => { #6
327 Name => 'OneTouchWB',
328 Writable => 'int16u',
329 PrintConv => {
330 0 => 'Off',
331 1 => 'On',
332 2 => 'On (Preset)',
333 },
334 },
335 0x0303 => { #11
336 Name => 'WhiteBalanceBracket',
337 Writable => 'int16u',
338 },
339 0x0304 => { #11
340 Name => 'WhiteBalanceBias',
341 Writable => 'int16u',
342 },
343 # 0x0305 => 'PrintMaching', ? #11
344 0x0403 => { #11
345 Name => 'SceneMode',
346 Writable => 'int16u',
347 PrintConv => {
348 0 => 'Normal',
349 1 => 'Standard',
350 2 => 'Auto',
351 3 => 'Intelligent Auto', #PH (guess, u7040)
352 4 => 'Portrait',
353 5 => 'Landscape+Portrait',
354 6 => 'Landscape',
355 7 => 'Night Scene',
356 8 => 'Night+Portrait',
357 9 => 'Sport',
358 10 => 'Self Portrait',
359 11 => 'Indoor',
360 12 => 'Beach & Snow',
361 13 => 'Beach',
362 14 => 'Snow',
363 15 => 'Self Portrait+Self Timer',
364 16 => 'Sunset',
365 17 => 'Cuisine',
366 18 => 'Documents',
367 19 => 'Candle',
368 20 => 'Fireworks',
369 21 => 'Available Light',
370 22 => 'Vivid',
371 23 => 'Underwater Wide1',
372 24 => 'Underwater Macro',
373 25 => 'Museum',
374 26 => 'Behind Glass',
375 27 => 'Auction',
376 28 => 'Shoot & Select1',
377 29 => 'Shoot & Select2',
378 30 => 'Underwater Wide2',
379 31 => 'Digital Image Stabilization',
380 32 => 'Face Portrait',
381 33 => 'Pet',
382 34 => 'Smile Shot',
383 101 => 'Magic Filter', #PH
384 },
385 },
386 0x0404 => { #PH (D595Z, C7070WZ)
387 Name => 'SerialNumber',
388 Writable => 'string',
389 },
390 0x0405 => { #11
391 Name => 'Firmware',
392 Writable => 'string',
393 },
394 0x0e00 => {
395 Name => 'PrintIM',
396 Description => 'Print Image Matching',
397 Writable => 0,
398 SubDirectory => {
399 TagTable => 'Image::ExifTool::PrintIM::Main',
400 },
401 },
402 0x0f00 => {
403 Name => 'DataDump',
404 Writable => 0,
405 Binary => 1,
406 },
407 0x0f01 => { #6
408 Name => 'DataDump2',
409 Writable => 0,
410 Binary => 1,
411 },
412 0x0f04 => {
413 Name => 'ZoomedPreviewStart',
414 # NOTE: this tag is not currently updated properly when the image is rewritten!
415 OffsetPair => 0xf05,
416 DataTag => 'ZoomedPreviewImage',
417 Writable => 'int32u',
418 Protected => 2,
419 },
420 0x0f05 => {
421 Name => 'ZoomedPreviewLength',
422 OffsetPair => 0xf04,
423 DataTag => 'ZoomedPreviewImage',
424 Writable => 'int32u',
425 Protected => 2,
426 },
427 0x0f06 => {
428 Name => 'ZoomedPreviewSize',
429 Writable => 'int16u',
430 Count => 2,
431 },
432 0x1000 => { #6
433 Name => 'ShutterSpeedValue',
434 Writable => 'rational64s',
435 Priority => 0,
436 ValueConv => 'abs($val)<100 ? 2**(-$val) : 0',
437 ValueConvInv => '$val>0 ? -log($val)/log(2) : -100',
438 PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
439 PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
440 },
441 0x1001 => { #6
442 Name => 'ISOValue',
443 Writable => 'rational64s',
444 Priority => 0,
445 ValueConv => '100 * 2 ** ($val - 5)',
446 ValueConvInv => '$val>0 ? log($val/100)/log(2)+5 : 0',
447 PrintConv => 'int($val * 100 + 0.5) / 100',
448 PrintConvInv => '$val',
449 },
450 0x1002 => { #6
451 Name => 'ApertureValue',
452 Writable => 'rational64s',
453 Priority => 0,
454 ValueConv => '2 ** ($val / 2)',
455 ValueConvInv => '$val>0 ? 2*log($val)/log(2) : 0',
456 PrintConv => 'sprintf("%.1f",$val)',
457 PrintConvInv => '$val',
458 },
459 0x1003 => { #6
460 Name => 'BrightnessValue',
461 Writable => 'rational64s',
462 Priority => 0,
463 },
464 0x1004 => { #3
465 Name => 'FlashMode',
466 Writable => 'int16u',
467 PrintConv => {
468 2 => 'On', #PH
469 3 => 'Off', #PH
470 },
471 },
472 0x1005 => { #6
473 Name => 'FlashDevice',
474 Writable => 'int16u',
475 PrintConv => {
476 0 => 'None',
477 1 => 'Internal',
478 4 => 'External',
479 5 => 'Internal + External',
480 },
481 },
482 0x1006 => { #6
483 Name =>'ExposureCompensation',
484 Writable => 'rational64s',
485 },
486 0x1007 => { #6 (E-10, E-20 and C2500L - numbers usually around 30-40)
487 Name => 'SensorTemperature',
488 Writable => 'int16s',
489 },
490 0x1008 => { #6
491 Name => 'LensTemperature',
492 Writable => 'int16s',
493 },
494 0x1009 => { #11
495 Name => 'LightCondition',
496 Writable => 'int16u',
497 },
498 0x100a => { #11
499 Name => 'FocusRange',
500 Writable => 'int16u',
501 PrintConv => {
502 0 => 'Normal',
503 1 => 'Macro',
504 },
505 },
506 0x100b => { #6
507 Name => 'FocusMode',
508 Writable => 'int16u',
509 PrintConv => {
510 0 => 'Auto',
511 1 => 'Manual',
512 },
513 },
514 0x100c => { #6
515 Name => 'ManualFocusDistance',
516 Writable => 'rational64u',
517 PrintConv => '"$val mm"', #11
518 PrintConvInv => '$val=~s/\s*mm$//; $val',
519 },
520 0x100d => { #6
521 Name => 'ZoomStepCount',
522 Writable => 'int16u',
523 },
524 0x100e => { #6
525 Name => 'FocusStepCount',
526 Writable => 'int16u',
527 },
528 0x100f => { #6
529 Name => 'Sharpness',
530 Writable => 'int16u',
531 Priority => 0,
532 PrintConv => {
533 0 => 'Normal',
534 1 => 'Hard',
535 2 => 'Soft',
536 },
537 },
538 0x1010 => { #6
539 Name => 'FlashChargeLevel',
540 Writable => 'int16u',
541 },
542 0x1011 => { #3
543 Name => 'ColorMatrix',
544 Writable => 'int16u',
545 Format => 'int16s',
546 Count => 9,
547 },
548 0x1012 => { #3
549 Name => 'BlackLevel',
550 Writable => 'int16u',
551 Count => 4,
552 },
553 0x1013 => { #11
554 Name => 'ColorTemperatureBG',
555 Writable => 'int16u',
556 Unknown => 1, # (doesn't look like a temperature)
557 },
558 0x1014 => { #11
559 Name => 'ColorTemperatureRG',
560 Writable => 'int16u',
561 Unknown => 1, # (doesn't look like a temperature)
562 },
563 0x1015 => { #6
564 Name => 'WBMode',
565 Writable => 'int16u',
566 Count => 2,
567 PrintConv => {
568 '1' => 'Auto',
569 '1 0' => 'Auto',
570 '1 2' => 'Auto (2)',
571 '1 4' => 'Auto (4)',
572 '2 2' => '3000 Kelvin',
573 '2 3' => '3700 Kelvin',
574 '2 4' => '4000 Kelvin',
575 '2 5' => '4500 Kelvin',
576 '2 6' => '5500 Kelvin',
577 '2 7' => '6500 Kelvin',
578 '2 8' => '7500 Kelvin',
579 '3 0' => 'One-touch',
580 },
581 },
582 0x1017 => { #2
583 Name => 'RedBalance',
584 Writable => 'int16u',
585 Count => 2,
586 ValueConv => '$val=~s/ .*//; $val / 256',
587 ValueConvInv => '$val*=256;"$val 64"',
588 },
589 0x1018 => { #2
590 Name => 'BlueBalance',
591 Writable => 'int16u',
592 Count => 2,
593 ValueConv => '$val=~s/ .*//; $val / 256',
594 ValueConvInv => '$val*=256;"$val 64"',
595 },
596 0x1019 => { #11
597 Name => 'ColorMatrixNumber',
598 Writable => 'int16u',
599 },
600 # 0x101a is same as CameraID ("OLYMPUS DIGITAL CAMERA") for C2500L - PH
601 0x101a => { #3
602 Name => 'SerialNumber',
603 Writable => 'string',
604 },
605 0x101b => { #11
606 Name => 'ExternalFlashAE1_0',
607 Writable => 'int32u',
608 Unknown => 1, # (what are these?)
609 },
610 0x101c => { #11
611 Name => 'ExternalFlashAE2_0',
612 Writable => 'int32u',
613 Unknown => 1,
614 },
615 0x101d => { #11
616 Name => 'InternalFlashAE1_0',
617 Writable => 'int32u',
618 Unknown => 1,
619 },
620 0x101e => { #11
621 Name => 'InternalFlashAE2_0',
622 Writable => 'int32u',
623 Unknown => 1,
624 },
625 0x101f => { #11
626 Name => 'ExternalFlashAE1',
627 Writable => 'int32u',
628 Unknown => 1,
629 },
630 0x1020 => { #11
631 Name => 'ExternalFlashAE2',
632 Writable => 'int32u',
633 Unknown => 1,
634 },
635 0x1021 => { #11
636 Name => 'InternalFlashAE1',
637 Writable => 'int32u',
638 Unknown => 1,
639 },
640 0x1022 => { #11
641 Name => 'InternalFlashAE2',
642 Writable => 'int32u',
643 Unknown => 1,
644 },
645 0x1023 => { #6
646 Name => 'FlashExposureComp',
647 Writable => 'rational64s',
648 },
649 0x1024 => { #11
650 Name => 'InternalFlashTable',
651 Writable => 'int16u',
652 },
653 0x1025 => { #11
654 Name => 'ExternalFlashGValue',
655 Writable => 'rational64s',
656 },
657 0x1026 => { #6
658 Name => 'ExternalFlashBounce',
659 Writable => 'int16u',
660 PrintConv => {
661 0 => 'No',
662 1 => 'Yes',
663 },
664 },
665 0x1027 => { #6
666 Name => 'ExternalFlashZoom',
667 Writable => 'int16u',
668 },
669 0x1028 => { #6
670 Name => 'ExternalFlashMode',
671 Writable => 'int16u',
672 },
673 0x1029 => { #3
674 Name => 'Contrast',
675 Writable => 'int16u',
676 PrintConv => { #PH (works with E1)
677 0 => 'High',
678 1 => 'Normal',
679 2 => 'Low',
680 },
681 },
682 0x102a => { #3
683 Name => 'SharpnessFactor',
684 Writable => 'int16u',
685 },
686 0x102b => { #3
687 Name => 'ColorControl',
688 Writable => 'int16u',
689 Count => 6,
690 },
691 0x102c => { #3
692 Name => 'ValidBits',
693 Writable => 'int16u',
694 Count => 2,
695 },
696 0x102d => { #3
697 Name => 'CoringFilter',
698 Writable => 'int16u',
699 },
700 0x102e => { #PH
701 Name => 'OlympusImageWidth',
702 Writable => 'int32u',
703 },
704 0x102f => { #PH
705 Name => 'OlympusImageHeight',
706 Writable => 'int32u',
707 },
708 0x1030 => { #11
709 Name => 'SceneDetect',
710 Writable => 'int16u',
711 },
712 0x1031 => { #11
713 Name => 'SceneArea',
714 Writable => 'int32u',
715 Count => 8,
716 Unknown => 1, # (numbers don't make much sense?)
717 },
718 # 0x1032 HAFFINAL? #11
719 0x1033 => { #11
720 Name => 'SceneDetectData',
721 Writable => 'int32u',
722 Count => 720,
723 Binary => 1,
724 Unknown => 1, # (but what does it mean?)
725 },
726 0x1034 => { #3
727 Name => 'CompressionRatio',
728 Writable => 'rational64u',
729 },
730 0x1035 => { #6
731 Name => 'PreviewImageValid',
732 Writable => 'int32u',
733 PrintConv => { 0 => 'No', 1 => 'Yes' },
734 },
735 0x1036 => { #6
736 Name => 'PreviewImageStart',
737 Flags => 'IsOffset',
738 OffsetPair => 0x1037, # point to associated byte count
739 DataTag => 'PreviewImage',
740 Writable => 'int32u',
741 Protected => 2,
742 },
743 0x1037 => { #6
744 # (may contain data from multiple previews - PH, FE320)
745 Name => 'PreviewImageLength',
746 OffsetPair => 0x1036, # point to associated offset
747 DataTag => 'PreviewImage',
748 Writable => 'int32u',
749 Protected => 2,
750 },
751 0x1038 => { #11
752 Name => 'AFResult',
753 Writable => 'int16u',
754 },
755 0x1039 => { #6
756 Name => 'CCDScanMode',
757 Writable => 'int16u',
758 PrintConv => {
759 0 => 'Interlaced',
760 1 => 'Progressive',
761 },
762 },
763 0x103a => { #6
764 Name => 'NoiseReduction',
765 Writable => 'int16u',
766 PrintConv => \%offOn,
767 },
768 0x103b => { #6
769 Name => 'FocusStepInfinity',
770 Writable => 'int16u',
771 },
772 0x103c => { #6
773 Name => 'FocusStepNear',
774 Writable => 'int16u',
775 },
776 0x103d => { #11
777 Name => 'LightValueCenter',
778 Writable => 'rational64s',
779 },
780 0x103e => { #11
781 Name => 'LightValuePeriphery',
782 Writable => 'rational64s',
783 },
784 0x103f => { #11
785 Name => 'FieldCount',
786 Writable => 'int16u',
787 Unknown => 1, # (but what does it mean?)
788 },
789#
790# Olympus really screwed up the format of the following subdirectories (for the
791# E-1 and E-300 anyway). Not only is the subdirectory value data not included in
792# the size, but also the count is 2 bytes short for the subdirectory itself
793# (presumably the Olympus programmers forgot about the 2-byte entry count at the
794# start of the subdirectory). This mess is straightened out and these subdirs
795# are written properly when ExifTool rewrites the file. Note that this problem
796# has been fixed by Olympus in the new-style IFD maker notes since a standard
797# SubIFD offset value is used. As written by the camera, the old style
798# directories have format 'undef' or 'string', and the new style has format
799# 'ifd'. However, some older versions of exiftool may have rewritten the new
800# style as 'int32u', so handle both cases. - PH
801#
802 0x2010 => [ #PH
803 {
804 Name => 'Equipment',
805 Condition => '$format ne "ifd" and $format ne "int32u"',
806 NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced)
807 SubDirectory => {
808 TagTable => 'Image::ExifTool::Olympus::Equipment',
809 ByteOrder => 'Unknown',
810 },
811 },
812 {
813 Name => 'EquipmentIFD',
814 Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
815 Flags => 'SubIFD',
816 FixFormat => 'ifd',
817 SubDirectory => {
818 TagTable => 'Image::ExifTool::Olympus::Equipment',
819 Start => '$val',
820 },
821 },
822 ],
823 0x2020 => [ #PH
824 {
825 Name => 'CameraSettings',
826 Condition => '$format ne "ifd" and $format ne "int32u"',
827 NestedHtmlDump => 2,
828 SubDirectory => {
829 TagTable => 'Image::ExifTool::Olympus::CameraSettings',
830 ByteOrder => 'Unknown',
831 },
832 },
833 {
834 Name => 'CameraSettingsIFD',
835 Groups => { 1 => 'MakerNotes' },
836 Flags => 'SubIFD',
837 FixFormat => 'ifd',
838 SubDirectory => {
839 TagTable => 'Image::ExifTool::Olympus::CameraSettings',
840 Start => '$val',
841 },
842 },
843 ],
844 0x2030 => [ #PH
845 {
846 Name => 'RawDevelopment',
847 Condition => '$format ne "ifd" and $format ne "int32u"',
848 NestedHtmlDump => 2,
849 SubDirectory => {
850 TagTable => 'Image::ExifTool::Olympus::RawDevelopment',
851 ByteOrder => 'Unknown',
852 },
853 },
854 {
855 Name => 'RawDevelopmentIFD',
856 Groups => { 1 => 'MakerNotes' },
857 Flags => 'SubIFD',
858 FixFormat => 'ifd',
859 SubDirectory => {
860 TagTable => 'Image::ExifTool::Olympus::RawDevelopment',
861 Start => '$val',
862 },
863 },
864 ],
865 0x2031 => [ #11
866 {
867 Name => 'RawDev2',
868 Condition => '$format ne "ifd" and $format ne "int32u"',
869 NestedHtmlDump => 2,
870 SubDirectory => {
871 TagTable => 'Image::ExifTool::Olympus::RawDevelopment2',
872 ByteOrder => 'Unknown',
873 },
874 },
875 {
876 Name => 'RawDev2IFD',
877 Groups => { 1 => 'MakerNotes' },
878 Flags => 'SubIFD',
879 FixFormat => 'ifd',
880 SubDirectory => {
881 TagTable => 'Image::ExifTool::Olympus::RawDevelopment2',
882 Start => '$val',
883 },
884 },
885 ],
886 0x2040 => [ #PH
887 {
888 Name => 'ImageProcessing',
889 Condition => '$format ne "ifd" and $format ne "int32u"',
890 NestedHtmlDump => 2,
891 SubDirectory => {
892 TagTable => 'Image::ExifTool::Olympus::ImageProcessing',
893 ByteOrder => 'Unknown',
894 },
895 },
896 {
897 Name => 'ImageProcessingIFD',
898 Groups => { 1 => 'MakerNotes' },
899 Flags => 'SubIFD',
900 FixFormat => 'ifd',
901 SubDirectory => {
902 TagTable => 'Image::ExifTool::Olympus::ImageProcessing',
903 Start => '$val',
904 },
905 },
906 ],
907 0x2050 => [ #PH
908 {
909 Name => 'FocusInfo',
910 Condition => '$format ne "ifd" and $format ne "int32u" and not $$self{OlympusCAMER}',
911 NestedHtmlDump => 2,
912 SubDirectory => {
913 TagTable => 'Image::ExifTool::Olympus::FocusInfo',
914 ByteOrder => 'Unknown',
915 },
916 },
917 {
918 Name => 'FocusInfoIFD',
919 Condition => 'not $$self{OlympusCAMER}',
920 Groups => { 1 => 'MakerNotes' },
921 Flags => 'SubIFD',
922 FixFormat => 'ifd',
923 SubDirectory => {
924 TagTable => 'Image::ExifTool::Olympus::FocusInfo',
925 Start => '$val',
926 },
927 },
928 {
929 # ASCII-based camera parameters if makernotes starts with "CAMER\0"
930 # (or for Sony models starting with "SONY PI\0" or "PREMI\0")
931 Name => 'CameraParameters',
932 Writable => 'undef',
933 Binary => 1,
934 },
935 ],
936 0x2100 => [
937 { #11
938 Name => 'Olympus2100',
939 Condition => '$format ne "ifd" and $format ne "int32u"',
940 NestedHtmlDump => 2,
941 SubDirectory => {
942 TagTable => 'Image::ExifTool::Olympus::FETags',
943 ByteOrder => 'Unknown',
944 },
945 },
946 { #PH
947 Name => 'Olympus2100IFD',
948 Groups => { 1 => 'MakerNotes' },
949 Flags => 'SubIFD',
950 FixFormat => 'ifd',
951 SubDirectory => {
952 TagTable => 'Image::ExifTool::Olympus::FETags',
953 ByteOrder => 'Unknown',
954 Start => '$val',
955 },
956 },
957 ],
958 0x2200 => [
959 { #11
960 Name => 'Olympus2200',
961 Condition => '$format ne "ifd" and $format ne "int32u"',
962 NestedHtmlDump => 2,
963 SubDirectory => {
964 TagTable => 'Image::ExifTool::Olympus::FETags',
965 ByteOrder => 'Unknown',
966 },
967 },
968 { #PH
969 Name => 'Olympus2200IFD',
970 Groups => { 1 => 'MakerNotes' },
971 Flags => 'SubIFD',
972 FixFormat => 'ifd',
973 SubDirectory => {
974 TagTable => 'Image::ExifTool::Olympus::FETags',
975 ByteOrder => 'Unknown',
976 Start => '$val',
977 },
978 },
979 ],
980 0x2300 => [
981 { #11
982 Name => 'Olympus2300',
983 Condition => '$format ne "ifd" and $format ne "int32u"',
984 NestedHtmlDump => 2,
985 SubDirectory => {
986 TagTable => 'Image::ExifTool::Olympus::FETags',
987 ByteOrder => 'Unknown',
988 },
989 },
990 { #PH
991 Name => 'Olympus2300IFD',
992 Groups => { 1 => 'MakerNotes' },
993 Flags => 'SubIFD',
994 FixFormat => 'ifd',
995 SubDirectory => {
996 TagTable => 'Image::ExifTool::Olympus::FETags',
997 ByteOrder => 'Unknown',
998 Start => '$val',
999 },
1000 },
1001 ],
1002 0x2400 => [
1003 { #11
1004 Name => 'Olympus2400',
1005 Condition => '$format ne "ifd" and $format ne "int32u"',
1006 NestedHtmlDump => 2,
1007 SubDirectory => {
1008 TagTable => 'Image::ExifTool::Olympus::FETags',
1009 ByteOrder => 'Unknown',
1010 },
1011 },
1012 { #PH
1013 Name => 'Olympus2400IFD',
1014 Groups => { 1 => 'MakerNotes' },
1015 Flags => 'SubIFD',
1016 FixFormat => 'ifd',
1017 SubDirectory => {
1018 TagTable => 'Image::ExifTool::Olympus::FETags',
1019 ByteOrder => 'Unknown',
1020 Start => '$val',
1021 },
1022 },
1023 ],
1024 0x2500 => [
1025 { #11
1026 Name => 'Olympus2500',
1027 Condition => '$format ne "ifd" and $format ne "int32u"',
1028 NestedHtmlDump => 2,
1029 SubDirectory => {
1030 TagTable => 'Image::ExifTool::Olympus::FETags',
1031 ByteOrder => 'Unknown',
1032 },
1033 },
1034 { #PH
1035 Name => 'Olympus2500IFD',
1036 Groups => { 1 => 'MakerNotes' },
1037 Flags => 'SubIFD',
1038 FixFormat => 'ifd',
1039 SubDirectory => {
1040 TagTable => 'Image::ExifTool::Olympus::FETags',
1041 ByteOrder => 'Unknown',
1042 Start => '$val',
1043 },
1044 },
1045 ],
1046 0x2600 => [
1047 { #11
1048 Name => 'Olympus2600',
1049 Condition => '$format ne "ifd" and $format ne "int32u"',
1050 NestedHtmlDump => 2,
1051 SubDirectory => {
1052 TagTable => 'Image::ExifTool::Olympus::FETags',
1053 ByteOrder => 'Unknown',
1054 },
1055 },
1056 { #PH
1057 Name => 'Olympus2600IFD',
1058 Groups => { 1 => 'MakerNotes' },
1059 Flags => 'SubIFD',
1060 FixFormat => 'ifd',
1061 SubDirectory => {
1062 TagTable => 'Image::ExifTool::Olympus::FETags',
1063 ByteOrder => 'Unknown',
1064 Start => '$val',
1065 },
1066 },
1067 ],
1068 0x2700 => [
1069 { #11
1070 Name => 'Olympus2700',
1071 Condition => '$format ne "ifd" and $format ne "int32u"',
1072 NestedHtmlDump => 2,
1073 SubDirectory => {
1074 TagTable => 'Image::ExifTool::Olympus::FETags',
1075 ByteOrder => 'Unknown',
1076 },
1077 },
1078 { #PH
1079 Name => 'Olympus2700IFD',
1080 Groups => { 1 => 'MakerNotes' },
1081 Flags => 'SubIFD',
1082 FixFormat => 'ifd',
1083 SubDirectory => {
1084 TagTable => 'Image::ExifTool::Olympus::FETags',
1085 ByteOrder => 'Unknown',
1086 Start => '$val',
1087 },
1088 },
1089 ],
1090 0x2800 => [
1091 { #11
1092 Name => 'Olympus2800',
1093 Condition => '$format ne "ifd" and $format ne "int32u"',
1094 NestedHtmlDump => 2,
1095 SubDirectory => {
1096 TagTable => 'Image::ExifTool::Olympus::FETags',
1097 ByteOrder => 'Unknown',
1098 },
1099 },
1100 { #PH
1101 Name => 'Olympus2800IFD',
1102 Groups => { 1 => 'MakerNotes' },
1103 Flags => 'SubIFD',
1104 FixFormat => 'ifd',
1105 SubDirectory => {
1106 TagTable => 'Image::ExifTool::Olympus::FETags',
1107 ByteOrder => 'Unknown',
1108 Start => '$val',
1109 },
1110 },
1111 ],
1112 0x2900 => [
1113 { #11
1114 Name => 'Olympus2900',
1115 Condition => '$format ne "ifd" and $format ne "int32u"',
1116 NestedHtmlDump => 2,
1117 SubDirectory => {
1118 TagTable => 'Image::ExifTool::Olympus::FETags',
1119 ByteOrder => 'Unknown',
1120 },
1121 },
1122 { #PH
1123 Name => 'Olympus2900IFD',
1124 Groups => { 1 => 'MakerNotes' },
1125 Flags => 'SubIFD',
1126 FixFormat => 'ifd',
1127 SubDirectory => {
1128 TagTable => 'Image::ExifTool::Olympus::FETags',
1129 ByteOrder => 'Unknown',
1130 Start => '$val',
1131 },
1132 },
1133 ],
1134 0x3000 => [
1135 { #6
1136 Name => 'RawInfo',
1137 Condition => '$format ne "ifd" and $format ne "int32u"',
1138 NestedHtmlDump => 2,
1139 SubDirectory => {
1140 TagTable => 'Image::ExifTool::Olympus::RawInfo',
1141 ByteOrder => 'Unknown',
1142 },
1143 },
1144 { #PH
1145 Name => 'RawInfoIFD',
1146 Groups => { 1 => 'MakerNotes' },
1147 Flags => 'SubIFD',
1148 FixFormat => 'ifd',
1149 SubDirectory => {
1150 TagTable => 'Image::ExifTool::Olympus::RawInfo',
1151 Start => '$val',
1152 },
1153 },
1154 ],
1155 0x4000 => [ #PH
1156 {
1157 Name => 'MainInfo',
1158 Condition => '$format ne "ifd" and $format ne "int32u"',
1159 NestedHtmlDump => 2,
1160 SubDirectory => {
1161 TagTable => 'Image::ExifTool::Olympus::Main',
1162 ByteOrder => 'Unknown',
1163 },
1164 },
1165 {
1166 Name => 'MainInfoIFD',
1167 Groups => { 1 => 'MakerNotes' },
1168 Flags => 'SubIFD',
1169 FixFormat => 'ifd',
1170 SubDirectory => {
1171 TagTable => 'Image::ExifTool::Olympus::Main',
1172 Start => '$val',
1173 },
1174 },
1175 ],
1176 0x5000 => [ #PH
1177 {
1178 Name => 'UnknownInfo',
1179 Condition => '$format ne "ifd" and $format ne "int32u"',
1180 NestedHtmlDump => 2,
1181 SubDirectory => {
1182 TagTable => 'Image::ExifTool::Olympus::UnknownInfo',
1183 ByteOrder => 'Unknown',
1184 },
1185 },
1186 {
1187 Name => 'UnknownInfoIFD',
1188 Groups => { 1 => 'MakerNotes' },
1189 Flags => 'SubIFD',
1190 FixFormat => 'ifd',
1191 SubDirectory => {
1192 TagTable => 'Image::ExifTool::Olympus::UnknownInfo',
1193 Start => '$val',
1194 },
1195 },
1196 ],
1197);
1198
1199# TextInfo tags
1200%Image::ExifTool::Olympus::TextInfo = (
1201 PROCESS_PROC => \&Image::ExifTool::APP12::ProcessAPP12,
1202 NOTES => q{
1203 This information is in text format (similar to APP12 information, but with
1204 spaces instead of linefeeds). Below are tags which have been observed, but
1205 any information found here will be extracted, even if the tag is not listed.
1206 },
1207 GROUPS => { 0 => 'MakerNotes', 1 => 'Olympus', 2 => 'Image' },
1208 Resolution => { },
1209 Type => {
1210 Name => 'CameraType',
1211 Groups => { 2 => 'Camera' },
1212 DataMember => 'CameraType',
1213 RawConv => '$self->{CameraType} = $val',
1214 },
1215);
1216
1217# Olympus Equipment IFD
1218%Image::ExifTool::Olympus::Equipment = (
1219 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1220 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1221 WRITABLE => 1,
1222 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1223 0x000 => { #PH
1224 Name => 'EquipmentVersion',
1225 Writable => 'undef',
1226 RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
1227 Count => 4,
1228 },
1229 0x100 => { #6
1230 Name => 'CameraType2',
1231 Writable => 'string',
1232 Count => 6,
1233 },
1234 0x101 => { #PH
1235 Name => 'SerialNumber',
1236 Writable => 'string',
1237 Count => 32,
1238 PrintConv => '$val=~s/\s+$//;$val',
1239 PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars
1240 },
1241 0x102 => { #6
1242 Name => 'InternalSerialNumber',
1243 Notes => '16 digits: 0-3=model, 4=year, 5-6=month, 8-12=unit number',
1244 Writable => 'string',
1245 Count => 32,
1246 },
1247 0x103 => { #6
1248 Name => 'FocalPlaneDiagonal',
1249 Writable => 'rational64u',
1250 PrintConv => '"$val mm"',
1251 PrintConvInv => '$val=~s/\s*mm$//;$val',
1252 },
1253 0x104 => { #6
1254 Name => 'BodyFirmwareVersion',
1255 Writable => 'int32u',
1256 PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1257 PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1258 },
1259 0x201 => { #6
1260 Name => 'LensType',
1261 Writable => 'int8u',
1262 Count => 6,
1263 Notes => q{
1264 6 numbers: 0. Make, 1. Unknown, 2. Model, 3. Sub-model, 4-5. Unknown. Only
1265 the Make, Model and Sub-model are used to determine the lens model
1266 },
1267 SeparateTable => 'LensType',
1268 # Have seen these values for the unknown numbers:
1269 # 1: 0
1270 # 4: 0, 2(Olympus lenses for which I have also seen 0 for this number)
1271 # 5: 0, 16(new Lumix lenses)
1272 ValueConv => 'my @a = split(" ",$val); "$a[0] $a[2] $a[3]"',
1273 # set unknown values to zero when writing
1274 ValueConvInv => 'my @a=split(" ",$val); "$a[0] 0 $a[1] $a[2] 0 0"',
1275 PrintConv => \%olympusLensTypes,
1276 },
1277 # apparently the first 3 digits of the lens s/n give the type (ref 4):
1278 # 010 = 50macro
1279 # 040 = EC-14
1280 # 050 = 14-54
1281 # 060 = 50-200
1282 # 080 = EX-25
1283 # 101 = FL-50
1284 # 272 = EC-20 #7
1285 0x202 => { #PH
1286 Name => 'LensSerialNumber',
1287 Writable => 'string',
1288 Count => 32,
1289 PrintConv => '$val=~s/\s+$//;$val',
1290 PrintConvInv => 'pack("A31",$val)', # pad with spaces to 31 chars
1291 },
1292 0x203 => { #17
1293 Name => 'LensModel',
1294 Writable => 'string',
1295 },
1296 0x204 => { #6
1297 Name => 'LensFirmwareVersion',
1298 Writable => 'int32u',
1299 PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1300 PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1301 },
1302 0x205 => { #11
1303 Name => 'MaxApertureAtMinFocal',
1304 Writable => 'int16u',
1305 ValueConv => '$val ? sqrt(2)**($val/256) : 0',
1306 ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
1307 PrintConv => 'sprintf("%.1f",$val)',
1308 PrintConvInv => '$val',
1309 },
1310 0x206 => { #5
1311 Name => 'MaxApertureAtMaxFocal',
1312 Writable => 'int16u',
1313 ValueConv => '$val ? sqrt(2)**($val/256) : 0',
1314 ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
1315 PrintConv => 'sprintf("%.1f",$val)',
1316 PrintConvInv => '$val',
1317 },
1318 0x207 => { #PH
1319 Name => 'MinFocalLength',
1320 Writable => 'int16u',
1321 },
1322 0x208 => { #PH
1323 Name => 'MaxFocalLength',
1324 Writable => 'int16u',
1325 },
1326 0x20a => { #9
1327 Name => 'MaxApertureAtCurrentFocal',
1328 Writable => 'int16u',
1329 ValueConv => '$val ? sqrt(2)**($val/256) : 0',
1330 ValueConvInv => '$val>0 ? int(512*log($val)/log(2)+0.5) : 0',
1331 PrintConv => 'sprintf("%.1f",$val)',
1332 PrintConvInv => '$val',
1333 },
1334 0x20b => { #11
1335 Name => 'LensProperties',
1336 Writable => 'int16u',
1337 PrintConv => 'sprintf("0x%x",$val)',
1338 PrintConvInv => '$val',
1339 },
1340 0x301 => { #6
1341 Name => 'Extender',
1342 Writable => 'int8u',
1343 Count => 6,
1344 Notes => q{
1345 6 numbers: 0. Make, 1. Unknown, 2. Model, 3. Sub-model, 4-5. Unknown. Only
1346 the Make and Model are used to determine the extender model
1347 },
1348 ValueConv => 'my @a = split(" ",$val); "$a[0] $a[2]"',
1349 ValueConvInv => 'my @a=split(" ",$val); "$a[0] 0 $a[1] 0 0 0"',
1350 PrintConv => {
1351 '0 0' => 'None',
1352 '0 4' => 'Olympus Zuiko Digital EC-14 1.4x Teleconverter',
1353 '0 8' => 'Olympus EX-25 Extension Tube',
1354 '0 16' => 'Olympus Zuiko Digital EC-20 2.0x Teleconverter', #7
1355 },
1356 },
1357 0x302 => { #4
1358 Name => 'ExtenderSerialNumber',
1359 Writable => 'string',
1360 Count => 32,
1361 },
1362 0x303 => { #9
1363 Name => 'ExtenderModel',
1364 Writable => 'string',
1365 },
1366 0x304 => { #6
1367 Name => 'ExtenderFirmwareVersion',
1368 Writable => 'int32u',
1369 PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1370 PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1371 },
1372 0x1000 => { #6
1373 Name => 'FlashType',
1374 Writable => 'int16u',
1375 PrintConv => {
1376 0 => 'None',
1377 2 => 'Simple E-System',
1378 3 => 'E-System',
1379 },
1380 },
1381 0x1001 => { #6
1382 Name => 'FlashModel',
1383 Writable => 'int16u',
1384 PrintConv => {
1385 0 => 'None',
1386 1 => 'FL-20', # (or subtronic digital or Inon UW flash, ref 11)
1387 2 => 'FL-50', # (or Metzblitz+SCA or Cullmann 34, ref 11)
1388 3 => 'RF-11',
1389 4 => 'TF-22',
1390 5 => 'FL-36',
1391 6 => 'FL-50R', #11 (or Metz mecablitz digital)
1392 7 => 'FL-36R', #11
1393 # have seen value of 9 - PH
1394 },
1395 },
1396 0x1002 => { #6
1397 Name => 'FlashFirmwareVersion',
1398 Writable => 'int32u',
1399 PrintConv => '$val=sprintf("%x",$val);$val=~s/(.{3})$/\.$1/;$val',
1400 PrintConvInv => '$val=sprintf("%.3f",$val);$val=~s/\.//;hex($val)',
1401 },
1402 0x1003 => { #4
1403 Name => 'FlashSerialNumber',
1404 Writable => 'string',
1405 Count => 32,
1406 },
1407);
1408
1409# Olympus camera settings IFD
1410%Image::ExifTool::Olympus::CameraSettings = (
1411 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1412 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1413 WRITABLE => 1,
1414 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1415 0x000 => { #PH
1416 Name => 'CameraSettingsVersion',
1417 Writable => 'undef',
1418 RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
1419 Count => 4,
1420 },
1421 0x100 => { #6
1422 Name => 'PreviewImageValid',
1423 Writable => 'int32u',
1424 PrintConv => { 0 => 'No', 1 => 'Yes' },
1425 },
1426 0x101 => { #PH
1427 Name => 'PreviewImageStart',
1428 Flags => 'IsOffset',
1429 OffsetPair => 0x102,
1430 DataTag => 'PreviewImage',
1431 Writable => 'int32u',
1432 Protected => 2,
1433 },
1434 0x102 => { #PH
1435 Name => 'PreviewImageLength',
1436 OffsetPair => 0x101,
1437 DataTag => 'PreviewImage',
1438 Writable => 'int32u',
1439 Protected => 2,
1440 },
1441 0x200 => { #4
1442 Name => 'ExposureMode',
1443 Writable => 'int16u',
1444 PrintConv => {
1445 1 => 'Manual',
1446 2 => 'Program', #6
1447 3 => 'Aperture-priority AE',
1448 4 => 'Shutter speed priority AE',
1449 5 => 'Program-shift', #6
1450 }
1451 },
1452 0x201 => { #6
1453 Name => 'AELock',
1454 Writable => 'int16u',
1455 PrintConv => \%offOn,
1456 },
1457 0x202 => { #PH/4
1458 Name => 'MeteringMode',
1459 Writable => 'int16u',
1460 PrintConv => {
1461 2 => 'Center-weighted average',
1462 3 => 'Spot',
1463 5 => 'ESP',
1464 261 => 'Pattern+AF', #6
1465 515 => 'Spot+Highlight control', #6
1466 1027 => 'Spot+Shadow control', #6
1467 },
1468 },
1469 0x203 => { #11 (some E-models only)
1470 Name => 'ExposureShift',
1471 Writable => 'rational64s',
1472 },
1473 0x300 => { #6
1474 Name => 'MacroMode',
1475 Writable => 'int16u',
1476 PrintConv => {
1477 0 => 'Off',
1478 1 => 'On',
1479 2 => 'Super Macro', #11
1480 },
1481 },
1482 0x301 => { #6
1483 Name => 'FocusMode',
1484 Writable => 'int16u',
1485 Count => -1,
1486 Notes => '1 or 2 values',
1487 PrintConv => [{
1488 0 => 'Single AF',
1489 1 => 'Sequential shooting AF',
1490 2 => 'Continuous AF',
1491 3 => 'Multi AF',
1492 5 => 'Face detect', #11
1493 10 => 'MF',
1494 }, { BITMASK => { #11
1495 0 => 'S-AF',
1496 2 => 'C-AF',
1497 4 => 'MF',
1498 5 => 'Face detect',
1499 6 => 'Imager AF',
1500 8 => 'AF sensor',
1501 }}],
1502 },
1503 0x302 => { #6
1504 Name => 'FocusProcess',
1505 Writable => 'int16u',
1506 Count => -1,
1507 Notes => '1 or 2 values',
1508 PrintConv => [{
1509 0 => 'AF Not Used',
1510 1 => 'AF Used',
1511 }],
1512 # 2nd value written only by some models (u1050SW, u9000, uT6000, uT6010,
1513 # uT8000, E-30, E-420, E-450, E-520, E-620, E-P1 and E-P2): - PH
1514 # observed values when "AF Not Used": 0, 16
1515 # observed values when "AF Used": 64, 96(face detect on), 256
1516 },
1517 0x303 => { #6
1518 Name => 'AFSearch',
1519 Writable => 'int16u',
1520 PrintConv => {
1521 0 => 'Not Ready',
1522 1 => 'Ready',
1523 },
1524 },
1525 0x304 => { #PH/4
1526 Name => 'AFAreas',
1527 Notes => 'coordinates range from 0 to 255',
1528 Format => 'int32u',
1529 Count => 64,
1530 PrintConv => 'Image::ExifTool::Olympus::PrintAFAreas($val)',
1531 },
1532 0x0305 => { #PH
1533 Name => 'AFPointSelected',
1534 Notes => 'coordinates expressed as a percent',
1535 Format => 'rational64s',
1536 Count => 5,
1537 ValueConv => '$val =~ s/\S* //; $val', # ignore first undefined value
1538 ValueConvInv => '"undef $val"',
1539 PrintConv => q{
1540 return $val if $val =~ /undef/;
1541 sprintf("(%d%%,%d%%) (%d%%,%d%%)", map {$_ * 100} split(" ",$val));
1542 }
1543 },
1544 0x307 => { #15
1545 Name => 'AFFineTuneAdj',
1546 Format => 'int16s',
1547 Count => 3, # not sure what the 3 values mean
1548 },
1549 0x400 => { #6
1550 Name => 'FlashMode',
1551 Writable => 'int16u',
1552 PrintConv => {
1553 0 => 'Off',
1554 BITMASK => {
1555 0 => 'On',
1556 1 => 'Fill-in',
1557 2 => 'Red-eye',
1558 3 => 'Slow-sync',
1559 4 => 'Forced On',
1560 5 => '2nd Curtain',
1561 },
1562 },
1563 },
1564 0x401 => { #6
1565 Name => 'FlashExposureComp',
1566 Writable => 'rational64s',
1567 },
1568 # 0x402 - FlashMode? bit0=TTL, bit2=SuperFP (ref 11)
1569 0x403 => { #11
1570 Name => 'FlashRemoteControl',
1571 Writable => 'int16u',
1572 PrintHex => 1,
1573 PrintConv => {
1574 0 => 'Off',
1575 0x01 => 'Channel 1, Low',
1576 0x02 => 'Channel 2, Low',
1577 0x03 => 'Channel 3, Low',
1578 0x04 => 'Channel 4, Low',
1579 0x09 => 'Channel 1, Mid',
1580 0x0a => 'Channel 2, Mid',
1581 0x0b => 'Channel 3, Mid',
1582 0x0c => 'Channel 4, Mid',
1583 0x11 => 'Channel 1, High',
1584 0x12 => 'Channel 2, High',
1585 0x13 => 'Channel 3, High',
1586 0x14 => 'Channel 4, High',
1587 },
1588 },
1589 0x404 => { #11
1590 Name => 'FlashControlMode',
1591 Writable => 'int16u',
1592 Count => 3,
1593 PrintConv => [{
1594 0 => 'Off',
1595 3 => 'TTL',
1596 4 => 'Auto',
1597 5 => 'Manual',
1598 }],
1599 },
1600 0x405 => { #11
1601 Name => 'FlashIntensity',
1602 Writable => 'rational64s',
1603 Count => 3,
1604 PrintConv => '$val eq "undef undef undef" ? "n/a" : $val',
1605 PrintConvInv => '$val eq "n/a" ? "undef undef undef" : $val',
1606 },
1607 0x406 => { #11
1608 Name => 'ManualFlashStrength',
1609 Writable => 'rational64s',
1610 Count => 3,
1611 PrintConv => '$val eq "undef undef undef" ? "n/a" : $val',
1612 PrintConvInv => '$val eq "n/a" ? "undef undef undef" : $val',
1613 },
1614 0x500 => { #6
1615 Name => 'WhiteBalance2',
1616 Writable => 'int16u',
1617 PrintConv => {
1618 0 => 'Auto',
1619 16 => '7500K (Fine Weather with Shade)',
1620 17 => '6000K (Cloudy)',
1621 18 => '5300K (Fine Weather)',
1622 20 => '3000K (Tungsten light)',
1623 21 => '3600K (Tungsten light-like)',
1624 33 => '6600K (Daylight fluorescent)',
1625 34 => '4500K (Neutral white fluorescent)',
1626 35 => '4000K (Cool white fluorescent)',
1627 48 => '3600K (Tungsten light-like)',
1628 256 => 'Custom WB 1',
1629 257 => 'Custom WB 2',
1630 258 => 'Custom WB 3',
1631 259 => 'Custom WB 4',
1632 512 => 'Custom WB 5400K',
1633 513 => 'Custom WB 2900K',
1634 514 => 'Custom WB 8000K',
1635 },
1636 },
1637 0x501 => { #PH/4
1638 Name => 'WhiteBalanceTemperature',
1639 Writable => 'int16u',
1640 PrintConv => '$val ? $val : "Auto"',
1641 PrintConvInv => '$val=~/^\d+$/ ? $val : 0',
1642 },
1643 0x502 => { #PH/4
1644 Name => 'WhiteBalanceBracket',
1645 Writable => 'int16s',
1646 },
1647 0x503 => { #PH/4/6
1648 Name => 'CustomSaturation',
1649 Writable => 'int16s',
1650 Count => 3,
1651 Notes => '3 numbers: 1. CS Value, 2. Min, 3. Max',
1652 PrintConv => q{
1653 my ($a,$b,$c)=split ' ',$val;
1654 if ($self->{Model} =~ /^E-1\b/) {
1655 $a-=$b; $c-=$b;
1656 return "CS$a (min CS0, max CS$c)";
1657 } else {
1658 return "$a (min $b, max $c)";
1659 }
1660 },
1661 },
1662 0x504 => { #PH/4
1663 Name => 'ModifiedSaturation',
1664 Writable => 'int16u',
1665 PrintConv => {
1666 0 => 'Off',
1667 1 => 'CM1 (Red Enhance)',
1668 2 => 'CM2 (Green Enhance)',
1669 3 => 'CM3 (Blue Enhance)',
1670 4 => 'CM4 (Skin Tones)',
1671 },
1672 },
1673 0x505 => { #PH/4
1674 Name => 'ContrastSetting',
1675 Writable => 'int16s',
1676 Count => 3,
1677 Notes => 'value, min, max',
1678 PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
1679 PrintConvInv => '$val=~tr/-0-9 //dc;$val',
1680 },
1681 0x506 => { #PH/4
1682 Name => 'SharpnessSetting',
1683 Writable => 'int16s',
1684 Count => 3,
1685 Notes => 'value, min, max',
1686 PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
1687 PrintConvInv => '$val=~tr/-0-9 //dc;$val',
1688 },
1689 0x507 => { #PH/4
1690 Name => 'ColorSpace',
1691 Writable => 'int16u',
1692 PrintConv => { #6
1693 0 => 'sRGB',
1694 1 => 'Adobe RGB',
1695 2 => 'Pro Photo RGB',
1696 },
1697 },
1698 0x509 => { #6
1699 Name => 'SceneMode',
1700 Writable => 'int16u',
1701 PrintConv => {
1702 0 => 'Standard',
1703 6 => 'Auto', #6
1704 7 => 'Sport',
1705 8 => 'Portrait',
1706 9 => 'Landscape+Portrait',
1707 10 => 'Landscape',
1708 11 => 'Night Scene',
1709 12 => 'Self Portrait', #11
1710 13 => 'Panorama', #6
1711 14 => '2 in 1', #11
1712 15 => 'Movie', #11
1713 16 => 'Landscape+Portrait', #6
1714 17 => 'Night+Portrait',
1715 18 => 'Indoor', #11 (Party - PH)
1716 19 => 'Fireworks',
1717 20 => 'Sunset',
1718 21 => 'Beauty Skin', #PH
1719 22 => 'Macro',
1720 23 => 'Super Macro', #11
1721 24 => 'Food', #11
1722 25 => 'Documents',
1723 26 => 'Museum',
1724 27 => 'Shoot & Select', #11
1725 28 => 'Beach & Snow',
1726 29 => 'Self Protrait+Timer', #11
1727 30 => 'Candle',
1728 31 => 'Available Light', #11
1729 32 => 'Behind Glass', #11
1730 33 => 'My Mode', #11
1731 34 => 'Pet', #11
1732 35 => 'Underwater Wide1', #6
1733 36 => 'Underwater Macro', #6
1734 37 => 'Shoot & Select1', #11
1735 38 => 'Shoot & Select2', #11
1736 39 => 'High Key',
1737 40 => 'Digital Image Stabilization', #6
1738 41 => 'Auction', #11
1739 42 => 'Beach', #11
1740 43 => 'Snow', #11
1741 44 => 'Underwater Wide2', #6
1742 45 => 'Low Key', #6
1743 46 => 'Children', #6
1744 47 => 'Vivid', #11
1745 48 => 'Nature Macro', #6
1746 49 => 'Underwater Snapshot', #11
1747 50 => 'Shooting Guide', #11
1748 51 => 'Face Portrait', #PH (NC)
1749 52 => 'Smile Shot', #PH (NC)
1750 53 => 'Quick Shutter', #PH (NC)
1751 54 => 'Slow Shutter', #PH (NC)
1752 55 => 'Bird Watching', #PH (NC)
1753 56 => 'Multiple Exposure', #PH (NC)
1754 57 => 'e-Portrait', #PH (NC)
1755 58 => 'Beauty Fix', #PH (NC)
1756 59 => 'Soft Background', #PH (NC)
1757 },
1758 },
1759 0x50a => { #PH/4/6
1760 Name => 'NoiseReduction',
1761 Writable => 'int16u',
1762 PrintConv => {
1763 BITMASK => {
1764 0 => 'Noise Reduction',
1765 1 => 'Noise Filter',
1766 2 => 'Noise Filter (ISO Boost)',
1767 3 => 'Auto', #11
1768 },
1769 },
1770 },
1771 0x50b => { #6
1772 Name => 'DistortionCorrection',
1773 Writable => 'int16u',
1774 PrintConv => \%offOn,
1775 },
1776 0x50c => { #PH/4
1777 Name => 'ShadingCompensation',
1778 Writable => 'int16u',
1779 PrintConv => \%offOn,
1780 },
1781 0x50d => { #PH/4
1782 Name => 'CompressionFactor',
1783 Writable => 'rational64u',
1784 },
1785 0x50f => { #6
1786 Name => 'Gradation',
1787 Writable => 'int16s',
1788 Notes => '3 or 4 values',
1789 Count => -1,
1790 Relist => [ [0..2], 3 ], # join values 0-2 for PrintConv
1791 PrintConv => [{
1792 '-1 -1 1' => 'Low Key',
1793 '0 -1 1' => 'Normal',
1794 '1 -1 1' => 'High Key',
1795 },{
1796 0 => 'User-Selected',
1797 1 => 'Auto-Override',
1798 }],
1799 },
1800 0x520 => { #6
1801 Name => 'PictureMode',
1802 Writable => 'int16u',
1803 Notes => '1 or 2 values',
1804 Count => -1,
1805 PrintConv => [{
1806 1 => 'Vivid',
1807 2 => 'Natural',
1808 3 => 'Muted',
1809 4 => 'Portrait',
1810 5 => 'i-Enhance', #11
1811 256 => 'Monotone',
1812 512 => 'Sepia',
1813 }],
1814 },
1815 0x521 => { #6
1816 Name => 'PictureModeSaturation',
1817 Writable => 'int16s',
1818 Count => 3,
1819 Notes => 'value, min, max',
1820 PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
1821 PrintConvInv => '$val=~tr/-0-9 //dc;$val',
1822 },
1823 0x522 => { #6
1824 Name => 'PictureModeHue',
1825 Writable => 'int16s',
1826 Unknown => 1, # (needs verification)
1827 },
1828 0x523 => { #6
1829 Name => 'PictureModeContrast',
1830 Writable => 'int16s',
1831 Count => 3,
1832 Notes => 'value, min, max',
1833 PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
1834 PrintConvInv => '$val=~tr/-0-9 //dc;$val',
1835 },
1836 0x524 => { #6
1837 Name => 'PictureModeSharpness',
1838 # verified as the Sharpness setting in the Picture Mode menu for the E-410
1839 Writable => 'int16s',
1840 Count => 3,
1841 Notes => 'value, min, max',
1842 PrintConv => 'my @v=split " ",$val; "$v[0] (min $v[1], max $v[2])"',
1843 PrintConvInv => '$val=~tr/-0-9 //dc;$val',
1844 },
1845 0x525 => { #6
1846 Name => 'PictureModeBWFilter',
1847 Writable => 'int16s',
1848 PrintConv => {
1849 0 => 'n/a',
1850 1 => 'Neutral',
1851 2 => 'Yellow',
1852 3 => 'Orange',
1853 4 => 'Red',
1854 5 => 'Green',
1855 },
1856 },
1857 0x526 => { #6
1858 Name => 'PictureModeTone',
1859 Writable => 'int16s',
1860 PrintConv => {
1861 0 => 'n/a',
1862 1 => 'Neutral',
1863 2 => 'Sepia',
1864 3 => 'Blue',
1865 4 => 'Purple',
1866 5 => 'Green',
1867 },
1868 },
1869 0x527 => { #12
1870 Name => 'NoiseFilter',
1871 Writable => 'int16s',
1872 Count => 3,
1873 PrintConv => {
1874 '-2 -2 1' => 'Off',
1875 '-1 -2 1' => 'Low',
1876 '0 -2 1' => 'Standard',
1877 '1 -2 1' => 'High',
1878 },
1879 },
1880 0x529 => { #PH
1881 Name => 'ArtFilter',
1882 Writable => 'int16u',
1883 Count => 4,
1884 PrintConv => [ \%filters ],
1885 },
1886 0x52c => { #PH
1887 Name => 'MagicFilter',
1888 Writable => 'int16u',
1889 Count => 4, # (2nd number is 0 or 1280, 3rd/4th are 0)
1890 PrintConv => [ \%filters ],
1891 },
1892 0x600 => { #PH/4
1893 Name => 'DriveMode',
1894 Writable => 'int16u',
1895 Count => -1,
1896 Notes => '2 or 3 numbers: 1. Mode, 2. Shot number, 3. Mode bits',
1897 PrintConv => q{
1898 my ($a,$b,$c) = split ' ',$val;
1899 return 'Single Shot' unless $a;
1900 if ($a == 5 and defined $c) {
1901 $a = DecodeBits($c, { #6
1902 0 => 'AE',
1903 1 => 'WB',
1904 2 => 'FL',
1905 3 => 'MF',
1906 }) . ' Bracketing';
1907 $a =~ s/, /+/g;
1908 } else {
1909 my %a = (
1910 1 => 'Continuous Shooting',
1911 2 => 'Exposure Bracketing',
1912 3 => 'White Balance Bracketing',
1913 4 => 'Exposure+WB Bracketing', #6
1914 );
1915 $a = $a{$a} || "Unknown ($a)";
1916 }
1917 return "$a, Shot $b";
1918 },
1919 },
1920 0x601 => { #6
1921 Name => 'PanoramaMode',
1922 Writable => 'int16u',
1923 Notes => '2 numbers: 1. Mode, 2. Shot number',
1924 PrintConv => q{
1925 my ($a,$b) = split ' ',$val;
1926 return 'Off' unless $a;
1927 my %a = (
1928 1 => 'Left to Right',
1929 2 => 'Right to Left',
1930 3 => 'Bottom to Top',
1931 4 => 'Top to Bottom',
1932 );
1933 return ($a{$a} || "Unknown ($a)") . ', Shot ' . $b;
1934 },
1935 },
1936 0x603 => { #PH/4
1937 Name => 'ImageQuality2',
1938 Writable => 'int16u',
1939 PrintConv => {
1940 1 => 'SQ',
1941 2 => 'HQ',
1942 3 => 'SHQ',
1943 4 => 'RAW',
1944 5 => 'SQ (5)', # (E-500)
1945 },
1946 },
1947 0x604 => { #PH
1948 Name => 'ImageStabilization',
1949 Writable => 'int32u',
1950 DataMember => 'ImageStabilization',
1951 RawConv => '$$self{ImageStabilization} = $val',
1952 PrintConv => {
1953 0 => 'Off',
1954 1 => 'On, Mode 1',
1955 2 => 'On, Mode 2',
1956 3 => 'On, Mode 3',
1957 },
1958 },
1959 0x900 => { #11
1960 Name => 'ManometerPressure',
1961 Writable => 'int16u',
1962 ValueConv => '$val / 10',
1963 ValueConvInv => '$val * 10',
1964 PrintConv => '"$val kPa"',
1965 PrintConvInv => '$val=~s/ ?kPa//i; $val',
1966 },
1967 0x901 => { #PH (u770SW)
1968 # 2 numbers: 1st looks like meters above sea level, 2nd is usually 3x the 1st (feet?)
1969 Name => 'ManometerReading',
1970 Writable => 'int32s',
1971 Count => 2,
1972 ValueConv => 'my @a=split(" ",$val); $_ /= 10 foreach @a; "@a"',
1973 ValueConvInv => 'my @a=split(" ",$val); $_ *= 10 foreach @a; "@a"',
1974 PrintConv => '$val=~s/(\S+) (\S+)/$1 m, $2 ft/; $val',
1975 PrintConvInv => '$val=~s/ ?(m|ft)//gi; $val',
1976 },
1977 0x902 => { #11
1978 Name => 'ExtendedWBDetect',
1979 Writable => 'int16u',
1980 PrintConv => \%offOn,
1981 },
1982 0x903 => { #11
1983 Name => 'LevelGaugeRoll',
1984 Writable => 'int16u',
1985 PrintConv => \%offOn,
1986 },
1987 0x904 => { #11
1988 Name => 'LevelGaugePitch',
1989 Writable => 'int16u',
1990 PrintConv => \%offOn,
1991 },
1992);
1993
1994# Olympus RAW processing IFD (ref 6)
1995%Image::ExifTool::Olympus::RawDevelopment = (
1996 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1997 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1998 WRITABLE => 1,
1999 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2000 0x000 => { #PH
2001 Name => 'RawDevVersion',
2002 Writable => 'undef',
2003 RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2004 Count => 4,
2005 },
2006 0x100 => {
2007 Name => 'RawDevExposureBiasValue',
2008 Writable => 'rational64s',
2009 },
2010 0x101 => {
2011 Name => 'RawDevWhiteBalanceValue',
2012 Writable => 'int16u',
2013 },
2014 0x102 => {
2015 Name => 'RawDevWBFineAdjustment',
2016 Writable => 'int16s',
2017 },
2018 0x103 => {
2019 Name => 'RawDevGrayPoint',
2020 Writable => 'int16u',
2021 Count => 3,
2022 },
2023 0x104 => {
2024 Name => 'RawDevSaturationEmphasis',
2025 Writable => 'int16s',
2026 Count => 3,
2027 },
2028 0x105 => {
2029 Name => 'RawDevMemoryColorEmphasis',
2030 Writable => 'int16u',
2031 },
2032 0x106 => {
2033 Name => 'RawDevContrastValue',
2034 Writable => 'int16s',
2035 Count => 3,
2036 },
2037 0x107 => {
2038 Name => 'RawDevSharpnessValue',
2039 Writable => 'int16s',
2040 Count => 3,
2041 },
2042 0x108 => {
2043 Name => 'RawDevColorSpace',
2044 Writable => 'int16u',
2045 PrintConv => { #11
2046 0 => 'sRGB',
2047 1 => 'Adobe RGB',
2048 2 => 'Pro Photo RGB',
2049 },
2050 },
2051 0x109 => {
2052 Name => 'RawDevEngine',
2053 Writable => 'int16u',
2054 PrintConv => { #11
2055 0 => 'High Speed',
2056 1 => 'High Function',
2057 2 => 'Advanced High Speed',
2058 3 => 'Advanced High Function',
2059 },
2060 },
2061 0x10a => {
2062 Name => 'RawDevNoiseReduction',
2063 Writable => 'int16u',
2064 PrintConv => { #11
2065 BITMASK => {
2066 0 => 'Noise Reduction',
2067 1 => 'Noise Filter',
2068 2 => 'Noise Filter (ISO Boost)',
2069 },
2070 },
2071 },
2072 0x10b => {
2073 Name => 'RawDevEditStatus',
2074 Writable => 'int16u',
2075 PrintConv => { #11
2076 0 => 'Original',
2077 1 => 'Edited (Landscape)',
2078 6 => 'Edited (Portrait)',
2079 8 => 'Edited (Portrait)',
2080 },
2081 },
2082 0x10c => {
2083 Name => 'RawDevSettings',
2084 Writable => 'int16u',
2085 PrintConv => { #11
2086 BITMASK => {
2087 0 => 'WB Color Temp',
2088 1 => 'WB Gray Point',
2089 2 => 'Saturation',
2090 3 => 'Contrast',
2091 4 => 'Sharpness',
2092 5 => 'Color Space',
2093 6 => 'High Function',
2094 7 => 'Noise Reduction',
2095 },
2096 },
2097 },
2098);
2099
2100# Olympus RAW processing B IFD (ref 11)
2101%Image::ExifTool::Olympus::RawDevelopment2 = (
2102 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2103 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2104 WRITABLE => 1,
2105 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2106 0x000 => {
2107 Name => 'RawDevVersion',
2108 Writable => 'undef',
2109 RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2110 Count => 4,
2111 },
2112 0x100 => {
2113 Name => 'RawDevExposureBiasValue',
2114 Writable => 'rational64s',
2115 },
2116 0x101 => {
2117 Name => 'RawDevWhiteBalance',
2118 Writable => 'int16u',
2119 PrintConv => {
2120 1 => 'Color Temperature',
2121 2 => 'Gray Point',
2122 },
2123 },
2124 0x102 => {
2125 Name => 'RawDevWhiteBalanceValue',
2126 Writable => 'int16u',
2127 },
2128 0x103 => {
2129 Name => 'RawDevWBFineAdjustment',
2130 Writable => 'int16s',
2131 },
2132 0x104 => {
2133 Name => 'RawDevGrayPoint',
2134 Writable => 'int16u',
2135 Count => 3,
2136 },
2137 0x105 => {
2138 Name => 'RawDevContrastValue',
2139 Writable => 'int16s',
2140 Count => 3,
2141 },
2142 0x106 => {
2143 Name => 'RawDevSharpnessValue',
2144 Writable => 'int16s',
2145 Count => 3,
2146 },
2147 0x107 => {
2148 Name => 'RawDevSaturationEmphasis',
2149 Writable => 'int16s',
2150 Count => 3,
2151 },
2152 0x108 => {
2153 Name => 'RawDevMemoryColorEmphasis',
2154 Writable => 'int16u',
2155 },
2156 0x109 => {
2157 Name => 'RawDevColorSpace',
2158 Writable => 'int16u',
2159 PrintConv => {
2160 0 => 'sRGB',
2161 1 => 'Adobe RGB',
2162 2 => 'Pro Photo RGB',
2163 },
2164 },
2165 0x10a => {
2166 Name => 'RawDevNoiseReduction',
2167 Writable => 'int16u',
2168 PrintConv => {
2169 BITMASK => {
2170 0 => 'Noise Reduction',
2171 1 => 'Noise Filter',
2172 2 => 'Noise Filter (ISO Boost)',
2173 },
2174 },
2175 },
2176 0x10b => {
2177 Name => 'RawDevEngine',
2178 Writable => 'int16u',
2179 PrintConv => {
2180 0 => 'High Speed',
2181 1 => 'High Function',
2182 },
2183 },
2184 0x10c => {
2185 Name => 'RawDevPictureMode',
2186 Writable => 'int16u',
2187 PrintConv => {
2188 1 => 'Vivid',
2189 2 => 'Natural',
2190 3 => 'Muted',
2191 256 => 'Monotone',
2192 512 => 'Sepia',
2193 },
2194 },
2195 0x10d => {
2196 Name => 'RawDevPMSaturation',
2197 Writable => 'int16s',
2198 Count => 3,
2199 },
2200 0x10e => {
2201 Name => 'RawDevPMContrast',
2202 Writable => 'int16s',
2203 Count => 3,
2204 },
2205 0x10f => {
2206 Name => 'RawDevPMSharpness',
2207 Writable => 'int16s',
2208 Count => 3,
2209 },
2210 0x110 => {
2211 Name => 'RawDevPM_BWFilter',
2212 Writable => 'int16u',
2213 PrintConv => {
2214 1 => 'Neutral',
2215 2 => 'Yellow',
2216 3 => 'Orange',
2217 4 => 'Red',
2218 5 => 'Green',
2219 },
2220 },
2221 0x111 => {
2222 Name => 'RawDevPMPictureTone',
2223 Writable => 'int16u',
2224 PrintConv => {
2225 1 => 'Neutral',
2226 2 => 'Sepia',
2227 3 => 'Blue',
2228 4 => 'Purple',
2229 5 => 'Green',
2230 },
2231 },
2232 0x112 => {
2233 Name => 'RawDevGradation',
2234 Writable => 'int16s',
2235 Count => 3,
2236 },
2237 0x113 => {
2238 Name => 'RawDevSaturation3',
2239 Writable => 'int16s',
2240 Count => 3, #(NC)
2241 },
2242 0x119 => {
2243 Name => 'RawDevAutoGradation',
2244 Writable => 'int16u', #(NC)
2245 PrintConv => \%offOn,
2246 },
2247 0x120 => {
2248 Name => 'RawDevPMNoiseFilter',
2249 Writable => 'int16u', #(NC)
2250 },
2251);
2252
2253# Olympus Image processing IFD
2254%Image::ExifTool::Olympus::ImageProcessing = (
2255 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2256 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2257 WRITABLE => 1,
2258 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2259 0x000 => { #PH
2260 Name => 'ImageProcessingVersion',
2261 Writable => 'undef',
2262 RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2263 Count => 4,
2264 },
2265 0x100 => { #6
2266 Name => 'WB_RBLevels',
2267 Writable => 'int16u',
2268 Count => 2,
2269 },
2270 0x102 => { #11
2271 Name => 'WB_RBLevels3000K',
2272 Writable => 'int16u',
2273 Count => 2,
2274 },
2275 0x103 => { #11
2276 Name => 'WB_RBLevels3300K',
2277 Writable => 'int16u',
2278 Count => 2,
2279 },
2280 0x104 => { #11
2281 Name => 'WB_RBLevels3600K',
2282 Writable => 'int16u',
2283 Count => 2,
2284 },
2285 0x105 => { #11
2286 Name => 'WB_RBLevels3900K',
2287 Writable => 'int16u',
2288 Count => 2,
2289 },
2290 0x106 => { #11
2291 Name => 'WB_RBLevels4000K',
2292 Writable => 'int16u',
2293 Count => 2,
2294 },
2295 0x107 => { #11
2296 Name => 'WB_RBLevels4300K',
2297 Writable => 'int16u',
2298 Count => 2,
2299 },
2300 0x108 => { #11
2301 Name => 'WB_RBLevels4500K',
2302 Writable => 'int16u',
2303 Count => 2,
2304 },
2305 0x109 => { #11
2306 Name => 'WB_RBLevels4800K',
2307 Writable => 'int16u',
2308 Count => 2,
2309 },
2310 0x10a => { #11
2311 Name => 'WB_RBLevels5300K',
2312 Writable => 'int16u',
2313 Count => 2,
2314 },
2315 0x10b => { #11
2316 Name => 'WB_RBLevels6000K',
2317 Writable => 'int16u',
2318 Count => 2,
2319 },
2320 0x10c => { #11
2321 Name => 'WB_RBLevels6600K',
2322 Writable => 'int16u',
2323 Count => 2,
2324 },
2325 0x10d => { #11
2326 Name => 'WB_RBLevels7500K',
2327 Writable => 'int16u',
2328 Count => 2,
2329 },
2330 0x10e => { #11
2331 Name => 'WB_RBLevelsCWB1',
2332 Writable => 'int16u',
2333 Count => 2,
2334 },
2335 0x10f => { #11
2336 Name => 'WB_RBLevelsCWB2',
2337 Writable => 'int16u',
2338 Count => 2,
2339 },
2340 0x110 => { #11
2341 Name => 'WB_RBLevelsCWB3',
2342 Writable => 'int16u',
2343 Count => 2,
2344 },
2345 0x111 => { #11
2346 Name => 'WB_RBLevelsCWB4',
2347 Writable => 'int16u',
2348 Count => 2,
2349 },
2350 0x113 => { #11
2351 Name => 'WB_GLevel3000K',
2352 Writable => 'int16u',
2353 },
2354 0x114 => { #11
2355 Name => 'WB_GLevel3300K',
2356 Writable => 'int16u',
2357 },
2358 0x115 => { #11
2359 Name => 'WB_GLevel3600K',
2360 Writable => 'int16u',
2361 },
2362 0x116 => { #11
2363 Name => 'WB_GLevel3900K',
2364 Writable => 'int16u',
2365 },
2366 0x117 => { #11
2367 Name => 'WB_GLevel4000K',
2368 Writable => 'int16u',
2369 },
2370 0x118 => { #11
2371 Name => 'WB_GLevel4300K',
2372 Writable => 'int16u',
2373 },
2374 0x119 => { #11
2375 Name => 'WB_GLevel4500K',
2376 Writable => 'int16u',
2377 },
2378 0x11a => { #11
2379 Name => 'WB_GLevel4800K',
2380 Writable => 'int16u',
2381 },
2382 0x11b => { #11
2383 Name => 'WB_GLevel5300K',
2384 Writable => 'int16u',
2385 },
2386 0x11c => { #11
2387 Name => 'WB_GLevel6000K',
2388 Writable => 'int16u',
2389 },
2390 0x11d => { #11
2391 Name => 'WB_GLevel6600K',
2392 Writable => 'int16u',
2393 },
2394 0x11e => { #11
2395 Name => 'WB_GLevel7500K',
2396 Writable => 'int16u',
2397 },
2398 0x11f => { #11
2399 Name => 'WB_GLevel',
2400 Writable => 'int16u',
2401 },
2402 0x200 => { #6
2403 Name => 'ColorMatrix',
2404 Writable => 'int16u',
2405 Format => 'int16s',
2406 Count => 9,
2407 },
2408 # color matrices (ref 11):
2409 # 0x0201-0x020d are sRGB color matrices
2410 # 0x020e-0x021a are Adobe RGB color matrices
2411 # 0x021b-0x0227 are ProPhoto RGB color matrices
2412 # 0x0228 and 0x0229 are ColorMatrix for E-330
2413 # 0x0250-0x0252 are sRGB color matrices
2414 # 0x0253-0x0255 are Adobe RGB color matrices
2415 # 0x0256-0x0258 are ProPhoto RGB color matrices
2416 0x300 => { #11
2417 Name => 'Enhancer',
2418 Writable => 'int16u',
2419 },
2420 0x301 => { #11
2421 Name => 'EnhancerValues',
2422 Writable => 'int16u',
2423 Count => 7,
2424 },
2425 0x310 => { #11
2426 Name => 'CoringFilter',
2427 Writable => 'int16u',
2428 },
2429 0x0311 => { #11
2430 Name => 'CoringValues',
2431 Writable => 'int16u',
2432 Count => 7,
2433 },
2434 0x600 => { #11
2435 Name => 'BlackLevel2',
2436 Writable => 'int16u',
2437 Count => 4,
2438 },
2439 0x610 => { #11
2440 Name => 'GainBase',
2441 Writable => 'int16u',
2442 },
2443 0x611 => { #4/6
2444 Name => 'ValidBits',
2445 Writable => 'int16u',
2446 Count => 2,
2447 },
2448 0x612 => { #11
2449 Name => 'CropLeft',
2450 Writable => 'int16u',
2451 Count => 2,
2452 },
2453 0x613 => { #11
2454 Name => 'CropTop',
2455 Writable => 'int16u',
2456 Count => 2,
2457 },
2458 0x614 => { #PH/11
2459 Name => 'CropWidth',
2460 Writable => 'int32u',
2461 },
2462 0x615 => { #PH/11
2463 Name => 'CropHeight',
2464 Writable => 'int32u',
2465 },
2466 # 0x800 LensDistortionParams, float[9] (ref 11)
2467 # 0x801 LensShadingParams, int16u[16] (ref 11)
2468 # 0x1010-0x1012 are the processing options used in camera or in
2469 # Olympus software, which 0x050a-0x050c are in-camera only (ref 6)
2470 0x1010 => { #PH/4
2471 Name => 'NoiseReduction2',
2472 Writable => 'int16u',
2473 PrintConv => {
2474 BITMASK => {
2475 0 => 'Noise Reduction',
2476 1 => 'Noise Filter',
2477 2 => 'Noise Filter (ISO Boost)',
2478 },
2479 },
2480 },
2481 0x1011 => { #6
2482 Name => 'DistortionCorrection2',
2483 Writable => 'int16u',
2484 PrintConv => \%offOn,
2485 },
2486 0x1012 => { #PH/4
2487 Name => 'ShadingCompensation2',
2488 Writable => 'int16u',
2489 PrintConv => \%offOn,
2490 },
2491 0x101c => { #11
2492 Name => 'MultipleExposureMode',
2493 Writable => 'int16u',
2494 Count => 2,
2495 PrintConv => [{
2496 0 => 'Off',
2497 2 => 'On (2 frames)',
2498 3 => 'On (3 frames)',
2499 }],
2500 },
2501 0x1103 => { #PH
2502 Name => 'UnknownBlock',
2503 Writable => 'undef',
2504 Notes => 'unknown 142kB block in ORF images, not copied to JPEG images',
2505 # 'Drop' because too large for APP1 in JPEG images
2506 Flags => [ 'Unknown', 'Binary', 'Drop' ],
2507 },
2508 0x1112 => { #11
2509 Name => 'AspectRatio',
2510 Writable => 'int8u',
2511 Count => 2,
2512 PrintConv => {
2513 '1 1' => '4:3',
2514 '2 2' => '3:2',
2515 '3 3' => '16:9',
2516 '4 4' => '6:6',
2517 '5 5' => '5:4',
2518 '6 6' => '7:6',
2519 '7 7' => '6:5',
2520 '8 8' => '7:5',
2521 '9 9' => '3:4',
2522 },
2523 },
2524 0x1113 => { #11
2525 Name => 'AspectFrame',
2526 Writable => 'int16u',
2527 Count => 4,
2528 },
2529 0x1200 => { #11/PH
2530 Name => 'FacesDetected',
2531 Writable => 'int32u',
2532 Count => -1,
2533 Notes => '2 or 3 values',
2534 },
2535 0x1201 => { #11/PH
2536 Name => 'FaceDetectArea',
2537 Writable => 'int16s',
2538 Count => -1, # (varies with model)
2539 Binary => 1, # (too long)
2540 Notes => q{
2541 for models with 2 values in FacesDetected this gives X/Y coordinates in the
2542 FaceDetectFrame for all 4 corners of the face rectangle. For models with 3
2543 values in FacesDetected this gives X/Y coordinates, size and rotation angle
2544 of the face detect square
2545 },
2546 },
2547 0x1202 => { #PH
2548 Name => 'MaxFaces',
2549 Writable => 'int32u',
2550 Count => 3,
2551 },
2552 0x1203 => { #PH
2553 Name => 'FaceDetectFrameSize',
2554 Writable => 'int16u',
2555 Count => 6,
2556 Notes => 'width/height of the full face detect frame',
2557 },
2558 0x1207 => { #PH
2559 Name => 'FaceDetectFrameCrop',
2560 Writable => 'int16s',
2561 Count => 12,
2562 Notes => 'X/Y offset and width/height of the cropped face detect frame',
2563 },
2564);
2565
2566# Olympus Focus Info IFD
2567%Image::ExifTool::Olympus::FocusInfo = (
2568 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2569 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2570 WRITABLE => 1,
2571 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2572 0x000 => { #PH
2573 Name => 'FocusInfoVersion',
2574 Writable => 'undef',
2575 RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2576 Count => 4,
2577 },
2578 0x209 => { #PH/4
2579 Name => 'AutoFocus',
2580 Writable => 'int16u',
2581 PrintConv => \%offOn,
2582 Unknown => 1, #6
2583 },
2584 0x210 => { #11
2585 Name => 'SceneDetect',
2586 Writable => 'int16u',
2587 },
2588 0x211 => { #11
2589 Name => 'SceneArea',
2590 Writable => 'int32u',
2591 Count => 8,
2592 Unknown => 1, # (numbers don't make much sense?)
2593 },
2594 0x212 => { #11
2595 Name => 'SceneDetectData',
2596 Writable => 'int32u',
2597 Count => 720,
2598 Binary => 1,
2599 Unknown => 1, # (but what does it mean?)
2600 },
2601 0x300 => { #6
2602 Name => 'ZoomStepCount',
2603 Writable => 'int16u',
2604 },
2605 0x301 => { #11
2606 Name => 'FocusStepCount',
2607 Writable => 'int16u',
2608 },
2609 0x303 => { #11
2610 Name => 'FocusStepInfinity',
2611 Writable => 'int16u',
2612 },
2613 0x304 => { #11
2614 Name => 'FocusStepNear',
2615 Writable => 'int16u',
2616 },
2617 0x305 => { #4
2618 Name => 'FocusDistance',
2619 Writable => 'rational64u',
2620 # this rational value looks like it is in mm when the denominator is
2621 # 1 (E-1), and cm when denominator is 10 (E-300), so if we ignore the
2622 # denominator we are consistently in mm - PH
2623 Format => 'int32u',
2624 Count => 2,
2625 ValueConv => q{
2626 my ($a,$b) = split ' ',$val;
2627 return 0 if $a == 0xffffffff;
2628 return $a / 1000;
2629 },
2630 ValueConvInv => q{
2631 return '4294967295 1' unless $val;
2632 $val = int($val * 1000 + 0.5);
2633 return "$val 1";
2634 },
2635 PrintConv => '$val ? "$val m" : "inf"',
2636 PrintConvInv => '$val eq "inf" ? 0 : $val=~s/\s*m$//, $val',
2637 },
2638 0x308 => [ # NEED A BETTER WAY TO DETERMINE WHICH MODELS USE WHICH ENCODING!
2639 {
2640 Name => 'AFPoint',
2641 Condition => '$$self{Model} =~ /E-(3|5|30)\b/',
2642 Writable => 'int16u',
2643 PrintHex => 1,
2644 # decoded by ref 6
2645 Notes => q{
2646 for the E-3, E-5 and E-30 the value is separated into 2 parts: low 5 bits
2647 give AF point, upper bits give AF target selection mode
2648 },
2649 ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
2650 ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
2651 PrintConv => [
2652 {
2653 0x00 => '(none)',
2654 0x01 => 'Top-left (horizontal)',
2655 0x02 => 'Top-center (horizontal)',
2656 0x03 => 'Top-right (horizontal)',
2657 0x04 => 'Left (horizontal)',
2658 0x05 => 'Mid-left (horizontal)',
2659 0x06 => 'Center (horizontal)',
2660 0x07 => 'Mid-right (horizontal)',
2661 0x08 => 'Right (horizontal)',
2662 0x09 => 'Bottom-left (horizontal)',
2663 0x0a => 'Bottom-center (horizontal)',
2664 0x0b => 'Bottom-right (horizontal)',
2665 0x0c => 'Top-left (vertical)',
2666 0x0d => 'Top-center (vertical)',
2667 0x0e => 'Top-right (vertical)',
2668 0x0f => 'Left (vertical)',
2669 0x10 => 'Mid-left (vertical)',
2670 0x11 => 'Center (vertical)',
2671 0x12 => 'Mid-right (vertical)',
2672 0x13 => 'Right (vertical)',
2673 0x14 => 'Bottom-left (vertical)',
2674 0x15 => 'Bottom-center (vertical)',
2675 0x16 => 'Bottom-right (vertical)',
2676 },
2677 {
2678 0x00 => 'Single Target',
2679 0x40 => 'All Target',
2680 0x80 => 'Dynamic Single Target',
2681 }
2682 ],
2683 },{ #PH (models with 7-point AF)
2684 Name => 'AFPoint',
2685 Condition => '$$self{Model} =~ /E-(520|600|620)\b/',
2686 Notes => 'models with 7-point AF',
2687 Writable => 'int16u',
2688 PrintHex => 1,
2689 ValueConv => '($val & 0x1f) . " " . ($val & 0xffe0)',
2690 ValueConvInv => 'my @v=split(" ",$val); @v == 2 ? $v[0] + $v[1] : $val',
2691 PrintConv => [
2692 {
2693 0x00 => '(none)',
2694 0x01 => 'Center',
2695 # need to fill this in...
2696 },
2697 {
2698 0x00 => 'Single Target',
2699 0x40 => 'All Target', # (guess)
2700 },
2701 ]
2702 },{ #11
2703 Name => 'AFPoint',
2704 Writable => 'int16u',
2705 Notes => 'other models',
2706 RawConv => '($val or $$self{Model} ne "E-P1") ? $val : undef',
2707 PrintConv => {
2708 # (E-P1 always writes 0, maybe other models do too - PH)
2709 0 => 'Left (or n/a)',
2710 1 => 'Center (horizontal)', #6 (E-510)
2711 2 => 'Right',
2712 3 => 'Center (vertical)', #6 (E-510)
2713 255 => 'None',
2714 },
2715 }
2716 ],
2717 # 0x31a Continuous AF parameters?
2718 # 0x328 Related to AF (maybe Imager AF data?) (ref PH, E-PL1):
2719 # - offset 0x2a (int8u) ImagerAFMode? 0=Manual, 1=Auto
2720 # - offset 0x30 (int16u) AFAreaXPosition
2721 # - offset 0x32 (int16u) AFAreaWidth (202)
2722 # - offset 0x34 (int16u) AFAreaYPosition
2723 # - offset 0x36 (int16u) AFAreaHeight (50)
2724 # (AF area positions above give the top-left coordinates of the AF area in the
2725 # AF frame. Increasing Y is downwards, and the AF frame size is about 1280x256)
2726 # 0x1200-0x1209 Flash information:
2727 0x1201 => { #6
2728 Name => 'ExternalFlash',
2729 Writable => 'int16u',
2730 Count => 2,
2731 PrintConv => {
2732 '0 0' => 'Off',
2733 '1 0' => 'On',
2734 },
2735 },
2736 0x1203 => { #11
2737 Name => 'ExternalFlashGuideNumber',
2738 Writable => 'rational64s',
2739 Unknown => 1, # (needs verification)
2740 },
2741 0x1204 => { #11(reversed)/7
2742 Name => 'ExternalFlashBounce',
2743 Writable => 'int16u',
2744 PrintConv => {
2745 0 => 'Bounce or Off',
2746 1 => 'Direct',
2747 },
2748 },
2749 0x1205 => { #11 (ref converts to mm using table)
2750 Name => 'ExternalFlashZoom',
2751 Writable => 'rational64u',
2752 },
2753 0x1208 => { #6
2754 Name => 'InternalFlash',
2755 Writable => 'int16u',
2756 Count => -1,
2757 PrintConv => {
2758 '0' => 'Off',
2759 '1' => 'On',
2760 '0 0' => 'Off',
2761 '1 0' => 'On',
2762 },
2763 },
2764 0x1209 => { #6
2765 Name => 'ManualFlash',
2766 Writable => 'int16u',
2767 Count => 2,
2768 Notes => '2 numbers: 1. 0=Off, 1=On, 2. Flash strength',
2769 PrintConv => q{
2770 my ($a,$b) = split ' ',$val;
2771 return 'Off' unless $a;
2772 $b = ($b == 1) ? 'Full' : "1/$b";
2773 return "On ($b strength)";
2774 },
2775 },
2776 0x1500 => { #6
2777 Name => 'SensorTemperature',
2778 Writable => 'int16s',
2779 Notes => q{
2780 approximately Celsius for E-1, unknown calibration for E-3/410/420/510, and
2781 always zero for E-300/330/400/500, divide by 10 for E-P1?
2782 },
2783 },
2784 0x1600 => { # ref http://fourthirdsphoto.com/vbb/showpost.php?p=107607&postcount=15
2785 Name => 'ImageStabilization',
2786 # (the other value is more reliable, so ignore this totally if the other exists)
2787 Condition => 'not defined $$self{ImageStabilization}',
2788 Writable => 'undef',
2789 # if the first 4 bytes are non-zero, then bit 0x01 of byte 44
2790 # gives the stabilization mode
2791 PrintConv => q{
2792 $val =~ /^\0{4}/ ? 'Off' : 'On, ' .
2793 (unpack('x44C',$val) & 0x01 ? 'Mode 1' : 'Mode 2')
2794 },
2795 },
2796 # 0x102a same as Subdir4-0x300
2797);
2798
2799# Olympus raw information tags (ref 6)
2800%Image::ExifTool::Olympus::RawInfo = (
2801 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2802 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2803 NOTES => 'These tags are found only in ORF images of some models (ie. C8080WZ).',
2804 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2805 0x000 => {
2806 Name => 'RawInfoVersion',
2807 Writable => 'undef',
2808 RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
2809 Count => 4,
2810 },
2811 0x100 => {
2812 Name => 'WB_RBLevelsUsed',
2813 Writable => 'int16u',
2814 Count => 2,
2815 },
2816 0x110 => {
2817 Name => 'WB_RBLevelsAuto',
2818 Writable => 'int16u',
2819 Count => 2,
2820 },
2821 0x120 => {
2822 Name => 'WB_RBLevelsShade',
2823 Writable => 'int16u',
2824 Count => 2,
2825 },
2826 0x121 => {
2827 Name => 'WB_RBLevelsCloudy',
2828 Writable => 'int16u',
2829 Count => 2,
2830 },
2831 0x122 => {
2832 Name => 'WB_RBLevelsFineWeather',
2833 Writable => 'int16u',
2834 Count => 2,
2835 },
2836 0x123 => {
2837 Name => 'WB_RBLevelsTungsten',
2838 Writable => 'int16u',
2839 Count => 2,
2840 },
2841 0x124 => {
2842 Name => 'WB_RBLevelsEveningSunlight',
2843 Writable => 'int16u',
2844 Count => 2,
2845 },
2846 0x130 => {
2847 Name => 'WB_RBLevelsDaylightFluor',
2848 Writable => 'int16u',
2849 Count => 2,
2850 },
2851 0x131 => {
2852 Name => 'WB_RBLevelsDayWhiteFluor',
2853 Writable => 'int16u',
2854 Count => 2,
2855 },
2856 0x132 => {
2857 Name => 'WB_RBLevelsCoolWhiteFluor',
2858 Writable => 'int16u',
2859 Count => 2,
2860 },
2861 0x133 => {
2862 Name => 'WB_RBLevelsWhiteFluorescent',
2863 Writable => 'int16u',
2864 Count => 2,
2865 },
2866 0x200 => {
2867 Name => 'ColorMatrix2',
2868 Format => 'int16s',
2869 Writable => 'int16u',
2870 Count => 9,
2871 },
2872 # 0x240 => 'ColorMatrixDefault', ?
2873 # 0x250 => 'ColorMatrixSaturation', ?
2874 # 0x251 => 'ColorMatrixHue', ?
2875 # 0x252 => 'ColorMatrixContrast', ?
2876 # 0x300 => sharpness-related
2877 # 0x301 => list of sharpness-related values
2878 0x310 => {
2879 Name => 'CoringFilter',
2880 Writable => 'int16u',
2881 },
2882 0x311 => {
2883 Name => 'CoringValues',
2884 Writable => 'int16u',
2885 Count => 11,
2886 },
2887 0x600 => {
2888 Name => 'BlackLevel2',
2889 Writable => 'int16u',
2890 Count => 4,
2891 },
2892 0x601 => {
2893 Name => 'YCbCrCoefficients',
2894 Notes => 'stored as int16u[6], but extracted as rational32u[3]',
2895 Format => 'rational32u',
2896 },
2897 0x611 => {
2898 Name => 'ValidPixelDepth',
2899 Writable => 'int16u',
2900 Count => 2,
2901 },
2902 0x612 => { #11
2903 Name => 'CropLeft',
2904 Writable => 'int16u',
2905 },
2906 0x613 => { #11
2907 Name => 'CropTop',
2908 Writable => 'int16u',
2909 },
2910 0x614 => {
2911 Name => 'CropWidth',
2912 Writable => 'int32u',
2913 },
2914 0x615 => {
2915 Name => 'CropHeight',
2916 Writable => 'int32u',
2917 },
2918 0x1000 => {
2919 Name => 'LightSource',
2920 Writable => 'int16u',
2921 PrintConv => {
2922 0 => 'Unknown',
2923 16 => 'Shade',
2924 17 => 'Cloudy',
2925 18 => 'Fine Weather',
2926 20 => 'Tungsten (Incandescent)',
2927 22 => 'Evening Sunlight',
2928 33 => 'Daylight Fluorescent',
2929 34 => 'Day White Fluorescent',
2930 35 => 'Cool White Fluorescent',
2931 36 => 'White Fluorescent',
2932 256 => 'One Touch White Balance',
2933 512 => 'Custom 1-4',
2934 },
2935 },
2936 # the following 5 tags all have 3 values: val, min, max
2937 0x1001 => {
2938 Name => 'WhiteBalanceComp',
2939 Writable => 'int16s',
2940 Count => 3,
2941 },
2942 0x1010 => {
2943 Name => 'SaturationSetting',
2944 Writable => 'int16s',
2945 Count => 3,
2946 },
2947 0x1011 => {
2948 Name => 'HueSetting',
2949 Writable => 'int16s',
2950 Count => 3,
2951 },
2952 0x1012 => {
2953 Name => 'ContrastSetting',
2954 Writable => 'int16s',
2955 Count => 3,
2956 },
2957 0x1013 => {
2958 Name => 'SharpnessSetting',
2959 Writable => 'int16s',
2960 Count => 3,
2961 },
2962 # settings written by Camedia Master 4.x
2963 0x2000 => {
2964 Name => 'CMExposureCompensation',
2965 Writable => 'rational64s',
2966 },
2967 0x2001 => {
2968 Name => 'CMWhiteBalance',
2969 Writable => 'int16u',
2970 },
2971 0x2002 => {
2972 Name => 'CMWhiteBalanceComp',
2973 Writable => 'int16s',
2974 },
2975 0x2010 => {
2976 Name => 'CMWhiteBalanceGrayPoint',
2977 Writable => 'int16u',
2978 Count => 3,
2979 },
2980 0x2020 => {
2981 Name => 'CMSaturation',
2982 Writable => 'int16s',
2983 Count => 3,
2984 },
2985 0x2021 => {
2986 Name => 'CMHue',
2987 Writable => 'int16s',
2988 Count => 3,
2989 },
2990 0x2022 => {
2991 Name => 'CMContrast',
2992 Writable => 'int16s',
2993 Count => 3,
2994 },
2995 0x2023 => {
2996 Name => 'CMSharpness',
2997 Writable => 'int16s',
2998 Count => 3,
2999 },
3000);
3001
3002# Olympus unknown information tags
3003%Image::ExifTool::Olympus::UnknownInfo = (
3004 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
3005 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
3006 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3007);
3008
3009# Tags found only in some FE models
3010%Image::ExifTool::Olympus::FETags = (
3011 WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
3012 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
3013 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3014 NOTES => q{
3015 Some FE models write a large number of tags here, but most of this
3016 information remains unknown.
3017 },
3018 0x0100 => {
3019 Name => 'BodyFirmwareVersion',
3020 Writable => 'string',
3021 },
3022);
3023
3024# tags in Olympus QuickTime videos (ref PH)
3025# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
3026%Image::ExifTool::Olympus::MOV1 = (
3027 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3028 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3029 FIRST_ENTRY => 0,
3030 NOTES => q{
3031 This information is found in MOV videos from Olympus models such as the
3032 D540Z, D595Z, FE100, FE110, FE115, FE170 and FE200.
3033 },
3034 0x00 => {
3035 Name => 'Make',
3036 Format => 'string[24]',
3037 },
3038 0x18 => {
3039 Name => 'Model',
3040 Format => 'string[8]',
3041 },
3042 # (01 00 at offset 0x20)
3043 0x26 => {
3044 Name => 'ExposureUnknown',
3045 Unknown => 1,
3046 Format => 'int32u',
3047 # this conversion doesn't work for all models (ie. gives "1/100000")
3048 ValueConv => '$val ? 10 / $val : 0',
3049 PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
3050 },
3051 0x2a => {
3052 Name => 'FNumber',
3053 Format => 'rational64u',
3054 PrintConv => 'sprintf("%.1f",$val)',
3055 },
3056 0x32 => { #(NC)
3057 Name => 'ExposureCompensation',
3058 Format => 'rational64s',
3059 PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
3060 },
3061 # 0x44 => WhiteBalance ?
3062 0x48 => {
3063 Name => 'FocalLength',
3064 Format => 'rational64u',
3065 PrintConv => 'sprintf("%.1f mm",$val)',
3066 },
3067 # 0xb1 => 'ISO', #(I don't think this works - PH)
3068);
3069
3070# tags in Olympus QuickTime videos (ref PH)
3071# (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
3072%Image::ExifTool::Olympus::MOV2 = (
3073 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3074 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3075 FIRST_ENTRY => 0,
3076 NOTES => q{
3077 This information is found in MOV videos from Olympus models such as the
3078 FE120, FE140 and FE190.
3079 },
3080 0x00 => {
3081 Name => 'Make',
3082 Format => 'string[24]',
3083 },
3084 0x18 => {
3085 Name => 'Model',
3086 Format => 'string[24]',
3087 },
3088 # (01 00 at offset 0x30)
3089 0x36 => {
3090 Name => 'ExposureTime',
3091 Format => 'int32u',
3092 ValueConv => '$val ? 10 / $val : 0',
3093 PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
3094 },
3095 0x3a => {
3096 Name => 'FNumber',
3097 Format => 'rational64u',
3098 PrintConv => 'sprintf("%.1f",$val)',
3099 },
3100 0x42 => { #(NC)
3101 Name => 'ExposureCompensation',
3102 Format => 'rational64s',
3103 PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
3104 },
3105 0x58 => {
3106 Name => 'FocalLength',
3107 Format => 'rational64u',
3108 PrintConv => 'sprintf("%.1f mm",$val)',
3109 },
3110 0xc1 => {
3111 Name => 'ISO',
3112 Format => 'int16u',
3113 },
3114);
3115
3116# tags in Olympus MP4 videos (ref PH)
3117%Image::ExifTool::Olympus::MP4 = (
3118 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3119 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3120 FIRST_ENTRY => 0,
3121 NOTES => q{
3122 This information is found in MP4 videos from Olympus models such as the
3123 u7040 and u9010.
3124 },
3125 0x00 => {
3126 Name => 'Make',
3127 Format => 'string[24]',
3128 },
3129 0x18 => {
3130 Name => 'Model',
3131 Format => 'string[24]',
3132 },
3133 0x28 => {
3134 Name => 'FNumber',
3135 Format => 'rational64u',
3136 PrintConv => 'sprintf("%.1f",$val)',
3137 },
3138 0x30 => { #(NC)
3139 Name => 'ExposureCompensation',
3140 Format => 'rational64s',
3141 PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
3142 },
3143 # NEED MORE SAMPLES TO DECODE THIS
3144);
3145
3146# tags in Olympus AVI videos (ref PH)
3147%Image::ExifTool::Olympus::AVI = (
3148 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3149 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
3150 FIRST_ENTRY => 0,
3151 NOTES => 'This information is found in Olympus AVI videos.',
3152 0x12 => {
3153 Name => 'Make',
3154 Format => 'string[24]',
3155 },
3156 0x2c => {
3157 Name => 'ModelType',
3158 Format => 'string[24]',
3159 },
3160 0x5e => {
3161 Name => 'FNumber',
3162 Format => 'rational64u',
3163 PrintConv => 'sprintf("%.1f",$val)',
3164 },
3165 0x83 => {
3166 Name => 'DateTime1',
3167 Format => 'string[24]',
3168 Groups => { 2 => 'Time' },
3169 },
3170 0x9d => {
3171 Name => 'DateTime2',
3172 Format => 'string[24]',
3173 Groups => { 2 => 'Time' },
3174 },
3175 0x12d => {
3176 Name => 'ThumbnailLength',
3177 Format => 'int32u',
3178 },
3179 0x131 => {
3180 Name => 'ThumbnailImage',
3181 Format => 'undef[$val{0x12d}]',
3182 Notes => '160x120 JPEG thumbnail image',
3183 RawConv => '$self->ValidateImage(\$val,$tag)',
3184 },
3185);
3186
3187# tags in WAV files from Olympus PCM linear recorders (ref 18)
3188%Image::ExifTool::Olympus::WAV = (
3189 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
3190 GROUPS => { 0 => 'MakerNotes', 2 => 'Audio' },
3191 FIRST_ENTRY => 0,
3192 NOTES => q{
3193 This information is found in WAV files from Olympus PCM linear recorders
3194 like the LS-5, LS-10, LS-11.
3195 },
3196 0x0c => {
3197 Name => 'Model',
3198 Format => 'string[16]',
3199 },
3200 0x1c => {
3201 Name => 'FileNumber',
3202 Format => 'int32u',
3203 PrintConv => 'sprintf("%.4d", $val)',
3204 },
3205 0x26 => {
3206 Name => 'DateTimeOriginal',
3207 Description => 'Date/Time Original',
3208 Groups => { 2 => 'Time' },
3209 Format => 'undef[12]',
3210 Notes => 'time at start of recording',
3211 ValueConv => q{
3212 return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/;
3213 my $y = $1 < 70 ? "20$1" : "19$1";
3214 return "$y:$2:$3 $4:$5:$6";
3215 },
3216 PrintConv => '$self->ConvertDateTime($val)',
3217 },
3218 0x32 => {
3219 Name => 'DateTimeEnd',
3220 Groups => { 2 => 'Time' },
3221 Format => 'undef[12]',
3222 Notes => 'time at end of recording',
3223 ValueConv => q{
3224 return undef unless $val =~ /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/;
3225 my $y = $1 < 70 ? "20$1" : "19$1";
3226 return "$y:$2:$3 $4:$5:$6";
3227 },
3228 PrintConv => '$self->ConvertDateTime($val)',
3229 },
3230 0x3e => {
3231 Name => 'RecordingTime',
3232 Format => 'undef[6]',
3233 ValueConv => '$val =~ s/^(\d{2})(\d{2})/$1:$2:/; $val',
3234 },
3235 0x200 => {
3236 Name => 'Duration',
3237 Format => 'int32u',
3238 ValueConv => '$val / 1000',
3239 PrintConv => 'ConvertDuration($val)',
3240 },
3241 0x20a => { Name => 'Index01', %indexInfo },
3242 0x214 => { Name => 'Index02', %indexInfo },
3243 0x21e => { Name => 'Index03', %indexInfo },
3244 0x228 => { Name => 'Index04', %indexInfo },
3245 0x232 => { Name => 'Index05', %indexInfo },
3246 0x23c => { Name => 'Index06', %indexInfo },
3247 0x246 => { Name => 'Index07', %indexInfo },
3248 0x250 => { Name => 'Index08', %indexInfo },
3249 0x25a => { Name => 'Index09', %indexInfo },
3250 0x264 => { Name => 'Index10', %indexInfo },
3251 0x26e => { Name => 'Index11', %indexInfo },
3252 0x278 => { Name => 'Index12', %indexInfo },
3253 0x282 => { Name => 'Index13', %indexInfo },
3254 0x28c => { Name => 'Index14', %indexInfo },
3255 0x296 => { Name => 'Index15', %indexInfo },
3256 0x2a0 => { Name => 'Index16', %indexInfo },
3257);
3258
3259# Olympus composite tags
3260%Image::ExifTool::Olympus::Composite = (
3261 GROUPS => { 2 => 'Camera' },
3262 ExtenderStatus => {
3263 Notes => q{
3264 Olympus cameras have the quirk that they may retain the extender settings
3265 after the extender is removed until the camera is powered off. This tag is
3266 an attempt to represent the actual status of the extender.
3267 },
3268 Require => {
3269 0 => 'Olympus:Extender',
3270 1 => 'Olympus:LensType',
3271 2 => 'MaxApertureValue',
3272 },
3273 ValueConv => 'Image::ExifTool::Olympus::ExtenderStatus($val[0],$prt[1],$val[2])',
3274 PrintConv => {
3275 0 => 'Not attached',
3276 1 => 'Attached',
3277 2 => 'Removed',
3278 },
3279 },
3280 ZoomedPreviewImage => {
3281 Require => {
3282 0 => 'ZoomedPreviewStart',
3283 1 => 'ZoomedPreviewLength',
3284 },
3285 RawConv => 'Image::ExifTool::Exif::ExtractImage($self,$val[0],$val[1],"ZoomedPreviewImage")',
3286 },
3287);
3288
3289# add our composite tags
3290Image::ExifTool::AddCompositeTags('Image::ExifTool::Olympus');
3291
3292
3293#------------------------------------------------------------------------------
3294# Determine if the extender (EX-25/EC-14) was really attached (ref 9)
3295# Inputs: 0) Extender, 1) LensType string, 2) MaxApertureAtMaxFocal
3296# Returns: 0=not attached, 1=attached, 2=could have been removed
3297# Notes: Olympus has a bug in the in-camera firmware which results in the
3298# extender information being cached and written into the EXIF data even after
3299# the extender has been removed. You must power cycle the camera to prevent it
3300# from writing the cached extender information into the EXIF data.
3301sub ExtenderStatus($$$)
3302{
3303 my ($extender, $lensType, $maxAperture) = @_;
3304 my @info = split ' ', $extender;
3305 # validate that extender identifier is reasonable
3306 return 0 unless @info >= 2 and $info[1];
3307 # if it's not an EC-14 (id 0 4) then assume it was really attached
3308 # (other extenders don't seem to affect the reported max aperture)
3309 return 1 if "$info[0] $info[1]" ne '0 4';
3310 # get the maximum aperture for this lens (in $1)
3311 $lensType =~ / F(\d+(.\d+)?)/ or return 1;
3312 # If the maximum aperture at the maximum focal length is greater than the
3313 # known max/max aperture of the lens, then the extender must be attached
3314 return ($maxAperture - $1 > 0.2) ? 1 : 2;
3315}
3316
3317#------------------------------------------------------------------------------
3318# Print AF points
3319# Inputs: 0) AF point data (string of integers)
3320# Notes: I'm just guessing that the 2nd and 4th bytes are the Y coordinates,
3321# and that more AF points will show up in the future (derived from E-1 images,
3322# and the E-1 uses just one of 3 possible AF points, all centered in Y) - PH
3323sub PrintAFAreas($)
3324{
3325 my $val = shift;
3326 my @points = split ' ', $val;
3327 my %afPointNames = (
3328 0x36794285 => 'Left',
3329 0x79798585 => 'Center',
3330 0xBD79C985 => 'Right',
3331 );
3332 $val = '';
3333 my $pt;
3334 foreach $pt (@points) {
3335 next unless $pt;
3336 $val and $val .= ', ';
3337 $afPointNames{$pt} and $val .= $afPointNames{$pt} . ' ';
3338 my @coords = unpack('C4',pack('N',$pt));
3339 $val .= "($coords[0],$coords[1])-($coords[2],$coords[3])";
3340 }
3341 $val or $val = 'none';
3342 return $val;
3343}
3344
3345#------------------------------------------------------------------------------
3346# Process ORF file
3347# Inputs: 0) ExifTool object reference, 1) directory information reference
3348# Returns: 1 if this looked like a valid ORF file, 0 otherwise
3349sub ProcessORF($$)
3350{
3351 my ($exifTool, $dirInfo) = @_;
3352 return $exifTool->ProcessTIFF($dirInfo);
3353}
3354
33551; # end
3356
3357__END__
3358
3359=head1 NAME
3360
3361Image::ExifTool::Olympus - Olympus/Epson maker notes tags
3362
3363=head1 SYNOPSIS
3364
3365This module is loaded automatically by Image::ExifTool when required.
3366
3367=head1 DESCRIPTION
3368
3369This module contains definitions required by Image::ExifTool to interpret
3370Olympus or Epson maker notes in EXIF information.
3371
3372=head1 AUTHOR
3373
3374Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
3375
3376This library is free software; you can redistribute it and/or modify it
3377under the same terms as Perl itself.
3378
3379=head1 REFERENCES
3380
3381=over 4
3382
3383=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
3384
3385=item L<http://www.cybercom.net/~dcoffin/dcraw/>
3386
3387=item L<http://www.ozhiker.com/electronics/pjmt/jpeg_info/olympus_mn.html>
3388
3389=item L<http://olypedia.de/Olympus_Makernotes>
3390
3391=back
3392
3393=head1 ACKNOWLEDGEMENTS
3394
3395Thanks to Markku Hanninen, Remi Guyomarch, Frank Ledwon, Michael Meissner,
3396Mark Dapoz, Ioannis Panagiotopoulos and Tomasz Kawecki for their help
3397figuring out some Olympus tags, and Lilo Huang, Chris Shaw and Viktor
3398Lushnikov for adding to the LensType list.
3399
3400=head1 SEE ALSO
3401
3402L<Image::ExifTool::TagNames/Olympus Tags>,
3403L<Image::ExifTool(3pm)|Image::ExifTool>
3404
3405=cut
Note: See TracBrowser for help on using the repository browser.