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 +4 -4
- data/bin/Changes +54 -5
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/Makefile.PL +1 -0
- data/bin/README +2 -2
- data/bin/exiftool +77 -67
- data/bin/lib/Image/ExifTool/Canon.pm +37 -5
- data/bin/lib/Image/ExifTool/DJI.pm +54 -3
- data/bin/lib/Image/ExifTool/Exif.pm +5 -4
- data/bin/lib/Image/ExifTool/FujiFilm.pm +89 -31
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/M2TS.pm +2 -4
- data/bin/lib/Image/ExifTool/Minolta.pm +3 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +3 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +45 -26
- data/bin/lib/Image/ExifTool/Pentax.pm +71 -9
- data/bin/lib/Image/ExifTool/Protobuf.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/README +2 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +5 -3
- data/bin/lib/Image/ExifTool/Sony.pm +42 -16
- data/bin/lib/Image/ExifTool/TagLookup.pm +13 -3
- data/bin/lib/Image/ExifTool/TagNames.pod +44 -12
- data/bin/lib/Image/ExifTool/Writer.pl +6 -5
- data/bin/lib/Image/ExifTool/XMP.pm +8 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
- data/bin/lib/Image/ExifTool.pm +4 -1
- data/bin/lib/Image/ExifTool.pod +5 -0
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48115655191684a1376bb6803a1831f0364e3561b84fef9227979c762d840a9f
|
4
|
+
data.tar.gz: f8297fca14ffbfb66f8c5eca245f8096a940df011ae4a41dbe6ce4120c34b90b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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-
|
21
|
-
- Improved extraction of GoPro timed GPS to use sub-
|
22
|
-
the individual fixes, allowing -p to extract all fixes at
|
23
|
-
resolution (
|
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
data/bin/META.yml
CHANGED
data/bin/Makefile.PL
CHANGED
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.
|
114
|
-
cd Image-ExifTool-13.
|
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.
|
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
|
-
|
2154
|
-
|
2155
|
-
|
2156
|
-
|
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
|
-
|
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
|
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
|
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
|
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>
|
5835
|
-
|
5836
|
-
is set to a dash (C<->) by
|
5837
|
-
|
5838
|
-
|
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
|
5905
|
-
LimitLongValues setting.
|
5906
|
-
|
5907
|
-
|
5908
|
-
|
5909
|
-
|
5910
|
-
|
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
|
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>
|
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.
|
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)
|
6628
|
-
|
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
|
6654
|
-
B<-
|
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<-
|
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<-
|
7283
|
-
tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also
|
7284
|
-
parameter to be extracted as a normal tag in the UserParam group.
|
7285
|
-
to the B<-api> option, the parameter value is set to 1 if I<=VAL>
|
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<-
|
7297
|
-
redirection string. Tag names within these strings are
|
7298
|
-
symbol, and an arbitrary Perl expression may be applied
|
7299
|
-
placing braces around the tag name and inserting the
|
7300
|
-
name, separated by a semicolon (ie. C<${TAG;EXPR}>).
|
7301
|
-
the value of the tag through the default input
|
7302
|
-
access to the full ExifTool API through the
|
7303
|
-
(C<$self>) and the tag key (C<$tag>). It may
|
7304
|
-
including translation (C<tr///>) and
|
7305
|
-
note that braces within the
|
7306
|
-
|
7307
|
-
|
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.
|
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
|
-
|
9175
|
-
|
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.
|
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)
|
238
|
-
|
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.
|
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
|
6366
|
-
|
6367
|
-
|
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
|