Ignore:
Timestamp:
2021-02-26T19:39:51+13:00 (3 years ago)
Author:
anupama
Message:

Committing the improvements to EmbeddedMetaPlugin's processing of Keywords vs other metadata fields. Keywords were literally stored as arrays of words rather than phrases in PDFs (at least in Diego's sample PDF), whereas other meta fields like Subjects and Creators stored them as arrays of phrases. To get both to work, Kathy updated EXIF to a newer version, to retrieve the actual EXIF values stored in the PDF. And Kathy and Dr Bainbridge came up with a new option that I added called apply_join_before_split_to_metafields that's a regex which can list the metadata fields to apply the join_before_split to and whcih previously always got applied to all metadata fields. Now it's applied to any *Keywords metafields by default, as that's the metafield we have experience of that behaves differently to the others, as it stores by word instead of phrases. Tested on Diego's sample PDF. Diego has double-checked it to works on his sample PDF too, setting the split char to ; and turning on the join_before_split and leaving apply_join_before_split_to_metafields at its default of .*Keywords. File changes are strings.properties for the tooltip, the plugin introducing the option and working with it and Kathy's EXIF updates affecting cpan/File and cpan/Image.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/cpan/Image/ExifTool/Kodak.pm

    r24107 r34921  
    99#               2) http://www.ozhiker.com/electronics/pjmt/jpeg_info/meta.html
    1010#               3) http://www.cybercom.net/~dcoffin/dcraw/
     11#               4) Jim McGarvey private communication
     12#               IB) Iliah Borg private communication (LibRaw)
    1113#
    1214# Notes:        There really isn't much public information about Kodak formats.
     
    2123use strict;
    2224use vars qw($VERSION);
     25use Image::ExifTool qw(:DataAccess :Utils);
    2326use Image::ExifTool::Exif;
    2427
    25 $VERSION = '1.27';
     28$VERSION = '1.47';
    2629
    2730sub ProcessKodakIFD($$$);
    2831sub ProcessKodakText($$$);
     32sub ProcessPose($$$);
    2933sub WriteKodakIFD($$$);
    3034
     
    188192            2 => 'Tungsten',
    189193            3 => 'Daylight',
     194            # 5 - seen this for "Auto" with a ProBack 645M
    190195        },
    191196    },
     
    371376    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
    372377    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
     378    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
     379    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
    373380    NOTES => q{
    374381        These tags are used by the CX4200, CX4210, CX4230, CX4300, CX4310, CX6200
     
    438445    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
    439446    PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
     447    WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
     448    CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
    440449    NOTES => 'These tags are used by the DX3215 and DX3700.',
    441450    WRITABLE => 1,
     
    749758        Notes => 'Kodak only',
    750759    },
    751     0xa8 => { # (not confirmed)
    752         Name => 'SerialNumber',
    753         Condition => '$$self{Make} =~ /Kodak/i',
     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',
    754763        Format => 'string[12]',
    755764        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,
    756773    },
    757774);
     
    772789        Writable => 'int16u',
    773790        Count => 2,
     791        PrintConv => '$val =~ tr/ /x/; $val',
     792        PrintConvInv => '$val =~ tr/x/ /; $val',
    774793    },
    775794    # 0x03 int32u - ranges from about 33940 to 40680
     
    837856);
    838857
     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
    839892# Kodak SubIFD0 tags (ref PH)
    840893%Image::ExifTool::Kodak::SubIFD0 = (
     
    846899        Name => 'SceneMode',
    847900        Writable => 'int16u',
    848         Notes => 'may not be valid for some models', # ie. M580?
     901        Notes => 'may not be valid for some models', # eg. M580?
     902        PrintConvColumns => 2,
    849903        PrintConv => {
    850904            1 => 'Sport',
     
    867921            28 => 'Candlelight',
    868922            29 => 'Sunset',
    869             31 => 'Panorama Left-Right',
    870             32 => 'Panorama Right-Left',
     923            31 => 'Panorama Left-right',
     924            32 => 'Panorama Right-left',
    871925            33 => 'Smart Scene',
    872926            34 => 'High ISO',
     
    9481002    },
    9491003    0xfa57 => {
    950         Name => 'PreviewWidth',
     1004        Name => 'PreviewImageWidth',
    9511005        Writable => 'int16u',
    9521006    },
    9531007    0xfa58 => {
    954         Name => 'PreviewHeight',
     1008        Name => 'PreviewImageHeight',
    9551009        Writable => 'int16u',
    9561010    },
     
    10081062        Name => 'SceneModeUsed',
    10091063        Writable => 'int32u',
     1064        PrintConvColumns => 2,
    10101065        PrintConv => \%sceneModeUsed,
    10111066    },
     
    10281083        Name => 'SceneModeUsed',
    10291084        Writable => 'int32u',
     1085        PrintConvColumns => 2,
    10301086        PrintConv => \%sceneModeUsed,
    10311087    },
     
    12971353    },
    12981354    # 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    },
    12991362    0x0001 => {
    13001363        # (related to EV but exact meaning unknown)
    1301         Name => 'UnknownEV',
     1364        Name => 'UnknownEV', # ("DeletedTag", ref 4)
    13021365        Writable => 'rational64u',
    13031366        Unknown => 1,
    13041367    },
    13051368    # 0x0002: int8u       - values: 0
    1306     0x0003 => {
    1307         Name => 'ExposureValue',
    1308         Writable => 'rational64u',
    1309     },
     1369    0x0003 => { Name => 'ExposureValue',    Writable => 'rational64u' },
    13101370    # 0x0004: rational64u - values: 2.875,3.375,3.625,4,4.125,7.25
    13111371    # 0x0005: int8u       - values: 0
     
    13131373    # 0x0007: int32u[3]   - values: "65536 67932 69256"
    13141374    0x03e9 => { Name => 'OriginalFileName', Writable => 'string' },
    1315     0x03eb => 'SensorLeftBorder',
    1316     0x03ec => 'SensorTopBorder',
    1317     0x03ed => 'SensorImageWidth',
    1318     0x03ee => 'SensorImageHeight',
     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
    13191382    0x03f1 => {
    1320         Name => 'TextualInfo',
     1383        Name => 'TextualInfo', # ("CameraSettingString", ref 4)
    13211384        SubDirectory => {
    13221385            TagTable => 'Image::ExifTool::Kodak::TextualInfo',
    13231386        },
    13241387    },
     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    },
    13251427    0x03fc => { #3
    13261428        Name => 'WhiteBalance',
     
    13291431        PrintConv => { },   # no values yet known
    13301432    },
    1331     0x03fd => { #3
     1433    0x03fd => [{ #3
    13321434        Name => 'Processing',
    13331435        Condition => '$count == 72',
     
    13351437            TagTable => 'Image::ExifTool::Kodak::Processing',
    13361438        },
    1337     },
     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
    13381447    0x0401 => {
    1339         Name => 'Time',
     1448        Name => 'Time', # ("CaptureTime", ref 4)
    13401449        Groups => { 2 => 'Time' },
    13411450        Writable => 'string',
    13421451    },
    1343     0x0414 => { Name => 'NCDFileInfo',      Writable => 'string' },
    1344     0x0846 => { #3
     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)
    13451726        Name => 'ColorTemperature',
    13461727        Writable => 'int16u',
    13471728    },
    1348     0x0852 => 'WB_RGBMul0', #3
    1349     0x0853 => 'WB_RGBMul1', #3
    1350     0x0854 => 'WB_RGBMul2', #3
    1351     0x0855 => 'WB_RGBMul3', #3
    1352     0x085c => { Name => 'WB_RGBCoeffs0', Binary => 1 }, #3
    1353     0x085d => { Name => 'WB_RGBCoeffs1', Binary => 1 }, #3
    1354     0x085e => { Name => 'WB_RGBCoeffs2', Binary => 1 }, #3
    1355     0x085f => { Name => 'WB_RGBCoeffs3', Binary => 1 }, #3
    1356     # 0x090d: linear table (ref 3)
    1357     # 0x0c81: some sort of date (manufacture date?) - PH
    1358     0x0ce5 => { Name => 'FirmwareVersion',  Writable => 'string' },
    1359     # 0x1390: value: "DCSProSLRn" (tone curve name?) - PH
    1360     0x1391 => { Name => 'ToneCurveFileName',Writable => 'string' },
    1361     0x1784 => { Name => 'ISO',              Writable => 'int32u' }, #3
     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
    13622562);
    13632563
     
    14442644        Name => 'ExposureMode',
    14452645        PrintConv => {
     2646            OTHER => sub { shift }, # pass other values straight through
    14462647            'M' => 'Manual',
    14472648            'A' => 'Aperture Priority', #(NC -- I suppose this could be "Auto" too)
     
    14502651            'B' => 'Bulb', #(NC)
    14512652            # have seen "Manual (M)" written by DCS760C - PH
     2653            # and "Aperture priority AE (Av)" written by a ProBack 645M
    14522654        },
    14532655    },
     
    14642666    'ISO'           => 'ISO',
    14652667    'ISO Speed'     => 'ISO',
     2668    'Lens'          => { Name => 'Lens', Priority => 0 },
    14662669    'Max Aperture'  => {
    14672670        Name => 'MaxAperture',
     
    15082711        Name => 'CameraOwner',
    15092712        Writable => 'undef',
    1510         RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
     2713        RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)',
    15112714        RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
    15122715    },
     
    15152718        Writable => 'undef',
    15162719        Groups => { 2 => 'Camera' },
    1517         RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)', #PH
     2720        RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,$tag)', #PH
    15182721        RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
    15192722    },
     
    15432746    0xc366 => 'EditTagArray',
    15442747    0xc367 => 'Magnification',
     2748    # 0xc36b - string[8]: "1.0"
    15452749    0xc36c => 'NativeXResolution',
    15462750    0xc36d => 'NativeYResolution',
     
    15692773    0xc46c => 'PrintQuality',
    15702774    0xc46e => 'ImagePrintStatus',
     2775    # 0cx46f - int16u: 1
    15712776);
    15722777
     
    15782783    1 => {
    15792784        Name => 'DigitalEffectsName',
    1580         PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
     2785        PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"DigitalEffectsName")',
    15812786    },
    15822787    2 => 'DigitalEffectsType',
     
    15902795    1 => {
    15912796        Name => 'BorderName',
    1592         PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val)',
     2797        PrintConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,"BorderName")',
    15932798    },
    15942799    2 => 'BorderID',
     
    16042809    GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
    16052810    FIRST_ENTRY => 0,
    1606     NOTES => 'This information is found in Kodak MOV videos from models such as the P880.',
     2811    NOTES => q{
     2812        This information is found in the TAGS atom of MOV videos from Kodak models
     2813        such as the P880.
     2814    },
    16072815    0 => {
    16082816        Name => 'Make',
     
    16402848        PrintConv => 'sprintf("%.1f mm",$val)',
    16412849    },
     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<Duplicates|../ExifTool.html#Duplicates> option is used.
     3014    },
     3015    Accelerometer => { }, # up, back, left?  units of g
     3016    AngularVelocity => { } # left, up, ccw?  units?
    16423017);
    16433018
     
    16933068# add our composite tags
    16943069Image::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
     3075sub ProcessPose($$$)
     3076{
     3077    my ($et, $dirInfo, $tagTablePtr) = @_;
     3078    my $dataPt = $$dirInfo{DataPt};
     3079    my $dirLen = length $$dataPt;
     3080    my $ee = $et->Options('ExtractEmbedded');
     3081    my ($i, $pos);
     3082
     3083    return 0 if $dirLen < 0x14;
     3084    my $num = Get32u($dataPt, 0x10);
     3085    return 0 if $dirLen < 0x14 + $num * 24;
     3086
     3087    $et->VerboseDir('Kodak pose', undef, $dirLen);
     3088
     3089    $$et{DOC_NUM} = 0;
     3090    for ($i=0, $pos=0x14; $i<$num; ++$i, $pos+=24) {
     3091        $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        $ee or $pos += $num * 24, last;
     3096        ++$$et{DOC_NUM};
     3097    }
     3098    $$et{DOC_NUM} = 0;
     3099
     3100    return 1 if $dirLen < $pos + 0x10;
     3101    $num = Get32u($dataPt, $pos + 0x0c);
     3102    return 1 if $dirLen < $pos + 0x10 + $num * 24;
     3103
     3104    for ($i=0, $pos+=0x10; $i<$num; ++$i, $pos+=24) {
     3105        $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        $ee or $pos += $num * 24, last;
     3110        ++$$et{DOC_NUM};
     3111    }
     3112    $$et{DOC_NUM} = 0;
     3113    $ee or $et->Warn('Use the ExtractEmbedded option to extract all accelerometer data',3);
     3114    return 1;
     3115}
    16953116
    16963117#------------------------------------------------------------------------------
     
    17243145sub ProcessKodakText($$$)
    17253146{
    1726     my ($exifTool, $dirInfo, $tagTablePtr) = @_;
     3147    my ($et, $dirInfo, $tagTablePtr) = @_;
    17273148    my $dataPt = $$dirInfo{DataPt};
    17283149    my $dirStart = $$dirInfo{DirStart} || 0;
     
    17323153    my @lines = split /[\n\r]+/, $data;
    17333154    my ($line, $success, @other, $tagInfo);
    1734     $exifTool->VerboseDir('Kodak Text');
     3155    $et->VerboseDir('Kodak Text');
    17353156    foreach $line (@lines) {
    17363157        if ($line =~ /(.*?):\s*(.*)/) {
    17373158            my ($tag, $val) = ($1, $2);
    17383159            if ($$tagTablePtr{$tag}) {
    1739                 $tagInfo = $exifTool->GetTagInfo($tagTablePtr, $tag);
     3160                $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
    17403161            } else {
    17413162                my $tagName = $tag;
     
    17463167                $tagName = 'NoName' unless $tagName;
    17473168                $tagInfo = { Name => $tagName };
    1748                 Image::ExifTool::AddTagToTable($tagTablePtr, $tag, $tagInfo);
     3169                AddTagToTable($tagTablePtr, $tag, $tagInfo);
    17493170            }
    1750             $exifTool->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo);
     3171            $et->HandleTag($tagTablePtr, $tag, $val, TagInfo => $tagInfo);
    17513172            $success = 1;
    17523173        } else {
     
    17573178    if ($success) {
    17583179        if (@other) {
    1759             $tagInfo = $exifTool->GetTagInfo($tagTablePtr, '_other_info');
    1760             $exifTool->FoundTag($tagInfo, \@other);
     3180            $tagInfo = $et->GetTagInfo($tagTablePtr, '_other_info');
     3181            $et->FoundTag($tagInfo, \@other);
    17613182        }
    17623183    } else {
    1763         $exifTool->Warn("Can't parse Kodak TextualInfo data", 1);
     3184        $et->Warn("Can't parse Kodak TextualInfo data", 1);
    17643185    }
    17653186    return $success;
     
    17723193sub ProcessKodakIFD($$$)
    17733194{
    1774     my ($exifTool, $dirInfo, $tagTablePtr) = @_;
     3195    my ($et, $dirInfo, $tagTablePtr) = @_;
    17753196    my $dirStart = $$dirInfo{DirStart} || 0;
    17763197    return 1 if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
    17773198    my $byteOrder = substr(${$$dirInfo{DataPt}}, $dirStart, 2);
    17783199    unless (Image::ExifTool::SetByteOrder($byteOrder)) {
    1779         $exifTool->Warn("Invalid Kodak $$dirInfo{Name} directory");
     3200        $et->Warn("Invalid Kodak $$dirInfo{Name} directory");
    17803201        return 1;
    17813202    }
    17823203    $$dirInfo{DirStart} += 2;   # skip byte order mark
    17833204    $$dirInfo{DirLen} -= 2;
    1784     if ($exifTool->{HTML_DUMP}) {
     3205    if ($$et{HTML_DUMP}) {
    17853206        my $base = $$dirInfo{Base} + $$dirInfo{DataPos};
    1786         $exifTool->HDump($dirStart+$base, 2, "Byte Order Mark");
     3207        $et->HDump($dirStart+$base, 2, "Byte Order Mark");
    17873208    }
    1788     return Image::ExifTool::Exif::ProcessExif($exifTool, $dirInfo, $tagTablePtr);
     3209    return Image::ExifTool::Exif::ProcessExif($et, $dirInfo, $tagTablePtr);
    17893210}
    17903211
     
    17953216sub WriteKodakIFD($$$)
    17963217{
    1797     my ($exifTool, $dirInfo, $tagTablePtr) = @_;
     3218    my ($et, $dirInfo, $tagTablePtr) = @_;
    17983219    my $dirStart = $$dirInfo{DirStart} || 0;
    17993220    return '' if $dirStart <= 0 or $dirStart + 2 > $$dirInfo{DataLen};
     
    18023223    $$dirInfo{DirStart} += 2;   # skip byte order mark
    18033224    $$dirInfo{DirLen} -= 2;
    1804     my $buff = Image::ExifTool::Exif::WriteExif($exifTool, $dirInfo, $tagTablePtr);
     3225    my $buff = Image::ExifTool::Exif::WriteExif($et, $dirInfo, $tagTablePtr);
    18053226    return $buff unless defined $buff and length $buff;
    18063227    # apply one-time fixup for length of byte order mark
     
    18323253=head1 AUTHOR
    18333254
    1834 Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
     3255Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
    18353256
    18363257This library is free software; you can redistribute it and/or modify it
Note: See TracChangeset for help on using the changeset viewer.