exiftool_vendored 12.42.0 → 12.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +189 -6
  3. data/bin/MANIFEST +12 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -44
  7. data/bin/config_files/acdsee.config +2 -1
  8. data/bin/config_files/frameCount.config +56 -0
  9. data/bin/config_files/tiff_version.config +1 -1
  10. data/bin/exiftool +113 -95
  11. data/bin/fmt_files/gpx.fmt +3 -0
  12. data/bin/fmt_files/gpx_wpt.fmt +3 -0
  13. data/bin/lib/Image/ExifTool/Apple.pm +16 -3
  14. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
  15. data/bin/lib/Image/ExifTool/Canon.pm +66 -37
  16. data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  17. data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  18. data/bin/lib/Image/ExifTool/DJI.pm +2 -1
  19. data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  20. data/bin/lib/Image/ExifTool/EXE.pm +9 -1
  21. data/bin/lib/Image/ExifTool/Exif.pm +17 -12
  22. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  23. data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  24. data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
  25. data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
  26. data/bin/lib/Image/ExifTool/GPS.pm +21 -1
  27. data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
  28. data/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
  29. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  30. data/bin/lib/Image/ExifTool/ID3.pm +6 -6
  31. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  32. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  33. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  34. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  35. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  36. data/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
  37. data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  38. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  39. data/bin/lib/Image/ExifTool/Nikon.pm +288 -122
  40. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  41. data/bin/lib/Image/ExifTool/Olympus.pm +3 -2
  42. data/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
  43. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  44. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  45. data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
  46. data/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
  47. data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
  48. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
  49. data/bin/lib/Image/ExifTool/README +13 -3
  50. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  51. data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  52. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  53. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  54. data/bin/lib/Image/ExifTool/Sony.pm +71 -43
  55. data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
  56. data/bin/lib/Image/ExifTool/TagLookup.pm +4737 -4517
  57. data/bin/lib/Image/ExifTool/TagNames.pod +1837 -1417
  58. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  59. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  60. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  61. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  62. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  63. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  64. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  65. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  66. data/bin/lib/Image/ExifTool/Writer.pl +13 -5
  67. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  68. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  69. data/bin/lib/Image/ExifTool.pm +111 -24
  70. data/bin/lib/Image/ExifTool.pod +83 -69
  71. data/bin/perl-Image-ExifTool.spec +43 -43
  72. data/lib/exiftool_vendored/version.rb +1 -1
  73. metadata +9 -4
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.58';
91
+ $VERSION = '4.63';
92
92
 
93
93
  # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
94
94
  # (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -480,6 +480,7 @@ $VERSION = '4.58';
480
480
  255 => 'Sigma 24-105mm f/4 DG OS HSM | A or Other Lens', #50
481
481
  255.1 => 'Sigma 180mm f/2.8 EX DG OS HSM APO Macro', #50
482
482
  255.2 => 'Tamron SP 70-200mm f/2.8 Di VC USD', #exiv issue 1202 (A009)
483
+ 255.3 => 'Yongnuo YN 50mm f/1.8', #50
483
484
  368 => 'Sigma 14-24mm f/2.8 DG HSM | A or other Sigma Lens', #IB (A018)
484
485
  368.1 => 'Sigma 20mm f/1.4 DG HSM | A', #50 (newer firmware)
485
486
  368.2 => 'Sigma 50mm f/1.4 DG HSM | A', #50
@@ -493,6 +494,7 @@ $VERSION = '4.58';
493
494
  '368.10' => 'Sigma 35mm f/1.4 DG HSM | A', #PH (012)
494
495
  '368.11' => 'Sigma 70mm f/2.8 DG Macro', #IB (A018)
495
496
  '368.12' => 'Sigma 18-35mm f/1.8 DC HSM | A', #50
497
+ '368.13' => 'Sigma 24-105mm f/4 DG OS HSM | A', #forum3833
496
498
  # Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings
497
499
  488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH
498
500
  489 => 'Canon EF 70-300mm f/4-5.6L IS USM', #Gerald Kapounek
@@ -597,21 +599,30 @@ $VERSION = '4.58';
597
599
  '61182.19' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
598
600
  '61182.20' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
599
601
  '61182.21' => 'Canon RF 70-200mm F4L IS USM', #42
600
- '61182.22' => 'Canon RF 50mm F1.8 STM', #42
601
- '61182.23' => 'Canon RF 14-35mm F4L IS USM', #IB
602
- '61182.24' => 'Canon RF 100-400mm F5.6-8 IS USM', #42
603
- '61182.25' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
604
- '61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
605
- '61182.27' => 'Canon RF 16mm F2.8 STM', #42
606
- '61182.28' => 'Canon RF 400mm F2.8L IS USM', #IB
607
- '61182.29' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
608
- '61182.30' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
609
- '61182.31' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
610
- # we need the RFLensType values for the following...
611
- '61182.32' => 'Canon RF 800mm F5.6L IS USM', #PH (NC)
612
- '61182.33' => 'Canon RF 1200mm F8L IS USM', #PH (NC)
613
- '61182.34' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
614
- '61182.35' => 'Canon RF 100mm F2.8L MACRO IS USM', #(NC)
602
+ '61182.22' => 'Canon RF 100mm F2.8L MACRO IS USM', #42
603
+ '61182.23' => 'Canon RF 50mm F1.8 STM', #42
604
+ '61182.24' => 'Canon RF 14-35mm F4L IS USM', #IB
605
+ '61182.25' => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42
606
+ '61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM', #42
607
+ '61182.27' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42
608
+ '61182.28' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42
609
+ '61182.29' => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
610
+ '61182.30' => 'Canon RF 24mm F1.8 MACRO IS STM', #42
611
+ '61182.31' => 'Canon RF 16mm F2.8 STM', #42
612
+ '61182.32' => 'Canon RF 400mm F2.8L IS USM', #IB
613
+ '61182.33' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
614
+ '61182.34' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
615
+ '61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
616
+ '61182.36' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
617
+ '61182.37' => 'Canon RF 800mm F5.6L IS USM', #42
618
+ '61182.38' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
619
+ '61182.39' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
620
+ '61182.40' => 'Canon RF 1200mm F8L IS USM', #42
621
+ '61182.41' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
622
+ '61182.42' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
623
+ '61182.43' => 'Canon RF 135mm F1.8 L IS USM', #42
624
+ # we need the RFLensType values for the following...
625
+ '61182.44' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
615
626
  65535 => 'n/a',
616
627
  );
617
628
 
@@ -968,8 +979,11 @@ $VERSION = '4.58';
968
979
  0x80000437 => 'EOS 90D', #IB
969
980
  0x80000450 => 'EOS R3', #42
970
981
  0x80000453 => 'EOS R6', #PH
982
+ 0x80000464 => 'EOS R7', #42
983
+ 0x80000465 => 'EOS R10', #42
971
984
  0x80000467 => 'PowerShot ZOOM',
972
985
  0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
986
+ 0x80000481 => 'EOS R6 Mark II', #42
973
987
  0x80000520 => 'EOS D2000C', #IB
974
988
  0x80000560 => 'EOS D6000C', #PH (guess)
975
989
  );
@@ -1932,7 +1946,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1932
1946
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData10' },
1933
1947
  },
1934
1948
  { # (int16u[3973]) - R3 ref IB
1935
- Condition => '$count == 3973',
1949
+ Condition => '$count == 3973 or $count == 3778',
1936
1950
  Name => 'ColorData11',
1937
1951
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' },
1938
1952
  },
@@ -6365,10 +6379,11 @@ my %ciMaxFocal = (
6365
6379
  1 => {
6366
6380
  Name => 'TimeZone',
6367
6381
  PrintConv => 'Image::ExifTool::TimeZoneString($val)',
6368
- PrintConvInv => sub {
6369
- my $val = shift;
6370
- $val =~ /^([-+]?)(\d{1,2}):?(\d{2})$/ or return undef;
6371
- return(($1 eq '-' ? -1 : 1) * ($2 * 60 + $3));
6382
+ PrintConvInv => q{
6383
+ $val =~ /Z$/ and return 0;
6384
+ $val =~ /([-+])(\d{1,2}):?(\d{2})$/ and return $1 . ($2 * 60 + $3);
6385
+ $val =~ /^(\d{2})(\d{2})$/ and return $1 * 60 + $2;
6386
+ return undef;
6372
6387
  },
6373
6388
  },
6374
6389
  2 => {
@@ -6530,23 +6545,23 @@ my %ciMaxFocal = (
6530
6545
  0x02 => 'FacesDetected',
6531
6546
  );
6532
6547
 
6533
- # G9 white balance information (MakerNotes tag 0x29) (ref IB)
6548
+ # G9 white balance information (MakerNotes tag 0x29) (ref IB, changed ref forum13640)
6534
6549
  %Image::ExifTool::Canon::WBInfo = (
6535
6550
  %binaryDataAttrs,
6536
6551
  NOTES => 'WB tags for the Canon G9.',
6537
6552
  FORMAT => 'int32u',
6538
6553
  FIRST_ENTRY => 1,
6539
6554
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
6540
- 0x02 => { Name => 'WB_GRGBLevelsAuto', Format => 'int32s[4]' },
6541
- 0x0a => { Name => 'WB_GRGBLevelsDaylight', Format => 'int32s[4]' },
6542
- 0x12 => { Name => 'WB_GRGBLevelsCloudy', Format => 'int32s[4]' },
6543
- 0x1a => { Name => 'WB_GRGBLevelsTungsten', Format => 'int32s[4]' },
6544
- 0x22 => { Name => 'WB_GRGBLevelsFluorescent', Format => 'int32s[4]' },
6545
- 0x2a => { Name => 'WB_GRGBLevelsFluorHigh', Format => 'int32s[4]' },
6546
- 0x32 => { Name => 'WB_GRGBLevelsFlash', Format => 'int32s[4]' },
6547
- 0x3a => { Name => 'WB_GRGBLevelsUnderwater', Format => 'int32s[4]' },
6548
- 0x42 => { Name => 'WB_GRGBLevelsCustom1', Format => 'int32s[4]' },
6549
- 0x4a => { Name => 'WB_GRGBLevelsCustom2', Format => 'int32s[4]' },
6555
+ 0x02 => { Name => 'WB_GRBGLevelsAuto', Format => 'int32s[4]' },
6556
+ 0x0a => { Name => 'WB_GRBGLevelsDaylight', Format => 'int32s[4]' },
6557
+ 0x12 => { Name => 'WB_GRBGLevelsCloudy', Format => 'int32s[4]' },
6558
+ 0x1a => { Name => 'WB_GRBGLevelsTungsten', Format => 'int32s[4]' },
6559
+ 0x22 => { Name => 'WB_GRBGLevelsFluorescent', Format => 'int32s[4]' },
6560
+ 0x2a => { Name => 'WB_GRBGLevelsFluorHigh', Format => 'int32s[4]' },
6561
+ 0x32 => { Name => 'WB_GRBGLevelsFlash', Format => 'int32s[4]' },
6562
+ 0x3a => { Name => 'WB_GRBGLevelsUnderwater', Format => 'int32s[4]' },
6563
+ 0x42 => { Name => 'WB_GRBGLevelsCustom1', Format => 'int32s[4]' },
6564
+ 0x4a => { Name => 'WB_GRBGLevelsCustom2', Format => 'int32s[4]' },
6550
6565
  );
6551
6566
 
6552
6567
  # yet more face detect information (MakerNotes tag 0x2f) - PH (G12)
@@ -6803,17 +6818,28 @@ my %ciMaxFocal = (
6803
6818
  276 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
6804
6819
  277 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
6805
6820
  278 => 'Canon RF 70-200mm F4L IS USM', #42
6821
+ 279 => 'Canon RF 100mm F2.8L MACRO IS USM', #42
6806
6822
  280 => 'Canon RF 50mm F1.8 STM', #42
6807
6823
  281 => 'Canon RF 14-35mm F4L IS USM', #42/IB
6824
+ 282 => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42
6808
6825
  283 => 'Canon RF 100-400mm F5.6-8 IS USM', #42
6809
- 284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
6810
- 285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
6826
+ 284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42
6827
+ 285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42
6828
+ 286 => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
6829
+ 287 => 'Canon RF 24mm F1.8 MACRO IS STM', #42
6811
6830
  288 => 'Canon RF 16mm F2.8 STM', #42
6812
6831
  289 => 'Canon RF 400mm F2.8L IS USM', #IB
6813
6832
  290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
6814
6833
  291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
6815
6834
  292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
6816
- #xxx => 'Canon RF 100mm F2.8L MACRO IS USM',
6835
+ 295 => 'Canon RF 800mm F5.6L IS USM', #42
6836
+ 296 => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
6837
+ 297 => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
6838
+ 298 => 'Canon RF 1200mm F8L IS USM', #42
6839
+ 299 => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
6840
+ 300 => 'Canon RF 1200mm F8L IS USM + RF2x', #42
6841
+ 302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
6842
+ 303 => 'Canon RF 135mm F1.8 L IS USM', #42
6817
6843
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6818
6844
  },
6819
6845
  },
@@ -6858,6 +6884,7 @@ my %ciMaxFocal = (
6858
6884
  8 => '4:5',
6859
6885
  12 => '3:2 (APS-H crop)', #IB
6860
6886
  13 => '3:2 (APS-C crop)', #IB
6887
+ 258 => '4:3 crop', #PH (NC)
6861
6888
  },
6862
6889
  },
6863
6890
  # (could use better names for these, or the Crop tags above, or both)
@@ -8310,7 +8337,7 @@ my %ciMaxFocal = (
8310
8337
  # Color data (MakerNotes tag 0x4001, count=3973, ref IB)
8311
8338
  %Image::ExifTool::Canon::ColorData11 = (
8312
8339
  %binaryDataAttrs,
8313
- NOTES => 'These tags are used by the EOS R3',
8340
+ NOTES => 'These tags are used by the EOS R3, R7 and R6mkII',
8314
8341
  FORMAT => 'int16s',
8315
8342
  FIRST_ENTRY => 0,
8316
8343
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -8322,6 +8349,7 @@ my %ciMaxFocal = (
8322
8349
  RawConv => '$$self{ColorDataVersion} = $val',
8323
8350
  PrintConv => {
8324
8351
  34 => '34 (R3)', #IB
8352
+ 48 => '48 (R7, R10, R6 Mark II)', #IB
8325
8353
  },
8326
8354
  },
8327
8355
  0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
@@ -9387,8 +9415,9 @@ my %filterConv = (
9387
9415
  # numbers from the previous image, so we need special logic
9388
9416
  # to handle the FileIndex wrap properly)
9389
9417
  $val[1] == 10000 and $val[1] = 1, ++$val[0];
9390
- return sprintf("%.3d-%.4d",@val);
9418
+ return sprintf("%.3d%.4d",@val);
9391
9419
  },
9420
+ PrintConv => '$_=$val;s/(\d+)(\d{4})/$1-$2/;$_',
9392
9421
  },
9393
9422
  );
9394
9423
 
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::Exif;
22
22
  use Image::ExifTool::Canon;
23
23
 
24
- $VERSION = '1.58';
24
+ $VERSION = '1.59';
25
25
 
26
26
  sub WriteCRW($$);
27
27
  sub ProcessCanonRaw($$$);
@@ -625,6 +625,13 @@ sub ProcessCanonRaw($$$)
625
625
  $raf->Seek($blockStart+$blockSize-4, 0) or return 0;
626
626
  $raf->Read($buff, 4) == 4 or return 0;
627
627
  my $dirOffset = Get32u(\$buff,0) + $blockStart;
628
+ # avoid infinite recursion
629
+ $$et{ProcessedCanonRaw} or $$et{ProcessedCanonRaw} = { };
630
+ if ($$et{ProcessedCanonRaw}{$dirOffset}) {
631
+ $et->Warn("Not processing double-referenced $$dirInfo{DirName} directory");
632
+ return 0;
633
+ }
634
+ $$et{ProcessedCanonRaw}{$dirOffset} = 1;
628
635
  $raf->Seek($dirOffset, 0) or return 0;
629
636
  $raf->Read($buff, 2) == 2 or return 0;
630
637
  my $entries = Get16u(\$buff,0); # get number of entries in directory
@@ -23,7 +23,7 @@ use vars qw($VERSION);
23
23
  use Image::ExifTool qw(:DataAccess :Utils);
24
24
  use Image::ExifTool::Canon;
25
25
 
26
- $VERSION = '1.33';
26
+ $VERSION = '1.34';
27
27
 
28
28
  sub ProcessCanonVRD($$;$);
29
29
  sub WriteCanonVRD($$;$);
@@ -2046,17 +2046,16 @@ sub ProcessCanonVRD($$;$)
2046
2046
  return 0;
2047
2047
  }
2048
2048
  }
2049
- # exit quickly if writing and no CanonVRD tags are being edited
2050
- if ($outfile and not exists $$et{EDIT_DIRS}{CanonVRD}) {
2051
- print $out "$$et{INDENT} [nothing changed]\n" if $verbose;
2052
- return 1 if $outfile eq $dataPt;
2053
- return Write($outfile, $$dataPt) ? 1 : -1;
2054
- }
2055
-
2056
2049
  my $vrdType = 'VRD';
2057
2050
 
2058
2051
  if ($outfile) {
2059
2052
  $verbose and not $created and print $out " Rewriting CanonVRD trailer\n";
2053
+ # exit quickly if writing and no CanonVRD tags are being edited
2054
+ unless (exists $$et{EDIT_DIRS}{CanonVRD}) {
2055
+ print $out "$$et{INDENT} [nothing changed in CanonVRD]\n" if $verbose;
2056
+ return 1 if $outfile eq $dataPt;
2057
+ return Write($outfile, $$dataPt) ? 1 : -1;
2058
+ }
2060
2059
  # delete CanonVRD information if specified
2061
2060
  my $doDel = $$et{DEL_GROUP}{CanonVRD};
2062
2061
  unless ($doDel) {
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
16
16
  use Image::ExifTool::XMP;
17
17
  use Image::ExifTool::GPS;
18
18
 
19
- $VERSION = '1.05';
19
+ $VERSION = '1.06';
20
20
 
21
21
  sub ProcessDJIInfo($$$);
22
22
 
@@ -176,6 +176,7 @@ sub ProcessDJIInfo($$$)
176
176
  }
177
177
  while ($$dataPt =~ /\G\[(.*?)\](?=(\[|$))/sg) {
178
178
  my ($tag, $val) = split /:/, $1, 2;
179
+ next unless defined $tag and defined $val;
179
180
  if ($val =~ /^([\x20-\x7f]+)\0*$/) {
180
181
  $val = $1;
181
182
  } else {
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool::XMP;
17
17
 
18
- $VERSION = '1.06';
18
+ $VERSION = '1.07';
19
19
 
20
20
  my %dateTimeInfo = (
21
21
  # NOTE: Do NOT put "Groups" here because Groups hash must not be common!
@@ -138,6 +138,9 @@ my %event = (
138
138
  identificationVerificationStatus => { },
139
139
  identifiedBy => { },
140
140
  typeStatus => { },
141
+ # new, ref forum13707
142
+ identifiedByID => { },
143
+ verbatimIdentification => { },
141
144
  },
142
145
  },
143
146
  LivingSpecimen => { Struct => \%materialSample },
@@ -189,6 +192,11 @@ my %event = (
189
192
  recordNumber => { },
190
193
  reproductiveCondition => { },
191
194
  sex => { },
195
+ # new, ref forum13707
196
+ degreeOfEstablishment => { },
197
+ georeferenceVerificationStatus => { },
198
+ pathway => { },
199
+ recordedByID => { },
192
200
  },
193
201
  },
194
202
  OccurrenceOccurrenceDetails => { Name => 'OccurrenceDetails', Flat => 1 },
@@ -242,6 +250,7 @@ my %event = (
242
250
  relationshipRemarks => { },
243
251
  resourceID => { },
244
252
  resourceRelationshipID => { },
253
+ relationshipOfResourceID => { }, # new, ref forum13707
245
254
  },
246
255
  },
247
256
  Taxon => {
@@ -255,6 +264,7 @@ my %event = (
255
264
  genus => { },
256
265
  higherClassification => { },
257
266
  infraspecificEpithet => { },
267
+ cultivarEpithet => { }, # new, ref forum13707
258
268
  kingdom => { },
259
269
  nameAccordingTo => { },
260
270
  nameAccordingToID => { },
@@ -338,6 +348,8 @@ my %event = (
338
348
  verbatimLongitude => { },
339
349
  verbatimSRS => { },
340
350
  waterBody => { },
351
+ # new, ref forum13707
352
+ verticalDatum => { },
341
353
  },
342
354
  },
343
355
  );
@@ -21,7 +21,7 @@ use strict;
21
21
  use vars qw($VERSION);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
 
24
- $VERSION = '1.17';
24
+ $VERSION = '1.18';
25
25
 
26
26
  sub ProcessPEResources($$);
27
27
  sub ProcessPEVersion($$);
@@ -1233,6 +1233,14 @@ sub ProcessEXE($$)
1233
1233
  $tagTablePtr = GetTagTable('Image::ExifTool::EXE::MachO');
1234
1234
  if ($1 eq "\xca\xfe\xba\xbe") {
1235
1235
  SetByteOrder('MM');
1236
+ my $ver = Get32u(\$buff, 4);
1237
+ # Java bytecode .class files have the same magic number, so we need to look deeper
1238
+ # (ref https://github.com/file/file/blob/master/magic/Magdir/cafebabe#L6-L15)
1239
+ if ($ver > 30) {
1240
+ # this is Java bytecode
1241
+ $et->SetFileType('Java bytecode', 'application/java-byte-code', 'class');
1242
+ return 1;
1243
+ }
1236
1244
  $et->SetFileType('Mach-O fat binary executable', undef, '');
1237
1245
  return 1 if $fast3;
1238
1246
  my $count = Get32u(\$buff, 4); # get architecture count
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
56
56
  use Image::ExifTool qw(:DataAccess :Utils);
57
57
  use Image::ExifTool::MakerNotes;
58
58
 
59
- $VERSION = '4.40';
59
+ $VERSION = '4.42';
60
60
 
61
61
  sub ProcessExif($$$);
62
62
  sub WriteExif($$$);
@@ -1084,11 +1084,11 @@ my %opcodeInfo = (
1084
1084
  {
1085
1085
  Name => 'ThumbnailOffset',
1086
1086
  Notes => q{
1087
- ThumbnailOffset in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
1088
- images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
1089
- PreviewImageStart in MakerNotes and IFD0 of ARW and SR2 images;
1090
- JpgFromRawStart in SubIFD of NEF images and IFD2 of PEF images; and
1091
- OtherImageStart in everything else
1087
+ called JPEGInterchangeFormat in the specification, this is ThumbnailOffset
1088
+ in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW images and AVI and
1089
+ MOV videos, and the SubIFD in IFD1 of SRW images; PreviewImageStart in
1090
+ MakerNotes and IFD0 of ARW and SR2 images; JpgFromRawStart in SubIFD of NEF
1091
+ images and IFD2 of PEF images; and OtherImageStart in everything else
1092
1092
  },
1093
1093
  # thumbnail is found in IFD1 of JPEG and TIFF images, and
1094
1094
  # IFD0 of EXIF information in FujiFilm AVI (RIFF) and MOV videos
@@ -1225,6 +1225,7 @@ my %opcodeInfo = (
1225
1225
  {
1226
1226
  Name => 'ThumbnailLength',
1227
1227
  Notes => q{
1228
+ called JPEGInterchangeFormatLength in the specification, this is
1228
1229
  ThumbnailLength in IFD1 of JPEG and some TIFF-based images, IFD0 of MRW
1229
1230
  images and AVI and MOV videos, and the SubIFD in IFD1 of SRW images;
1230
1231
  PreviewImageLength in MakerNotes and IFD0 of ARW and SR2 images;
@@ -2080,6 +2081,7 @@ my %opcodeInfo = (
2080
2081
  Groups => { 2 => 'Time' },
2081
2082
  Notes => 'time zone for ModifyDate',
2082
2083
  Writable => 'string',
2084
+ Shift => 'Time',
2083
2085
  PrintConvInv => q{
2084
2086
  return "+00:00" if $val =~ /\d{2}Z$/;
2085
2087
  return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/;
@@ -2091,6 +2093,7 @@ my %opcodeInfo = (
2091
2093
  Groups => { 2 => 'Time' },
2092
2094
  Notes => 'time zone for DateTimeOriginal',
2093
2095
  Writable => 'string',
2096
+ Shift => 'Time',
2094
2097
  PrintConvInv => q{
2095
2098
  return "+00:00" if $val =~ /\d{2}Z$/;
2096
2099
  return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/;
@@ -2102,6 +2105,7 @@ my %opcodeInfo = (
2102
2105
  Groups => { 2 => 'Time' },
2103
2106
  Notes => 'time zone for CreateDate',
2104
2107
  Writable => 'string',
2108
+ Shift => 'Time',
2105
2109
  PrintConvInv => q{
2106
2110
  return "+00:00" if $val =~ /\d{2}Z$/;
2107
2111
  return sprintf("%s%.2d:%.2d",$1,$2,$3) if $val =~ /([-+])(\d{1,2}):(\d{2})/;
@@ -4080,7 +4084,7 @@ my %opcodeInfo = (
4080
4084
  WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
4081
4085
  },
4082
4086
  0xcd30 => { # DNG 1.6
4083
- Name => 'SemanticInstanceIFD',
4087
+ Name => 'SemanticInstanceID',
4084
4088
  # Writable => 'string',
4085
4089
  WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
4086
4090
  },
@@ -4842,10 +4846,10 @@ my %subSecConv = (
4842
4846
  Writable => 1,
4843
4847
  Protected => 1,
4844
4848
  WriteAlso => {
4845
- GPSLatitude => '$val =~ /(.*?)( ?[NS])?,/ ? $1 : undef',
4846
- GPSLatitudeRef => '$val =~ /(-?)(.*?) ?([NS]?),/ ? ($3 || ($1 ? "S" : "N")) : undef',
4847
- GPSLongitude => '$val =~ /, ?(.*?)( ?[EW]?)$/ ? $1 : undef',
4848
- GPSLongitudeRef => '$val =~ /, ?(-?)(.*?) ?([EW]?)$/ ? ($3 || ($1 ? "W" : "E")) : undef',
4849
+ GPSLatitude => '(defined $val and $val =~ /(.*?)( ?[NS])?,/) ? $1 : undef',
4850
+ GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?) ?([NS]?),/) ? ($3 || ($1 ? "S" : "N")) : undef',
4851
+ GPSLongitude => '(defined $val and $val =~ /, ?(.*?)( ?[EW]?)$/) ? $1 : undef',
4852
+ GPSLongitudeRef => '(defined $val and $val =~ /, ?(-?)(.*?) ?([EW]?)$/) ? ($3 || ($1 ? "W" : "E")) : undef',
4849
4853
  },
4850
4854
  PrintConvInv => q{
4851
4855
  return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
@@ -6012,7 +6016,8 @@ sub ProcessExif($$$)
6012
6016
  my $tagID = Get16u($dataPt, $entry);
6013
6017
  my $format = Get16u($dataPt, $entry+2);
6014
6018
  my $count = Get32u($dataPt, $entry+4);
6015
- if ($format < 1 or $format > 13) {
6019
+ # (Apple uses the BigTIFF format code 16 in the maker notes of their ProRaw DNG files)
6020
+ if (($format < 1 or $format > 13) and not ($format == 16 and $$et{Make} eq 'Apple' and $inMakerNotes)) {
6016
6021
  if ($mapFmt and $$mapFmt{$format}) {
6017
6022
  $format = $$mapFmt{$format};
6018
6023
  } else {
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.08';
17
+ $VERSION = '1.09';
18
18
 
19
19
  sub ProcessBitStream($$$);
20
20
 
@@ -29,7 +29,19 @@ sub ProcessBitStream($$$);
29
29
  SubDirectory => { TagTable => 'Image::ExifTool::FLAC::StreamInfo' },
30
30
  },
31
31
  1 => { Name => 'Padding', Binary => 1, Unknown => 1 },
32
- 2 => { Name => 'Application', Binary => 1, Unknown => 1 },
32
+ 2 => [{ # (see forum14064)
33
+ Name => 'Application_riff',
34
+ Condition => '$$valPt =~ /^riff(?!RIFF)/', # (all "riff" blocks but header)
35
+ SubDirectory => {
36
+ TagTable => 'Image::ExifTool::RIFF::Main',
37
+ ByteOrder => 'LittleEndian',
38
+ Start => 4,
39
+ },
40
+ },{
41
+ Name => 'ApplicationUnknown',
42
+ Binary => 1,
43
+ Unknown => 1,
44
+ }],
33
45
  3 => { Name => 'SeekTable', Binary => 1, Unknown => 1 },
34
46
  4 => {
35
47
  Name => 'VorbisComment',
@@ -255,9 +267,11 @@ sub ProcessFLAC($$)
255
267
  print $out "FLAC metadata block, type $tag:\n";
256
268
  $et->VerboseDump(\$buff, DataPos => $raf->Tell() - $size);
257
269
  }
258
- $et->HandleTag($tagTablePtr, $tag, undef,
270
+ $et->HandleTag($tagTablePtr, $tag, $buff,
259
271
  DataPt => \$buff,
260
272
  DataPos => $raf->Tell() - $size,
273
+ Start => 0,
274
+ Size => $size,
261
275
  );
262
276
  last if $last; # all done if is set
263
277
  }
@@ -24,7 +24,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
24
24
  use Image::ExifTool::Exif;
25
25
  use Image::ExifTool::GPS;
26
26
 
27
- $VERSION = '1.20';
27
+ $VERSION = '1.21';
28
28
 
29
29
  sub ProcessFLIR($$;$);
30
30
  sub ProcessFLIRText($$$);
@@ -99,7 +99,8 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
99
99
  NOTES => q{
100
100
  Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
101
101
  images. These tags may also be extracted from the first frame of an FLIR
102
- SEQ file, or all frames if the ExtractEmbedded option is used.
102
+ SEQ file, or all frames if the ExtractEmbedded option is used. Setting
103
+ ExtractEmbedded to 2 also the raw thermal data from all frames.
103
104
  },
104
105
  "_header" => {
105
106
  Name => 'FFFHeader',
@@ -1551,7 +1552,7 @@ sub ProcessFLIR($$;$)
1551
1552
  $$et{INDENT}, $i, $recType, $recPos, $recLen;
1552
1553
 
1553
1554
  # skip RawData records for embedded documents
1554
- if ($recType == 1 and $$et{DOC_NUM}) {
1555
+ if ($recType == 1 and $$et{DOC_NUM} and $et->Options('ExtractEmbedded') < 2) {
1555
1556
  $raf->Seek($base+$recPos+$recLen) or $success = 0, last;
1556
1557
  next;
1557
1558
  }
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::Exif;
22
22
  use Image::ExifTool::ASF; # for GetGUID()
23
23
 
24
- $VERSION = '1.39';
24
+ $VERSION = '1.41';
25
25
 
26
26
  sub ProcessFPX($$);
27
27
  sub ProcessFPXR($$$);
@@ -298,6 +298,7 @@ my %fpxFileType = (
298
298
  %Image::ExifTool::FlashPix::Main = (
299
299
  PROCESS_PROC => \&ProcessFPXR,
300
300
  GROUPS => { 2 => 'Image' },
301
+ VARS => { LONG_TAGS => 0 },
301
302
  NOTES => q{
302
303
  The FlashPix file format, introduced in 1996, was developed by Kodak,
303
304
  Hewlett-Packard and Microsoft. Internally the FPX file structure mimics
@@ -467,6 +468,25 @@ my %fpxFileType = (
467
468
  ByteOrder => 'BigEndian',
468
469
  },
469
470
  },
471
+ # recognize Autodesk Revit files by looking at BasicFileInfo
472
+ # (but don't yet support reading their metatdata)
473
+ BasicFileInfo => {
474
+ Name => 'BasicFileInfo',
475
+ Binary => 1,
476
+ RawConv => q{
477
+ $val =~ tr/\0//d; # brute force conversion to ASCII
478
+ if ($val =~ /\.(rfa|rft|rte|rvt)/) {
479
+ $self->OverrideFileType(uc($1), "application/$1", $1);
480
+ }
481
+ return $val;
482
+ },
483
+ },
484
+ IeImg => {
485
+ Name => 'EmbeddedImage',
486
+ Notes => 'embedded images in Scene7 vignette VNT files',
487
+ Groups => { 2 => 'Preview' },
488
+ Binary => 1,
489
+ },
470
490
  );
471
491
 
472
492
  # Summary Information properties
@@ -1318,7 +1338,9 @@ sub ConvertDTTM($)
1318
1338
  my $hr = ($val >> 6) & 0x1f;
1319
1339
  my $min = ($val & 0x3f);
1320
1340
  $yr += 1900 if $val;
1321
- return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:00%s",$yr,$mon,$day,$hr,$min,$val ? 'Z' : '');
1341
+ # ExifTool 12.48 dropped the "Z" on the time here because a test .doc
1342
+ # file written by Word 2011 on Mac certainly used local time here
1343
+ return sprintf("%.4d:%.2d:%.2d %.2d:%.2d:00",$yr,$mon,$day,$hr,$min);
1322
1344
  }
1323
1345
 
1324
1346
  #------------------------------------------------------------------------------
@@ -2242,7 +2264,8 @@ sub ProcessFPX($$)
2242
2264
  # remove instance number or class ID from tag if necessary
2243
2265
  $tagInfo = $et->GetTagInfo($tagTablePtr, $1) if
2244
2266
  ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
2245
- ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
2267
+ ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1}) or
2268
+ ($tag =~ /(.*)_[0-9]{4}$/s and $$tagTablePtr{$1}); # IeImg instances
2246
2269
  }
2247
2270
 
2248
2271
  my $lSib = Get32u(\$dir, $pos + 0x44); # left sibling