exiftool_vendored 12.85.0 → 12.86.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
- - ">="
|