exiftool-vendored.pl 12.41.0 → 12.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/bin/Changes +60 -1
  2. package/bin/META.json +1 -1
  3. package/bin/META.yml +1 -1
  4. package/bin/README +2 -2
  5. package/bin/exiftool +5 -4
  6. package/bin/lib/Image/ExifTool/Apple.pm +11 -2
  7. package/bin/lib/Image/ExifTool/Canon.pm +39 -24
  8. package/bin/lib/Image/ExifTool/DJI.pm +60 -1
  9. package/bin/lib/Image/ExifTool/DNG.pm +8 -2
  10. package/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  11. package/bin/lib/Image/ExifTool/Exif.pm +9 -0
  12. package/bin/lib/Image/ExifTool/FlashPix.pm +23 -2
  13. package/bin/lib/Image/ExifTool/FujiFilm.pm +23 -2
  14. package/bin/lib/Image/ExifTool/GPS.pm +21 -1
  15. package/bin/lib/Image/ExifTool/Geotag.pm +24 -4
  16. package/bin/lib/Image/ExifTool/ICC_Profile.pm +10 -8
  17. package/bin/lib/Image/ExifTool/ID3.pm +5 -5
  18. package/bin/lib/Image/ExifTool/LNK.pm +5 -2
  19. package/bin/lib/Image/ExifTool/MakerNotes.pm +5 -0
  20. package/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  21. package/bin/lib/Image/ExifTool/Nikon.pm +84 -29
  22. package/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
  23. package/bin/lib/Image/ExifTool/Olympus.pm +21 -2
  24. package/bin/lib/Image/ExifTool/PDF.pm +2 -1
  25. package/bin/lib/Image/ExifTool/Panasonic.pm +10 -1
  26. package/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  27. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  28. package/bin/lib/Image/ExifTool/Photoshop.pm +6 -5
  29. package/bin/lib/Image/ExifTool/QuickTime.pm +7 -1
  30. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +41 -6
  31. package/bin/lib/Image/ExifTool/README +8 -2
  32. package/bin/lib/Image/ExifTool/Samsung.pm +233 -2
  33. package/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  34. package/bin/lib/Image/ExifTool/Sony.pm +36 -28
  35. package/bin/lib/Image/ExifTool/TagLookup.pm +2528 -2483
  36. package/bin/lib/Image/ExifTool/TagNames.pod +192 -97
  37. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  38. package/bin/lib/Image/ExifTool/Writer.pl +4 -3
  39. package/bin/lib/Image/ExifTool.pm +40 -16
  40. package/bin/lib/Image/ExifTool.pod +13 -4
  41. package/bin/perl-Image-ExifTool.spec +1 -1
  42. package/bin/pp_build_exe.args +4 -4
  43. package/package.json +3 -3
package/bin/Changes CHANGED
@@ -4,9 +4,67 @@ ExifTool Version History
4
4
 
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
- Note: The most recent production release is Version 12.30. (Other versions are
7
+ Note: The most recent production release is Version 12.42. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ July 21, 2022 - Version 12.44
11
+
12
+ - Added a few new Sony lenses (thanks Jos Roost)
13
+ - Decode Accelerometer and Gyroscope data from ARCore videos
14
+ - Decode a couple of new Motorola tags (thanks Neal Krawetz)
15
+ - Decode FujiFilm FirmwareVersion (thanks Justin Arkinson)
16
+ - Decode MetaType for timed metadata in videos
17
+ - Decode a number of new Nikon Z tags (thanks Warren Hatch)
18
+ - Extract more types of embedded images from FlashPix-format files
19
+ - Made Composite GPSLatitude and GPSLongitude writable for setting GPS
20
+ coordinates and reference directions with one assignment
21
+ - Fixed bug introduced in 12.39 which broke extraction of timed GPS from some
22
+ INNOVV videos
23
+ - Fixed bug introduced in 12.43 which broke extraction of timed GPSDateTime
24
+ from Insta360 videos
25
+
26
+ July 6, 2022 - Version 12.43
27
+
28
+ - Added the ability to geotag from Google Takeout JSON files
29
+ - Added a few new Canon RF LensType values and a couple of new CanonModelID's
30
+ (thanks Norbert Wasser)
31
+ - Added new values to a couple of FujiFilm tags (thanks Greybeard)
32
+ - Added a new Nikon LensID (thanks BertJan Bakker)
33
+ - Recognize Autodesk Revit files (but don't yet support reading metadata)
34
+ - Decode DriveSerialNumber from LNK files (github #145)
35
+ - Decode Apple FocusDistanceRange (thanks Neal Krawetz)
36
+ - Made a number of Sony SR2SubIFD tags writable
37
+ - Tolerate dashes instead of colons as date separators in -geotag CSV files
38
+ - Patched to read new format accelerometer data from Insta360 files
39
+ - Patched to avoid outputting some Unknown tags when the -validate option is
40
+ used after a previously -execute'd command used the -u option
41
+ - Fixed names of Canon G9 WB levels tags (changed from GRGB to GRBG) (thanks
42
+ Christoph)
43
+ - Fixed typo in new Olympus AISubjectTrackingMode value
44
+ - Fixed "use of undefined value" warning when reading DJI metadata
45
+ - API Changes:
46
+ - Added IgnoreTags option
47
+
48
+ June 1, 2022 - Version 12.42 (production release)
49
+
50
+ - Added support for reading maker notes from Panasonic DC-GH6 videos
51
+ - Added conversion for Samsung MCCData
52
+ - Added a new Nikon LensID (thanks Chris)
53
+ - Added a few new Canon LensType values
54
+ - Added a couple of new Olympus StackedImage values (thanks Eberhard)
55
+ - Added a few new values for some Nikon Settings tags (thanks Warren Hatch)
56
+ - Added a "lang:" element to the -json output for alternate language tags when
57
+ -D, -H or -t is used
58
+ - Update DNG writer to not issue an error when writing DNG 1.6 files
59
+ - Decode information from DJI "ae_dbg_info" maker notes
60
+ - Decode Olympus AISubjectTrackingMode
61
+ - Changed ExifTool FileSize print conversion to use kB/MB/GB units instead of
62
+ KiB/MiB/GiB
63
+ - Changed "is not shiftable" warning to appear in -v (instead of just -v3)
64
+ output
65
+ - Patched to allow PDF Encrypt object to be "null"
66
+ - Fixed bug reading ICC_Profile 'meta' tags
67
+
10
68
  Apr. 7, 2022 - Version 12.41
11
69
 
12
70
  - Added support for "OM SYSTEM" maker notes
@@ -57,6 +115,7 @@ Jan. 13, 2022 - Version 12.39
57
115
  - Added a new Pentax LensType (thanks Christian Shulz)
58
116
  - Added a couple of new Nikon LensID's
59
117
  - Added support for Nikon NKSC sidecar files
118
+ - Decode another type of timed GPS from MP4 videos
60
119
  - Decode more tags for the Nikon Z7 and Z9 (thanks Warren Hatch)
61
120
  - Decode a couple more FLIR tags
62
121
  - Extract ZIP file comments
package/bin/META.json CHANGED
@@ -47,6 +47,6 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.41",
50
+ "version" : "12.44",
51
51
  "x_serialization_backend" : "JSON::PP version 4.02"
52
52
  }
package/bin/META.yml CHANGED
@@ -28,5 +28,5 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.41
31
+ version: 12.44
32
32
  x_serialization_backend: 'JSON::PP version 4.02'
package/bin/README CHANGED
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
107
107
  terminal window to extract and run ExifTool:
108
108
 
109
109
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.41.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.41
110
+ gzip -dc Image-ExifTool-12.44.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.44
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
package/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.41';
14
+ my $version = '12.44';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -663,7 +663,7 @@ for (;;) {
663
663
  }
664
664
  $group = $2;
665
665
  shift;
666
- $group =~ /IFD/i and Warn("Can't list tags for specific IFD\n"), next;
666
+ $group =~ /IFD/i and Warn("Can't list tags for specific IFD\n"), $helped=1, next;
667
667
  $group =~ /^(all|\*)$/ and undef $group;
668
668
  } else {
669
669
  $pass or next;
@@ -2554,8 +2554,9 @@ TAG: foreach $tag (@foundTags) {
2554
2554
  if ($showTagID or $outFormat < 0) {
2555
2555
  $val = { val => $val };
2556
2556
  if ($showTagID) {
2557
- my $id = $et->GetTagID($tag);
2557
+ my ($id, $lang) = $et->GetTagID($tag);
2558
2558
  $id = sprintf('0x%.4x', $id) if $showTagID eq 'H' and $id =~ /^\d+$/;
2559
+ $$val{lang} = $lang if $lang;
2559
2560
  $$val{id} = $id;
2560
2561
  }
2561
2562
  if ($tabFormat) {
@@ -5466,7 +5467,7 @@ with this command:
5466
5467
 
5467
5468
  produces output like this:
5468
5469
 
5469
- -- Generated by ExifTool 12.41 --
5470
+ -- Generated by ExifTool 12.44 --
5470
5471
  File: a.jpg - 2003:10:31 15:44:19
5471
5472
  (f/5.6, 1/60s, ISO 100)
5472
5473
  File: b.jpg - 2006:05:23 11:57:38
@@ -15,7 +15,7 @@ use vars qw($VERSION);
15
15
  use Image::ExifTool::Exif;
16
16
  use Image::ExifTool::PLIST;
17
17
 
18
- $VERSION = '1.05';
18
+ $VERSION = '1.06';
19
19
 
20
20
  # Apple iPhone metadata (ref PH)
21
21
  %Image::ExifTool::Apple::Main = (
@@ -66,7 +66,16 @@ $VERSION = '1.05';
66
66
  Writable => 'string',
67
67
  Notes => 'unique ID for all images in a burst',
68
68
  },
69
- # 0x000c - rational64s[2]: eg) "0.1640625 0.19921875"
69
+ 0x000c => { # ref forum13710 (Neal Krawetz)
70
+ Name => 'FocusDistanceRange',
71
+ Writable => 'rational64s',
72
+ Count => 2,
73
+ PrintConv => q{
74
+ my @a = split ' ', $val;
75
+ sprintf('%.2f - %.2f m', $a[0] <= $a[1] ? @a : reverse @a);
76
+ },
77
+ PrintConvInv => '$val =~ s/ - //; $val =~ s/ ?m$//; $val',
78
+ },
70
79
  # 0x000d - int32s: 0,1,6,20,24,32,40
71
80
  # 0x000e - int32s: 0,1,4,12 (Orientation? 0=landscape? 4=portrait? ref 1)
72
81
  # 0x000f - int32s: 2,3
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.57';
91
+ $VERSION = '4.59';
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)
@@ -197,6 +197,7 @@ $VERSION = '4.57';
197
197
  44 => 'Canon EF 90-300mm f/4.5-5.6', #32
198
198
  45 => 'Canon EF-S 18-55mm f/3.5-5.6 [II]', #PH (same ID for version II, ref 20)
199
199
  46 => 'Canon EF 28-90mm f/4-5.6', #32
200
+ # 46 => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD (A010)', # (also possibly?)
200
201
  47 => 'Zeiss Milvus 35mm f/2 or 50mm f/2', #IB
201
202
  47.1 => 'Zeiss Milvus 50mm f/2 Makro', #IB
202
203
  47.2 => 'Zeiss Milvus 135mm f/2 ZE', #IB
@@ -571,7 +572,9 @@ $VERSION = '4.57';
571
572
  61494 => 'Canon CN-E 85mm T1.3 L F', #PH
572
573
  61495 => 'Canon CN-E 135mm T2.2 L F', #PH
573
574
  61496 => 'Canon CN-E 35mm T1.5 L F', #PH
574
- # see RFLensType tag for master list of 61182 RF lenses
575
+ #
576
+ # see RFLensType tag for master list of 61182 RF lenses
577
+ #
575
578
  61182 => 'Canon RF 50mm F1.2L USM or other Canon RF Lens',
576
579
  61182.1 => 'Canon RF 24-105mm F4L IS USM',
577
580
  61182.2 => 'Canon RF 28-70mm F2L USM',
@@ -594,16 +597,23 @@ $VERSION = '4.57';
594
597
  '61182.19' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
595
598
  '61182.20' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
596
599
  '61182.21' => 'Canon RF 70-200mm F4L IS USM', #42
597
- '61182.22' => 'Canon RF 50mm F1.8 STM', #42
598
- '61182.23' => 'Canon RF 14-35mm F4L IS USM', #IB
599
- '61182.24' => 'Canon RF 100-400mm F5.6-8 IS USM', #42
600
- '61182.25' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
601
- '61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
602
- '61182.27' => 'Canon RF 16mm F2.8 STM', #42
603
- '61182.28' => 'Canon RF 400mm F2.8L IS USM', #IB
604
- '61182.29' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
605
- '61182.30' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
606
- #'61182.xx' => 'Canon RF 100mm F2.8L MACRO IS USM',
600
+ '61182.22' => 'Canon RF 100mm F2.8L MACRO IS USM', #42
601
+ '61182.23' => 'Canon RF 50mm F1.8 STM', #42
602
+ '61182.24' => 'Canon RF 14-35mm F4L IS USM', #IB
603
+ '61182.25' => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42
604
+ '61182.26' => 'Canon RF 100-400mm F5.6-8 IS USM', #42
605
+ '61182.27' => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
606
+ '61182.28' => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
607
+ '61182.29' => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
608
+ '61182.30' => 'Canon RF 16mm F2.8 STM', #42
609
+ '61182.31' => 'Canon RF 400mm F2.8L IS USM', #IB
610
+ '61182.32' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
611
+ '61182.33' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
612
+ '61182.34' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
613
+ # we need the RFLensType values for the following...
614
+ '61182.35' => 'Canon RF 800mm F5.6L IS USM', #PH (NC)
615
+ '61182.36' => 'Canon RF 1200mm F8L IS USM', #PH (NC)
616
+ '61182.37' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
607
617
  65535 => 'n/a',
608
618
  );
609
619
 
@@ -960,6 +970,8 @@ $VERSION = '4.57';
960
970
  0x80000437 => 'EOS 90D', #IB
961
971
  0x80000450 => 'EOS R3', #42
962
972
  0x80000453 => 'EOS R6', #PH
973
+ 0x80000464 => 'EOS R7', #42
974
+ 0x80000465 => 'EOS R10', #42
963
975
  0x80000467 => 'PowerShot ZOOM',
964
976
  0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
965
977
  0x80000520 => 'EOS D2000C', #IB
@@ -6522,23 +6534,23 @@ my %ciMaxFocal = (
6522
6534
  0x02 => 'FacesDetected',
6523
6535
  );
6524
6536
 
6525
- # G9 white balance information (MakerNotes tag 0x29) (ref IB)
6537
+ # G9 white balance information (MakerNotes tag 0x29) (ref IB, changed ref forum13640)
6526
6538
  %Image::ExifTool::Canon::WBInfo = (
6527
6539
  %binaryDataAttrs,
6528
6540
  NOTES => 'WB tags for the Canon G9.',
6529
6541
  FORMAT => 'int32u',
6530
6542
  FIRST_ENTRY => 1,
6531
6543
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
6532
- 0x02 => { Name => 'WB_GRGBLevelsAuto', Format => 'int32s[4]' },
6533
- 0x0a => { Name => 'WB_GRGBLevelsDaylight', Format => 'int32s[4]' },
6534
- 0x12 => { Name => 'WB_GRGBLevelsCloudy', Format => 'int32s[4]' },
6535
- 0x1a => { Name => 'WB_GRGBLevelsTungsten', Format => 'int32s[4]' },
6536
- 0x22 => { Name => 'WB_GRGBLevelsFluorescent', Format => 'int32s[4]' },
6537
- 0x2a => { Name => 'WB_GRGBLevelsFluorHigh', Format => 'int32s[4]' },
6538
- 0x32 => { Name => 'WB_GRGBLevelsFlash', Format => 'int32s[4]' },
6539
- 0x3a => { Name => 'WB_GRGBLevelsUnderwater', Format => 'int32s[4]' },
6540
- 0x42 => { Name => 'WB_GRGBLevelsCustom1', Format => 'int32s[4]' },
6541
- 0x4a => { Name => 'WB_GRGBLevelsCustom2', Format => 'int32s[4]' },
6544
+ 0x02 => { Name => 'WB_GRBGLevelsAuto', Format => 'int32s[4]' },
6545
+ 0x0a => { Name => 'WB_GRBGLevelsDaylight', Format => 'int32s[4]' },
6546
+ 0x12 => { Name => 'WB_GRBGLevelsCloudy', Format => 'int32s[4]' },
6547
+ 0x1a => { Name => 'WB_GRBGLevelsTungsten', Format => 'int32s[4]' },
6548
+ 0x22 => { Name => 'WB_GRBGLevelsFluorescent', Format => 'int32s[4]' },
6549
+ 0x2a => { Name => 'WB_GRBGLevelsFluorHigh', Format => 'int32s[4]' },
6550
+ 0x32 => { Name => 'WB_GRBGLevelsFlash', Format => 'int32s[4]' },
6551
+ 0x3a => { Name => 'WB_GRBGLevelsUnderwater', Format => 'int32s[4]' },
6552
+ 0x42 => { Name => 'WB_GRBGLevelsCustom1', Format => 'int32s[4]' },
6553
+ 0x4a => { Name => 'WB_GRBGLevelsCustom2', Format => 'int32s[4]' },
6542
6554
  );
6543
6555
 
6544
6556
  # yet more face detect information (MakerNotes tag 0x2f) - PH (G12)
@@ -6795,16 +6807,19 @@ my %ciMaxFocal = (
6795
6807
  276 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
6796
6808
  277 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
6797
6809
  278 => 'Canon RF 70-200mm F4L IS USM', #42
6810
+ 279 => 'Canon RF 100mm F2.8L MACRO IS USM', #42
6798
6811
  280 => 'Canon RF 50mm F1.8 STM', #42
6799
6812
  281 => 'Canon RF 14-35mm F4L IS USM', #42/IB
6813
+ 282 => 'Canon RF-S 18-45mm F4.5-6.3 IS STM', #42
6800
6814
  283 => 'Canon RF 100-400mm F5.6-8 IS USM', #42
6801
6815
  284 => 'Canon RF 100-400mm F5.6-8 IS USM + RF1.4x', #42 (NC)
6802
6816
  285 => 'Canon RF 100-400mm F5.6-8 IS USM + RF2x', #42 (NC)
6817
+ 286 => 'Canon RF-S 18-150mm F3.5-6.3 IS STM', #42
6803
6818
  288 => 'Canon RF 16mm F2.8 STM', #42
6804
6819
  289 => 'Canon RF 400mm F2.8L IS USM', #IB
6805
6820
  290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
6806
6821
  291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
6807
- #xxx => 'Canon RF 100mm F2.8L MACRO IS USM',
6822
+ 292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
6808
6823
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6809
6824
  },
6810
6825
  },
@@ -11,11 +11,14 @@ package Image::ExifTool::DJI;
11
11
 
12
12
  use strict;
13
13
  use vars qw($VERSION);
14
+ use Image::ExifTool qw(:DataAccess :Utils);
14
15
  use Image::ExifTool::Exif;
15
16
  use Image::ExifTool::XMP;
16
17
  use Image::ExifTool::GPS;
17
18
 
18
- $VERSION = '1.04';
19
+ $VERSION = '1.06';
20
+
21
+ sub ProcessDJIInfo($$$);
19
22
 
20
23
  my %convFloat2 = (
21
24
  PrintConv => 'sprintf("%+.2f", $val)',
@@ -44,6 +47,29 @@ my %convFloat2 = (
44
47
  0x0b => { Name => 'CameraRoll', Writable => 'float', %convFloat2 },
45
48
  );
46
49
 
50
+ # DJI debug maker notes
51
+ %Image::ExifTool::DJI::Info = (
52
+ PROCESS_PROC => \&ProcessDJIInfo,
53
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
54
+ NOTES => 'Tags written by some DJI drones.',
55
+ VARS => { LONG_TAGS => 2 },
56
+ ae_dbg_info => { Name => 'AEDebugInfo' },
57
+ ae_histogram_info => { Name => 'AEHistogramInfo' },
58
+ ae_local_histogram => { Name => 'AELocalHistogram' },
59
+ ae_liveview_histogram_info => { Name => 'AELiveViewHistogramInfo' },
60
+ ae_liveview_local_histogram => { Name => 'AELiveViewLocalHistogram' },
61
+ awb_dbg_info => { Name => 'AWBDebugInfo' },
62
+ af_dbg_info => { Name => 'AFDebugInfo' },
63
+ hiso => { Name => 'Histogram' },
64
+ xidiri => { Name => 'Xidiri' },
65
+ 'GimbalDegree(Y,P,R)'=> { Name => 'GimbalDegree' },
66
+ 'FlightDegree(Y,P,R)'=> { Name => 'FlightDegree' },
67
+ adj_dbg_info => { Name => 'ADJDebugInfo' },
68
+ sensor_id => { Name => 'SensorID' },
69
+ 'FlightSpeed(X,Y,Z)' => { Name => 'FlightSpeed' },
70
+ hyperlapse_dbg_info => { Name => 'HyperlapsDebugInfo' },
71
+ );
72
+
47
73
  # thermal parameters in APP4 of DJI ZH20T images (ref forum11401)
48
74
  %Image::ExifTool::DJI::ThermalParams = (
49
75
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -134,6 +160,39 @@ my %convFloat2 = (
134
160
  },
135
161
  );
136
162
 
163
+ #------------------------------------------------------------------------------
164
+ # Process DJI infor (ref PH)
165
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
166
+ # Returns: 1 on success
167
+ sub ProcessDJIInfo($$$)
168
+ {
169
+ my ($et, $dirInfo, $tagTbl) = @_;
170
+ my $dataPt = $$dirInfo{DataPt};
171
+ my $dirStart = $$dirInfo{DirStart} || 0;
172
+ my $dirLen = $$dirInfo{DirLen} || (length($$dataPt) - $dirStart);
173
+ if ($dirStart) {
174
+ my $buff = substr($$dataPt, $dirStart, $dirLen);
175
+ $dataPt = \$buff;
176
+ }
177
+ while ($$dataPt =~ /\G\[(.*?)\](?=(\[|$))/sg) {
178
+ my ($tag, $val) = split /:/, $1, 2;
179
+ next unless defined $tag and defined $val;
180
+ if ($val =~ /^([\x20-\x7f]+)\0*$/) {
181
+ $val = $1;
182
+ } else {
183
+ my $buff = $val;
184
+ $val = \$buff;
185
+ }
186
+ if (not $$tagTbl{$tag} and $tag=~ /^[-_a-zA-Z0-9]+$/) {
187
+ my $name = $tag;
188
+ $name =~ s/_([a-z])/_\U$1/g;
189
+ AddTagToTable($tagTbl, $tag, { Name => Image::ExifTool::MakeTagName($name) });
190
+ }
191
+ $et->HandleTag($tagTbl, $tag, $val);
192
+ }
193
+ return 1;
194
+ }
195
+
137
196
  __END__
138
197
 
139
198
  =head1 NAME
@@ -680,8 +680,14 @@ sub ProcessAdobeMakN($$$)
680
680
  my $dataPos = $$dirInfo{DataPos};
681
681
  my $hdrLen = 6;
682
682
 
683
- # hack for extra 12 bytes in MakN header of JPEG converted to DNG by Adobe Camera Raw
684
- # (4 bytes "00 00 00 01" followed by 8 unknown bytes)
683
+ # 2018-09-27: hack for extra 12 bytes in MakN header of JPEG converted to DNG
684
+ # by Adobe Camera Raw (4 bytes "00 00 00 01" followed by 8 unknown bytes)
685
+ # - this is because CameraRaw copies the maker notes from the wrong location
686
+ # in a JPG image (off by 12 bytes presumably due to the JPEG headers)
687
+ # - this hack won't work in most cases because the extra bytes are not consistent
688
+ # since they are just the data that existed in the JPG before the maker notes
689
+ # - also, the last 12 bytes of the maker notes will be missing
690
+ # - 2022-04-26: this bug still exists in Camera Raw 14.3
685
691
  $hdrLen += 12 if $len >= 18 and substr($$dataPt, $start+6, 4) eq "\0\0\0\x01";
686
692
 
687
693
  my $dirStart = $start + $hdrLen; # pointer to maker note directory
@@ -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
  );
@@ -3397,6 +3397,15 @@ my %opcodeInfo = (
3397
3397
  },
3398
3398
  # the DJI FC2103 writes some interesting stuff here (with sections labelled
3399
3399
  # awb_dbg_info, ae_dbg_info, ae_histogram_info, af_dbg_info, hiso, xidiri) - PH
3400
+ {
3401
+ Name => 'MakerNoteDJIInfo',
3402
+ Condition => '$$valPt =~ /^\[ae_dbg_info:/',
3403
+ MakerNotes => 1,
3404
+ Binary => 1,
3405
+ WriteGroup => 'IFD0', # (for Validate)
3406
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
3407
+ Format => 'undef',
3408
+ },
3400
3409
  {
3401
3410
  Name => 'DNGPrivateData',
3402
3411
  Flags => [ 'Binary', 'Protected' ],
@@ -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.40';
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
@@ -2242,7 +2262,8 @@ sub ProcessFPX($$)
2242
2262
  # remove instance number or class ID from tag if necessary
2243
2263
  $tagInfo = $et->GetTagInfo($tagTablePtr, $1) if
2244
2264
  ($tag =~ /(.*) \d{6}$/s and $$tagTablePtr{$1}) or
2245
- ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1});
2265
+ ($tag =~ /(.*)_[0-9a-f]{16}$/s and $$tagTablePtr{$1}) or
2266
+ ($tag =~ /(.*)_[0-9]{4}$/s and $$tagTablePtr{$1}); # IeImg instances
2246
2267
  }
2247
2268
 
2248
2269
  my $lSib = Get32u(\$dir, $pos + 0x44); # left sibling
@@ -31,7 +31,7 @@ use vars qw($VERSION);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
  use Image::ExifTool::Exif;
33
33
 
34
- $VERSION = '1.80';
34
+ $VERSION = '1.82';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -689,8 +689,9 @@ my %faceCategories = (
689
689
  PrintConv => [{
690
690
  0 => 'None',
691
691
  1 => 'Optical', #PH
692
- 2 => 'Sensor-shift', #PH
692
+ 2 => 'Sensor-shift', #PH (now IBIS/OIS, ref forum13708)
693
693
  3 => 'OIS Lens', #forum9815 (optical+sensor?)
694
+ 258 => 'IBIS/OIS + DIS', #forum13708 (digital on top of IBIS/OIS)
694
695
  512 => 'Digital', #PH
695
696
  },{
696
697
  0 => 'Off',
@@ -762,6 +763,8 @@ my %faceCategories = (
762
763
  },
763
764
  PrintConvInv => '$val=~/(0x[0-9a-f]+)/i; hex $1',
764
765
  },
766
+ 0x1447 => { Name => 'FirmwareVersion', Writable => 'string' },
767
+ 0x1448 => { Name => 'FirmwareVersion2', Writable => 'string' },
765
768
  0x3803 => { #forum10037
766
769
  Name => 'VideoRecordingMode',
767
770
  Groups => { 2 => 'Video' },
@@ -841,6 +844,24 @@ my %faceCategories = (
841
844
  1 => 'Face',
842
845
  2 => 'Left Eye',
843
846
  3 => 'Right Eye',
847
+ 7 => 'Body',
848
+ 8 => 'Head',
849
+ 11 => 'Bike',
850
+ 12 => 'Body of Car',
851
+ 13 => 'Front of Car',
852
+ 14 => 'Animal Body',
853
+ 15 => 'Animal Head',
854
+ 16 => 'Animal Face',
855
+ 17 => 'Animal Left Eye',
856
+ 18 => 'Animal Right Eye',
857
+ 19 => 'Bird Body',
858
+ 20 => 'Bird Head',
859
+ 21 => 'Bird Left Eye',
860
+ 22 => 'Bird Right Eye',
861
+ 23 => 'Aircraft Body',
862
+ 25 => 'Aircraft Cockpit',
863
+ 26 => 'Train Front',
864
+ 27 => 'Train Cockpit',
844
865
  },'REPEAT'],
845
866
  },
846
867
  # 0x4202 int8u[-1] - number of cooredinates in each rectangle? (ref 11)
@@ -12,7 +12,7 @@ use strict;
12
12
  use vars qw($VERSION);
13
13
  use Image::ExifTool::Exif;
14
14
 
15
- $VERSION = '1.53';
15
+ $VERSION = '1.54';
16
16
 
17
17
  my %coordConv = (
18
18
  ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
@@ -360,21 +360,41 @@ my %coordConv = (
360
360
  # which must therefore require this module as necessary
361
361
  GPSLatitude => {
362
362
  SubDoc => 1, # generate for all sub-documents
363
+ Writable => 1,
364
+ Avoid => 1,
365
+ Priority => 1, # (necessary because Avoid sets default Priority to 0)
363
366
  Require => {
364
367
  0 => 'GPS:GPSLatitude',
365
368
  1 => 'GPS:GPSLatitudeRef',
366
369
  },
370
+ WriteAlso => {
371
+ 'GPS:GPSLatitude' => '$val',
372
+ 'GPS:GPSLatitudeRef' => '$val < 0 ? "S" : "N"',
373
+ },
367
374
  ValueConv => '$val[1] =~ /^S/i ? -$val[0] : $val[0]',
368
375
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
376
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
369
377
  },
370
378
  GPSLongitude => {
371
379
  SubDoc => 1, # generate for all sub-documents
380
+ Writable => 1,
381
+ Avoid => 1,
382
+ Priority => 1,
383
+ Require => {
384
+ 0 => 'GPS:GPSLongitude',
385
+ 1 => 'GPS:GPSLongitudeRef',
386
+ },
387
+ WriteAlso => {
388
+ 'GPS:GPSLongitude' => '$val',
389
+ 'GPS:GPSLongitudeRef' => '$val < 0 ? "W" : "E"',
390
+ },
372
391
  Require => {
373
392
  0 => 'GPS:GPSLongitude',
374
393
  1 => 'GPS:GPSLongitudeRef',
375
394
  },
376
395
  ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]',
377
396
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
397
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
378
398
  },
379
399
  GPSAltitude => {
380
400
  SubDoc => [1,3], # generate for sub-documents if Desire 1 or 3 has a chance to exist