exiftool_vendored 13.34.0 → 13.37.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +55 -1
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/Makefile.PL +1 -0
  7. data/bin/README +2 -2
  8. data/bin/build_geolocation +7 -3
  9. data/bin/exiftool +43 -33
  10. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  11. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +15 -8
  13. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  14. data/bin/lib/Image/ExifTool/Canon.pm +86 -9
  15. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  16. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  17. data/bin/lib/Image/ExifTool/DJI.pm +59 -8
  18. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  19. data/bin/lib/Image/ExifTool/EXE.pm +3 -2
  20. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  21. data/bin/lib/Image/ExifTool/FLIR.pm +3 -3
  22. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  23. data/bin/lib/Image/ExifTool/FujiFilm.pm +91 -33
  24. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  25. data/bin/lib/Image/ExifTool/GM.pm +1 -1
  26. data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  27. data/bin/lib/Image/ExifTool/Geolocation.pm +3 -1
  28. data/bin/lib/Image/ExifTool/Geotag.pm +10 -2
  29. data/bin/lib/Image/ExifTool/GoPro.pm +5 -5
  30. data/bin/lib/Image/ExifTool/Google.pm +804 -0
  31. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  32. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  33. data/bin/lib/Image/ExifTool/ID3.pm +3 -3
  34. data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  35. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  36. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  37. data/bin/lib/Image/ExifTool/LNK.pm +2 -2
  38. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  39. data/bin/lib/Image/ExifTool/M2TS.pm +4 -6
  40. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  41. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  42. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/MacOS.pm +2 -2
  44. data/bin/lib/Image/ExifTool/MakerNotes.pm +30 -7
  45. data/bin/lib/Image/ExifTool/Microsoft.pm +4 -4
  46. data/bin/lib/Image/ExifTool/Nikon.pm +6 -5
  47. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  48. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  49. data/bin/lib/Image/ExifTool/Olympus.pm +6 -1
  50. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  51. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  52. data/bin/lib/Image/ExifTool/Pentax.pm +51 -39
  53. data/bin/lib/Image/ExifTool/Protobuf.pm +12 -6
  54. data/bin/lib/Image/ExifTool/Qualcomm.pm +2 -2
  55. data/bin/lib/Image/ExifTool/QuickTime.pm +30 -8
  56. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
  57. data/bin/lib/Image/ExifTool/README +7 -6
  58. data/bin/lib/Image/ExifTool/RIFF.pm +5 -3
  59. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  60. data/bin/lib/Image/ExifTool/Reconyx.pm +375 -91
  61. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  62. data/bin/lib/Image/ExifTool/Shortcuts.pm +8 -5
  63. data/bin/lib/Image/ExifTool/Sony.pm +20 -3
  64. data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -2
  65. data/bin/lib/Image/ExifTool/TagLookup.pm +5749 -5695
  66. data/bin/lib/Image/ExifTool/TagNames.pod +690 -519
  67. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  68. data/bin/lib/Image/ExifTool/Trailer.pm +1 -1
  69. data/bin/lib/Image/ExifTool/WPG.pm +1 -1
  70. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  71. data/bin/lib/Image/ExifTool/Writer.pl +2 -1
  72. data/bin/lib/Image/ExifTool/XMP.pm +39 -32
  73. data/bin/lib/Image/ExifTool/XMP2.pl +0 -482
  74. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  75. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  76. data/bin/lib/Image/ExifTool.pm +6 -4
  77. data/bin/lib/Image/ExifTool.pod +3 -3
  78. data/bin/perl-Image-ExifTool.spec +1 -1
  79. data/lib/exiftool_vendored/version.rb +1 -1
  80. metadata +4 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee6400c2f7784efecc62e0876ee90696b3f523abbf6438ee5d3c60e56574ca11
4
- data.tar.gz: 33c0b5f6228fc949cead6b4d357117227b7f5fe74a98cef2377cbfca6c8e9753
3
+ metadata.gz: e99939a853444d1ebc80ab2738cd08bc29f2945044aa74ff682a9205e7e2e878
4
+ data.tar.gz: 14cc3a3e709dd586a4d73d4056c52ee24e74c0020042ecba084211a17ce93381
5
5
  SHA512:
6
- metadata.gz: 50d16f2dfe3be3a2c117f72f244da5b762fb7f876fec921e32f7347f002f50de235da85949121cde69175b9b0a6aa11094e80d7e3a720207c422c750f748a0f1
7
- data.tar.gz: 5cc1844f04cf8a423af7e7e79403b9e817389cf7b357a482a64fa8c693d9b230018c090dcd722a9b9161e2df35184a421c5db984a2805033fc3e0b3e082b964b
6
+ metadata.gz: '098d4af617f88acbc7cba6dd401e894e6eac938b5475b889fab26de2c670aef6320040e3bb5acd1e951d06c95de022e6c76207e67c6f022117566efa13fca872'
7
+ data.tar.gz: 72e570d5b590d04d5a39de9c32698f3946c0f1c0b8bdac6d9010b6c0b94e0418100b6991d16601c5064a093a6d04867290ddc286ae76478e0cc87900a9adb2e3
data/bin/Changes CHANGED
@@ -4,9 +4,63 @@ 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 13.30. (Other versions are
7
+ Note: The most recent production release is Version 13.36. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Sept. 22, 2025 - Version 13.37
11
+
12
+ - Added support for geotagging from Columbus GPS logger CSV files
13
+ - Added some new Canon, Sony and Olympus lenses (thanks Hubert Figuiere,
14
+ github #352 and Jos Roost)
15
+ - Added new Canon RFLensType and CanonModelID values (thanks Norbert Wasser
16
+ and Hubert Figuiere, github #350)
17
+ - Added a new FujiFilm FaceElementType value
18
+ - Decode Reconyx MicroFire and Hyperfire 4K maker notes (thanks Reconyx)
19
+ - Decode a number of new Canon and Pentax tags and add a number of new values
20
+ (thanks Karsten Gieselmann)
21
+ - Decode maker notes from Ricoh GR III videos
22
+ - Decode a new Sony tag (thanks Jos Roost)
23
+ - Decode Google HDRP maker notes
24
+ - Raised size limit on QuickTime atoms extracted for the -ee option, and added
25
+ a minor warning and allow bypassing with the -m option if over this limit
26
+ - Minor change to verbose output for XMP metadata
27
+ - Fixed possible hang/crash when reading Windows executables (github #351)
28
+ - Fixed incorrect FujiFilm PanoramaDirection values
29
+ - API Changes:
30
+ - Fixed GeoDir option so alternate languages are loaded properly when a
31
+ relative path is used
32
+
33
+ Sept. 9, 2025 - Version 13.36 (production release)
34
+
35
+ - Added a new Nikon LensID (thanks Max, github #345)
36
+ - Added new Sony and Pentax camera ID's (thanks Hubert Figuiere, github #347)
37
+ - Tolerate 'junk' after 'WAVE' chunk in LA, PAC, OFR and WV audio files
38
+ - Use gnu tar 1.35 to build the .tar.gz distribution package (versions
39
+ 13.31-13.35 used bsdtar 3.5.3, and earlier versions used bsdtar 2.8.3)
40
+
41
+ Sept. 6, 2025 - Version 13.35 (production release)
42
+
43
+ - Added a new CanonModelID
44
+ - Added new Olympus PictureMode and LensType values (thanks Michael Meissner)
45
+ - Decode GPS from another DJI protobuf format (DJI Neo)
46
+ - Decode a few new FujiFilm tags
47
+ - Enhanced -ee option to extract M-RAW information from all images in FujiFilm
48
+ RAF files
49
+ - Improved handling of standard-format unknown XMP date/time tags when the API
50
+ XMPAutoConv option is set (which is the default) to put them in the "Time"
51
+ group and apply the -d date/time formatting
52
+ - Improved -fileNUM option so it may be used to access tags from alternate
53
+ files when the specified target FILE doesn't exist
54
+ - Improved print conversions for some Canon tags to handle "n/a" values
55
+ - Enhanced JSON long output (-j -l) so the API SaveBin option also returns the
56
+ Rational ("rat") value if available
57
+ - Changed -if option so the expression is evaluated even when the source file
58
+ doesn't exist (to allow more flexibily when using -fileNUM option or when
59
+ creating the output file when writing)
60
+ - Fixed decoding of a few new Pentax tags (thanks Karsten Gieselmann)
61
+ - Fixed -diff feature to report differences in binary-data values and to be
62
+ consistent with handling of backslashes in Windows path names
63
+
10
64
  Aug. 18, 2025 - Version 13.34
11
65
 
12
66
  - Decode a number of new Pentax tags (thanks Karsten Gieselmann)
data/bin/MANIFEST CHANGED
@@ -87,6 +87,7 @@ html/TagNames/GM.html
87
87
  html/TagNames/GPS.html
88
88
  html/TagNames/GeoTiff.html
89
89
  html/TagNames/GoPro.html
90
+ html/TagNames/Google.html
90
91
  html/TagNames/H264.html
91
92
  html/TagNames/HP.html
92
93
  html/TagNames/HTML.html
@@ -308,6 +309,7 @@ lib/Image/ExifTool/FujiFilm.pm
308
309
  lib/Image/ExifTool/GE.pm
309
310
  lib/Image/ExifTool/GIF.pm
310
311
  lib/Image/ExifTool/GIMP.pm
312
+ lib/Image/ExifTool/Google.pm
311
313
  lib/Image/ExifTool/GM.pm
312
314
  lib/Image/ExifTool/GPS.pm
313
315
  lib/Image/ExifTool/GeoTiff.pm
@@ -645,6 +647,8 @@ t/Geotag_8.out
645
647
  t/Geotag_9.out
646
648
  t/GoPro.t
647
649
  t/GoPro_2.out
650
+ t/Google.t
651
+ t/Google_2.out
648
652
  t/HTML.t
649
653
  t/HTML_2.out
650
654
  t/ICO.t
@@ -1095,6 +1099,7 @@ t/images/Geotag2.log
1095
1099
  t/images/Geotag3.log
1096
1100
  t/images/Geotag_DJI_2020-12-02_[07-50-31].csv
1097
1101
  t/images/GoPro.jpg
1102
+ t/images/Google.jpg
1098
1103
  t/images/HTML.html
1099
1104
  t/images/ICC_Profile.icc
1100
1105
  t/images/ICO.ico
data/bin/META.json CHANGED
@@ -50,6 +50,6 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.34",
53
+ "version" : "13.37",
54
54
  "x_serialization_backend" : "JSON::PP version 4.06"
55
55
  }
data/bin/META.yml CHANGED
@@ -31,5 +31,5 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.34'
34
+ version: '13.37'
35
35
  x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
data/bin/Makefile.PL CHANGED
@@ -46,6 +46,7 @@ WriteMakefile(
46
46
  },
47
47
  } ) : ()),
48
48
  clean => { FILES => 't/*.tmp' },
49
+ dist => { TAR => 'gtar' },
49
50
  EXE_FILES => [ 'exiftool' ],
50
51
  ($] >= 5.005 ?
51
52
  (ABSTRACT_FROM => $ExifTool_pod,
data/bin/README CHANGED
@@ -110,8 +110,8 @@ your home directory, then you would type the following commands in a
110
110
  terminal window to extract and run ExifTool:
111
111
 
112
112
  cd ~/Desktop
113
- gzip -dc Image-ExifTool-13.34.tar.gz | tar -xf -
114
- cd Image-ExifTool-13.34
113
+ gzip -dc Image-ExifTool-13.37.tar.gz | tar -xf -
114
+ cd Image-ExifTool-13.37
115
115
  ./exiftool t/images/ExifTool.jpg
116
116
 
117
117
  Note: These commands extract meta information from one of the test images.
@@ -16,6 +16,9 @@
16
16
  # under ActivePerl
17
17
  # 2024-04-29 - PH Added feature types and default to db v1.03
18
18
  # 2024-06-13 - PH Tweaked case of imported feature types
19
+ # 2025-09-11 - PH Changed priority of alternate-language names to
20
+ # use the preferred name if available and fixed
21
+ # flag counts in verbose output
19
22
  #
20
23
  # Notes: Requires these files from https://download.geonames.org/export/
21
24
  #
@@ -564,7 +567,8 @@ if (not $noLang and open INFILE, '<', "$dbdir/$altNamesFile") {
564
567
  $items[$_] and $flags |= (1<<($_-4)) foreach 4,5,6,7;
565
568
  $flags{$items[1]} = ( $flags{$items[1]} || 0 ) | $flags;
566
569
  next if $items[6] or $items[7]; # ignore colloquial and historic names
567
- my $pri = $items[5] ? 0 : ($items[4] ? 1 : 2); # priority for best type of name
570
+ # give more weight to preferred name and less weight to short name
571
+ my $pri = ($items[4] ? 2 : 0) + ($items[5] ? 0 : 1);
568
572
  my $langPri = $bestPri{$lng};
569
573
  $langPri or $langPri = $bestPri{$lng} = { };
570
574
  next if $$langPri{$items[1]} and $$langPri{$items[1]} > $pri;
@@ -930,9 +934,9 @@ if ($noLang) {
930
934
  print "$type flags:\n";
931
935
  printf(" 0x%.2x - %d\n", 0, $$flags{0} || 0);
932
936
  my @label = qw(preferred short colloquial historic);
933
- foreach my $bit (0..5) {
937
+ foreach my $bit (0..3) {
934
938
  my $n = 0;
935
- $_ & (1<<$bit) and ++$n foreach keys %$flags;
939
+ $_ & (1<<$bit) and $n += $$flags{$_} foreach keys %$flags;
936
940
  printf(" 0x%.2x - %d (%s)\n", (1<<$bit), $n, shift(@label)) if $n;
937
941
  }
938
942
  }
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.34';
14
+ my $version = '13.37';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -57,7 +57,7 @@ sub FormatJSON($$$;$);
57
57
  sub PrintCSV(;$);
58
58
  sub AddGroups($$$$);
59
59
  sub ConvertBinary($);
60
- sub IsEqual($$);
60
+ sub IsEqual($$;$);
61
61
  sub Printable($);
62
62
  sub LengthUTF8($);
63
63
  sub Infile($;$);
@@ -969,6 +969,7 @@ for (;;) {
969
969
  if (/^diff$/i) {
970
970
  $diff = shift;
971
971
  defined $diff or Error("Expecting file name for -$_ option\n"), $badCmd=1;
972
+ CleanFilename($diff); # change to forward slashes if necessary
972
973
  next;
973
974
  }
974
975
  /^delete_original(!?)$/i and $deleteOrig = ($1 ? 2 : 1), next;
@@ -2150,10 +2151,12 @@ sub GetImageInfo($$)
2150
2151
  # set alternate file names
2151
2152
  foreach $g8 (sort keys %altFile) {
2152
2153
  my $altName = $orig;
2153
- # must double any '$' symbols in the original file name because
2154
- # they are used for tag names in a -fileNUM argument
2155
- $altName =~ s/\$/\$\$/g;
2156
- $altName = FilenameSPrintf($altFile{$g8}, $altName);
2154
+ unless ($altFile{$g8} eq '@') {
2155
+ # must double any '$' symbols in the original file name because
2156
+ # they are used for tag names in a -fileNUM argument
2157
+ $altName =~ s/\$/\$\$/g;
2158
+ $altName = FilenameSPrintf($altFile{$g8}, $altName);
2159
+ }
2157
2160
  $et->SetAlternateFile($g8, $altName);
2158
2161
  }
2159
2162
 
@@ -2178,15 +2181,7 @@ sub GetImageInfo($$)
2178
2181
  }
2179
2182
  # evaluate -if expression for conditional processing
2180
2183
  if (@condition) {
2181
- unless ($file eq '-' or $et->Exists($file)) {
2182
- Warn "Error: File not found - $file\n";
2183
- EFile($file);
2184
- FileNotFound($file);
2185
- ++$countBad;
2186
- return;
2187
- }
2188
2184
  my $result;
2189
-
2190
2185
  unless ($failCondition) {
2191
2186
  # catch run time errors as well as compile errors
2192
2187
  undef $evalWarning;
@@ -2225,7 +2220,10 @@ sub GetImageInfo($$)
2225
2220
  }
2226
2221
  undef @foundTags if $fastCondition; # ignore if we didn't get all tags
2227
2222
  }
2228
- unless ($result) {
2223
+ if ($result) {
2224
+ # discard $info for non-existent file
2225
+ undef $info unless $file eq '-' or $et->Exists($file);
2226
+ } else {
2229
2227
  Progress($vout, "-------- $file (failed condition)") if $verbose;
2230
2228
  EFile($file, 2);
2231
2229
  ++$countFailed;
@@ -2922,7 +2920,7 @@ TAG: foreach $tag (@foundTags) {
2922
2920
  $val = $et->GetValue($tag, 'ValueConv');
2923
2921
  $val = '' unless defined $val;
2924
2922
  # go back to print ValueConv value only if different
2925
- next unless IsEqual($val, $lastVal);
2923
+ next unless IsEqual($val, $lastVal, 1);
2926
2924
  print $fp "$descClose\n </$tok>";
2927
2925
  last;
2928
2926
  }
@@ -2959,7 +2957,7 @@ TAG: foreach $tag (@foundTags) {
2959
2957
  $$val{desc} = $desc;
2960
2958
  if ($printConv) {
2961
2959
  my $num = $et->GetValue($tag, 'ValueConv');
2962
- $$val{num} = $num if defined $num and not IsEqual($num, $$val{val});
2960
+ $$val{num} = $num if defined $num and not IsEqual($num, $$val{val}, 1);
2963
2961
  }
2964
2962
  my $ex = $$et{TAG_EXTRA}{$tag};
2965
2963
  $$val{'fmt'} = $$ex{G6} if defined $$ex{G6};
@@ -2972,6 +2970,7 @@ TAG: foreach $tag (@foundTags) {
2972
2970
  $$val{'hex'} = join ' ', unpack '(H2)*', $$ex{BinVal};
2973
2971
  }
2974
2972
  }
2973
+ $$val{rat} = $$ex{Rational} if defined $$ex{Rational} and $$et{OPTIONS}{SaveBin};
2975
2974
  }
2976
2975
  }
2977
2976
  FormatJSON($fp, $val, $ind, $quote);
@@ -3945,24 +3944,29 @@ sub ConvertBinary($)
3945
3944
 
3946
3945
  #------------------------------------------------------------------------------
3947
3946
  # Compare ValueConv and PrintConv values of a tag to see if they are equal
3948
- # Inputs: 0) value1, 1) value2
3947
+ # Inputs: 0) value1, 1) value2, 2) flag to return true for any scalar references
3949
3948
  # Returns: true if they are equal
3950
- sub IsEqual($$)
3949
+ sub IsEqual($$;$)
3951
3950
  {
3952
- my ($a, $b) = @_;
3951
+ my ($a, $b, $trueScalar) = @_;
3953
3952
  # (scalar values are not print-converted)
3954
- return 1 if $a eq $b or ref $a eq 'SCALAR';
3953
+ return 1 if $a eq $b;
3954
+ if (ref $a eq 'SCALAR') {
3955
+ return 1 if $trueScalar;
3956
+ return 1 if ref $b eq 'SCALAR' and $$a eq $$b;
3957
+ return 0;
3958
+ }
3955
3959
  if (ref $a eq 'HASH' and ref $b eq 'HASH') {
3956
3960
  return 0 if scalar(keys %$a) != scalar(keys %$b);
3957
3961
  my $key;
3958
3962
  foreach $key (keys %$a) {
3959
- return 0 unless IsEqual($$a{$key}, $$b{$key});
3963
+ return 0 unless IsEqual($$a{$key}, $$b{$key}, $trueScalar);
3960
3964
  }
3961
3965
  } else {
3962
3966
  return 0 if ref $a ne 'ARRAY' or ref $b ne 'ARRAY' or @$a != @$b;
3963
3967
  my $i;
3964
3968
  for ($i=0; $i<scalar(@$a); ++$i) {
3965
- return 0 unless IsEqual($$a[$i], $$b[$i]);
3969
+ return 0 unless IsEqual($$a[$i], $$b[$i], $trueScalar);
3966
3970
  }
3967
3971
  }
3968
3972
  return 1;
@@ -4380,7 +4384,7 @@ sub FindFileWindows($$)
4380
4384
  # recode file name as UTF-8 if necessary
4381
4385
  my $enc = $et->Options('CharsetFileName');
4382
4386
  $wildfile = $et->Decode($wildfile, $enc, undef, 'UTF8') if $enc and $enc ne 'UTF8';
4383
- $wildfile =~ tr/\\/\//; # use forward slashes
4387
+ CleanFilename($wildfile); # use forward slashes
4384
4388
  my ($dir, $wildname) = ($wildfile =~ m{(.*[:/])(.*)}) ? ($1, $2) : ('', $wildfile);
4385
4389
  if (HasWildcards($dir)) {
4386
4390
  Warn "Wildcards don't work in the directory specification\n";
@@ -4460,7 +4464,7 @@ sub AbsPath($)
4460
4464
  local $SIG{'__WARN__'} = sub { };
4461
4465
  $path = eval { Cwd::abs_path($file) };
4462
4466
  }
4463
- $path =~ tr/\\/\// if $^O eq 'MSWin32' and defined $path; # use forward slashes
4467
+ CleanFilename($path) if defined $path; # use forward slashes
4464
4468
  }
4465
4469
  return $path;
4466
4470
  }
@@ -5901,13 +5905,15 @@ Adding the B<-D> or B<-H> option changes tag values to JSON objects with
5901
5905
  "val" and "id" fields. Adding B<-l> adds a "desc" field, and a "num" field
5902
5906
  if the numerical value is different from the converted "val", and "fmt" and
5903
5907
  "hex" fields for EXIF metadata if the API SaveFormat and SaveBin options are
5904
- set respectively, and the length of the "hex" output is limited by the API
5905
- LimitLongValues setting. The B<-b> option may be added to output binary
5906
- data, encoded in base64 if necessary (indicated by ASCII "base64:" as the
5907
- first 7 bytes of the value), and B<-t> may be added to include tag table
5908
- information (see B<-t> for details). The JSON output is UTF-8 regardless of
5909
- any B<-L> or B<-charset> option setting, but the UTF-8 validation is
5910
- disabled if a character set other than UTF-8 is specified.
5908
+ set respectively. The length of the "hex" output is limited by the API
5909
+ LimitLongValues setting. Setting the SaveBin option also causes the
5910
+ original values of Rational tags to be returned in string form as an extra
5911
+ "rat" field. The B<-b> option may be added to output binary data, encoded
5912
+ in base64 if necessary (indicated by ASCII "base64:" as the first 7 bytes of
5913
+ the value), and B<-t> may be added to include tag table information (see
5914
+ B<-t> for details). The JSON output is UTF-8 regardless of any B<-L> or
5915
+ B<-charset> option setting, but the UTF-8 validation is disabled if a
5916
+ character set other than UTF-8 is specified.
5911
5917
 
5912
5918
  Note that ExifTool quotes JSON values only if they don't look like numbers
5913
5919
  (regardless of the original storage format or the relevant metadata
@@ -6076,7 +6082,7 @@ with this command:
6076
6082
 
6077
6083
  produces output like this:
6078
6084
 
6079
- -- Generated by ExifTool 13.34 --
6085
+ -- Generated by ExifTool 13.37 --
6080
6086
  File: a.jpg - 2003:10:31 15:44:19
6081
6087
  (f/5.6, 1/60s, ISO 100)
6082
6088
  File: b.jpg - 2006:05:23 11:57:38
@@ -7173,6 +7179,10 @@ Subtle note: If a B<-tagsFromFile> option is used, tags in the I<ALTFILE>
7173
7179
  argument come from the I<SRCFILE> that applies to the first argument
7174
7180
  accessing tags from the corresponding C<FileNUM> group.
7175
7181
 
7182
+ I<ALTFILE> may also be C<@> to access tags from the specified I<FILE>, which
7183
+ may be useful when the B<-srcfile> option is used to process a different
7184
+ source file.
7185
+
7176
7186
  User-defined Composite tags may access tags from alternate files using the
7177
7187
  appropriate (case-sensitive) family 8 group name.
7178
7188
 
@@ -88,7 +88,7 @@ sub ProcessAudible_cvrx($$$);
88
88
  PROCESS_PROC => \&ProcessAudible_cvrx,
89
89
  GROUPS => { 0 => 'QuickTime', 2 => 'Audio' },
90
90
  NOTES => 'Audible cover art information in M4B audio books.',
91
- VARS => { NO_ID => 1 },
91
+ VARS => { ID_FMT => 'none' },
92
92
  CoverArtType => 'CoverArtType',
93
93
  CoverArt => {
94
94
  Name => 'CoverArt',
@@ -234,7 +234,7 @@ my %fixed2_30 = (
234
234
  %Image::ExifTool::BMP::Extra = (
235
235
  GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
236
236
  NOTES => 'Extra information extracted from some BMP images.',
237
- VARS => { NO_ID => 1 },
237
+ VARS => { ID_FMT => 'none' },
238
238
  LinkedProfileName => { },
239
239
  ICC_Profile => { SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' } },
240
240
  EmbeddedJPG => {
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
35
35
  use Image::ExifTool::Validate;
36
36
  use Image::ExifTool::MacOS;
37
37
 
38
- $VERSION = '3.62';
38
+ $VERSION = '3.63';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -109,6 +109,7 @@ my %tweakOrder = (
109
109
  'FujiFilm::RAFData' => 'FujiFilm::RAF',
110
110
  'QuickTime::AudioKeys' => 'QuickTime::Keys',
111
111
  'QuickTime::VideoKeys' => 'QuickTime::AudioKeys',
112
+ 'Google::HDRPText' => 'Google::HDRPlusMakerNote',
112
113
  );
113
114
 
114
115
  # list of all recognized Format strings
@@ -867,15 +868,15 @@ sub new
867
868
  $longID{$tableName} = 0;
868
869
  $longName{$tableName} = 0;
869
870
  # save all tag names
870
- my ($tagID, $binaryTable, $noID, $hexID, $isIPTC, $isXMP);
871
+ my ($tagID, $binaryTable, $noID, $prtID, $isIPTC, $isXMP);
871
872
  $isIPTC = 1 if $writeProc and $writeProc eq \&Image::ExifTool::IPTC::WriteIPTC;
872
873
  # generate flattened tag names for structure fields if this is an XMP table
873
874
  if ($$table{GROUPS} and $$table{GROUPS}{0} eq 'XMP' or $$vars{ADD_FLATTENED}) {
874
875
  Image::ExifTool::XMP::AddFlattenedTags($table);
875
876
  $isXMP = 1;
876
877
  }
877
- $noID = 1 if $isXMP or $short =~ /^(Shortcuts|ASF.*)$/ or $$vars{NO_ID};
878
- $hexID = $$vars{HEX_ID};
878
+ $prtID = $$vars{ID_FMT};
879
+ $noID = 1 if $isXMP or $short =~ /^(Shortcuts|ASF.*)$/ or $prtID and $prtID eq 'none';
879
880
  if ($$table{WRITE_PROC} and $$table{WRITE_PROC} eq \&Image::ExifTool::WriteBinaryData
880
881
  and not $$table{CHECK_PROC})
881
882
  {
@@ -1104,7 +1105,7 @@ TagID: foreach $tagID (@keys) {
1104
1105
  $note = 'NOT a flattened tag!';
1105
1106
  } else {
1106
1107
  # add note about different XMP Tag ID
1107
- $note = $$tagInfo{RootTagInfo} ? $tagID : "called $tagID by the spec";
1108
+ $note = $$tagInfo{RootTagInfo} ? $tagID : "tag ID is '${tagID}'";
1108
1109
  }
1109
1110
  if ($$tagInfo{Notes}) {
1110
1111
  $values[-1] =~ s/^\(/($note; /;
@@ -1492,8 +1493,14 @@ TagID: foreach $tagID (@keys) {
1492
1493
  if ($tagID =~ /^(-)?\d+(\.\d+)?$/) {
1493
1494
  if ($1) {
1494
1495
  $tagIDstr = $tagID;
1495
- } elsif (defined $hexID) {
1496
- $tagIDstr = $hexID ? sprintf('0x%.4x',$tagID) : $tagID;
1496
+ } elsif (defined $prtID) {
1497
+ if ($prtID eq 'hex') {
1498
+ $tagIDstr = sprintf('0x%.4x',$tagID);
1499
+ } elsif ($prtID eq 'str') {
1500
+ $tagIDstr = "'${tagID}'";
1501
+ } else {
1502
+ $tagIDstr = $tagID;
1503
+ }
1497
1504
  } elsif (not $2 and not $binaryTable and not $isIPTC and
1498
1505
  not ($short =~ /^CanonCustom/ and $tagID < 256))
1499
1506
  {
@@ -1911,7 +1918,7 @@ sub SortedTagTableKeys($)
1911
1918
  my $table = shift;
1912
1919
  my $vars = $$table{VARS} || { };
1913
1920
  my @keys = TagTableKeys($table);
1914
- if ($$vars{NO_ID}) {
1921
+ if ($$vars{ID_FMT} and $$vars{ID_FMT} eq 'none') {
1915
1922
  # sort by tag name if ID not shown
1916
1923
  my ($key, %name);
1917
1924
  foreach $key (@keys) {
@@ -62,7 +62,7 @@ my %cborType7 = (
62
62
 
63
63
  %Image::ExifTool::CBOR::Main = (
64
64
  GROUPS => { 0 => 'JUMBF', 1 => 'CBOR', 2 => 'Other' },
65
- VARS => { NO_ID => 1 },
65
+ VARS => { ID_FMT => 'none' },
66
66
  PROCESS_PROC => \&ProcessCBOR,
67
67
  NOTES => q{
68
68
  The tags below are extracted from CBOR (Concise Binary Object
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.95';
91
+ $VERSION = '4.97';
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)
@@ -561,7 +561,8 @@ $VERSION = '4.95';
561
561
  4159 => 'Canon EF-M 32mm f/1.4 STM', #42
562
562
  4160 => 'Canon EF-S 35mm f/2.8 Macro IS STM', #42
563
563
  4208 => 'Sigma 56mm f/1.4 DC DN | C or other Sigma Lens', #forum10603
564
- 4208.1 => 'Sigma 30mm F1.4 DC DN | C', #git issue#83 (016)
564
+ 4208.1 => 'Sigma 30mm F1.4 DC DN | C', #github#83 (016)
565
+ 6512 => 'Sigma 12mm F1.4 DC | C', #github#352 (025)
565
566
  # (Nano USM lenses - 0x90xx)
566
567
  36910 => 'Canon EF 70-300mm f/4-5.6 IS II USM', #42
567
568
  36912 => 'Canon EF-S 18-135mm f/3.5-5.6 IS USM', #42
@@ -640,6 +641,7 @@ $VERSION = '4.95';
640
641
  '61182.62' => 'Canon RF 50mm F1.4 L VCM', #42
641
642
  '61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
642
643
  '61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
644
+ '61182.65' => 'Canon RF 85mm F1.4 L VCM', #github350
643
645
  65535 => 'n/a',
644
646
  );
645
647
 
@@ -892,6 +894,7 @@ $VERSION = '4.95';
892
894
 
893
895
  # (see http://cweb.canon.jp/e-support/faq/answer/digitalcamera/10447-1.html for PowerShot/IXUS/IXY names)
894
896
 
897
+ 0x40000227 => 'EOS C50', #github350
895
898
  0x4007d673 => 'DC19/DC21/DC22',
896
899
  0x4007d674 => 'XH A1',
897
900
  0x4007d675 => 'HV10',
@@ -1006,6 +1009,7 @@ $VERSION = '4.95';
1006
1009
  0x80000491 => 'PowerShot V10', #25
1007
1010
  0x80000495 => 'EOS R1', #PH
1008
1011
  0x80000496 => 'R5 Mark II', #forum16406
1012
+ 0x80000497 => 'PowerShot V1', #PH
1009
1013
  0x80000498 => 'EOS R100', #25
1010
1014
  0x80000516 => 'EOS R50 V', #42
1011
1015
  0x80000520 => 'EOS D2000C', #IB
@@ -7047,6 +7051,7 @@ my %ciMaxFocal = (
7047
7051
  325 => 'Canon RF 50mm F1.4 L VCM', #42
7048
7052
  326 => 'Canon RF 24mm F1.4 L VCM', #42
7049
7053
  327 => 'Canon RF 20mm F1.4 L VCM', #42
7054
+ 328 => 'Canon RF 85mm F1.4 L VCM', #42/github350
7050
7055
  # Note: add new RF lenses to %canonLensTypes with ID 61182
7051
7056
  },
7052
7057
  },
@@ -9124,7 +9129,7 @@ my %filterConv = (
9124
9129
  RawConv => '$val == 0x7fffffff ? undef : $val',
9125
9130
  },
9126
9131
  7 => { # -4 to 4
9127
- Name => 'Saturation',
9132
+ Name => 'Saturation',
9128
9133
  RawConv => '$val == 0x7fffffff ? undef : $val',
9129
9134
  %Image::ExifTool::Exif::printParameter,
9130
9135
  },
@@ -9172,15 +9177,40 @@ my %filterConv = (
9172
9177
  Name => 'AFConfigTool',
9173
9178
  ValueConv => '$val + 1',
9174
9179
  ValueConvInv => '$val - 1',
9175
- PrintConv => '"Case $val"',
9176
- PrintConvInv => '$val=~/(\d+)/ ? $1 : undef',
9180
+ PrintHex => 1,
9181
+ PrintConv => {
9182
+ 11 => 'Case A', #KG instead of 'Case 11'. Canon use A for Auto
9183
+ 0x80000000 => 'n/a',
9184
+ OTHER => sub { 'Case ' . shift },
9185
+ },
9186
+ PrintConvInv => '$val=~/(\d+)/ ? $1 : 0x80000000',
9187
+ },
9188
+ 2 => {
9189
+ Name => 'AFTrackingSensitivity',
9190
+ PrintHex => 1,
9191
+ PrintConv => {
9192
+ 127 => 'Auto', #KG
9193
+ 0x7fffffff => 'n/a',
9194
+ OTHER => sub { shift },
9195
+ },
9177
9196
  },
9178
- 2 => 'AFTrackingSensitivity',
9179
9197
  3 => {
9180
9198
  Name => 'AFAccelDecelTracking',
9181
9199
  Description => 'AF Accel/Decel Tracking',
9200
+ PrintHex => 1,
9201
+ PrintConv => {
9202
+ 127 => 'Auto', #KG
9203
+ 0x7fffffff => 'n/a',
9204
+ OTHER => sub { shift },
9205
+ },
9206
+ },
9207
+ 4 => {
9208
+ Name => 'AFPointSwitching',
9209
+ PrintConv => {
9210
+ 0x7fffffff => 'n/a',
9211
+ OTHER => sub { shift },
9212
+ },
9182
9213
  },
9183
- 4 => 'AFPointSwitching',
9184
9214
  5 => { #52
9185
9215
  Name => 'AIServoFirstImage',
9186
9216
  PrintConv => {
@@ -9330,6 +9360,7 @@ my %filterConv = (
9330
9360
  1 => 'People',
9331
9361
  2 => 'Animals',
9332
9362
  3 => 'Vehicles',
9363
+ 4 => 'Auto', #KG (R1, R5m2)
9333
9364
  },
9334
9365
  },
9335
9366
  21 => { #github344 (R6)
@@ -9340,9 +9371,55 @@ my %filterConv = (
9340
9371
  2 => 'Switch Subject',
9341
9372
  },
9342
9373
  },
9343
- 24 => { #forum16068
9374
+ 24 => { #forum16068 #KG extensions for 'left' and 'right'
9344
9375
  Name => 'EyeDetection',
9345
- PrintConv => \%offOn,
9376
+ PrintConv => {
9377
+ 0 => 'Off',
9378
+ 1 => 'Auto',
9379
+ 2 => 'Left Eye',
9380
+ 3 => 'Right Eye',
9381
+ },
9382
+ },
9383
+ # ---------------
9384
+ # Entries 25..31 exist for recent models only (R1, R5m2, ...)
9385
+ # ---------------
9386
+ 26 => { #KG
9387
+ Name => 'WholeAreaTracking',
9388
+ PrintConv => {
9389
+ 0 => 'Off',
9390
+ 1 => 'On',
9391
+ },
9392
+ },
9393
+ 27 => { #KG
9394
+ Name => 'ServoAFCharacteristics',
9395
+ PrintConv => {
9396
+ 0 => 'Case Auto',
9397
+ 1 => 'Case Manual',
9398
+ },
9399
+ },
9400
+ 28 => { #KG
9401
+ Name => 'CaseAutoSetting',
9402
+ PrintConv => {
9403
+ -1 => 'Locked On',
9404
+ 0 => 'Standard',
9405
+ 1 => 'Responsive',
9406
+ 0x7fffffff => 'n/a',
9407
+ },
9408
+ },
9409
+ 29 => { #KG
9410
+ Name => 'ActionPriority',
9411
+ PrintConv => {
9412
+ 0 => 'Off',
9413
+ 1 => 'On',
9414
+ },
9415
+ },
9416
+ 30 => { #KG
9417
+ Name => 'SportEvents',
9418
+ PrintConv => {
9419
+ 0 => 'Soccer',
9420
+ 1 => 'Basketball',
9421
+ 2 => 'Volleyball',
9422
+ }
9346
9423
  },
9347
9424
  );
9348
9425
 
@@ -1004,7 +1004,7 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
1004
1004
  WRITABLE => 1,
1005
1005
  PERMANENT => 1, # (can't add/delete these individually)
1006
1006
  GROUPS => { 1 => 'CanonDR4', 2 => 'Image' },
1007
- VARS => { HEX_ID => 1, SORT_PROC => \&SortDR4 },
1007
+ VARS => { ID_FMT => 'hex', SORT_PROC => \&SortDR4 },
1008
1008
  NOTES => q{
1009
1009
  Tags written by Canon DPP version 4 in CanonVRD trailers and DR4 files. Each
1010
1010
  tag has three associated flag words which are stored with the directory
@@ -25,7 +25,7 @@ $VERSION = '1.04';
25
25
  %Image::ExifTool::CaptureOne::Main = (
26
26
  GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
27
27
  PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
28
- VARS => { NO_ID => 1 },
28
+ VARS => { ID_FMT => 'none' },
29
29
  ColorCorrections => { ValueConv => '\$val' }, # (long list of floating point numbers)
30
30
  );
31
31