source: gs2-extensions/parallel-building/trunk/src/perllib/cpan/Image/ExifTool/CanonCustom.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: 69.1 KB
Line 
1#------------------------------------------------------------------------------
2# File: CanonCustom.pm
3#
4# Description: Read and write Canon Custom functions
5#
6# Revisions: 11/25/2003 - P. Harvey Created
7#
8# References: 1) http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
9# 2) Christian Koller private communication (20D)
10# 3) Rainer Honle private communication (5D)
11# 4) David Pitcher private communication (1DmkIII firmware upgrade)
12#------------------------------------------------------------------------------
13
14package Image::ExifTool::CanonCustom;
15
16use strict;
17use vars qw($VERSION);
18use Image::ExifTool qw(:DataAccess);
19use Image::ExifTool::Canon;
20use Image::ExifTool::Exif;
21
22$VERSION = '1.40';
23
24sub ProcessCanonCustom($$$);
25sub ProcessCanonCustom2($$$);
26sub WriteCanonCustom($$$);
27sub WriteCanonCustom2($$$);
28sub CheckCanonCustom($$$);
29sub ConvertPFn($);
30sub ConvertPFnInv($);
31
32my %onOff = ( 0 => 'On', 1 => 'Off' );
33my %offOn = ( 0 => 'Off', 1 => 'On' );
34my %disableEnable = ( 0 => 'Disable', 1 => 'Enable' );
35my %enableDisable = ( 0 => 'Enable', 1 => 'Disable' );
36my %convPFn = ( PrintConv => \&ConvertPfn, PrintConvInv => \&ConvertPfnInv );
37
38#------------------------------------------------------------------------------
39# Custom functions for the 1D
40# CanonCustom (keys are custom function number)
41%Image::ExifTool::CanonCustom::Functions1D = (
42 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
43 PROCESS_PROC => \&ProcessCanonCustom,
44 WRITE_PROC => \&WriteCanonCustom,
45 CHECK_PROC => \&CheckCanonCustom,
46 WRITABLE => 'int8u',
47 NOTES => q{
48 These custom functions are used by all 1D models up to but not including the
49 Mark III.
50 },
51 0 => {
52 Name => 'FocusingScreen',
53 PrintConv => {
54 0 => 'Ec-N, R',
55 1 => 'Ec-A,B,C,CII,CIII,D,H,I,L',
56 },
57 },
58 1 => {
59 Name => 'FinderDisplayDuringExposure',
60 PrintConv => \%offOn,
61 },
62 2 => {
63 Name => 'ShutterReleaseNoCFCard',
64 Description => 'Shutter Release W/O CF Card',
65 PrintConv => {
66 0 => 'Yes',
67 1 => 'No',
68 },
69 },
70 3 => {
71 Name => 'ISOSpeedExpansion',
72 Description => 'ISO Speed Expansion',
73 PrintConv => {
74 0 => 'No',
75 1 => 'Yes',
76 },
77 },
78 4 => {
79 Name => 'ShutterAELButton',
80 Description => 'Shutter Button/AEL Button',
81 PrintConv => {
82 0 => 'AF/AE lock stop',
83 1 => 'AE lock/AF',
84 2 => 'AF/AF lock, No AE lock',
85 3 => 'AE/AF, No AE lock',
86 },
87 },
88 5 => {
89 Name => 'ManualTv',
90 Description => 'Manual Tv/Av For M',
91 PrintConv => {
92 0 => 'Tv=Main/Av=Control',
93 1 => 'Tv=Control/Av=Main',
94 2 => 'Tv=Main/Av=Main w/o lens',
95 3 => 'Tv=Control/Av=Main w/o lens',
96 },
97 },
98 6 => {
99 Name => 'ExposureLevelIncrements',
100 PrintConv => {
101 0 => '1/3-stop set, 1/3-stop comp.',
102 1 => '1-stop set, 1/3-stop comp.',
103 2 => '1/2-stop set, 1/2-stop comp.',
104 },
105 },
106 7 => {
107 Name => 'USMLensElectronicMF',
108 PrintConv => {
109 0 => 'Turns on after one-shot AF',
110 1 => 'Turns off after one-shot AF',
111 2 => 'Always turned off',
112 },
113 },
114 8 => {
115 Name => 'LCDPanels',
116 Description => 'Top/Back LCD Panels',
117 PrintConv => {
118 0 => 'Remain. shots/File no.',
119 1 => 'ISO/Remain. shots',
120 2 => 'ISO/File no.',
121 3 => 'Shots in folder/Remain. shots',
122 },
123 },
124 9 => {
125 Name => 'AEBSequenceAutoCancel',
126 Description => 'AEB Sequence/Auto Cancel',
127 PrintConv => {
128 0 => '0,-,+/Enabled',
129 1 => '0,-,+/Disabled',
130 2 => '-,0,+/Enabled',
131 3 => '-,0,+/Disabled',
132 },
133 },
134 10 => {
135 Name => 'AFPointIllumination',
136 PrintConv => {
137 0 => 'On',
138 1 => 'Off',
139 2 => 'On without dimming',
140 3 => 'Brighter',
141 },
142 },
143 11 => {
144 Name => 'AFPointSelection',
145 PrintConv => {
146 0 => 'H=AF+Main/V=AF+Command',
147 1 => 'H=Comp+Main/V=Comp+Command',
148 2 => 'H=Command only/V=Assist+Main',
149 3 => 'H=FEL+Main/V=FEL+Command',
150 },
151 },
152 12 => {
153 Name => 'MirrorLockup',
154 PrintConv => \%disableEnable,
155 },
156 13 => {
157 Name => 'AFPointSpotMetering',
158 Description => 'No. AF Points/Spot Metering',
159 PrintConv => {
160 0 => '45/Center AF point',
161 1 => '11/Active AF point',
162 2 => '11/Center AF point',
163 3 => '9/Active AF point',
164 },
165 },
166 14 => {
167 Name => 'FillFlashAutoReduction',
168 PrintConv => \%enableDisable,
169 },
170 15 => {
171 Name => 'ShutterCurtainSync',
172 PrintConv => {
173 0 => '1st-curtain sync',
174 1 => '2nd-curtain sync',
175 },
176 },
177 16 => {
178 Name => 'SafetyShiftInAvOrTv',
179 PrintConv => \%disableEnable,
180 },
181 17 => {
182 Name => 'AFPointActivationArea',
183 PrintConv => {
184 0 => 'Single AF point',
185 1 => 'Expanded (TTL. of 7 AF points)',
186 2 => 'Automatic expanded (max. 13)',
187 },
188 },
189 18 => {
190 Name => 'SwitchToRegisteredAFPoint',
191 PrintConv => {
192 0 => 'Assist + AF',
193 1 => 'Assist',
194 2 => 'Only while pressing assist',
195 },
196 },
197 19 => {
198 Name => 'LensAFStopButton',
199 PrintConv => {
200 0 => 'AF stop',
201 1 => 'AF start',
202 2 => 'AE lock while metering',
203 3 => 'AF point: M -> Auto / Auto -> Ctr.',
204 4 => 'AF mode: ONE SHOT <-> AI SERVO',
205 5 => 'IS start',
206 },
207 },
208 20 => {
209 Name => 'AIServoTrackingSensitivity',
210 PrintConv => {
211 0 => 'Standard',
212 1 => 'Slow',
213 2 => 'Moderately slow',
214 3 => 'Moderately fast',
215 4 => 'Fast',
216 },
217 },
218 21 => {
219 Name => 'AIServoContinuousShooting',
220 PrintConv => {
221 0 => 'Shooting not possible without focus',
222 1 => 'Shooting possible without focus',
223 },
224 },
225);
226
227# Custom functions for the 5D (ref 3)
228%Image::ExifTool::CanonCustom::Functions5D = (
229 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
230 PROCESS_PROC => \&ProcessCanonCustom,
231 WRITE_PROC => \&WriteCanonCustom,
232 CHECK_PROC => \&CheckCanonCustom,
233 WRITABLE => 'int8u',
234 0 => {
235 Name => 'FocusingScreen',
236 PrintConv => {
237 0 => 'Ee-A',
238 1 => 'Ee-D',
239 2 => 'Ee-S',
240 },
241 },
242 1 => {
243 Name => 'SetFunctionWhenShooting',
244 PrintConv => {
245 0 => 'Default (no function)',
246 1 => 'Change quality',
247 2 => 'Change Parameters',
248 3 => 'Menu display',
249 4 => 'Image replay',
250 },
251 },
252 2 => {
253 Name => 'LongExposureNoiseReduction',
254 PrintConv => {
255 0 => 'Off',
256 1 => 'Auto',
257 2 => 'On',
258 },
259 },
260 3 => {
261 Name => 'FlashSyncSpeedAv',
262 PrintConv => {
263 0 => 'Auto',
264 1 => '1/200 Fixed',
265 },
266 },
267 4 => {
268 Name => 'Shutter-AELock',
269 PrintConv => {
270 0 => 'AF/AE lock',
271 1 => 'AE lock/AF',
272 2 => 'AF/AF lock, No AE lock',
273 3 => 'AE/AF, No AE lock',
274 },
275 },
276 5 => {
277 Name => 'AFAssistBeam',
278 PrintConv => {
279 0 => 'Emits',
280 1 => 'Does not emit',
281 },
282 },
283 6 => {
284 Name => 'ExposureLevelIncrements',
285 PrintConv => {
286 0 => '1/3 Stop',
287 1 => '1/2 Stop',
288 },
289 },
290 7 => {
291 Name => 'FlashFiring',
292 PrintConv => {
293 0 => 'Fires',
294 1 => 'Does not fire',
295 },
296 },
297 8 => {
298 Name => 'ISOExpansion',
299 PrintConv => \%offOn,
300 },
301 9 => {
302 Name => 'AEBSequenceAutoCancel',
303 Description => 'AEB Sequence/Auto Cancel',
304 PrintConv => {
305 0 => '0,-,+/Enabled',
306 1 => '0,-,+/Disabled',
307 2 => '-,0,+/Enabled',
308 3 => '-,0,+/Disabled',
309 },
310 },
311 10 => {
312 Name => 'SuperimposedDisplay',
313 PrintConv => \%onOff,
314 },
315 11 => {
316 Name => 'MenuButtonDisplayPosition',
317 PrintConv => {
318 0 => 'Previous (top if power off)',
319 1 => 'Previous',
320 2 => 'Top',
321 },
322 },
323 12 => {
324 Name => 'MirrorLockup',
325 PrintConv => \%disableEnable,
326 },
327 13 => {
328 Name => 'AFPointSelectionMethod',
329 PrintConv => {
330 0 => 'Normal',
331 1 => 'Multi-controller direct',
332 2 => 'Quick Control Dial direct',
333 },
334 },
335 14 => {
336 Name => 'ETTLII',
337 Description => 'E-TTL II',
338 PrintConv => {
339 0 => 'Evaluative',
340 1 => 'Average',
341 },
342 },
343 15 => {
344 Name => 'ShutterCurtainSync',
345 PrintConv => {
346 0 => '1st-curtain sync',
347 1 => '2nd-curtain sync',
348 },
349 },
350 16 => {
351 Name => 'SafetyShiftInAvOrTv',
352 PrintConv => \%disableEnable,
353 },
354 17 => {
355 Name => 'AFPointActivationArea',
356 PrintConv => {
357 0 => 'Standard',
358 1 => 'Expanded',
359 },
360 },
361 18 => {
362 Name => 'LCDDisplayReturnToShoot',
363 PrintConv => {
364 0 => 'With Shutter Button only',
365 1 => 'Also with * etc.',
366 },
367 },
368 19 => {
369 Name => 'LensAFStopButton',
370 PrintConv => {
371 0 => 'AF stop',
372 1 => 'AF start',
373 2 => 'AE lock while metering',
374 3 => 'AF point: M -> Auto / Auto -> Ctr.',
375 4 => 'ONE SHOT <-> AI SERVO',
376 5 => 'IS start',
377 },
378 },
379 20 => {
380 Name => 'AddOriginalDecisionData',
381 PrintConv => \%offOn,
382 },
383);
384
385# Custom functions for 10D
386%Image::ExifTool::CanonCustom::Functions10D = (
387 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
388 PROCESS_PROC => \&ProcessCanonCustom,
389 WRITE_PROC => \&WriteCanonCustom,
390 CHECK_PROC => \&CheckCanonCustom,
391 WRITABLE => 'int8u',
392 1 => {
393 Name => 'SetButtonWhenShooting',
394 PrintConv => {
395 0 => 'Normal (disabled)',
396 1 => 'Image quality',
397 2 => 'Change parameters',
398 3 => 'Menu display',
399 4 => 'Image playback',
400 },
401 },
402 2 => {
403 Name => 'ShutterReleaseNoCFCard',
404 Description => 'Shutter Release W/O CF Card',
405 PrintConv => {
406 0 => 'Yes',
407 1 => 'No',
408 },
409 },
410 3 => {
411 Name => 'FlashSyncSpeedAv',
412 PrintConv => {
413 0 => 'Auto',
414 1 => '1/200 Fixed',
415 },
416 },
417 4 => {
418 Name => 'Shutter-AELock',
419 PrintConv => {
420 0 => 'AF/AE lock',
421 1 => 'AE lock/AF',
422 2 => 'AF/AF lock, No AE lock',
423 3 => 'AE/AF, No AE lock',
424 },
425 },
426 5 => {
427 Name => 'AFAssist',
428 Description => 'AF Assist/Flash Firing',
429 PrintConv => {
430 0 => 'Emits/Fires',
431 1 => 'Does not emit/Fires',
432 2 => 'Only ext. flash emits/Fires',
433 3 => 'Emits/Does not fire',
434 },
435 },
436 6 => {
437 Name => 'ExposureLevelIncrements',
438 PrintConv => {
439 0 => '1/2 Stop',
440 1 => '1/3 Stop',
441 },
442 },
443 7 => {
444 Name => 'AFPointRegistration',
445 PrintConv => {
446 0 => 'Center',
447 1 => 'Bottom',
448 2 => 'Right',
449 3 => 'Extreme Right',
450 4 => 'Automatic',
451 5 => 'Extreme Left',
452 6 => 'Left',
453 7 => 'Top',
454 },
455 },
456 8 => {
457 Name => 'RawAndJpgRecording',
458 PrintConv => {
459 0 => 'RAW+Small/Normal',
460 1 => 'RAW+Small/Fine',
461 2 => 'RAW+Medium/Normal',
462 3 => 'RAW+Medium/Fine',
463 4 => 'RAW+Large/Normal',
464 5 => 'RAW+Large/Fine',
465 },
466 },
467 9 => {
468 Name => 'AEBSequenceAutoCancel',
469 Description => 'AEB Sequence/Auto Cancel',
470 PrintConv => {
471 0 => '0,-,+/Enabled',
472 1 => '0,-,+/Disabled',
473 2 => '-,0,+/Enabled',
474 3 => '-,0,+/Disabled',
475 },
476 },
477 10 => {
478 Name => 'SuperimposedDisplay',
479 PrintConv => \%onOff,
480 },
481 11 => {
482 Name => 'MenuButtonDisplayPosition',
483 PrintConv => {
484 0 => 'Previous (top if power off)',
485 1 => 'Previous',
486 2 => 'Top',
487 },
488 },
489 12 => {
490 Name => 'MirrorLockup',
491 PrintConv => \%disableEnable,
492 },
493 13 => {
494 Name => 'AssistButtonFunction',
495 PrintConv => {
496 0 => 'Normal',
497 1 => 'Select Home Position',
498 2 => 'Select HP (while pressing)',
499 3 => 'Av+/- (AF point by QCD)',
500 4 => 'FE lock',
501 },
502 },
503 14 => {
504 Name => 'FillFlashAutoReduction',
505 PrintConv => \%enableDisable,
506 },
507 15 => {
508 Name => 'ShutterCurtainSync',
509 PrintConv => {
510 0 => '1st-curtain sync',
511 1 => '2nd-curtain sync',
512 },
513 },
514 16 => {
515 Name => 'SafetyShiftInAvOrTv',
516 PrintConv => \%disableEnable,
517 },
518 17 => {
519 Name => 'LensAFStopButton',
520 PrintConv => {
521 0 => 'AF stop',
522 1 => 'AF start',
523 2 => 'AE lock while metering',
524 3 => 'AF point: M->Auto/Auto->ctr',
525 4 => 'One Shot <-> AI servo',
526 5 => 'IS start',
527 },
528 },
529);
530
531# Custom functions for the 20D (ref 2)
532%Image::ExifTool::CanonCustom::Functions20D = (
533 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
534 PROCESS_PROC => \&ProcessCanonCustom,
535 WRITE_PROC => \&WriteCanonCustom,
536 CHECK_PROC => \&CheckCanonCustom,
537 WRITABLE => 'int8u',
538 0 => {
539 Name => 'SetFunctionWhenShooting',
540 PrintConv => {
541 0 => 'Default (no function)',
542 1 => 'Change quality',
543 2 => 'Change Parameters',
544 3 => 'Menu display',
545 4 => 'Image replay',
546 },
547 },
548 1 => {
549 Name => 'LongExposureNoiseReduction',
550 PrintConv => \%offOn,
551 },
552 2 => {
553 Name => 'FlashSyncSpeedAv',
554 PrintConv => {
555 0 => 'Auto',
556 1 => '1/250 Fixed',
557 },
558 },
559 3 => {
560 Name => 'Shutter-AELock',
561 PrintConv => {
562 0 => 'AF/AE lock',
563 1 => 'AE lock/AF',
564 2 => 'AF/AF lock, No AE lock',
565 3 => 'AE/AF, No AE lock',
566 },
567 },
568 4 => {
569 Name => 'AFAssistBeam',
570 PrintConv => {
571 0 => 'Emits',
572 1 => 'Does not emit',
573 2 => 'Only ext. flash emits',
574 },
575 },
576 5 => {
577 Name => 'ExposureLevelIncrements',
578 PrintConv => {
579 0 => '1/3 Stop',
580 1 => '1/2 Stop',
581 },
582 },
583 6 => {
584 Name => 'FlashFiring',
585 PrintConv => {
586 0 => 'Fires',
587 1 => 'Does not fire',
588 },
589 },
590 7 => {
591 Name => 'ISOExpansion',
592 PrintConv => \%offOn,
593 },
594 8 => {
595 Name => 'AEBSequenceAutoCancel',
596 Description => 'AEB Sequence/Auto Cancel',
597 PrintConv => {
598 0 => '0,-,+/Enabled',
599 1 => '0,-,+/Disabled',
600 2 => '-,0,+/Enabled',
601 3 => '-,0,+/Disabled',
602 },
603 },
604 9 => {
605 Name => 'SuperimposedDisplay',
606 PrintConv => \%onOff,
607 },
608 10 => {
609 Name => 'MenuButtonDisplayPosition',
610 PrintConv => {
611 0 => 'Previous (top if power off)',
612 1 => 'Previous',
613 2 => 'Top',
614 },
615 },
616 11 => {
617 Name => 'MirrorLockup',
618 PrintConv => \%disableEnable,
619 },
620 12 => {
621 Name => 'AFPointSelectionMethod',
622 PrintConv => {
623 0 => 'Normal',
624 1 => 'Multi-controller direct',
625 2 => 'Quick Control Dial direct',
626 },
627 },
628 13 => {
629 Name => 'ETTLII',
630 Description => 'E-TTL II',
631 PrintConv => {
632 0 => 'Evaluative',
633 1 => 'Average',
634 },
635 },
636 14 => {
637 Name => 'ShutterCurtainSync',
638 PrintConv => {
639 0 => '1st-curtain sync',
640 1 => '2nd-curtain sync',
641 },
642 },
643 15 => {
644 Name => 'SafetyShiftInAvOrTv',
645 PrintConv => \%disableEnable,
646 },
647 16 => {
648 Name => 'LensAFStopButton',
649 PrintConv => {
650 0 => 'AF stop',
651 1 => 'AF start',
652 2 => 'AE lock while metering',
653 3 => 'AF point: M -> Auto / Auto -> Ctr.',
654 4 => 'ONE SHOT <-> AI SERVO',
655 5 => 'IS start',
656 },
657 },
658 17 => {
659 Name => 'AddOriginalDecisionData',
660 PrintConv => \%offOn,
661 },
662);
663
664# Custom functions for the 30D (PH)
665%Image::ExifTool::CanonCustom::Functions30D = (
666 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
667 PROCESS_PROC => \&ProcessCanonCustom,
668 WRITE_PROC => \&WriteCanonCustom,
669 CHECK_PROC => \&CheckCanonCustom,
670 WRITABLE => 'int8u',
671 1 => {
672 Name => 'SetFunctionWhenShooting',
673 PrintConv => {
674 0 => 'Default (no function)',
675 1 => 'Change quality',
676 2 => 'Change Picture Style',
677 3 => 'Menu display',
678 4 => 'Image replay',
679 },
680 },
681 2 => {
682 Name => 'LongExposureNoiseReduction',
683 PrintConv => {
684 0 => 'Off',
685 1 => 'Auto',
686 2 => 'On',
687 },
688 },
689 3 => {
690 Name => 'FlashSyncSpeedAv',
691 PrintConv => {
692 0 => 'Auto',
693 1 => '1/250 Fixed',
694 },
695 },
696 4 => {
697 Name => 'Shutter-AELock',
698 PrintConv => {
699 0 => 'AF/AE lock',
700 1 => 'AE lock/AF',
701 2 => 'AF/AF lock, No AE lock',
702 3 => 'AE/AF, No AE lock',
703 },
704 },
705 5 => {
706 Name => 'AFAssistBeam',
707 PrintConv => {
708 0 => 'Emits',
709 1 => 'Does not emit',
710 2 => 'Only ext. flash emits',
711 },
712 },
713 6 => {
714 Name => 'ExposureLevelIncrements',
715 PrintConv => {
716 0 => '1/3 Stop',
717 1 => '1/2 Stop',
718 },
719 },
720 7 => {
721 Name => 'FlashFiring',
722 PrintConv => {
723 0 => 'Fires',
724 1 => 'Does not fire',
725 },
726 },
727 8 => {
728 Name => 'ISOExpansion',
729 PrintConv => \%offOn,
730 },
731 9 => {
732 Name => 'AEBSequenceAutoCancel',
733 Description => 'AEB Sequence/Auto Cancel',
734 PrintConv => {
735 0 => '0,-,+/Enabled',
736 1 => '0,-,+/Disabled',
737 2 => '-,0,+/Enabled',
738 3 => '-,0,+/Disabled',
739 },
740 },
741 10 => {
742 Name => 'SuperimposedDisplay',
743 PrintConv => \%onOff,
744 },
745 11 => {
746 Name => 'MenuButtonDisplayPosition',
747 PrintConv => {
748 0 => 'Previous (top if power off)',
749 1 => 'Previous',
750 2 => 'Top',
751 },
752 },
753 12 => {
754 Name => 'MirrorLockup',
755 PrintConv => \%disableEnable,
756 },
757 13 => {
758 Name => 'AFPointSelectionMethod',
759 PrintConv => {
760 0 => 'Normal',
761 1 => 'Multi-controller direct',
762 2 => 'Quick Control Dial direct',
763 },
764 },
765 14 => {
766 Name => 'ETTLII',
767 Description => 'E-TTL II',
768 PrintConv => {
769 0 => 'Evaluative',
770 1 => 'Average',
771 },
772 },
773 15 => {
774 Name => 'ShutterCurtainSync',
775 PrintConv => {
776 0 => '1st-curtain sync',
777 1 => '2nd-curtain sync',
778 },
779 },
780 16 => {
781 Name => 'SafetyShiftInAvOrTv',
782 PrintConv => \%disableEnable,
783 },
784 17 => {
785 Name => 'MagnifiedView',
786 PrintConv => {
787 0 => 'Image playback only',
788 1 => 'Image review and playback',
789 },
790 },
791 18 => {
792 Name => 'LensAFStopButton',
793 PrintConv => {
794 0 => 'AF stop',
795 1 => 'AF start',
796 2 => 'AE lock while metering',
797 3 => 'AF point: M -> Auto / Auto -> Ctr.',
798 4 => 'ONE SHOT <-> AI SERVO',
799 5 => 'IS start',
800 },
801 },
802 19 => {
803 Name => 'AddOriginalDecisionData',
804 PrintConv => \%offOn,
805 },
806);
807
808# Custom functions for the 350D (PH)
809%Image::ExifTool::CanonCustom::Functions350D = (
810 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
811 PROCESS_PROC => \&ProcessCanonCustom,
812 WRITE_PROC => \&WriteCanonCustom,
813 CHECK_PROC => \&CheckCanonCustom,
814 WRITABLE => 'int8u',
815 0 => {
816 Name => 'SetButtonCrossKeysFunc',
817 PrintConv => {
818 0 => 'Normal',
819 1 => 'Set: Quality',
820 2 => 'Set: Parameter',
821 3 => 'Set: Playback',
822 4 => 'Cross keys: AF point select',
823 },
824 },
825 1 => {
826 Name => 'LongExposureNoiseReduction',
827 PrintConv => \%offOn,
828 },
829 2 => {
830 Name => 'FlashSyncSpeedAv',
831 PrintConv => {
832 0 => 'Auto',
833 1 => '1/200 Fixed',
834 },
835 },
836 3 => {
837 Name => 'Shutter-AELock',
838 PrintConv => {
839 0 => 'AF/AE lock',
840 1 => 'AE lock/AF',
841 2 => 'AF/AF lock, No AE lock',
842 3 => 'AE/AF, No AE lock',
843 },
844 },
845 4 => {
846 Name => 'AFAssistBeam',
847 PrintConv => {
848 0 => 'Emits',
849 1 => 'Does not emit',
850 2 => 'Only ext. flash emits',
851 },
852 },
853 5 => {
854 Name => 'ExposureLevelIncrements',
855 PrintConv => {
856 0 => '1/3 Stop',
857 1 => '1/2 Stop',
858 },
859 },
860 6 => {
861 Name => 'MirrorLockup',
862 PrintConv => \%disableEnable,
863 },
864 7 => {
865 Name => 'ETTLII',
866 Description => 'E-TTL II',
867 PrintConv => {
868 0 => 'Evaluative',
869 1 => 'Average',
870 },
871 },
872 8 => {
873 Name => 'ShutterCurtainSync',
874 PrintConv => {
875 0 => '1st-curtain sync',
876 1 => '2nd-curtain sync',
877 },
878 },
879);
880
881# Custom functions for the 400D (PH)
882%Image::ExifTool::CanonCustom::Functions400D = (
883 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
884 PROCESS_PROC => \&ProcessCanonCustom,
885 WRITE_PROC => \&WriteCanonCustom,
886 CHECK_PROC => \&CheckCanonCustom,
887 WRITABLE => 'int8u',
888 0 => {
889 Name => 'SetButtonCrossKeysFunc',
890 PrintConv => {
891 0 => 'Set: Picture Style',
892 1 => 'Set: Quality',
893 2 => 'Set: Flash Exposure Comp',
894 3 => 'Set: Playback',
895 4 => 'Cross keys: AF point select',
896 },
897 },
898 1 => {
899 Name => 'LongExposureNoiseReduction',
900 PrintConv => {
901 0 => 'Off',
902 1 => 'Auto',
903 2 => 'On',
904 },
905 },
906 2 => {
907 Name => 'FlashSyncSpeedAv',
908 PrintConv => {
909 0 => 'Auto',
910 1 => '1/200 Fixed',
911 },
912 },
913 3 => {
914 Name => 'Shutter-AELock',
915 PrintConv => {
916 0 => 'AF/AE lock',
917 1 => 'AE lock/AF',
918 2 => 'AF/AF lock, No AE lock',
919 3 => 'AE/AF, No AE lock',
920 },
921 },
922 4 => {
923 Name => 'AFAssistBeam',
924 PrintConv => {
925 0 => 'Emits',
926 1 => 'Does not emit',
927 2 => 'Only ext. flash emits',
928 },
929 },
930 5 => {
931 Name => 'ExposureLevelIncrements',
932 PrintConv => {
933 0 => '1/3 Stop',
934 1 => '1/2 Stop',
935 },
936 },
937 6 => {
938 Name => 'MirrorLockup',
939 PrintConv => \%disableEnable,
940 },
941 7 => {
942 Name => 'ETTLII',
943 Description => 'E-TTL II',
944 PrintConv => {
945 0 => 'Evaluative',
946 1 => 'Average',
947 },
948 },
949 8 => {
950 Name => 'ShutterCurtainSync',
951 PrintConv => {
952 0 => '1st-curtain sync',
953 1 => '2nd-curtain sync',
954 },
955 },
956 9 => {
957 Name => 'MagnifiedView',
958 PrintConv => {
959 0 => 'Image playback only',
960 1 => 'Image review and playback',
961 },
962 },
963 10 => {
964 Name => 'LCDDisplayAtPowerOn',
965 PrintConv => {
966 0 => 'Display',
967 1 => 'Retain power off status',
968 },
969 },
970);
971
972# Custom functions for the D30/D60
973%Image::ExifTool::CanonCustom::FunctionsD30 = (
974 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
975 PROCESS_PROC => \&ProcessCanonCustom,
976 WRITE_PROC => \&WriteCanonCustom,
977 CHECK_PROC => \&CheckCanonCustom,
978 NOTES => 'Custom functions for the EOS D30 and D60.',
979 WRITABLE => 'int8u',
980 1 => {
981 Name => 'LongExposureNoiseReduction',
982 PrintConv => \%offOn,
983 },
984 2 => {
985 Name => 'Shutter-AELock',
986 PrintConv => {
987 0 => 'AF/AE lock',
988 1 => 'AE lock/AF',
989 2 => 'AF/AF lock',
990 3 => 'AE+release/AE+AF',
991 },
992 },
993 3 => {
994 Name => 'MirrorLockup',
995 PrintConv => \%disableEnable,
996 },
997 4 => {
998 Name => 'ExposureLevelIncrements',
999 PrintConv => {
1000 0 => '1/2 Stop',
1001 1 => '1/3 Stop',
1002 },
1003 },
1004 5 => {
1005 Name => 'AFAssist',
1006 PrintConv => {
1007 0 => 'Emits/Fires',
1008 1 => 'Does not emit/Fires',
1009 2 => 'Only ext. flash emits/Fires',
1010 3 => 'Emits/Does not fire',
1011 },
1012 },
1013 6 => {
1014 Name => 'FlashSyncSpeedAv',
1015 PrintConv => {
1016 0 => 'Auto',
1017 1 => '1/200 Fixed',
1018 },
1019 },
1020 7 => {
1021 Name => 'AEBSequenceAutoCancel',
1022 Description => 'AEB Sequence/Auto Cancel',
1023 PrintConv => {
1024 0 => '0,-,+/Enabled',
1025 1 => '0,-,+/Disabled',
1026 2 => '-,0,+/Enabled',
1027 3 => '-,0,+/Disabled',
1028 },
1029 },
1030 8 => {
1031 Name => 'ShutterCurtainSync',
1032 PrintConv => {
1033 0 => '1st-curtain sync',
1034 1 => '2nd-curtain sync',
1035 },
1036 },
1037 9 => {
1038 Name => 'LensAFStopButton',
1039 PrintConv => {
1040 0 => 'AF Stop',
1041 1 => 'Operate AF',
1042 2 => 'Lock AE and start timer',
1043 },
1044 },
1045 10 => {
1046 Name => 'FillFlashAutoReduction',
1047 PrintConv => \%enableDisable,
1048 },
1049 11 => {
1050 Name => 'MenuButtonReturn',
1051 PrintConv => {
1052 0 => 'Top',
1053 1 => 'Previous (volatile)',
1054 2 => 'Previous',
1055 },
1056 },
1057 12 => {
1058 Name => 'SetButtonWhenShooting',
1059 PrintConv => {
1060 0 => 'Default (no function)',
1061 1 => 'Image quality',
1062 2 => 'Change ISO speed',
1063 3 => 'Change parameters',
1064 },
1065 },
1066 13 => {
1067 Name => 'SensorCleaning',
1068 PrintConv => \%disableEnable,
1069 },
1070 14 => {
1071 Name => 'SuperimposedDisplay',
1072 PrintConv => \%onOff,
1073 },
1074 15 => {
1075 Name => 'ShutterReleaseNoCFCard',
1076 Description => 'Shutter Release W/O CF Card',
1077 PrintConv => {
1078 0 => 'Yes',
1079 1 => 'No',
1080 },
1081 },
1082);
1083
1084# Custom functions for unknown cameras
1085%Image::ExifTool::CanonCustom::FuncsUnknown = (
1086 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1087 PROCESS_PROC => \&ProcessCanonCustom,
1088);
1089
1090# 1D personal function settings (ref PH)
1091%Image::ExifTool::CanonCustom::PersonalFuncs = (
1092 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1093 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1094 WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
1095 CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
1096 WRITABLE => 1,
1097 NOTES => 'Personal function settings for the EOS-1D.',
1098 FORMAT => 'int16u',
1099 FIRST_ENTRY => 1,
1100 1 => { Name => 'PF0CustomFuncRegistration', %convPFn },
1101 2 => { Name => 'PF1DisableShootingModes', %convPFn },
1102 3 => { Name => 'PF2DisableMeteringModes', %convPFn },
1103 4 => { Name => 'PF3ManualExposureMetering', %convPFn },
1104 5 => { Name => 'PF4ExposureTimeLimits', %convPFn },
1105 6 => { Name => 'PF5ApertureLimits', %convPFn },
1106 7 => { Name => 'PF6PresetShootingModes', %convPFn },
1107 8 => { Name => 'PF7BracketContinuousShoot', %convPFn },
1108 9 => { Name => 'PF8SetBracketShots', %convPFn },
1109 10 => { Name => 'PF9ChangeBracketSequence', %convPFn },
1110 11 => { Name => 'PF10RetainProgramShift', %convPFn },
1111 #12 => { Name => 'PF11Unused', %convPFn },
1112 #13 => { Name => 'PF12Unused', %convPFn },
1113 14 => { Name => 'PF13DrivePriority', %convPFn },
1114 15 => { Name => 'PF14DisableFocusSearch', %convPFn },
1115 16 => { Name => 'PF15DisableAFAssistBeam', %convPFn },
1116 17 => { Name => 'PF16AutoFocusPointShoot', %convPFn },
1117 18 => { Name => 'PF17DisableAFPointSel', %convPFn },
1118 19 => { Name => 'PF18EnableAutoAFPointSel', %convPFn },
1119 20 => { Name => 'PF19ContinuousShootSpeed', %convPFn },
1120 21 => { Name => 'PF20LimitContinousShots', %convPFn },
1121 22 => { Name => 'PF21EnableQuietOperation', %convPFn },
1122 #23 => { Name => 'PF22Unused', %convPFn },
1123 24 => { Name => 'PF23SetTimerLengths', %convPFn },
1124 25 => { Name => 'PF24LightLCDDuringBulb', %convPFn },
1125 26 => { Name => 'PF25DefaultClearSettings', %convPFn },
1126 27 => { Name => 'PF26ShortenReleaseLag', %convPFn },
1127 28 => { Name => 'PF27ReverseDialRotation', %convPFn },
1128 29 => { Name => 'PF28NoQuickDialExpComp', %convPFn },
1129 30 => { Name => 'PF29QuickDialSwitchOff', %convPFn },
1130 31 => { Name => 'PF30EnlargementMode', %convPFn },
1131 32 => { Name => 'PF31OriginalDecisionData', %convPFn },
1132);
1133
1134# 1D personal function values (ref PH)
1135%Image::ExifTool::CanonCustom::PersonalFuncValues = (
1136 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1137 PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1138 WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
1139 CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
1140 WRITABLE => 1,
1141 FORMAT => 'int16u',
1142 FIRST_ENTRY => 1,
1143 1 => 'PF1Value',
1144 2 => 'PF2Value',
1145 3 => 'PF3Value',
1146 4 => {
1147 Name => 'PF4ExposureTimeMin',
1148 RawConv => '$val > 0 ? $val : 0',
1149 ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val*4)*log(2))*1000/8',
1150 ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*8/1000)/log(2))/4',
1151 PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
1152 PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
1153 },
1154 5 => {
1155 Name => 'PF4ExposureTimeMax',
1156 RawConv => '$val > 0 ? $val : 0',
1157 ValueConv => 'exp(-Image::ExifTool::Canon::CanonEv($val*4)*log(2))*1000/8',
1158 ValueConvInv => 'Image::ExifTool::Canon::CanonEvInv(-log($val*8/1000)/log(2))/4',
1159 PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
1160 PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
1161 },
1162 6 => {
1163 Name => 'PF5ApertureMin',
1164 RawConv => '$val > 0 ? $val : 0',
1165 ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val*4-32)*log(2)/2)',
1166 ValueConvInv => '(Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))+32)/4',
1167 PrintConv => 'sprintf("%.2g",$val)',
1168 PrintConvInv => '$val',
1169 },
1170 7 => {
1171 Name => 'PF5ApertureMax',
1172 RawConv => '$val > 0 ? $val : 0',
1173 ValueConv => 'exp(Image::ExifTool::Canon::CanonEv($val*4-32)*log(2)/2)',
1174 ValueConvInv => '(Image::ExifTool::Canon::CanonEvInv(log($val)*2/log(2))+32)/4',
1175 PrintConv => 'sprintf("%.2g",$val)',
1176 PrintConvInv => '$val',
1177 },
1178 8 => 'PF8BracketShots',
1179 9 => 'PF19ShootingSpeedLow',
1180 10 => 'PF19ShootingSpeedHigh',
1181 11 => 'PF20MaxContinousShots',
1182 12 => 'PF23ShutterButtonTime',
1183 13 => 'PF23FELockTime',
1184 14 => 'PF23PostReleaseTime',
1185 15 => 'PF25AEMode',
1186 16 => 'PF25MeteringMode',
1187 17 => 'PF25DriveMode',
1188 18 => 'PF25AFMode',
1189 19 => 'PF25AFPointSel',
1190 20 => 'PF25ImageSize',
1191 21 => 'PF25WBMode',
1192 22 => 'PF25Parameters',
1193 23 => 'PF25ColorMatrix',
1194 24 => 'PF27Value',
1195);
1196
1197# Custom functions used by the 1D Mark III and later models (ref PH)
1198%Image::ExifTool::CanonCustom::Functions2 = (
1199 GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1200 PROCESS_PROC => \&ProcessCanonCustom2,
1201 CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1202 WRITE_PROC => \&WriteCanonCustom2,
1203 WRITABLE => 'int32s',
1204 NOTES => q{
1205 Beginning with the EOS 1D Mark III, Canon finally created a set of custom
1206 function tags which are (reasonably) consistent across models. The EOS 1D
1207 Mark III has 57 custom function tags divided into four main groups: 1.
1208 Exposure (0x0101-0x010f), 2. Image (0x0201-0x0203), Flash Exposure
1209 (0x0304-0x0306) and Display (0x0407-0x0409), 3. Auto Focus (0x0501-0x050e)
1210 and Drive (0x060f-0x0611), and 4. Operation (0x0701-0x070a) and Others
1211 (0x080b-0x0810). The table below lists tags used by the EOS 1D Mark III, as
1212 well as newer tags and values added by later models.
1213 },
1214 # grouped in 4 groups:
1215 # 1) Exposure
1216 0x0101 => [
1217 {
1218 Name => 'ExposureLevelIncrements',
1219 Condition => '$$self{Model} =~ /\b1Ds?\b/',
1220 Notes => '1DmkIII and 1DmkIV',
1221 PrintConv => {
1222 0 => '1/3-stop set, 1/3-stop comp.',
1223 1 => '1-stop set, 1/3-stop comp.',
1224 2 => '1/2-stop set, 1/2-stop comp.',
1225 },
1226 },
1227 {
1228 Name => 'ExposureLevelIncrements',
1229 Notes => 'other models',
1230 PrintConv => {
1231 0 => '1/3 Stop',
1232 1 => '1/2 Stop',
1233 },
1234 },
1235 ],
1236 0x0102 => {
1237 Name => 'ISOSpeedIncrements',
1238 PrintConv => {
1239 0 => '1/3 Stop',
1240 1 => '1 Stop',
1241 },
1242 },
1243 0x0103 => [
1244 {
1245 Name => 'ISOSpeedRange',
1246 Condition => '$$self{Model} =~ /\b1D/',
1247 Notes => '1DmkIII and 1DmkIV',
1248 Count => 3,
1249 # (this decoding may not be valid for CR2 images?)
1250 ValueConv => [
1251 undef,
1252 # this may also be set to "H" (Hi6400) -- is this the -1 value I see? - PH
1253 '$val < 2 ? $val : ($val < 1000 ? exp(($val/8-9)*log(2))*100 : 0)', # (educated guess)
1254 # this may also be set to "L" (Lo50) -- is this the 1 value I see? - PH
1255 '$val < 2 ? $val : ($val < 1000 ? exp(($val/8-9)*log(2))*100 : 0)', # (educated guess)
1256 ],
1257 ValueConvInv => [
1258 undef,
1259 '$val < 2 ? $val : int(8*(log($val/100)/log(2)+9) + 0.5)',
1260 '$val < 2 ? $val : int(8*(log($val/100)/log(2)+9) + 0.5)',
1261 ],
1262 PrintConv => [
1263 \%disableEnable,
1264 'sprintf("Max %.0f",$val)',
1265 'sprintf("Min %.0f",$val)',
1266 ],
1267 PrintConvInv => [
1268 undef,
1269 '$val=~/(-?[\d.]+)/ ? $1 : 0',
1270 '$val=~/(-?[\d.]+)/ ? $1 : 0',
1271 ],
1272 },
1273 {
1274 Name => 'ISOExpansion',
1275 Notes => 'other models',
1276 PrintConv => {
1277 0 => 'Off',
1278 1 => 'On',
1279 },
1280 },
1281 ],
1282 0x0104 => {
1283 Name => 'AEBAutoCancel',
1284 PrintConv => \%onOff,
1285 },
1286 0x0105 => {
1287 Name => 'AEBSequence',
1288 Notes => 'value of 2 not used by 40D, 50D, 60D, 5DmkII and 7D',
1289 PrintConv => {
1290 0 => '0,-,+',
1291 1 => '-,0,+',
1292 2 => '+,0,-',
1293 },
1294 },
1295 0x0106 => {
1296 Name => 'AEBShotCount',
1297 Count => -1,
1298 Notes => '1 value for the 1DmkIII, 2 for the 1DmkIV',
1299 PrintConv => [{
1300 0 => 3,
1301 1 => 2,
1302 2 => 5,
1303 3 => 7,
1304 }],
1305 },
1306 0x0107 => {
1307 Name => 'SpotMeterLinkToAFPoint',
1308 PrintConv => {
1309 0 => 'Disable (use center AF point)',
1310 1 => 'Enable (use active AF point)',
1311 },
1312 },
1313 0x0108 => {
1314 Name => 'SafetyShift',
1315 Notes => 'value of 2 not used by 40D, 50D, 60D, 5DmkII and 7D',
1316 PrintConv => {
1317 0 => 'Disable',
1318 1 => 'Enable (Tv/Av)',
1319 2 => 'Enable (ISO speed)',
1320 },
1321 },
1322 0x0109 => {
1323 Name => 'UsableShootingModes',
1324 Count => 2,
1325 PrintConv => [
1326 \%disableEnable,
1327 'sprintf("Flags 0x%x",$val)', # (M, Tv, Av, P, Bulb)
1328 ],
1329 PrintConvInv => [
1330 undef,
1331 '$val=~/0x([\dA-F]+)/i ? hex($1) : undef',
1332 ],
1333 },
1334 0x010a => {
1335 Name => 'UsableMeteringModes',
1336 Count => 2,
1337 PrintConv => [
1338 \%disableEnable,
1339 'sprintf("Flags 0x%x",$val)', # (evaluative,partial,spot,center-weighted average)
1340 ],
1341 PrintConvInv => [
1342 undef,
1343 '$val=~/0x([\dA-F]+)/i ? hex($1) : undef',
1344 ],
1345 },
1346 0x010b => {
1347 Name => 'ExposureModeInManual',
1348 PrintConv => {
1349 0 => 'Specified metering mode',
1350 1 => 'Evaluative metering',
1351 2 => 'Partial metering',
1352 3 => 'Spot metering',
1353 4 => 'Center-weighted average',
1354 },
1355 },
1356 0x010c => {
1357 Name => 'ShutterSpeedRange',
1358 Count => 3,
1359 ValueConv => [
1360 undef,
1361 'exp(-($val/8-7)*log(2))',
1362 'exp(-($val/8-7)*log(2))',
1363 ],
1364 ValueConvInv => [
1365 undef,
1366 'int(-8*(log($val)/log(2)-7) + 0.5)',
1367 'int(-8*(log($val)/log(2)-7) + 0.5)',
1368 ],
1369 PrintConv => [
1370 \%disableEnable,
1371 '"Hi " . Image::ExifTool::Exif::PrintExposureTime($val)',
1372 '"Lo " . Image::ExifTool::Exif::PrintExposureTime($val)',
1373 ],
1374 PrintConvInv => [
1375 undef,
1376 '$val=~m{([\d./]+)} ? eval $1 : 0',
1377 '$val=~m{([\d./]+)} ? eval $1 : 0',
1378 ],
1379 },
1380 0x010d => {
1381 Name => 'ApertureRange',
1382 Count => 3,
1383 ValueConv => [
1384 undef,
1385 'exp(($val/8-1)*log(2)/2)',
1386 'exp(($val/8-1)*log(2)/2)',
1387 ],
1388 ValueConvInv => [
1389 undef,
1390 'int(8*(log($val)*2/log(2)+1) + 0.5)',
1391 'int(8*(log($val)*2/log(2)+1) + 0.5)',
1392 ],
1393 PrintConv => [
1394 \%disableEnable,
1395 'sprintf("Closed %.2g",$val)',
1396 'sprintf("Open %.2g",$val)',
1397 ],
1398 PrintConvInv => [
1399 undef,
1400 '$val=~/([\d.]+)/ ? $1 : 0',
1401 '$val=~/([\d.]+)/ ? $1 : 0',
1402 ],
1403 },
1404 0x010e => {
1405 Name => 'ApplyShootingMeteringMode',
1406 Count => 8,
1407 PrintConv => [ \%disableEnable ],
1408 },
1409 0x010f => [
1410 {
1411 Name => 'FlashSyncSpeedAv',
1412 Condition => '$$self{Model} =~ /\b40D\b/',
1413 Notes => '40D',
1414 PrintConv => {
1415 0 => 'Auto',
1416 1 => '1/250 Fixed',
1417 },
1418 },
1419 {
1420 Name => 'FlashSyncSpeedAv',
1421 Condition => '$$self{Model} =~ /\b(50D|60D|7D)\b/',
1422 Notes => '50D, 60D and 7D',
1423 PrintConv => {
1424 0 => 'Auto',
1425 1 => '1/250-1/60 Auto',
1426 2 => '1/250 Fixed',
1427 },
1428 },
1429 {
1430 Name => 'FlashSyncSpeedAv',
1431 Condition => '$$self{Model} =~ /\b(450D|XSi|Kiss X2|1000D|XS|Kiss F)\b/',
1432 Notes => '450D and 1000D',
1433 PrintConv => {
1434 0 => 'Auto',
1435 1 => '1/200 Fixed',
1436 },
1437 },
1438 {
1439 Name => 'FlashSyncSpeedAv',
1440 Condition => '$$self{Model} =~ /\b(5D Mark II|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/',
1441 Notes => '5D Mark II, 500D and 550D',
1442 PrintConv => {
1443 0 => 'Auto',
1444 1 => '1/200-1/60 Auto',
1445 2 => '1/200 Fixed',
1446 },
1447 },
1448 {
1449 Name => 'FlashSyncSpeedAv',
1450 Condition => '$$self{Model} =~ /\b(EOS-1D Mark IV)\b/',
1451 Notes => '1D Mark IV',
1452 PrintConv => {
1453 0 => 'Auto',
1454 1 => '1/300-1/60 Auto',
1455 2 => '1/300 Fixed',
1456 },
1457 },
1458 {
1459 Name => 'FlashSyncSpeedAv',
1460 Notes => '1D Mark III',
1461 PrintConv => {
1462 0 => 'Auto',
1463 1 => '1/300 Fixed',
1464 },
1465 },
1466 ],
1467 0x0110 => { # new for 1DmkIV
1468 Name => 'FEMicroadjustment',
1469 Count => 3,
1470 PrintConv => [ \%disableEnable ],
1471 },
1472 0x0111 => { # new for 1DmkIV
1473 Name => 'AEMicroadjustment',
1474 Count => 3,
1475 PrintConv => [ \%disableEnable ],
1476 },
1477 #### 2a) Image
1478 0x0201 => {
1479 Name => 'LongExposureNoiseReduction',
1480 PrintConv => {
1481 0 => 'Off',
1482 1 => 'Auto',
1483 2 => 'On',
1484 },
1485 },
1486 0x0202 => [
1487 {
1488 Name => 'HighISONoiseReduction',
1489 Condition => '$$self{Model} =~ /\b(50D|60D|5D Mark II|7D|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/',
1490 Notes => '50D, 60D, 500D, 550D, 5DmkII and 7D',
1491 PrintConv => {
1492 0 => 'Standard',
1493 1 => 'Low',
1494 2 => 'Strong',
1495 3 => 'Off',
1496 },
1497 },
1498 {
1499 Name => 'HighISONoiseReduction',
1500 Notes => 'other models',
1501 PrintConv => \%offOn,
1502 },
1503 ],
1504 0x0203 => {
1505 Name => 'HighlightTonePriority',
1506 PrintConv => \%disableEnable
1507 },
1508 0x0204 => [
1509 {
1510 Name => 'AutoLightingOptimizer',
1511 Condition => '$$self{Model} =~ /\b(50D|5D Mark II|500D|T1i|Kiss X3|1D Mark IV)\b/',
1512 Notes => '50D, 500D, 5DmkII and 1DmkIV',
1513 PrintConv => {
1514 0 => 'Standard',
1515 1 => 'Low',
1516 2 => 'Strong',
1517 3 => 'Disable',
1518 },
1519 },
1520 {
1521 Name => 'AutoLightingOptimizer',
1522 Notes => 'other models',
1523 PrintConv => \%enableDisable,
1524 },
1525 ],
1526 #### 2b) Flash exposure
1527 0x0304 => {
1528 Name => 'ETTLII',
1529 Description => 'E-TTL II',
1530 PrintConv => {
1531 0 => 'Evaluative',
1532 1 => 'Average',
1533 },
1534 },
1535 0x0305 => {
1536 Name => 'ShutterCurtainSync',
1537 PrintConv => {
1538 0 => '1st-curtain sync',
1539 1 => '2nd-curtain sync',
1540 },
1541 },
1542 0x0306 => {
1543 Name => 'FlashFiring',
1544 PrintConv => {
1545 0 => 'Fires',
1546 1 => 'Does not fire',
1547 },
1548 },
1549 #### 2c) Display
1550 0x0407 => {
1551 Name => 'ViewInfoDuringExposure',
1552 PrintConv => \%disableEnable,
1553 },
1554 0x0408 => {
1555 Name => 'LCDIlluminationDuringBulb',
1556 PrintConv => \%offOn,
1557 },
1558 0x0409 => [
1559 {
1560 Name => 'InfoButtonWhenShooting',
1561 Condition => '$$self{Model} =~ /\b1Ds? Mark III\b/',
1562 Notes => '1D Mark III',
1563 PrintConv => {
1564 0 => 'Displays camera settings',
1565 1 => 'Displays shooting functions',
1566 },
1567 },
1568 {
1569 Name => 'InfoButtonWhenShooting',
1570 Notes => '1D Mark IV',
1571 PrintConv => {
1572 # reversed from earlier models. grr...
1573 0 => 'Displays shooting functions',
1574 1 => 'Displays camera settings',
1575 },
1576 },
1577 ],
1578 #### 3a) Auto focus
1579 0x0501 => {
1580 Name => 'USMLensElectronicMF',
1581 PrintConv => {
1582 0 => 'Enable after one-shot AF',
1583 1 => 'Disable after one-shot AF',
1584 2 => 'Disable in AF mode',
1585 },
1586 },
1587 0x0502 => {
1588 Name => 'AIServoTrackingSensitivity',
1589 PrintConv => {
1590 -2 => 'Slow',
1591 -1 => 'Medium Slow',
1592 0 => 'Standard',
1593 1 => 'Medium Fast',
1594 2 => 'Fast',
1595 },
1596 },
1597 0x0503 => {
1598 Name => 'AIServoImagePriority',
1599 PrintConv => {
1600 0 => '1: AF, 2: Tracking',
1601 1 => '1: AF, 2: Drive speed',
1602 2 => '1: Release, 2: Drive speed',
1603 3 => '1: Release, 2: Tracking', # 7D/1DmkIV
1604 },
1605 },
1606 0x0504 => {
1607 Name => 'AIServoTrackingMethod',
1608 PrintConv => {
1609 0 => 'Main focus point priority',
1610 1 => 'Continuous AF track priority',
1611 },
1612 },
1613 0x0505 => {
1614 Name => 'LensDriveNoAF',
1615 PrintConv => {
1616 0 => 'Focus search on',
1617 1 => 'Focus search off',
1618 },
1619 },
1620 0x0506 => {
1621 Name => 'LensAFStopButton',
1622 Notes => 'value of 6 not used by 40D, 50D and 5DmkII',
1623 PrintConv => {
1624 0 => 'AF stop',
1625 1 => 'AF start',
1626 2 => 'AE lock',
1627 3 => 'AF point: M->Auto/Auto->ctr',
1628 4 => 'One Shot <-> AI servo',
1629 5 => 'IS start',
1630 6 => 'Switch to registered AF point',
1631 7 => 'Spot AF', # 1DmkIV
1632 },
1633 },
1634 0x0507 => {
1635 Name => 'AFMicroadjustment',
1636 Count => 5,
1637 PrintConv => [
1638 {
1639 0 => 'Disable',
1640 1 => 'Adjust all by same amount',
1641 2 => 'Adjust by lens',
1642 },
1643 # DECODE OTHER VALUES
1644 ],
1645 },
1646 0x0508 => [
1647 {
1648 Name => 'AFPointAreaExpansion',
1649 Condition => '$$self{Model} =~ /\b5D Mark II\b/',
1650 Notes => '5D Mark II',
1651 PrintConv => {
1652 0 => 'Disable',
1653 1 => 'Enable',
1654 },
1655 },
1656 {
1657 Name => 'AFPointAreaExpansion',
1658 PrintConv => {
1659 0 => 'Disable',
1660 1 => 'Left/right AF points',
1661 2 => 'Surrounding AF points',
1662 3 => 'All 45 points area', # 1DmkIV
1663 },
1664 },
1665 ],
1666 0x0509 => [
1667 {
1668 Name => 'SelectableAFPoint',
1669 Condition => '$$self{Model} =~ /\b1D Mark IV\b/',
1670 Notes => '1D Mark IV',
1671 PrintConv => {
1672 0 => '45 points',
1673 1 => '19 points',
1674 2 => '11 points',
1675 3 => 'Inner 9 points',
1676 4 => 'Outer 9 points',
1677 },
1678 },
1679 {
1680 Name => 'SelectableAFPoint',
1681 Notes => 'other models',
1682 PrintConv => {
1683 0 => '19 points',
1684 1 => 'Inner 9 points',
1685 2 => 'Outer 9 points',
1686 3 => '19 Points, Multi-controller selectable', #4
1687 4 => 'Inner 9 Points, Multi-controller selectable', #4
1688 5 => 'Outer 9 Points, Multi-controller selectable', #4
1689 },
1690 },
1691 ],
1692 0x050a => [
1693 {
1694 Name => 'SwitchToRegisteredAFPoint',
1695 Condition => '$$self{Model} =~ /\b1D Mark IV\b/',
1696 Notes => '1D Mark IV',
1697 PrintConv => {
1698 0 => 'Disable',
1699 1 => 'Switch with multi-controller',
1700 2 => 'Only while AEL is pressed',
1701 },
1702 },
1703 {
1704 Name => 'SwitchToRegisteredAFPoint',
1705 Notes => 'other models',
1706 PrintConv => \%disableEnable,
1707 },
1708 ],
1709 0x050b => {
1710 Name => 'AFPointAutoSelection',
1711 PrintConv => {
1712 0 => 'Control-direct:disable/Main:enable',
1713 1 => 'Control-direct:disable/Main:disable',
1714 2 => 'Control-direct:enable/Main:enable',
1715 },
1716 },
1717 0x050c => {
1718 Name => 'AFPointDisplayDuringFocus',
1719 PrintConv => {
1720 0 => 'On',
1721 1 => 'Off',
1722 2 => 'On (when focus achieved)',
1723 },
1724 },
1725 0x050d => {
1726 Name => 'AFPointBrightness',
1727 PrintConv => {
1728 0 => 'Normal',
1729 1 => 'Brighter',
1730 },
1731 },
1732 0x050e => [
1733 {
1734 Name => 'AFAssistBeam',
1735 Condition => '$$self{Model} =~ /\b1D Mark IV\b/',
1736 Notes => '1D Mark IV',
1737 PrintConv => {
1738 0 => 'Emits',
1739 1 => 'Does not emit',
1740 2 => 'IR AF assist beam only',
1741 },
1742 },
1743 {
1744 Name => 'AFAssistBeam',
1745 Notes => 'other models; values 2-3 not used by 1DmkIII or 5DmkII, value 3 new for 7D',
1746 PrintConv => {
1747 0 => 'Emits',
1748 1 => 'Does not emit',
1749 2 => 'Only ext. flash emits',
1750 3 => 'IR AF assist beam only', # new for 7D
1751 },
1752 },
1753 ],
1754 0x050f => [ # new for 40D
1755 {
1756 Name => 'AFPointSelectionMethod',
1757 Condition => '$$self{Model} !~ /\b60D\b/',
1758 Notes => '40D, 50D and 5DmkII',
1759 PrintConv => {
1760 0 => 'Normal',
1761 1 => 'Multi-controller direct',
1762 2 => 'Quick Control Dial direct',
1763 },
1764 },
1765 {
1766 Name => 'AFPointSelectionMethod',
1767 Notes => '60D',
1768 PrintConv => {
1769 0 => 'AF point button: Activate AF Sel; Rear dial: Select AF points',
1770 1 => 'AF point button: Auto selection; Rear dial: Manual selection',
1771 },
1772 },
1773 ],
1774 0x0510 => [ # new for 40D
1775 {
1776 Name => 'VFDisplayIllumination',
1777 Condition => '$$self{Model} =~ /\b7D\b/',
1778 Notes => '7D',
1779 PrintConv => {
1780 0 => 'Auto',
1781 1 => 'Enable',
1782 2 => 'Disable',
1783 },
1784 },
1785 {
1786 Name => 'SuperimposedDisplay',
1787 Notes => 'other models',
1788 PrintConv => \%onOff,
1789 },
1790 ],
1791 0x0511 => [ # new for 40D
1792 {
1793 Name => 'AFDuringLiveView',
1794 Condition => '$$self{Model} =~ /\b40D\b/',
1795 Notes => '40D',
1796 PrintConv => \%disableEnable,
1797 },
1798 {
1799 Name => 'AFDuringLiveView',
1800 Notes => '450D and 1000D',
1801 PrintConv => {
1802 0 => 'Disable',
1803 1 => 'Quick mode',
1804 2 => 'Live mode',
1805 },
1806 },
1807 ],
1808 0x0512 => { # new for 7D
1809 Name => 'SelectAFAreaSelectMode',
1810 PrintConv => [
1811 {
1812 0 => 'Disable',
1813 1 => 'Enable',
1814 2 => 'Register',
1815 3 => 'Select AF-modes',
1816 },
1817 # must decode 2nd value
1818 ],
1819 },
1820 0x0513 => { # new for 7D
1821 Name => 'ManualAFPointSelectPattern',
1822 PrintConv => {
1823 0 => 'Stops at AF area edges',
1824 1 => 'Continuous',
1825 },
1826 },
1827 0x0514 => { # new for 7D
1828 Name => 'DisplayAllAFPoints',
1829 PrintConv => \%enableDisable,
1830 },
1831 0x0515 => { # new for 7D
1832 Name => 'FocusDisplayAIServoAndMF',
1833 PrintConv => \%enableDisable,
1834 },
1835 0x0516 => { # new for 7D and 1DmkIV
1836 Name => 'OrientationLinkedAFPoint',
1837 PrintConv => {
1838 0 => 'Same for verical and horizontal',
1839 1 => 'Select different AF points',
1840 },
1841 },
1842 0x0517 => { # new for 1DmkIV
1843 Name => 'MultiControllerWhileMetering',
1844 PrintConv => {
1845 0 => 'Off',
1846 1 => 'AF point selection',
1847 },
1848 },
1849 #### 3b) Drive
1850 0x060f => {
1851 Name => 'MirrorLockup',
1852 Notes => 'value of 2 not used by some models',
1853 PrintConv => {
1854 0 => 'Disable',
1855 1 => 'Enable',
1856 2 => 'Enable: Down with Set',
1857 },
1858 },
1859 0x0610 => {
1860 Name => 'ContinuousShootingSpeed',
1861 Count => 3,
1862 PrintConv => [
1863 \%disableEnable,
1864 '"Hi $val"',
1865 '"Lo $val"',
1866 ],
1867 PrintConvInv => [
1868 undef,
1869 '$val=~/(\d+)/ ? $1 : 0',
1870 '$val=~/(\d+)/ ? $1 : 0',
1871 ],
1872 },
1873 0x0611 => {
1874 Name => 'ContinuousShotLimit',
1875 Count => 2,
1876 PrintConv => [
1877 \%disableEnable,
1878 '"$val shots"',
1879 ],
1880 PrintConvInv => [
1881 undef,
1882 '$val=~/(\d+)/ ? $1 : 0',
1883 ],
1884 },
1885 #### 4a) Operation
1886 0x0701 => [
1887 {
1888 Name => 'Shutter-AELock',
1889 Condition => '$$self{Model} =~ /\b(1000D|XS|Kiss F|500D|T1i|Kiss X3|550D|T2i|Kiss X4)\b/',
1890 Notes => '500D, 550D and 1000D',
1891 PrintConv => {
1892 0 => 'AF/AE lock',
1893 1 => 'AE lock/AF',
1894 2 => 'AF/AF lock, No AE lock',
1895 3 => 'AE/AF, No AE lock',
1896 },
1897 },
1898 {
1899 Name => 'AFAndMeteringButtons',
1900 Condition => '$$self{Model} =~ /\b60D\b/',
1901 Notes => '60D',
1902 PrintConv => {
1903 0 => 'Metering start',
1904 1 => 'Metering + AF start',
1905 2 => 'AE lock',
1906 3 => 'AF stop',
1907 4 => 'No function',
1908 },
1909 },
1910 {
1911 Name => 'ShutterButtonAFOnButton',
1912 Notes => 'other models',
1913 PrintConv => {
1914 0 => 'Metering + AF start',
1915 1 => 'Metering + AF start/AF stop',
1916 2 => 'Metering start/Meter + AF start',
1917 3 => 'AE lock/Metering + AF start',
1918 4 => 'Metering + AF start/disable',
1919 },
1920 },
1921 ],
1922 0x0702 => {
1923 Name => 'AFOnAELockButtonSwitch',
1924 PrintConv => \%disableEnable,
1925 },
1926 0x0703 => {
1927 Name => 'QuickControlDialInMeter',
1928 PrintConv => {
1929 0 => 'Exposure comp/Aperture',
1930 1 => 'AF point selection',
1931 2 => 'ISO speed',
1932 3 => 'AF point selection swapped with Exposure comp', #4
1933 4 => 'ISO speed swapped with Exposure comp', #4
1934 },
1935 },
1936 0x0704 => [
1937 {
1938 Name => 'SetButtonWhenShooting',
1939 Condition => '$$self{Model} =~ /\b(40D|50D|5D Mark II)\b/',
1940 Notes => '40D, 50D and 5DmkII; value of 5 is new for 50D, and 6 is new for 5DmkII',
1941 PrintConv => {
1942 0 => 'Normal (disabled)',
1943 1 => 'Image quality',
1944 2 => 'Picture style',
1945 3 => 'Menu display',
1946 4 => 'Image playback',
1947 5 => 'Quick control screen', #50D
1948 6 => 'Record movie (Live View)', #5DmkII
1949 },
1950 },
1951 {
1952 Name => 'SetButtonWhenShooting',
1953 Condition => '$$self{Model} =~ /\b60D\b/',
1954 Notes => '60D',
1955 PrintConv => {
1956 0 => 'Normal (disabled)',
1957 1 => 'Image quality',
1958 2 => 'Picture style',
1959 3 => 'White balance',
1960 4 => 'Flash exposure compensation',
1961 5 => 'Viewfinder leveling gauge',
1962 },
1963 },
1964 {
1965 Name => 'SetButtonWhenShooting',
1966 Condition => '$$self{Model} =~ /\b(450D|XSi|Kiss X2|550D|T2i|Kiss X4)\b/',
1967 Notes => '450D and 550D; value of 5 is new for 550D',
1968 PrintConv => {
1969 0 => 'Normal (disabled)',
1970 1 => 'Image quality',
1971 2 => 'Flash exposure compensation',
1972 3 => 'LCD monitor On/Off',
1973 4 => 'Menu display',
1974 5 => 'ISO speed',
1975 },
1976 },
1977 {
1978 Name => 'SetButtonWhenShooting',
1979 Condition => '$$self{Model} =~ /\b(1000D|XS|Kiss F)\b/',
1980 Notes => '1000D',
1981 PrintConv => {
1982 0 => 'LCD monitor On/Off',
1983 1 => 'Image quality',
1984 2 => 'Flash exposure compensation',
1985 3 => 'Menu display',
1986 4 => 'Disabled',
1987 },
1988 },
1989 {
1990 Name => 'SetButtonWhenShooting',
1991 Condition => '$$self{Model} =~ /\b(500D|T1i|Kiss X3)\b/',
1992 Notes => '500D',
1993 PrintConv => {
1994 0 => 'Quick control screen',
1995 1 => 'Image quality',
1996 2 => 'Flash exposure compensation',
1997 3 => 'LCD monitor On/Off',
1998 4 => 'Menu display',
1999 5 => 'Disabled',
2000 },
2001 },
2002 {
2003 Name => 'SetButtonWhenShooting',
2004 Notes => '1DmkIII and 1DmkIV',
2005 PrintConv => {
2006 0 => 'Normal (disabled)',
2007 1 => 'White balance',
2008 2 => 'Image size',
2009 3 => 'ISO speed',
2010 4 => 'Picture style',
2011 5 => 'Record func. + media/folder',
2012 6 => 'Menu display',
2013 7 => 'Image playback',
2014 },
2015 },
2016 ],
2017 0x0705 => {
2018 Name => 'ManualTv',
2019 Description => 'Manual Tv/Av For M',
2020 PrintConv => {
2021 0 => 'Tv=Main/Av=Control',
2022 1 => 'Tv=Control/Av=Main',
2023 },
2024 },
2025 0x0706 => {
2026 Name => 'DialDirectionTvAv',
2027 PrintConv => {
2028 0 => 'Normal',
2029 1 => 'Reversed',
2030 },
2031 },
2032 0x0707 => {
2033 Name => 'AvSettingWithoutLens',
2034 PrintConv => \%disableEnable,
2035 },
2036 0x0708 => {
2037 Name => 'WBMediaImageSizeSetting',
2038 PrintConv => {
2039 0 => 'Rear LCD panel',
2040 1 => 'LCD monitor',
2041 },
2042 },
2043 0x0709 => {
2044 Name => 'LockMicrophoneButton',
2045 PrintConv => {
2046 # called "sound" in 1DmkIII manual, and "memo" in 1DmkIV manual
2047 0 => 'Protect (hold:record memo)',
2048 1 => 'Record memo (protect:disable)',
2049 2 => 'Play memo (hold:record memo)', # new with 1DmkIV
2050 },
2051 },
2052 0x070a => {
2053 Name => 'ButtonFunctionControlOff',
2054 PrintConv => {
2055 0 => 'Normal (enable)',
2056 1 => 'Disable main, Control, Multi-control',
2057 },
2058 },
2059 0x070b => { # 50D (also, 5DmkII writes this but it isn't in user guide)
2060 Name => 'AssignFuncButton',
2061 PrintConv => {
2062 0 => 'LCD brightness',
2063 1 => 'Image quality',
2064 2 => 'Exposure comp./AEB setting',
2065 3 => 'Image jump with main dial',
2066 4 => 'Live view function settings',
2067 },
2068 },
2069 0x070c => { # new for 7D
2070 Name => 'CustomControls',
2071 # (too much stuff to decode)
2072 },
2073 0x070d => { # new for 1DmkIV
2074 Name => 'StartMovieShooting',
2075 PrintConv => {
2076 0 => 'Default (from LV)',
2077 1 => 'Quick start (FEL button)',
2078 },
2079 },
2080 #### 4b) Others
2081 0x080b => [
2082 {
2083 Name => 'FocusingScreen',
2084 Condition => '$$self{Model} =~ /\b(40D|50D|60D)\b/',
2085 Notes => '40D, 50D and 60D',
2086 PrintConv => {
2087 0 => 'Ef-A',
2088 1 => 'Ef-D',
2089 2 => 'Ef-S',
2090 },
2091 },
2092 {
2093 Name => 'FocusingScreen',
2094 Condition => '$$self{Model} =~ /\b5D Mark II\b/',
2095 Notes => '5D Mark II',
2096 PrintConv => {
2097 0 => 'Eg-A',
2098 1 => 'Eg-D',
2099 2 => 'Eg-S',
2100 },
2101 },
2102 {
2103 Name => 'FocusingScreen',
2104 Notes => '1DmkIII and 1DmkIV',
2105 PrintConv => {
2106 0 => 'Ec-CIV',
2107 1 => 'Ec-A,B,C,CII,CIII,D,H,I,L',
2108 2 => 'Ec-S',
2109 3 => 'Ec-N,R',
2110 },
2111 },
2112 ],
2113 0x080c => {
2114 Name => 'TimerLength',
2115 Count => 4,
2116 PrintConv => [
2117 \%disableEnable,
2118 '"6 s: $val"',
2119 '"16 s: $val"',
2120 '"After release: $val"',
2121 ],
2122 PrintConvInv => [
2123 undef,
2124 '$val=~/(\d+)$/ ? $1 : 0',
2125 '$val=~/(\d+)$/ ? $1 : 0',
2126 '$val=~/(\d+)$/ ? $1 : 0',
2127 ],
2128 },
2129 0x080d => {
2130 Name => 'ShortReleaseTimeLag',
2131 PrintConv => \%disableEnable,
2132 },
2133 0x080e => {
2134 Name => 'AddAspectRatioInfo',
2135 PrintConv => {
2136 0 => 'Off',
2137 1 => '6:6',
2138 2 => '3:4',
2139 3 => '4:5',
2140 4 => '6:7',
2141 5 => '10:12',
2142 6 => '5:7',
2143 },
2144 },
2145 0x080f => {
2146 Name => 'AddOriginalDecisionData', # called ("image verification" in 1DmkIV manual)
2147 PrintConv => \%offOn,
2148 },
2149 0x0810 => {
2150 Name => 'LiveViewExposureSimulation',
2151 PrintConv => {
2152 0 => 'Disable (LCD auto adjust)',
2153 1 => 'Enable (simulates exposure)',
2154 },
2155 },
2156 0x0811 => {
2157 Name => 'LCDDisplayAtPowerOn',
2158 PrintConv => {
2159 0 => 'Display',
2160 1 => 'Retain power off status',
2161 },
2162 },
2163);
2164
2165#------------------------------------------------------------------------------
2166# Conversion routines
2167# Inputs: 0) value to convert
2168sub ConvertPfn($)
2169{
2170 my $val = shift;
2171 return $val ? ($val==1 ? 'On' : "On ($val)") : "Off";
2172}
2173sub ConvertPfnInv($)
2174{
2175 my $val = shift;
2176 return $1 if $val =~ /(\d+)/;
2177 return 1 if $val =~ /on/i;
2178 return 0 if $val =~ /off/i;
2179 return undef;
2180}
2181
2182#------------------------------------------------------------------------------
2183# Read/Write Canon custom 2 directory (used by 1D Mark III)
2184# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2185# Returns: 1 on success
2186sub ProcessCanonCustom2($$$)
2187{
2188 my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2189 my $dataPt = $$dirInfo{DataPt};
2190 my $offset = $$dirInfo{DirStart};
2191 my $size = $$dirInfo{DirLen};
2192 my $write = $$dirInfo{Write};
2193 my $verbose = $exifTool->Options('Verbose');
2194 my $newTags;
2195
2196 # first entry in array must be the size
2197 my $len = Get16u($dataPt, $offset);
2198 unless ($len == $size and $len >= 8) {
2199 $exifTool->Warn("Invalid CanonCustom2 data");
2200 return 0;
2201 }
2202 # get group count
2203 my $count = Get32u($dataPt, $offset + 4);
2204 if ($write) {
2205 $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
2206 $exifTool->VPrint(0, " Rewriting CanonCustom2\n");
2207 } elsif ($verbose) {
2208 $exifTool->VerboseDir('CanonCustom2', $count);
2209 }
2210 my $pos = $offset + 8;
2211 my $end = $offset + $size;
2212 # loop through group records
2213 for (; $pos<$end; ) {
2214 last if $pos + 12 > $end;
2215 my $recNum = Get32u($dataPt, $pos);
2216 my $recLen = Get32u($dataPt, $pos + 4);
2217 my $recCount = Get32u($dataPt, $pos + 8);
2218 last if $recLen < 8; # must be at least 8 bytes for recNum and recLen
2219 $pos += 12;
2220 my $recPos = $pos;
2221 my $recEnd = $pos + $recLen;
2222 if ($verbose and not $write) {
2223 $exifTool->VerboseDir("CanonCustom2 group $recNum", $recCount);
2224 }
2225 my ($i, $num, $tag);
2226 for ($i=0; $recPos + 8 < $recEnd; ++$i, $recPos+=4*$num) {
2227 $tag = Get32u($dataPt, $recPos);
2228 $num = Get32u($dataPt, $recPos + 4);
2229 $recPos += 8;
2230 last if $recPos + $num * 4 > $recEnd;
2231 my $val = ReadValue($dataPt, $recPos, 'int32s', $num, $num * 4);
2232 if ($write) {
2233 # write new value
2234 my $tagInfo = $$newTags{$tag};
2235 next unless $tagInfo;
2236 my $nvHash = $exifTool->GetNewValueHash($tagInfo);
2237 next unless Image::ExifTool::IsOverwriting($nvHash, $val);
2238 my $newVal = Image::ExifTool::GetNewValues($nvHash);
2239 next unless defined $newVal; # can't delete from a custom table
2240 WriteValue($newVal, 'int32s', $num, $dataPt, $recPos);
2241 $exifTool->VerboseValue("- CanonCustom:$$tagInfo{Name}", $val);
2242 $exifTool->VerboseValue("+ CanonCustom:$$tagInfo{Name}", $newVal);
2243 ++$exifTool->{CHANGED};
2244 } else {
2245 # save extracted tag
2246 my $oldInfo = $$tagTablePtr{$tag};
2247 $exifTool->HandleTag($tagTablePtr, $tag, $val,
2248 Index => $i,
2249 Format => 'int32u',
2250 Count => $num,
2251 Size => $num * 4,
2252 );
2253 my $tagInfo = $$tagTablePtr{$tag};
2254 # generate properly formatted description if we just added the tag
2255 if ($tagInfo and not $oldInfo) {
2256 ($$tagInfo{Description} = $$tagInfo{Name}) =~ tr/_/ /;
2257 $$tagInfo{Description} =~ s/CanonCustom Functions/Canon Custom Functions /;
2258 }
2259 }
2260 }
2261 $pos += $recLen - 8;
2262 }
2263 if ($pos != $end) {
2264 $exifTool->Warn('Possibly corrupted CanonCustom2 data');
2265 return 0;
2266 }
2267 return 1;
2268}
2269
2270#------------------------------------------------------------------------------
2271# Write Canon custom 2 data
2272# Inputs: 0) ExifTool object reference, 1) dirInfo hash ref, 2) tag table ref
2273# Returns: New custom data block or undefined on error
2274sub WriteCanonCustom2($$$)
2275{
2276 my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2277 $exifTool or return 1; # allow dummy access to autoload this package
2278 my $dataPt = $$dirInfo{DataPt};
2279 # edit a copy of the custom function 2 data
2280 my $buff = substr($$dataPt, $$dirInfo{DirStart}, $$dirInfo{DirLen});
2281 my %dirInfo = (
2282 DataPt => \$buff,
2283 DirStart => 0,
2284 DirLen => $$dirInfo{DirLen},
2285 Write => 1,
2286 );
2287 ProcessCanonCustom2($exifTool, \%dirInfo, $tagTablePtr) or return undef;
2288 return $buff;
2289}
2290
2291#------------------------------------------------------------------------------
2292# Process Canon custom directory
2293# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2294# Returns: 1 on success
2295sub ProcessCanonCustom($$$)
2296{
2297 my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2298 my $dataPt = $$dirInfo{DataPt};
2299 my $offset = $$dirInfo{DirStart};
2300 my $size = $$dirInfo{DirLen};
2301 my $verbose = $exifTool->Options('Verbose');
2302
2303 # first entry in array must be the size
2304 my $len = Get16u($dataPt,$offset);
2305 unless ($len == $size or ($$exifTool{Model}=~/\bD60\b/ and $len+2 == $size)) {
2306 $exifTool->Warn("Invalid CanonCustom data");
2307 return 0;
2308 }
2309 $verbose and $exifTool->VerboseDir('CanonCustom', $size/2-1);
2310 my $pos;
2311 for ($pos=2; $pos<$size; $pos+=2) {
2312 # ($pos is position within custom directory)
2313 my $val = Get16u($dataPt,$offset+$pos);
2314 my $tag = ($val >> 8);
2315 $val = ($val & 0xff);
2316 $exifTool->HandleTag($tagTablePtr, $tag, $val,
2317 Index => $pos/2-1,
2318 Format => 'int8u',
2319 Count => 1,
2320 Size => 1,
2321 );
2322 }
2323 return 1;
2324}
2325
2326#------------------------------------------------------------------------------
2327# Check new value for Canon custom data block
2328# Inputs: 0) ExifTool object reference, 1) tagInfo hash ref, 2) raw value ref
2329# Returns: error string or undef (and may modify value) on success
2330sub CheckCanonCustom($$$)
2331{
2332 my ($exifTool, $tagInfo, $valPtr) = @_;
2333 return Image::ExifTool::CheckValue($valPtr, 'int8u');
2334}
2335
2336#------------------------------------------------------------------------------
2337# Write Canon custom data
2338# Inputs: 0) ExifTool object reference, 1) dirInfo hash ref, 2) tag table ref
2339# Returns: New custom data block or undefined on error
2340sub WriteCanonCustom($$$)
2341{
2342 my ($exifTool, $dirInfo, $tagTablePtr) = @_;
2343 $exifTool or return 1; # allow dummy access to autoload this package
2344 my $dataPt = $$dirInfo{DataPt};
2345 my $dirStart = $$dirInfo{DirStart} || 0;
2346 my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
2347 my $dirName = $$dirInfo{DirName};
2348 my $newData = substr($$dataPt, $dirStart, $dirLen) or return undef;
2349 $dataPt = \$newData;
2350
2351 # first entry in array must be the size
2352 my $len = Get16u($dataPt, 0);
2353 unless ($len == $dirLen or ($$exifTool{Model}=~/\bD60\b/ and $len+2 == $dirLen)) {
2354 $exifTool->Warn("Invalid CanonCustom data");
2355 return undef;
2356 }
2357 my $newTags = $exifTool->GetNewTagInfoHash($tagTablePtr);
2358 my $pos;
2359 for ($pos=2; $pos<$dirLen; $pos+=2) {
2360 my $val = Get16u($dataPt, $pos);
2361 my $tag = ($val >> 8);
2362 my $tagInfo = $$newTags{$tag};
2363 next unless $tagInfo;
2364 my $nvHash = $exifTool->GetNewValueHash($tagInfo);
2365 $val = ($val & 0xff);
2366 next unless Image::ExifTool::IsOverwriting($nvHash, $val);
2367 my $newVal = Image::ExifTool::GetNewValues($nvHash);
2368 next unless defined $newVal; # can't delete from a custom table
2369 Set16u(($newVal & 0xff) + ($tag << 8), $dataPt, $pos);
2370 $exifTool->VerboseValue("- $dirName:$$tagInfo{Name}", $val);
2371 $exifTool->VerboseValue("+ $dirName:$$tagInfo{Name}", $newVal);
2372 ++$exifTool->{CHANGED};
2373 }
2374 return $newData;
2375}
2376
2377
23781; # end
2379
2380__END__
2381
2382=head1 NAME
2383
2384Image::ExifTool::CanonCustom - Read and Write Canon custom functions
2385
2386=head1 SYNOPSIS
2387
2388This module is loaded automatically by Image::ExifTool when required.
2389
2390=head1 DESCRIPTION
2391
2392The Canon custom functions meta information is very specific to the
2393camera model, and is found in both the EXIF maker notes and in the
2394Canon RAW files. This module contains the definitions necessary for
2395Image::ExifTool to read this information.
2396
2397=head1 AUTHOR
2398
2399Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
2400
2401This library is free software; you can redistribute it and/or modify it
2402under the same terms as Perl itself.
2403
2404=head1 REFERENCES
2405
2406=over 4
2407
2408=item L<http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html>
2409
2410=back
2411
2412=head1 ACKNOWLEDGEMENTS
2413
2414Thanks to Christian Koller for his work in decoding the 20D custom
2415functions, Rainer Honle for decoding the 5D custom functions and David
2416Pitcher for adding a few undocumented 1DmkIII settings.
2417
2418=head1 SEE ALSO
2419
2420L<Image::ExifTool::TagNames/Canon Tags>,
2421L<Image::ExifTool(3pm)|Image::ExifTool>
2422
2423=cut
Note: See TracBrowser for help on using the repository browser.