exiftool_vendored 12.85.0 → 12.86.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 +11 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/example.config +5 -0
- data/bin/exiftool +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +3 -2
- data/bin/lib/Image/ExifTool/Canon.pm +28 -3
- data/bin/lib/Image/ExifTool/CanonVRD.pm +4 -1
- data/bin/lib/Image/ExifTool/ID3.pm +39 -33
- data/bin/lib/Image/ExifTool/Olympus.pm +27 -17
- data/bin/lib/Image/ExifTool/QuickTime.pm +7 -4
- data/bin/lib/Image/ExifTool/Samsung.pm +29 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4 -4
- data/bin/lib/Image/ExifTool/TagNames.pod +29 -35
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool.pm +44 -27
- data/bin/lib/Image/ExifTool.pod +13 -14
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 545516d00429f2217884ee7dd4339504e84b836ee2b778fa44707a637bc4184c
|
|
4
|
+
data.tar.gz: a3737fb33959d687603b58ec0062ae907853bbae9bcc856ca10d1ac560368658
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a88fe3c5bad722bbc5e7bf0e0bd07edf8f4dc4707ed6af4895db6eaeacb0a28f14bd1ed72ad90dbfe43fb52eb86c9b569ac858ab5491c3910dfbe79d84cff75a
|
|
7
|
+
data.tar.gz: c9fbb0c789ce33da188841f7d0e37de4fcfac563508941fd1ebcaace1d2c6d074c9d8b9bf0e6c5a570aba8601db0b361c6e66b0243923d1fe54ee918509d3cce
|
data/bin/Changes
CHANGED
|
@@ -7,6 +7,17 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 12.76. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
June 7, 2024 - Version 12.86
|
|
11
|
+
|
|
12
|
+
- Added a new value for a couple of Olympus tags (thanks Herb)
|
|
13
|
+
- Improved handling of ID3 user-defined tags
|
|
14
|
+
- Decode all JPEG segments from RICO box in Ricoh MOV videos
|
|
15
|
+
- Decode a few new values for some tags written by Canon EOS R cameras
|
|
16
|
+
- Patched some Olympus WB_RBLevels tags to allow 4 values to be written as per
|
|
17
|
+
some newer models
|
|
18
|
+
- Fixed issue when writing IPTC date tags with a date/time value containing
|
|
19
|
+
subseconds with 4 or more digits
|
|
20
|
+
|
|
10
21
|
May 21, 2024 - Version 12.85
|
|
11
22
|
|
|
12
23
|
- Added GeolocationFeatureType tag
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
|
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
|
109
109
|
terminal window to extract and run ExifTool:
|
|
110
110
|
|
|
111
111
|
cd ~/Desktop
|
|
112
|
-
gzip -dc Image-ExifTool-12.
|
|
113
|
-
cd Image-ExifTool-12.
|
|
112
|
+
gzip -dc Image-ExifTool-12.86.tar.gz | tar -xf -
|
|
113
|
+
cd Image-ExifTool-12.86
|
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
|
115
115
|
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
|
@@ -293,6 +293,11 @@
|
|
|
293
293
|
NewXMPxxxStructX => { Name => 'SomeOtherName', Flat => 1 },
|
|
294
294
|
);
|
|
295
295
|
|
|
296
|
+
# the namespace may be registered so ExifTool generates the expected family 1
|
|
297
|
+
# group names when reading if the UserDefined namespace uses a different prefix
|
|
298
|
+
require Image::ExifTool::XMP;
|
|
299
|
+
Image::ExifTool::XMP::RegisterNamespace(\%Image::ExifTool::UserDefined::xxx);
|
|
300
|
+
|
|
296
301
|
# Adding a new MIE group requires a few extra definitions
|
|
297
302
|
use Image::ExifTool::MIE;
|
|
298
303
|
%Image::ExifTool::UserDefined::MIETest = (
|
data/bin/exiftool
CHANGED
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '12.
|
|
14
|
+
my $version = '12.86';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -5678,7 +5678,7 @@ with this command:
|
|
|
5678
5678
|
|
|
5679
5679
|
produces output like this:
|
|
5680
5680
|
|
|
5681
|
-
-- Generated by ExifTool 12.
|
|
5681
|
+
-- Generated by ExifTool 12.86 --
|
|
5682
5682
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5683
5683
|
(f/5.6, 1/60s, ISO 100)
|
|
5684
5684
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
|
35
35
|
use Image::ExifTool::Validate;
|
|
36
36
|
use Image::ExifTool::MacOS;
|
|
37
37
|
|
|
38
|
-
$VERSION = '3.
|
|
38
|
+
$VERSION = '3.57';
|
|
39
39
|
@ISA = qw(Exporter);
|
|
40
40
|
|
|
41
41
|
sub NumbersFirst($$);
|
|
@@ -600,7 +600,8 @@ running ExifTool the old information may be removed permanently using the
|
|
|
600
600
|
DNG => q{
|
|
601
601
|
The main DNG tags are found in the EXIF table. The tables below define only
|
|
602
602
|
information found within structures of these main DNG tag values. See
|
|
603
|
-
L<
|
|
603
|
+
L<https://helpx.adobe.com/camera-raw/digital-negative.html> for the official
|
|
604
|
+
DNG specification.
|
|
604
605
|
},
|
|
605
606
|
MPEG => q{
|
|
606
607
|
The MPEG format doesn't specify any file-level meta information. In lieu of
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.76';
|
|
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)
|
|
@@ -9001,20 +9001,32 @@ my %filterConv = (
|
|
|
9001
9001
|
4 => 'Focus High Priority',
|
|
9002
9002
|
},
|
|
9003
9003
|
},
|
|
9004
|
-
7 => { #
|
|
9004
|
+
7 => [{ #forum16068
|
|
9005
9005
|
Name => 'USMLensElectronicMF',
|
|
9006
|
+
Condition => '$$self{Model} =~ /EOS R\d/',
|
|
9007
|
+
Notes => 'EOS R models',
|
|
9008
|
+
PrintConv => {
|
|
9009
|
+
0 => 'Disable After One-Shot',
|
|
9010
|
+
1 => 'One-Shot -> Enabled',
|
|
9011
|
+
2 => 'One-Shot -> Enabled (magnify)',
|
|
9012
|
+
3 => 'Disable in AF Mode',
|
|
9013
|
+
},
|
|
9014
|
+
},{ #52
|
|
9015
|
+
Name => 'USMLensElectronicMF',
|
|
9016
|
+
Notes => 'Other models',
|
|
9006
9017
|
PrintConv => {
|
|
9007
9018
|
0 => 'Enable After AF',
|
|
9008
9019
|
1 => 'Disable After AF',
|
|
9009
9020
|
2 => 'Disable in AF Mode',
|
|
9010
9021
|
},
|
|
9011
|
-
},
|
|
9022
|
+
}],
|
|
9012
9023
|
8 => { #52
|
|
9013
9024
|
Name => 'AFAssistBeam',
|
|
9014
9025
|
PrintConv => {
|
|
9015
9026
|
0 => 'Enable',
|
|
9016
9027
|
1 => 'Disable',
|
|
9017
9028
|
2 => 'IR AF Assist Beam Only',
|
|
9029
|
+
3 => 'LED AF Assist Beam Only', #forum16068
|
|
9018
9030
|
},
|
|
9019
9031
|
},
|
|
9020
9032
|
9 => { #52
|
|
@@ -9113,6 +9125,19 @@ my %filterConv = (
|
|
|
9113
9125
|
2 => 'Auto', #PH (1DXmkII)
|
|
9114
9126
|
},
|
|
9115
9127
|
},
|
|
9128
|
+
20 => { #forum16068
|
|
9129
|
+
Name => 'SubjectToDetect',
|
|
9130
|
+
PrintConv => {
|
|
9131
|
+
0 => 'None',
|
|
9132
|
+
1 => 'People',
|
|
9133
|
+
2 => 'Animals',
|
|
9134
|
+
3 => 'Vehicles',
|
|
9135
|
+
},
|
|
9136
|
+
},
|
|
9137
|
+
24 => { #forum16068
|
|
9138
|
+
Name => 'EyeDetection',
|
|
9139
|
+
PrintConv => \%offOn,
|
|
9140
|
+
},
|
|
9116
9141
|
);
|
|
9117
9142
|
|
|
9118
9143
|
# RAW burst mode info (MakerNotes tag 0x403f) (ref 25)
|
|
@@ -1212,9 +1212,9 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
|
|
|
1212
1212
|
4 => 'Emphasize Center',
|
|
1213
1213
|
},
|
|
1214
1214
|
},
|
|
1215
|
+
0x2070b => { Name => 'DiffractionCorrectionOn', %noYes },
|
|
1215
1216
|
# 0x20800 - fmt=1: 0
|
|
1216
1217
|
# 0x20801 - fmt=1: 0
|
|
1217
|
-
0x2070b => { Name => 'DiffractionCorrectionOn', %noYes },
|
|
1218
1218
|
0x20900 => 'ColorHue',
|
|
1219
1219
|
0x20901 => 'SaturationAdj',
|
|
1220
1220
|
0x20910 => 'RedHSL',
|
|
@@ -1282,6 +1282,9 @@ my $blankFooter = "CANON OPTIONAL DATA\0" . ("\0" x 42) . "\xff\xd9";
|
|
|
1282
1282
|
# 0xf0521 - DLO data
|
|
1283
1283
|
# 0xf0520 - DLO data
|
|
1284
1284
|
# 0xf0530 - created when dust delete data applied (4 bytes, all zero)
|
|
1285
|
+
# 0xf0561 - 1932 bytes, related to Partial Adjustment Tool Palette (ref forum15660)
|
|
1286
|
+
# 0xf0562 - 1596 bytes, related to Partial Adjustment Tool Palette (ref forum15660)
|
|
1287
|
+
# 0xf0566 - 1520 bytes, related to Partial Adjustment Tool Palette (ref forum15660)
|
|
1285
1288
|
# 0xf0600 - fmt=253 (2308 bytes, JPG images)
|
|
1286
1289
|
# 0xf0601 - fmt=253 (2308 bytes, JPG images)
|
|
1287
1290
|
# 0x1ff52c - values: 129,130,132 (related to custom picture style somehow)
|
|
@@ -18,7 +18,7 @@ use strict;
|
|
|
18
18
|
use vars qw($VERSION);
|
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
20
20
|
|
|
21
|
-
$VERSION = '1.
|
|
21
|
+
$VERSION = '1.62';
|
|
22
22
|
|
|
23
23
|
sub ProcessID3v2($$$);
|
|
24
24
|
sub ProcessPrivate($$$);
|
|
@@ -68,6 +68,12 @@ my %dateTimeConv = (
|
|
|
68
68
|
PrintConv => '$self->ConvertDateTime($val)',
|
|
69
69
|
);
|
|
70
70
|
|
|
71
|
+
# patch for names of user-defined tags which don't automatically generate very well
|
|
72
|
+
my %userTagName = (
|
|
73
|
+
ALBUMARTISTSORT => 'AlbumArtistSort',
|
|
74
|
+
ASIN => 'ASIN',
|
|
75
|
+
);
|
|
76
|
+
|
|
71
77
|
# This table is just for documentation purposes
|
|
72
78
|
%Image::ExifTool::ID3::Main = (
|
|
73
79
|
VARS => { NO_ID => 1 },
|
|
@@ -103,14 +109,6 @@ my %dateTimeConv = (
|
|
|
103
109
|
},
|
|
104
110
|
);
|
|
105
111
|
|
|
106
|
-
%Image::ExifTool::ID3::UserDefined = (
|
|
107
|
-
GROUPS => { 1 => 'UserDefined', 2 => 'Other' },
|
|
108
|
-
NOTES => q{
|
|
109
|
-
ID3 user-defined text and URL tags will be dynamically added to this table
|
|
110
|
-
by name when found.
|
|
111
|
-
},
|
|
112
|
-
);
|
|
113
|
-
|
|
114
112
|
# Lyrics3 tags (ref 4)
|
|
115
113
|
%Image::ExifTool::ID3::Lyrics3 = (
|
|
116
114
|
GROUPS => { 1 => 'Lyrics3', 2 => 'Audio' },
|
|
@@ -501,7 +499,7 @@ my %genre = (
|
|
|
501
499
|
TT2 => 'Title',
|
|
502
500
|
TT3 => 'Subtitle',
|
|
503
501
|
TXT => 'Lyricist',
|
|
504
|
-
TXX =>
|
|
502
|
+
TXX => 'UserDefinedText',
|
|
505
503
|
TYE => { Name => 'Year', Groups => { 2 => 'Time' } },
|
|
506
504
|
ULT => 'Lyrics',
|
|
507
505
|
WAF => 'FileURL',
|
|
@@ -510,7 +508,7 @@ my %genre = (
|
|
|
510
508
|
WCM => 'CommercialURL',
|
|
511
509
|
WCP => { Name => 'CopyrightURL', Groups => { 2 => 'Author' } },
|
|
512
510
|
WPB => 'PublisherURL',
|
|
513
|
-
WXX =>
|
|
511
|
+
WXX => 'UserDefinedURL',
|
|
514
512
|
# the following written by iTunes 10.5 (ref PH)
|
|
515
513
|
RVA => 'RelativeVolumeAdjustment',
|
|
516
514
|
TST => 'TitleSortOrder',
|
|
@@ -613,7 +611,7 @@ my %id3v2_common = (
|
|
|
613
611
|
TRSO => 'InternetRadioStationOwner',
|
|
614
612
|
TSRC => 'ISRC', # (international standard recording code)
|
|
615
613
|
TSSE => 'EncoderSettings',
|
|
616
|
-
TXXX =>
|
|
614
|
+
TXXX => 'UserDefinedText',
|
|
617
615
|
# UFID => 'UniqueFileID', (not extracted because it is long and nasty and not very useful)
|
|
618
616
|
USER => 'TermsOfUse',
|
|
619
617
|
USLT => 'Lyrics',
|
|
@@ -625,7 +623,7 @@ my %id3v2_common = (
|
|
|
625
623
|
WORS => 'InternetRadioStationURL',
|
|
626
624
|
WPAY => 'PaymentURL',
|
|
627
625
|
WPUB => 'PublisherURL',
|
|
628
|
-
WXXX =>
|
|
626
|
+
WXXX => 'UserDefinedURL',
|
|
629
627
|
#
|
|
630
628
|
# non-standard frames
|
|
631
629
|
#
|
|
@@ -879,6 +877,19 @@ Image::ExifTool::AddCompositeTags('Image::ExifTool::ID3');
|
|
|
879
877
|
}
|
|
880
878
|
}
|
|
881
879
|
|
|
880
|
+
#------------------------------------------------------------------------------
|
|
881
|
+
# Make tag name for user-defined tag
|
|
882
|
+
# Inputs: 0) User defined tag description
|
|
883
|
+
# Returns: Tag name
|
|
884
|
+
sub MakeTagName($)
|
|
885
|
+
{
|
|
886
|
+
my $name = shift;
|
|
887
|
+
return $userTagName{$name} if $userTagName{$name};
|
|
888
|
+
$name = ucfirst(lc $name) unless $name =~ /[a-z]/; # convert all uppercase to mixed case
|
|
889
|
+
$name =~ s/([a-z])[_ ]([a-z])/$1\U$2/g;
|
|
890
|
+
return Image::ExifTool::MakeTagName($name);
|
|
891
|
+
}
|
|
892
|
+
|
|
882
893
|
#------------------------------------------------------------------------------
|
|
883
894
|
# Convert ID3v1 text to exiftool character set
|
|
884
895
|
# Inputs: 0) ExifTool object ref, 1) text string
|
|
@@ -1255,39 +1266,34 @@ sub ProcessID3v2($$$)
|
|
|
1255
1266
|
# two encoded strings separated by a null
|
|
1256
1267
|
my @vals = DecodeString($et, $val);
|
|
1257
1268
|
foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
|
|
1258
|
-
$vals[0]
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
my $name = Image::ExifTool::MakeTagName($vals[0]);
|
|
1262
|
-
AddTagToTable($tbl, $vals[0], $name, 1);
|
|
1269
|
+
if (length $vals[0]) {
|
|
1270
|
+
$id .= "_$vals[0]";
|
|
1271
|
+
$tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($vals[0]));
|
|
1263
1272
|
}
|
|
1264
|
-
$
|
|
1265
|
-
next;
|
|
1273
|
+
$val = $vals[1];
|
|
1266
1274
|
} elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS|GP1|MVI|MVN)$/) {
|
|
1267
1275
|
$val = DecodeString($et, $val);
|
|
1268
1276
|
} elsif ($id =~ /^(WXX|WXXX)$/) {
|
|
1269
1277
|
# one encoded string and one Latin string separated by a null
|
|
1270
1278
|
my $enc = unpack('C', $val);
|
|
1271
|
-
my $url;
|
|
1279
|
+
my ($tag, $url);
|
|
1272
1280
|
if ($enc == 1 or $enc == 2) {
|
|
1273
|
-
($
|
|
1281
|
+
($tag, $url) = ($tag =~ /^(.(?:..)*?)\0\0(.*)/s);
|
|
1274
1282
|
} else {
|
|
1275
|
-
($
|
|
1283
|
+
($tag, $url) = ($tag =~ /^(..*?)\0(.*)/s);
|
|
1276
1284
|
}
|
|
1277
|
-
unless (defined $
|
|
1285
|
+
unless (defined $tag and defined $url) {
|
|
1278
1286
|
$et->Warn("Invalid $id frame value");
|
|
1279
1287
|
next;
|
|
1280
1288
|
}
|
|
1281
|
-
$
|
|
1282
|
-
$
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
my $name = Image::ExifTool::MakeTagName($val);
|
|
1287
|
-
AddTagToTable($tbl, $val, $name, 1);
|
|
1289
|
+
$tag = DecodeString($et, $tag);
|
|
1290
|
+
if (length $tag) {
|
|
1291
|
+
$id .= "_$tag";
|
|
1292
|
+
$tag .= '_URL' unless $tag =~ /url/i;
|
|
1293
|
+
$tagInfo = $$tagTablePtr{$id} || AddTagToTable($tagTablePtr, $id, MakeTagName($tag));
|
|
1288
1294
|
}
|
|
1289
|
-
$
|
|
1290
|
-
|
|
1295
|
+
$url =~ s/\0.*//s;
|
|
1296
|
+
$val = $url;
|
|
1291
1297
|
} elsif ($id =~ /^W/) {
|
|
1292
1298
|
$val =~ s/\0.*//s; # truncate at null
|
|
1293
1299
|
} elsif ($id =~ /^(COM|COMM|ULT|USLT)$/) {
|
|
@@ -1935,6 +1935,7 @@ my %indexInfo = (
|
|
|
1935
1935
|
3 => 'Trains',
|
|
1936
1936
|
4 => 'Birds',
|
|
1937
1937
|
5 => 'Dogs & Cats',
|
|
1938
|
+
6 => 'Human', #forum16072
|
|
1938
1939
|
},{
|
|
1939
1940
|
0 => 'Object Not Found',
|
|
1940
1941
|
1 => 'Object Found',
|
|
@@ -2842,24 +2843,32 @@ my %indexInfo = (
|
|
|
2842
2843
|
RawConv => '$val=~s/\0+$//; $val', # (may be null terminated)
|
|
2843
2844
|
Count => 4,
|
|
2844
2845
|
},
|
|
2845
|
-
0x100 => {
|
|
2846
|
+
0x100 => { #6
|
|
2847
|
+
Name => 'WB_RBLevels',
|
|
2848
|
+
Writable => 'int16u',
|
|
2849
|
+
Notes => q{
|
|
2850
|
+
These tags store 2 values, red and blue levels, for some models, but 4
|
|
2851
|
+
values, presumably RBGG levels, for other models
|
|
2852
|
+
},
|
|
2853
|
+
Count => -1,
|
|
2854
|
+
}, #6
|
|
2846
2855
|
# 0x101 - in-camera AutoWB unless it is all 0's or all 256's (ref IB)
|
|
2847
|
-
0x102 => { Name => 'WB_RBLevels3000K', Writable => 'int16u', Count =>
|
|
2848
|
-
0x103 => { Name => 'WB_RBLevels3300K', Writable => 'int16u', Count =>
|
|
2849
|
-
0x104 => { Name => 'WB_RBLevels3600K', Writable => 'int16u', Count =>
|
|
2850
|
-
0x105 => { Name => 'WB_RBLevels3900K', Writable => 'int16u', Count =>
|
|
2851
|
-
0x106 => { Name => 'WB_RBLevels4000K', Writable => 'int16u', Count =>
|
|
2852
|
-
0x107 => { Name => 'WB_RBLevels4300K', Writable => 'int16u', Count =>
|
|
2853
|
-
0x108 => { Name => 'WB_RBLevels4500K', Writable => 'int16u', Count =>
|
|
2854
|
-
0x109 => { Name => 'WB_RBLevels4800K', Writable => 'int16u', Count =>
|
|
2855
|
-
0x10a => { Name => 'WB_RBLevels5300K', Writable => 'int16u', Count =>
|
|
2856
|
-
0x10b => { Name => 'WB_RBLevels6000K', Writable => 'int16u', Count =>
|
|
2857
|
-
0x10c => { Name => 'WB_RBLevels6600K', Writable => 'int16u', Count =>
|
|
2858
|
-
0x10d => { Name => 'WB_RBLevels7500K', Writable => 'int16u', Count =>
|
|
2859
|
-
0x10e => { Name => 'WB_RBLevelsCWB1', Writable => 'int16u', Count =>
|
|
2860
|
-
0x10f => { Name => 'WB_RBLevelsCWB2', Writable => 'int16u', Count =>
|
|
2861
|
-
0x110 => { Name => 'WB_RBLevelsCWB3', Writable => 'int16u', Count =>
|
|
2862
|
-
0x111 => { Name => 'WB_RBLevelsCWB4', Writable => 'int16u', Count =>
|
|
2856
|
+
0x102 => { Name => 'WB_RBLevels3000K', Writable => 'int16u', Count => -1 }, #11
|
|
2857
|
+
0x103 => { Name => 'WB_RBLevels3300K', Writable => 'int16u', Count => -1 }, #11
|
|
2858
|
+
0x104 => { Name => 'WB_RBLevels3600K', Writable => 'int16u', Count => -1 }, #11
|
|
2859
|
+
0x105 => { Name => 'WB_RBLevels3900K', Writable => 'int16u', Count => -1 }, #11
|
|
2860
|
+
0x106 => { Name => 'WB_RBLevels4000K', Writable => 'int16u', Count => -1 }, #11
|
|
2861
|
+
0x107 => { Name => 'WB_RBLevels4300K', Writable => 'int16u', Count => -1 }, #11
|
|
2862
|
+
0x108 => { Name => 'WB_RBLevels4500K', Writable => 'int16u', Count => -1 }, #11
|
|
2863
|
+
0x109 => { Name => 'WB_RBLevels4800K', Writable => 'int16u', Count => -1 }, #11
|
|
2864
|
+
0x10a => { Name => 'WB_RBLevels5300K', Writable => 'int16u', Count => -1 }, #11
|
|
2865
|
+
0x10b => { Name => 'WB_RBLevels6000K', Writable => 'int16u', Count => -1 }, #11
|
|
2866
|
+
0x10c => { Name => 'WB_RBLevels6600K', Writable => 'int16u', Count => -1 }, #11
|
|
2867
|
+
0x10d => { Name => 'WB_RBLevels7500K', Writable => 'int16u', Count => -1 }, #11
|
|
2868
|
+
0x10e => { Name => 'WB_RBLevelsCWB1', Writable => 'int16u', Count => -1 }, #11
|
|
2869
|
+
0x10f => { Name => 'WB_RBLevelsCWB2', Writable => 'int16u', Count => -1 }, #11
|
|
2870
|
+
0x110 => { Name => 'WB_RBLevelsCWB3', Writable => 'int16u', Count => -1 }, #11
|
|
2871
|
+
0x111 => { Name => 'WB_RBLevelsCWB4', Writable => 'int16u', Count => -1 }, #11
|
|
2863
2872
|
0x113 => { Name => 'WB_GLevel3000K', Writable => 'int16u' }, #11
|
|
2864
2873
|
0x114 => { Name => 'WB_GLevel3300K', Writable => 'int16u' }, #11
|
|
2865
2874
|
0x115 => { Name => 'WB_GLevel3600K', Writable => 'int16u' }, #11
|
|
@@ -3246,6 +3255,7 @@ my %indexInfo = (
|
|
|
3246
3255
|
3 => 'Trains',
|
|
3247
3256
|
4 => 'Birds',
|
|
3248
3257
|
5 => 'Dogs & Cats',
|
|
3258
|
+
6 => 'Human', #forum16072
|
|
3249
3259
|
},{
|
|
3250
3260
|
0 => 'Face Priority',
|
|
3251
3261
|
1 => 'Target Priority',
|
|
@@ -503,6 +503,11 @@ my %eeBox2 = (
|
|
|
503
503
|
# image types in AVIF and HEIC files
|
|
504
504
|
my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
505
505
|
|
|
506
|
+
my %userDefined = (
|
|
507
|
+
ALBUMARTISTSORT => 'AlbumArtistSort',
|
|
508
|
+
ASIN => 'ASIN',
|
|
509
|
+
);
|
|
510
|
+
|
|
506
511
|
# QuickTime atoms
|
|
507
512
|
%Image::ExifTool::QuickTime::Main = (
|
|
508
513
|
PROCESS_PROC => \&ProcessMOV,
|
|
@@ -2336,10 +2341,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
2336
2341
|
Name => 'RicohInfo',
|
|
2337
2342
|
Condition => '$$valPt =~ /^\xff\xe1..Exif\0\0/s',
|
|
2338
2343
|
SubDirectory => {
|
|
2339
|
-
TagTable => 'Image::ExifTool::
|
|
2340
|
-
ProcessProc => \&Image::ExifTool::
|
|
2341
|
-
Start => 10,
|
|
2342
|
-
Base => '$start',
|
|
2344
|
+
TagTable => 'Image::ExifTool::JPEG::Main',
|
|
2345
|
+
ProcessProc => \&Image::ExifTool::ProcessJPEG,
|
|
2343
2346
|
}
|
|
2344
2347
|
},
|
|
2345
2348
|
RTHU => { #PH (GR)
|
|
@@ -979,6 +979,7 @@ my %formatMinMax = (
|
|
|
979
979
|
# 0x0800 - unknown (29 bytes) (contains already-extracted EmbeddedAudioFileName)
|
|
980
980
|
# 0x0830-name - seen '1165724808.pre'
|
|
981
981
|
# 0x0830 - unknown (164004 bytes)
|
|
982
|
+
# 0x08c0-name - seen 'Auto_Enhance_Info' #forum16086
|
|
982
983
|
# 0x08d0-name - seen 'Interactive_Panorama_Info'
|
|
983
984
|
# 0x08d0 - unknown (7984 bytes)
|
|
984
985
|
# 0x08e0-name - seen 'Panorama_Shot_Info'
|
|
@@ -988,6 +989,8 @@ my %formatMinMax = (
|
|
|
988
989
|
# 0x0910 - string, seen 'Front_Cam_Selfie_Info'
|
|
989
990
|
# 0x09e0-name - seen 'Burst_Shot_Info'
|
|
990
991
|
# 0x09e0 - string, seen '489489125'
|
|
992
|
+
# 0x09e1-name - seen 'BurstShot_Best_Photo_Info' #forum16086
|
|
993
|
+
# 0x09f0-name - seen 'Pro_Mode_Info' #forum16086
|
|
991
994
|
# 0x0a01-name - seen 'Image_UTC_Data'
|
|
992
995
|
'0x0a01' => { #forum7161
|
|
993
996
|
Name => 'TimeStamp',
|
|
@@ -999,6 +1002,7 @@ my %formatMinMax = (
|
|
|
999
1002
|
'0x0a20' => { Name => 'DualCameraImage', Groups => { 2 => 'Preview' }, Binary => 1 },
|
|
1000
1003
|
'0x0a30-name' => 'EmbeddedVideoType', # ("MotionPhoto_Data")
|
|
1001
1004
|
'0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161
|
|
1005
|
+
# 0x0a41-name - seen 'BackupRestore_Data' #forum16086
|
|
1002
1006
|
# 0x0aa1-name - seen 'MCC_Data'
|
|
1003
1007
|
# 0x0aa1 - seen '204','222','234','302','429'
|
|
1004
1008
|
'0x0aa1' => {
|
|
@@ -1254,15 +1258,39 @@ my %formatMinMax = (
|
|
|
1254
1258
|
Name => 'DualShotExtra',
|
|
1255
1259
|
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::DualShotExtra' },
|
|
1256
1260
|
},
|
|
1261
|
+
# 0x0ab4-name - seen 'DualShot_Core_Info' #forum16086
|
|
1257
1262
|
# 0x0ac0-name - seen 'ZoomInOut_Info' (SM-N950U)
|
|
1258
1263
|
# 0x0ac0 - 2048 bytes of interesting stuff including firmware version? (SM-N950U)
|
|
1264
|
+
# 0x0b30-name - seen 'Camera_Sticker_Info' #forum16086
|
|
1259
1265
|
'0x0b40' => { # (SM-N975X front camera)
|
|
1260
1266
|
Name => 'SingleShotMeta',
|
|
1261
1267
|
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::SingleShotMeta' },
|
|
1262
1268
|
},
|
|
1263
1269
|
# 0x0b41-name - seen 'SingeShot_DepthMap_1' (Yes, "Singe") (SM-N975X front camera)
|
|
1264
1270
|
'0x0b41' => { Name => 'SingleShotDepthMap', Binary => 1 },
|
|
1265
|
-
#
|
|
1271
|
+
# 0x0b51-name - seen 'Intelligent_PhotoEditor_Data' #forum16086
|
|
1272
|
+
# 0x0b60-name - seen 'UltraWide_PhotoEditor_Data' #forum16086
|
|
1273
|
+
# 0x0b90-name - seen 'Document_Scan_Info' #forum16086
|
|
1274
|
+
# 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap'
|
|
1275
|
+
# 0x0ba2-name - seen 'Copy_Available_Edit_Info' #forum16086
|
|
1276
|
+
# 0x0bc0-name - seen 'Single_Relighting_Bokeh_Info' #forum16086
|
|
1277
|
+
# 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
|
|
1278
|
+
# 0x0be0-name - seen 'Livefocus_JDM_Info' #forum16086
|
|
1279
|
+
# 0x0bf0-name - seen 'Remaster_Info' #forum16086
|
|
1280
|
+
# 0x0c21-name - seen 'Portrait_Effect_Info' #forum16086
|
|
1281
|
+
# 0x0c51-name - seen 'Samsung_Capture_Info' #forum16086
|
|
1282
|
+
# 0x0c61-name - seen 'Camera_Capture_Mode_Info' #forum16086
|
|
1283
|
+
# 0x0c71-name - seen 'Pro_White_Balance_Info' #forum16086
|
|
1284
|
+
# 0x0c81-name - seen 'Watermark_Info' #forum16086
|
|
1285
|
+
# 0x0cc1-name - seen 'Color_Display_P3' #forum16086
|
|
1286
|
+
# 0x0cd2-name - seen 'Photo_HDR_Info' #forum16086
|
|
1287
|
+
# 0x0ce1-name - seen 'Gallery_DC_Data' #forum16086
|
|
1288
|
+
# 0x0d01-name - seen 'Camera_Scene_Info', 'Camera_Scene_Info2', 'Camera_Scene_Info3' #forum16086
|
|
1289
|
+
# 0x0d11-name - seen 'Video_Snapshot_Info' #forum16086
|
|
1290
|
+
# 0x0d21-name - seen 'Camera_Scene_Info' #forum16086
|
|
1291
|
+
# 0x0d31-name - seen 'Food_Blur_Effect_Info' #forum16086
|
|
1292
|
+
# 0x0d91-name - seen 'PEg_Info' #forum16086
|
|
1293
|
+
# 0x0da1-name - seen 'Captured_App_Info' #forum16086
|
|
1266
1294
|
# 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
|
|
1267
1295
|
# 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360)
|
|
1268
1296
|
# 0x0c81-name - seen 'Watermark_Info'
|
|
@@ -2845,6 +2845,7 @@ my %tagLookup = (
|
|
|
2845
2845
|
'externalmetadatalink' => { 526 => 'ExternalMetadataLink' },
|
|
2846
2846
|
'externalsensorbrightnessvalue' => { 343 => 0x311, 346 => 0x311, 347 => 0x311, 350 => 0x3408 },
|
|
2847
2847
|
'extrainfoversion' => { 440 => 0x1a },
|
|
2848
|
+
'eyedetection' => { 2 => 0x18 },
|
|
2848
2849
|
'eyestartaf' => { 187 => 0x40 },
|
|
2849
2850
|
'fac100per' => { 141 => 0xe94 },
|
|
2850
2851
|
'fac170per' => { 141 => 0xe93 },
|
|
@@ -6716,6 +6717,7 @@ my %tagLookup = (
|
|
|
6716
6717
|
'subjectmotion' => { 307 => '78.2', 308 => '78.2', 318 => '78.2', 320 => 0x103, 321 => 0x103, 322 => 0x119 },
|
|
6717
6718
|
'subjectprogram' => { 184 => 0x22 },
|
|
6718
6719
|
'subjectreference' => { 134 => 0xc },
|
|
6720
|
+
'subjecttodetect' => { 2 => 0x14 },
|
|
6719
6721
|
'sublabels1' => { 524 => [\'TagStructure','TagStructureSubLabels'] },
|
|
6720
6722
|
'sublabels2' => { 524 => [\'TagStructure','TagStructureSubLabelsSubLabels'] },
|
|
6721
6723
|
'sublabels3' => { 524 => [\'TagStructure','TagStructureSubLabelsSubLabelsSubLabels'] },
|
|
@@ -12694,8 +12696,6 @@ my %tagExists = (
|
|
|
12694
12696
|
'tvdb' => 1,
|
|
12695
12697
|
'twelvebit' => 1,
|
|
12696
12698
|
'tx3g' => 1,
|
|
12697
|
-
'txx' => 1,
|
|
12698
|
-
'txxx' => 1,
|
|
12699
12699
|
'typeoforiginal' => 1,
|
|
12700
12700
|
'typist' => 1,
|
|
12701
12701
|
'uas_lsversionnumber' => 1,
|
|
@@ -12764,6 +12764,8 @@ my %tagExists = (
|
|
|
12764
12764
|
'usercustom2' => 1,
|
|
12765
12765
|
'userdata' => 1,
|
|
12766
12766
|
'userdefinedid' => 1,
|
|
12767
|
+
'userdefinedtext' => 1,
|
|
12768
|
+
'userdefinedurl' => 1,
|
|
12767
12769
|
'usereffectiverating' => 1,
|
|
12768
12770
|
'userid' => 1,
|
|
12769
12771
|
'userlastplayedtime' => 1,
|
|
@@ -13060,8 +13062,6 @@ my %tagExists = (
|
|
|
13060
13062
|
'writtenby' => 1,
|
|
13061
13063
|
'wwsfamilyname' => 1,
|
|
13062
13064
|
'wwssubfamilyname' => 1,
|
|
13063
|
-
'wxx' => 1,
|
|
13064
|
-
'wxxx' => 1,
|
|
13065
13065
|
'x' => 1,
|
|
13066
13066
|
'xattrapplemaildatereceived' => 1,
|
|
13067
13067
|
'xattrapplemaildatesent' => 1,
|
|
@@ -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 27868 tags, with 17446 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,6 +11539,8 @@ Information about creative filter settings.
|
|
|
11539
11539
|
17 VFDisplayIllumination int32s
|
|
11540
11540
|
18 AFStatusViewfinder int32s
|
|
11541
11541
|
19 InitialAFPointInServo int32s
|
|
11542
|
+
20 SubjectToDetect int32s
|
|
11543
|
+
24 EyeDetection int32s
|
|
11542
11544
|
|
|
11543
11545
|
=head3 Canon RawBurstInfo Tags
|
|
11544
11546
|
|
|
@@ -19839,23 +19841,23 @@ any information found here will be extracted, even if the tag is not listed.
|
|
|
19839
19841
|
Tag ID Tag Name Writable
|
|
19840
19842
|
------ -------- --------
|
|
19841
19843
|
0x0000 ImageProcessingVersion undef[4]
|
|
19842
|
-
0x0100 WB_RBLevels int16u[
|
|
19843
|
-
0x0102 WB_RBLevels3000K int16u[
|
|
19844
|
-
0x0103 WB_RBLevels3300K int16u[
|
|
19845
|
-
0x0104 WB_RBLevels3600K int16u[
|
|
19846
|
-
0x0105 WB_RBLevels3900K int16u[
|
|
19847
|
-
0x0106 WB_RBLevels4000K int16u[
|
|
19848
|
-
0x0107 WB_RBLevels4300K int16u[
|
|
19849
|
-
0x0108 WB_RBLevels4500K int16u[
|
|
19850
|
-
0x0109 WB_RBLevels4800K int16u[
|
|
19851
|
-
0x010a WB_RBLevels5300K int16u[
|
|
19852
|
-
0x010b WB_RBLevels6000K int16u[
|
|
19853
|
-
0x010c WB_RBLevels6600K int16u[
|
|
19854
|
-
0x010d WB_RBLevels7500K int16u[
|
|
19855
|
-
0x010e WB_RBLevelsCWB1 int16u[
|
|
19856
|
-
0x010f WB_RBLevelsCWB2 int16u[
|
|
19857
|
-
0x0110 WB_RBLevelsCWB3 int16u[
|
|
19858
|
-
0x0111 WB_RBLevelsCWB4 int16u[
|
|
19844
|
+
0x0100 WB_RBLevels int16u[n]
|
|
19845
|
+
0x0102 WB_RBLevels3000K int16u[n]
|
|
19846
|
+
0x0103 WB_RBLevels3300K int16u[n]
|
|
19847
|
+
0x0104 WB_RBLevels3600K int16u[n]
|
|
19848
|
+
0x0105 WB_RBLevels3900K int16u[n]
|
|
19849
|
+
0x0106 WB_RBLevels4000K int16u[n]
|
|
19850
|
+
0x0107 WB_RBLevels4300K int16u[n]
|
|
19851
|
+
0x0108 WB_RBLevels4500K int16u[n]
|
|
19852
|
+
0x0109 WB_RBLevels4800K int16u[n]
|
|
19853
|
+
0x010a WB_RBLevels5300K int16u[n]
|
|
19854
|
+
0x010b WB_RBLevels6000K int16u[n]
|
|
19855
|
+
0x010c WB_RBLevels6600K int16u[n]
|
|
19856
|
+
0x010d WB_RBLevels7500K int16u[n]
|
|
19857
|
+
0x010e WB_RBLevelsCWB1 int16u[n]
|
|
19858
|
+
0x010f WB_RBLevelsCWB2 int16u[n]
|
|
19859
|
+
0x0110 WB_RBLevelsCWB3 int16u[n]
|
|
19860
|
+
0x0111 WB_RBLevelsCWB4 int16u[n]
|
|
19859
19861
|
0x0113 WB_GLevel3000K int16u
|
|
19860
19862
|
0x0114 WB_GLevel3300K int16u
|
|
19861
19863
|
0x0115 WB_GLevel3600K int16u
|
|
@@ -23188,7 +23190,8 @@ The following tags are decoded in unsupported maker notes. Use the Unknown
|
|
|
23188
23190
|
|
|
23189
23191
|
The main DNG tags are found in the EXIF table. The tables below define only
|
|
23190
23192
|
information found within structures of these main DNG tag values. See
|
|
23191
|
-
L<
|
|
23193
|
+
L<https://helpx.adobe.com/camera-raw/digital-negative.html> for the official
|
|
23194
|
+
DNG specification.
|
|
23192
23195
|
|
|
23193
23196
|
=head3 DNG AdobeData Tags
|
|
23194
23197
|
|
|
@@ -29146,7 +29149,7 @@ ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.)
|
|
|
29146
29149
|
'TT2' Title no
|
|
29147
29150
|
'TT3' Subtitle no
|
|
29148
29151
|
'TXT' Lyricist no
|
|
29149
|
-
'TXX'
|
|
29152
|
+
'TXX' UserDefinedText no
|
|
29150
29153
|
'TYE' Year no
|
|
29151
29154
|
'ULT' Lyrics no
|
|
29152
29155
|
'WAF' FileURL no
|
|
@@ -29155,7 +29158,7 @@ ID3 version 2.2 tags. (These are the tags written by iTunes 5.0.)
|
|
|
29155
29158
|
'WCM' CommercialURL no
|
|
29156
29159
|
'WCP' CopyrightURL no
|
|
29157
29160
|
'WPB' PublisherURL no
|
|
29158
|
-
'WXX'
|
|
29161
|
+
'WXX' UserDefinedURL no
|
|
29159
29162
|
|
|
29160
29163
|
=head3 ID3 SynLyrics Tags
|
|
29161
29164
|
|
|
@@ -29167,15 +29170,6 @@ The following tags are extracted from synchronized lyrics/text frames.
|
|
|
29167
29170
|
SynchronizedLyricsText no+
|
|
29168
29171
|
SynchronizedLyricsType no
|
|
29169
29172
|
|
|
29170
|
-
=head3 ID3 UserDefined Tags
|
|
29171
|
-
|
|
29172
|
-
ID3 user-defined text and URL tags will be dynamically added to this table
|
|
29173
|
-
by name when found.
|
|
29174
|
-
|
|
29175
|
-
Tag ID Tag Name Writable
|
|
29176
|
-
------ -------- --------
|
|
29177
|
-
[no tags known]
|
|
29178
|
-
|
|
29179
29173
|
=head3 ID3 v2_3 Tags
|
|
29180
29174
|
|
|
29181
29175
|
ID3 version 2.3 tags. Includes some non-standard tags written by other
|
|
@@ -29245,7 +29239,7 @@ software.
|
|
|
29245
29239
|
'TSOC' ComposerSortOrder no
|
|
29246
29240
|
'TSRC' ISRC no
|
|
29247
29241
|
'TSSE' EncoderSettings no
|
|
29248
|
-
'TXXX'
|
|
29242
|
+
'TXXX' UserDefinedText no
|
|
29249
29243
|
'TYER' Year no
|
|
29250
29244
|
'USER' TermsOfUse no
|
|
29251
29245
|
'USLT' Lyrics no
|
|
@@ -29258,7 +29252,7 @@ software.
|
|
|
29258
29252
|
'WORS' InternetRadioStationURL no
|
|
29259
29253
|
'WPAY' PaymentURL no
|
|
29260
29254
|
'WPUB' PublisherURL no
|
|
29261
|
-
'WXXX'
|
|
29255
|
+
'WXXX' UserDefinedURL no
|
|
29262
29256
|
'XDOR' OriginalReleaseTime no
|
|
29263
29257
|
'XOLY' OlympusDSS Olympus DSS
|
|
29264
29258
|
'XSOA' AlbumSortOrder no
|
|
@@ -29369,7 +29363,7 @@ software.
|
|
|
29369
29363
|
'TSRC' ISRC no
|
|
29370
29364
|
'TSSE' EncoderSettings no
|
|
29371
29365
|
'TSST' SetSubtitle no
|
|
29372
|
-
'TXXX'
|
|
29366
|
+
'TXXX' UserDefinedText no
|
|
29373
29367
|
'USER' TermsOfUse no
|
|
29374
29368
|
'USLT' Lyrics no
|
|
29375
29369
|
'WCOM' CommercialURL no
|
|
@@ -29381,7 +29375,7 @@ software.
|
|
|
29381
29375
|
'WORS' InternetRadioStationURL no
|
|
29382
29376
|
'WPAY' PaymentURL no
|
|
29383
29377
|
'WPUB' PublisherURL no
|
|
29384
|
-
'WXXX'
|
|
29378
|
+
'WXXX' UserDefinedURL no
|
|
29385
29379
|
'XDOR' OriginalReleaseTime no
|
|
29386
29380
|
'XOLY' OlympusDSS Olympus DSS
|
|
29387
29381
|
'XSOA' AlbumSortOrder no
|
|
@@ -30765,7 +30759,7 @@ the config file.
|
|
|
30765
30759
|
'RDTC' RicohRDTC Ricoh RDTC
|
|
30766
30760
|
'RDTG' RicohRDTG Ricoh RDTG
|
|
30767
30761
|
'RDTL' RicohRDTL Ricoh RDTL
|
|
30768
|
-
'RICO' RicohInfo
|
|
30762
|
+
'RICO' RicohInfo JPEG
|
|
30769
30763
|
'RMKN' RicohRMKN EXIF
|
|
30770
30764
|
'RTHU' PreviewImage no
|
|
30771
30765
|
'SDLN' PlayMode string
|
|
@@ -215,7 +215,7 @@ sub FormatIPTC($$$$$;$)
|
|
|
215
215
|
sub IptcDate($)
|
|
216
216
|
{
|
|
217
217
|
my $val = shift;
|
|
218
|
-
unless ($val =~ s{
|
|
218
|
+
unless ($val =~ s{^.*?(\d{4})[-:/.]?(\d{2})[-:/.]?(\d{2}).*}{$1$2$3}s) {
|
|
219
219
|
warn "Invalid date format (use YYYY:mm:dd)\n";
|
|
220
220
|
undef $val;
|
|
221
221
|
}
|
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);
|
|
31
31
|
|
|
32
|
-
$VERSION = '12.
|
|
32
|
+
$VERSION = '12.86';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -6859,11 +6859,12 @@ sub DirStart($$;$)
|
|
|
6859
6859
|
#------------------------------------------------------------------------------
|
|
6860
6860
|
# Extract metadata from a jpg image
|
|
6861
6861
|
# Inputs: 0) ExifTool object reference, 1) dirInfo ref with RAF set
|
|
6862
|
+
# 2) tag table ref to process JPEG-like metadata
|
|
6862
6863
|
# Returns: 1 on success, 0 if this wasn't a valid JPEG file
|
|
6863
|
-
sub ProcessJPEG(
|
|
6864
|
+
sub ProcessJPEG($$;$)
|
|
6864
6865
|
{
|
|
6865
6866
|
local $_;
|
|
6866
|
-
my ($self, $dirInfo) = @_;
|
|
6867
|
+
my ($self, $dirInfo, $optionalTagTable) = @_;
|
|
6867
6868
|
my $options = $$self{OPTIONS};
|
|
6868
6869
|
my $verbose = $$options{Verbose};
|
|
6869
6870
|
my $out = $$options{TextOut};
|
|
@@ -6871,20 +6872,29 @@ sub ProcessJPEG($$)
|
|
|
6871
6872
|
my $raf = $$dirInfo{RAF};
|
|
6872
6873
|
my $req = $$self{REQ_TAG_LOOKUP};
|
|
6873
6874
|
my $htmlDump = $$self{HTML_DUMP};
|
|
6874
|
-
my %dumpParms = ( Out => $out );
|
|
6875
|
-
my ($ch, $s, $length, $hash, $hashsize);
|
|
6875
|
+
my %dumpParms = ( Out => $out, Prefix => $$self{INDENT} );
|
|
6876
|
+
my ($ch, $s, $length, $hash, $hashsize, $indent);
|
|
6876
6877
|
my ($success, $wantTrailer, $trailInfo, $foundSOS, $gotSize, %jumbfChunk);
|
|
6877
6878
|
my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal);
|
|
6878
6879
|
my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP);
|
|
6879
6880
|
|
|
6881
|
+
($indent = $$self{INDENT}) =~ s/ $//;
|
|
6882
|
+
unless ($raf) {
|
|
6883
|
+
$raf = File::RandomAccess->new($$dirInfo{DataPt});
|
|
6884
|
+
$self->VerboseDir('JPEG', undef, length(${$$dirInfo{DataPt}}));
|
|
6885
|
+
}
|
|
6880
6886
|
# get pointer to hash object if it exists and we are the top-level JPEG or JP2
|
|
6881
6887
|
if ($$self{FILE_TYPE} =~ /^(JPEG|JP2)$/ and not $$self{DOC_NUM}) {
|
|
6882
6888
|
$hash = $$self{ImageDataHash};
|
|
6883
6889
|
$hashsize = 0;
|
|
6884
6890
|
}
|
|
6885
|
-
|
|
6886
6891
|
# check to be sure this is a valid JPG (or J2C, or EXV) file
|
|
6887
|
-
|
|
6892
|
+
if ($raf->Read($s, 2) == 2 and $s =~ /^\xff[\xd8\x4f\x01]/) {
|
|
6893
|
+
undef $optionalTagTable;
|
|
6894
|
+
} else {
|
|
6895
|
+
return 0 unless $optionalTagTable and $s =~ /^\xff[\xe0-\xef]/;
|
|
6896
|
+
$raf->Seek(-2, 1) or $self->Error('Seek error'), return 1;
|
|
6897
|
+
}
|
|
6888
6898
|
if ($s eq "\xff\x01") {
|
|
6889
6899
|
return 0 unless $raf->Read($s, 5) == 5 and $s eq 'Exiv2';
|
|
6890
6900
|
$$self{FILE_TYPE} = 'EXV';
|
|
@@ -6902,7 +6912,7 @@ sub ProcessJPEG($$)
|
|
|
6902
6912
|
$$raf{NoBuffer} = 1 if $self->Options('FastScan'); # disable buffering in FastScan mode
|
|
6903
6913
|
|
|
6904
6914
|
$dumpParms{MaxLen} = 128 if $verbose < 4;
|
|
6905
|
-
if ($htmlDump) {
|
|
6915
|
+
if ($htmlDump and not $optionalTagTable) {
|
|
6906
6916
|
$dumpEnd = $raf->Tell();
|
|
6907
6917
|
my ($n, $t, $m) = $s eq 'Exiv2' ? (7,'EXV','TEM') : (2,'JPEG','SOI');
|
|
6908
6918
|
my $pos = $dumpEnd - $n;
|
|
@@ -6921,6 +6931,7 @@ sub ProcessJPEG($$)
|
|
|
6921
6931
|
Marker: for (;;) {
|
|
6922
6932
|
# set marker and data pointer for current segment
|
|
6923
6933
|
my $marker = $nextMarker;
|
|
6934
|
+
last if $marker and $marker < 0;
|
|
6924
6935
|
my $segDataPt = $nextSegDataPt;
|
|
6925
6936
|
my $segPos = $nextSegPos;
|
|
6926
6937
|
my $skipped;
|
|
@@ -6929,12 +6940,17 @@ sub ProcessJPEG($$)
|
|
|
6929
6940
|
#
|
|
6930
6941
|
# read ahead to the next segment unless we have reached EOI, SOS or SOD
|
|
6931
6942
|
#
|
|
6932
|
-
|
|
6943
|
+
until ($marker and ($marker==0xd9 or ($marker==0xda and not $wantTrailer and not $hash) or
|
|
6933
6944
|
$marker==0x93))
|
|
6934
6945
|
{
|
|
6935
6946
|
# read up to next marker (JPEG markers begin with 0xff)
|
|
6936
6947
|
my $buff;
|
|
6937
|
-
$raf->ReadLine($buff)
|
|
6948
|
+
unless ($raf->ReadLine($buff)) {
|
|
6949
|
+
last Marker unless $optionalTagTable;
|
|
6950
|
+
$nextMarker = -1;
|
|
6951
|
+
$success = 1;
|
|
6952
|
+
last;
|
|
6953
|
+
}
|
|
6938
6954
|
$skipped = length($buff) - 1;
|
|
6939
6955
|
# JPEG markers can be padded with unlimited 0xff's
|
|
6940
6956
|
for (;;) {
|
|
@@ -6946,21 +6962,21 @@ sub ProcessJPEG($$)
|
|
|
6946
6962
|
# read segment data if it exists
|
|
6947
6963
|
if (not defined $markerLenBytes{$nextMarker}) {
|
|
6948
6964
|
# read record length word
|
|
6949
|
-
last unless $raf->Read($s, 2) == 2;
|
|
6965
|
+
last Marker unless $raf->Read($s, 2) == 2;
|
|
6950
6966
|
my $len = unpack('n',$s); # get data length
|
|
6951
|
-
last unless defined($len) and $len >= 2;
|
|
6967
|
+
last Marker unless defined($len) and $len >= 2;
|
|
6952
6968
|
$nextSegPos = $raf->Tell();
|
|
6953
6969
|
$len -= 2; # subtract size of length word
|
|
6954
|
-
last unless $raf->Read($buff, $len) == $len;
|
|
6970
|
+
last Marker unless $raf->Read($buff, $len) == $len;
|
|
6955
6971
|
$nextSegDataPt = \$buff; # set pointer to our next data
|
|
6956
6972
|
} elsif ($markerLenBytes{$nextMarker} == 4) {
|
|
6957
6973
|
# handle J2C extensions with 4-byte length word
|
|
6958
|
-
last unless $raf->Read($s, 4) == 4;
|
|
6974
|
+
last Marker unless $raf->Read($s, 4) == 4;
|
|
6959
6975
|
my $len = unpack('N',$s); # get data length
|
|
6960
|
-
last unless defined($len) and $len >= 4;
|
|
6976
|
+
last Marker unless defined($len) and $len >= 4;
|
|
6961
6977
|
$nextSegPos = $raf->Tell();
|
|
6962
6978
|
$len -= 4; # subtract size of length word
|
|
6963
|
-
last unless $raf->Seek($len, 1);
|
|
6979
|
+
last Marker unless $raf->Seek($len, 1);
|
|
6964
6980
|
} elsif ($hash and defined $marker and ($marker == 0x00 or $marker == 0xda or
|
|
6965
6981
|
($marker >= 0xd0 and $marker <= 0xd7)))
|
|
6966
6982
|
{
|
|
@@ -6976,7 +6992,8 @@ sub ProcessJPEG($$)
|
|
|
6976
6992
|
$hashsize += $skipped + 2;
|
|
6977
6993
|
}
|
|
6978
6994
|
# read second segment too if this was the first
|
|
6979
|
-
next unless defined $marker;
|
|
6995
|
+
next Marker unless defined $marker;
|
|
6996
|
+
last;
|
|
6980
6997
|
}
|
|
6981
6998
|
# set some useful variables for the current segment
|
|
6982
6999
|
my $markerName = JpegMarkerName($marker);
|
|
@@ -6996,7 +7013,7 @@ sub ProcessJPEG($$)
|
|
|
6996
7013
|
if (($marker & 0xf0) == 0xc0 and ($marker == 0xc0 or $marker & 0x03)) {
|
|
6997
7014
|
$length = length $$segDataPt;
|
|
6998
7015
|
if ($verbose) {
|
|
6999
|
-
print $out "JPEG $markerName ($length bytes):\n";
|
|
7016
|
+
print $out "${indent}JPEG $markerName ($length bytes):\n";
|
|
7000
7017
|
HexDump($segDataPt, undef, %dumpParms, Addr=>$segPos) if $verbose>2;
|
|
7001
7018
|
} elsif ($htmlDump) {
|
|
7002
7019
|
$self->HDump($segPos-4, $length+4, "[JPEG $markerName]", undef, 0x08);
|
|
@@ -7039,7 +7056,7 @@ sub ProcessJPEG($$)
|
|
|
7039
7056
|
next;
|
|
7040
7057
|
} elsif ($marker == 0xd9) { # EOI
|
|
7041
7058
|
pop @$path;
|
|
7042
|
-
$verbose and print $out "JPEG EOI\n";
|
|
7059
|
+
$verbose and print $out "${indent}JPEG EOI\n";
|
|
7043
7060
|
my $pos = $raf->Tell();
|
|
7044
7061
|
$$self{TrailerStart} = $pos unless $$self{DOC_NUM};
|
|
7045
7062
|
if ($htmlDump and $dumpEnd) {
|
|
@@ -7100,7 +7117,7 @@ sub ProcessJPEG($$)
|
|
|
7100
7117
|
# adjust PreviewImageStart to this location
|
|
7101
7118
|
my $actual = $pos + pos($buff) - 4;
|
|
7102
7119
|
if ($start and $start ne $actual and $verbose > 1) {
|
|
7103
|
-
print $out "(Fixed PreviewImage location: $start -> $actual)\n";
|
|
7120
|
+
print $out "${indent}(Fixed PreviewImage location: $start -> $actual)\n";
|
|
7104
7121
|
}
|
|
7105
7122
|
# update preview image offsets
|
|
7106
7123
|
if ($start) {
|
|
@@ -7154,7 +7171,7 @@ sub ProcessJPEG($$)
|
|
|
7154
7171
|
pop @$path;
|
|
7155
7172
|
$foundSOS = 1;
|
|
7156
7173
|
# all done with meta information unless we have a trailer
|
|
7157
|
-
$verbose and print $out "JPEG SOS\n";
|
|
7174
|
+
$verbose and print $out "${indent}JPEG SOS\n";
|
|
7158
7175
|
unless ($fast) {
|
|
7159
7176
|
$trailInfo = IdentifyTrailer($raf);
|
|
7160
7177
|
# process trailer now unless we are doing verbose dump
|
|
@@ -7194,7 +7211,7 @@ sub ProcessJPEG($$)
|
|
|
7194
7211
|
last; # all done parsing file
|
|
7195
7212
|
} elsif ($marker == 0x93) {
|
|
7196
7213
|
pop @$path;
|
|
7197
|
-
$verbose and print $out "JPEG SOD\n";
|
|
7214
|
+
$verbose and print $out "${indent}JPEG SOD\n";
|
|
7198
7215
|
$success = 1;
|
|
7199
7216
|
if ($hash and $$self{FILE_TYPE} eq 'JP2') {
|
|
7200
7217
|
my $pos = $raf->Tell();
|
|
@@ -7205,7 +7222,7 @@ sub ProcessJPEG($$)
|
|
|
7205
7222
|
last; # all done parsing file
|
|
7206
7223
|
} elsif (defined $markerLenBytes{$marker}) {
|
|
7207
7224
|
# handle other stand-alone markers and segments we skipped over
|
|
7208
|
-
$verbose and $marker and print $out "JPEG $markerName\n";
|
|
7225
|
+
$verbose and $marker and print $out "${indent}JPEG $markerName\n";
|
|
7209
7226
|
next;
|
|
7210
7227
|
} elsif ($marker == 0xdb and length($$segDataPt) and # DQT
|
|
7211
7228
|
# save the DQT data only if JPEGDigest has been requested
|
|
@@ -7225,7 +7242,7 @@ sub ProcessJPEG($$)
|
|
|
7225
7242
|
$length = length $$segDataPt;
|
|
7226
7243
|
$appBytes += $length + 4 if ($marker & 0xf0) == 0xe0; # total size of APP segments
|
|
7227
7244
|
if ($verbose) {
|
|
7228
|
-
print $out "JPEG $markerName ($length bytes):\n";
|
|
7245
|
+
print $out "${indent}JPEG $markerName ($length bytes):\n";
|
|
7229
7246
|
if ($verbose > 2) {
|
|
7230
7247
|
my %extraParms = ( Addr => $segPos );
|
|
7231
7248
|
$extraParms{MaxLen} = 128 if $verbose == 4;
|
|
@@ -7383,7 +7400,7 @@ sub ProcessJPEG($$)
|
|
|
7383
7400
|
# some software erroneously writes zeros for the chunk counts)
|
|
7384
7401
|
my $chunkNum = Get8u($segDataPt, 6);
|
|
7385
7402
|
my $chunksTot = Get8u($segDataPt, 7) + 1; # (note the "+ 1"!)
|
|
7386
|
-
$verbose and printf $out "
|
|
7403
|
+
$verbose and printf $out "${indent}FLIR chunk %d of %d\n",
|
|
7387
7404
|
$chunkNum + 1, $chunksTot;
|
|
7388
7405
|
if (defined $flirTotal) {
|
|
7389
7406
|
# abort parsing FLIR if the total chunk count is inconsistent
|
|
@@ -7448,7 +7465,7 @@ sub ProcessJPEG($$)
|
|
|
7448
7465
|
# some software erroneously writes zeros for the chunk counts)
|
|
7449
7466
|
my $chunkNum = Get8u($segDataPt, 12);
|
|
7450
7467
|
my $chunksTot = Get8u($segDataPt, 13);
|
|
7451
|
-
$verbose and print $out "
|
|
7468
|
+
$verbose and print $out "${indent}ICC_Profile chunk $chunkNum of $chunksTot\n";
|
|
7452
7469
|
if (defined $iccChunksTotal) {
|
|
7453
7470
|
# abort parsing ICC_Profile if the total chunk count is inconsistent
|
|
7454
7471
|
undef $iccChunkCount if $chunksTot != $iccChunksTotal;
|
|
@@ -8001,7 +8018,7 @@ sub ProcessJPEG($$)
|
|
|
8001
8018
|
}
|
|
8002
8019
|
}
|
|
8003
8020
|
# print verbose hash message if necessary
|
|
8004
|
-
print $out "
|
|
8021
|
+
print $out "${indent}(ImageDataHash: $hashsize bytes of JPEG image data)\n" if $hashsize and $verbose;
|
|
8005
8022
|
# calculate JPEGDigest if requested
|
|
8006
8023
|
if (@dqt) {
|
|
8007
8024
|
require Image::ExifTool::JPEGDigest;
|
data/bin/lib/Image/ExifTool.pod
CHANGED
|
@@ -2540,20 +2540,19 @@ RIFF, RMETA, RSRC, RTF, Radiance, Rawzor, Real, Real-CONT, Real-MDPR,
|
|
|
2540
2540
|
Real-PROP, Real-RA3, Real-RA4, Real-RA5, Real-RJMD, Reconyx, Red, Ricoh,
|
|
2541
2541
|
SPIFF, SR2, SR2DataIFD, SR2SubIFD, SRF#, SVG, Samsung, Sanyo, Scalado,
|
|
2542
2542
|
Sigma, SigmaRaw, Sony, SonyIDC, Stim, SubIFD, System, Theora, Torrent,
|
|
2543
|
-
Track#, UserData,
|
|
2544
|
-
|
|
2545
|
-
XMP-
|
|
2546
|
-
XMP-
|
|
2547
|
-
XMP-
|
|
2548
|
-
XMP-
|
|
2549
|
-
XMP-
|
|
2550
|
-
XMP-
|
|
2551
|
-
XMP-
|
|
2552
|
-
XMP-
|
|
2553
|
-
XMP-
|
|
2554
|
-
XMP-
|
|
2555
|
-
XMP-
|
|
2556
|
-
ZIP, iTunes
|
|
2543
|
+
Track#, UserData, VCalendar, VCard, VNote, Version0, Vorbis, WTV, XML, XMP,
|
|
2544
|
+
XMP-DICOM, XMP-Device, XMP-GAudio, XMP-GCamera, XMP-GCreations, XMP-GDepth,
|
|
2545
|
+
XMP-GFocus, XMP-GImage, XMP-GPano, XMP-GSpherical, XMP-LImage, XMP-MP,
|
|
2546
|
+
XMP-MP1, XMP-PixelLive, XMP-aas, XMP-acdsee, XMP-album, XMP-apple-fi,
|
|
2547
|
+
XMP-ast, XMP-aux, XMP-cc, XMP-cell, XMP-crd, XMP-creatorAtom, XMP-crs,
|
|
2548
|
+
XMP-dc, XMP-dex, XMP-digiKam, XMP-drone-dji, XMP-dwc, XMP-et, XMP-exif,
|
|
2549
|
+
XMP-exifEX, XMP-expressionmedia, XMP-extensis, XMP-fpv, XMP-getty, XMP-hdr,
|
|
2550
|
+
XMP-hdrgm, XMP-ics, XMP-iptcCore, XMP-iptcExt, XMP-lr, XMP-mediapro,
|
|
2551
|
+
XMP-microsoft, XMP-mwg-coll, XMP-mwg-kw, XMP-mwg-rs, XMP-nine, XMP-panorama,
|
|
2552
|
+
XMP-pdf, XMP-pdfx, XMP-photomech, XMP-photoshop, XMP-plus, XMP-pmi,
|
|
2553
|
+
XMP-prism, XMP-prl, XMP-prm, XMP-pur, XMP-rdf, XMP-sdc, XMP-swf, XMP-tiff,
|
|
2554
|
+
XMP-x, XMP-xmp, XMP-xmpBJ, XMP-xmpDM, XMP-xmpDSA, XMP-xmpMM, XMP-xmpNote,
|
|
2555
|
+
XMP-xmpPLUS, XMP-xmpRights, XMP-xmpTPg, ZIP, iTunes
|
|
2557
2556
|
|
|
2558
2557
|
=item Family 2 (Category):
|
|
2559
2558
|
|
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: 12.
|
|
4
|
+
version: 12.86.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: 2024-06-
|
|
12
|
+
date: 2024-06-10 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: exiftool
|
|
@@ -326,7 +326,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
326
326
|
requirements:
|
|
327
327
|
- - ">="
|
|
328
328
|
- !ruby/object:Gem::Version
|
|
329
|
-
version: '3.
|
|
329
|
+
version: '3.1'
|
|
330
330
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
331
331
|
requirements:
|
|
332
332
|
- - ">="
|