exiftool_vendored 13.33.0 → 13.36.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5188f2fb9bb03c179101219cd17d5129411b4f517c3e6acd10c915336d0fa89e
4
- data.tar.gz: 953b6ce7f3f1a259cbc4f34e7b72a4851460d762297132f9498306644aede5e5
3
+ metadata.gz: 48115655191684a1376bb6803a1831f0364e3561b84fef9227979c762d840a9f
4
+ data.tar.gz: f8297fca14ffbfb66f8c5eca245f8096a940df011ae4a41dbe6ce4120c34b90b
5
5
  SHA512:
6
- metadata.gz: 6bc2708043ba0de2e7f492c456f0257a342771e7d962a306620ded3ce97a30727087a0d5200ed615ac083b394f8dee318b4e7e68e472739028df1c98d91e17fa
7
- data.tar.gz: b2ce97b5597a47050ed22df9baec8a3b760f3da83956fd7c842e0d4eddbcc6b44597b0c40f024bfca54421141f27c954aae6bee6f51dbdb3eba271fa84cfb69f
6
+ metadata.gz: 3a122b46c9c3a876d70c732db1e2e5c7e039c7d1c7cf4735c41a1ceac1384a4ce4f9f42a04c7156932e105fbc8bfa3cef366f9fd17452ecb6fab41f78247f2f3
7
+ data.tar.gz: 6b105de18581c29ea2c56882113ada5e8519861f575e37be65282db903a6d49812c6b0b544d1bf3c3e1f35fb34bc9633bfd798b852e79c6020a113767c2db65d
data/bin/Changes CHANGED
@@ -4,9 +4,56 @@ 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. 9, 2025 - Version 13.36 (production release)
11
+
12
+ - Added a new Nikon LensID (thanks Max, github #345)
13
+ - Added new Sony and Pentax camera ID's (thanks Hubert Figuiere, github #347)
14
+ - Tolerate 'junk' after 'WAVE' chunk in LA, PAC, OFR and WV audio files
15
+ - Use gnu tar 1.35 to build the .tar.gz distribution package (versions
16
+ 13.31-13.35 used bsdtar 3.5.3, and earlier versions used bsdtar 2.8.3)
17
+
18
+ Sept. 6, 2025 - Version 13.35 (production release)
19
+
20
+ - Added a new CanonModelID
21
+ - Added new Olympus PictureMode and LensType values (thanks Michael Meissner)
22
+ - Decode GPS from another DJI protobuf format (DJI Neo)
23
+ - Decode a few new FujiFilm tags
24
+ - Enhanced -ee option to extract M-RAW information from all images in FujiFilm
25
+ RAF files
26
+ - Improved handling of standard-format unknown XMP date/time tags when the API
27
+ XMPAutoConv option is set (which is the default) to put them in the "Time"
28
+ group and apply the -d date/time formatting
29
+ - Improved -fileNUM option so it may be used to access tags from alternate
30
+ files when the specified target FILE doesn't exist
31
+ - Improved print conversions for some Canon tags to handle "n/a" values
32
+ - Enhanced JSON long output (-j -l) so the API SaveBin option also returns the
33
+ Rational ("rat") value if available
34
+ - Changed -if option so the expression is evaluated even when the source file
35
+ doesn't exist (to allow more flexibily when using -fileNUM option or when
36
+ creating the output file when writing)
37
+ - Fixed decoding of a few new Pentax tags (thanks Karsten Gieselmann)
38
+ - Fixed -diff feature to report differences in binary-data values and to be
39
+ consistent with handling of backslashes in Windows path names
40
+
41
+ Aug. 18, 2025 - Version 13.34
42
+
43
+ - Decode a number of new Pentax tags (thanks Karsten Gieselmann)
44
+ - Decode a new Canon tag (thanks Peter Wem, github #344)
45
+ - Updated Sony decoding for the ILME-FX2 and DSC-RX1RM3 (thanks Jos Roost)
46
+ - Minor fixes to decoding of new Olympus tags (thanks Karsten Gieselmann)
47
+ - Reverted change of 13.20 which changed the behaviour when writing
48
+ incorrectly-formatted date/time values
49
+ - Patched to avoid "uninitialized value $module" when using some custom config
50
+ files
51
+ - Fixed issue reading maker notes from some Sony ILCE models
52
+ - API Changes:
53
+ - Added UndefTags option to allow -m
54
+ and/or -f to be used without modifying the value of undef tags in -if
55
+ expressions (which was the behaviour prior to version 12.60)
56
+
10
57
  July 25, 2025 - Version 13.33
11
58
 
12
59
  - Added read support for TNEF files (eg. "winmail.dat")
@@ -14,13 +61,15 @@ July 25, 2025 - Version 13.33
14
61
  - Decode Canon FocusBracketing tag (github #340)
15
62
  - Decode more tags for newer Nikon Z models (thanks Warren Hatch)
16
63
  - Decode a few more Olympus tags (thanks Karsten Gieselmann)
64
+ - Decode face detection tags for the Pentax K-3III (thanks Karsten Gieselmann)
17
65
  - Decode a few more FujiFilm tags (github #343)
18
66
  - Handle Olympus RawDev2IFD tag 0x8000 (named it RawDevSubIFD)
19
67
  - Improved recognition of some Sony lenses (github #342)
20
- - Enhanced the -p option to cycle through sub-subdocuments
21
- - Improved extraction of GoPro timed GPS to use sub-subdocuments to separate
22
- the individual fixes, allowing -p to extract all fixes at sub-second
23
- resolution (althought for earlier models these don't all contain timestamps)
68
+ - Enhanced the -p option to cycle through sub-documents
69
+ - Improved extraction of GoPro timed GPS to use sub-document numbers to
70
+ separate the individual fixes, allowing -p to extract all fixes at
71
+ sub-second resolution (although for earlier models these may not contain
72
+ timestamps)
24
73
  - Extract EXIF information from Sigma fp MOV videos
25
74
  - Patched to avoid "multi-segment EXIF with external pointers" error when
26
75
  writing Olympus OM-1 JPG files converted by some utilities
data/bin/META.json CHANGED
@@ -50,6 +50,6 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.33",
53
+ "version" : "13.36",
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.33'
34
+ version: '13.36'
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.33.tar.gz | tar -xf -
114
- cd Image-ExifTool-13.33
113
+ gzip -dc Image-ExifTool-13.36.tar.gz | tar -xf -
114
+ cd Image-ExifTool-13.36
115
115
  ./exiftool t/images/ExifTool.jpg
116
116
 
117
117
  Note: These commands extract meta information from one of the test images.
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.33';
14
+ my $version = '13.36';
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
  }
@@ -5831,12 +5835,12 @@ escaped. The inverse conversion is applied when writing tags.
5831
5835
  =item B<-f> (B<-forcePrint>)
5832
5836
 
5833
5837
  Force printing of tags even if they don't exist. This option applies to
5834
- tags specified on the command line, or with the B<-p>, B<-if> or
5835
- B<-tagsFromFile> options. When B<-f> is used, the value of any missing tag
5836
- is set to a dash (C<->) by default, but this may be configured via the API
5837
- MissingTagValue option. B<-f> is also used to add a 'flags' attribute to
5838
- the B<-listx> output, or to allow tags to be deleted when writing with the
5839
- B<-csv>=I<CSVFILE> feature.
5838
+ tags specified on the command line, or with the B<-p>, B<-if> (unless the
5839
+ API UndefTags option is set), B<-fileNUM> or B<-tagsFromFile> options. When
5840
+ B<-f> is used, the value of any missing tag is set to a dash (C<->) by
5841
+ default, but this may be configured via the API MissingTagValue option.
5842
+ B<-f> is also used to add a 'flags' attribute to the B<-listx> output, or to
5843
+ allow tags to be deleted when writing with the B<-csv>=I<CSVFILE> feature.
5840
5844
 
5841
5845
  =item B<-g>[I<NUM>][:I<NUM>...] (B<-groupHeadings>)
5842
5846
 
@@ -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
@@ -6001,7 +6007,7 @@ translation, follow these steps (you must have Perl installed for this):
6001
6007
  6. Edit the generated language module lib/Image/ExifTool/Lang/ru.pm, and
6002
6008
  search and replace all 'MISSING' strings in the file with your translations.
6003
6009
 
6004
- 7. Email the module ('ru.pm' in this example) to exiftool.team@gmail.com
6010
+ 7. Email the module ('ru.pm' in this example) to exiftool@gmail.com
6005
6011
 
6006
6012
  8. Thank you!!
6007
6013
 
@@ -6011,7 +6017,7 @@ For list-type tags, this causes only the item with the specified index to be
6011
6017
  extracted. I<INDEX> is 0 for the first item in the list. Negative indices
6012
6018
  may also be used to reference items from the end of the list. Has no effect
6013
6019
  on single-valued tags. Also applies to tag values when copying from a tag,
6014
- and in B<-if> conditions.
6020
+ and in B<-if>, B<-p> and B<-fileNUM> arguments.
6015
6021
 
6016
6022
  =item B<-n> (B<--printConv>)
6017
6023
 
@@ -6076,7 +6082,7 @@ with this command:
6076
6082
 
6077
6083
  produces output like this:
6078
6084
 
6079
- -- Generated by ExifTool 13.33 --
6085
+ -- Generated by ExifTool 13.36 --
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
@@ -6624,11 +6630,8 @@ Notes:
6624
6630
 
6625
6631
  1) The B<-n> and B<-b> options also apply to tags used in I<EXPR>.
6626
6632
 
6627
- 2) Some binary data blocks are not extracted unless specified explicitly.
6628
- These tags are not available for use in the B<-if> condition unless they are
6629
- also specified on the command line. The alternative is to use the
6630
- C<$GROUP:all> syntax. (eg. Use C<$exif:all> instead of C<$exif> in I<EXPR>
6631
- to test for the existence of EXIF tags.)
6633
+ 2) The API RequestTags option is automatically set for all tags used in the
6634
+ B<-if> condition.
6632
6635
 
6633
6636
  3) Tags in the string are interpolated in a similar way to B<-p> before the
6634
6637
  expression is evaluated. In this interpolation, C<$/> is converted to a
@@ -6650,8 +6653,8 @@ C<$Copy1:TAG>, C<$Copy2:TAG>, etc).
6650
6653
  command when B<-execute> was used, and may be used like any other tag in the
6651
6654
  condition (ie. "$OK").
6652
6655
 
6653
- 7) The API RequestTags option is automatically set for all tags used in the
6654
- B<-if> condition.
6656
+ 7) The values of undefined tags in the expression are affected by the B<-f>
6657
+ and B<-m> options unless the API UndefTags option is also set.
6655
6658
 
6656
6659
  8) The condition fails if a Perl error occurs. This could happen for
6657
6660
  instance if an undefined value (eg. a missing tag) is used improperly.
@@ -6666,8 +6669,9 @@ so ExifTool leaves it up to you to make the final decision. Minor errors
6666
6669
  and warnings are indicated by "[minor]" at the start of the message.
6667
6670
  Warnings which affect processing when ignored are indicated by "[Minor]"
6668
6671
  (with a capital "M"). Note that this causes missing values in
6669
- B<-tagsFromFile>, B<-p> and B<-if> strings to be set to an empty string
6670
- rather than an undefined value.
6672
+ B<-tagsFromFile>, B<-p>, B<-if> and B<-fileNUM> strings to be set to an
6673
+ empty string rather than an undefined value (but this may be avoided for
6674
+ B<-if> using the API UndefTags option).
6671
6675
 
6672
6676
  =item B<-o> I<OUTFILE> or I<FMT> (B<-out>)
6673
6677
 
@@ -7175,6 +7179,10 @@ Subtle note: If a B<-tagsFromFile> option is used, tags in the I<ALTFILE>
7175
7179
  argument come from the I<SRCFILE> that applies to the first argument
7176
7180
  accessing tags from the corresponding C<FileNUM> group.
7177
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
+
7178
7186
  User-defined Composite tags may access tags from alternate files using the
7179
7187
  appropriate (case-sensitive) family 8 group name.
7180
7188
 
@@ -7279,11 +7287,11 @@ Set user parameter. I<PARAM> is an arbitrary user parameter name. This is
7279
7287
  an interface to the API UserParam option (see the
7280
7288
  L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and
7281
7289
  provides a method to access user-defined parameters in arguments to the
7282
- B<-if> and B<-p> options as if they were any other tag. Appending a hash
7283
- tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also causes the
7284
- parameter to be extracted as a normal tag in the UserParam group. Similar
7285
- to the B<-api> option, the parameter value is set to 1 if I<=VAL> is
7286
- omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if
7290
+ B<-if>, B<-p> and B<-fileNUM> options as if they were any other tag.
7291
+ Appending a hash tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also
7292
+ causes the parameter to be extracted as a normal tag in the UserParam group.
7293
+ Similar to the B<-api> option, the parameter value is set to 1 if I<=VAL>
7294
+ is omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if
7287
7295
  I<VAL> is omitted with C<^=>.
7288
7296
 
7289
7297
  exiftool -p '$test from $filename' -userparam test=Hello FILE
@@ -7293,18 +7301,20 @@ I<VAL> is omitted with C<^=>.
7293
7301
  =head3 Advanced formatting feature
7294
7302
 
7295
7303
  An advanced formatting feature allows modification of the value of any tag
7296
- interpolated within a B<-if> or B<-p> option argument, or a B<-tagsFromFile>
7297
- redirection string. Tag names within these strings are prefixed by a C<$>
7298
- symbol, and an arbitrary Perl expression may be applied to the tag value by
7299
- placing braces around the tag name and inserting the expression after the
7300
- name, separated by a semicolon (ie. C<${TAG;EXPR}>). The expression acts on
7301
- the value of the tag through the default input variable (C<$_>), and has
7302
- access to the full ExifTool API through the current ExifTool object
7303
- (C<$self>) and the tag key (C<$tag>). It may contain any valid Perl code,
7304
- including translation (C<tr///>) and substitution (C<s///>) operations, but
7305
- note that braces within the expression must be balanced. The example below
7306
- prints the camera Make with spaces translated to underlines, and multiple
7307
- consecutive underlines replaced by a single underline:
7304
+ interpolated within a B<-if>, B<-p> or B<-fileNUM> argument, or a
7305
+ B<-tagsFromFile> redirection string. Tag names within these strings are
7306
+ prefixed by a C<$> symbol, and an arbitrary Perl expression may be applied
7307
+ to the tag value by placing braces around the tag name and inserting the
7308
+ expression after the name, separated by a semicolon (ie. C<${TAG;EXPR}>).
7309
+ The expression acts on the value of the tag through the default input
7310
+ variable (C<$_>), and has access to the full ExifTool API through the
7311
+ current ExifTool object (C<$self>) and the tag key (C<$tag>). It may
7312
+ contain any valid Perl code, including translation (C<tr///>) and
7313
+ substitution (C<s///>) operations, but note that braces within the
7314
+ expression must be balanced. If the expression does not modify C<$_> the
7315
+ original tag value is returned. The example below prints the camera Make
7316
+ with spaces translated to underlines, and multiple consecutive underlines
7317
+ replaced by a single underline:
7308
7318
 
7309
7319
  exiftool -p '${make;tr/ /_/;s/__+/_/g}' image.jpg
7310
7320
 
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.94';
91
+ $VERSION = '4.96';
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)
@@ -1006,6 +1006,7 @@ $VERSION = '4.94';
1006
1006
  0x80000491 => 'PowerShot V10', #25
1007
1007
  0x80000495 => 'EOS R1', #PH
1008
1008
  0x80000496 => 'R5 Mark II', #forum16406
1009
+ 0x80000497 => 'PowerShot V1', #PH
1009
1010
  0x80000498 => 'EOS R100', #25
1010
1011
  0x80000516 => 'EOS R50 V', #42
1011
1012
  0x80000520 => 'EOS D2000C', #IB
@@ -2151,6 +2152,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2151
2152
  TagTable => 'Image::ExifTool::Canon::RawBurstInfo',
2152
2153
  }
2153
2154
  },
2155
+ # 0x4049 - related to croping (forum13491) - "8 0 0 0" = no crop, "8 1 0 1" = crop enabled
2154
2156
  0x4059 => { #forum16111
2155
2157
  Name => 'LevelInfo',
2156
2158
  SubDirectory => {
@@ -9171,15 +9173,37 @@ my %filterConv = (
9171
9173
  Name => 'AFConfigTool',
9172
9174
  ValueConv => '$val + 1',
9173
9175
  ValueConvInv => '$val - 1',
9174
- PrintConv => '"Case $val"',
9175
- PrintConvInv => '$val=~/(\d+)/ ? $1 : undef',
9176
+ PrintHex => 1,
9177
+ PrintConv => {
9178
+ 0x80000000 => 'n/a',
9179
+ OTHER => sub { 'Case ' . shift },
9180
+ },
9181
+ PrintConvInv => '$val=~/(\d+)/ ? $1 : 0x80000000',
9182
+ },
9183
+ 2 => {
9184
+ Name => 'AFTrackingSensitivity',
9185
+ PrintHex => 1,
9186
+ PrintConv => {
9187
+ 0x7fffffff => 'n/a',
9188
+ OTHER => sub { shift },
9189
+ },
9176
9190
  },
9177
- 2 => 'AFTrackingSensitivity',
9178
9191
  3 => {
9179
9192
  Name => 'AFAccelDecelTracking',
9180
9193
  Description => 'AF Accel/Decel Tracking',
9194
+ PrintHex => 1,
9195
+ PrintConv => {
9196
+ 0x7fffffff => 'n/a',
9197
+ OTHER => sub { shift },
9198
+ },
9199
+ },
9200
+ 4 => {
9201
+ Name => 'AFPointSwitching',
9202
+ PrintConv => {
9203
+ 0x7fffffff => 'n/a',
9204
+ OTHER => sub { shift },
9205
+ },
9181
9206
  },
9182
- 4 => 'AFPointSwitching',
9183
9207
  5 => { #52
9184
9208
  Name => 'AIServoFirstImage',
9185
9209
  PrintConv => {
@@ -9331,6 +9355,14 @@ my %filterConv = (
9331
9355
  3 => 'Vehicles',
9332
9356
  },
9333
9357
  },
9358
+ 21 => { #github344 (R6)
9359
+ Name => 'SubjectSwitching',
9360
+ PrintConv => {
9361
+ 0 => 'Initial Priority',
9362
+ 1 => 'On Subject',
9363
+ 2 => 'Switch Subject',
9364
+ },
9365
+ },
9334
9366
  24 => { #forum16068
9335
9367
  Name => 'EyeDetection',
9336
9368
  PrintConv => \%offOn,
@@ -18,7 +18,7 @@ use Image::ExifTool::XMP;
18
18
  use Image::ExifTool::GPS;
19
19
  use Image::ExifTool::Protobuf;
20
20
 
21
- $VERSION = '1.14';
21
+ $VERSION = '1.15';
22
22
 
23
23
  sub ProcessDJIInfo($$$);
24
24
  sub ProcessSettings($$$);
@@ -30,6 +30,8 @@ sub ProcessSettings($$$);
30
30
  'dvtm_wm265e.proto' => 1, # Mavic 3
31
31
  'dvtm_pm320.proto' => 1, # Matrice 30
32
32
  'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
33
+ 'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
34
+ 'dvtm_dji_neo.proto' => 1, # Neo
33
35
  );
34
36
 
35
37
  my %convFloat2 = (
@@ -234,13 +236,14 @@ my %convFloat2 = (
234
236
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
235
237
  which use the following protocols: dvtm_AVATA2.proto (Avata 2),
236
238
  dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
237
- dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
238
- dvtm_pm320.proto (Mini 4 Pro).
239
+ dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30),
240
+ dvtm_Mini4_Pro.proto (Mini 4 Pro) and dvtm_dji_neo.proto (DJI Neo).
239
241
 
240
242
  Note that with the protobuf format, numerical tags missing from the output
241
243
  for a given protocol should be considered to have the default value of 0.
242
244
  },
243
245
  Protocol => {
246
+ Notes => "typically protobuf field 1-1-1, but ExifTool doesn't rely on this",
244
247
  RawConv => q{
245
248
  unless ($Image::ExifTool::DJI::knownProtocol{$val}) {
246
249
  $self->Warn("Unknown protocol $val (please submit sample for testing)");
@@ -475,6 +478,53 @@ my %convFloat2 = (
475
478
  Name => 'GimbalInfo',
476
479
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
477
480
  },
481
+ #
482
+ # DJI Neo (very similar to AVATA2)
483
+ #
484
+ # dvtm_dji_neo_1-1-2 - some version number
485
+ # dvtm_dji_neo_1-1-3 - some version number
486
+ 'dvtm_dji_neo_1-1-5' => { Name => 'SerialNumber', Notes => 'DJI Neo' }, # (NC)
487
+ 'dvtm_dji_neo_1-1-10' => 'Model',
488
+ # dvtm_dji_neo_2-2-1-4 - model code?
489
+ # dvtm_dji_neo_2-2-2-1 - some firmware version?
490
+ # dvtm_dji_neo_2-2-2-2 - some version number?
491
+ 'dvtm_dji_neo_2-2-3-1' => 'SerialNumber2', # (NC)
492
+ 'dvtm_dji_neo_2-3' => {
493
+ Name => 'FrameInfo',
494
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
495
+ },
496
+ # dvtm_dji_neo_3-1-1 - frame number (starting at 1)
497
+ 'dvtm_dji_neo_3-1-2' => { # (also 3-2-1-6 and 3-4-1-6)
498
+ Name => 'TimeStamp',
499
+ Groups => { 2 => 'Time' },
500
+ Format => 'unsigned',
501
+ # milliseconds, but I don't know what the zero is
502
+ ValueConv => '$val / 1e6',
503
+ },
504
+ # dvtm_dji_neo_3-2-1-4 - model code?
505
+ # dvtm_dji_neo_3-2-1-5 - frame rate?
506
+ 'dvtm_dji_neo_3-2-2-1' => { Name => 'ISO', Format => 'float' }, # (NC)
507
+ 'dvtm_dji_neo_3-2-4-1' => {
508
+ Name => 'ShutterSpeed',
509
+ Format => 'rational',
510
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
511
+ },
512
+ 'dvtm_dji_neo_3-2-6-1' => { Name => 'ColorTemperature', Format => 'unsigned' }, # (NC)
513
+ 'dvtm_dji_neo_3-2-10-1' => { # (NC)
514
+ Name => 'FNumber',
515
+ Format => 'rational',
516
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
517
+ },
518
+ # dvtm_dji_neo_3-4-1-4 - model code?
519
+ 'dvtm_dji_neo_3-4-3' => { # (NC)
520
+ Name => 'DroneInfo',
521
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
522
+ },
523
+ 'dvtm_dji_neo_3-4-4-1' => {
524
+ Name => 'GPSInfo',
525
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
526
+ },
527
+ 'dvtm_dji_neo_3-4-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' }, # (NC)
478
528
  );
479
529
 
480
530
  %Image::ExifTool::DJI::DroneInfo = (
@@ -502,6 +552,7 @@ my %convFloat2 = (
502
552
  1 => { Name => 'FrameWidth', Format => 'unsigned' },
503
553
  2 => { Name => 'FrameHeight', Format => 'unsigned' },
504
554
  3 => { Name => 'FrameRate', Format => 'float' },
555
+ # 4-8: seen these values respectively for DJI Neo: 1,8,4,1,4
505
556
  );
506
557
 
507
558
  %Image::ExifTool::DJI::GPSInfo = (
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
57
57
  use Image::ExifTool qw(:DataAccess :Utils);
58
58
  use Image::ExifTool::MakerNotes;
59
59
 
60
- $VERSION = '4.59';
60
+ $VERSION = '4.60';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -6362,9 +6362,10 @@ sub ProcessExif($$$)
6362
6362
  $et->Warn("Bad format ($format) for $dir entry $index", $inMakerNotes);
6363
6363
  ++$warnCount;
6364
6364
  }
6365
- # assume corrupted IFD if this is our first entry (except Sony ILCE-7M2 firmware 1.21)
6366
- return 0 unless $index or $$et{Model} eq 'ILCE-7M2';
6367
- next;
6365
+ # assume corrupted IFD if this is our first entry (except Sony ILCE which have an empty first entry)
6366
+ next if $index or $$et{Model} =~ /^ILCE/;
6367
+ # $et->Warn(sprintf('Format code 0x%x encountered -- Possibly corrupted IFD'));
6368
+ return 0;
6368
6369
  }
6369
6370
  }
6370
6371
  my $formatStr = $formatName[$format]; # get name of this format