exiftool_vendored 12.25.0 → 12.35.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +174 -7
  3. data/bin/MANIFEST +11 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +44 -43
  7. data/bin/arg_files/xmp2exif.args +2 -1
  8. data/bin/config_files/convert_regions.config +25 -14
  9. data/bin/config_files/example.config +1 -1
  10. data/bin/exiftool +118 -92
  11. data/bin/fmt_files/gpx.fmt +1 -1
  12. data/bin/fmt_files/gpx_wpt.fmt +1 -1
  13. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +16 -3
  14. data/bin/lib/Image/ExifTool/CBOR.pm +331 -0
  15. data/bin/lib/Image/ExifTool/Canon.pm +52 -20
  16. data/bin/lib/Image/ExifTool/Charset.pm +2 -0
  17. data/bin/lib/Image/ExifTool/DPX.pm +13 -2
  18. data/bin/lib/Image/ExifTool/Exif.pm +107 -8
  19. data/bin/lib/Image/ExifTool/FLIR.pm +33 -8
  20. data/bin/lib/Image/ExifTool/FlashPix.pm +35 -10
  21. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
  22. data/bin/lib/Image/ExifTool/Geotag.pm +13 -2
  23. data/bin/lib/Image/ExifTool/GoPro.pm +16 -1
  24. data/bin/lib/Image/ExifTool/ICC_Profile.pm +96 -4
  25. data/bin/lib/Image/ExifTool/ID3.pm +15 -3
  26. data/bin/lib/Image/ExifTool/JPEG.pm +68 -2
  27. data/bin/lib/Image/ExifTool/JSON.pm +7 -3
  28. data/bin/lib/Image/ExifTool/Jpeg2000.pm +164 -36
  29. data/bin/lib/Image/ExifTool/LIF.pm +153 -0
  30. data/bin/lib/Image/ExifTool/Lang/nl.pm +60 -59
  31. data/bin/lib/Image/ExifTool/M2TS.pm +103 -7
  32. data/bin/lib/Image/ExifTool/MIE.pm +2 -1
  33. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  34. data/bin/lib/Image/ExifTool/MacOS.pm +2 -2
  35. data/bin/lib/Image/ExifTool/Nikon.pm +50 -6
  36. data/bin/lib/Image/ExifTool/NikonSettings.pm +10 -2
  37. data/bin/lib/Image/ExifTool/Olympus.pm +9 -2
  38. data/bin/lib/Image/ExifTool/Other.pm +93 -0
  39. data/bin/lib/Image/ExifTool/PDF.pm +11 -12
  40. data/bin/lib/Image/ExifTool/PNG.pm +7 -6
  41. data/bin/lib/Image/ExifTool/Panasonic.pm +14 -2
  42. data/bin/lib/Image/ExifTool/Pentax.pm +28 -5
  43. data/bin/lib/Image/ExifTool/Photoshop.pm +6 -0
  44. data/bin/lib/Image/ExifTool/QuickTime.pm +123 -25
  45. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +203 -121
  46. data/bin/lib/Image/ExifTool/README +9 -2
  47. data/bin/lib/Image/ExifTool/RIFF.pm +7 -2
  48. data/bin/lib/Image/ExifTool/Samsung.pm +47 -10
  49. data/bin/lib/Image/ExifTool/Sony.pm +113 -42
  50. data/bin/lib/Image/ExifTool/TagLookup.pm +4599 -4451
  51. data/bin/lib/Image/ExifTool/TagNames.pod +276 -41
  52. data/bin/lib/Image/ExifTool/Torrent.pm +18 -11
  53. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  54. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
  55. data/bin/lib/Image/ExifTool/WritePNG.pl +2 -0
  56. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +21 -4
  57. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  58. data/bin/lib/Image/ExifTool/Writer.pl +47 -2
  59. data/bin/lib/Image/ExifTool/XMP.pm +32 -12
  60. data/bin/lib/Image/ExifTool/XMP2.pl +5 -2
  61. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  62. data/bin/lib/Image/ExifTool/ZISRAW.pm +121 -2
  63. data/bin/lib/Image/ExifTool.pm +153 -52
  64. data/bin/lib/Image/ExifTool.pod +70 -60
  65. data/bin/perl-Image-ExifTool.spec +43 -42
  66. data/lib/exiftool_vendored/version.rb +1 -1
  67. metadata +6 -3
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::nl;
11
11
  use strict;
12
12
  use vars qw($VERSION);
13
13
 
14
- $VERSION = '1.12';
14
+ $VERSION = '1.13';
15
15
 
16
16
  %Image::ExifTool::Lang::nl::Translate = (
17
17
  'AEBAutoCancel' => {
@@ -1502,97 +1502,98 @@ $VERSION = '1.12';
1502
1502
  'GIFVersion' => 'GIF versie',
1503
1503
  'GPSAltitude' => 'Hoogte',
1504
1504
  'GPSAltitudeRef' => {
1505
- Description => 'Hoogte referentie',
1505
+ Description => 'GPS hoogte - referentie',
1506
1506
  PrintConv => {
1507
- 'Above Sea Level' => 'Zee spiegel',
1508
- 'Below Sea Level' => 'Zee spiegel referentie (negatieve waarde)',
1507
+ 'Above Sea Level' => 'Boven zeeniveau',
1508
+ 'Below Sea Level' => 'Onder zeeniveau',
1509
1509
  },
1510
1510
  },
1511
- 'GPSAreaInformation' => 'Naam van het GPS gebied',
1512
- 'GPSDOP' => 'Meet nauwkeurigheid',
1513
- 'GPSDateStamp' => 'GPS datum',
1514
- 'GPSDateTime' => 'GPS tijd (atoomklok)',
1515
- 'GPSDestBearing' => 'Motiefrichting',
1511
+ 'GPSAreaInformation' => 'GPS naam van het gebied',
1512
+ 'GPSDOP' => 'GPS meetnauwkeurigheid',
1513
+ 'GPSDateStamp' => 'GPS UTC datum',
1514
+ 'GPSDateTime' => 'GPS UTC datum en tijd',
1515
+ 'GPSDestBearing' => 'GPS peiling van bestemming',
1516
1516
  'GPSDestBearingRef' => {
1517
- Description => 'Referentie voor de motiefrichting',
1517
+ Description => 'GPS peiling van bestemming - referentie',
1518
1518
  PrintConv => {
1519
- 'Magnetic North' => 'Magnetische uitrichting',
1520
- 'True North' => 'Geografische uitrichting',
1519
+ 'Magnetic North' => 'Magnetische noorden',
1520
+ 'True North' => 'Geografische noorden',
1521
1521
  },
1522
1522
  },
1523
- 'GPSDestDistance' => 'Afstand tot bestemming',
1523
+ 'GPSDestDistance' => 'GPS afstand tot bestemming',
1524
1524
  'GPSDestDistanceRef' => {
1525
- Description => 'Referentie voor de afstand tot de bestemming',
1525
+ Description => 'GPS afstand tot bestemming - referentie',
1526
1526
  PrintConv => {
1527
- 'Miles' => 'Mijlen',
1528
- 'Nautical Miles' => 'Knopen',
1527
+ 'Miles' => 'Engelse mijlen',
1528
+ 'Nautical Miles' => 'Zeemijlen',
1529
1529
  },
1530
1530
  },
1531
- 'GPSDestLatitude' => 'Breedte van het doel',
1531
+ 'GPSDestLatitude' => 'GPS breedtegraad van bestemming',
1532
1532
  'GPSDestLatitudeRef' => {
1533
- Description => 'Referentie voor de breedte van het doel',
1533
+ Description => 'GPS breedtegraad van bestemming - referentie',
1534
1534
  PrintConv => {
1535
- 'North' => 'Noordelijke breedte',
1536
- 'South' => 'Zuidelijke breedte',
1535
+ 'North' => 'Noorderbreedte',
1536
+ 'South' => 'Zuiderbreedte',
1537
1537
  },
1538
1538
  },
1539
- 'GPSDestLongitude' => 'Lengtegraad van het doel',
1539
+ 'GPSDestLongitude' => 'GPS lengtegraad van bestemming',
1540
1540
  'GPSDestLongitudeRef' => {
1541
- Description => 'Referentie voor de lengte van het doel',
1541
+ Description => 'GPS lengtegraad van bestemming - referentie',
1542
1542
  PrintConv => {
1543
- 'East' => 'Oostelijke lengte',
1544
- 'West' => 'Westlijke lengte',
1543
+ 'East' => 'Oosterlengte',
1544
+ 'West' => 'Westerlengte',
1545
1545
  },
1546
1546
  },
1547
1547
  'GPSDifferential' => {
1548
1548
  Description => 'GPS differentiaal correctie',
1549
1549
  PrintConv => {
1550
- 'Differential Corrected' => 'Differentiaal correctie toegepast',
1551
- 'No Correction' => 'Meting zonder differentiaal correctie',
1550
+ 'Differential Corrected' => 'Met differentiaal correctie',
1551
+ 'No Correction' => 'Zonder differentiaal correctie',
1552
1552
  },
1553
1553
  },
1554
- 'GPSImgDirection' => 'Richting van de afbeelding',
1554
+ 'GPSImgDirection' => 'GPS peiling van de afbeelding',
1555
1555
  'GPSImgDirectionRef' => {
1556
- Description => 'Referentie voor de uitrichting van de afbeelding',
1556
+ Description => 'GPS peiling van de afbeelding - referentie',
1557
1557
  PrintConv => {
1558
- 'Magnetic North' => 'Magnetische uitrichting',
1559
- 'True North' => 'Geografische uitrichting',
1558
+ 'Magnetic North' => 'Magnetische noorden',
1559
+ 'True North' => 'Geografische noorden',
1560
1560
  },
1561
1561
  },
1562
- 'GPSInfo' => 'GPS Info IFD-wijzer',
1563
- 'GPSLatitude' => 'Breedte graad',
1562
+ 'GPSInfo' => 'GPS Info',
1563
+ 'GPSLatitude' => 'GPS breedtegraad',
1564
1564
  'GPSLatitudeRef' => {
1565
- Description => 'Noord. of zuid. breedte',
1565
+ Description => 'GPS breedtegraad - referentie',
1566
1566
  PrintConv => {
1567
- 'North' => 'Noordelijke breedte',
1568
- 'South' => 'Zuidlijke breedte',
1567
+ 'North' => 'Noorderbreedte',
1568
+ 'South' => 'Zuiderbreedte',
1569
1569
  },
1570
1570
  },
1571
- 'GPSLongitude' => 'Geografische lengte',
1571
+ 'GPSLongitude' => 'GPS lengtegraad',
1572
1572
  'GPSLongitudeRef' => {
1573
- Description => 'Oost. of west. lengte',
1573
+ Description => 'GPS lengtegraad - referentie',
1574
1574
  PrintConv => {
1575
- 'East' => 'Oostlijke lengte',
1576
- 'West' => 'Westlijke lengte',
1575
+ 'East' => 'Oosterlengte',
1576
+ 'West' => 'Westerlengte',
1577
1577
  },
1578
1578
  },
1579
- 'GPSMapDatum' => 'Geodatische datum',
1579
+ 'GPSMapDatum' => 'GPS geodetisch datum',
1580
1580
  'GPSMeasureMode' => {
1581
- Description => 'GPS meet methode',
1581
+ Description => 'GPS meetmethode',
1582
1582
  PrintConv => {
1583
- '2-D' => '2 dimensionale meting',
1584
- '2-Dimensional' => '2 dimensionale meting',
1585
- '2-Dimensional Measurement' => '2 dimensionale meting',
1586
- '3-D' => '3 dimensionale meting',
1587
- '3-Dimensional' => '3 dimensionale meting',
1588
- '3-Dimensional Measurement' => '3 dimensionale meting',
1583
+ '2-D' => 'Tweedimensionale meting',
1584
+ '2-Dimensional' => 'Tweedimensionale meting',
1585
+ '2-Dimensional Measurement' => 'Tweedimensionale meting',
1586
+ '3-D' => 'Driedimensionale meting',
1587
+ '3-Dimensional' => 'Driedimensionale meting',
1588
+ '3-Dimensional Measurement' => 'Driedimensionale meting',
1589
1589
  },
1590
1590
  },
1591
- 'GPSProcessingMethod' => 'Naam van de GPS verwerk methode',
1592
- 'GPSSatellites' => 'Voor de meting gebruikte satellieten',
1593
- 'GPSSpeed' => 'Snelheid van de GPS ontvanger',
1591
+ 'GPSPosition' => 'GPS positie',
1592
+ 'GPSProcessingMethod' => 'GPS verwerkingsmethode',
1593
+ 'GPSSatellites' => 'GPS satellieten gebruikt voor de meting',
1594
+ 'GPSSpeed' => 'GPS ontvanger bewegingssnelheid',
1594
1595
  'GPSSpeedRef' => {
1595
- Description => 'Snelheids eenheid',
1596
+ Description => 'GPS ontvanger bewegingssnelheid - referentie',
1596
1597
  PrintConv => {
1597
1598
  'km/h' => 'Kilometer per uur',
1598
1599
  'knots' => 'Knopen',
@@ -1602,20 +1603,20 @@ $VERSION = '1.12';
1602
1603
  'GPSStatus' => {
1603
1604
  Description => 'GPS ontvanger status',
1604
1605
  PrintConv => {
1605
- 'Measurement Active' => 'Meting loopt',
1606
- 'Measurement Void' => 'Interoperabiliteit voor metingen',
1606
+ 'Measurement Active' => 'Actuele meting beschikbaar',
1607
+ 'Measurement Void' => 'Actuele meting niet beschikbaar',
1607
1608
  },
1608
1609
  },
1609
- 'GPSTimeStamp' => 'GPS tijd (atoomklok)',
1610
- 'GPSTrack' => 'Bewegingsrichting',
1610
+ 'GPSTimeStamp' => 'GPS UTC tijd',
1611
+ 'GPSTrack' => 'GPS ontvanger bewegingsrichting',
1611
1612
  'GPSTrackRef' => {
1612
- Description => 'Referentie voor de bewegingsrichting',
1613
+ Description => 'GPS ontvanger bewegingsrichting - referentie',
1613
1614
  PrintConv => {
1614
- 'Magnetic North' => 'Magnetische uitrichting',
1615
- 'True North' => 'Geographische uitrichting',
1615
+ 'Magnetic North' => 'Magnetische noorden',
1616
+ 'True North' => 'Geografische noorden',
1616
1617
  },
1617
1618
  },
1618
- 'GPSVersionID' => 'GPS tag versie',
1619
+ 'GPSVersionID' => 'GPS versie ID',
1619
1620
  'GainControl' => {
1620
1621
  Description => 'Belichtingsversterking',
1621
1622
  PrintConv => {
@@ -31,7 +31,7 @@ use strict;
31
31
  use vars qw($VERSION);
32
32
  use Image::ExifTool qw(:DataAccess :Utils);
33
33
 
34
- $VERSION = '1.19';
34
+ $VERSION = '1.21';
35
35
 
36
36
  # program map table "stream_type" lookup (ref 6/1)
37
37
  my %streamType = (
@@ -113,6 +113,8 @@ my %noSyntax = (
113
113
  0xff => 1, # program_stream_directory
114
114
  );
115
115
 
116
+ my $knotsToKph = 1.852; # knots --> km/h
117
+
116
118
  # information extracted from the MPEG-2 transport stream
117
119
  %Image::ExifTool::M2TS::Main = (
118
120
  GROUPS => { 2 => 'Video' },
@@ -327,7 +329,90 @@ sub ParsePID($$$$$)
327
329
  my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
328
330
  Image::ExifTool::QuickTime::ProcessFreeGPS($et, { DataPt => \$dat }, $tbl);
329
331
  $more = 1;
332
+ } elsif ($$dataPt =~ /^A([NS])([EW])\0/s) {
333
+ # INNOVV TS video (same format is INNOVV MP4)
334
+ SetByteOrder('II');
335
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
336
+ while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) {
337
+ my $dat = $1;
338
+ my $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe)
339
+ my $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
340
+ my $spd = GetFloat(\$dat, 12) * $knotsToKph;
341
+ my $trk = GetFloat(\$dat, 16);
342
+ my @acc = unpack('x20V3', $dat);
343
+ map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc;
344
+ Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
345
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
346
+ $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * (substr($dat,1,1) eq 'S' ? -1 : 1));
347
+ $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * (substr($dat,2,1) eq 'W' ? -1 : 1));
348
+ $et->HandleTag($tagTbl, GPSSpeed => $spd);
349
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
350
+ $et->HandleTag($tagTbl, GPSTrack => $trk);
351
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
352
+ $et->HandleTag($tagTbl, Accelerometer => "@acc");
353
+ }
354
+ SetByteOrder('MM');
355
+ $more = 1;
356
+ } elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) {
357
+ # $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d
358
+ # $GSNRINFO,0.01,0.04,0.25\0
359
+ $$dataPt =~ tr/\x0d/\x0a/;
360
+ $$dataPt =~ tr/\0//d;
361
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
362
+ my @lines = split /\x0a/, $$dataPt;
363
+ my ($line, $lastTime);
364
+ foreach $line (@lines) {
365
+ if ($line =~ /^\$GPSINFO/) {
366
+ my @a = split /,/, $lines[0];
367
+ next unless @a > 7;
368
+ # ignore duplicate fixes
369
+ next if $lastTime and $a[2] eq $lastTime;
370
+ $lastTime = $a[2];
371
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
372
+ $a[2] =~ tr/./:/;
373
+ # (untested, and probably doesn't work for S/W hemispheres)
374
+ my ($lat, $lon) = @a[3,4];
375
+ Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
376
+ # $a[0] - flags? values: '0x0001','0x0004','0x0008','0x0010'
377
+ $et->HandleTag($tagTbl, GPSDateTime => $a[2]);
378
+ $et->HandleTag($tagTbl, GPSLatitude => $lat);
379
+ $et->HandleTag($tagTbl, GPSLongitude => $lon);
380
+ $et->HandleTag($tagTbl, GPSSpeed => $a[5]);
381
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
382
+ # $a[6] - values: 48-60
383
+ $et->HandleTag($tagTbl, GPSTrack => $a[7]);
384
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
385
+ # #a[8,9] - always 0
386
+ } elsif ($line =~ /^\$GSNRINFO/) {
387
+ my @a = split /,/, $line;
388
+ shift @a;
389
+ $et->HandleTag($tagTbl, Accelerometer => "@a");
390
+ }
391
+ }
392
+ $more = 1;
393
+ } elsif ($$dataPt =~ /^.{44}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s and length($$dataPt) >= 84) {
394
+ #forum11320
395
+ SetByteOrder('II');
396
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
397
+ my $lat = abs(GetFloat($dataPt, 48)); # (abs just to be safe)
398
+ my $lon = abs(GetFloat($dataPt, 56)); # (abs just to be safe)
399
+ my $spd = GetFloat($dataPt, 64);
400
+ my $trk = GetFloat($dataPt, 68);
401
+ $et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong');
402
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
403
+ my @date = unpack('x32V3x28V3', $$dataPt);
404
+ $date[3] += 2000;
405
+ $et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @date[3..5,0..2]));
406
+ $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * ($1 eq 'S' ? -1 : 1));
407
+ $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * ($2 eq 'W' ? -1 : 1));
408
+ $et->HandleTag($tagTbl, GPSSpeed => $spd);
409
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
410
+ $et->HandleTag($tagTbl, GPSTrack => $trk);
411
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
412
+ SetByteOrder('MM');
413
+ $more = 1;
330
414
  }
415
+ delete $$et{DOC_NUM};
331
416
  }
332
417
  return $more;
333
418
  }
@@ -379,14 +464,21 @@ sub ProcessM2TS($$)
379
464
  );
380
465
  my %didPID = ( 1 => 0, 2 => 0, 0x1fff => 0 );
381
466
  my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse
467
+ # PID's that may contain GPS info
468
+ my %gpsPID = (
469
+ 0x0300 => 1, # Novatek INNOVV
470
+ 0x01e4 => 1, # vsys a6l dashcam
471
+ );
382
472
  my $pEnd = 0;
383
473
 
384
- # scan entire file for GPS program 0x0300 if ExtractEmbedded option is 3 or higher
385
- # (some dashcams write this program but don't include it in the PMT)
474
+ # scan entire file for GPS programs if ExtractEmbedded option is 3 or higher
475
+ # (some dashcams write these programs but don't include it in the PMT)
386
476
  if (($et->Options('ExtractEmbedded') || 0) > 2) {
387
- $needPID{0x0300} = 1;
388
- $pidType{0x0300} = -1;
389
- $pidName{0x0300} = 'unregistered dashcam GPS';
477
+ foreach (keys %gpsPID) {
478
+ $needPID{$_} = 1;
479
+ $pidType{$_} = -1;
480
+ $pidName{$_} ='unregistered dashcam GPS';
481
+ }
390
482
  }
391
483
 
392
484
  # parse packets from MPEG-2 Transport Stream
@@ -675,7 +767,11 @@ sub ProcessM2TS($$)
675
767
  }
676
768
  $data{$pid} = substr($buff, $pos, $pEnd-$pos);
677
769
  } else {
678
- next unless defined $data{$pid};
770
+ unless (defined $data{$pid}) {
771
+ # (vsys a6l dashcam GPS record doesn't have a start indicator)
772
+ next unless $gpsPID{$pid};
773
+ $data{$pid} = '';
774
+ }
679
775
  # accumulate data for each elementary stream
680
776
  $data{$pid} .= substr($buff, $pos, $pEnd-$pos);
681
777
  }
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::Exif;
15
15
  use Image::ExifTool::GPS;
16
16
 
17
- $VERSION = '1.48';
17
+ $VERSION = '1.49';
18
18
 
19
19
  sub ProcessMIE($$);
20
20
  sub ProcessMIEGroup($$$);
@@ -1023,6 +1023,7 @@ sub WriteMIEGroup($$$)
1023
1023
  # we are writing the new tag now
1024
1024
  my ($newVal, $writable, $oldVal, $newFormat, $compress);
1025
1025
  my $newTag = shift @editTags;
1026
+ length($newTag) > 255 and $et->Warn('Tag name too long'), next; # (just to be safe)
1026
1027
  my $newInfo = $$editDirs{$newTag};
1027
1028
  if ($newInfo) {
1028
1029
  # create the new subdirectory or rewrite existing non-MIE directory
@@ -285,7 +285,7 @@ sub ProcessMRC($$)
285
285
  $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
286
286
  last if ++$i >= $$et{ImageDepth};
287
287
  unless ($$et{OPTIONS}{ExtractEmbedded}) {
288
- $et->Warn('Use the ExtractEmbedded option to read metadata for all frames',1);
288
+ $et->Warn('Use the ExtractEmbedded option to read metadata for all frames',3);
289
289
  last;
290
290
  }
291
291
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
@@ -52,7 +52,7 @@ my %mdDateInfo = (
52
52
  NOTES => q{
53
53
  MDItem tags are extracted using the "mdls" utility. They are extracted if
54
54
  any "MDItem*" tag or the MacOS group is specifically requested, or by
55
- setting the L<MDItemTags|../ExifTool.html#MDItemTags> API option to 1 or the L<RequestAll|../ExifTool.html#RequestAll> API option to 2 or
55
+ setting the API L<MDItemTags|../ExifTool.html#MDItemTags> option to 1 or the API L<RequestAll|../ExifTool.html#RequestAll> option to 2 or
56
56
  higher. Note that these tags do not necessarily reflect the current
57
57
  metadata of a file -- it may take some time for the MacOS mdworker daemon to
58
58
  index the file after a metadata change.
@@ -244,7 +244,7 @@ my %mdDateInfo = (
244
244
  NOTES => q{
245
245
  XAttr tags are extracted using the "xattr" utility. They are extracted if
246
246
  any "XAttr*" tag or the MacOS group is specifically requested, or by setting
247
- the L<XAttrTags|../ExifTool.html#XAttrTags> API option to 1 or the L<RequestAll|../ExifTool.html#RequestAll> API option to 2 or higher.
247
+ the API L<XAttrTags|../ExifTool.html#XAttrTags> option to 1 or the API L<RequestAll|../ExifTool.html#RequestAll> option to 2 or higher.
248
248
  And they are extracted by default from MacOS "._" files when reading
249
249
  these files directly.
250
250
  },
@@ -62,7 +62,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
62
62
  use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
64
 
65
- $VERSION = '3.95';
65
+ $VERSION = '4.01';
66
66
 
67
67
  sub LensIDConv($$$);
68
68
  sub ProcessNikonAVI($$$);
@@ -272,6 +272,7 @@ sub GetAFPointGrid($$;$);
272
272
  '9F 58 44 44 14 14 A1 06' => 'AF-S DX Nikkor 35mm f/1.8G', #27
273
273
  'A0 54 50 50 0C 0C A2 06' => 'AF-S Nikkor 50mm f/1.4G',
274
274
  'A1 40 18 37 2C 34 A3 06' => 'AF-S DX Nikkor 10-24mm f/3.5-4.5G ED',
275
+ 'A1 40 2D 53 2C 3C CB 86' => 'AF-P DX Nikkor 18-55mm f/3.5-5.6G', #30
275
276
  'A2 48 5C 80 24 24 A4 0E' => 'AF-S Nikkor 70-200mm f/2.8G ED VR II',
276
277
  'A3 3C 29 44 30 30 A5 0E' => 'AF-S Nikkor 16-35mm f/4G ED VR',
277
278
  'A4 54 37 37 0C 0C A6 06' => 'AF-S Nikkor 24mm f/1.4G ED',
@@ -403,6 +404,7 @@ sub GetAFPointGrid($$;$);
403
404
  '48 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
404
405
  'F0 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 EX DG Aspherical HSM',
405
406
  '96 38 1F 37 34 3C 4B 06' => 'Sigma 12-24mm F4.5-5.6 II DG HSM', #Jurgen Sahlberg
407
+ 'CA 3C 1F 37 30 30 4B 46' => 'Sigma 12-24mm F4 DG HSM | A', #github issue#101
406
408
  'C1 48 24 37 24 24 4B 46' => 'Sigma 14-24mm F2.8 DG HSM | A', #30
407
409
  '26 40 27 3F 2C 34 1C 02' => 'Sigma 15-30mm F3.5-4.5 EX DG Aspherical DF',
408
410
  '48 48 2B 44 24 30 4B 06' => 'Sigma 17-35mm F2.8-4 EX DG Aspherical HSM',
@@ -495,6 +497,7 @@ sub GetAFPointGrid($$;$);
495
497
  '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
496
498
  '02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5',
497
499
  '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
500
+ '02 3B 5C 82 30 3C 02 00' => 'Sigma Zoom-K 70-210mm F4-5.6', #30
498
501
  '26 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 DG Macro',
499
502
  '56 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 APO Macro Super II',
500
503
  'E0 3C 5C 8E 30 3C 4B 06' => 'Sigma 70-300mm F4-5.6 APO DG Macro HSM', #22
@@ -554,6 +557,7 @@ sub GetAFPointGrid($$;$);
554
557
  'F3 54 2B 50 24 24 84 0E' => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)',
555
558
  '00 3F 2D 80 2B 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)',
556
559
  '00 3F 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)',
560
+ 'EC 3E 3C 8E 2C 40 DF 0E' => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD A010', #30
557
561
  '00 40 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #NJ
558
562
  'FC 40 2D 80 2C 40 DF 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #PH (NC)
559
563
  'E6 40 2D 80 2C 40 DF 0E' => 'Tamron 18-200mm f/3.5-6.3 Di II VC (B018)', #Tanel (removed AF designation, ref 37)
@@ -595,6 +599,7 @@ sub GetAFPointGrid($$;$);
595
599
  '00 48 5C 8E 30 3C 00 06' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17NII)', #JD
596
600
  'F1 47 5C 8E 30 3C DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)',
597
601
  'CF 47 5C 8E 31 3D DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A030)', #forum9773
602
+ 'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30
598
603
  'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)',
599
604
  'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30
600
605
  '20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
@@ -612,6 +617,7 @@ sub GetAFPointGrid($$;$);
612
617
  '7A 48 1C 29 24 24 7E 06' => 'Tokina AT-X 116 PRO DX II (AF 11-16mm f/2.8)',
613
618
  '80 48 1C 29 24 24 7A 06' => 'Tokina atx-i 11-16mm F2.8 CF', #exiv2 issue 1078
614
619
  '7A 48 1C 30 24 24 7E 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)',
620
+ '8B 48 1C 30 24 24 85 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)', #forum12687
615
621
  '00 3C 1F 37 30 30 00 06' => 'Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)',
616
622
  '7A 3C 1F 37 30 30 7E 06.2' => 'Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)',
617
623
  '7A 3C 1F 3C 30 30 7E 06' => 'Tokina AT-X 12-28 PRO DX (AF 12-28mm f/4)',
@@ -718,6 +724,9 @@ sub GetAFPointGrid($$;$);
718
724
  '00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
719
725
  '00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
720
726
  '4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30
727
+ #
728
+ 'A0 56 44 44 14 14 A2 06' => 'Sony FE 35mm F1.8', #IB (Techart adapter)
729
+ 'A0 37 5C 8E 34 3C A2 06' => 'Sony FE 70-300mm F4.5-5.6 G OSS', #IB (Techart adapter)
721
730
  );
722
731
 
723
732
  # text encoding used in LocationInfo (ref PH)
@@ -4720,6 +4729,9 @@ my %nikonFocalConversions = (
4720
4729
  21 => 'Nikkor Z 50mm f/1.2 S', #IB
4721
4730
  22 => 'Nikkor Z 24-50mm f/4-6.3', #IB
4722
4731
  23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
4732
+ 24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
4733
+ 27 => 'Nikkor Z MC 50mm f/2.8', #IB
4734
+ 29 => 'Nikkor Z 28mm f/2.8', #IB
4723
4735
  },
4724
4736
  },
4725
4737
  0x36 => {
@@ -7342,7 +7354,7 @@ my %nikonFocalConversions = (
7342
7354
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
7343
7355
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7344
7356
  VARS => { ID_LABEL => 'Index' },
7345
- DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x98, 0xce31 ],
7357
+ DATAMEMBER => [ 0x04, 0x0e, 0x18, 0x38, 0x98, 0x7eff, 0xce31 ],
7346
7358
  WRITABLE => 1,
7347
7359
  FIRST_ENTRY => 0,
7348
7360
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7380,6 +7392,14 @@ my %nikonFocalConversions = (
7380
7392
  Writable => 0,
7381
7393
  Hidden => 1,
7382
7394
  },
7395
+ 0x38 => { #28
7396
+ Name => 'Offset5',
7397
+ DataMember => 'Offset5',
7398
+ Format => 'int32u',
7399
+ Writable => 0,
7400
+ Hidden => 1,
7401
+ RawConv => '$$self{Offset5} = $val || 0x10000000; undef', # (ignore if 0)
7402
+ },
7383
7403
  0x98 => {
7384
7404
  Name => 'OrientationOffset',
7385
7405
  DataMember => 'OrientationOffset',
@@ -7389,9 +7409,33 @@ my %nikonFocalConversions = (
7389
7409
  RawConv => '$$self{OrientationOffset} = $val || 0x10000000; undef', # (ignore if 0)
7390
7410
  },
7391
7411
 
7412
+ ### 0x7f00 - Offset5 info start (Z7_2 firmware 1.30)
7413
+ 0x7eff => { #28
7414
+ Name => 'Hook1',
7415
+ Hidden => 1,
7416
+ RawConv => 'undef',
7417
+ # account for variable location of Offset5 data
7418
+ Hook => '$varSize = $$self{Offset5} - 0x7f00',
7419
+ },
7420
+ 0x7fa0 => { #28
7421
+ Name => 'PortraitImpressionBalance', #will be 0 for firmware 1.21 and earlier; firmware 1.30 onward: will be set by Photo Shooting Menu entry Portrait Impression Balance
7422
+ #offset5+160; 128 is neutral; >128 increases Yellow; <128 increases Magenta; increments of 4 result from 1 full unit adjustment on the camera
7423
+ #offset5+161 129 is neutral; >129 increases Brightness; <129 decreases Brightness
7424
+ #with firmware 1.30 when 'Off' is selected in the Shooting menu, offsets 160 & 161 will contain 255. Selecting Mode 1,2, or 3 will populate offsets 160 & 161 with values in the range [116,141]
7425
+ Format => 'int8u[2]',
7426
+ Condition => '$$self{FirmwareVersion} ge "01.30"',
7427
+ PrintConv => q{
7428
+ return 'Off' if $val eq '0 0' or $val eq '255 255';
7429
+ my @v = split ' ', $val;
7430
+ my $brightness = $v[1]==128 ? 'Brightness: Neutral' : sprintf('Brightness: %+.1f',($v[1]-128)/4);
7431
+ my $color = $v[0]==128 ? 'Color: Neutral' : sprintf('%s: %.1f', $v[0]>128 ? 'Yellow' : 'Magenta', abs($v[0]-128)/4);
7432
+ # will return something like: 'Magenta: 1.0 Brightness: Neutral'
7433
+ return "$color $brightness"
7434
+ },
7435
+ },
7392
7436
  ### 0xce32 - OrientationInfo start (Z7_2 firmware 1.00)
7393
7437
  0xce31 => {
7394
- Name => 'Hook1',
7438
+ Name => 'Hook2',
7395
7439
  Hidden => 1,
7396
7440
  RawConv => 'undef',
7397
7441
  # account for variable location of OrientationInfo data
@@ -8492,8 +8536,8 @@ my %nikonFocalConversions = (
8492
8536
  # 0x02 - undef[148]
8493
8537
  # 0x03 - undef[284]
8494
8538
  # 0x04 - undef[148,212]
8495
- # 0x05 - undef[84]
8496
- # 0x06 - undef[116]
8539
+ # 0x05 - undef[84] (barrel distortion params at offsets 0x14,0x1c,0x24, ref 28)
8540
+ # 0x06 - undef[116] (vignette correction params at offsets 0x24,0x34,0x44, ref 28)
8497
8541
  # 0x07 - undef[104]
8498
8542
  # 0x08 - undef[24]
8499
8543
  # 0x09 - undef[36]
@@ -9468,7 +9512,7 @@ sub GetAFPointGrid($$;$)
9468
9512
  return undef unless $val =~ /^([A-J])(\d+)$/i;
9469
9513
  return (ord(uc($1))-65) * $ncol + $2 - 1;
9470
9514
  } else {
9471
- my $row = int(($val + 0.5) / $ncol);
9515
+ my $row = int(($val + 0.5) / $ncol) & 0xff;
9472
9516
  my $col = $val - $ncol * $row + 1;
9473
9517
  return chr(65+$row) . $col;
9474
9518
  }
@@ -17,7 +17,7 @@ use strict;
17
17
  use vars qw($VERSION);
18
18
  use Image::ExifTool qw(:DataAccess :Utils);
19
19
 
20
- $VERSION = '1.03';
20
+ $VERSION = '1.04';
21
21
 
22
22
  sub ProcessNikonSettings($$$);
23
23
 
@@ -592,7 +592,7 @@ my %infoD6 = (
592
592
  },
593
593
  },
594
594
  0x026 => { Name => 'AF-AssistIlluminator', PrintConv => \%onOff }, # CSa11 (Z7_2)
595
- # 0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa18 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens
595
+ 0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa12 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens
596
596
  0x029 => { Name => 'ISOStepSize', PrintConv => \%thirdHalfFull }, # CSb1 (D6)
597
597
  0x02a => { Name => 'ExposureControlStepSize', PrintConv => \%thirdHalfFull }, # CSb2 (D6), CSb1 (Z7_2)
598
598
  0x02b => { # CSb4 (D6), CSb2 (Z7_2)
@@ -1920,6 +1920,14 @@ my %infoD6 = (
1920
1920
  },
1921
1921
  },
1922
1922
  0x170 => { Name => 'PreferSubSelectorCenter', PrintConv => \%offOn }, # CSf13 (D6 firmware v1.2.0)
1923
+ 0x171 => { # CSb8 (D6 firmware v1.3.0)
1924
+ Name => 'KeepExposureWithTeleconverter',
1925
+ PrintConv => {
1926
+ 1 => 'Off',
1927
+ 2 => 'Shutter Speed',
1928
+ 3 => 'ISO',
1929
+ },
1930
+ },
1923
1931
  0x174 => { # CSa17-d (D6 firmware v1.2.0)
1924
1932
  Name => 'FocusPointSelectionSpeed',
1925
1933
  PrintConv => {
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
40
40
  use Image::ExifTool::Exif;
41
41
  use Image::ExifTool::APP12;
42
42
 
43
- $VERSION = '2.71';
43
+ $VERSION = '2.75';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -113,6 +113,8 @@ my %olympusLensTypes = (
113
113
  '0 34 00' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
114
114
  '0 34 10' => 'Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro', #IB
115
115
  '0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
116
+ '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB
117
+ '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
116
118
  # Sigma lenses
117
119
  '1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8
118
120
  '1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ
@@ -138,7 +140,6 @@ my %olympusLensTypes = (
138
140
  '1 15 00' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11
139
141
  '1 16 00' => 'Sigma APO 70-200mm F2.8 II EX DG Macro HSM', #11
140
142
  '1 17 00' => 'Sigma 50mm F1.4 EX DG HSM', #11
141
- '1 18 60' => 'Test',
142
143
  # Panasonic/Leica lenses
143
144
  '2 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
144
145
  '2 01 10' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16
@@ -183,6 +184,7 @@ my %olympusLensTypes = (
183
184
  '2 36 10' => 'Leica DG Elmarit 200mm F2.8 Power OIS', #IB
184
185
  '2 37 10' => 'Leica DG Vario-Elmarit 50-200mm F2.8-4 Asph. Power OIS', #IB
185
186
  '2 38 10' => 'Leica DG Vario-Summilux 10-25mm F1.7 Asph.', #IB
187
+ '2 40 10' => 'Leica DG Vario-Summilux 25-50mm F1.7 Asph.', #IB (H-X2550)
186
188
  '3 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
187
189
  '3 02 00' => 'Leica D Summilux 25mm F1.4 Asph.', #11
188
190
  # Tamron lenses
@@ -429,6 +431,7 @@ my %olympusCameraTypes = (
429
431
  S0085 => 'E-PL10', #IB
430
432
  S0089 => 'E-M5MarkIII',
431
433
  S0092 => 'E-M1MarkIII', #IB
434
+ S0093 => 'E-P7', #IB
432
435
  SR45 => 'D220',
433
436
  SR55 => 'D320L',
434
437
  SR83 => 'D340L',
@@ -3606,6 +3609,10 @@ my %indexInfo = (
3606
3609
  Format => 'string[24]',
3607
3610
  Groups => { 2 => 'Time' },
3608
3611
  },
3612
+ 0x17f => {
3613
+ Name => 'LensModel',
3614
+ Format => 'string[32]'
3615
+ },
3609
3616
  );
3610
3617
 
3611
3618
  # yet a different "thmb" atom format (PH, E-M5)