exiftool_vendored 13.34.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 +32 -1
- 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 +43 -33
- data/bin/lib/Image/ExifTool/Canon.pm +28 -5
- data/bin/lib/Image/ExifTool/DJI.pm +54 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +89 -32
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/M2TS.pm +2 -4
- data/bin/lib/Image/ExifTool/Nikon.pm +2 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +5 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +34 -33
- data/bin/lib/Image/ExifTool/Protobuf.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/RIFF.pm +5 -3
- data/bin/lib/Image/ExifTool/Sony.pm +3 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +7 -3
- data/bin/lib/Image/ExifTool/TagNames.pod +29 -11
- data/bin/lib/Image/ExifTool/Writer.pl +2 -1
- data/bin/lib/Image/ExifTool/XMP.pm +8 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
- data/bin/lib/Image/ExifTool.pm +3 -1
- 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,40 @@ 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
|
+
|
10
41
|
Aug. 18, 2025 - Version 13.34
|
11
42
|
|
12
43
|
- Decode a number of new Pentax tags (thanks Karsten Gieselmann)
|
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
|
}
|
@@ -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
|
@@ -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
|
@@ -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 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.95';
|
|
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
|
@@ -9172,15 +9173,37 @@ my %filterConv = (
|
|
9172
9173
|
Name => 'AFConfigTool',
|
9173
9174
|
ValueConv => '$val + 1',
|
9174
9175
|
ValueConvInv => '$val - 1',
|
9175
|
-
|
9176
|
-
|
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
|
+
},
|
9177
9190
|
},
|
9178
|
-
2 => 'AFTrackingSensitivity',
|
9179
9191
|
3 => {
|
9180
9192
|
Name => 'AFAccelDecelTracking',
|
9181
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
|
+
},
|
9182
9206
|
},
|
9183
|
-
4 => 'AFPointSwitching',
|
9184
9207
|
5 => { #52
|
9185
9208
|
Name => 'AIServoFirstImage',
|
9186
9209
|
PrintConv => {
|
@@ -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 = (
|
@@ -31,7 +31,7 @@ use vars qw($VERSION);
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
32
32
|
use Image::ExifTool::Exif;
|
33
33
|
|
34
|
-
$VERSION = '1.
|
34
|
+
$VERSION = '1.99';
|
35
35
|
|
36
36
|
sub ProcessFujiDir($$$);
|
37
37
|
sub ProcessFaceRec($$$);
|
@@ -426,6 +426,16 @@ my %faceCategories = (
|
|
426
426
|
0x300 => 'DR (Dynamic Range priority)',
|
427
427
|
},
|
428
428
|
},
|
429
|
+
0x1037 => { #forum17591
|
430
|
+
Name => 'MultipleExposure',
|
431
|
+
Writable => 'int16u', # (NC)
|
432
|
+
PrintConv => {
|
433
|
+
1 => 'Additive',
|
434
|
+
2 => 'Average',
|
435
|
+
3 => 'Light',
|
436
|
+
4 => 'Dark',
|
437
|
+
},
|
438
|
+
},
|
429
439
|
0x1040 => { #8
|
430
440
|
Name => 'ShadowTone',
|
431
441
|
Writable => 'int32s',
|
@@ -586,16 +596,44 @@ my %faceCategories = (
|
|
586
596
|
Name => 'SequenceNumber',
|
587
597
|
Writable => 'int16u',
|
588
598
|
},
|
599
|
+
0x1102 => { #forum17602
|
600
|
+
Name => 'WhiteBalanceBracketing',
|
601
|
+
Writable => 'int16u', # (NC)
|
602
|
+
PrintHex => 1,
|
603
|
+
PrintConv => {
|
604
|
+
0x01ff => '+/- 1',
|
605
|
+
0x02ff => '+/- 2',
|
606
|
+
0x03ff => '+/- 3',
|
607
|
+
},
|
608
|
+
},
|
589
609
|
0x1103 => {
|
590
610
|
Name => 'DriveSettings',
|
591
611
|
SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::DriveSettings' },
|
592
612
|
},
|
593
613
|
0x1105 => { Name => 'PixelShiftShots', Writable => 'int16u' }, #IB
|
594
614
|
0x1106 => { Name => 'PixelShiftOffset', Writable => 'rational64s', Count => 2 }, #IB
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
615
|
+
0x1150 => {
|
616
|
+
Name => 'CompositeImageMode',
|
617
|
+
Writable => 'int32u',
|
618
|
+
PrintConv => {
|
619
|
+
0 => 'n/a', #PH
|
620
|
+
1 => 'Pro Low-light', #7
|
621
|
+
2 => 'Pro Focus', #7
|
622
|
+
32 => 'Panorama', #PH
|
623
|
+
128 => 'HDR', #forum10799
|
624
|
+
1024 => 'Multi-exposure', #forum17591
|
625
|
+
},
|
626
|
+
},
|
627
|
+
0x1151 => {
|
628
|
+
Name => 'CompositeImageCount1',
|
629
|
+
Writable => 'int16u',
|
630
|
+
# Pro Low-light - val=4 (number of pictures taken?); Pro Focus - val=2,3 (ref 7); HDR - val=3 (forum10799)
|
631
|
+
},
|
632
|
+
0x1152 => {
|
633
|
+
Name => 'CompositeImageCount2',
|
634
|
+
Writable => 'int16u',
|
635
|
+
# Pro Low-light - val=1,3,4 (stacked pictures used?); Pro Focus - val=1,2 (ref 7); HDR - val=3 (forum10799)
|
636
|
+
},
|
599
637
|
0x1153 => { #forum7668
|
600
638
|
Name => 'PanoramaAngle',
|
601
639
|
Writable => 'int16u',
|
@@ -605,8 +643,8 @@ my %faceCategories = (
|
|
605
643
|
Writable => 'int16u',
|
606
644
|
PrintConv => {
|
607
645
|
1 => 'Right',
|
608
|
-
2 => 'Up',
|
609
|
-
3 => 'Left',
|
646
|
+
2 => 'Up', # (or Left?, forum17591)
|
647
|
+
3 => 'Left', # (or Up?, forum17591)
|
610
648
|
4 => 'Down',
|
611
649
|
},
|
612
650
|
},
|
@@ -1558,20 +1596,21 @@ my %faceCategories = (
|
|
1558
1596
|
TAG_PREFIX => 'MRAW',
|
1559
1597
|
NOTES => q{
|
1560
1598
|
Tags extracted from the M-RAW header of multi-image RAF files. The family 1
|
1561
|
-
group name for these tags is "M-RAW".
|
1562
|
-
|
1563
|
-
|
1564
|
-
|
1565
|
-
|
1566
|
-
|
1567
|
-
|
1568
|
-
|
1569
|
-
|
1570
|
-
|
1571
|
-
|
1572
|
-
|
1573
|
-
|
1574
|
-
|
1599
|
+
group name for these tags is "M-RAW". Additional metadata may be extracted
|
1600
|
+
from the embedded RAW images with the ExtractEmbedded option.
|
1601
|
+
},
|
1602
|
+
0x2001 => { Name => 'RawImageNumber', Format => 'int32u' },
|
1603
|
+
# 0x2003 - seen "0 100", "-300 100" and "300 100" for a sequence of 3 images
|
1604
|
+
0x2003 => { Name => 'ExposureCompensation', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
|
1605
|
+
# 0x2004 - (same value as 3 in all my samples)
|
1606
|
+
0x2004 => { Name => 'ExposureCompensation2', Format => 'rational32s', Unknown => 1, Hidden => 1, PrintConv => 'sprintf("%+.2f",$val)' },
|
1607
|
+
# 0x2005 - seen "10 1600", "10 6800", "10 200", "10 35000" etc
|
1608
|
+
0x2005 => { Name => 'ExposureTime', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)' },
|
1609
|
+
# 0x2006 - seen "450 100", "400 100" (all images in RAF have same value)
|
1610
|
+
0x2006 => { Name => 'FNumber', Format => 'rational64u', PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)' },
|
1611
|
+
# 0x2007 - seen 200, 125, 250, 2000
|
1612
|
+
0x2007 => 'ISO',
|
1613
|
+
# 0x2008 - seen 0, 65536
|
1575
1614
|
);
|
1576
1615
|
|
1577
1616
|
#------------------------------------------------------------------------------
|
@@ -1684,6 +1723,7 @@ sub ProcessFujiDir($$$)
|
|
1684
1723
|
sub ProcessMRAW($$$)
|
1685
1724
|
{
|
1686
1725
|
my ($et, $dirInfo, $tagTablePtr) = @_;
|
1726
|
+
return 1 if $$et{DOC_NUM};
|
1687
1727
|
my $dataPt = $$dirInfo{DataPt};
|
1688
1728
|
my $dataPos = $$dirInfo{DataPos};
|
1689
1729
|
my $dataLen = length $$dataPt;
|
@@ -1697,15 +1737,16 @@ sub ProcessMRAW($$$)
|
|
1697
1737
|
my $pos = 44;
|
1698
1738
|
my ($i, $n);
|
1699
1739
|
for ($n=0; ; ++$n) {
|
1700
|
-
$pos
|
1701
|
-
my $end = $pos + $size;
|
1740
|
+
my $end = $pos + 16 + $size;
|
1702
1741
|
last if $end > $dataLen;
|
1742
|
+
my $rafStart = Get64u($dataPt, $pos);
|
1743
|
+
my $rafLen = Get64u($dataPt, $pos+8);
|
1744
|
+
$pos += 16; # skip offset/size fields
|
1703
1745
|
$$et{DOC_NUM} = ++$$et{DOC_COUNT} if $pos > 60;
|
1704
1746
|
$et->VPrint(0, "$$et{INDENT}(Raw image $n parameters: $size bytes, $num entries)\n");
|
1705
1747
|
for ($i=0; $i<$num; ++$i) {
|
1706
1748
|
last if $pos + 4 > $end;
|
1707
|
-
|
1708
|
-
my $tag = Get8u($dataPt, $pos+1);
|
1749
|
+
my $tag = Get16u($dataPt, $pos);
|
1709
1750
|
my $size = Get16u($dataPt, $pos+2);
|
1710
1751
|
$pos += 4;
|
1711
1752
|
last if $pos + $size > $end;
|
@@ -1717,6 +1758,21 @@ sub ProcessMRAW($$$)
|
|
1717
1758
|
);
|
1718
1759
|
$pos += $size;
|
1719
1760
|
}
|
1761
|
+
if ($rafStart and $et->Options('ExtractEmbedded')) {
|
1762
|
+
if ($et->Options('Verbose')) {
|
1763
|
+
my $msg = sprintf("$$et{INDENT}(RAW image $n data: Start=0x%x, Length=0x%x)\n",$rafStart,$rafLen);
|
1764
|
+
$et->VPrint(0, $msg);
|
1765
|
+
}
|
1766
|
+
my $raf = $$et{RAF};
|
1767
|
+
my $tell = $raf->Tell();
|
1768
|
+
my $order = GetByteOrder();
|
1769
|
+
my $fujiWidth = $$et{FujiWidth};
|
1770
|
+
$raf->Seek($rafStart, 0) or next;
|
1771
|
+
ProcessRAF($et, { RAF => $raf, Base => $rafStart });
|
1772
|
+
$$et{FujiWidth} = $fujiWidth;
|
1773
|
+
SetByteOrder($order);
|
1774
|
+
$raf->Seek($tell, 0);
|
1775
|
+
}
|
1720
1776
|
}
|
1721
1777
|
delete $$et{DOC_NUM};
|
1722
1778
|
return 1;
|
@@ -1816,7 +1872,6 @@ sub WriteRAF($$)
|
|
1816
1872
|
# make sure padding is only zero bytes (can be >100k for HS10)
|
1817
1873
|
# (have seen non-null padding in X-Pro1)
|
1818
1874
|
if ($buff =~ /[^\0]/) {
|
1819
|
-
HexDump(\$buff);
|
1820
1875
|
return 1 if $et->Error('Non-null bytes found in padding', 2);
|
1821
1876
|
}
|
1822
1877
|
}
|
@@ -1871,6 +1926,7 @@ sub ProcessRAF($$)
|
|
1871
1926
|
my ($buff, $jpeg, $warn, $offset);
|
1872
1927
|
|
1873
1928
|
my $raf = $$dirInfo{RAF};
|
1929
|
+
my $base = $$dirInfo{Base} || 0;
|
1874
1930
|
$raf->Read($buff,0x70) == 0x70 or return 0;
|
1875
1931
|
$buff =~ /^FUJIFILM/ or return 0;
|
1876
1932
|
# get position and size of M-RAW header and jpeg preview
|
@@ -1878,13 +1934,13 @@ sub ProcessRAF($$)
|
|
1878
1934
|
my ($jpos, $jlen) = unpack('x84NN', $buff);
|
1879
1935
|
$jpos & 0x8000 and return 0;
|
1880
1936
|
if ($jpos) {
|
1881
|
-
$raf->Seek($jpos, 0)
|
1937
|
+
$raf->Seek($jpos+$base, 0) or return 0;
|
1882
1938
|
$raf->Read($jpeg, $jlen) == $jlen or return 0;
|
1883
1939
|
}
|
1884
1940
|
SetByteOrder('MM');
|
1885
|
-
$et->SetFileType();
|
1941
|
+
$et->SetFileType() unless $$et{DOC_NUM};
|
1886
1942
|
my $tbl = GetTagTable('Image::ExifTool::FujiFilm::RAFHeader');
|
1887
|
-
$et->ProcessDirectory({ DataPt => \$buff, DirName => 'RAFHeader' }, $tbl);
|
1943
|
+
$et->ProcessDirectory({ DataPt => \$buff, DirName => 'RAFHeader', Base => $base }, $tbl);
|
1888
1944
|
|
1889
1945
|
# extract information from embedded JPEG
|
1890
1946
|
my %dirInfo = (
|
@@ -1892,21 +1948,22 @@ sub ProcessRAF($$)
|
|
1892
1948
|
RAF => File::RandomAccess->new(\$jpeg),
|
1893
1949
|
);
|
1894
1950
|
if ($jpos) {
|
1895
|
-
$$et{BASE} += $jpos;
|
1951
|
+
$$et{BASE} += $jpos + $base;
|
1896
1952
|
my $ok = $et->ProcessJPEG(\%dirInfo);
|
1897
|
-
$$et{BASE} -= $jpos;
|
1953
|
+
$$et{BASE} -= $jpos + $base;
|
1898
1954
|
$et->FoundTag('PreviewImage', \$jpeg) if $ok;
|
1899
1955
|
}
|
1900
1956
|
# extract information from Fuji RAF and TIFF directories
|
1901
1957
|
my ($rafNum, $ifdNum) = ('','');
|
1902
1958
|
foreach $offset (0x48, 0x5c, 0x64, 0x78, 0x80) {
|
1903
1959
|
last if $jpos and $offset >= $jpos;
|
1904
|
-
unless ($raf->Seek($offset, 0) and $raf->Read($buff, 8)) {
|
1960
|
+
unless ($raf->Seek($offset+$base, 0) and $raf->Read($buff, 8)) {
|
1905
1961
|
$warn = 1;
|
1906
1962
|
last;
|
1907
1963
|
}
|
1908
1964
|
my ($start, $len) = unpack('N2',$buff);
|
1909
1965
|
next unless $start;
|
1966
|
+
$start += $base;
|
1910
1967
|
if ($offset == 0x64 or $offset == 0x80) {
|
1911
1968
|
# parse FujiIFD directory
|
1912
1969
|
%dirInfo = (
|
Binary file
|
@@ -32,7 +32,7 @@ use strict;
|
|
32
32
|
use vars qw($VERSION);
|
33
33
|
use Image::ExifTool qw(:DataAccess :Utils);
|
34
34
|
|
35
|
-
$VERSION = '1.
|
35
|
+
$VERSION = '1.30';
|
36
36
|
|
37
37
|
# program map table "stream_type" lookup (ref 6/1/9)
|
38
38
|
my %streamType = (
|
@@ -557,7 +557,7 @@ sub ProcessM2TS($$)
|
|
557
557
|
{
|
558
558
|
my ($et, $dirInfo) = @_;
|
559
559
|
my $raf = $$dirInfo{RAF};
|
560
|
-
my ($buff, $pLen, $
|
560
|
+
my ($buff, $pLen, $j, $fileType, $eof);
|
561
561
|
my (%pmt, %pidType, %data, %sectLen, %packLen, %fromStart);
|
562
562
|
my ($startTime, $endTime, $fwdTime, $backScan, $maxBack);
|
563
563
|
my $verbose = $et->Options('Verbose');
|
@@ -570,10 +570,8 @@ sub ProcessM2TS($$)
|
|
570
570
|
unless ($1) {
|
571
571
|
$pLen = 188; # no timecode
|
572
572
|
$fileType = 'M2T'; # (just as a way to tell there is no timecode)
|
573
|
-
$upkPrefix = 'N';
|
574
573
|
} else {
|
575
574
|
$pLen = 192; # 188-byte transport packet + leading 4-byte timecode (ref 4)
|
576
|
-
$upkPrefix = 'x4N';
|
577
575
|
}
|
578
576
|
my $prePos = $pLen - 188; # byte position of packet prefix
|
579
577
|
my $readSize = 64 * $pLen; # size of our read buffer
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
65
65
|
use Image::ExifTool::GPS;
|
66
66
|
use Image::ExifTool::XMP;
|
67
67
|
|
68
|
-
$VERSION = '4.
|
68
|
+
$VERSION = '4.51';
|
69
69
|
|
70
70
|
sub LensIDConv($$$);
|
71
71
|
sub ProcessNikonAVI($$$);
|
@@ -583,6 +583,7 @@ sub GetAFPointGrid($$;$);
|
|
583
583
|
'0E 4A 31 48 23 2D 0E 02' => 'Tamron SP AF 20-40mm f/2.7-3.5 (166D)',
|
584
584
|
'FE 48 37 5C 24 24 DF 0E' => 'Tamron SP 24-70mm f/2.8 Di VC USD (A007)', #24
|
585
585
|
'CE 47 37 5C 25 25 DF 4E' => 'Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)', #forum9110
|
586
|
+
'CE 00 37 5C 25 25 DF 4E' => 'Tamron SP 24-70mm f/2.8 Di VC USD G2 (A032)', #github345
|
586
587
|
'45 41 37 72 2C 3C 48 02' => 'Tamron SP AF 24-135mm f/3.5-5.6 AD Aspherical (IF) Macro (190D)',
|
587
588
|
'33 54 3C 5E 24 24 62 02' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09)',
|
588
589
|
'FA 54 3C 5E 24 24 84 06' => 'Tamron SP AF 28-75mm f/2.8 XR Di LD Aspherical (IF) Macro (A09NII)', #JD
|
@@ -41,7 +41,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
41
41
|
use Image::ExifTool::Exif;
|
42
42
|
use Image::ExifTool::APP12;
|
43
43
|
|
44
|
-
$VERSION = '2.
|
44
|
+
$VERSION = '2.90';
|
45
45
|
|
46
46
|
sub PrintLensInfo($$$);
|
47
47
|
|
@@ -117,6 +117,7 @@ my %olympusLensTypes = (
|
|
117
117
|
'0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB (also OM System M.Zuiko Digital ED 100-400mm F5.0-6.3 IS II", forum2833)
|
118
118
|
'0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
|
119
119
|
'0 37 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0 Pro', #forum3833
|
120
|
+
'0 38 10' => 'Olympus M.Zuiko Digital ED 20mm F1.4 Pro',
|
120
121
|
'0 39 10' => 'Olympus M.Zuiko Digital ED 90mm F3.5 Macro IS Pro', #forum3833
|
121
122
|
'0 40 10' => 'Olympus M.Zuiko Digital ED 150-600mm F5.0-6.3', #forum15652
|
122
123
|
# Sigma lenses
|
@@ -2252,12 +2253,15 @@ my %indexInfo = (
|
|
2252
2253
|
5 => 'i-Enhance', #11
|
2253
2254
|
6 => 'e-Portrait', #23
|
2254
2255
|
7 => 'Color Creator', #23
|
2256
|
+
8 => 'Underwater', #7
|
2255
2257
|
9 => 'Color Profile 1', #23
|
2256
2258
|
10 => 'Color Profile 2', #23
|
2257
2259
|
11 => 'Color Profile 3', #23
|
2258
2260
|
12 => 'Monochrome Profile 1', #23
|
2259
2261
|
13 => 'Monochrome Profile 2', #23
|
2260
2262
|
14 => 'Monochrome Profile 3', #23
|
2263
|
+
17 => 'Art Mode', #7
|
2264
|
+
18 => 'Monochrome Profile 4', #7
|
2261
2265
|
256 => 'Monotone',
|
2262
2266
|
512 => 'Sepia',
|
2263
2267
|
}],
|
@@ -59,7 +59,7 @@ use Image::ExifTool::Exif;
|
|
59
59
|
use Image::ExifTool::GPS;
|
60
60
|
use Image::ExifTool::HP;
|
61
61
|
|
62
|
-
$VERSION = '3.
|
62
|
+
$VERSION = '3.57';
|
63
63
|
|
64
64
|
sub CryptShutterCount($$);
|
65
65
|
sub PrintFilter($$$);
|
@@ -564,6 +564,7 @@ my %pentaxModelID = (
|
|
564
564
|
0x1329a => 'GR IIIx', # (Ricoh)
|
565
565
|
0x132b8 => 'KF', #github322 (Ricoh)
|
566
566
|
0x132d6 => 'K-3 Mark III Monochrome', #github226 (Ricoh)
|
567
|
+
0x132e0 => 'GR IV', #github347 (Ricoh)
|
567
568
|
);
|
568
569
|
|
569
570
|
# Pentax city codes - (PH, Optio WP)
|
@@ -5120,52 +5121,52 @@ my %binaryDataAttrs = (
|
|
5120
5121
|
PrintConv => { 0 => 'Off', 1 => 'Short', 2 => 'Medium', 3 => 'Long' },
|
5121
5122
|
},
|
5122
5123
|
0x021f => { #KG
|
5123
|
-
|
5124
|
-
|
5125
|
-
|
5126
|
-
|
5127
|
-
|
5128
|
-
|
5129
|
-
|
5130
|
-
|
5131
|
-
|
5132
|
-
|
5124
|
+
Name => 'FirstFrameActionInAFC',
|
5125
|
+
Condition => '$$self{Model} =~ /K-3 Mark III/',
|
5126
|
+
PrintConv => {
|
5127
|
+
'0' => 'Auto',
|
5128
|
+
'1' => 'Release Priority',
|
5129
|
+
'2' => 'Focus Priority',
|
5130
|
+
# there is at least another value '3' but I couldn't figure out the
|
5131
|
+
# meaning. However, this occurs for a few AF-S captures, so it has
|
5132
|
+
# no real practical meaning.
|
5133
|
+
},
|
5133
5134
|
},
|
5134
5135
|
0x0220 => { #KG
|
5135
|
-
|
5136
|
-
|
5137
|
-
|
5138
|
-
|
5139
|
-
|
5140
|
-
|
5141
|
-
|
5136
|
+
Name => 'ActionInAFCCont',
|
5137
|
+
Condition => '$$self{Model} =~ /K-3 Mark III/',
|
5138
|
+
PrintConv => {
|
5139
|
+
'0' => 'Auto',
|
5140
|
+
'1' => 'Focus Priority',
|
5141
|
+
'2' => 'FPS Priority',
|
5142
|
+
},
|
5142
5143
|
},
|
5143
5144
|
545 => { #KG
|
5144
|
-
|
5145
|
-
|
5146
|
-
|
5147
|
-
|
5145
|
+
Name => 'AFCHold',
|
5146
|
+
Condition => '$$self{Model} =~ /K-3 Mark III/',
|
5147
|
+
Mask => 0x03,
|
5148
|
+
PrintConv => { 0 => 'Low', 1 => 'Medium', 2 => 'High', 3 => 'Off' },
|
5148
5149
|
},
|
5149
5150
|
545.1 => { #KG
|
5150
|
-
Name => '
|
5151
|
+
Name => 'AFCPointTracking',
|
5151
5152
|
Condition => '$$self{Model} =~ /K-3 Mark III/',
|
5152
5153
|
Mask => 0x0c,
|
5153
|
-
PrintConv => '
|
5154
|
-
PrintConvInv => '5 - $val',
|
5154
|
+
PrintConv => { 0 => 'Type 1', 1 => 'Type 2', 2 => 'Type 3' },
|
5155
5155
|
},
|
5156
5156
|
545.2 => { #KG
|
5157
|
-
Name => '
|
5157
|
+
Name => 'AFCSensitivity',
|
5158
5158
|
Condition => '$$self{Model} =~ /K-3 Mark III/',
|
5159
5159
|
Mask => 0x70,
|
5160
|
-
PrintConv =>
|
5160
|
+
PrintConv => '5 - $val',
|
5161
|
+
PrintConvInv => '5 - $val',
|
5161
5162
|
},
|
5162
5163
|
0x0960 => { #KG
|
5163
|
-
|
5164
|
-
|
5165
|
-
|
5166
|
-
|
5167
|
-
|
5168
|
-
|
5164
|
+
Name => 'SubjectRecognition',
|
5165
|
+
Condition => '$$self{Model} =~ /K-3 Mark III/',
|
5166
|
+
PrintConv => {
|
5167
|
+
0 => 'Off',
|
5168
|
+
1 => 'On',
|
5169
|
+
},
|
5169
5170
|
},
|
5170
5171
|
);
|
5171
5172
|
|
@@ -111,7 +111,7 @@ my %insvLimit = (
|
|
111
111
|
The tags below are extracted from timed metadata in QuickTime and other
|
112
112
|
formats of video files when the ExtractEmbedded option is used. Although
|
113
113
|
most of these tags are combined into the single table below, ExifTool
|
114
|
-
currently reads
|
114
|
+
currently reads 111 different types of timed GPS metadata from video files.
|
115
115
|
},
|
116
116
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
117
117
|
GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
|
@@ -30,7 +30,7 @@ use strict;
|
|
30
30
|
use vars qw($VERSION $AUTOLOAD);
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
32
32
|
|
33
|
-
$VERSION = '1.
|
33
|
+
$VERSION = '1.72';
|
34
34
|
|
35
35
|
sub ConvertTimecode($);
|
36
36
|
sub ProcessSGLT($$$);
|
@@ -2031,6 +2031,7 @@ sub ProcessRIFF($$)
|
|
2031
2031
|
my $validate = $et->Options('Validate');
|
2032
2032
|
my $ee = $et->Options('ExtractEmbedded');
|
2033
2033
|
my $hash = $$et{ImageDataHash};
|
2034
|
+
my $base = 0;
|
2034
2035
|
|
2035
2036
|
# verify this is a valid RIFF file
|
2036
2037
|
return 0 unless $raf->Read($buff, 12) == 12;
|
@@ -2042,7 +2043,8 @@ sub ProcessRIFF($$)
|
|
2042
2043
|
return 0 unless $buff =~ /^(LA0[234]|OFR |LPAC|wvpk)/ and $raf->Read($buf2, 1024);
|
2043
2044
|
$type = $riffType{$1};
|
2044
2045
|
$buff .= $buf2;
|
2045
|
-
return 0 unless $buff =~ /WAVE(.{4})?fmt /sg and $raf->Seek(pos($buff) - 4, 0);
|
2046
|
+
return 0 unless $buff =~ /WAVE(.{4})?(junk|fmt )/sg and $raf->Seek(pos($buff) - 4, 0);
|
2047
|
+
$base = pos($buff) - 16;
|
2046
2048
|
}
|
2047
2049
|
$$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode
|
2048
2050
|
$mime = $riffMimeType{$type} if $type;
|
@@ -2159,7 +2161,7 @@ sub ProcessRIFF($$)
|
|
2159
2161
|
DataPos => 0, # (relative to Base)
|
2160
2162
|
Start => 0,
|
2161
2163
|
Size => $len,
|
2162
|
-
Base => $pos,
|
2164
|
+
Base => $pos + $base,
|
2163
2165
|
);
|
2164
2166
|
if ($setGroups) {
|
2165
2167
|
delete $$et{SET_GROUP0};
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
34
34
|
use Image::ExifTool::Exif;
|
35
35
|
use Image::ExifTool::Minolta;
|
36
36
|
|
37
|
-
$VERSION = '3.
|
37
|
+
$VERSION = '3.76';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -2193,6 +2193,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
2193
2193
|
399 => 'ZV-E10M2', #JR
|
2194
2194
|
400 => 'ILCE-1M2', #PH
|
2195
2195
|
401 => 'DSC-RX1RM3', #JR
|
2196
|
+
402 => 'ILCE-6400A', #github347
|
2197
|
+
404 => 'DSC-RX100M7A', #github347
|
2196
2198
|
406 => 'ILME-FX2', #JR
|
2197
2199
|
},
|
2198
2200
|
},
|
@@ -751,8 +751,8 @@ my %tagLookup = (
|
|
751
751
|
'afconfidence' => { 1 => 0x3d },
|
752
752
|
'afconfigtool' => { 2 => 0x1 },
|
753
753
|
'afcoordinatesavailable' => { 203 => 0x7, 204 => 0x7 },
|
754
|
-
'afcpointtracking' => { 371 => '545.
|
755
|
-
'afcsensitivity' => { 371 => '545.
|
754
|
+
'afcpointtracking' => { 371 => '545.1' },
|
755
|
+
'afcsensitivity' => { 371 => '545.2' },
|
756
756
|
'afdefocus' => { 371 => 0x6 },
|
757
757
|
'afdetectionmethod' => { 200 => 0x4, 201 => 0x4, 203 => 0x4, 204 => 0x4 },
|
758
758
|
'afduringliveview' => { 90 => 0x511 },
|
@@ -1968,7 +1968,10 @@ my %tagLookup = (
|
|
1968
1968
|
'composerkeywords' => { 425 => "\xa9cok" },
|
1969
1969
|
'compositeimage' => { 125 => 0xa460, 539 => 'CompositeImage' },
|
1970
1970
|
'compositeimagecount' => { 125 => 0xa461, 539 => 'CompositeImageCount' },
|
1971
|
+
'compositeimagecount1' => { 133 => 0x1151 },
|
1972
|
+
'compositeimagecount2' => { 133 => 0x1152 },
|
1971
1973
|
'compositeimageexposuretimes' => { 125 => 0xa462, 539 => 'CompositeImageExposureTimes' },
|
1974
|
+
'compositeimagemode' => { 133 => 0x1150 },
|
1972
1975
|
'composition' => { 520 => 'Composition' },
|
1973
1976
|
'compositionadjust' => { 397 => '0.1' },
|
1974
1977
|
'compositionadjustrotation' => { 397 => 0x7 },
|
@@ -5098,6 +5101,7 @@ my %tagLookup = (
|
|
5098
5101
|
'multiframenoisereduction' => { 455 => 0x35, 467 => 0x200b, 472 => 0x15 },
|
5099
5102
|
'multiframenreffect' => { 467 => 0x2023 },
|
5100
5103
|
'multifunctionlock' => { 90 => 0x70f },
|
5104
|
+
'multipleexposure' => { 133 => 0x1037 },
|
5101
5105
|
'multipleexposuremode' => { 250 => 0x1bc, 252 => 0x98, 255 => 0x8c, 256 => 0x9a, 257 => 0x9a, 339 => 0x101c },
|
5102
5106
|
'multipleexposureset' => { 378 => '10.1' },
|
5103
5107
|
'multisample' => { 272 => 0x40 },
|
@@ -7675,7 +7679,7 @@ my %tagLookup = (
|
|
7675
7679
|
'whitebalancebias' => { 119 => 0x2011, 340 => 0x304, 360 => 0x23 },
|
7676
7680
|
'whitebalanceblue' => { 79 => 0x7 },
|
7677
7681
|
'whitebalancebracket' => { 335 => 0x502, 340 => 0x303 },
|
7678
|
-
'whitebalancebracketing' => { 191 => 0x22, 194 => 0x2c, 464 => 0x2c },
|
7682
|
+
'whitebalancebracketing' => { 133 => 0x1102, 191 => 0x22, 194 => 0x2c, 464 => 0x2c },
|
7679
7683
|
'whitebalancebuttonplaybackmode' => { 331 => 0x1c5, 332 => 0x1dd },
|
7680
7684
|
'whitebalancecomp' => { 343 => 0x1001 },
|
7681
7685
|
'whitebalancedetected' => { 145 => 0x3fb },
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
12
12
|
=head1 TAG TABLES
|
13
13
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
15
|
-
They contain a total of
|
15
|
+
They contain a total of 28650 tags, with 17839 unique tag names.
|
16
16
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
@@ -11539,8 +11539,8 @@ file name combined with the hierarchical protobuf field numbers.
|
|
11539
11539
|
ExifTool currently extracts timed GPS plus a few other tags from DJI devices
|
11540
11540
|
which use the following protocols: dvtm_AVATA2.proto (Avata 2),
|
11541
11541
|
dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
|
11542
|
-
dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30)
|
11543
|
-
|
11542
|
+
dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30),
|
11543
|
+
dvtm_Mini4_Pro.proto (Mini 4 Pro) and dvtm_dji_neo.proto (DJI Neo).
|
11544
11544
|
|
11545
11545
|
Note that with the protobuf format, numerical tags missing from the output
|
11546
11546
|
for a given protocol should be considered to have the default value of 0.
|
@@ -11596,6 +11596,18 @@ for a given protocol should be considered to have the default value of 0.
|
|
11596
11596
|
'dvtm_ac204_3-4-2-1' GPSInfo DJI GPSInfo
|
11597
11597
|
'dvtm_ac204_3-4-2-2' GPSAltitude no
|
11598
11598
|
'dvtm_ac204_3-4-2-6-1' GPSDateTime no
|
11599
|
+
'dvtm_dji_neo_1-1-5' SerialNumber no
|
11600
|
+
'dvtm_dji_neo_1-1-10' Model no
|
11601
|
+
'dvtm_dji_neo_2-2-3-1' SerialNumber2 no
|
11602
|
+
'dvtm_dji_neo_2-3' FrameInfo DJI FrameInfo
|
11603
|
+
'dvtm_dji_neo_3-1-2' TimeStamp no
|
11604
|
+
'dvtm_dji_neo_3-2-2-1' ISO no
|
11605
|
+
'dvtm_dji_neo_3-2-4-1' ShutterSpeed no
|
11606
|
+
'dvtm_dji_neo_3-2-6-1' ColorTemperature no
|
11607
|
+
'dvtm_dji_neo_3-2-10-1' FNumber no
|
11608
|
+
'dvtm_dji_neo_3-4-3' DroneInfo DJI DroneInfo
|
11609
|
+
'dvtm_dji_neo_3-4-4-1' GPSInfo DJI GPSInfo
|
11610
|
+
'dvtm_dji_neo_3-4-4-2' AbsoluteAltitude no
|
11599
11611
|
'dvtm_pm320_1-1-5' SerialNumber no
|
11600
11612
|
'dvtm_pm320_1-1-10' Model no
|
11601
11613
|
'dvtm_pm320_2-2' FrameInfo DJI FrameInfo
|
@@ -12142,6 +12154,7 @@ Tags extracted from FLIR Public image Format (FPF) files.
|
|
12142
12154
|
0x1032 ExposureCount int16u
|
12143
12155
|
0x1033 EXRAuto int16u
|
12144
12156
|
0x1034 EXRMode int16u
|
12157
|
+
0x1037 MultipleExposure int16u
|
12145
12158
|
0x1040 ShadowTone int32s
|
12146
12159
|
0x1041 HighlightTone int32s
|
12147
12160
|
0x1044 DigitalZoom int32u
|
@@ -12159,9 +12172,13 @@ Tags extracted from FLIR Public image Format (FPF) files.
|
|
12159
12172
|
0x1053 CropSize int32u
|
12160
12173
|
0x1100 AutoBracketing int16u
|
12161
12174
|
0x1101 SequenceNumber int16u
|
12175
|
+
0x1102 WhiteBalanceBracketing int16u
|
12162
12176
|
0x1103 DriveSettings FujiFilm DriveSettings
|
12163
12177
|
0x1105 PixelShiftShots int16u
|
12164
12178
|
0x1106 PixelShiftOffset rational64s[2]
|
12179
|
+
0x1150 CompositeImageMode int32u
|
12180
|
+
0x1151 CompositeImageCount1 int16u
|
12181
|
+
0x1152 CompositeImageCount2 int16u
|
12165
12182
|
0x1153 PanoramaAngle int16u
|
12166
12183
|
0x1154 PanoramaDirection int16u
|
12167
12184
|
0x1201 AdvancedFilter int32u
|
@@ -12353,14 +12370,15 @@ Tags found in the FujiIFD information of RAF images from some models.
|
|
12353
12370
|
=head3 FujiFilm MRAW Tags
|
12354
12371
|
|
12355
12372
|
Tags extracted from the M-RAW header of multi-image RAF files. The family 1
|
12356
|
-
group name for these tags is "M-RAW".
|
12373
|
+
group name for these tags is "M-RAW". Additional metadata may be extracted
|
12374
|
+
from the embedded RAW images with the ExtractEmbedded option.
|
12357
12375
|
|
12358
12376
|
Tag ID Tag Name Writable
|
12359
12377
|
------ -------- --------
|
12360
|
-
|
12361
|
-
|
12362
|
-
|
12363
|
-
|
12378
|
+
0x2001 RawImageNumber no
|
12379
|
+
0x2005 ExposureTime no
|
12380
|
+
0x2006 FNumber no
|
12381
|
+
0x2007 ISO no
|
12364
12382
|
|
12365
12383
|
=head3 FujiFilm FFMV Tags
|
12366
12384
|
|
@@ -20734,8 +20752,8 @@ Flash information tags for the K10D, K20D and K200D.
|
|
20734
20752
|
543 FirstFrameActionInAFC int8u
|
20735
20753
|
544 ActionInAFCCont int8u
|
20736
20754
|
545 AFCHold int8u & 0x03
|
20737
|
-
545.1
|
20738
|
-
545.2
|
20755
|
+
545.1 AFCPointTracking int8u & 0x0c
|
20756
|
+
545.2 AFCSensitivity int8u & 0x70
|
20739
20757
|
2400 SubjectRecognition int8u
|
20740
20758
|
|
20741
20759
|
=head3 Pentax KelvinWB Tags
|
@@ -30526,7 +30544,7 @@ for the official QuickTime specification.
|
|
30526
30544
|
The tags below are extracted from timed metadata in QuickTime and other
|
30527
30545
|
formats of video files when the ExtractEmbedded option is used. Although
|
30528
30546
|
most of these tags are combined into the single table below, ExifTool
|
30529
|
-
currently reads
|
30547
|
+
currently reads 111 different types of timed GPS metadata from video files.
|
30530
30548
|
|
30531
30549
|
Tag ID Tag Name Writable
|
30532
30550
|
------ -------- --------
|
@@ -1352,7 +1352,8 @@ sub SetNewValuesFromFile($$;@)
|
|
1352
1352
|
# get all tags from source file (including MakerNotes block)
|
1353
1353
|
$info = $srcExifTool->ImageInfo($srcFile);
|
1354
1354
|
}
|
1355
|
-
|
1355
|
+
# (allow processing to continue if we have alternate files that may have been read OK)
|
1356
|
+
return $info if $$info{Error} and $$info{Error} eq 'Error opening file' and not $$self{ALT_EXIFTOOL};
|
1356
1357
|
delete $$srcExifTool{VALUE}{Error}; # delete so we can check this later
|
1357
1358
|
|
1358
1359
|
# sort tags in file order with priority tags last
|
@@ -3350,13 +3350,14 @@ sub PrintLensID(@)
|
|
3350
3350
|
#------------------------------------------------------------------------------
|
3351
3351
|
# Convert XMP date/time to EXIF format
|
3352
3352
|
# Inputs: 0) XMP date/time string, 1) set if we aren't sure this is a date
|
3353
|
-
# Returns: EXIF date/time
|
3353
|
+
# Returns: EXIF date/time, and flag in list context if this was a standard date/time value
|
3354
3354
|
sub ConvertXMPDate($;$)
|
3355
3355
|
{
|
3356
3356
|
my ($val, $unsure) = @_;
|
3357
3357
|
if ($val =~ /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}:\d{2})(:\d{2})?\s*(\S*)$/) {
|
3358
3358
|
my $s = $5 || ''; # seconds may be missing
|
3359
3359
|
$val = "$1:$2:$3 $4$s$6"; # convert back to EXIF time format
|
3360
|
+
return($val, 1) if wantarray;
|
3360
3361
|
} elsif (not $unsure and $val =~ /^(\d{4})(-\d{2}){0,2}/) {
|
3361
3362
|
$val =~ tr/-/:/;
|
3362
3363
|
}
|
@@ -3647,7 +3648,12 @@ NoLoop:
|
|
3647
3648
|
if (($new or $fmt eq 'rational') and ConvertRational($val)) {
|
3648
3649
|
$rational = $rawVal;
|
3649
3650
|
} else {
|
3650
|
-
|
3651
|
+
my $stdDate;
|
3652
|
+
($val, $stdDate) = ConvertXMPDate($val, $new) if $new or $fmt eq 'date';
|
3653
|
+
if ($stdDate and $added) {
|
3654
|
+
$$tagInfo{Groups}{2} = 'Time';
|
3655
|
+
$$tagInfo{PrintConv} = '$self->ConvertDateTime($val)';
|
3656
|
+
}
|
3651
3657
|
}
|
3652
3658
|
if ($$et{XmpValidate} and $fmt and $fmt eq 'boolean' and $val!~/^True|False$/) {
|
3653
3659
|
if ($val =~ /^true|false$/) {
|
@@ -1934,7 +1934,7 @@ my %sACDSeeRegionStruct = (
|
|
1934
1934
|
BurstPrimary => { },
|
1935
1935
|
PortraitNote => { },
|
1936
1936
|
PortraitRequest => {
|
1937
|
-
Notes => '
|
1937
|
+
Notes => 'HDRPlus (HDRP) data', #NealKrawetz
|
1938
1938
|
ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
|
1939
1939
|
ValueConvInv => 'Image::ExifTool::XMP::EncodeBase64($val)',
|
1940
1940
|
},
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
30
30
|
%static_vars $advFmtSelf $configFile @configFiles $noConfig);
|
31
31
|
|
32
|
-
$VERSION = '13.
|
32
|
+
$VERSION = '13.36';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
@@ -2825,6 +2825,8 @@ sub ExtractInfo($;@)
|
|
2825
2825
|
$isDir = 1;
|
2826
2826
|
} else {
|
2827
2827
|
$self->Error('Error opening file');
|
2828
|
+
# continue to process alt files if necessary
|
2829
|
+
$self->DoneExtract() if $$self{ALT_EXIFTOOL};
|
2828
2830
|
}
|
2829
2831
|
} else {
|
2830
2832
|
$self->Error('No file specified');
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 13.
|
4
|
+
version: 13.36.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2025-09-
|
12
|
+
date: 2025-09-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|