exiftool-vendored.exe 12.62.0 → 12.67.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 (52) hide show
  1. package/LICENSE +254 -254
  2. package/bin/exiftool_files/Changes +96 -1
  3. package/bin/exiftool_files/Makefile.PL +7 -1
  4. package/bin/exiftool_files/README +50 -46
  5. package/bin/exiftool_files/config_files/guano.config +161 -0
  6. package/bin/exiftool_files/exiftool.pl +113 -78
  7. package/bin/exiftool_files/lib/Image/ExifTool/7Z.pm +793 -0
  8. package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +19 -8
  9. package/bin/exiftool_files/lib/Image/ExifTool/BigTIFF.pm +8 -1
  10. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +33 -12
  11. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +4 -4
  12. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +4 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +31 -14
  14. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +8 -2
  15. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +6 -3
  16. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +5 -2
  17. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +5 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +226 -28
  19. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fr.pm +1467 -202
  20. package/bin/exiftool_files/lib/Image/ExifTool/MPF.pm +2 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/Matroska.pm +16 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  23. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +948 -31
  24. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +874 -63
  25. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +23 -5
  26. package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +8 -1
  27. package/bin/exiftool_files/lib/Image/ExifTool/PLUS.pm +19 -4
  28. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +6 -6
  29. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +3 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +5 -5
  31. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +91 -30
  32. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +20 -19
  33. package/bin/exiftool_files/lib/Image/ExifTool/README +2 -2
  34. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +11 -9
  35. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +227 -227
  36. package/bin/exiftool_files/lib/Image/ExifTool/Shortcuts.pm +2 -1
  37. package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +4 -4
  38. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +229 -30
  39. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4758 -4633
  40. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +715 -23
  41. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +17 -1
  42. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +9 -7
  43. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +21 -9
  44. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +2 -2
  45. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +36 -12
  46. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +14 -2
  47. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +33 -1
  48. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +96 -28
  49. package/bin/exiftool_files/lib/Image/ExifTool/ZIP.pm +5 -5
  50. package/bin/exiftool_files/lib/Image/ExifTool.pm +184 -132
  51. package/bin/exiftool_files/lib/Image/ExifTool.pod +124 -58
  52. package/package.json +3 -2
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool::Exif;
17
17
  use Image::ExifTool::PLIST;
18
18
 
19
- $VERSION = '1.08';
19
+ $VERSION = '1.11';
20
20
 
21
21
  sub ConvertPLIST($$);
22
22
 
@@ -110,24 +110,32 @@ sub ConvertPLIST($$);
110
110
  },
111
111
  # 0x0010 - int32s: 1 (SphereStatus, ref 2)
112
112
  0x0011 => { # (if defined, there is a live photo associated with the video, #forum13565) (AssetIdentifier, ref 2)
113
- Name => 'MediaGroupUUID', #NealKrawetz private communication
114
- # (changed in 12.19 from Name => 'ContentIdentifier', #forum8750)
113
+ Name => 'ContentIdentifier',
114
+ Notes => 'called MediaGroupUUID when it appears as an XAttr',
115
+ # - originally called ContentIdentifier, forum8750
116
+ # - changed in 12.19 to MediaGroupUUID, NealKrawetz private communication
117
+ # - changed back to ContentIdentifier since Apple writes this to Keys content.identifier (forum14874)
115
118
  Writable => 'string',
119
+
116
120
  },
117
121
  # 0x0012 - (QRMOutputType, ref 2)
118
122
  # 0x0013 - (SphereExternalForceOffset, ref 2)
119
123
  0x0014 => { # (StillImageCaptureType, ref 2)
120
124
  Name => 'ImageCaptureType',
121
125
  Writable => 'int32s',
122
- Unknown => 1, # (don't know what the values mean)
123
126
  # seen: 1,2,3,4,5,10,12
127
+ PrintConv => { #forum15096
128
+ 1 => 'ProRAW',
129
+ 2 => 'Portrait',
130
+ 10 => 'Photo',
131
+ },
124
132
  },
125
133
  0x0015 => { # (ImageGroupIdentifier, ref 2)
126
134
  Name => 'ImageUniqueID',
127
135
  Writable => 'string',
128
136
  },
129
137
  # 0x0016 - string[29]: "AXZ6pMTOh2L+acSh4Kg630XCScoO\0" (PhotosOriginatingSignature, ref 2)
130
- 0x0017 => { #forum13565 (only valid if MediaGroupUUID exists) (StillImageCaptureFlags, ref 2)
138
+ 0x0017 => { #forum13565 (only valid if MediaGroupUUID/ContentIdentifier exists) (StillImageCaptureFlags, ref 2)
131
139
  Name => 'LivePhotoVideoIndex',
132
140
  Notes => 'divide by RunTimeScale to get time in seconds',
133
141
  },
@@ -153,7 +161,7 @@ sub ConvertPLIST($$);
153
161
  # 0x001e - (OriginatingAppID, ref 2)
154
162
  # 0x001f - int32s: 0,1 (PhotosAppFeatureFlags, ref 2)
155
163
  0x0020 => { # (ImageCaptureRequestIdentifier, ref 2)
156
- Name => 'ImageCaptureReqestID',
164
+ Name => 'ImageCaptureRequestID',
157
165
  Writable => 'string',
158
166
  Unknown => 1,
159
167
  },
@@ -182,7 +190,10 @@ sub ConvertPLIST($$);
182
190
  # 0x0028 - int32s (UBMethod, ref 2)
183
191
  # 0x0029 - string (SpatialOverCaptureGroupIdentifier, ref 2)
184
192
  # 0x002A - (iCloudServerSoftwareVersionForDynamicallyGeneratedMedia, ref 2)
185
- # 0x002B - (PhotoIdentifier, ref 2)
193
+ 0x002b => {
194
+ Name => 'PhotoIdentifier', #2
195
+ Writable => 'string',
196
+ },
186
197
  # 0x002C - (SpatialOverCaptureImageType, ref 2)
187
198
  # 0x002D - (CCT, ref 2)
188
199
  # 0x002E - (ApsMode, ref 2)
@@ -308,7 +319,7 @@ sub ConvertPLIST($$)
308
319
  $val = $$dirInfo{Value};
309
320
  if (ref $val eq 'HASH' and not $et->Options('Struct')) {
310
321
  require 'Image/ExifTool/XMPStruct.pl';
311
- $val = Image::ExifTool::XMP::SerializeStruct($val);
322
+ $val = Image::ExifTool::XMP::SerializeStruct($et, $val);
312
323
  }
313
324
  return $val;
314
325
  }
@@ -15,7 +15,7 @@ use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
  use Image::ExifTool::Exif;
17
17
 
18
- $VERSION = '1.07';
18
+ $VERSION = '1.08';
19
19
 
20
20
  my $maxOffset = 0x7fffffff; # currently supported maximum data offset/size
21
21
 
@@ -216,6 +216,13 @@ sub ProcessBigIFD($$$)
216
216
  $dirStart = Image::ExifTool::Get64u(\$nextIFD, 0);
217
217
  $dirStart or last;
218
218
  $offName = $nextOffName;
219
+ # protect against infinite loop
220
+ if ($$et{PROCESSED}{$dirStart}) {
221
+ $et->Warn("$dirName pointer references previous $$et{PROCESSED}{$dirStart} directory");
222
+ last;
223
+ } else {
224
+ $$et{PROCESSED}{$dirStart} = $dirName;
225
+ }
219
226
  }
220
227
  return 1;
221
228
  }
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.66';
91
+ $VERSION = '4.68';
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)
@@ -608,18 +608,24 @@ $VERSION = '4.66';
608
608
  '61182.33' => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
609
609
  '61182.34' => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
610
610
  '61182.35' => 'Canon RF 600mm F4L IS USM', #GiaZopatti
611
- '61182.36' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
612
- '61182.37' => 'Canon RF 800mm F5.6L IS USM', #42
613
- '61182.38' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
614
- '61182.39' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
615
- '61182.40' => 'Canon RF 1200mm F8L IS USM', #42
616
- '61182.41' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
617
- '61182.42' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
618
- '61182.43' => 'Canon RF 135mm F1.8 L IS USM', #42
619
- '61182.44' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
620
- '61182.45' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
611
+ '61182.36' => 'Canon RF 600mm F4L IS USM + RF1.4x', #42
612
+ '61182.37' => 'Canon RF 600mm F4L IS USM + RF2x', #42
613
+ '61182.38' => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
614
+ '61182.39' => 'Canon RF 800mm F5.6L IS USM', #42
615
+ '61182.40' => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
616
+ '61182.41' => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
617
+ '61182.42' => 'Canon RF 1200mm F8L IS USM', #42
618
+ '61182.43' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
619
+ '61182.44' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
620
+ '61182.45' => 'Canon RF 135mm F1.8 L IS USM', #42
621
+ '61182.46' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
622
+ '61182.47' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
623
+ '61182.48' => 'Canon RF 100-300mm F2.8L IS USM', #42
624
+ '61182.49' => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
625
+ '61182.50' => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
626
+ '61182.51' => 'Canon RF 28mm F2.8 STM', #42
621
627
  # we need the RFLensType values for the following...
622
- '61182.46' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
628
+ '61182.52' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
623
629
  65535 => 'n/a',
624
630
  );
625
631
 
@@ -983,6 +989,8 @@ $VERSION = '4.66';
983
989
  0x80000480 => 'EOS R50', #42
984
990
  0x80000481 => 'EOS R6 Mark II', #42
985
991
  0x80000487 => 'EOS R8', #42
992
+ 0x80000491 => 'PowerShot V10', #25
993
+ 0x80000498 => 'EOS R100', #25
986
994
  0x80000520 => 'EOS D2000C', #IB
987
995
  0x80000560 => 'EOS D6000C', #PH (guess)
988
996
  );
@@ -1696,6 +1704,12 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1696
1704
  # Writable => 'int32u',
1697
1705
  # Protected => 2,
1698
1706
  },
1707
+ 0x82 => { #github219 (found on 1DS)
1708
+ Name => 'RawDataLength',
1709
+ # (can't yet write 1DS raw files)
1710
+ # Writable => 'int32u',
1711
+ # Protected => 2,
1712
+ },
1699
1713
  0x83 => { #PH
1700
1714
  Name => 'OriginalDecisionDataOffset',
1701
1715
  Writable => 'int32u',
@@ -2092,6 +2106,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2092
2106
  TagTable => 'Image::ExifTool::Canon::AFConfig',
2093
2107
  }
2094
2108
  },
2109
+ # 0x402b - crop information (forum14904)
2095
2110
  0x403f => { #25
2096
2111
  Name => 'RawBurstModeRoll',
2097
2112
  SubDirectory => {
@@ -6856,6 +6871,8 @@ my %ciMaxFocal = (
6856
6871
  290 => 'Canon RF 400mm F2.8L IS USM + RF1.4x', #IB
6857
6872
  291 => 'Canon RF 400mm F2.8L IS USM + RF2x', #IB
6858
6873
  292 => 'Canon RF 600mm F4L IS USM', #GiaZopatti
6874
+ 293 => 'Canon RF 600mm F4L IS USM + RF1.4x', #42
6875
+ 294 => 'Canon RF 600mm F4L IS USM + RF2x', #42
6859
6876
  295 => 'Canon RF 800mm F5.6L IS USM', #42
6860
6877
  296 => 'Canon RF 800mm F5.6L IS USM + RF1.4x', #42
6861
6878
  297 => 'Canon RF 800mm F5.6L IS USM + RF2x', #42
@@ -6866,6 +6883,10 @@ my %ciMaxFocal = (
6866
6883
  303 => 'Canon RF 135mm F1.8 L IS USM', #42
6867
6884
  304 => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
6868
6885
  305 => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
6886
+ 306 => 'Canon RF 100-300mm F2.8L IS USM', #42
6887
+ 307 => 'Canon RF 100-300mm F2.8L IS USM + RF1.4x', #42
6888
+ 308 => 'Canon RF 100-300mm F2.8L IS USM + RF2x', #42
6889
+ 313 => 'Canon RF 28mm F2.8 STM', #42
6869
6890
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6870
6891
  },
6871
6892
  },
@@ -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.60';
24
+ $VERSION = '1.61';
25
25
 
26
26
  sub WriteCRW($$);
27
27
  sub ProcessCanonRaw($$$);
@@ -698,9 +698,9 @@ sub ProcessCanonRaw($$$)
698
698
  $format ne 'string' and not $subdir;
699
699
  } else {
700
700
  $valueDataPos = $ptr;
701
- # do MD5 of image data if requested
702
- if ($$et{ImageDataMD5} and $tagID == 0x2005) {
703
- $raf->Seek($ptr, 0) and $et->ImageDataMD5($raf, $size, 'raw');
701
+ # do hash of image data if requested
702
+ if ($$et{ImageDataHash} and $tagID == 0x2005) {
703
+ $raf->Seek($ptr, 0) and $et->ImageDataHash($raf, $size, 'raw');
704
704
  }
705
705
  if ($size <= 512 or ($verbose > 2 and $size <= 65536)
706
706
  or ($tagInfo and ($$tagInfo{SubDirectory}
@@ -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.35';
26
+ $VERSION = '1.36';
27
27
 
28
28
  sub ProcessCanonVRD($$;$);
29
29
  sub WriteCanonVRD($$;$);
@@ -187,6 +187,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
187
187
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
188
188
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
189
189
  WRITABLE => 1,
190
+ PERMANENT => 1, # (can't add/delete these individually)
190
191
  FIRST_ENTRY => 0,
191
192
  GROUPS => { 2 => 'Image' },
192
193
  DATAMEMBER => [ 0x002 ], # necessary for writing
@@ -485,6 +486,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
485
486
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
486
487
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
487
488
  WRITABLE => 1,
489
+ PERMANENT => 1, # (can't add/delete these individually)
488
490
  FIRST_ENTRY => 0,
489
491
  FORMAT => 'int16s',
490
492
  DATAMEMBER => [ 0x58, 0xdc, 0xdf, 0xe0 ], # (required for DataMember and var-format tags)
@@ -999,6 +1001,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
999
1001
  PROCESS_PROC => \&ProcessDR4,
1000
1002
  WRITE_PROC => \&ProcessDR4,
1001
1003
  WRITABLE => 1,
1004
+ PERMANENT => 1, # (can't add/delete these individually)
1002
1005
  GROUPS => { 1 => 'CanonDR4', 2 => 'Image' },
1003
1006
  VARS => { HEX_ID => 1, SORT_PROC => \&SortDR4 },
1004
1007
  NOTES => q{
@@ -43,6 +43,7 @@
43
43
  # 30) http://geotiff.maptools.org/spec/geotiffhome.html
44
44
  # 31) https://android.googlesource.com/platform/external/dng_sdk/+/refs/heads/master/source/dng_tag_codes.h
45
45
  # 32) Jeffry Friedl private communication
46
+ # 33) https://www.cipa.jp/std/documents/download_e.html?DC-008-Translation-2023-E (Exif 3.0)
46
47
  # IB) Iliah Borg private communication (LibRaw)
47
48
  # JD) Jens Duttke private communication
48
49
  #------------------------------------------------------------------------------
@@ -65,7 +66,7 @@ sub RebuildMakerNotes($$$);
65
66
  sub EncodeExifText($$);
66
67
  sub ValidateIFD($;$);
67
68
  sub ValidateImageData($$$;$);
68
- sub AddImageDataMD5($$$);
69
+ sub AddImageDataHash($$$);
69
70
  sub ProcessTiffIFD($$$);
70
71
  sub PrintParameter($$$);
71
72
  sub GetOffList($$$$$);
@@ -79,6 +80,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
79
80
 
80
81
  # byte sizes for the various EXIF format types below
81
82
  @formatSize = (undef,1,1,2,4,8,1,1,2,4,8,4,8,4,2,8,8,8,8);
83
+ $formatSize[129] = 1; # (Exif 3.0)
82
84
 
83
85
  @formatName = (
84
86
  undef, 'int8u', 'string', 'int16u',
@@ -87,6 +89,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
87
89
  'double', 'ifd', 'unicode', 'complex',
88
90
  'int64u', 'int64s', 'ifd64', # (new BigTIFF formats)
89
91
  );
92
+ $formatName[129] = 'utf8'; # (Exif 3.0)
90
93
 
91
94
  # hash to look up EXIF format numbers by name
92
95
  # (format types are all lower case)
@@ -110,6 +113,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
110
113
  'int64u' => 16, # LONG8 [BigTIFF]
111
114
  'int64s' => 17, # SLONG8 [BigTIFF]
112
115
  'ifd64' => 18, # IFD8 (with int64u format) [BigTIFF]
116
+ 'utf8' => 129,# UTF-8 (Exif 3.0)
113
117
  # Note: unicode and complex types are not yet properly supported by ExifTool.
114
118
  # These are types which have been observed in the Adobe DNG SDK code, but
115
119
  # aren't fully supported there either. We know the sizes, but that's about it.
@@ -2823,6 +2827,13 @@ my %opcodeInfo = (
2823
2827
  0xa433 => { Name => 'LensMake', Writable => 'string' }, #24
2824
2828
  0xa434 => { Name => 'LensModel', Writable => 'string' }, #24
2825
2829
  0xa435 => { Name => 'LensSerialNumber', Writable => 'string' }, #24
2830
+ 0xa436 => { Name => 'Title', Writable => 'string', Avoid => 1 }, #33
2831
+ 0xa437 => { Name => 'Photographer', Writable => 'string' }, #33
2832
+ 0xa438 => { Name => 'ImageEditor', Writable => 'string' }, #33
2833
+ 0xa439 => { Name => 'CameraFirmware', Writable => 'string' }, #33
2834
+ 0xa43a => { Name => 'RAWDevelopingSoftware', Writable => 'string' }, #33
2835
+ 0xa43b => { Name => 'ImageEditingSoftware', Writable => 'string' }, #33
2836
+ 0xa43c => { Name => 'MetadataEditingSoftware', Writable => 'string' }, #33
2826
2837
  0xa460 => { #Exif2.32
2827
2838
  Name => 'CompositeImage',
2828
2839
  Writable => 'int16u',
@@ -4910,10 +4921,10 @@ my %subSecConv = (
4910
4921
  Writable => 1,
4911
4922
  Protected => 1,
4912
4923
  WriteAlso => {
4913
- GPSLatitude => '(defined $val and $val =~ /(.*?)( ?[NS])?,/) ? $1 : undef',
4914
- GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?) ?([NS]?),/) ? ($3 || ($1 ? "S" : "N")) : undef',
4915
- GPSLongitude => '(defined $val and $val =~ /, ?(.*?)( ?[EW]?)$/) ? $1 : undef',
4916
- GPSLongitudeRef => '(defined $val and $val =~ /, ?(-?)(.*?) ?([EW]?)$/) ? ($3 || ($1 ? "W" : "E")) : undef',
4924
+ GPSLatitude => '(defined $val and $val =~ /(.*) /) ? $1 : undef',
4925
+ GPSLatitudeRef => '(defined $val and $val =~ /(-?)(.*?) /) ? ($1 ? "S" : "N") : undef',
4926
+ GPSLongitude => '(defined $val and $val =~ / (.*)$/) ? $1 : undef',
4927
+ GPSLongitudeRef => '(defined $val and $val =~ / (-?)/) ? ($1 ? "W" : "E") : undef',
4917
4928
  },
4918
4929
  PrintConvInv => q{
4919
4930
  return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
@@ -4921,7 +4932,7 @@ my %subSecConv = (
4921
4932
  require Image::ExifTool::GPS;
4922
4933
  $lat = Image::ExifTool::GPS::ToDegrees($lat, 1, "lat");
4923
4934
  $lon = Image::ExifTool::GPS::ToDegrees($lon, 1, "lon");
4924
- return "$lat, $lon";
4935
+ return "$lat $lon";
4925
4936
  },
4926
4937
  Require => {
4927
4938
  0 => 'GPSLatitude',
@@ -5929,12 +5940,12 @@ sub ProcessExif($$$)
5929
5940
  my ($verbose,$validate,$saveFormat) = @{$$et{OPTIONS}}{qw(Verbose Validate SaveFormat)};
5930
5941
  my $htmlDump = $$et{HTML_DUMP};
5931
5942
  my $success = 1;
5932
- my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName, $doMD5);
5943
+ my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName, $doHash);
5933
5944
  my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
5934
5945
  my $isExif = ($tagTablePtr eq \%Image::ExifTool::Exif::Main);
5935
5946
 
5936
- # set flag to calculate image data MD5 if requested
5937
- $doMD5 = 1 if $$et{ImageDataMD5} and (($$et{FILE_TYPE} eq 'TIFF' and not $base and not $inMakerNotes) or
5947
+ # set flag to calculate image data hash if requested
5948
+ $doHash = 1 if $$et{ImageDataHash} and (($$et{FILE_TYPE} eq 'TIFF' and not $base and not $inMakerNotes) or
5938
5949
  ($$et{FILE_TYPE} eq 'RAF' and $dirName eq 'FujiIFD'));
5939
5950
 
5940
5951
  # set encoding to assume for strings
@@ -6088,7 +6099,7 @@ sub ProcessExif($$$)
6088
6099
  my $format = Get16u($dataPt, $entry+2);
6089
6100
  my $count = Get32u($dataPt, $entry+4);
6090
6101
  # (Apple uses the BigTIFF format code 16 in the maker notes of their ProRaw DNG files)
6091
- if (($format < 1 or $format > 13) and not ($format == 16 and $$et{Make} eq 'Apple' and $inMakerNotes)) {
6102
+ if (($format < 1 or $format > 13) and $format != 129 and not ($format == 16 and $$et{Make} eq 'Apple' and $inMakerNotes)) {
6092
6103
  if ($mapFmt and $$mapFmt{$format}) {
6093
6104
  $format = $$mapFmt{$format};
6094
6105
  } else {
@@ -6404,7 +6415,13 @@ sub ProcessExif($$$)
6404
6415
  # convert according to specified format
6405
6416
  $val = ReadValue($valueDataPt,$valuePtr,$formatStr,$count,$readSize,\$rational);
6406
6417
  # re-code if necessary
6407
- $val = $et->Decode($val, $strEnc) if $strEnc and $formatStr eq 'string' and defined $val;
6418
+ if (defined $val) {
6419
+ if ($formatStr eq 'utf8') {
6420
+ $val = $et->Decode($val, 'UTF8');
6421
+ } elsif ($strEnc and $formatStr eq 'string') {
6422
+ $val = $et->Decode($val, $strEnc);
6423
+ }
6424
+ }
6408
6425
  }
6409
6426
  }
6410
6427
 
@@ -6781,7 +6798,7 @@ sub ProcessExif($$$)
6781
6798
  }
6782
6799
  $val = join(' ', @vals);
6783
6800
  }
6784
- if ($validate or $doMD5) {
6801
+ if ($validate or $doHash) {
6785
6802
  if ($$tagInfo{OffsetPair}) {
6786
6803
  $offsetInfo{$tagID} = [ $tagInfo, $val ];
6787
6804
  } elsif ($saveForValidate{$tagID} and $isExif) {
@@ -6800,8 +6817,8 @@ sub ProcessExif($$$)
6800
6817
  }
6801
6818
 
6802
6819
  if (%offsetInfo) {
6803
- # calculate image data MD5 if requested
6804
- AddImageDataMD5($et, $dirInfo, \%offsetInfo) if $doMD5;
6820
+ # calculate image data hash if requested
6821
+ AddImageDataHash($et, $dirInfo, \%offsetInfo) if $doHash;
6805
6822
  # validate image data offsets for this IFD (note: modifies %offsetInfo)
6806
6823
  Image::ExifTool::Validate::ValidateOffsetInfo($et, \%offsetInfo, $dirName, $inMakerNotes) if $validate;
6807
6824
  }
@@ -11,6 +11,7 @@
11
11
  # 4) http://msdn.microsoft.com/en-us/library/aa380374.aspx
12
12
  # 5) http://www.cpan.org/modules/by-authors/id/H/HC/HCARVEY/File-MSWord-0.1.zip
13
13
  # 6) https://msdn.microsoft.com/en-us/library/cc313153(v=office.12).aspx
14
+ # 7) https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-oshared/3ef02e83-afef-4b6c-9585-c109edd24e07
14
15
  #------------------------------------------------------------------------------
15
16
 
16
17
  package Image::ExifTool::FlashPix;
@@ -21,7 +22,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
22
  use Image::ExifTool::Exif;
22
23
  use Image::ExifTool::ASF; # for GetGUID()
23
24
 
24
- $VERSION = '1.45';
25
+ $VERSION = '1.46';
25
26
 
26
27
  sub ProcessFPX($$);
27
28
  sub ProcessFPXR($$$);
@@ -587,6 +588,7 @@ my %fpxFileType = (
587
588
  However, ExifTool will also extract any other information found in the
588
589
  UserDefined properties.
589
590
  },
591
+ # 0x01 => 'CodePage', #7
590
592
  0x02 => 'Category',
591
593
  0x03 => 'PresentationTarget',
592
594
  0x04 => 'Bytes',
@@ -631,12 +633,16 @@ my %fpxFileType = (
631
633
  Name => 'AppVersion',
632
634
  ValueConv => 'sprintf("%d.%.4d",$val >> 16, $val & 0xffff)',
633
635
  },
634
- # 0x18 ? seen -1
636
+ # 0x18 ? seen -1 (DigitalSignature, VtDigSig format, ref 7)
635
637
  # 0x19 ? seen 0
636
638
  # 0x1a ? seen 0
637
639
  # 0x1b ? seen 0
638
640
  # 0x1c ? seen 0,1
639
641
  # 0x1d ? seen 1
642
+ 0x1a => 'ContentType', #7, github#217
643
+ 0x1b => 'ContentStatus', #7, github#217
644
+ 0x1c => 'Language', #7, github#217
645
+ 0x1d => 'DocVersion', #7, github#217
640
646
  # 0x1e ? seen 1
641
647
  # 0x1f ? seen 1,5
642
648
  # 0x20 ? seen 0,5
@@ -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.87';
34
+ $VERSION = '1.89';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -670,6 +670,7 @@ my %faceCategories = (
670
670
  0x800 => 'Classic Negative', #forum10536
671
671
  0x900 => 'Bleach Bypass', #forum10890
672
672
  0xa00 => 'Nostalgic Neg', #forum12085
673
+ 0xb00 => 'Reala ACE', #forum15190
673
674
  },
674
675
  },
675
676
  0x1402 => { #2
@@ -897,6 +898,8 @@ my %faceCategories = (
897
898
  25 => 'Aircraft Cockpit',
898
899
  26 => 'Train Front',
899
900
  27 => 'Train Cockpit',
901
+ 28 => 'Animal Head (28)', #forum15192
902
+ 29 => 'Animal Body (29)', #forum15192
900
903
  },'REPEAT'],
901
904
  },
902
905
  # 0x4202 int8u[-1] - number of cooredinates in each rectangle? (ref 11)
@@ -1687,8 +1690,8 @@ sub ProcessRAF($$)
1687
1690
  my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::IFD');
1688
1691
  # this is TIFF-format data only for some models, so no warning if it fails
1689
1692
  unless ($et->ProcessTIFF(\%dirInfo, $tagTablePtr, \&Image::ExifTool::ProcessTIFF)) {
1690
- # do MD5 of image data if necessary
1691
- $et->ImageDataMD5($raf, $len, 'raw') if $$et{ImageDataMD5} and $raf->Seek($start,0);
1693
+ # do hash of image data if necessary
1694
+ $et->ImageDataHash($raf, $len, 'raw') if $$et{ImageDataHash} and $raf->Seek($start,0);
1692
1695
  }
1693
1696
  delete $$et{SET_GROUP1};
1694
1697
  $ifdNum = ($ifdNum || 1) + 1;
@@ -106,8 +106,10 @@ my %coordConv = (
106
106
  return undef unless $inv and $val =~ /^([-+0-9])/;
107
107
  return($1 eq '-' ? 1 : 0);
108
108
  },
109
- 0 => 'Above Sea Level',
110
- 1 => 'Below Sea Level',
109
+ 0 => 'Above Sea Level', # (ellipsoidal surface, Exif 3.0)
110
+ 1 => 'Below Sea Level', # (ellipsoidal surface, Exif 3.0)
111
+ # 2 => 'Above Sea Level', # (Exif 3.0)
112
+ # 3 => 'Below Sea Level', # (Exif 3.0)
111
113
  },
112
114
  },
113
115
  0x0006 => {
@@ -289,6 +291,7 @@ my %coordConv = (
289
291
  Name => 'GPSProcessingMethod',
290
292
  Writable => 'undef',
291
293
  Notes => 'values of "GPS", "CELLID", "WLAN" or "MANUAL" by the EXIF spec.',
294
+ # (or QZZSS, GALILEO, GLONASS, BEIDOU or NAVIC in Exif 3.0)
292
295
  RawConv => 'Image::ExifTool::Exif::ConvertExifText($self,$val,1,$tag)',
293
296
  RawConvInv => 'Image::ExifTool::Exif::EncodeExifText($self,$val)',
294
297
  },
@@ -29,7 +29,7 @@ use vars qw($VERSION);
29
29
  use Image::ExifTool qw(:Public);
30
30
  use Image::ExifTool::GPS;
31
31
 
32
- $VERSION = '1.71';
32
+ $VERSION = '1.72';
33
33
 
34
34
  sub JITTER() { return 2 } # maximum time jitter
35
35
 
@@ -224,6 +224,9 @@ sub LoadTrackLog($$;$)
224
224
  # determine file format
225
225
  if (not $format) {
226
226
  s/^\xef\xbb\xbf//; # remove leading BOM if it exists
227
+ if (/^\xff\xfe|\xfe\xff/) {
228
+ return "ExifTool doesn't yet read UTF16-format track logs";
229
+ }
227
230
  if (/^<(\?xml|gpx)[\s>]/) { # look for XML or GPX header
228
231
  $format = 'XML';
229
232
  # check for NMEA sentence
@@ -1106,7 +1109,7 @@ sub SetGeoValues($$;$)
1106
1109
  $iExt = $i1;
1107
1110
  }
1108
1111
  if (abs($time - $tn) > $geoMaxExtSecs) {
1109
- $err or $err = 'Time is too far from nearest GPS fix';
1112
+ $err or $err = 'Time is too far from nearest GPS fix'.' '.abs($time-$tn).' '.$geoMaxExtSecs;
1110
1113
  $et->VPrint(2, ' Nearest fix: ', PrintFixTime($tn), "\n") if $verbose > 2;
1111
1114
  $fix = { } if $$geotag{DateTimeOnly};
1112
1115
  } else {