exiftool_vendored 12.62.0 → 12.64.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. checksums.yaml +4 -4
  2. data/bin/Changes +50 -1
  3. data/bin/MANIFEST +4 -0
  4. data/bin/META.json +4 -1
  5. data/bin/META.yml +4 -1
  6. data/bin/Makefile.PL +7 -1
  7. data/bin/README +50 -46
  8. data/bin/config_files/guano.config +161 -0
  9. data/bin/exiftool +88 -62
  10. data/bin/lib/Image/ExifTool/7Z.pm +793 -0
  11. data/bin/lib/Image/ExifTool/Apple.pm +6 -3
  12. data/bin/lib/Image/ExifTool/Canon.pm +1 -0
  13. data/bin/lib/Image/ExifTool/CanonRaw.pm +4 -4
  14. data/bin/lib/Image/ExifTool/CanonVRD.pm +4 -1
  15. data/bin/lib/Image/ExifTool/Exif.pm +31 -14
  16. data/bin/lib/Image/ExifTool/FujiFilm.pm +3 -3
  17. data/bin/lib/Image/ExifTool/GPS.pm +5 -2
  18. data/bin/lib/Image/ExifTool/Geotag.pm +4 -1
  19. data/bin/lib/Image/ExifTool/Jpeg2000.pm +226 -28
  20. data/bin/lib/Image/ExifTool/Lang/fr.pm +1467 -202
  21. data/bin/lib/Image/ExifTool/MPF.pm +2 -1
  22. data/bin/lib/Image/ExifTool/Matroska.pm +16 -1
  23. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  24. data/bin/lib/Image/ExifTool/Nikon.pm +419 -5
  25. data/bin/lib/Image/ExifTool/NikonCustom.pm +13 -3
  26. data/bin/lib/Image/ExifTool/PDF.pm +9 -1
  27. data/bin/lib/Image/ExifTool/PLIST.pm +8 -1
  28. data/bin/lib/Image/ExifTool/PNG.pm +6 -6
  29. data/bin/lib/Image/ExifTool/PhaseOne.pm +5 -5
  30. data/bin/lib/Image/ExifTool/QuickTime.pm +74 -21
  31. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -19
  32. data/bin/lib/Image/ExifTool/README +2 -2
  33. data/bin/lib/Image/ExifTool/RIFF.pm +11 -9
  34. data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  35. data/bin/lib/Image/ExifTool/SigmaRaw.pm +4 -4
  36. data/bin/lib/Image/ExifTool/Sony.pm +103 -8
  37. data/bin/lib/Image/ExifTool/TagLookup.pm +4738 -4630
  38. data/bin/lib/Image/ExifTool/TagNames.pod +249 -5
  39. data/bin/lib/Image/ExifTool/Validate.pm +17 -1
  40. data/bin/lib/Image/ExifTool/WriteExif.pl +9 -7
  41. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +21 -9
  42. data/bin/lib/Image/ExifTool/WriteXMP.pl +2 -2
  43. data/bin/lib/Image/ExifTool/Writer.pl +28 -10
  44. data/bin/lib/Image/ExifTool/XMP.pm +14 -2
  45. data/bin/lib/Image/ExifTool/XMP2.pl +32 -0
  46. data/bin/lib/Image/ExifTool/XMPStruct.pl +96 -28
  47. data/bin/lib/Image/ExifTool/ZIP.pm +5 -5
  48. data/bin/lib/Image/ExifTool.pm +67 -39
  49. data/bin/lib/Image/ExifTool.pod +83 -52
  50. data/bin/perl-Image-ExifTool.spec +44 -44
  51. data/lib/exiftool_vendored/version.rb +1 -1
  52. metadata +4 -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.09';
20
20
 
21
21
  sub ConvertPLIST($$);
22
22
 
@@ -182,7 +182,10 @@ sub ConvertPLIST($$);
182
182
  # 0x0028 - int32s (UBMethod, ref 2)
183
183
  # 0x0029 - string (SpatialOverCaptureGroupIdentifier, ref 2)
184
184
  # 0x002A - (iCloudServerSoftwareVersionForDynamicallyGeneratedMedia, ref 2)
185
- # 0x002B - (PhotoIdentifier, ref 2)
185
+ 0x002b => {
186
+ Name => 'PhotoIdentifier', #2
187
+ Writable => 'string',
188
+ },
186
189
  # 0x002C - (SpatialOverCaptureImageType, ref 2)
187
190
  # 0x002D - (CCT, ref 2)
188
191
  # 0x002E - (ApsMode, ref 2)
@@ -308,7 +311,7 @@ sub ConvertPLIST($$)
308
311
  $val = $$dirInfo{Value};
309
312
  if (ref $val eq 'HASH' and not $et->Options('Struct')) {
310
313
  require 'Image/ExifTool/XMPStruct.pl';
311
- $val = Image::ExifTool::XMP::SerializeStruct($val);
314
+ $val = Image::ExifTool::XMP::SerializeStruct($et, $val);
312
315
  }
313
316
  return $val;
314
317
  }
@@ -2092,6 +2092,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2092
2092
  TagTable => 'Image::ExifTool::Canon::AFConfig',
2093
2093
  }
2094
2094
  },
2095
+ # 0x402b - crop information (forum14904)
2095
2096
  0x403f => { #25
2096
2097
  Name => 'RawBurstModeRoll',
2097
2098
  SubDirectory => {
@@ -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
  }
@@ -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.88';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -1687,8 +1687,8 @@ sub ProcessRAF($$)
1687
1687
  my $tagTablePtr = GetTagTable('Image::ExifTool::FujiFilm::IFD');
1688
1688
  # this is TIFF-format data only for some models, so no warning if it fails
1689
1689
  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);
1690
+ # do hash of image data if necessary
1691
+ $et->ImageDataHash($raf, $len, 'raw') if $$et{ImageDataHash} and $raf->Seek($start,0);
1692
1692
  }
1693
1693
  delete $$et{SET_GROUP1};
1694
1694
  $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