exiftool_vendored 12.62.0 → 12.64.0

Sign up to get free protection for your applications and to get access to all the features.
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