File Coverage

blib/lib/Image/ExifTool/Kodak.pm
Criterion Covered Total %
statement 15 111 13.5
branch 1 46 2.1
condition 2 26 7.6
subroutine 5 9 55.5
pod 0 5 0.0
total 23 197 11.6


line stmt bran cond sub pod time code
1             #------------------------------------------------------------------------------
2             # File: Kodak.pm
3             #
4             # Description: Kodak EXIF maker notes and APP3 "Meta" tags
5             #
6             # Revisions: 03/28/2005 - P. Harvey Created
7             #
8             # References: 1) http://search.cpan.org/dist/Image-MetaData-JPEG/
9             # 2) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html
10             # 3) http://www.cybercom.net/~dcoffin/dcraw/
11             # 4) Jim McGarvey private communication
12             # IB) Iliah Borg private communication (LibRaw)
13             #
14             # Notes: There really isn't much public information about Kodak formats.
15             # The only source I could find was Image::MetaData::JPEG, which
16             # didn't provide information about decoding the tag values. So
17             # this module represents a lot of work downloading sample images
18             # (about 100MB worth!), and testing with my daughter's CX4200.
19             #------------------------------------------------------------------------------
20              
21             package Image::ExifTool::Kodak;
22              
23 24     24   4164 use strict;
  24         60  
  24         765  
24 24     24   131 use vars qw($VERSION);
  24         57  
  24         917  
25 24     24   122 use Image::ExifTool qw(:DataAccess :Utils);
  24         47  
  24         4353  
26 24     24   1194 use Image::ExifTool::Exif;
  24         96  
  24         152261  
27              
28             $VERSION = '1.47';
29              
30             sub ProcessKodakIFD($$$);
31             sub ProcessKodakText($$$);
32             sub ProcessPose($$$);
33             sub WriteKodakIFD($$$);
34              
35             # Kodak type 1 maker notes (ref 1)
36             %Image::ExifTool::Kodak::Main = (
37             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
38             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
39             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
40             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
41             NOTES => q{
42             The table below contains the most common set of Kodak tags. The following
43             Kodak camera models have been tested and found to use these tags: C360,
44             C663, C875, CX6330, CX6445, CX7330, CX7430, CX7525, CX7530, DC4800, DC4900,
45             DX3500, DX3600, DX3900, DX4330, DX4530, DX4900, DX6340, DX6440, DX6490,
46             DX7440, DX7590, DX7630, EasyShare-One, LS420, LS443, LS633, LS743, LS753,
47             V530, V550, V570, V603, V610, V705, Z650, Z700, Z710, Z730, Z740, Z760 and
48             Z7590.
49             },
50             WRITABLE => 1,
51             FIRST_ENTRY => 8,
52             0x00 => {
53             Name => 'KodakModel',
54             Format => 'string[8]',
55             },
56             0x09 => {
57             Name => 'Quality',
58             PrintConv => { #PH
59             1 => 'Fine',
60             2 => 'Normal',
61             },
62             },
63             0x0a => {
64             Name => 'BurstMode',
65             PrintConv => { 0 => 'Off', 1 => 'On' },
66             },
67             0x0c => {
68             Name => 'KodakImageWidth',
69             Format => 'int16u',
70             },
71             0x0e => {
72             Name => 'KodakImageHeight',
73             Format => 'int16u',
74             },
75             0x10 => {
76             Name => 'YearCreated',
77             Groups => { 2 => 'Time' },
78             Format => 'int16u',
79             },
80             0x12 => {
81             Name => 'MonthDayCreated',
82             Groups => { 2 => 'Time' },
83             Format => 'int8u[2]',
84             ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))',
85             ValueConvInv => '$val=~tr/:./ /;$val',
86             },
87             0x14 => {
88             Name => 'TimeCreated',
89             Groups => { 2 => 'Time' },
90             Format => 'int8u[4]',
91             Shift => 'Time',
92             ValueConv => 'sprintf("%.2d:%.2d:%.2d.%.2d",split(" ", $val))',
93             ValueConvInv => '$val=~tr/:./ /;$val',
94             },
95             0x18 => {
96             Name => 'BurstMode2',
97             Format => 'int16u',
98             Unknown => 1, # not sure about this tag (or other 'Unknown' tags)
99             },
100             0x1b => {
101             Name => 'ShutterMode',
102             PrintConv => { #PH
103             0 => 'Auto',
104             8 => 'Aperture Priority',
105             32 => 'Manual?',
106             },
107             },
108             0x1c => {
109             Name => 'MeteringMode',
110             PrintConv => { #PH
111             0 => 'Multi-segment',
112             1 => 'Center-weighted average',
113             2 => 'Spot',
114             },
115             },
116             0x1d => 'SequenceNumber',
117             0x1e => {
118             Name => 'FNumber',
119             Format => 'int16u',
120             ValueConv => '$val / 100',
121             ValueConvInv => 'int($val * 100 + 0.5)',
122             },
123             0x20 => {
124             Name => 'ExposureTime',
125             Format => 'int32u',
126             ValueConv => '$val / 1e5',
127             ValueConvInv => '$val * 1e5',
128             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
129             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
130             },
131             0x24 => {
132             Name => 'ExposureCompensation',
133             Format => 'int16s',
134             ValueConv => '$val / 1000',
135             ValueConvInv => '$val * 1000',
136             PrintConv => '$val > 0 ? "+$val" : $val',
137             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
138             },
139             0x26 => {
140             Name => 'VariousModes',
141             Format => 'int16u',
142             Unknown => 1,
143             },
144             0x28 => {
145             Name => 'Distance1',
146             Format => 'int32u',
147             Unknown => 1,
148             },
149             0x2c => {
150             Name => 'Distance2',
151             Format => 'int32u',
152             Unknown => 1,
153             },
154             0x30 => {
155             Name => 'Distance3',
156             Format => 'int32u',
157             Unknown => 1,
158             },
159             0x34 => {
160             Name => 'Distance4',
161             Format => 'int32u',
162             Unknown => 1,
163             },
164             0x38 => {
165             Name => 'FocusMode',
166             PrintConv => {
167             0 => 'Normal',
168             2 => 'Macro',
169             },
170             },
171             0x3a => {
172             Name => 'VariousModes2',
173             Format => 'int16u',
174             Unknown => 1,
175             },
176             0x3c => {
177             Name => 'PanoramaMode',
178             Format => 'int16u',
179             Unknown => 1,
180             },
181             0x3e => {
182             Name => 'SubjectDistance',
183             Format => 'int16u',
184             Unknown => 1,
185             },
186             0x40 => {
187             Name => 'WhiteBalance',
188             Priority => 0,
189             PrintConv => { #PH
190             0 => 'Auto',
191             1 => 'Flash?',
192             2 => 'Tungsten',
193             3 => 'Daylight',
194             # 5 - seen this for "Auto" with a ProBack 645M
195             },
196             },
197             0x5c => {
198             Name => 'FlashMode',
199             Flags => 'PrintHex',
200             # various models express this number differently
201             PrintConv => { #PH
202             0x00 => 'Auto',
203             0x01 => 'Fill Flash',
204             0x02 => 'Off',
205             0x03 => 'Red-Eye',
206             0x10 => 'Fill Flash',
207             0x20 => 'Off',
208             0x40 => 'Red-Eye?',
209             },
210             },
211             0x5d => {
212             Name => 'FlashFired',
213             PrintConv => { 0 => 'No', 1 => 'Yes' },
214             },
215             0x5e => {
216             Name => 'ISOSetting',
217             Format => 'int16u',
218             PrintConv => '$val ? $val : "Auto"',
219             PrintConvInv => '$val=~/^\d+$/ ? $val : 0',
220             },
221             0x60 => {
222             Name => 'ISO',
223             Format => 'int16u',
224             },
225             0x62 => {
226             Name => 'TotalZoom',
227             Format => 'int16u',
228             ValueConv => '$val / 100',
229             ValueConvInv => '$val * 100',
230             },
231             0x64 => {
232             Name => 'DateTimeStamp',
233             Format => 'int16u',
234             PrintConv => '$val ? "Mode $val" : "Off"',
235             PrintConvInv => '$val=~tr/0-9//dc; $val ? $val : 0',
236             },
237             0x66 => {
238             Name => 'ColorMode',
239             Format => 'int16u',
240             Flags => 'PrintHex',
241             # various models express this number differently
242             PrintConv => { #PH
243             0x01 => 'B&W',
244             0x02 => 'Sepia',
245             0x03 => 'B&W Yellow Filter',
246             0x04 => 'B&W Red Filter',
247             0x20 => 'Saturated Color',
248             0x40 => 'Neutral Color',
249             0x100 => 'Saturated Color',
250             0x200 => 'Neutral Color',
251             0x2000 => 'B&W',
252             0x4000 => 'Sepia',
253             },
254             },
255             0x68 => {
256             Name => 'DigitalZoom',
257             Format => 'int16u',
258             ValueConv => '$val / 100',
259             ValueConvInv => '$val * 100',
260             },
261             0x6b => {
262             Name => 'Sharpness',
263             Format => 'int8s',
264             %Image::ExifTool::Exif::printParameter,
265             },
266             );
267              
268             # Kodak type 2 maker notes (ref PH)
269             %Image::ExifTool::Kodak::Type2 = (
270             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
271             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
272             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
273             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
274             NOTES => q{
275             These tags are used by the Kodak DC220, DC260, DC265 and DC290,
276             Hewlett-Packard PhotoSmart 618, C500 and C912, Pentax EI-200 and EI-2000,
277             and Minolta EX1500Z.
278             },
279             WRITABLE => 1,
280             FIRST_ENTRY => 0,
281             0x08 => {
282             Name => 'KodakMaker',
283             Format => 'string[32]',
284             },
285             0x28 => {
286             Name => 'KodakModel',
287             Format => 'string[32]',
288             },
289             0x6c => {
290             Name => 'KodakImageWidth',
291             Format => 'int32u',
292             },
293             0x70 => {
294             Name => 'KodakImageHeight',
295             Format => 'int32u',
296             },
297             );
298              
299             # Kodak type 3 maker notes (ref PH)
300             %Image::ExifTool::Kodak::Type3 = (
301             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
302             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
303             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
304             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
305             NOTES => 'These tags are used by the DC240, DC280, DC3400 and DC5000.',
306             WRITABLE => 1,
307             FIRST_ENTRY => 0,
308             0x0c => {
309             Name => 'YearCreated',
310             Groups => { 2 => 'Time' },
311             Format => 'int16u',
312             },
313             0x0e => {
314             Name => 'MonthDayCreated',
315             Groups => { 2 => 'Time' },
316             Format => 'int8u[2]',
317             ValueConv => 'sprintf("%.2d:%.2d",split(" ", $val))',
318             ValueConvInv => '$val=~tr/:./ /;$val',
319             },
320             0x10 => {
321             Name => 'TimeCreated',
322             Groups => { 2 => 'Time' },
323             Format => 'int8u[4]',
324             Shift => 'Time',
325             ValueConv => 'sprintf("%2d:%.2d:%.2d.%.2d",split(" ", $val))',
326             ValueConvInv => '$val=~tr/:./ /;$val',
327             },
328             0x1e => {
329             Name => 'OpticalZoom',
330             Format => 'int16u',
331             ValueConv => '$val / 100',
332             ValueConvInv => '$val * 100',
333             },
334             0x37 => {
335             Name => 'Sharpness',
336             Format => 'int8s',
337             %Image::ExifTool::Exif::printParameter,
338             },
339             0x38 => {
340             Name => 'ExposureTime',
341             Format => 'int32u',
342             ValueConv => '$val / 1e5',
343             ValueConvInv => '$val * 1e5',
344             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
345             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
346             },
347             0x3c => {
348             Name => 'FNumber',
349             Format => 'int16u',
350             ValueConv => '$val / 100',
351             ValueConvInv => 'int($val * 100 + 0.5)',
352             },
353             0x4e => {
354             Name => 'ISO',
355             Format => 'int16u',
356             },
357             );
358              
359             # Kodak type 4 maker notes (ref PH)
360             %Image::ExifTool::Kodak::Type4 = (
361             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
362             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
363             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
364             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
365             NOTES => 'These tags are used by the DC200 and DC215.',
366             WRITABLE => 1,
367             FIRST_ENTRY => 0,
368             0x20 => {
369             Name => 'OriginalFileName',
370             Format => 'string[12]',
371             },
372             );
373              
374             # Kodak type 5 maker notes (ref PH)
375             %Image::ExifTool::Kodak::Type5 = (
376             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
377             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
378             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
379             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
380             NOTES => q{
381             These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200
382             and CX6230.
383             },
384             WRITABLE => 1,
385             FIRST_ENTRY => 0,
386             0x14 => {
387             Name => 'ExposureTime',
388             Format => 'int32u',
389             ValueConv => '$val / 1e5',
390             ValueConvInv => '$val * 1e5',
391             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
392             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
393             },
394             0x1a => {
395             Name => 'WhiteBalance',
396             PrintConv => {
397             1 => 'Daylight',
398             2 => 'Flash',
399             3 => 'Tungsten',
400             },
401             },
402             0x1c => {
403             Name => 'FNumber',
404             Format => 'int16u',
405             ValueConv => '$val / 100',
406             ValueConvInv => 'int($val * 100 + 0.5)',
407             },
408             0x1e => {
409             Name => 'ISO',
410             Format => 'int16u',
411             },
412             0x20 => {
413             Name => 'OpticalZoom',
414             Format => 'int16u',
415             ValueConv => '$val / 100',
416             ValueConvInv => '$val * 100',
417             },
418             0x22 => {
419             Name => 'DigitalZoom',
420             Format => 'int16u',
421             ValueConv => '$val / 100',
422             ValueConvInv => '$val * 100',
423             },
424             0x27 => {
425             Name => 'FlashMode',
426             PrintConv => {
427             0 => 'Auto',
428             1 => 'On',
429             2 => 'Off',
430             3 => 'Red-Eye',
431             },
432             },
433             0x2a => {
434             Name => 'ImageRotated',
435             PrintConv => { 0 => 'No', 1 => 'Yes' },
436             },
437             0x2b => {
438             Name => 'Macro',
439             PrintConv => { 0 => 'On', 1 => 'Off' },
440             },
441             );
442              
443             # Kodak type 6 maker notes (ref PH)
444             %Image::ExifTool::Kodak::Type6 = (
445             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
446             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
447             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
448             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
449             NOTES => 'These tags are used by the DX3215 and DX3700.',
450             WRITABLE => 1,
451             FIRST_ENTRY => 0,
452             0x10 => {
453             Name => 'ExposureTime',
454             Format => 'int32u',
455             ValueConv => '$val / 1e5',
456             ValueConvInv => '$val * 1e5',
457             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
458             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
459             },
460             0x14 => {
461             Name => 'ISOSetting',
462             Format => 'int32u',
463             Unknown => 1,
464             },
465             0x18 => {
466             Name => 'FNumber',
467             Format => 'int16u',
468             ValueConv => '$val / 100',
469             ValueConvInv => 'int($val * 100 + 0.5)',
470             },
471             0x1a => {
472             Name => 'ISO',
473             Format => 'int16u',
474             },
475             0x1c => {
476             Name => 'OpticalZoom',
477             Format => 'int16u',
478             ValueConv => '$val / 100',
479             ValueConvInv => '$val * 100',
480             },
481             0x1e => {
482             Name => 'DigitalZoom',
483             Format => 'int16u',
484             ValueConv => '$val / 100',
485             ValueConvInv => '$val * 100',
486             },
487             0x22 => {
488             Name => 'Flash',
489             Format => 'int16u',
490             PrintConv => {
491             0 => 'No Flash',
492             1 => 'Fired',
493             },
494             },
495             );
496              
497             # Kodak type 7 maker notes (ref PH)
498             %Image::ExifTool::Kodak::Type7 = (
499             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
500             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
501             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
502             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
503             WRITABLE => 1,
504             FIRST_ENTRY => 0,
505             NOTES => q{
506             The maker notes of models such as the C340, C433, CC533, LS755, V803 and
507             V1003 seem to start with the camera serial number. The C310, C315, C330,
508             C643, C743, CD33, CD43, CX7220 and CX7300 maker notes are also decoded using
509             this table, although the strings for these cameras don't conform to the
510             usual Kodak serial number format, and instead have the model name followed
511             by 8 digits.
512             },
513             0 => { # (not confirmed)
514             Name => 'SerialNumber',
515             Format => 'string[16]',
516             ValueConv => '$val=~s/\s+$//; $val', # remove trailing whitespace
517             ValueConvInv => '$val',
518             },
519             );
520              
521             # Kodak IFD-format maker notes (ref PH)
522             %Image::ExifTool::Kodak::Type8 = (
523             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
524             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
525             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
526             NOTES => q{
527             Kodak models such as the ZD710, P712, P850, P880, V1233, V1253, V1275,
528             V1285, Z612, Z712, Z812, Z885 use standard TIFF IFD format for the maker
529             notes. In keeping with Kodak's strategy of inconsistent makernotes, models
530             such as the M380, M1033, M1093, V1073, V1273, Z1012, Z1085 and Z8612
531             also use these tags, but these makernotes begin with a TIFF header instead
532             of an IFD entry count and use relative instead of absolute offsets. There
533             is a large amount of information stored in these maker notes (apparently
534             with much duplication), but relatively few tags have so far been decoded.
535             },
536             0xfc00 => [{
537             Name => 'SubIFD0',
538             Condition => '$format eq "undef"',
539             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
540             NestedHtmlDump => 2, # (so HtmlDump doesn't show these as double-referenced)
541             SubDirectory => {
542             TagTable => 'Image::ExifTool::Kodak::SubIFD0',
543             Base => '$start',
544             ProcessProc => \&ProcessKodakIFD,
545             WriteProc => \&WriteKodakIFD,
546             },
547             },{
548             Name => 'SubIFD0',
549             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
550             Flags => 'SubIFD',
551             SubDirectory => {
552             TagTable => 'Image::ExifTool::Kodak::SubIFD0',
553             Start => '$val',
554             # (odd but true: the Base for this SubIFD is different than 0xfc01-0xfc06)
555             },
556             }],
557             # SubIFD1 and higher data is preceded by a TIFF byte order mark to indicate
558             # the byte ordering used. Beginning with the M580, these subdirectories are
559             # stored as 'undef' data rather than as a standard EXIF SubIFD.
560             0xfc01 => [{
561             Name => 'SubIFD1',
562             Condition => '$format eq "undef"',
563             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
564             NestedHtmlDump => 2,
565             SubDirectory => {
566             TagTable => 'Image::ExifTool::Kodak::SubIFD1',
567             Base => '$start',
568             },
569             },{
570             Name => 'SubIFD1',
571             Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
572             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
573             Flags => 'SubIFD',
574             SubDirectory => {
575             TagTable => 'Image::ExifTool::Kodak::SubIFD1',
576             Start => '$val',
577             Base => '$start',
578             },
579             }],
580             0xfc02 => [{
581             Name => 'SubIFD2',
582             Condition => '$format eq "undef"',
583             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
584             NestedHtmlDump => 2,
585             SubDirectory => {
586             TagTable => 'Image::ExifTool::Kodak::SubIFD2',
587             Base => '$start',
588             },
589             },{
590             Name => 'SubIFD2',
591             Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
592             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
593             Flags => 'SubIFD',
594             SubDirectory => {
595             TagTable => 'Image::ExifTool::Kodak::SubIFD2',
596             Start => '$val',
597             Base => '$start',
598             },
599             }],
600             0xfc03 => [{
601             Name => 'SubIFD3',
602             Condition => '$format eq "undef"',
603             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
604             NestedHtmlDump => 2,
605             SubDirectory => {
606             TagTable => 'Image::ExifTool::Kodak::SubIFD3',
607             Base => '$start',
608             },
609             },{
610             Name => 'SubIFD3',
611             Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
612             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
613             Flags => 'SubIFD',
614             SubDirectory => {
615             TagTable => 'Image::ExifTool::Kodak::SubIFD3',
616             Start => '$val',
617             Base => '$start',
618             },
619             }],
620             # (SubIFD4 has the pointer zeroed in my samples, but support it
621             # in case it is used by future models -- ignored if pointer is zero)
622             0xfc04 => [{
623             Name => 'SubIFD4',
624             Condition => '$format eq "undef"',
625             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
626             NestedHtmlDump => 2,
627             SubDirectory => {
628             TagTable => 'Image::ExifTool::Kodak::SubIFD4',
629             Base => '$start',
630             },
631             },{
632             Name => 'SubIFD4',
633             Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
634             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
635             Flags => 'SubIFD',
636             SubDirectory => {
637             TagTable => 'Image::ExifTool::Kodak::SubIFD4',
638             Start => '$val',
639             Base => '$start',
640             },
641             }],
642             0xfc05 => [{
643             Name => 'SubIFD5',
644             Condition => '$format eq "undef"',
645             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
646             NestedHtmlDump => 2,
647             SubDirectory => {
648             TagTable => 'Image::ExifTool::Kodak::SubIFD5',
649             Base => '$start',
650             },
651             },{
652             Name => 'SubIFD5',
653             Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
654             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
655             Flags => 'SubIFD',
656             SubDirectory => {
657             TagTable => 'Image::ExifTool::Kodak::SubIFD5',
658             Start => '$val',
659             Base => '$start',
660             },
661             }],
662             0xfc06 => [{ # new for the M580
663             Name => 'SubIFD6',
664             Condition => '$format eq "undef"',
665             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
666             NestedHtmlDump => 2,
667             SubDirectory => {
668             TagTable => 'Image::ExifTool::Kodak::SubIFD6',
669             Base => '$start',
670             },
671             },{
672             Name => 'SubIFD6',
673             Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
674             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
675             Flags => 'SubIFD',
676             SubDirectory => {
677             TagTable => 'Image::ExifTool::Kodak::SubIFD6',
678             Start => '$val',
679             Base => '$start',
680             },
681             }],
682             0xfcff => {
683             Name => 'SubIFD255',
684             Condition => '$format eq "undef"',
685             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
686             NestedHtmlDump => 2,
687             SubDirectory => {
688             TagTable => 'Image::ExifTool::Kodak::SubIFD0',
689             # (uses the same Base as the main MakerNote IFD)
690             },
691             },
692             0xff00 => {
693             Name => 'CameraInfo',
694             Condition => '$$valPt ne "\0\0\0\0"', # may be zero if dir doesn't exist
695             Groups => { 1 => 'MakerNotes' }, # SubIFD needs group 1 set
696             Flags => 'SubIFD',
697             SubDirectory => {
698             TagTable => 'Image::ExifTool::Kodak::CameraInfo',
699             Start => '$val',
700             # (uses the same Base as the main MakerNote IFD)
701             },
702             },
703             );
704              
705             # Kodak type 9 maker notes (ref PH)
706             %Image::ExifTool::Kodak::Type9 = (
707             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
708             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
709             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
710             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
711             WRITABLE => 1,
712             FIRST_ENTRY => 0,
713             NOTES => q{
714             These tags are used by the Kodak C140, C180, C913, C1013, M320, M340 and
715             M550, as well as various cameras marketed by other manufacturers.
716             },
717             0x0c => [
718             {
719             Name => 'FNumber',
720             Condition => '$$self{Make} =~ /Kodak/i',
721             Format => 'int16u',
722             ValueConv => '$val / 100',
723             ValueConvInv => 'int($val * 100 + 0.5)',
724             },{
725             Name => 'FNumber',
726             Format => 'int16u',
727             ValueConv => '$val / 10',
728             ValueConvInv => 'int($val * 10 + 0.5)',
729             },
730             ],
731             0x10 => {
732             Name => 'ExposureTime',
733             Format => 'int32u',
734             ValueConv => '$val / 1e6',
735             ValueConvInv => '$val * 1e6',
736             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
737             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
738             },
739             0x14 => {
740             Name => 'DateTimeOriginal',
741             Description => 'Date/Time Original',
742             Groups => { 2 => 'Time' },
743             Format => 'string[20]',
744             Shift => 'Time',
745             ValueConv => '$val=~s{/}{:}g; $val',
746             ValueConvInv => '$val=~s{^(\d{4}):(\d{2}):}{$1/$2/}; $val',
747             PrintConv => '$self->ConvertDateTime($val)',
748             PrintConvInv => '$self->InverseDateTime($val,0)',
749             },
750             0x34 => {
751             Name => 'ISO',
752             Format => 'int16u',
753             },
754             0x57 => {
755             Name => 'FirmwareVersion',
756             Condition => '$$self{Make} =~ /Kodak/i',
757             Format => 'string[16]',
758             Notes => 'Kodak only',
759             },
760             0xa8 => {
761             Name => 'UnknownNumber', # (was SerialNumber, but not unique for all cameras. eg. C1013)
762             Condition => '$$self{Make} =~ /Kodak/i and $$valPt =~ /^([A-Z0-9]{1,11}\0|[A-Z0-9]{12})/i',
763             Format => 'string[12]',
764             Notes => 'Kodak only',
765             Writable => 0,
766             },
767             0xc4 => {
768             Name => 'UnknownNumber', # (confirmed NOT to be serial number for Easyshare Mini - PH)
769             Condition => '$$self{Make} =~ /Kodak/i and $$valPt =~ /^([A-Z0-9]{1,11}\0|[A-Z0-9]{12})/i',
770             Format => 'string[12]',
771             Notes => 'Kodak only',
772             Writable => 0,
773             },
774             );
775              
776             # more Kodak IFD-format maker notes (ref PH)
777             %Image::ExifTool::Kodak::Type10 = (
778             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
779             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
780             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
781             PRIORITY => 0,
782             NOTES => q{
783             Another variation of the IFD-format type, this time with just a byte order
784             indicator instead of a full TIFF header. These tags are used by the Z980.
785             },
786             # 0x01 int16u - always 0
787             0x02 => {
788             Name => 'PreviewImageSize',
789             Writable => 'int16u',
790             Count => 2,
791             PrintConv => '$val =~ tr/ /x/; $val',
792             PrintConvInv => '$val =~ tr/x/ /; $val',
793             },
794             # 0x03 int32u - ranges from about 33940 to 40680
795             # 0x04 int32u - always 18493
796             # 0x06 undef[4] - 07 d9 04 11
797             # 0x07 undef[3] - varies
798             # 0x08 int16u - 1 (mostly), 2
799             # 0x09 int16u - 255
800             # 0x0b int16u[2] - '0 0' (mostly), '20 0', '21 0', '1 0'
801             # 0x0c int16u - 1 (mostly), 3, 259, 260
802             # 0x0d int16u - 0
803             # 0x0e int16u - 0, 1, 2 (MeteringMode? 0=Partial, 1,2=Multi)
804             # 0x0f int16u - 0, 5 (MeteringMode? 0=Multi, 5=Partial)
805             # 0x10 int16u - ranges from about 902 to 2308
806             0x12 => {
807             Name => 'ExposureTime',
808             Writable => 'int32u',
809             ValueConv => '$val / 1e5',
810             ValueConvInv => '$val * 1e5',
811             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
812             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
813             },
814             0x13 => {
815             Name => 'FNumber',
816             Writable => 'int16u',
817             ValueConv => '$val / 10',
818             ValueConvInv => '$val * 10',
819             },
820             0x14 => {
821             Name => 'ISO',
822             Writable => 'int16u',
823             ValueConv => 'exp($val/3*log(2))*25',
824             ValueConvInv => '3*log($val/25)/log(2)',
825             PrintConv => 'int($val + 0.5)',
826             PrintConvInv => '$val',
827             },
828             # 0x15 int16u - 18-25 (SceneMode? 21=auto, 24=Aperture Priority, 19=high speed)
829             # 0x16 int16u - 50
830             # 0x17 int16u - 0, 65535 (MeteringMode? 0=Multi, 65535=Partial)
831             # 0x19 int16u - 0, 4 (WhiteBalance? 0=Auto, 4=Manual)
832             # 0x1a int16u - 0, 65535
833             # 0x1b int16u - 416-696
834             # 0x1c int16u - 251-439 (low when 0x1b is high)
835             0x1d => {
836             Name => 'FocalLength',
837             Writable => 'int32u',
838             ValueConv => '$val / 100',
839             ValueConvInv => '$val * 100',
840             PrintConv => '"$val mm"',
841             PrintConvInv => '$val=~s/\s*mm//;$val',
842             },
843             # 0x1e int16u - 100
844             # 0x1f int16u - 0, 1
845             # 0x20,0x21 int16u - 1
846             # 0x27 undef[4] - fe ff ff ff
847             # 0x32 undef[4] - 00 00 00 00
848             # 0x61 int32u[2] - '0 0' or '34050 0'
849             # 0x62 int8u - 0, 1
850             # 0x63 int8u - 1
851             # 0x64,0x65 int8u - 0, 1, 2
852             # 0x66 int32u - 0
853             # 0x67 int32u - 3
854             # 0x68 int32u - 0
855             # 0x3fe undef[2540]
856             );
857              
858             # Kodak PixPro S-1 maker notes (ref PH)
859             # (similar to Ricoh::Type2 and GE::Main)
860             %Image::ExifTool::Kodak::Type11 = (
861             # (can't currently write these)
862             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
863             NOTES =>q{
864             These tags are found in models such as the PixPro S-1. They are not
865             writable because the inconsistency of Kodak maker notes is beginning to get
866             on my nerves.
867             },
868             # (these are related to the Kodak QuickTime UserData tags)
869             0x0104 => 'FirmwareVersion',
870             0x0203 => {
871             Name => 'PictureEffect',
872             PrintConv => {
873             0 => 'None',
874             3 => 'Monochrome',
875             9 => 'Kodachrome',
876             },
877             },
878             # 0x0204 - ExposureComp or FlashExposureComp maybe?
879             0x0207 => 'KodakModel',
880             0x0300 => 'KodakMake',
881             0x0308 => 'LensSerialNumber',
882             0x0309 => 'LensModel',
883             0x030d => { Name => 'LevelMeter', Unknown => 1 }, # (guess)
884             0x0311 => 'Pitch', # Units??
885             0x0312 => 'Yaw', # Units??
886             0x0313 => 'Roll', # Units??
887             0x0314 => { Name => 'CX', Unknown => 1 },
888             0x0315 => { Name => 'CY', Unknown => 1 },
889             0x0316 => { Name => 'Rads', Unknown => 1 },
890             );
891              
892             # Kodak SubIFD0 tags (ref PH)
893             %Image::ExifTool::Kodak::SubIFD0 = (
894             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
895             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
896             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
897             NOTES => 'SubIFD0 through SubIFD5 tags are written a number of newer Kodak models.',
898             0xfa02 => {
899             Name => 'SceneMode',
900             Writable => 'int16u',
901             Notes => 'may not be valid for some models', # eg. M580?
902             PrintConvColumns => 2,
903             PrintConv => {
904             1 => 'Sport',
905             3 => 'Portrait',
906             4 => 'Landscape',
907             6 => 'Beach',
908             7 => 'Night Portrait',
909             8 => 'Night Landscape',
910             9 => 'Snow',
911             10 => 'Text',
912             11 => 'Fireworks',
913             12 => 'Macro',
914             13 => 'Museum',
915             16 => 'Children',
916             17 => 'Program',
917             18 => 'Aperture Priority',
918             19 => 'Shutter Priority',
919             20 => 'Manual',
920             25 => 'Back Light',
921             28 => 'Candlelight',
922             29 => 'Sunset',
923             31 => 'Panorama Left-right',
924             32 => 'Panorama Right-left',
925             33 => 'Smart Scene',
926             34 => 'High ISO',
927             },
928             },
929             # 0xfa04 - values: 0 (normally), 2 (panorama shots)
930             # 0xfa0f - values: 0 (normally), 1 (macro?)
931             # 0xfa11 - some sort of FNumber (x 100)
932             0xfa19 => {
933             Name => 'SerialNumber', # (verified with Z712 - PH)
934             Writable => 'string',
935             },
936             0xfa1d => {
937             Name => 'KodakImageWidth',
938             Writable => 'int16u',
939             },
940             0xfa1e => {
941             Name => 'KodakImageHeight',
942             Writable => 'int16u',
943             },
944             0xfa20 => {
945             Name => 'SensorWidth',
946             Writable => 'int16u',
947             },
948             0xfa21 => {
949             Name => 'SensorHeight',
950             Writable => 'int16u',
951             },
952             0xfa23 => {
953             Name => 'FNumber',
954             Writable => 'int16u',
955             Priority => 0,
956             ValueConv => '$val / 100',
957             ValueConvInv => '$val * 100',
958             },
959             0xfa24 => {
960             Name => 'ExposureTime',
961             Writable => 'int32u',
962             Priority => 0,
963             ValueConv => '$val / 1e5',
964             ValueConvInv => '$val * 1e5',
965             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
966             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
967             },
968             0xfa2e => {
969             Name => 'ISO',
970             Writable => 'int16u',
971             Priority => 0,
972             },
973             0xfa3d => {
974             Name => 'OpticalZoom',
975             Writable => 'int16u',
976             ValueConv => '$val / 100',
977             ValueConvInv => '$val * 100',
978             PrintConv => 'sprintf("%.2f",$val)',
979             PrintConvInv => '$val=~s/ ?x//; $val',
980             },
981             0xfa46 => {
982             Name => 'ISO',
983             Writable => 'int16u',
984             Priority => 0,
985             },
986             # 0xfa4c - related to focal length (1=wide, 32=full zoom)
987             0xfa51 => {
988             Name => 'KodakImageWidth',
989             Writable => 'int16u',
990             },
991             0xfa52 => {
992             Name => 'KodakImageHeight',
993             Writable => 'int16u',
994             },
995             0xfa54 => {
996             Name => 'ThumbnailWidth',
997             Writable => 'int16u',
998             },
999             0xfa55 => {
1000             Name => 'ThumbnailHeight',
1001             Writable => 'int16u',
1002             },
1003             0xfa57 => {
1004             Name => 'PreviewImageWidth',
1005             Writable => 'int16u',
1006             },
1007             0xfa58 => {
1008             Name => 'PreviewImageHeight',
1009             Writable => 'int16u',
1010             },
1011             );
1012              
1013             # Kodak SubIFD1 tags (ref PH)
1014             %Image::ExifTool::Kodak::SubIFD1 = (
1015             PROCESS_PROC => \&ProcessKodakIFD,
1016             WRITE_PROC => \&WriteKodakIFD,
1017             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1018             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1019             0x0027 => {
1020             Name => 'ISO',
1021             Writable => 'int16u',
1022             Priority => 0,
1023             },
1024             0x0028 => {
1025             Name => 'ISO',
1026             Writable => 'int16u',
1027             Priority => 0,
1028             },
1029             );
1030              
1031             my %sceneModeUsed = (
1032             0 => 'Program',
1033             2 => 'Aperture Priority',
1034             3 => 'Shutter Priority',
1035             4 => 'Manual',
1036             5 => 'Portrait',
1037             6 => 'Sport',
1038             7 => 'Children',
1039             8 => 'Museum',
1040             10 => 'High ISO',
1041             11 => 'Text',
1042             12 => 'Macro',
1043             13 => 'Back Light',
1044             16 => 'Landscape',
1045             17 => 'Night Landscape',
1046             18 => 'Night Portrait',
1047             19 => 'Snow',
1048             20 => 'Beach',
1049             21 => 'Fireworks',
1050             22 => 'Sunset',
1051             23 => 'Candlelight',
1052             28 => 'Panorama',
1053             );
1054              
1055             # Kodak SubIFD2 tags (ref PH)
1056             %Image::ExifTool::Kodak::SubIFD2 = (
1057             PROCESS_PROC => \&ProcessKodakIFD,
1058             WRITE_PROC => \&WriteKodakIFD,
1059             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1060             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1061             0x6002 => {
1062             Name => 'SceneModeUsed',
1063             Writable => 'int32u',
1064             PrintConvColumns => 2,
1065             PrintConv => \%sceneModeUsed,
1066             },
1067             0x6006 => {
1068             Name => 'OpticalZoom',
1069             Writable => 'int32u',
1070             ValueConv => '$val / 100',
1071             ValueConvInv => '$val * 100',
1072             PrintConv => 'sprintf("%.2f",$val)',
1073             PrintConvInv => '$val=~s/ ?x//; $val',
1074             },
1075             # 0x6009 - some sort of FNumber (x 100)
1076             0x6103 => {
1077             Name => 'MaxAperture',
1078             Writable => 'int32u',
1079             ValueConv => '$val / 100',
1080             ValueConvInv => '$val * 100',
1081             },
1082             0xf002 => {
1083             Name => 'SceneModeUsed',
1084             Writable => 'int32u',
1085             PrintConvColumns => 2,
1086             PrintConv => \%sceneModeUsed,
1087             },
1088             0xf006 => {
1089             Name => 'OpticalZoom',
1090             Writable => 'int32u',
1091             ValueConv => '$val / 100',
1092             ValueConvInv => '$val * 100',
1093             PrintConv => 'sprintf("%.2f",$val)',
1094             PrintConvInv => '$val=~s/ ?x//; $val',
1095             },
1096             # 0xf009 - some sort of FNumber (x 100)
1097             0xf103 => {
1098             Name => 'FNumber',
1099             Writable => 'int32u',
1100             Priority => 0,
1101             ValueConv => '$val / 100',
1102             ValueConvInv => '$val * 100',
1103             },
1104             0xf104 => {
1105             Name => 'ExposureTime',
1106             Writable => 'int32u',
1107             Priority => 0,
1108             ValueConv => '$val / 1e6',
1109             ValueConvInv => '$val * 1e6',
1110             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
1111             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
1112             },
1113             0xf105 => {
1114             Name => 'ISO',
1115             Writable => 'int32u',
1116             Priority => 0,
1117             ValueConv => '$val / 10',
1118             ValueConvInv => '$val * 10',
1119             },
1120             );
1121              
1122             # Kodak SubIFD3 tags (ref PH)
1123             %Image::ExifTool::Kodak::SubIFD3 = (
1124             PROCESS_PROC => \&ProcessKodakIFD,
1125             WRITE_PROC => \&WriteKodakIFD,
1126             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1127             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1128             0x1000 => {
1129             Name => 'OpticalZoom',
1130             Writable => 'int16u',
1131             ValueConv => '$val / 100',
1132             ValueConvInv => '$val * 100',
1133             PrintConv => 'sprintf("%.2f",$val)',
1134             PrintConvInv => '$val=~s/ ?x//; $val',
1135             },
1136             # 0x1002 - related to focal length (1=wide, 32=full zoom)
1137             # 0x1006 - pictures remaining? (gradually decreases as pictures are taken)
1138             #
1139             # the following unknown Kodak tags in subIFD3 may store an IFD count of 0 or 1 instead
1140             # of the correct value (which changes from model to model). This bad count is fixed
1141             # with the "FixCount" patch. Models known to have this problem include:
1142             # M380, M1033, M1093IS, V1073, V1233, V1253, V1273, V1275, V1285, Z612, Z712,
1143             # Z812, Z885, Z915, Z950, Z1012IS, Z1085IS, ZD710
1144             #
1145             0x2007 => {
1146             Name => 'Kodak_SubIFD3_0x2007',
1147             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1148             },
1149             0x2008 => {
1150             Name => 'Kodak_SubIFD3_0x2008',
1151             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1152             },
1153             0x2009 => {
1154             Name => 'Kodak_SubIFD3_0x2009',
1155             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1156             },
1157             0x200a => {
1158             Name => 'Kodak_SubIFD3_0x200a',
1159             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1160             },
1161             0x200b => {
1162             Name => 'Kodak_SubIFD3_0x200b',
1163             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1164             },
1165             0x3020 => {
1166             Name => 'Kodak_SubIFD3_0x3020',
1167             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1168             },
1169             0x3030 => {
1170             Name => 'Kodak_SubIFD3_0x3030',
1171             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1172             },
1173             0x3040 => {
1174             Name => 'Kodak_SubIFD3_0x3040',
1175             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1176             },
1177             0x3050 => {
1178             Name => 'Kodak_SubIFD3_0x3050',
1179             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1180             },
1181             0x3060 => {
1182             Name => 'Kodak_SubIFD3_0x3060',
1183             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1184             },
1185             0x8001 => {
1186             Name => 'Kodak_SubIFD3_0x8001',
1187             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1188             },
1189             0x8002 => {
1190             Name => 'Kodak_SubIFD3_0x8002',
1191             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1192             },
1193             0x8003 => {
1194             Name => 'Kodak_SubIFD3_0x8003',
1195             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1196             },
1197             0x8004 => {
1198             Name => 'Kodak_SubIFD3_0x8004',
1199             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1200             },
1201             0x8005 => {
1202             Name => 'Kodak_SubIFD3_0x8005',
1203             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1204             },
1205             0x8006 => {
1206             Name => 'Kodak_SubIFD3_0x8006',
1207             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1208             },
1209             0x8007 => {
1210             Name => 'Kodak_SubIFD3_0x8007',
1211             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1212             },
1213             0x8008 => {
1214             Name => 'Kodak_SubIFD3_0x8008',
1215             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1216             },
1217             0x8009 => {
1218             Name => 'Kodak_SubIFD3_0x8009',
1219             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1220             },
1221             0x800a => {
1222             Name => 'Kodak_SubIFD3_0x800a',
1223             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1224             },
1225             0x800b => {
1226             Name => 'Kodak_SubIFD3_0x800b',
1227             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1228             },
1229             0x800c => {
1230             Name => 'Kodak_SubIFD3_0x800c',
1231             Flags => [ 'FixCount', 'Unknown', 'Hidden' ],
1232             },
1233             );
1234              
1235             # Kodak SubIFD4 tags (ref PH)
1236             %Image::ExifTool::Kodak::SubIFD4 = (
1237             PROCESS_PROC => \&ProcessKodakIFD,
1238             WRITE_PROC => \&WriteKodakIFD,
1239             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1240             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1241             );
1242              
1243             # Kodak SubIFD5 tags (ref PH)
1244             %Image::ExifTool::Kodak::SubIFD5 = (
1245             PROCESS_PROC => \&ProcessKodakIFD,
1246             WRITE_PROC => \&WriteKodakIFD,
1247             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1248             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1249             0x000f => {
1250             Name => 'OpticalZoom',
1251             Writable => 'int16u',
1252             ValueConv => '$val / 100',
1253             ValueConvInv => '$val * 100',
1254             PrintConv => 'sprintf("%.2f",$val)',
1255             PrintConvInv => '$val=~s/ ?x//; $val',
1256             },
1257             );
1258              
1259             # Kodak SubIFD6 tags (ref PH)
1260             %Image::ExifTool::Kodak::SubIFD6 = (
1261             PROCESS_PROC => \&ProcessKodakIFD,
1262             WRITE_PROC => \&WriteKodakIFD,
1263             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1264             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1265             NOTES => 'SubIFD6 is written by the M580.',
1266             );
1267              
1268             # Decoded from P712, P850 and P880 samples (ref PH)
1269             %Image::ExifTool::Kodak::CameraInfo = (
1270             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1271             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1272             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1273             NOTES => 'These tags are used by the P712, P850 and P880.',
1274             0xf900 => {
1275             Name => 'SensorWidth',
1276             Writable => 'int16u',
1277             Notes => 'effective sensor size',
1278             },
1279             0xf901 => {
1280             Name => 'SensorHeight',
1281             Writable => 'int16u',
1282             },
1283             0xf902 => {
1284             Name => 'BayerPattern',
1285             Writable => 'string',
1286             },
1287             0xf903 => {
1288             Name => 'SensorFullWidth',
1289             Writable => 'int16u',
1290             Notes => 'includes black border?',
1291             },
1292             0xf904 => {
1293             Name => 'SensorFullHeight',
1294             Writable => 'int16u',
1295             },
1296             0xf907 => {
1297             Name => 'KodakImageWidth',
1298             Writable => 'int16u',
1299             },
1300             0xf908 => {
1301             Name => 'KodakImageHeight',
1302             Writable => 'int16u',
1303             },
1304             0xfa00 => {
1305             Name => 'KodakInfoType',
1306             Writable => 'string',
1307             },
1308             0xfa04 => {
1309             Name => 'SerialNumber', # (unverified)
1310             Writable => 'string',
1311             },
1312             0xfd04 => {
1313             Name => 'FNumber',
1314             Writable => 'int16u',
1315             Priority => 0,
1316             ValueConv => '$val / 100',
1317             ValueConvInv => '$val * 100',
1318             },
1319             0xfd05 => {
1320             Name => 'ExposureTime',
1321             Writable => 'int32u',
1322             Priority => 0,
1323             ValueConv => '$val / 1e6',
1324             ValueConvInv => '$val * 1e6',
1325             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
1326             PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
1327             },
1328             0xfd06 => {
1329             Name => 'ISO',
1330             Writable => 'int16u',
1331             Priority => 0,
1332             },
1333             );
1334              
1335             # treat unknown maker notes as binary data (allows viewing with -U)
1336             %Image::ExifTool::Kodak::Unknown = (
1337             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
1338             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1339             FIRST_ENTRY => 0,
1340             );
1341              
1342             # tags found in the KodakIFD (in IFD0 of KDC, DCR, TIFF and JPEG images) (ref PH)
1343             %Image::ExifTool::Kodak::IFD = (
1344             GROUPS => { 0 => 'MakerNotes', 1 => 'KodakIFD', 2 => 'Image'},
1345             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1346             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1347             WRITE_GROUP => 'KodakIFD',
1348             SET_GROUP1 => 1,
1349             NOTES => q{
1350             These tags are found in a separate IFD of JPEG, TIFF, DCR and KDC images
1351             from some older Kodak models such as the DC50, DC120, DCS760C, DCS Pro 14N,
1352             14nx, SLR/n, Pro Back and Canon EOS D2000.
1353             },
1354             # 0x0000: int8u[4] - values: "1 0 0 0" (DC50), "1 1 0 0" (DC120)
1355             0x0000 => { #4
1356             Name => 'KodakVersion',
1357             Writable => 'int8u',
1358             Count => 4,
1359             PrintConv => '$val =~ tr/ /./; $val',
1360             PrintConvInv => '$val =~ tr/./ /; $val',
1361             },
1362             0x0001 => {
1363             # (related to EV but exact meaning unknown)
1364             Name => 'UnknownEV', # ("DeletedTag", ref 4)
1365             Writable => 'rational64u',
1366             Unknown => 1,
1367             },
1368             # 0x0002: int8u - values: 0
1369             0x0003 => { Name => 'ExposureValue', Writable => 'rational64u' },
1370             # 0x0004: rational64u - values: 2.875,3.375,3.625,4,4.125,7.25
1371             # 0x0005: int8u - values: 0
1372             # 0x0006: int32u[12] - ?
1373             # 0x0007: int32u[3] - values: "65536 67932 69256"
1374             0x03e9 => { Name => 'OriginalFileName', Writable => 'string' },
1375             0x03ea => { Name => 'KodakTag', Writable => 'int32u' }, #4
1376             0x03eb => { Name => 'SensorLeftBorder', Writable => 'int16u' }, # ("FinishedImageX", ref 4)
1377             0x03ec => { Name => 'SensorTopBorder', Writable => 'int16u' }, # ("FinishedImageY", ref 4)
1378             0x03ed => { Name => 'SensorImageWidth', Writable => 'int16u' }, # ("FinishedImageWidth", ref 4)
1379             0x03ee => { Name => 'SensorImageHeight',Writable => 'int16u' }, # ("FinishedImageHeight", ref 4)
1380             0x03ef => { Name => 'BlackLevelTop', Writable => 'int16u' }, #4
1381             0x03f0 => { Name => 'BlackLevelBottom', Writable => 'int16u' }, #4
1382             0x03f1 => {
1383             Name => 'TextualInfo', # ("CameraSettingString", ref 4)
1384             SubDirectory => {
1385             TagTable => 'Image::ExifTool::Kodak::TextualInfo',
1386             },
1387             },
1388             0x03f2 => { #IB/4
1389             Name => 'FlashMode',
1390             Writable => 'int16u',
1391             Unknown => 1,
1392             Priority => 0,
1393             },
1394             0x03f3 => { #IB/4
1395             Name => 'FlashCompensation',
1396             Writable => 'rational64s',
1397             },
1398             0x03f4 => { #4
1399             Name => 'WindMode',
1400             Writable => 'int16u',
1401             Unknown => 1,
1402             },
1403             0x03f5 => { #4
1404             Name => 'FocusMode',
1405             Writable => 'int16u',
1406             Unknown => 1,
1407             Priority => 0,
1408             },
1409             0x03f8 => { #IB/4
1410             Name => 'MinAperture',
1411             Writable => 'rational64u',
1412             },
1413             0x03f9 => { #IB/4
1414             Name => 'MaxAperture',
1415             Writable => 'rational64u',
1416             },
1417             0x03fa => { #4
1418             Name => 'WhiteBalanceMode',
1419             Writable => 'int16u',
1420             Unknown => 1,
1421             },
1422             0x03fb => { #4
1423             Name => 'WhiteBalanceDetected',
1424             Writable => 'int16u',
1425             Unknown => 1,
1426             },
1427             0x03fc => { #3
1428             Name => 'WhiteBalance',
1429             Writable => 'int16u',
1430             Priority => 0,
1431             PrintConv => { }, # no values yet known
1432             },
1433             0x03fd => [{ #3
1434             Name => 'Processing',
1435             Condition => '$count == 72',
1436             SubDirectory => {
1437             TagTable => 'Image::ExifTool::Kodak::Processing',
1438             },
1439             },{
1440             Name => 'ProcessingParameters', #4
1441             Binary => 1,
1442             # int8u[256]
1443             }],
1444             0x03fe => { Name => 'ImageAbsoluteX', Writable => 'int16s', }, #4
1445             0x03ff => { Name => 'ImageAbsoluteY', Writable => 'int16s' }, #4
1446             0x0400 => { Name => 'ApplicationKeyString', Writable => 'string' }, #4
1447             0x0401 => {
1448             Name => 'Time', # ("CaptureTime", ref 4)
1449             Groups => { 2 => 'Time' },
1450             Writable => 'string',
1451             },
1452             0x0402 => { #4
1453             Name => 'GPSString',
1454             Groups => { 2 => 'Location' },
1455             Writable => 'string',
1456             },
1457             0x0403 => { #4
1458             Name => 'EventLogCapture',
1459             Binary => 1,
1460             Unknown => 1,
1461             # int32u[3072]
1462             },
1463             0x0404 => { #4
1464             Name => 'ComponentTable',
1465             Binary => 1,
1466             Unknown => 1,
1467             },
1468             0x0405 => { #4
1469             Name => 'CustomIlluminant',
1470             Writable => 'int16u',
1471             Unknown => 1,
1472             },
1473             0x0406 => [{ #IB/4
1474             Name => 'CameraTemperature',
1475             Condition => '$count == 1',
1476             Groups => { 2 => 'Camera' },
1477             Writable => 'rational64s',
1478             PrintConv => '"$val C"',
1479             PrintConvInv => '$val=~s/ ?C//; $val',
1480             },{
1481             Name => 'CameraTemperature',
1482             # (when count is 2, values seem related to temperature, but are not Celius)
1483             }],
1484             0x0407 => { #IB/4
1485             Name => 'AdapterVoltage',
1486             Groups => { 2 => 'Camera' },
1487             Writable => 'rational64u',
1488             },
1489             0x0408 => { #IB/4
1490             Name => 'BatteryVoltage',
1491             Groups => { 2 => 'Camera' },
1492             Writable => 'rational64u',
1493             },
1494             0x0409 => { #4
1495             Name => 'DacVoltages',
1496             # rational64u[8]
1497             },
1498             0x040a => { #4
1499             Name => 'IlluminantDetectorData',
1500             Binary => 1,
1501             Unknown => 1,
1502             },
1503             0x040b => { #4
1504             Name => 'PixelClockFrequency',
1505             Writable => 'int32u',
1506             },
1507             0x040c => { #4
1508             Name => 'CenterPixel',
1509             Writable => 'int16u',
1510             Count => 3,
1511             },
1512             0x040d => { #4
1513             Name => 'BurstCount',
1514             Writable => 'int16u',
1515             },
1516             0x040e => { #4
1517             Name => 'BlackLevelRough',
1518             Writable => 'int16u',
1519             },
1520             0x040f => { #4
1521             Name => 'OffsetMapHorizontal',
1522             Binary => 1,
1523             Unknown => 1,
1524             # int16s[1736]
1525             },
1526             0x0410 => { #4
1527             Name => 'OffsetMapVertical',
1528             Binary => 1,
1529             Unknown => 1,
1530             # int16s[1160]
1531             },
1532             0x0411 => { #4
1533             Name => 'Histogram',
1534             Binary => 1,
1535             Unknown => 1,
1536             # int16u[256]
1537             },
1538             0x0412 => { #4
1539             Name => 'VerticalClockOverlaps',
1540             Writable => 'int16u',
1541             Count => 2,
1542             },
1543             0x0413 => 'SensorTemperature', #4
1544             0x0414 => { Name => 'XilinxVersion', Writable => 'string' }, #4
1545             0x0415 => { Name => 'FirmwareVersion', Writable => 'int32u' }, #4
1546             0x0416 => { Name => 'BlackLevelRoughAfter', Writable => 'int16u' }, #4
1547             0x0417 => 'BrightRowsTop', #4
1548             0x0418 => 'EventLogProcess', #4
1549             0x0419 => 'DacVoltagesFlush', #4
1550             0x041a => 'FlashUsed', #4
1551             0x041b => 'FlashType', #4
1552             0x041c => 'SelfTimer', #4
1553             0x041d => 'AFMode', #4
1554             0x041e => 'LensType', #4
1555             0x041f => { Name => 'ImageCropX', Writable => 'int16s' }, #4
1556             0x0420 => { Name => 'ImageCropY', Writable => 'int16s' }, #4
1557             0x0421 => 'AdjustedTbnImageWidth', #4
1558             0x0422 => 'AdjustedTbnImageHeight', #4
1559             0x0423 => { Name => 'IntegrationTime', Writable => 'int32u' }, #4
1560             0x0424 => 'BracketingMode', #4
1561             0x0425 => 'BracketingStep', #4
1562             0x0426 => 'BracketingCounter', #4
1563             0x042e => 'HuffmanTableLength', #4 (int8u[16])
1564             0x042f => 'HuffmanTableValue', #4 (int8u[13])
1565             0x0438 => { Name => 'MainBoardVersion', Writable => 'int32u' }, #4
1566             0x0439 => { Name => 'ImagerBoardVersion', Writable => 'int32u' }, #4
1567             0x044c => 'FocusEdgeMap', #4
1568             0x05e6 => 'IdleTiming', #4
1569             0x05e7 => 'FlushTiming', #4
1570             0x05e8 => 'IntegrateTiming', #4
1571             0x05e9 => 'RegisterReadTiming', #4
1572             0x05ea => 'FirstLineTransferTiming', #4
1573             0x05eb => 'ShiftTiming', #4
1574             0x05ec => 'NormalLineTransferTiming', #4
1575             0x05ed => 'TestTransferTiming', #4
1576             # 0x05f0-0x05f9 "TestTiming", ref 4
1577             0x05fa => 'MinimumFlushRows', #4
1578             0x05fd => { Name => 'ImagerPowerOnDelayMsec', Writable => 'int32u' }, #4
1579             0x05fe => 'ImagerInitialTimingCode', #4
1580             0x05ff => 'ImagerLogicProgram', #4
1581             0x0600 => { Name => 'ImagerBiasSettlingDelayMsec', Writable => 'int32u' }, #4
1582             0x0604 => 'IdleSequence', #4
1583             0x0605 => 'FirstFlushSequence', #4
1584             0x0606 => 'FinalFlushSequence', #4
1585             0x0607 => 'SampleBlackSequence', #4
1586             0x0608 => 'TransferSequence', #4
1587             0x060e => 'DacCountsPerVolt', #4
1588             0x060f => 'BlackDacChannel', #4
1589             0x0610 => 'BlackAdCountsPerDacVolt', #4
1590             0x0611 => 'BlackTarget', #4
1591             0x0612 => 'BlackDacSettlingMsec', #4
1592             # 0x0618-0x062b - reserved for .IF file use, ref 4
1593             0x07d0 => { #4
1594             Name => 'StandardMatrixDaylight',
1595             Writable => 'rational64s',
1596             Count => 9,
1597             },
1598             0x07d1 => { #4
1599             Name => 'StandardMatrixTungsten',
1600             Writable => 'rational64s',
1601             Count => 9,
1602             },
1603             0x07d2 => { #4
1604             Name => 'StandardMatrixFluorescent',
1605             Writable => 'rational64s',
1606             Count => 9,
1607             },
1608             0x07d3 => { #4
1609             Name => 'StandardMatrixFlash',
1610             Writable => 'rational64s',
1611             Count => 9,
1612             },
1613             0x07d4 => { #4 (never used)
1614             Name => 'StandardMatrixCustom',
1615             Writable => 'rational64s',
1616             Count => 9,
1617             },
1618             0x07da => { #4
1619             Name => 'DeviantMatrixDaylight',
1620             Writable => 'rational64s',
1621             Count => 9,
1622             },
1623             0x07db => { #4
1624             Name => 'DeviantMatrixTungsten',
1625             Writable => 'rational64s',
1626             Count => 9,
1627             },
1628             0x07dc => { #4
1629             Name => 'DeviantMatrixFluorescent',
1630             Writable => 'rational64s',
1631             Count => 9,
1632             },
1633             0x07dd => { #4
1634             Name => 'DeviantMatrixFlash',
1635             Writable => 'rational64s',
1636             Count => 9,
1637             },
1638             0x07de => { #4 (never used)
1639             Name => 'DeviantMatrixCustom',
1640             Writable => 'rational64s',
1641             Count => 9,
1642             },
1643             0x07e4 => { #4
1644             Name => 'UniqueMatrixDaylight',
1645             Writable => 'rational64s',
1646             Count => 9,
1647             },
1648             0x07e5 => { #4
1649             Name => 'UniqueMatrixTungsten',
1650             Writable => 'rational64s',
1651             Count => 9,
1652             },
1653             0x07e6 => { #4
1654             Name => 'UniqueMatrixFluorescent',
1655             Writable => 'rational64s',
1656             Count => 9,
1657             },
1658             0x07e7 => { #4
1659             Name => 'UniqueMatrixFlash',
1660             Writable => 'rational64s',
1661             Count => 9,
1662             },
1663             0x07e8 => { #4
1664             Name => 'UniqueMatrixCustom',
1665             Writable => 'rational64s',
1666             Count => 9,
1667             },
1668             0x07e9 => { #4
1669             Name => 'UniqueMatrixAuto',
1670             Writable => 'rational64s',
1671             Count => 9,
1672             },
1673             0x0834 => { #4
1674             Name => 'StandardWhiteDaylight',
1675             Writable => 'rational64s',
1676             Count => 3,
1677             },
1678             0x0835 => { #4
1679             Name => 'StandardWhiteTungsten',
1680             Writable => 'rational64s',
1681             Count => 3,
1682             },
1683             0x0836 => { #4
1684             Name => 'StandardWhiteFluorescent',
1685             Writable => 'rational64s',
1686             Count => 3,
1687             },
1688             0x0837 => { #4
1689             Name => 'StandardWhiteFlash',
1690             Writable => 'rational64s',
1691             Count => 3,
1692             },
1693             0x0838 => { #4 (never used)
1694             Name => 'StandardWhiteCustom',
1695             Writable => 'rational64s',
1696             Count => 3,
1697             },
1698             0x083e => { #4
1699             Name => 'DeviantWhiteDaylight',
1700             Writable => 'rational64s',
1701             Count => 3,
1702             },
1703             0x083f => { #4
1704             Name => 'DeviantWhiteTungsten',
1705             Writable => 'rational64s',
1706             Count => 3,
1707             },
1708             0x0840 => { #4
1709             Name => 'DeviantWhiteFluorescent',
1710             Writable => 'rational64s',
1711             Count => 3,
1712             },
1713             0x0841 => { #4
1714             Name => 'DeviantWhiteFlash',
1715             Writable => 'rational64s',
1716             Count => 3,
1717             },
1718             0x0842 => { #4 (never used)
1719             Name => 'DeviantWhiteCustom',
1720             Writable => 'rational64s',
1721             Count => 3,
1722             },
1723             # 0x0843 - rational64u[3]
1724             # 0x0844 - rational64u[3]
1725             0x0846 => { #3 ("WhiteBalanceKelvin", ref 4)
1726             Name => 'ColorTemperature',
1727             Writable => 'int16u',
1728             },
1729             0x0847 => 'WB_RGBLevelsAsShot', #4
1730             0x0848 => 'WB_RGBLevelsDaylight', #IB (rational64s/u[3]) ("UniqueWhiteDaylight", ref 4)
1731             0x0849 => 'WB_RGBLevelsTungsten', #IB (rational64s/u[3]) ("UniqueWhiteTungsten", ref 4)
1732             0x084a => 'WB_RGBLevelsFluorescent', #IB (rational64s/u[3]) ("UniqueWhiteFluorescent", ref 4)
1733             0x084b => 'WB_RGBLevelsFlash', #IB (rational64s/u[3]) ("UniqueWhiteFlash", ref 4)
1734             0x084c => 'WB_RGBLevelsCustom', #IB (rational64u[3]) ("UniqueWhiteCustom", ref 4)
1735             0x084d => 'WB_RGBLevelsAuto', #IB (rational64u[3]) ("UniqueWhiteAuto", ref 4)
1736             0x0852 => { #3/4
1737             Name => 'WB_RGBMulDaylight', # ("AdjustWhiteFactorsDaylight", ref 4)
1738             Writable => 'rational64u',
1739             Count => 3,
1740             },
1741             0x0853 => { #3/4
1742             Name => 'WB_RGBMulTungsten', # ("AdjustWhiteFactorsTungsten", ref 4)
1743             Writable => 'rational64u',
1744             Count => 3,
1745             },
1746             0x0854 => { #3/4
1747             Name => 'WB_RGBMulFluorescent', # ("AdjustWhiteFactorsFluorescent", ref 4)
1748             Writable => 'rational64u',
1749             Count => 3,
1750             },
1751             0x0855 => { #3/4
1752             Name => 'WB_RGBMulFlash', # ("AdjustWhiteFactorsFlash", ref 4)
1753             Writable => 'rational64u',
1754             Count => 3,
1755             },
1756             0x085c => { Name => 'WB_RGBCoeffsDaylight', Binary => 1 }, #3 ("WhiteBalanceParametersDaylight", ref 4)
1757             0x085d => { Name => 'WB_RGBCoeffsTungsten', Binary => 1 }, #3 ("WhiteBalanceParametersTungsten", ref 4)
1758             0x085e => { Name => 'WB_RGBCoeffsFluorescent',Binary=>1 }, #3 ("WhiteBalanceParametersFluorescent", ref 4)
1759             0x085f => { Name => 'WB_RGBCoeffsFlash', Binary => 1 }, #3 ("WhiteBalanceParametersFlash", ref 4)
1760             0x0898 => { Name => 'ExposureGainDaylight', Writable => 'rational64s' }, #4
1761             0x0899 => { Name => 'ExposureGainTungsten', Writable => 'rational64s' }, #4
1762             0x089a => { Name => 'ExposureGainFluorescent',Writable=>'rational64s' }, #4
1763             0x089b => { Name => 'ExposureGainFlash', Writable => 'rational64s' }, #4
1764             0x089c => { Name => 'ExposureGainCustom', Writable => 'rational64s' }, #4 (never used)
1765             0x089d => { Name => 'AnalogISOTable', Writable => 'rational64u', Count => 3 }, #4
1766             0x089e => { Name => 'AnalogCaptureISO', Writable => 'int32u' }, #4
1767             0x089f => { Name => 'ISOCalibrationGain', Writable => 'rational64u' }, #4
1768             0x08a0 => 'ISOCalibrationGainTable', #4
1769             0x08a1 => 'ExposureHeadroomFactor', #4
1770             0x08ab => 'LinearitySplineTags', #4 (int16u[24])
1771             # 0x08ac-0x08fb - LinearitySpline(n) (rational64s[75])
1772             0x08fc => { #4
1773             Name => 'MonitorMatrix',
1774             Writable => 'rational64s',
1775             Count => 9,
1776             },
1777             0x08fd => 'TonScaleTable', #4
1778             0x08fe => { Name => 'Gamma', Writable => 'rational64u' }, #4
1779             0x08ff => 'LogLinTable', #4
1780             0x0900 => 'LinLogTable', #4
1781             0x0901 => { Name => 'GammaTable', Binary => 1 }, #4 (int16u[4096])
1782             0x0902 => { Name => 'LogScale', Writable => 'rational64u' }, #4
1783             0x0903 => { Name => 'BaseISO', Writable => 'rational64u' }, #IB (ISO before digital gain)
1784             0x0904 => { Name => 'LinLogCoring', Writable => 'int16u' }, #4
1785             0x0905 => { Name => 'PatternGainConversionTable', Binary => 1 }, #4 (int8u[256])
1786             0x0906 => 'DefectCount', #4
1787             0x0907 => { Name => 'DefectList', Binary => 1 }, #4 (undef[48])
1788             0x0908 => { Name => 'DefectListPacked', Binary => 1 }, #4 (int16u[296])
1789             0x0909 => { Name => 'ImageSpace', Writable => 'int16u' }, #4
1790             0x090a => { Name => 'ThumbnailCompressionTable',Binary => 1 }, #4 (int8u[4096])
1791             0x090b => { Name => 'ThumbnailExpansionTable', Binary => 1 }, #4 (int16u[256])
1792             0x090c => { Name => 'ImageCompressionTable', Binary => 1 }, #4 (int16u[4096])
1793             0x090d => { Name => 'ImageExpansionTable', Binary => 1 }, #4 (int16u[1024/4096])
1794             0x090e => 'EighteenPercentPoint', #4
1795             0x090f => { Name => 'DefectIsoCode', Writable => 'int16u' }, #4
1796             0x0910 => { Name => 'BaseISODaylight', Writable => 'rational64u' }, #4
1797             0x0911 => { Name => 'BaseISOTungsten', Writable => 'rational64u' }, #4
1798             0x0912 => { Name => 'BaseISOFluorescent', Writable => 'rational64u' }, #4
1799             0x0913 => { Name => 'BaseISOFlash', Writable => 'rational64u' }, #4
1800             0x091a => { Name => 'MatrixSelectThreshold',Writable => 'int16s' }, #4
1801             0x091b => { Name => 'MatrixSelectK', Writable => 'rational64u' }, #4
1802             0x091c => { Name => 'IlluminantDetectTable',Binary => 1 }, #4 (int16u[200])
1803             0x091d => 'RGTable', #4
1804             0x091e => { Name => 'MatrixSelectThreshold1', Writable => 'int16s' }, #4
1805             0x091f => { Name => 'MatrixSelectThreshold2', Writable => 'int16s' }, #4
1806             0x0924 => 'PortraitMatrix', #4
1807             0x0925 => 'PortraitToneScaleTable', #4
1808             0x092e => { Name => 'EnableSharpening', Writable => 'int16u' }, #4
1809             0x092f => { #4
1810             Name => 'SharpeningKernel',
1811             Writable => 'int16s',
1812             Count => 25,
1813             },
1814             0x0930 => { Name => 'EdgeMapSlope', Writable => 'int16u' }, #4
1815             0x0931 => { Name => 'EdgeMapX1', Writable => 'int16u' }, #4
1816             0x0932 => { Name => 'EdgeMapX2', Writable => 'int16u' }, #4
1817             0x0933 => { #4
1818             Name => 'KernelDenominators',
1819             Writable => 'int16u',
1820             Count => 3,
1821             },
1822             0x0934 => { Name => 'EdgeMapX3', Writable => 'int16u' }, #4
1823             0x0935 => { Name => 'EdgeMapX4', Writable => 'int16u' }, #4
1824             0x0936 => 'SharpenForThumbnail', #4
1825             0x0937 => 'EdgeSpline', #4
1826             0x0938 => 'DownSampleBy2Hor', #4 (int16s[4])
1827             0x0939 => 'DownSampleBy2Ver', #4 (int16s[4])
1828             0x093a => 'DownSampleBy4Hor', #4 (int16s[6])
1829             0x093b => 'DownSampleBy4Ver', #4 (int16s[6])
1830             0x093c => 'DownSampleBy3Hor', #4 (int16s[6])
1831             0x093d => 'DownSampleBy3Ver', #4 (int16s[6])
1832             0x093e => 'DownSampleBy6Hor', #4 (int16s[8])
1833             0x093f => 'DownSampleBy6Ver', #4 (int16s[8])
1834             0x0940 => 'DownSampleBy2Hor3MPdcr', #4
1835             0x0941 => 'DownSampleBy2Ver3MPdcr', #4
1836             0x0942 => 'ThumbnailResizeRatio', #4
1837             0x0943 => { Name => 'AtCaptureUserCrop', Writable => 'int32u', Count => 4 }, #4 (Top, Left, Bottom, Right)
1838             0x0944 => { Name => 'ImageResolution', Writable => 'int32u' }, #4 (Contains enum for imageDcrRes or imageJpegRes)
1839             0x0945 => { Name => 'ImageResolutionJpg', Writable => 'int32u' }, #4 (Contains enum for imageJpegRes)
1840             0x094c => 'USMParametersLow', #4 (int16s[8])
1841             0x094d => 'USMParametersMed', #4 (int16s[8])
1842             0x094e => 'USMParametersHigh', #4 (int16s[8])
1843             0x094f => 'USMParametersHost', #4 (int16s[10])
1844             0x0950 => { Name => 'EdgeSplineLow', Binary => 1 }, #4 (rational64s[57])
1845             0x0951 => { Name => 'EdgeSplineMed', Binary => 1 }, #4 (rational64s[69])
1846             0x0952 => { Name => 'EdgeSplineHigh',Binary => 1 }, #4 (rational64s[69])
1847             0x0953 => 'USMParametersHost6MP', #4 (int16s[10])
1848             0x0954 => 'USMParametersHost3MP', #4 (int16s[10])
1849             0x0960 => { Name => 'PatternImagerWidth', Writable => 'int16u' }, #4
1850             0x0961 => { Name => 'PatternImagerHeight', Writable => 'int16u' }, #4
1851             0x0962 => { Name => 'PatternAreaWidth', Writable => 'int16u' }, #4
1852             0x0963 => { Name => 'PatternAreaHeight', Writable => 'int16u' }, #4
1853             0x0964 => { Name => 'PatternCorrectionGains', Binary => 1 }, #4 (undef[48174])
1854             0x0965 => 'PatternCorrectionOffsets', #4
1855             0x0966 => { Name => 'PatternX', Writable => 'int16u' }, #4
1856             0x0967 => { Name => 'PatternY', Writable => 'int16u' }, #4
1857             0x0968 => { Name => 'PatternCorrectionFactors', Binary => 1 }, #4 (undef[48174])
1858             0x0969 => { Name => 'PatternCorrectionFactorScale', Writable => 'int16u' }, #4
1859             0x096a => { Name => 'PatternCropRows1', Writable => 'int16u' }, #4
1860             0x096b => { Name => 'PatternCropRows2', Writable => 'int16u' }, #4
1861             0x096c => { Name => 'PatternCropCols1', Writable => 'int16u' }, #4
1862             0x096d => { Name => 'PatternCropCols2', Writable => 'int16u' }, #4
1863             0x096e => 'PixelCorrectionGains', #4
1864             0x096f => 'StitchRows', #4 (int16u[6])
1865             0x0970 => 'StitchColumns', #4 (int16u)
1866             0x0971 => { Name => 'PixelCorrectionScale', Writable => 'int16u' }, #4
1867             0x0972 => { Name => 'PixelCorrectionOffset',Writable => 'int16u' }, #4
1868             0x0988 => 'LensTableIndex', #4
1869             0x0992 => 'DiffTileGains602832', #4
1870             0x0993 => 'DiffTileGains24t852822', #4 (reserved tags 2450-2459)
1871             0x099c => 'TileGainDeterminationTable', #4 (int16s[0])
1872             0x099d => 'NemoBlurKernel', #4 (int16s[14])
1873             0x099e => 'NemoTileSize', #4 (int16u)
1874             0x099f => 'NemoGainFactors', #4 (rational64s[4])
1875             0x09a0 => 'NemoDarkLimit', #4 (int16u)
1876             0x09a1 => 'NemoHighlight12Limit', #4
1877             0x09c4 => { Name => 'ImagerFileProductionLevel',Writable => 'int16u' }, #4
1878             0x09c5 => { Name => 'ImagerFileDateCreated', Writable => 'int32u' }, #4 (unknown encoding - PH)
1879             0x09c6 => { Name => 'CalibrationVersion', Writable => 'string' }, #4
1880             0x09c7 => { Name => 'ImagerFileTagsVersionStandard', Writable => 'int16u' }, #4
1881             0x09c8 => { Name => 'IFCameraModel', Writable => 'string' }, #4
1882             0x09c9 => { Name => 'CalibrationHistory', Writable => 'string' }, #4
1883             0x09ca => { Name => 'CalibrationLog', Binary => 1 }, #4 (undef[1140])
1884             0x09ce => { Name => 'SensorSerialNumber', Writable => 'string', Groups => { 2 => 'Camera' } }, #IB/4
1885             0x09f6 => 'DefectConcealArtCorrectThres', #4 (no longer used)
1886             0x09f7 => 'SglColDCACThres1', #4
1887             0x09f8 => 'SglColDCACThres2', #4
1888             0x09f9 => 'SglColDCACTHres3', #4
1889             0x0a01 => 'DblColDCACThres1', #4
1890             0x0a02 => 'DblColDCACThres2', #4
1891             0x0a0a => { Name => 'DefectConcealThresTable', Binary => 1 }, #4 (int16u[121/79])
1892             0x0a28 => 'MonoUniqueMatrix', #4
1893             0x0a29 => 'MonoMonitorMatrix', #4
1894             0x0a2a => 'MonoToneScaleTable', #4
1895             # 0x0a32-0x0a3b "OmenInitialSurfaceRed(n)", ref 4
1896             # 0x0a3c-0x0a45 "OmenInitialSurfaceGoR(n)", ref 4
1897             # 0x0a46-0x0a4f "OmenInitialSurfaceBlue(n)", ref 4
1898             # 0x0a50-0x0a59 "OmenInitialSurfaceGoB(n)", ref 4
1899             0x0a5a => 'OmenInitialScaling', #4
1900             0x0a5b => 'OmenInitialRows', #4
1901             0x0a5c => 'OmenInitialColumns', #4
1902             0x0a5d => { Name => 'OmenInitialIPFStrength',Writable => 'int32s', Count => 4 }, #4
1903             0x0a5e => { Name => 'OmenEarlyStrength', Writable => 'int32s', Count => 4 }, #4
1904             0x0a5f => { Name => 'OmenAutoStrength', Writable => 'int32s', Count => 4 }, #4
1905             0x0a60 => { Name => 'OmenAtCaptureStrength', Writable => 'int32s', Count => 4 }, #4
1906             0x0a61 => 'OmenAtCaptureMode', #4
1907             0x0a62 => { Name => 'OmenFocalLengthLimit', Writable => 'int16s' }, #4
1908             0x0a64 => { Name => 'OmenSurfaceIndex', Writable => 'int16s' }, #4 (which InitialSurface to use)
1909             0x0a65 => 'OmenPercentToRationalLimitsRed', #4 (signed rationals for 0 and 100)
1910             0x0a66 => 'OmenPercentToRationalLimitsGoR', #4 (signed rationals for 0 and 100)
1911             0x0a67 => 'OmenPercentToRationalLimitsBlue', #4 (signed rationals for 0 and 100)
1912             0x0a68 => 'OmenPercentToRationalLimitsGoB', #4 (signed rationals for 0 and 100)
1913             0x0a6e => 'OmenEarlyGoBSurface', #4
1914             0x0a6f => 'OmenEarlyGoBRows', #4
1915             0x0a70 => 'OmenEarlyGoBColumns', #4
1916             0x0a73 => 'OmenSmoothingKernel', #4
1917             0x0a74 => 'OmenGradientOffset', #4
1918             0x0a75 => 'OmenGradientKernel', #4
1919             0x0a76 => 'OmenGradientKernelTaps', #4
1920             0x0a77 => 'OmenRatioClipFactors', #4
1921             0x0a78 => 'OmenRatioExclusionFactors', #4
1922             0x0a79 => 'OmenGradientExclusionLimits', #4
1923             0x0a7a => 'OmenROICoordinates', #4
1924             0x0a7b => 'OmenROICoefficients', #4
1925             0x0a7c => 'OmenRangeWeighting', #4
1926             0x0a7d => 'OmenMeanToStrength', #4
1927             0x0bb8 => 'FactoryWhiteGainsDaylight', #4
1928             0x0bb9 => 'FactoryWhiteOffsetsDaylight', #4
1929             0x0bba => 'DacGainsCoarse', #4
1930             0x0bbb => 'DacGainsFine', #4
1931             0x0bbc => 'DigitalExposureGains', #4
1932             0x0bbd => 'DigitalExposureBiases', #4
1933             0x0bbe => 'BlackClamp', #4
1934             0x0bbf => 'ChannelCoarseGainAdjust', #4
1935             0x0bc0 => 'BlackClampOffset', #4
1936             0x0bf4 => 'DMPixelThresholdFactor', #4 (TIFF_RATIONAL)
1937             0x0bf5 => 'DMWindowThresholdFactor', #4 (TIFF_RATIONAL)
1938             0x0bf6 => 'DMTrimFraction', #4 (TIFF_RATIONAL)
1939             0x0bf7 => 'DMSmoothRejThresh', #4 (TIFF_RATIONAL)
1940             0x0bf8 => 'DMFillRejThresh', #4 (TIFF_RATIONAL)
1941             0x0bf9 => 'VMWsize', #4 (TIFF_SHORT)
1942             0x0bfa => 'DMErodeRadius', #4 (TIFF_SHORT)
1943             0x0bfb => 'DMNumPatches', #4 (TIFF_SHORT)
1944             0x0bfc => 'DMNoiseScale', #4 (TIFF_RATIONAL)
1945             0x0bfe => 'BrightDefectThreshold', #4
1946             0x0bff => 'BrightDefectIntegrationMS', #4
1947             0x0c00 => 'BrightDefectIsoCode', #4
1948             0x0c03 => 'TopDarkRow1', #4 (support 330 dark map generation algorithm)
1949             0x0c04 => 'TopDarkRow2', #4 (these tags were 3175-3192 prior to 18Jan2001)
1950             0x0c05 => 'BottomDarkRow1', #4
1951             0x0c06 => 'BottomDarkRow2', #4
1952             0x0c07 => 'LeftDarkCol1', #4
1953             0x0c08 => 'LeftDarkCol2', #4
1954             0x0c09 => 'RightDarkCol1', #4
1955             0x0c0a => 'RightDarkCol2', #4
1956             0x0c0b => 'HMPixThresh', #4
1957             0x0c0c => 'HMColThresh', #4
1958             0x0c0d => 'HMWsize', #4
1959             0x0c0e => 'HMColRejThresh', #4
1960             0x0c0f => 'VMPixThresh', #4
1961             0x0c10 => 'VMColThresh', #4
1962             0x0c11 => 'VMNbands', #4
1963             0x0c12 => 'VMColDropThresh', #4
1964             0x0c13 => 'VMPatchResLimit', #4
1965             0x0c14 => 'MapScale', #4
1966             0x0c1c => 'Klut', #4
1967             0x0c1d => 'RimNonlinearity', #4 (Obsolete)
1968             0x0c1e => 'InverseRimNonlinearity', #4 (Obsolete)
1969             0x0c1f => 'RembrandtToneScale', #4 (Obsolete)
1970             0x0c20 => 'RimToNifColorTransform', #4 (Obsolete)
1971             0x0c21 => 'RimToNifScaleFactor', #4 (Obsolete)
1972             0x0c22 => 'NifNonlinearity', #4 (Obsolete)
1973             0x0c23 => 'SBALogTransform', #4 (Obsolete)
1974             0x0c24 => 'InverseSBALogTransform', #4 (Obsolete)
1975             0x0c25 => { Name => 'SBABlack', Writable => 'int16u' }, #4
1976             0x0c26 => { Name => 'SBAGray', Writable => 'int16u' }, #4
1977             0x0c27 => { Name => 'SBAWhite', Writable => 'int16u' }, #4
1978             0x0c28 => { Name => 'GaussianWeights', Binary => 1 }, #4 (int16u[864])
1979             0x0c29 => { Name => 'SfsBoundary', Binary => 1 }, #4 (int16u[6561])
1980             0x0c2a => 'CoringTableBest', #4 (Obsolete)
1981             0x0c2b => 'CoringTableBetter', #4 (Obsolete)
1982             0x0c2c => 'CoringTableGood', #4 (Obsolete)
1983             0x0c2d => 'ExposureReferenceGain', #4 (Obsolete)
1984             0x0c2e => 'ExposureReferenceOffset', #4 (Obsolete)
1985             0x0c2f => 'SBARedBalanceLut', #4 (Obsolete)
1986             0x0c30 => 'SBAGreenBalanceLut', #4 (Obsolete)
1987             0x0c31 => 'SBABlueBalanceLut', #4 (Obsolete)
1988             0x0c32 => { Name => 'SBANeutralBAL', Writable => 'int32s' }, #4
1989             0x0c33 => { Name => 'SBAGreenMagentaBAL', Writable => 'int32s' }, #4
1990             0x0c34 => { Name => 'SBAIlluminantBAL', Writable => 'int32s' }, #4
1991             0x0c35 => { Name => 'SBAAnalysisComplete', Writable => 'int8u' }, #4
1992             0x0c36 => 'JPEGQTableBest', #4
1993             0x0c37 => 'JPEGQTableBetter', #4
1994             0x0c38 => 'JPEGQTableGood', #4
1995             0x0c39 => 'RembrandtPortraitToneScale', #4 (Obsolete)
1996             0x0c3a => 'RembrandtConsumerToneScale', #4 (Obsolete)
1997             0x0c3b => 'CFAGreenThreshold1', #4 (Now CFAGreenThreshold1H)
1998             0x0c3c => 'CFAGreenThreshold2', #4 (Now CFAGreenThreshold2V)
1999             0x0c3d => { Name => 'QTableLarge50Pct', Binary => 1 }, #4 (undef[130])
2000             0x0c3e => { Name => 'QTableLarge67Pct', Binary => 1 }, #4 (undef[130])
2001             0x0c3f => { Name => 'QTableLarge100Pct', Binary => 1 }, #4 (undef[130])
2002             0x0c40 => { Name => 'QTableMedium50Pct', Binary => 1 }, #4 (undef[130])
2003             0x0c41 => { Name => 'QTableMedium67Pct', Binary => 1 }, #4 (undef[130])
2004             0x0c42 => { Name => 'QTableMedium100Pct', Binary => 1 }, #4 (undef[130])
2005             0x0c43 => { Name => 'QTableSmall50Pct', Binary => 1 }, #4 (undef[130])
2006             0x0c44 => { Name => 'QTableSmall67Pct', Binary => 1 }, #4 (undef[130])
2007             0x0c45 => { Name => 'QTableSmall100Pct', Binary => 1 }, #4 (undef[130])
2008             0x0c46 => { Name => 'SBAHighGray', Writable => 'int16u' }, #4
2009             0x0c47 => { Name => 'SBALowGray', Writable => 'int16u' }, #4
2010             0x0c48 => { Name => 'CaptureLook', Writable => 'int16u' }, #4 (was "ToneScaleFlag")
2011             0x0c49 => { Name => 'SBAIllOffset', Writable => 'int16s' }, #4
2012             0x0c4a => { Name => 'SBAGmOffset', Writable => 'int16s' }, #4
2013             0x0c4b => 'NifNonlinearity12Bit', #4 (Obsolete)
2014             0x0c4c => 'SharpeningOn', #4 (Obsolete)
2015             0x0c4d => 'NifNonlinearity16Bit', #4 (Obsolete)
2016             0x0c4e => 'RawHistogram', #4
2017             0x0c4f => 'RawCFAComponentAverages', #4
2018             0x0c50 => 'DisableFlagsPresent', #4
2019             0x0c51 => 'DelayCols', #4
2020             0x0c52 => 'DummyColsLeft', #4
2021             0x0c53 => 'TrashColsRight', #4
2022             0x0c54 => 'BlackColsRight', #4
2023             0x0c55 => 'DummyColsRight', #4
2024             0x0c56 => 'OverClockColsRight', #4
2025             0x0c57 => 'UnusedBlackRowsTopOut', #4
2026             0x0c58 => 'TrashRowsBottom', #4
2027             0x0c59 => 'BlackRowsBottom', #4
2028             0x0c5a => 'OverClockRowsBottom', #4
2029             0x0c5b => 'BlackColsLeft', #4
2030             0x0c5c => 'BlackRowsTop', #4
2031             0x0c5d => 'PartialActiveColsLeft', #4
2032             0x0c5e => 'PartialActiveColsRight', #4
2033             0x0c5f => 'PartialActiveRowsTop', #4
2034             0x0c60 => 'PartialActiveRowsBottom', #4
2035             0x0c61 => { Name => 'ProcessBorderColsLeft', Writable => 'int16u' }, #4
2036             0x0c62 => { Name => 'ProcessBorderColsRight', Writable => 'int16u' }, #4
2037             0x0c63 => { Name => 'ProcessBorderRowsTop', Writable => 'int16u' }, #4
2038             0x0c64 => { Name => 'ProcessBorderRowsBottom', Writable => 'int16u' }, #4
2039             0x0c65 => 'ActiveCols', #4
2040             0x0c66 => 'ActiveRows', #4
2041             0x0c67 => 'FirstLines', #4
2042             0x0c68 => 'UnusedBlackRowsTopIn', #4
2043             0x0c69 => 'UnusedBlackRowsBottomIn', #4
2044             0x0c6a => 'UnusedBlackRowsBottomOut', #4
2045             0x0c6b => 'UnusedBlackColsLeftOut', #4
2046             0x0c6c => 'UnusedBlackColsLeftIn', #4
2047             0x0c6d => 'UnusedBlackColsRightIn', #4
2048             0x0c6e => 'UnusedBlackColsRightOut', #4
2049             0x0c6f => { Name => 'CFAOffsetRows', Writable => 'int32u' }, #4
2050             0x0c70 => { Name => 'ShiftCols', Writable => 'int16s' }, #4
2051             0x0c71 => { Name => 'CFAOffsetCols', Writable => 'int32u' }, #4
2052             0x0c76 => 'DarkMapScale', #4
2053             0x0c77 => 'HMapHandling', #4
2054             0x0c78 => 'VMapHandling', #4
2055             0x0c79 => 'DarkThreshold', #4
2056             0x0c7a => { Name => 'DMDitherMatrix', Writable => 'int16u' }, #4
2057             0x0c7b => { Name => 'DMDitherMatrixWidth', Writable => 'int16u' }, #4
2058             0x0c7c => { Name => 'DMDitherMatrixHeight', Writable => 'int16u' }, #4
2059             0x0c7d => { Name => 'MaxPixelValueThreshold', Writable => 'int16u' }, #4
2060             0x0c7e => { Name => 'HoleFillDeltaThreshold', Writable => 'int16u' }, #4
2061             0x0c7f => { Name => 'DarkPedestal', Writable => 'int16u' }, #4
2062             0x0c80 => { Name => 'ImageProcessingFileTagsVersionNumber', Writable => 'int16u' }, #4
2063             0x0c81 => { Name => 'ImageProcessingFileDateCreated', Writable => 'string', Groups => { 2 => 'Time' } }, #4
2064             0x0c82 => { Name => 'DoublingMicrovolts', Writable => 'int32s' }, #4
2065             0x0c83 => { #4
2066             Name => 'DarkFrameShortExposure',
2067             Writable => 'int32u',
2068             ValueConv => '$val / 1e6', # (microseconds)
2069             ValueConvInv => '$val * 1e6',
2070             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
2071             PrintConvInv => '$val',
2072             },
2073             0x0c84 => { #4
2074             Name => 'DarkFrameLongExposure',
2075             Writable => 'int32u',
2076             ValueConv => '$val / 1e6', # (microseconds)
2077             ValueConvInv => '$val * 1e6',
2078             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
2079             PrintConvInv => '$val',
2080             },
2081             0x0c85 => { Name => 'DarkFrameCountFactor', Writable => 'rational64u' }, #4
2082             0x0c88 => { Name => 'HoleFillDarkDeltaThreshold', Writable => 'int16u' }, #4
2083             0x0c89 => 'FarkleWhiteThreshold', #4
2084             0x0c8a => { Name => 'ColumnResetOffsets', Binary => 1 }, #4 (int16u[3012])
2085             0x0c8b => { Name => 'ColumnGainFactors', Binary => 1 }, #4 (int16u[3012])
2086             # 0x0c94-0x0c9d ColumnOffsets (int16u[3012]), ref 4
2087             0x0c8c => 'Channel0LagKernel', #4
2088             0x0c8d => 'Channel1LagKernel', #4
2089             0x0c8e => 'Channel2LagKernel', #4
2090             0x0c8f => 'Channel3LagKernel', #4
2091             0x0c90 => 'BluegrassTable', #4
2092             0x0c91 => 'BluegrassScale1', #4
2093             0x0c92 => 'BluegrassScale2', #4
2094             0x0ce4 => 'FinishedFileProcessingRequest', #4
2095             0x0ce5 => { Name => 'FirmwareVersion', Writable => 'string', Groups => { 2 => 'Camera' } }, # ("ProcessingSoftware", ref 4)
2096             0x0ce6 => 'HostSoftwareExportVersion', #4 (ULONG only exists if made by host SW)
2097             0x0ce7 => { #4
2098             Name => 'HostSoftwareRendering',
2099             Writable => 'int32u',
2100             PrintConv => {
2101             0 => 'Normal (sRGB)',
2102             1 => 'Linear (camera RGB)',
2103             2 => 'Pro Photo RGB',
2104             3 => 'Unknown',
2105             4 => 'Other Profile',
2106             },
2107             },
2108             0x0dac => 'DCS3XXProcessingInfoIFD', #4 (Obsolete)
2109             0x0dad => 'DCS3XXProcessingInfo', #4 (Obsolete)
2110             0x0dae => { Name => 'IPAVersion', Writable => 'int32u' }, #4
2111             0x0db6 => 'FinishIPAVersion', #4
2112             0x0db7 => 'FinishIPFVersion', #4
2113             0x0db8 => { #4
2114             Name => 'FinishFileType',
2115             Writable => 'int32u',
2116             PrintConv => {
2117             0 => 'JPEG Best',
2118             1 => 'JPEG Better',
2119             2 => 'JPEG Good',
2120             3 => 'TIFF RGB',
2121             },
2122             },
2123             0x0db9 => { #4
2124             Name => 'FinishResolution',
2125             Writable => 'int32u',
2126             PrintConv => {
2127             0 => '100%',
2128             1 => '67%',
2129             2 => '50%',
2130             3 => '25%',
2131             },
2132             },
2133             0x0dba => { #4
2134             Name => 'FinishNoise',
2135             Writable => 'int32u',
2136             PrintConv => {
2137             0 => 'Normal',
2138             1 => 'Strong',
2139             2 => 'Low',
2140             },
2141             },
2142             0x0dbb => { #4
2143             Name => 'FinishSharpening',
2144             Writable => 'int32u',
2145             PrintConv => {
2146             0 => 'None',
2147             1 => 'High',
2148             2 => 'Medium',
2149             3 => 'Low',
2150             },
2151             },
2152             0x0dbc => { #4
2153             Name => 'FinishLook',
2154             Writable => 'int32u',
2155             PrintConv => {
2156             0 => 'Product',
2157             1 => 'Portrait',
2158             2 => 'Product Reduced',
2159             3 => 'Portrait Reduced',
2160             4 => 'Monochrome Product',
2161             5 => 'Monochrome Portrait',
2162             6 => 'Wedding',
2163             7 => 'Event',
2164             8 => 'Product Hi Color',
2165             9 => 'Portrait Hi Color',
2166             # (past this is not yet implemented)
2167             10 => 'Product Hi Color Hold',
2168             11 => 'Portrait Hi Color Hold',
2169             13 => 'DCS BW Normal',
2170             14 => 'DCS BW Wratten 8',
2171             15 => 'DCS BW Wratten 25',
2172             16 => 'DCS Sepia 1',
2173             17 => 'DCS Sepia 2',
2174             },
2175             },
2176             0x0dbd => { #4
2177             Name => 'FinishExposure',
2178             Writable => 'int32u',
2179             PrintConv => { 0 => 'Yes', 1 => 'No' },
2180             },
2181             0x0e0b => { Name => 'SigmaScalingFactorLowRes', Writable => 'rational64u' }, #4 (for scaling sigma tables in-camera)
2182             0x0e0c => { Name => 'SigmaScalingFactorCamera', Writable => 'rational64u' }, #4 (for scaling sigma tables in-camera)
2183             0x0e0d => { Name => 'SigmaImpulseParameters', Writable => 'int16u', Count => -1 }, #4 (for impulse reduction control)
2184             0x0e0e => { Name => 'SigmaNoiseThreshTableV2', Binary => 1 }, #4 (replaces V2 caltable)
2185             0x0e0f => { Name => 'SigmaSizeTable', Writable => 'int16u', Count => -1 }, #4
2186             0x0e10 => 'DacGainsCoarseAdjPreIF41', #4 (Tag not used due to abandoned implementation)
2187             0x0e11 => { Name => 'SigmaNoiseFilterCalTableV1', Binary => 1 }, #4 (undef[418]) (Defines Version 1 of Sigma Noise Filter table within .IF/.IPF)
2188             0x0e12 => { Name => 'SigmaNoiseFilterTableV1', Binary => 1}, #4 (Defines Version 1 of Sigma Noise Filter table within image)
2189             0x0e13 => 'Lin12ToKlut8', #4
2190             0x0e14 => 'SigmaNoiseFilterTableV1Version', #4 (int16u/int32u) (This tag describes the version level of the SigmaNoiseFilterTableV1 class of tags)
2191             0x0e15 => 'Lin12ToKlut12', #4
2192             0x0e16 => 'Klut12ToLin12', #4
2193             0x0e17 => { Name => 'NifNonlinearity12To16', Binary => 1 }, #4 (int16u[4096])
2194             0x0e18 => { Name => 'SBALog12Transform', Binary => 1 }, #4 (int16u[4096])
2195             0x0e19 => { Name => 'InverseSBALog12Transform', Binary=> 1 }, #4 (int16u[3613])
2196             0x0e1a => { Name => 'ToneScale0', Binary => 1 }, #4 (int16u[4096]) (Was Portrait12ToneScale on DCS3XX 1.3.1)
2197             0x0e1b => { Name => 'ToneScale1', Binary => 1 }, #4 (int16u[4096]) (Was Consumer12ToneScale on DCS3XX 1.3.1)
2198             0x0e1c => { Name => 'ToneScale2', Binary => 1 }, #4 (int16u[4096])
2199             0x0e1d => { Name => 'ToneScale3', Binary => 1 }, #4 (int16u[4096])
2200             0x0e1e => { Name => 'ToneScale4', Binary => 1 }, #4 (int16u[4096])
2201             0x0e1f => { Name => 'ToneScale5', Binary => 1 }, #4 (int16u[4096])
2202             0x0e20 => { Name => 'ToneScale6', Binary => 1 }, #4 (int16u[4096])
2203             0x0e21 => { Name => 'ToneScale7', Binary => 1 }, #4 (int16u[4096])
2204             0x0e22 => { Name => 'ToneScale8', Binary => 1 }, #4 (int16u[4096])
2205             0x0e23 => { Name => 'ToneScale9', Binary => 1 }, #4 (int16u[4096])
2206             0x0e24 => 'DayMat0', #4 (Obsolete)
2207             0x0e25 => 'DayMat1', #4 (Obsolete)
2208             0x0e26 => 'DayMat2', #4 (Obsolete)
2209             0x0e27 => 'DayMat3', #4 (Obsolete)
2210             0x0e28 => 'DayMat4', #4 (Obsolete)
2211             0x0e29 => 'DayMat5', #4 (Obsolete)
2212             0x0e2a => 'DayMat6', #4 (Obsolete)
2213             0x0e2b => 'DayMat7', #4 (Obsolete)
2214             0x0e2c => 'DayMat8', #4 (Obsolete)
2215             0x0e2d => 'DayMat9', #4 (Obsolete)
2216             0x0e2e => 'TungMat0', #4 (Obsolete)
2217             0x0e2f => 'TungMat1', #4 (Obsolete)
2218             0x0e30 => 'TungMat2', #4 (Obsolete)
2219             0x0e31 => 'TungMat3', #4 (Obsolete)
2220             0x0e32 => 'TungMat4', #4 (Obsolete)
2221             0x0e33 => 'TungMat5', #4 (Obsolete)
2222             0x0e34 => 'TungMat6', #4 (Obsolete)
2223             0x0e35 => 'TungMat7', #4 (Obsolete)
2224             0x0e36 => 'TungMat8', #4 (Obsolete)
2225             0x0e37 => 'TungMat9', #4 (Obsolete)
2226             0x0e38 => 'FluorMat0', #4 (Obsolete)
2227             0x0e39 => 'FluorMat1', #4 (Obsolete)
2228             0x0e3a => 'FluorMat2', #4 (Obsolete)
2229             0x0e3b => 'FluorMat3', #4 (Obsolete)
2230             0x0e3c => 'FluorMat4', #4 (Obsolete)
2231             0x0e3d => 'FluorMat5', #4 (Obsolete)
2232             0x0e3e => 'FluorMat6', #4 (Obsolete)
2233             0x0e3f => 'FluorMat7', #4 (Obsolete)
2234             0x0e40 => 'FluorMat8', #4 (Obsolete)
2235             0x0e41 => 'FluorMat9', #4 (Obsolete)
2236             0x0e42 => 'FlashMat0', #4 (Obsolete)
2237             0x0e43 => 'FlashMat1', #4 (Obsolete)
2238             0x0e44 => 'FlashMat2', #4 (Obsolete)
2239             0x0e45 => 'FlashMat3', #4 (Obsolete)
2240             0x0e46 => 'FlashMat4', #4 (Obsolete)
2241             0x0e47 => 'FlashMat5', #4 (Obsolete)
2242             0x0e48 => 'FlashMat6', #4 (Obsolete)
2243             0x0e49 => 'FlashMat7', #4 (Obsolete)
2244             0x0e4a => 'FlashMat8', #4 (Obsolete)
2245             0x0e4b => 'FlashMat9', #4 (Obsolete)
2246             0x0e4c => { #IB
2247             Name => 'KodakLook', # ("LookNameTable", ref 4)
2248             Format => 'undef',
2249             Writable => 'string',
2250             ValueConv => '$val=~tr/\0/\n/; $val',
2251             ValueConvInv => '$val=~tr/\n/\0/; $val',
2252             },
2253             0x0e4d => { Name => 'IPFCameraModel', Writable => 'string' }, #4
2254             0x0e4e => { Name => 'AH2GreenInterpolationThreshold', Writable => 'int16u' }, #4
2255             0x0e4f => { Name => 'ResamplingKernelDenominators067', Writable => 'int16u', Count => 3 }, #4 (table of sharpening denoms; 0=Low, 1=Medium, 2=High)
2256             0x0e50 => { Name => 'ResamplingKernelDenominators050', Writable => 'int16u', Count => 3 }, #4 (table of sharpening denoms; 0=Low, 1=Medium, 2=High)
2257             0x0e51 => { Name => 'ResamplingKernelDenominators100', Writable => 'int16u', Count => 3 }, #4 (table of sharpening denoms; 0=Low, 1=Medium, 2=High)
2258             0x0e56 => 'LookMat0', #4 (rational64s[9])
2259             0x0e57 => 'LookMat1', #4 (rational64s[9])
2260             0x0e58 => 'LookMat2', #4 (rational64s[9])
2261             0x0e59 => 'LookMat3', #4 (rational64s[9])
2262             0x0e5a => 'LookMat4', #4 (rational64s[9])
2263             0x0e5b => 'LookMat5', #4 (rational64s[9])
2264             0x0e5c => 'LookMat6', #4 (rational64s[9])
2265             0x0e5d => 'LookMat7', #4 (rational64s[9])
2266             0x0e5e => 'LookMat8', #4 (rational64s[9])
2267             0x0e5f => 'LookMat9', #4 (rational64s[9])
2268             0x0e60 => { #4
2269             Name => 'CFAInterpolationAlgorithm',
2270             Writable => 'int16u',
2271             PrintConv => { 0 => 'AH2', 1 => 'Karnak' },
2272             },
2273             0x0e61 => { #4
2274             Name => 'CFAInterpolationMetric',
2275             Writable => 'int16u',
2276             PrintConv => { 0 => 'Linear12', 1 => 'KLUT12' },
2277             },
2278             0x0e62 => { Name => 'CFAZipperFixThreshold', Writable => 'int16u' }, #4
2279             0x0e63 => { Name => 'NoiseReductionParametersKhufuRGB', Writable => 'int16u', Count => 9 }, #4
2280             0x0e64 => { Name => 'NoiseReductionParametersKhufu6MP', Writable => 'int16u', Count => 9 }, #4
2281             0x0e65 => { Name => 'NoiseReductionParametersKhufu3MP', Writable => 'int16u', Count => 9 }, #4
2282             0x0e6a => { Name => 'ChromaNoiseHighFThresh', Writable => 'int32u', Count => 2 }, #4
2283             0x0e6b => { Name => 'ChromaNoiseLowFThresh', Writable => 'int32u', Count => 2 }, #4
2284             0x0e6c => { Name => 'ChromaNoiseEdgeMapThresh', Writable => 'int32u' }, #4
2285             0x0e6d => { Name => 'ChromaNoiseColorSpace', Writable => 'int32u' }, #4
2286             0x0e6e => { Name => 'EnableChromaNoiseReduction', Writable => 'int16u' }, #4
2287             # 9 values for noise reduction parameters:
2288             # 0 - NRLowType
2289             # 1 - NRLowRadius
2290             # 2 - NRLowStrength
2291             # 3 - NRMediumType
2292             # 4 - NRMediumRadius
2293             # 5 - NRMediumStrength
2294             # 6 - NRHighType
2295             # 7 - NRHighRadius
2296             # 8 - NRHighStrength
2297             # NRType values:
2298             # 0 = None
2299             # 1 = SigmaChroma
2300             # 2 = SigmaOnly
2301             # 3 = SigmaMoire
2302             # 4 = SigmaChromaWithRadius
2303             # 5 = SigmaMoireWithRadius
2304             # 6 = SigmaExpert (aka Khufu)
2305             # 7 = SigmaWithRadius
2306             0x0e6f => { Name => 'NoiseReductionParametersHostRGB', Writable => 'int16u', Count => 9 }, #4
2307             0x0e70 => { Name => 'NoiseReductionParametersHost6MP', Writable => 'int16u', Count => 9 }, #4
2308             0x0e71 => { Name => 'NoiseReductionParametersHost3MP', Writable => 'int16u', Count => 9 }, #4
2309             0x0e72 => { Name => 'NoiseReductionParametersCamera', Writable => 'int16u', Count => 6 }, #4
2310             0x0e73 => { #4
2311             Name => 'NoiseReductionParametersAtCapture',
2312             Writable => 'int16u',
2313             Count => 6,
2314             # 6 values:
2315             # 0 - Algorithm type
2316             # 1 - Radius
2317             # 2 - Strength
2318             # 3 - Khufu Luma
2319             # 4 - Reserved 1
2320             # 5 - Reserved 2
2321             },
2322             0x0e74 => { Name => 'LCDMatrix', Writable => 'rational64s', Count => 9 }, #4
2323             0x0e75 => { Name => 'LCDMatrixChickFix', Writable => 'rational64s', Count => 9 }, #4
2324             0x0e76 => { Name => 'LCDMatrixMarvin', Writable => 'rational64s', Count => 9 }, #4
2325             0x0e7c => { Name => 'LCDGammaTableChickFix',Binary => 1 }, #4 (int16u[4096])
2326             0x0e7d => { Name => 'LCDGammaTableMarvin', Binary => 1 }, #4 (int16u[4096])
2327             0x0e7e => { Name => 'LCDGammaTable', Binary => 1 }, #4 (int16u[4096])
2328             0x0e7f => 'LCDSharpeningF1', #4 (int16s[4])
2329             0x0e80 => 'LCDSharpeningF2', #4
2330             0x0e81 => 'LCDSharpeningF3', #4
2331             0x0e82 => 'LCDSharpeningF4', #4
2332             0x0e83 => 'LCDEdgeMapX1', #4
2333             0x0e84 => 'LCDEdgeMapX2', #4
2334             0x0e85 => 'LCDEdgeMapX3', #4
2335             0x0e86 => 'LCDEdgeMapX4', #4
2336             0x0e87 => 'LCDEdgeMapSlope', #4
2337             0x0e88 => 'YCrCbMatrix', #4
2338             0x0e89 => 'LCDEdgeSpline', #4 (rational64s[9])
2339             0x0e92 => { Name => 'Fac18Per', Writable => 'int16u' }, #4
2340             0x0e93 => { Name => 'Fac170Per', Writable => 'int16u' }, #4
2341             0x0e94 => { Name => 'Fac100Per', Writable => 'int16u' }, #4
2342             0x0e9b => 'ExtraTickLocations', #4 (int16u[7])
2343             0x0e9c => { Name => 'RGBtoeV0', Binary => 1 }, #4 (int16s[256])
2344             0x0e9d => { Name => 'RGBtoeV1', Binary => 1 }, #4 (int16s[256])
2345             0x0e9e => { Name => 'RGBtoeV2', Binary => 1 }, #4 (int16s[256])
2346             0x0e9f => { Name => 'RGBtoeV3', Binary => 1 }, #4 (int16s[256])
2347             0x0ea0 => { Name => 'RGBtoeV4', Binary => 1 }, #4 (int16s[256])
2348             0x0ea1 => { Name => 'RGBtoeV5', Binary => 1 }, #4 (int16s[256])
2349             0x0ea2 => { Name => 'RGBtoeV6', Binary => 1 }, #4 (int16s[256])
2350             0x0ea3 => { Name => 'RGBtoeV7', Binary => 1 }, #4 (int16s[256])
2351             0x0ea4 => { Name => 'RGBtoeV8', Binary => 1 }, #4 (int16s[256])
2352             0x0ea5 => { Name => 'RGBtoeV9', Binary => 1 }, #4 (int16s[256])
2353             0x0ea6 => { Name => 'LCDHistLUT0', Binary => 1 }, #4 (rational64s[48])
2354             0x0ea7 => { Name => 'LCDHistLUT1', Binary => 1 }, #4 (rational64s[57])
2355             0x0ea8 => { Name => 'LCDHistLUT2', Binary => 1 }, #4 (rational64s[48])
2356             0x0ea9 => { Name => 'LCDHistLUT3', Binary => 1 }, #4 (rational64s[57])
2357             0x0eaa => { Name => 'LCDHistLUT4', Binary => 1 }, #4 (rational64s[48])
2358             0x0eab => { Name => 'LCDHistLUT5', Binary => 1 }, #4 (rational64s[57])
2359             0x0eac => { Name => 'LCDHistLUT6', Binary => 1 }, #4 (rational64s[48])
2360             0x0ead => { Name => 'LCDHistLUT7', Binary => 1 }, #4 (rational64s[48])
2361             0x0eae => { Name => 'LCDHistLUT8', Binary => 1 }, #4
2362             0x0eaf => { Name => 'LCDHistLUT9', Binary => 1 }, #4
2363             0x0eb0 => 'LCDLinearClipValue', #4
2364             0x0ece => 'LCDStepYvalues', #4 (int8u[10])
2365             0x0ecf => 'LCDStepYvaluesChickFix', #4 (int8u[10])
2366             0x0ed0 => 'LCDStepYvaluesMarvin', #4 (int8u[10])
2367             0x0ed8 => { Name => 'InterpolationCoefficients', Binary => 1 }, #4 (int16s[69])
2368             0x0ed9 => 'InterpolationCoefficients6MP', #4
2369             0x0eda => 'InterpolationCoefficients3MP', #4
2370             0x0f00 => { Name => 'NoiseReductionParametersHostNormal', Binary => 1 }, #4 (int16u[140])
2371             0x0f01 => { Name => 'NoiseReductionParametersHostStrong', Binary => 1 }, #4 (int16u[140])
2372             0x0f02 => { Name => 'NoiseReductionParametersHostLow', Binary => 1 }, #4
2373             0x0f0a => { Name => 'MariahTextureThreshold', Writable => 'int16u' }, #4
2374             0x0f0b => { Name => 'MariahMapLoThreshold', Writable => 'int16u' }, #4
2375             0x0f0c => { Name => 'MariahMapHiThreshold', Writable => 'int16u' }, #4
2376             0x0f0d => { Name => 'MariahChromaBlurSize', Writable => 'int16u' }, #4
2377             0x0f0e => { Name => 'MariahSigmaThreshold', Writable => 'int16u' }, #4
2378             0x0f0f => { Name => 'MariahThresholds', Binary => 1 }, #4
2379             0x0f10 => { Name => 'MariahThresholdsNormal', Binary => 1 }, #4 (int16u[140])
2380             0x0f11 => { Name => 'MariahThresholdsStrong', Binary => 1 }, #4 (int16u[140])
2381             0x0f12 => { Name => 'MariahThresholdsLow', Binary => 1 }, #4
2382             0x0f14 => 'KhufuLinearRedMixingCoefficient', #4
2383             0x0f15 => 'KhufuLinearGreenMixingCoefficient', #4
2384             0x0f16 => 'KhufuLinearBlueMixingCoefficient', #4
2385             0x0f17 => 'KhufuUSpaceC2MixingCoefficient', #4
2386             0x0f18 => 'KhufuSigmaGaussianWeights', #4
2387             0x0f19 => 'KhufuSigmaScalingFactors6MP', #4 (rational64u[6])
2388             0x0f1a => 'KhufuSigmaScalingFactors3MP', #4 (rational64u[6])
2389             0x0f1b => 'KhufuSigmaScalingFactors14MP', #4
2390             # 0x0f1e-0x0f27 - KhufuLinearRGBtoLogRGB(n), (for Khufu) ref 4
2391             # 0x0f28-0x0f31 - KhufuLogRGBtoLinearRGB(n), (for Khufu) ref 4
2392             0x0f32 => { Name => 'KhufuI0Thresholds', Binary => 1 }, #4 (int32s[348])
2393             0x0f33 => { Name => 'KhufuI1Thresholds', Binary => 1 }, #4 (int32s[348])
2394             0x0f34 => { Name => 'KhufuI2Thresholds', Binary => 1 }, #4 (int32s[348])
2395             0x0f35 => { Name => 'KhufuI3Thresholds', Binary => 1 }, #4 (int32s[348])
2396             0x0f36 => { Name => 'KhufuI4Thresholds', Binary => 1 }, #4 (int32s[348])
2397             0x0f37 => { Name => 'KhufuI5Thresholds', Binary => 1 }, #4 (int32s[348])
2398             0x0f3c => { Name => 'CondadoDayBVThresh', Writable => 'int16u' }, #4
2399             0x0f3d => { Name => 'CondadoNeuRange', Writable => 'int16u' }, #4
2400             0x0f3e => { Name => 'CondadoBVFactor', Writable => 'int16s' }, #4
2401             0x0f3f => { Name => 'CondadoIllFactor', Writable => 'int16s' }, #4
2402             0x0f40 => { Name => 'CondadoTunThresh', Writable => 'int16s' }, #4
2403             0x0f41 => { Name => 'CondadoFluThresh', Writable => 'int16s' }, #4
2404             0x0f42 => { Name => 'CondadoDayOffsets', Writable => 'int16s', Count => 2 }, #4
2405             0x0f43 => { Name => 'CondadoTunOffsets', Writable => 'int16s', Count => 2 }, #4
2406             0x0f44 => { Name => 'CondadoFluOffsets', Writable => 'int16s', Count => 2 }, #4
2407             0x0f5a => 'ERIMMToCRGB0Spline', #4 (rational64s[33])
2408             0x0f5b => 'ERIMMToCRGB1Spline', #4 (rational64s[36])
2409             0x0f5c => 'ERIMMToCRGB2Spline', #4 (rational64s[33])
2410             0x0f5d => 'ERIMMToCRGB3Spline', #4 (rational64s[33])
2411             0x0f5e => 'ERIMMToCRGB4Spline', #4 (rational64s[33])
2412             0x0f5f => 'ERIMMToCRGB5Spline', #4 (rational64s[33])
2413             0x0f60 => 'ERIMMToCRGB6Spline', #4 (rational64s[33])
2414             0x0f61 => 'ERIMMToCRGB7Spline', #4 (rational64s[33])
2415             0x0f62 => 'ERIMMToCRGB8Spline', #4
2416             0x0f63 => 'ERIMMToCRGB9Spline', #4
2417             0x0f64 => 'CRGBToERIMM0Spline', #4 (rational64s[27])
2418             0x0f65 => 'CRGBToERIMM1Spline', #4 (rational64s[54])
2419             0x0f66 => 'CRGBToERIMM2Spline', #4 (rational64s[27])
2420             0x0f67 => 'CRGBToERIMM3Spline', #4 (rational64s[54])
2421             0x0f68 => 'CRGBToERIMM4Spline', #4 (rational64s[27])
2422             0x0f69 => 'CRGBToERIMM5Spline', #4 (rational64s[54])
2423             0x0f6a => 'CRGBToERIMM6Spline', #4 (rational64s[27])
2424             0x0f6b => 'CRGBToERIMM7Spline', #4 (rational64s[27])
2425             0x0f6c => 'CRGBToERIMM8Spline', #4
2426             0x0f6d => 'CRGBToERIMM9Spline', #4
2427             0x0f6e => 'ERIMMNonLinearitySpline', #4 (rational64s[42])
2428             0x0f6f => 'Delta12To8Spline', #4 (rational64s[12])
2429             0x0f70 => 'Delta8To12Spline', #4 (rational64s[12])
2430             0x0f71 => 'InverseMonitorMatrix', #4 (rational64s[9])
2431             0x0f72 => { Name => 'NifNonlinearityExt', Binary => 1 }, #4 (int16s[8000])
2432             0x0f73 => { Name => 'InvNifNonLinearity', Binary => 1 }, #4 (int16u[256])
2433             0x0f74 => 'RIMM13ToERIMM12Spline', #4 (rational64s[51])
2434             0x0f78 => 'ToneScale0Spline', #4 (rational64s[57])
2435             0x0f79 => 'ToneScale1Spline', #4 (rational64s[51])
2436             0x0f7a => 'ToneScale2Spline', #4 (rational64s[57])
2437             0x0f7b => 'ToneScale3Spline', #4 (rational64s[51])
2438             0x0f7c => 'ToneScale4Spline', #4 (rational64s[57])
2439             0x0f7d => 'ToneScale5Spline', #4 (rational64s[51])
2440             0x0f7e => 'ToneScale6Spline', #4 (rational64s[57])
2441             0x0f7f => 'ToneScale7Spline', #4 (rational64s[57])
2442             0x0f80 => 'ToneScale8Spline', #4
2443             0x0f81 => 'ToneScale9Spline', #4
2444             0x0f82 => 'ERIMMToneScale0Spline', #4 (rational64s[60])
2445             0x0f83 => 'ERIMMToneScale1Spline', #4 (rational64s[54])
2446             0x0f84 => 'ERIMMToneScale2Spline', #4 (rational64s[60])
2447             0x0f85 => 'ERIMMToneScale3Spline', #4 (rational64s[54])
2448             0x0f86 => 'ERIMMToneScale4Spline', #4 (rational64s[60])
2449             0x0f87 => 'ERIMMToneScale5Spline', #4 (rational64s[54])
2450             0x0f88 => 'ERIMMToneScale6Spline', #4 (rational64s[60])
2451             0x0f89 => 'ERIMMToneScale7Spline', #4 (rational64s[60])
2452             0x0f8a => 'ERIMMToneScale8Spline', #4
2453             0x0f8b => 'ERIMMToneScale9Spline', #4
2454             0x0f8c => 'RIMMToCRGB0Spline', #4 (rational64s[66])
2455             0x0f8d => 'RIMMToCRGB1Spline', #4 (rational64s[84])
2456             0x0f8e => 'RIMMToCRGB2Spline', #4 (rational64s[66])
2457             0x0f8f => 'RIMMToCRGB3Spline', #4 (rational64s[84])
2458             0x0f90 => 'RIMMToCRGB4Spline', #4 (rational64s[66])
2459             0x0f91 => 'RIMMToCRGB5Spline', #4 (rational64s[84])
2460             0x0f92 => 'RIMMToCRGB6Spline', #4 (rational64s[66])
2461             0x0f93 => 'RIMMToCRGB7Spline', #4 (rational64s[66])
2462             0x0f94 => 'RIMMToCRGB8Spline', #4
2463             0x0f95 => 'RIMMToCRGB9Spline', #4
2464             0x0fa0 => 'QTableLarge25Pct', #4
2465             0x0fa1 => 'QTableMedium25Pct', #4
2466             0x0fa2 => 'QTableSmall25Pct', #4
2467             0x1130 => 'NoiseReductionKernel', #4 (Noise filter kernel. No longer needed)
2468             0x1388 => 'UserMetaData', #4 (undef[0])
2469             0x1389 => { Name => 'InputProfile', Writable => 'undef', Binary => 1 }, #IB ("SourceProfile", ref 4)
2470             0x138a => { Name => 'KodakLookProfile', Writable => 'undef', Binary => 1 }, #IB ("LookProfile", ref 4)
2471             0x138b => { Name => 'OutputProfile', Writable => 'undef', Binary => 1 }, #IB ("DestinationProfile", ref 4)
2472             0x1390 => { Name => 'SourceProfilePrefix', Writable => 'string' }, #4 (eg. 'DCSProSLRn')
2473             0x1391 => { Name => 'ToneCurveProfileName', Writable => 'string' }, #4
2474             0x1392 => { Name => 'InputProfile', SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' } }, #4
2475             0x1393 => { Name => 'ProcessParametersV2', Binary => 1 }, #4 (Used by the SDK, Firmware should not use!)
2476             0x1394 => 'ReservedBlob2', #4
2477             0x1395 => 'ReservedBlob3', #4
2478             0x1396 => 'ReservedBlob4', #4
2479             0x1397 => 'ReservedBlob5', #4
2480             0x1398 => 'ReservedBlob6', #4
2481             0x1399 => 'ReservedBlob7', #4
2482             0x139a => 'ReservedBlob8', #4
2483             0x139b => 'ReservedBlob9', #4
2484             0x1770 => { Name => 'ScriptVersion', Writable => 'int32u' }, #4
2485             0x177a => 'ImagerTimingData', #4
2486             0x1784 => { Name => 'ISO', Writable => 'int32u' }, #3 ("NsecPerIcCode", ref 4)
2487             0x17a2 => 'Scav11Cols', #4
2488             0x17a3 => 'Scav12Cols', #4
2489             0x17a4 => 'Scav21Cols', #4
2490             0x17a5 => 'Scav22Cols', #4
2491             0x17a6 => 'ActiveCTEMonitor1Cols', #4
2492             0x17a7 => 'ActiveCTEMonitor2Cols', #4
2493             0x17a8 => 'ActiveCTEMonitorRows', #4
2494             0x17a9 => 'ActiveBuf1Cols', #4
2495             0x17aa => 'ActiveBuf2Cols', #4
2496             0x17ab => 'ActiveBuf1Rows', #4
2497             0x17ac => 'ActiveBuf2Rows', #4
2498             0x17c0 => 'HRNoiseLines', #4
2499             0x17c1 => 'RNoiseLines', #4
2500             0x17c2 => 'ANoiseLines', #4
2501             0x17d4 => { Name => 'ImagerCols', Writable => 'int16u' }, #4
2502             0x17de => { Name => 'ImagerRows', Writable => 'int16u' }, #4
2503             0x17e8 => { Name => 'PartialActiveCols1', Writable => 'int32u' }, #4
2504             0x17f2 => { Name => 'PartialActiveCols2', Writable => 'int32u' }, #4
2505             0x17fc => { Name => 'PartialActiveRows1', Writable => 'int32u' }, #4
2506             0x1806 => { Name => 'PartialActiveRows2', Writable => 'int32u' }, #4
2507             0x1810 => { Name => 'ElectricalBlackColumns',Writable=> 'int32u' }, #4
2508             0x181a => { Name => 'ResetBlackSegRows', Writable => 'int32u' }, #4
2509             0x1838 => { Name => 'CaptureWidthNormal', Writable => 'int32u' }, #4
2510             0x1839 => { Name => 'CaptureHeightNormal', Writable => 'int32u' }, #4
2511             0x183a => 'CaptureWidthResetBlackSegNormal', #4
2512             0x183b => 'CaptureHeightResetBlackSegNormal', #4
2513             0x183c => 'DarkRefOffsetNormal', #4
2514             0x1842 => { Name => 'CaptureWidthTest', Writable => 'int32u' }, #4
2515             0x1843 => 'CaptureHeightTest', #4
2516             0x1844 => 'CaptureWidthResetBlackSegTest', #4
2517             0x1845 => 'CaptureHeightResetBlackSegTest', #4
2518             0x1846 => 'DarkRefOffsetTest', #4
2519             0x184c => { Name => 'ImageSegmentStartLine',Writable => 'int32u' }, #4
2520             0x184d => { Name => 'ImageSegmentLines', Writable => 'int32u' }, #4
2521             0x184e => { Name => 'SkipLineTime', Writable => 'int32u' }, #4
2522             0x1860 => { Name => 'FastResetLineTime', Writable => 'int32u' }, #4
2523             0x186a => { Name => 'NormalLineTime', Writable => 'int32u' }, #4
2524             0x1874 => { Name => 'MinIntegrationRows', Writable => 'int32u' }, #4
2525             0x187e => { Name => 'PreReadFastResetCount',Writable => 'int32u' }, #4
2526             0x1888 => { Name => 'TransferTimeNormal', Writable => 'int32u' }, #4
2527             0x1889 => { Name => 'TransferTimeTest', Writable => 'int32u' }, #4
2528             0x188a => { Name => 'QuietTime', Writable => 'int32u' }, #4
2529             0x189c => { Name => 'OverClockCols', Writable => 'int16u' }, #4
2530             0x18a6 => { Name => 'H2ResetBlackPixels', Writable => 'int32u' }, #4
2531             0x18b0 => { Name => 'H3ResetBlackPixels', Writable => 'int32u' }, #4
2532             0x18ba => { Name => 'BlackAcquireRows', Writable => 'int32u' }, #4
2533             0x18c4 => { Name => 'OverClockRows', Writable => 'int16u' }, #4
2534             0x18ce => { Name => 'H3ResetBlackColumns', Writable => 'int32u' }, #4
2535             0x18d8 => { Name => 'DarkBlackSegRows', Writable => 'int32u' }, #4
2536             0x1900 => 'CrossbarEnable', #4
2537             0x1901 => { Name => 'FifoenOnePixelDelay', Writable => 'int32u' }, #4
2538             0x1902 => { Name => 'ReadoutTypeRequested', Writable => 'int32u' }, #4
2539             0x1903 => { Name => 'ReadoutTypeActual', Writable => 'int32u' }, #4
2540             0x190a => { Name => 'OffsetDacValue', Writable => 'int32u' }, #4
2541             0x1914 => { Name => 'TempAmpGainX100', Writable => 'int32u' }, #4
2542             0x191e => { Name => 'VarrayDacNominalValues',Writable=> 'int32u', Count => 3 }, #4
2543             0x1928 => 'VddimDacNominalValues', #4
2544             0x1964 => { Name => 'C14Configuration', Writable => 'int32u' }, #4
2545             0x196e => { Name => 'TDA1Offset', Writable => 'int32u', Count => 3 }, #4
2546             0x196f => { Name => 'TDA1Bandwidth', Writable => 'int32u' }, #4
2547             0x1970 => { Name => 'TDA1Gain', Writable => 'int32u', Count => 3 }, #4
2548             0x1971 => { Name => 'TDA1EdgePolarity', Writable => 'int32u' }, #4
2549             0x1978 => { Name => 'TDA2Offset', Writable => 'int32u', Count => 3 }, #4
2550             0x1979 => { Name => 'TDA2Bandwidth', Writable => 'int32u' }, #4
2551             0x197a => { Name => 'TDA2Gain', Writable => 'int32u', Count => 3 }, #4
2552             0x197b => { Name => 'TDA2EdgePolarity', Writable => 'int32u' }, #4
2553             0x1982 => { Name => 'TDA3Offset', Writable => 'int32u', Count => 3 }, #4
2554             0x1983 => { Name => 'TDA3Bandwidth', Writable => 'int32u' }, #4
2555             0x1984 => { Name => 'TDA3Gain', Writable => 'int32u', Count => 3 }, #4
2556             0x1985 => { Name => 'TDA3EdgePolarity', Writable => 'int32u' }, #4
2557             0x198c => { Name => 'TDA4Offset', Writable => 'int32u', Count => 3 }, #4
2558             0x198d => { Name => 'TDA4Bandwidth', Writable => 'int32u' }, #4
2559             0x198e => { Name => 'TDA4Gain', Writable => 'int32u', Count => 3 }, #4
2560             0x198f => { Name => 'TDA4EdgePolarity', Writable => 'int32u' }, #4
2561             0xfde8 => { Name => 'ComLenBlkSize', Writable => 'int16u' }, #4
2562             );
2563              
2564             # contains WB adjust set in software (ref 3)
2565             %Image::ExifTool::Kodak::Processing = (
2566             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2567             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2568             WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
2569             CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
2570             FORMAT => 'int16u',
2571             FIRST_ENTRY => 0,
2572             20 => {
2573             Name => 'WB_RGBLevels',
2574             Format => 'int16u[3]',
2575             ValueConv => q{
2576             my @a = split ' ',$val;
2577             foreach (@a) {
2578             $_ = 2048 / $_ if $_;
2579             }
2580             return join ' ', @a;
2581             }
2582             },
2583             );
2584              
2585             # tags found in the Kodak KDC_IFD (in IFD0 of KDC images) (ref 3)
2586             %Image::ExifTool::Kodak::KDC_IFD = (
2587             GROUPS => { 0 => 'MakerNotes', 1 => 'KDC_IFD', 2 => 'Image'},
2588             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2589             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2590             WRITE_GROUP => 'KDC_IFD',
2591             SET_GROUP1 => 1,
2592             NOTES => q{
2593             These tags are found in a separate IFD of KDC images from some newer Kodak
2594             models such as the P880 and Z1015IS.
2595             },
2596             0xfa00 => {
2597             Name => 'SerialNumber', #PH (unverified)
2598             Writable => 'string',
2599             },
2600             0xfa0d => {
2601             Name => 'WhiteBalance',
2602             Writable => 'int8u',
2603             PrintConv => { #PH
2604             0 => 'Auto',
2605             1 => 'Fluorescent', # (NC)
2606             2 => 'Tungsten', # (NC)
2607             3 => 'Daylight', # (NC)
2608             6 => 'Shade', # (NC, called "Open Shade" by Kodak)
2609             },
2610             },
2611             # the following tags are numbered for use in the Composite tag lookup
2612             0xfa25 => 'WB_RGBLevelsAuto',
2613             0xfa27 => 'WB_RGBLevelsTungsten', # (NC)
2614             0xfa28 => 'WB_RGBLevelsFluorescent', # (NC)
2615             0xfa29 => 'WB_RGBLevelsDaylight', # (NC)
2616             0xfa2a => 'WB_RGBLevelsShade', # (NC)
2617             );
2618              
2619             # textual-based Kodak TextualInfo tags (not found in KDC images) (ref PH)
2620             %Image::ExifTool::Kodak::TextualInfo = (
2621             GROUPS => { 0 => 'MakerNotes', 1 => 'Kodak', 2 => 'Image'},
2622             PROCESS_PROC => \&ProcessKodakText,
2623             NOTES => q{
2624             Below is a list of tags which have been observed in the Kodak TextualInfo
2625             data, however ExifTool will extract information from any tags found here.
2626             },
2627             'Actual Compensation' => 'ActualCompensation',
2628             'AF Function' => 'AFMode', # values: "S" (=Single?, then maybe C for Continuous, M for Manual?) - PH
2629             'Aperture' => {
2630             Name => 'Aperture',
2631             ValueConv => '$val=~s/^f//i; $val',
2632             },
2633             'Auto Bracket' => 'AutoBracket',
2634             'Brightness Value' => 'BrightnessValue',
2635             'Camera' => 'CameraModel',
2636             'Camera body' => 'CameraBody',
2637             'Compensation' => 'ExposureCompensation',
2638             'Date' => {
2639             Name => 'Date',
2640             Groups => { 2 => 'Time' },
2641             },
2642             'Exposure Bias' => 'ExposureBias',
2643             'Exposure Mode' => {
2644             Name => 'ExposureMode',
2645             PrintConv => {
2646             OTHER => sub { shift }, # pass other values straight through
2647             'M' => 'Manual',
2648             'A' => 'Aperture Priority', #(NC -- I suppose this could be "Auto" too)
2649             'S' => 'Shutter Priority', #(NC)
2650             'P' => 'Program', #(NC)
2651             'B' => 'Bulb', #(NC)
2652             # have seen "Manual (M)" written by DCS760C - PH
2653             # and "Aperture priority AE (Av)" written by a ProBack 645M
2654             },
2655             },
2656             'Firmware Version' => 'FirmwareVersion',
2657             'Flash Compensation' => 'FlashExposureComp',
2658             'Flash Fired' => 'FlashFired',
2659             'Flash Sync Mode' => 'FlashSyncMode',
2660             'Focal Length' => {
2661             Name => 'FocalLength',
2662             PrintConv => '"$val mm"',
2663             },
2664             'Height' => 'KodakImageHeight',
2665             'Image Number' => 'ImageNumber',
2666             'ISO' => 'ISO',
2667             'ISO Speed' => 'ISO',
2668             'Lens' => { Name => 'Lens', Priority => 0 },
2669             'Max Aperture' => {
2670             Name => 'MaxAperture',
2671             ValueConv => '$val=~s/^f//i; $val',
2672             },
2673             'Meter Mode' => 'MeterMode',
2674             'Min Aperture' => {
2675             Name => 'MinAperture',
2676             ValueConv => '$val=~s/^f//i; $val',
2677             },
2678             'Popup Flash' => 'PopupFlash',
2679             'Serial Number' => 'SerialNumber',
2680             'Shooting Mode' => 'ShootingMode',
2681             'Shutter' => 'ShutterSpeed',
2682             'Temperature' => 'Temperature', # with a value of 15653, what could this be? - PH
2683             'Time' => {
2684             Name => 'Time',
2685             Groups => { 2 => 'Time' },
2686             },
2687             'White balance' => 'WhiteBalance',
2688             'Width' => 'KodakImageWidth',
2689             '_other_info' => {
2690             Name => 'OtherInfo',
2691             Notes => 'any other information without a tag name',
2692             },
2693             );
2694              
2695             # Kodak APP3 "Meta" tags (ref 2)
2696             %Image::ExifTool::Kodak::Meta = (
2697             GROUPS => { 0 => 'Meta', 1 => 'MetaIFD', 2 => 'Image'},
2698             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2699             CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
2700             WRITE_GROUP => 'MetaIFD', # default write group
2701             NOTES => q{
2702             These tags are found in the APP3 "Meta" segment of JPEG images from Kodak
2703             cameras such as the DC280, DC3400, DC5000, MC3, M580, Z950 and Z981. The
2704             structure of this segment is similar to the APP1 "Exif" segment, but a
2705             different set of tags is used.
2706             },
2707             0xc350 => 'FilmProductCode',
2708             0xc351 => 'ImageSourceEK',
2709             0xc352 => 'CaptureConditionsPAR',
2710             0xc353 => {
2711             Name => 'CameraOwner',
2712             Writable => 'undef',
2713             RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)',
2714             RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
2715             },
2716             0xc354 => {
2717             Name => 'SerialNumber',
2718             Writable => 'undef',
2719             Groups => { 2 => 'Camera' },
2720             RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)', #PH
2721             RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
2722             },
2723             0xc355 => 'UserSelectGroupTitle',
2724             0xc356 => 'DealerIDNumber',
2725             0xc357 => 'CaptureDeviceFID',
2726             0xc358 => 'EnvelopeNumber',
2727             0xc359 => 'FrameNumber',
2728             0xc35a => 'FilmCategory',
2729             0xc35b => 'FilmGencode',
2730             0xc35c => 'ModelAndVersion',
2731             0xc35d => 'FilmSize',
2732             0xc35e => 'SBA_RGBShifts',
2733             0xc35f => 'SBAInputImageColorspace',
2734             0xc360 => 'SBAInputImageBitDepth',
2735             0xc361 => {
2736             Name => 'SBAExposureRecord',
2737             Binary => 1,
2738             },
2739             0xc362 => {
2740             Name => 'UserAdjSBA_RGBShifts',
2741             Binary => 1,
2742             },
2743             0xc363 => 'ImageRotationStatus',
2744             0xc364 => 'RollGuidElements',
2745             0xc365 => 'MetadataNumber',
2746             0xc366 => 'EditTagArray',
2747             0xc367 => 'Magnification',
2748             # 0xc36b - string[8]: "1.0"
2749             0xc36c => 'NativeXResolution',
2750             0xc36d => 'NativeYResolution',
2751             0xc36e => {
2752             Name => 'KodakEffectsIFD',
2753             Flags => 'SubIFD',
2754             Groups => { 1 => 'KodakEffectsIFD' },
2755             SubDirectory => {
2756             TagTable => 'Image::ExifTool::Kodak::SpecialEffects',
2757             Start => '$val',
2758             },
2759             },
2760             0xc36f => {
2761             Name => 'KodakBordersIFD',
2762             Flags => 'SubIFD',
2763             Groups => { 1 => 'KodakBordersIFD' },
2764             SubDirectory => {
2765             TagTable => 'Image::ExifTool::Kodak::Borders',
2766             Start => '$val',
2767             },
2768             },
2769             0xc37a => 'NativeResolutionUnit',
2770             0xc418 => 'SourceImageDirectory',
2771             0xc419 => 'SourceImageFileName',
2772             0xc41a => 'SourceImageVolumeName',
2773             0xc46c => 'PrintQuality',
2774             0xc46e => 'ImagePrintStatus',
2775             # 0cx46f - int16u: 1
2776             );
2777              
2778             # Kodak APP3 "Meta" Special Effects sub-IFD (ref 2)
2779             %Image::ExifTool::Kodak::SpecialEffects = (
2780             GROUPS => { 0 => 'Meta', 1 => 'KodakEffectsIFD', 2 => 'Image'},
2781             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2782             0 => 'DigitalEffectsVersion',
2783             1 => {
2784             Name => 'DigitalEffectsName',
2785             PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"DigitalEffectsName")',
2786             },
2787             2 => 'DigitalEffectsType',
2788             );
2789              
2790             # Kodak APP3 "Meta" Borders sub-IFD (ref 2)
2791             %Image::ExifTool::Kodak::Borders = (
2792             GROUPS => { 0 => 'Meta', 1 => 'KodakBordersIFD', 2 => 'Image'},
2793             WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
2794             0 => 'BordersVersion',
2795             1 => {
2796             Name => 'BorderName',
2797             PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"BorderName")',
2798             },
2799             2 => 'BorderID',
2800             3 => 'BorderLocation',
2801             4 => 'BorderType',
2802             8 => 'WatermarkType',
2803             );
2804              
2805             # tags in Kodak MOV videos (ref PH)
2806             # (similar information in Kodak,Minolta,Nikon,Olympus,Pentax and Sanyo videos)
2807             %Image::ExifTool::Kodak::MOV = (
2808             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2809             GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
2810             FIRST_ENTRY => 0,
2811             NOTES => q{
2812             This information is found in the TAGS atom of MOV videos from Kodak models
2813             such as the P880.
2814             },
2815             0 => {
2816             Name => 'Make',
2817             Format => 'string[21]',
2818             },
2819             0x16 => {
2820             Name => 'Model',
2821             Format => 'string[42]',
2822             },
2823             0x40 => {
2824             Name => 'ModelType',
2825             Format => 'string[8]',
2826             },
2827             # (01 00 at offset 0x48)
2828             0x4e => {
2829             Name => 'ExposureTime',
2830             Format => 'int32u',
2831             ValueConv => '$val ? 10 / $val : 0',
2832             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
2833             },
2834             0x52 => {
2835             Name => 'FNumber',
2836             Format => 'rational64u',
2837             PrintConv => 'sprintf("%.1f",$val)',
2838             },
2839             0x5a => {
2840             Name => 'ExposureCompensation',
2841             Format => 'rational64s',
2842             PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
2843             },
2844             # 0x6c => 'WhiteBalance', ?
2845             0x70 => {
2846             Name => 'FocalLength',
2847             Format => 'rational64u',
2848             PrintConv => 'sprintf("%.1f mm",$val)',
2849             },
2850             );
2851              
2852             # Kodak DcMD atoms (ref PH)
2853             %Image::ExifTool::Kodak::DcMD = (
2854             GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
2855             NOTES => 'Metadata directory found in MOV and MP4 videos from some Kodak cameras.',
2856             Cmbo => {
2857             Name => 'CameraByteOrder',
2858             PrintConv => {
2859             II => 'Little-endian (Intel, II)',
2860             MM => 'Big-endian (Motorola, MM)',
2861             },
2862             },
2863             CMbo => { # (as written by Kodak Playsport video camera)
2864             Name => 'CameraByteOrder',
2865             PrintConv => {
2866             II => 'Little-endian (Intel, II)',
2867             MM => 'Big-endian (Motorola, MM)',
2868             },
2869             },
2870             DcME => {
2871             Name => 'DcME',
2872             SubDirectory => {
2873             TagTable => 'Image::ExifTool::Kodak::DcME',
2874             },
2875             },
2876             DcEM => {
2877             Name => 'DcEM',
2878             SubDirectory => {
2879             TagTable => 'Image::ExifTool::Kodak::DcEM',
2880             },
2881             },
2882             );
2883              
2884             # Kodak DcME atoms (ref PH)
2885             %Image::ExifTool::Kodak::DcME = (
2886             GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
2887             # Mtmd - 24 bytes: ("00 00 00 00 00 00 00 01" x 3)
2888             # Keyw - keywords? (six bytes all zero)
2889             # Rate - 2 bytes: 00 00
2890             );
2891              
2892             # Kodak DcEM atoms (ref PH)
2893             %Image::ExifTool::Kodak::DcEM = (
2894             GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
2895             # Mtmd - 24 bytes: ("00 00 00 00 00 00 00 01" x 3)
2896             # Csat - 16 bytes: 00 06 00 00 62 00 61 00 73 00 69 00 63 00 00 00 [....b.a.s.i.c...]
2897             # Ksre - 8 bytes: 00 01 00 00 00 00
2898             );
2899              
2900             # tags in "free" atom of Kodak M5370 MP4 videos (ref PH)
2901             %Image::ExifTool::Kodak::Free = (
2902             GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
2903             NOTES => q{
2904             Information stored in the "free" atom of Kodak MP4 videos. (VERY bad form
2905             for Kodak to store useful information in an atom intended for unused space!)
2906             },
2907             # (2012/01/19: Kodak files for bankruptcy -- this is poetic metadata justice)
2908             Seri => {
2909             Name => 'SerialNumber',
2910             # byte 0 is string length; byte 1 is zero; string starts at byte 2
2911             ValueConv => 'substr($val, 2, unpack("C",$val))',
2912             },
2913             SVer => {
2914             Name => 'FirmwareVersion',
2915             ValueConv => 'substr($val, 2, unpack("C",$val))',
2916             },
2917             # Clor - 2 bytes: 0 1 (?)
2918             # CapM - 2 bytes: 0 1 (capture mode? = exposure mode?)
2919             # WBMD - 2 bytes: 0 0 (white balance?)
2920             Expc => { # (NC)
2921             Name => 'ExposureCompensation',
2922             Format => 'int16s',
2923             ValueConv => '$val / 3', # (guess)
2924             PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)',
2925             },
2926             # Zone - 2 bytes: 0 2 (time zone? focus zone?)
2927             # FoMD - 2 bytes: 0 0 (focus mode?)
2928             # Shap - 2 bytes: 0 2 (sharpness?)
2929             Expo => {
2930             Name => 'ExposureTime',
2931             Format => 'rational32u',
2932             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
2933             },
2934             FNum => {
2935             Name => 'FNumber',
2936             Format => 'int16u',
2937             ValueConv => '$val / 100',
2938             PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
2939             },
2940             ISOS => { Name => 'ISO', Format => 'int16u' },
2941             StSV => {
2942             Name => 'ShutterSpeedValue',
2943             Format => 'int16s',
2944             ValueConv => 'abs($val)<100 ? 2**(-$val/3) : 0',
2945             PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
2946             },
2947             AprV => {
2948             Name => 'ApertureValue',
2949             Format => 'int16s',
2950             ValueConv => '2 ** ($val / 2000)',
2951             PrintConv => 'sprintf("%.1f",$val)',
2952             },
2953             BrtV => { # (NC)
2954             Name => 'BrightnessValue',
2955             Format => 'int32s',
2956             ValueConv => '$val / 1000', # (guess)
2957             },
2958             FoLn => {
2959             Name => 'FocalLength',
2960             Groups => { 2 => 'Camera' },
2961             Format => 'int16u',
2962             PrintConv => 'sprintf("%.1f mm",$val)',
2963             },
2964             FL35 => {
2965             Name => 'FocalLengthIn35mmFormat',
2966             Groups => { 2 => 'Camera' },
2967             Format => 'int16u',
2968             PrintConv => '"$val mm"',
2969             },
2970             Scrn => {
2971             Name => 'PreviewInfo',
2972             SubDirectory => { TagTable => 'Image::ExifTool::Kodak::Scrn' },
2973             },
2974             );
2975              
2976             # tags in "frea" atom of Kodak PixPro SP360 MP4 videos (ref PH)
2977             %Image::ExifTool::Kodak::frea = (
2978             GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
2979             NOTES => 'Information stored in the "frea" atom of Kodak PixPro SP360 MP4 videos.',
2980             tima => {
2981             Name => 'Duration',
2982             Format => 'int32u',
2983             Priority => 0, # (only integer seconds)
2984             PrintConv => 'ConvertDuration($val)',
2985             },
2986             'ver '=> { Name => 'KodakVersion' },
2987             thma => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' }, Binary => 1 },
2988             scra => { Name => 'PreviewImage', Groups => { 2 => 'Preview' }, Binary => 1 },
2989             );
2990              
2991             # preview information in free/Scrn atom of MP4 videos (ref PH)
2992             %Image::ExifTool::Kodak::Scrn = (
2993             GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
2994             PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2995             FORMAT => 'int16u',
2996             0 => 'PreviewImageWidth',
2997             1 => 'PreviewImageHeight',
2998             2 => { Name => 'PreviewImageLength', Format => 'int32u' },
2999             4 => {
3000             Name => 'PreviewImage',
3001             Groups => { 2 => 'Preview' },
3002             Format => 'undef[$val{2}]',
3003             RawConv => '$self->ValidateImage(\$val, $tag)',
3004             },
3005             );
3006              
3007             # acceleration information extracted from 'pose' atom of MP4 videos (ref PH, PixPro 4KVR360)
3008             %Image::ExifTool::Kodak::pose = (
3009             GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
3010             PROCESS_PROC => \&ProcessPose,
3011             NOTES => q{
3012             Streamed orientation information from the PixPro 4KVR360, extracted as
3013             sub-documents when the L option is used.
3014             },
3015             Accelerometer => { }, # up, back, left? units of g
3016             AngularVelocity => { } # left, up, ccw? units?
3017             );
3018              
3019             # Kodak composite tags
3020             %Image::ExifTool::Kodak::Composite = (
3021             GROUPS => { 2 => 'Camera' },
3022             DateCreated => {
3023             Groups => { 2 => 'Time' },
3024             Require => {
3025             0 => 'Kodak:YearCreated',
3026             1 => 'Kodak:MonthDayCreated',
3027             },
3028             ValueConv => '"$val[0]:$val[1]"',
3029             },
3030             WB_RGBLevels => {
3031             Require => {
3032             0 => 'KDC_IFD:WhiteBalance',
3033             },
3034             # indices of the following entries are KDC_IFD:WhiteBalance + 1
3035             Desire => {
3036             1 => 'WB_RGBLevelsAuto',
3037             2 => 'WB_RGBLevelsFluorescent',
3038             3 => 'WB_RGBLevelsTungsten',
3039             4 => 'WB_RGBLevelsDaylight',
3040             5 => 'WB_RGBLevels4',
3041             6 => 'WB_RGBLevels5',
3042             7 => 'WB_RGBLevelsShade',
3043             },
3044             ValueConv => '$val[$val[0] + 1]',
3045             },
3046             WB_RGBLevels2 => {
3047             Name => 'WB_RGBLevels',
3048             Require => {
3049             0 => 'KodakIFD:WhiteBalance',
3050             1 => 'WB_RGBMul0',
3051             2 => 'WB_RGBMul1',
3052             3 => 'WB_RGBMul2',
3053             4 => 'WB_RGBMul3',
3054             5 => 'WB_RGBCoeffs0',
3055             6 => 'WB_RGBCoeffs1',
3056             7 => 'WB_RGBCoeffs2',
3057             8 => 'WB_RGBCoeffs3',
3058             },
3059             # indices of the following entries are KDC_IFD:WhiteBalance + 1
3060             Desire => {
3061             9 => 'KodakIFD:ColorTemperature',
3062             10 => 'Kodak:WB_RGBLevels',
3063             },
3064             ValueConv => 'Image::ExifTool::Kodak::CalculateRGBLevels(@val)',
3065             },
3066             );
3067              
3068             # add our composite tags
3069             Image::ExifTool::AddCompositeTags('Image::ExifTool::Kodak');
3070              
3071             #------------------------------------------------------------------------------
3072             # Process Kodak accelerometer data (ref PH)
3073             # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
3074             # Returns: 1 on success
3075             sub ProcessPose($$$)
3076             {
3077 0     0 0 0 my ($et, $dirInfo, $tagTablePtr) = @_;
3078 0         0 my $dataPt = $$dirInfo{DataPt};
3079 0         0 my $dirLen = length $$dataPt;
3080 0         0 my $ee = $et->Options('ExtractEmbedded');
3081 0         0 my ($i, $pos);
3082              
3083 0 0       0 return 0 if $dirLen < 0x14;
3084 0         0 my $num = Get32u($dataPt, 0x10);
3085 0 0       0 return 0 if $dirLen < 0x14 + $num * 24;
3086              
3087 0         0 $et->VerboseDir('Kodak pose', undef, $dirLen);
3088              
3089 0         0 $$et{DOC_NUM} = 0;
3090 0         0 for ($i=0, $pos=0x14; $i<$num; ++$i, $pos+=24) {
3091 0         0 $et->HandleTag($tagTablePtr, AngularVelocity =>
3092             Image::ExifTool::GetRational64s($dataPt, $pos) . ' ' .
3093             Image::ExifTool::GetRational64s($dataPt, $pos + 8) . ' ' .
3094             Image::ExifTool::GetRational64s($dataPt, $pos + 16));
3095 0 0       0 $ee or $pos += $num * 24, last;
3096 0         0 ++$$et{DOC_NUM};
3097             }
3098 0         0 $$et{DOC_NUM} = 0;
3099              
3100 0 0       0 return 1 if $dirLen < $pos + 0x10;
3101 0         0 $num = Get32u($dataPt, $pos + 0x0c);
3102 0 0       0 return 1 if $dirLen < $pos + 0x10 + $num * 24;
3103              
3104 0         0 for ($i=0, $pos+=0x10; $i<$num; ++$i, $pos+=24) {
3105 0         0 $et->HandleTag($tagTablePtr, Accelerometer =>
3106             Image::ExifTool::GetRational64s($dataPt, $pos) . ' ' .
3107             Image::ExifTool::GetRational64s($dataPt, $pos + 8) . ' ' .
3108             Image::ExifTool::GetRational64s($dataPt, $pos + 16));
3109 0 0       0 $ee or $pos += $num * 24, last;
3110 0         0 ++$$et{DOC_NUM};
3111             }
3112 0         0 $$et{DOC_NUM} = 0;
3113 0 0       0 $ee or $et->Warn('Use the ExtractEmbedded option to extract all accelerometer data',3);
3114 0         0 return 1;
3115             }
3116              
3117             #------------------------------------------------------------------------------
3118             # Calculate RGB levels from associated tags (ref 3)
3119             # Inputs: 0) KodakIFD:WhiteBalance, 1-4) WB_RGBMul0-3, 5-8) WB_RGBCoeffs0-3
3120             # 9) (optional) KodakIFD:ColorTemperature, 10) (optional) Kodak:WB_RGBLevels
3121             # Returns: WB_RGBLevels or undef
3122             sub CalculateRGBLevels(@)
3123             {
3124 0 0   0 0 0 return undef if $_[10]; # use existing software levels if they exist
3125 0         0 my $wbi = $_[0];
3126 0 0 0     0 return undef if $wbi < 0 or $wbi > 3;
3127 0         0 my @mul = split ' ', $_[$wbi + 1], 13; # (only use the first 12 coeffs)
3128 0         0 my @coefs = split ' ', ${$_[$wbi + 5]}; # (extra de-reference for Binary data)
  0         0  
3129 0   0     0 my $wbtemp100 = ($_[9] || 6500) / 100;
3130 0 0 0     0 return undef unless @mul >= 3 and @coefs >= 12;
3131 0         0 my ($i, $c, $n, $num, @cam_mul);
3132 0         0 for ($c=$n=0; $c<3; ++$c) {
3133 0         0 for ($num=$i=0; $i<4; ++$i) {
3134 0         0 $num += $coefs[$n++] * ($wbtemp100 ** $i);
3135             }
3136 0         0 $cam_mul[$c] = 2048 / ($num * $mul[$c]);
3137             }
3138 0         0 return join(' ', @cam_mul);
3139             }
3140              
3141             #------------------------------------------------------------------------------
3142             # Process Kodak textual TextualInfo
3143             # Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref
3144             # Returns: 1 on success
3145             sub ProcessKodakText($$$)
3146             {
3147 0     0 0 0 my ($et, $dirInfo, $tagTablePtr) = @_;
3148 0         0 my $dataPt = $$dirInfo{DataPt};
3149 0   0     0 my $dirStart = $$dirInfo{DirStart} || 0;
3150 0   0     0 my $dirLen = $$dirInfo{DirLen} || length($$dataPt) - $dirStart;
3151 0         0 my $data = substr($$dataPt, $dirStart, $dirLen);
3152 0         0 $data =~ s/\0.*//s; # truncate at null if it exists
3153 0         0 my @lines = split /[\n\r]+/, $data;
3154 0         0 my ($line, $success, @other, $tagInfo);
3155 0         0 $et->VerboseDir('Kodak Text');
3156 0         0 foreach $line (@lines) {
3157 0 0       0 if ($line =~ /(.*?):\s*(.*)/) {
3158 0         0 my ($tag, $val) = ($1, $2);
3159 0 0       0 if ($$tagTablePtr{$tag}) {
3160 0         0 $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
3161             } else {
3162 0         0 my $tagName = $tag;
3163 0         0 $tagName =~ s/([A-Z])\s+([A-Za-z])/${1}_\U$2/g;
3164 0         0 $tagName =~ s/([a-z])\s+([A-Za-z0-9])/${1}\U$2/g;
3165 0         0 $tagName =~ s/\s+//g;
3166 0         0 $tagName =~ s/[^-\w]+//g; # delete remaining invalid characters
3167 0 0       0 $tagName = 'NoName' unless $tagName;
3168 0         0 $tagInfo = { Name => $tagName };
3169 0         0 AddTagToTable($tagTablePtr, $tag, $tagInfo);
3170             }
3171 0         0 $et->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo);
3172 0         0 $success = 1;
3173             } else {
3174             # strip off leading/trailing white space and ignore blank lines
3175 0 0       0 push @other, $1 if $line =~ /^\s*(\S.*?)\s*$/;
3176             }
3177             }
3178 0 0       0 if ($success) {
3179 0 0       0 if (@other) {
3180 0         0 $tagInfo = $et->GetTagInfo($tagTablePtr, '_other_info');
3181 0         0 $et->FoundTag($tagInfo, \@other);
3182             }
3183             } else {
3184 0         0 $et->Warn("Can't parse Kodak TextualInfo data", 1);
3185             }
3186 0         0 return $success;
3187             }
3188              
3189             #------------------------------------------------------------------------------
3190             # Process Kodak IFD (with leading byte order mark)
3191             # Inputs: 0) ExifTool object ref, 1) dirInfo hash ref, 2) tag table ref
3192             # Returns: 1 on success, otherwise returns 0 and sets a Warning
3193             sub ProcessKodakIFD($$$)
3194             {
3195 0     0 0 0 my ($et, $dirInfo, $tagTablePtr) = @_;
3196 0   0     0 my $dirStart = $$dirInfo{DirStart} || 0;
3197 0 0 0     0 return 1 if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
3198 0         0 my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
  0         0  
3199 0 0       0 unless (Image::ExifTool::SetByteOrder($byteOrder)) {
3200 0         0 $et->Warn("Invalid Kodak $$dirInfo{Name} directory");
3201 0         0 return 1;
3202             }
3203 0         0 $$dirInfo{DirStart} += 2; # skip byte order mark
3204 0         0 $$dirInfo{DirLen} -= 2;
3205 0 0       0 if ($$et{HTML_DUMP}) {
3206 0         0 my $base = $$dirInfo{Base} + $$dirInfo{DataPos};
3207 0         0 $et->HDump($dirStart+$base, 2, "Byte Order Mark");
3208             }
3209 0         0 return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
3210             }
3211              
3212             #------------------------------------------------------------------------------
3213             # Write Kodak IFD (with leading byte order mark)
3214             # Inputs: 0) ExifTool object ref, 1) source dirInfo ref, 2) tag table ref
3215             # Returns: Exif data block (may be empty if no Exif data) or undef on error
3216             sub WriteKodakIFD($$$)
3217             {
3218 119     119 0 256 my ($et, $dirInfo, $tagTablePtr) = @_;
3219 119   50     507 my $dirStart = $$dirInfo{DirStart} || 0;
3220 119 50 33     586 return '' if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
3221 0           my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
  0            
3222 0 0         return '' unless Image::ExifTool::SetByteOrder($byteOrder);
3223 0           $$dirInfo{DirStart} += 2; # skip byte order mark
3224 0           $$dirInfo{DirLen} -= 2;
3225 0           my $buff = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
3226 0 0 0       return $buff unless defined $buff and length $buff;
3227             # apply one-time fixup for length of byte order mark
3228 0 0         if ($$dirInfo{Fixup}) {
3229 0           $dirInfo->{Fixup}->{Shift} += 2;
3230 0           $$dirInfo{Fixup}->ApplyFixup(\$buff);
3231 0           delete $$dirInfo{Fixup};
3232             }
3233 0           return Image::ExifTool::GetByteOrder() . $buff;
3234             }
3235              
3236             1; # end
3237              
3238             __END__