exiftool_vendored 12.68.0 → 12.70.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 +63 -15
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +13 -13
- data/bin/lib/Image/ExifTool/CBOR.pm +18 -2
- data/bin/lib/Image/ExifTool/Canon.pm +68 -16
- data/bin/lib/Image/ExifTool/DJI.pm +3 -2
- data/bin/lib/Image/ExifTool/DNG.pm +25 -2
- data/bin/lib/Image/ExifTool/EXE.pm +54 -6
- data/bin/lib/Image/ExifTool/Exif.pm +175 -14
- data/bin/lib/Image/ExifTool/FujiFilm.pm +142 -20
- data/bin/lib/Image/ExifTool/GIF.pm +5 -1
- data/bin/lib/Image/ExifTool/ID3.pm +70 -7
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +30 -15
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +58 -18
- data/bin/lib/Image/ExifTool/Olympus.pm +7 -1
- data/bin/lib/Image/ExifTool/PNG.pm +8 -13
- data/bin/lib/Image/ExifTool/Panasonic.pm +15 -2
- data/bin/lib/Image/ExifTool/PhotoMechanic.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +32 -5
- data/bin/lib/Image/ExifTool/README +14 -5
- data/bin/lib/Image/ExifTool/RIFF.pm +60 -10
- data/bin/lib/Image/ExifTool/Sony.pm +95 -34
- data/bin/lib/Image/ExifTool/TagLookup.pm +6937 -6714
- data/bin/lib/Image/ExifTool/TagNames.pod +812 -332
- data/bin/lib/Image/ExifTool/Text.pm +4 -5
- data/bin/lib/Image/ExifTool/Validate.pm +23 -20
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
- data/bin/lib/Image/ExifTool/WriteExif.pl +14 -4
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +31 -6
- data/bin/lib/Image/ExifTool/Writer.pl +40 -14
- data/bin/lib/Image/ExifTool/XMP.pm +67 -2
- data/bin/lib/Image/ExifTool/XMP2.pl +35 -0
- data/bin/lib/Image/ExifTool.pm +79 -40
- data/bin/lib/Image/ExifTool.pod +9 -3
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -18,12 +18,13 @@ use strict;
|
|
18
18
|
use vars qw($VERSION);
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.59';
|
22
22
|
|
23
23
|
sub ProcessID3v2($$$);
|
24
24
|
sub ProcessPrivate($$$);
|
25
25
|
sub ProcessSynText($$$);
|
26
26
|
sub ProcessID3Dir($$$);
|
27
|
+
sub ProcessGEOB($$$);
|
27
28
|
sub ConvertID3v1Text($$);
|
28
29
|
sub ConvertTimeStamp($);
|
29
30
|
|
@@ -419,7 +420,7 @@ my %genre = (
|
|
419
420
|
|
420
421
|
# Tags for ID2v2.2
|
421
422
|
%Image::ExifTool::ID3::v2_2 = (
|
422
|
-
PROCESS_PROC => \&
|
423
|
+
PROCESS_PROC => \&ProcessID3v2,
|
423
424
|
GROUPS => { 1 => 'ID3v2_2', 2 => 'Audio' },
|
424
425
|
NOTES => q{
|
425
426
|
ExifTool extracts mainly text-based tags from ID3v2 information. The tags
|
@@ -511,6 +512,9 @@ my %genre = (
|
|
511
512
|
TSC => 'ComposerSortOrder',
|
512
513
|
ITU => { Name => 'iTunesU', Description => 'iTunes U', Binary => 1, Unknown => 1 },
|
513
514
|
PCS => { Name => 'Podcast', Binary => 1, Unknown => 1 },
|
515
|
+
GP1 => 'Grouping', #github142 (NC)
|
516
|
+
MVN => 'MovementName', #github142 (NC)
|
517
|
+
MVI => 'MovementNumber', #github142 (NC)
|
514
518
|
);
|
515
519
|
|
516
520
|
# tags common to ID3v2.3 and ID3v2.4
|
@@ -534,7 +538,10 @@ my %id3v2_common = (
|
|
534
538
|
# COMR => 'Commercial',
|
535
539
|
# ENCR => 'EncryptionMethod',
|
536
540
|
# ETCO => 'EventTimingCodes',
|
537
|
-
|
541
|
+
GEOB => {
|
542
|
+
Name => 'GeneralEncapsulatedObject',
|
543
|
+
SubDirectory => { TagTable => 'Image::ExifTool::ID3::GEOB' },
|
544
|
+
},
|
538
545
|
# GRID => 'GroupIdentification',
|
539
546
|
# LINK => 'LinkedInformation',
|
540
547
|
MCDI => { Name => 'MusicCDIdentifier', Binary => 1 },
|
@@ -640,9 +647,25 @@ my %id3v2_common = (
|
|
640
647
|
MVIN => 'MovementNumber', # (NC)
|
641
648
|
);
|
642
649
|
|
650
|
+
%Image::ExifTool::ID3::GEOB = (
|
651
|
+
GROUPS => { 1 => 'ID3v2_3', 2 => 'Other' },
|
652
|
+
PROCESS_PROC => \&ProcessGEOB,
|
653
|
+
'application/x-c2pa-manifest-store' => {
|
654
|
+
Name => 'JUMBF',
|
655
|
+
SubDirectory => {
|
656
|
+
TagTable => 'Image::ExifTool::Jpeg2000::Main',
|
657
|
+
ByteOrder => 'BigEndian',
|
658
|
+
},
|
659
|
+
},
|
660
|
+
'GEOB-Mime' => { },
|
661
|
+
'GEOB-File' => { },
|
662
|
+
'GEOB-Desc' => { },
|
663
|
+
'GEOB-Data' => { },
|
664
|
+
);
|
665
|
+
|
643
666
|
# Tags for ID3v2.3 (http://www.id3.org/id3v2.3.0)
|
644
667
|
%Image::ExifTool::ID3::v2_3 = (
|
645
|
-
PROCESS_PROC => \&
|
668
|
+
PROCESS_PROC => \&ProcessID3v2,
|
646
669
|
GROUPS => { 1 => 'ID3v2_3', 2 => 'Audio' },
|
647
670
|
NOTES => q{
|
648
671
|
ID3 version 2.3 tags. Includes some non-standard tags written by other
|
@@ -662,7 +685,7 @@ my %id3v2_common = (
|
|
662
685
|
|
663
686
|
# Tags for ID3v2.4 (http://www.id3.org/id3v2.4.0-frames)
|
664
687
|
%Image::ExifTool::ID3::v2_4 = (
|
665
|
-
PROCESS_PROC => \&
|
688
|
+
PROCESS_PROC => \&ProcessID3v2,
|
666
689
|
GROUPS => { 1 => 'ID3v2_4', 2 => 'Audio' },
|
667
690
|
NOTES => q{
|
668
691
|
ID3 version 2.4 tags. Includes some non-standard tags written by other
|
@@ -1101,7 +1124,11 @@ sub ProcessID3v2($$$)
|
|
1101
1124
|
my $oldLen = $len;
|
1102
1125
|
$len = UnSyncSafe($len);
|
1103
1126
|
if (not defined $len or $offset + $len + 10 > $size) {
|
1104
|
-
$
|
1127
|
+
if ($offset + $len == $size) {
|
1128
|
+
$et->Warn('Missing ID3 terminating frame', 1);
|
1129
|
+
} else {
|
1130
|
+
$et->Warn('Invalid ID3 frame size');
|
1131
|
+
}
|
1105
1132
|
last;
|
1106
1133
|
}
|
1107
1134
|
# check next ID to see if it makes sense
|
@@ -1218,7 +1245,7 @@ sub ProcessID3v2($$$)
|
|
1218
1245
|
my @vals = DecodeString($et, $val);
|
1219
1246
|
foreach (0..1) { $vals[$_] = '' unless defined $vals[$_]; }
|
1220
1247
|
($val = "($vals[0]) $vals[1]") =~ s/^\(\) //;
|
1221
|
-
} elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS)$/) {
|
1248
|
+
} elsif ($id =~ /^T/ or $id =~ /^(IPL|IPLS|GP1|MVI|MVN)$/) {
|
1222
1249
|
$val = DecodeString($et, $val);
|
1223
1250
|
} elsif ($id =~ /^(WXX|WXXX)$/) {
|
1224
1251
|
# one encoded string and one Latin string separated by a null
|
@@ -1582,6 +1609,42 @@ sub ProcessID3Dir($$$)
|
|
1582
1609
|
return ProcessID3($et, $dirInfo);
|
1583
1610
|
}
|
1584
1611
|
|
1612
|
+
#------------------------------------------------------------------------------
|
1613
|
+
# Process ID3 General Encapsulated Object
|
1614
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
1615
|
+
# Returns: 1 on success
|
1616
|
+
sub ProcessGEOB($$$)
|
1617
|
+
{
|
1618
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
1619
|
+
$et->VerboseDir('GEOB', undef, length ${$$dirInfo{DataPt}});
|
1620
|
+
my $dataPt = $$dirInfo{DataPt};
|
1621
|
+
my $len = length $$dataPt;
|
1622
|
+
$len >= 4 or $et->Warn("Short GEOB frame"), return 0;
|
1623
|
+
my ($hdr, $attr);
|
1624
|
+
my $enc = unpack('C', $$dataPt);
|
1625
|
+
if ($enc == 1 or $enc == 2) {
|
1626
|
+
$hdr = ".(.*?)\0((?:..)*?)\0\0((?:..)*?)\0\0";
|
1627
|
+
} else {
|
1628
|
+
$hdr = ".(.*?)\0(.*?)\0(.*?)\0";
|
1629
|
+
}
|
1630
|
+
# remove header (encoding, mime, filename, description)
|
1631
|
+
$$dataPt =~ s/^$hdr//s or $et->Warn("Invalid GEOB frame"), return 0;
|
1632
|
+
my ($mime, $file, $desc) = ($1, DecodeString($et, $2, $enc), DecodeString($et, $3, $enc));
|
1633
|
+
$et->HandleTag($tagTablePtr, 'GEOB-Mime', $mime) if length $mime;
|
1634
|
+
$et->HandleTag($tagTablePtr, 'GEOB-File', $file) if length $file;
|
1635
|
+
$et->HandleTag($tagTablePtr, 'GEOB-Desc', $desc) if length $desc;
|
1636
|
+
if ($$tagTablePtr{$mime}) {
|
1637
|
+
$et->HandleTag($tagTablePtr, $mime, undef,
|
1638
|
+
DataPt => $dataPt,
|
1639
|
+
Start => 0,
|
1640
|
+
Size => length($$dataPt),
|
1641
|
+
);
|
1642
|
+
} else {
|
1643
|
+
$et->HandleTag($tagTablePtr, 'GEOB-Data', $dataPt);
|
1644
|
+
}
|
1645
|
+
return 1;
|
1646
|
+
}
|
1647
|
+
|
1585
1648
|
#------------------------------------------------------------------------------
|
1586
1649
|
# Extract ID3 information from an MP3 audio file
|
1587
1650
|
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
@@ -122,7 +122,7 @@ sub ProcessIND($$)
|
|
122
122
|
# memory troubles (with its apparent 1 GB limit) if the XMP is larger
|
123
123
|
# than about 400 MB, so guard against this
|
124
124
|
if ($len > 300 * 1024 * 1024) {
|
125
|
-
my $msg = sprintf('Insanely large XMP (%.0f
|
125
|
+
my $msg = sprintf('Insanely large XMP (%.0f MiB)', $len / (1024 * 1024));
|
126
126
|
if ($outfile) {
|
127
127
|
$et->Error($msg, 2) and $err = 1, last;
|
128
128
|
} elsif ($et->Options('IgnoreMinorErrors')) {
|
@@ -251,7 +251,7 @@ sub ProcessJPEG_HDR($$$);
|
|
251
251
|
Name => 'JUMBF',
|
252
252
|
Condition => '$$valPt =~ /^JP/',
|
253
253
|
SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
|
254
|
-
# Note: The
|
254
|
+
# Note: The suggested options for reading C2PA CAI JUMBF metadata are "-G3 -b -j -u"
|
255
255
|
}],
|
256
256
|
APP12 => [{
|
257
257
|
Name => 'PictureInfo',
|
@@ -89,12 +89,14 @@ my %uuid = (
|
|
89
89
|
# JPEG2000 codestream markers (ref ISO/IEC FCD15444-1/2)
|
90
90
|
my %j2cMarker = (
|
91
91
|
0x4f => 'SOC', # start of codestream
|
92
|
+
# 0x50 - seen in JPH codestream
|
92
93
|
0x51 => 'SIZ', # image and tile size
|
93
94
|
0x52 => 'COD', # coding style default
|
94
95
|
0x53 => 'COC', # coding style component
|
95
96
|
0x55 => 'TLM', # tile-part lengths
|
96
97
|
0x57 => 'PLM', # packet length, main header
|
97
98
|
0x58 => 'PLT', # packet length, tile-part header
|
99
|
+
# 0x59 - seen in JPH codestream
|
98
100
|
0x5c => 'QCD', # quantization default
|
99
101
|
0x5d => 'QCC', # quantization component
|
100
102
|
0x5e => 'RGN', # region of interest
|
@@ -128,12 +130,21 @@ my %j2cMarker = (
|
|
128
130
|
WRITE_PROC => \&ProcessJpeg2000Box,
|
129
131
|
PREFERRED => 1, # always add these tags when writing
|
130
132
|
NOTES => q{
|
131
|
-
The tags below are found in JPEG 2000 images and the JUMBF metadata
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
133
|
+
The tags below are found in JPEG 2000 images and the C2PA CAI JUMBF metadata
|
134
|
+
in various file types (see below). Note that ExifTool currently writes only
|
135
|
+
EXIF, IPTC and XMP tags in Jpeg2000 images, and EXIF and XMP in JXL images.
|
136
|
+
ExifTool will read/write Brotli-compressed EXIF and XMP in JXL images, but
|
137
|
+
the API L<Compress|../ExifTool.html#Compress> option must be set to create new EXIF and XMP in compressed
|
138
|
+
format.
|
139
|
+
|
140
|
+
C2PA (Coalition for Content Provenance and Authenticity) CAI (Content
|
141
|
+
Authenticity Initiative) JUMBF (JPEG Universal Metadata Box Format) metdata
|
142
|
+
is currently extracted from JPEG, PNG, TIFF-based (eg. TIFF, DNG),
|
143
|
+
QuickTime-based (eg. MP4, MOV, HEIF, AVIF), RIFF-based (eg. WAV, AVI, WebP),
|
144
|
+
GIF files and ID3v2 metadata. The suggested ExifTool command-line arguments
|
145
|
+
for reading C2PA metadata are C<-jumbf:all -G3 -b -j -u -struct>. This
|
146
|
+
metadata may be deleted from writable JPEG, PNG, WebP, TIFF-based, and
|
147
|
+
QuickTime-based files by deleting the JUMBF group with C<-jumbf:all=>.
|
137
148
|
},
|
138
149
|
#
|
139
150
|
# NOTE: ONLY TAGS WITH "Format" DEFINED ARE EXTRACTED!
|
@@ -345,13 +356,6 @@ my %j2cMarker = (
|
|
345
356
|
Start => '$valuePtr + 16',
|
346
357
|
},
|
347
358
|
},
|
348
|
-
{
|
349
|
-
Name => 'UUID-Signature', # (seen in JUMB data of JPEG images)
|
350
|
-
# (may be able to remove this when JUMBF specification is finalized)
|
351
|
-
Condition => '$$valPt=~/^casg\x00\x11\x00\x10\x80\x00\x00\xaa\x00\x38\x9b\x71/',
|
352
|
-
Format => 'undef',
|
353
|
-
ValueConv => 'substr($val,16)',
|
354
|
-
},
|
355
359
|
{
|
356
360
|
Name => 'UUID-C2PAClaimSignature', # (seen in incorrectly-formatted JUMB data of JPEG images)
|
357
361
|
# (may be able to remove this when JUMBF specification is finalized)
|
@@ -361,6 +365,13 @@ my %j2cMarker = (
|
|
361
365
|
Start => '$valuePtr + 16',
|
362
366
|
},
|
363
367
|
},
|
368
|
+
{
|
369
|
+
Name => 'UUID-Signature', # (seen in JUMB data of JPEG images)
|
370
|
+
# (may be able to remove this when JUMBF specification is finalized)
|
371
|
+
Condition => '$$valPt=~/^casg\x00\x11\x00\x10\x80\x00\x00\xaa\x00\x38\x9b\x71/',
|
372
|
+
Format => 'undef',
|
373
|
+
ValueConv => 'substr($val,16)',
|
374
|
+
},
|
364
375
|
{
|
365
376
|
Name => 'UUID-Unknown',
|
366
377
|
},
|
@@ -549,6 +560,7 @@ my %j2cMarker = (
|
|
549
560
|
'jpm ' => 'JPEG 2000 Compound Image (.JPM)', # image/jpm
|
550
561
|
'jpx ' => 'JPEG 2000 with extensions (.JPX)', # image/jpx
|
551
562
|
'jxl ' => 'JPEG XL Image (.JXL)', # image/jxl
|
563
|
+
'jph ' => 'High-throughput JPEG 2000 (.JPH)', # image/jph
|
552
564
|
},
|
553
565
|
},
|
554
566
|
1 => {
|
@@ -993,10 +1005,12 @@ sub ProcessJpeg2000Box($$$)
|
|
993
1005
|
my $dirLen = $$dirInfo{DirLen} || 0;
|
994
1006
|
my $dirStart = $$dirInfo{DirStart} || 0;
|
995
1007
|
my $base = $$dirInfo{Base} || 0;
|
996
|
-
my $raf = $$dirInfo{RAF};
|
997
1008
|
my $outfile = $$dirInfo{OutFile};
|
998
1009
|
my $dirEnd = $dirStart + $dirLen;
|
999
|
-
my ($err, $outBuff, $verbose, $doColour, $hash);
|
1010
|
+
my ($err, $outBuff, $verbose, $doColour, $hash, $raf);
|
1011
|
+
|
1012
|
+
# read from RAF unless reading from buffer
|
1013
|
+
$raf = $$dirInfo{RAF} unless $dataPt;
|
1000
1014
|
|
1001
1015
|
if ($outfile) {
|
1002
1016
|
unless ($raf) {
|
@@ -1516,6 +1530,7 @@ sub ProcessJP2($$)
|
|
1516
1530
|
$fileType = 'JPX' if $1 eq 'jpx ';
|
1517
1531
|
$fileType = 'JPM' if $1 eq 'jpm ';
|
1518
1532
|
$fileType = 'JXL' if $1 eq 'jxl ';
|
1533
|
+
$fileType = 'JPH' if $1 eq 'jph ';
|
1519
1534
|
}
|
1520
1535
|
$raf->Seek(-length($buff), 1) if defined $buff;
|
1521
1536
|
$et->SetFileType($fileType);
|
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
|
|
21
21
|
sub WriteUnknownOrPreview($$$);
|
22
22
|
sub FixLeicaBase($$;$);
|
23
23
|
|
24
|
-
$VERSION = '2.
|
24
|
+
$VERSION = '2.15';
|
25
25
|
|
26
26
|
my $debug; # set to 1 to enable debugging code
|
27
27
|
|
@@ -694,7 +694,7 @@ my $debug; # set to 1 to enable debugging code
|
|
694
694
|
Name => 'MakerNoteLeica8', # used by the Q (Type 116)
|
695
695
|
# (Q (Typ 116) starts with "LEICA\0\x08\0", Make is "LEICA CAMERA AG")
|
696
696
|
# (SL (Typ 601) and CL start with "LEICA\0\x09\0", Make is "LEICA CAMERA AG")
|
697
|
-
Condition => '$$valPt =~ /^LEICA\0[\x08\x09]\0/',
|
697
|
+
Condition => '$$valPt =~ /^LEICA\0[\x08\x09\x0a]\0/',
|
698
698
|
SubDirectory => {
|
699
699
|
TagTable => 'Image::ExifTool::Panasonic::Leica5',
|
700
700
|
Start => '$valuePtr + 8',
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
65
65
|
use Image::ExifTool::GPS;
|
66
66
|
use Image::ExifTool::XMP;
|
67
67
|
|
68
|
-
$VERSION = '4.
|
68
|
+
$VERSION = '4.27';
|
69
69
|
|
70
70
|
sub LensIDConv($$$);
|
71
71
|
sub ProcessNikonAVI($$$);
|
@@ -962,8 +962,8 @@ my %imageAreaZ9b = (
|
|
962
962
|
);
|
963
963
|
|
964
964
|
my %infoZSeries = (
|
965
|
-
Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|fc|9)\b/i',
|
966
|
-
Notes => 'Z Series cameras thru
|
965
|
+
Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|f|fc|9)\b/i',
|
966
|
+
Notes => 'Z Series cameras thru October 2023',
|
967
967
|
);
|
968
968
|
|
969
969
|
my %iSOAutoHiLimitZ7 = (
|
@@ -2582,9 +2582,21 @@ my %base64coord = (
|
|
2582
2582
|
DirOffset => 4,
|
2583
2583
|
},
|
2584
2584
|
},
|
2585
|
-
{ # (
|
2586
|
-
|
2587
|
-
Condition => '$$valPt =~ /^
|
2585
|
+
{ #PH (NC)
|
2586
|
+
# (D5300=0219, D3300=0221, D4S=0222, D750/D810=0223, D3400/D3500/D5500/D5600/D7200=0224)
|
2587
|
+
Condition => '$$valPt =~ /^02(19|2[1234])/',
|
2588
|
+
Name => 'ColorBalance0219',
|
2589
|
+
SubDirectory => {
|
2590
|
+
TagTable => 'Image::ExifTool::Nikon::ColorBalance2',
|
2591
|
+
ProcessProc => \&ProcessNikonEncrypted,
|
2592
|
+
WriteProc => \&ProcessNikonEncrypted,
|
2593
|
+
DecryptStart => 4,
|
2594
|
+
DirOffset => 0x7c,
|
2595
|
+
},
|
2596
|
+
},
|
2597
|
+
{ # (D610/Df=0220, CoolpixA=0601)
|
2598
|
+
Name => 'ColorBalanceUnknown1',
|
2599
|
+
Condition => '$$valPt =~ /^0(220|6)/',
|
2588
2600
|
SubDirectory => {
|
2589
2601
|
TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown',
|
2590
2602
|
ProcessProc => \&ProcessNikonEncrypted,
|
@@ -2592,11 +2604,12 @@ my %base64coord = (
|
|
2592
2604
|
DecryptStart => 284,
|
2593
2605
|
},
|
2594
2606
|
},
|
2595
|
-
{ # (
|
2596
|
-
|
2597
|
-
|
2607
|
+
{ # (D5200/D7200=0218, D5/D500=0225, D7500=0226, D850=0227, D6/D780=0228,
|
2608
|
+
# 1J1/1J2/1V1=0400, 1V2=0401, 1J3/1S1=0402, 1AW1=0403, Z6/Z7=0800)
|
2609
|
+
Name => 'ColorBalanceUnknown2',
|
2610
|
+
Condition => '$$valPt =~ /^0(18|[248])/',
|
2598
2611
|
SubDirectory => {
|
2599
|
-
TagTable => 'Image::ExifTool::Nikon::
|
2612
|
+
TagTable => 'Image::ExifTool::Nikon::ColorBalanceUnknown2',
|
2600
2613
|
ProcessProc => \&ProcessNikonEncrypted,
|
2601
2614
|
WriteProc => \&ProcessNikonEncrypted, # (necessary to recrypt this if serial number changed)
|
2602
2615
|
DecryptStart => 4,
|
@@ -4588,7 +4601,7 @@ my %base64coord = (
|
|
4588
4601
|
RawConv => '$$self{AFInfo2Version} = $val',
|
4589
4602
|
},
|
4590
4603
|
5 => { #28
|
4591
|
-
Name => 'AFAreaMode',
|
4604
|
+
Name => 'AFAreaMode', #reflects the mode active when the shutter is tripped, not the position of the Focus Mode button (which is recorded in MenuSettingsZ9 tag also named AfAreaMode)
|
4592
4605
|
PrintConv => {
|
4593
4606
|
192 => 'Pinpoint',
|
4594
4607
|
193 => 'Single',
|
@@ -4604,7 +4617,7 @@ my %base64coord = (
|
|
4604
4617
|
},
|
4605
4618
|
10 => {
|
4606
4619
|
Name => 'AFPointsUsed',
|
4607
|
-
Condition => '$$self{AFAreaMode} == 6',
|
4620
|
+
Condition => 'defined $$self{AFAreaMode} and $$self{AFAreaMode} == 6', #only valid for Auto AF Area mode. Other modes handled via AFAreaXPosition/AFAreaYPosition
|
4608
4621
|
Format => 'undef[51]',
|
4609
4622
|
ValueConv => 'join(" ", unpack("H2"x51, $val))',
|
4610
4623
|
ValueConvInv => '$val=~tr/ //d; pack("H*",$val)',
|
@@ -4956,6 +4969,16 @@ my %nrwLevels = (
|
|
4956
4969
|
},
|
4957
4970
|
);
|
4958
4971
|
|
4972
|
+
%Image::ExifTool::Nikon::ColorBalanceUnknown2 = (
|
4973
|
+
%binaryDataAttrs,
|
4974
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
4975
|
+
FORMAT => 'int16u',
|
4976
|
+
0 => {
|
4977
|
+
Name => 'ColorBalanceVersion',
|
4978
|
+
Format => 'undef[4]',
|
4979
|
+
},
|
4980
|
+
);
|
4981
|
+
|
4959
4982
|
%Image::ExifTool::Nikon::Type2 = (
|
4960
4983
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
|
4961
4984
|
CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
|
@@ -5442,6 +5465,13 @@ my %nikonFocalConversions = (
|
|
5442
5465
|
37 => 'Nikkor Z 600mm f/4 TC VR S', #28
|
5443
5466
|
38 => 'Nikkor Z 85mm f/1.2 S', #28
|
5444
5467
|
39 => 'Nikkor Z 17-28mm f/2.8', #IB
|
5468
|
+
40 => 'NIKKOR Z 26mm f/2.8', #28
|
5469
|
+
41 => 'NIKKOR Z DX 12-28mm f/3.5-5.6 PZ VR', #28
|
5470
|
+
42 => 'Nikkor Z 180-600mm f/5.6-6.3 VR', #30
|
5471
|
+
43 => 'NIKKOR Z DX 24mm f/1.7', #28
|
5472
|
+
44 => 'NIKKOR Z 70-180mm f/2.8', #28
|
5473
|
+
45 => 'NIKKOR Z 600mm f/6.3 VR S', #28
|
5474
|
+
46 => 'Nikkor Z 135mm f/1.8 S Plena', #28
|
5445
5475
|
32768 => 'Nikkor Z 400mm f/2.8 TC VR S TC-1.4x', #28
|
5446
5476
|
32769 => 'Nikkor Z 600mm f/4 TC VR S TC-1.4x', #28
|
5447
5477
|
},
|
@@ -8188,7 +8218,7 @@ my %nikonFocalConversions = (
|
|
8188
8218
|
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
|
8189
8219
|
VARS => { ID_LABEL => 'Index', NIKON_OFFSETS => 0x24 },
|
8190
8220
|
DATAMEMBER => [ 0x04 ],
|
8191
|
-
IS_SUBDIR => [ 0x30, 0x38, 0x98, 0xa0 ],
|
8221
|
+
IS_SUBDIR => [ 0x30, 0x38, 0x88, 0x98, 0xa0 ],
|
8192
8222
|
WRITABLE => 1,
|
8193
8223
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
8194
8224
|
NOTES => 'These tags are extracted from encrypted data in images from the Z7II.',
|
@@ -8238,9 +8268,19 @@ my %nikonFocalConversions = (
|
|
8238
8268
|
Start => '$val',
|
8239
8269
|
}
|
8240
8270
|
},
|
8271
|
+
0x88 => {
|
8272
|
+
Name => 'OrientationOffset',
|
8273
|
+
Format => 'int32u',
|
8274
|
+
Condition => '$$self{Model} =~ /^NIKON Z f\b/i',
|
8275
|
+
SubDirectory => {
|
8276
|
+
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
8277
|
+
Start => '$val',
|
8278
|
+
}
|
8279
|
+
},
|
8241
8280
|
0x98 => {
|
8242
8281
|
Name => 'OrientationOffset',
|
8243
8282
|
Format => 'int32u',
|
8283
|
+
Condition => '$$self{Model} =~ /^NIKON Z (30|5|50|6|6_2|7|7_2|8|fc)\b/i', #models other then the Z f
|
8244
8284
|
SubDirectory => {
|
8245
8285
|
TagTable => 'Image::ExifTool::Nikon::OrientationInfo',
|
8246
8286
|
Start => '$val',
|
@@ -8507,7 +8547,7 @@ my %nikonFocalConversions = (
|
|
8507
8547
|
0x002a => {
|
8508
8548
|
Name => 'IntervalFrame',
|
8509
8549
|
RawConv => '$$self{IntervalFrame} = $val',
|
8510
|
-
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{
|
8550
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and $$self{IntervalShooting} > 0', #not valid for C30/C60/C120
|
8511
8551
|
Format => 'int16u',
|
8512
8552
|
Hidden => 1,
|
8513
8553
|
},
|
@@ -8520,7 +8560,7 @@ my %nikonFocalConversions = (
|
|
8520
8560
|
DATAMEMBER => [ 0x0bea, 0x0beb ],
|
8521
8561
|
0x0be8 => {
|
8522
8562
|
Name => 'AFAreaInitialXPosition', #stored as a representation of the horizontal position of the center of the portion of the focus box positioned top left when in Wide Area (L/S/C1/C2) focus modes (before subject detection potentially refines focus)
|
8523
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{AFAreaMode} < 2 ', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
|
8563
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and defined $$self{AFAreaMode} and $$self{AFAreaMode} < 2 ', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
|
8524
8564
|
Format => 'int8s',
|
8525
8565
|
PrintConv => q{
|
8526
8566
|
#in FX mode and Single-point, the 29 horizontal focus points are spaced 259 pixels apart starting at pixel 502 and ending at 7754. Spacing is the same for Wide(L/C1/C2) with different start points.
|
@@ -8582,7 +8622,7 @@ my %nikonFocalConversions = (
|
|
8582
8622
|
},
|
8583
8623
|
0x0be9 => {
|
8584
8624
|
Name =>'AFAreaInitialYPosition', #stored as a representation of the vertical position of the center of the portion of the focus box positioned top left when in Wide Area (L/S/C1/C2) focus modes (before subject detection potentially refines focus)
|
8585
|
-
Condition => '$$self{ShutterMode} ne 96 and $$self{AFAreaMode} < 2', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
|
8625
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96 and defined $$self{AFAreaMode} and $$self{AFAreaMode} < 2', #not valid for C30/C60/C120 or for Area Modes 1:1 and 16:19
|
8586
8626
|
Format => 'int8s',
|
8587
8627
|
PrintConv => q{
|
8588
8628
|
#in FX mode and Single-point, the 17 vertical focus points are spaced 291 pixels apart starting at pixel 424 and ending at 5080. Spacing is the same for Wide(L/C1/C2)
|
@@ -8646,13 +8686,13 @@ my %nikonFocalConversions = (
|
|
8646
8686
|
},
|
8647
8687
|
0x0bea => {
|
8648
8688
|
Name => 'AFAreaInitialWidth',
|
8649
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8689
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8650
8690
|
ValueConv => '$$self{VALUE}{PhotoShootingMenuBankImageArea} eq 0 ? $val : int($val * 2 / 3)', #DX mode requires scaling down TODO: add support ImageAreas 1:1 and 16:9
|
8651
8691
|
RawConv => '$$self{AFAreaInitialWidth} = 1 + int ($val / 4)', #convert from [3, 11, 19, 35, 51, 75] to [1, 3, 5, 9 13, 19] to match camera options for C1/C2 focus modes .. input/output of 11/3 is for Wide(S)
|
8652
8692
|
},
|
8653
8693
|
0x0beb => {
|
8654
8694
|
Name => 'AFAreaInitialHeight',
|
8655
|
-
Condition => '$$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8695
|
+
Condition => '$$self{ShutterMode} and $$self{ShutterMode} ne 96', #not valid for C30/C60/C120
|
8656
8696
|
ValueConv => '$$self{VALUE}{PhotoShootingMenuBankImageArea} eq 0 ? $val : int($val * 2 / 3)', #DX mode requires scaling down TODO: add support ImageAreas 1:1 and 16:9
|
8657
8697
|
RawConv => '$$self{AFAreaInitialHeight} = 1 + int ($val / 7) ', #convert from [6, 20, 33, 46, 73] to [1, 3, 5, 7, 11] to match camera options for C1/C2 focus modes .. input/output of 33/5 is for Wide(L)
|
8658
8698
|
},
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
40
40
|
use Image::ExifTool::Exif;
|
41
41
|
use Image::ExifTool::APP12;
|
42
42
|
|
43
|
-
$VERSION = '2.
|
43
|
+
$VERSION = '2.82';
|
44
44
|
|
45
45
|
sub PrintLensInfo($$$);
|
46
46
|
|
@@ -186,7 +186,9 @@ my %olympusLensTypes = (
|
|
186
186
|
'2 36 10' => 'Leica DG Elmarit 200mm F2.8 Power OIS', #IB
|
187
187
|
'2 37 10' => 'Leica DG Vario-Elmarit 50-200mm F2.8-4 Asph. Power OIS', #IB
|
188
188
|
'2 38 10' => 'Leica DG Vario-Summilux 10-25mm F1.7 Asph.', #IB
|
189
|
+
'2 39 10' => 'Leica DG Summilux 25mm F1.4 II Asph.', #forum15345
|
189
190
|
'2 40 10' => 'Leica DG Vario-Summilux 25-50mm F1.7 Asph.', #IB (H-X2550)
|
191
|
+
'2 41 10' => 'Leica DG Summilux 9mm F1.7 Asph.', #forum15345
|
190
192
|
'3 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
|
191
193
|
'3 02 00' => 'Leica D Summilux 25mm F1.4 Asph.', #11
|
192
194
|
# Tamron lenses
|
@@ -358,6 +360,7 @@ my %olympusCameraTypes = (
|
|
358
360
|
D4521 => 'SH-25MR',
|
359
361
|
D4523 => 'SP-720UZ',
|
360
362
|
D4529 => 'VG170',
|
363
|
+
D4530 => 'VH210',
|
361
364
|
D4531 => 'XZ-2',
|
362
365
|
D4535 => 'SP-620UZ',
|
363
366
|
D4536 => 'TG-320',
|
@@ -383,9 +386,11 @@ my %olympusCameraTypes = (
|
|
383
386
|
D4585 => 'SH-2 / SH-3',
|
384
387
|
D4586 => 'TG-4',
|
385
388
|
D4587 => 'TG-860',
|
389
|
+
D4590 => 'TG-TRACKER',
|
386
390
|
D4591 => 'TG-870',
|
387
391
|
D4593 => 'TG-5', #IB
|
388
392
|
D4603 => 'TG-6', #IB
|
393
|
+
D4605 => 'TG-7',
|
389
394
|
D4809 => 'C2500L',
|
390
395
|
D4842 => 'E-10',
|
391
396
|
D4856 => 'C-1',
|
@@ -431,6 +436,7 @@ my %olympusCameraTypes = (
|
|
431
436
|
S0076 => 'E-PL9', #IB
|
432
437
|
S0080 => 'E-M1X', #IB
|
433
438
|
S0085 => 'E-PL10', #IB
|
439
|
+
S0088 => 'E-M10MarkIV',
|
434
440
|
S0089 => 'E-M5MarkIII',
|
435
441
|
S0092 => 'E-M1MarkIII', #IB
|
436
442
|
S0093 => 'E-P7', #IB
|
@@ -80,6 +80,7 @@ my %pngMap = (
|
|
80
80
|
ICC_Profile => 'PNG',
|
81
81
|
Photoshop => 'PNG',
|
82
82
|
'PNG-pHYs' => 'PNG',
|
83
|
+
JUMBF => 'PNG',
|
83
84
|
IPTC => 'Photoshop',
|
84
85
|
MakerNotes => 'ExifIFD',
|
85
86
|
);
|
@@ -341,6 +342,7 @@ my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND =
|
|
341
342
|
},
|
342
343
|
caBX => { # C2PA metadata
|
343
344
|
Name => 'JUMBF',
|
345
|
+
Deletable => 1,
|
344
346
|
SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
|
345
347
|
},
|
346
348
|
cICP => {
|
@@ -973,20 +975,13 @@ sub FoundPNG($$$$;$$$$)
|
|
973
975
|
undef $processProc if $wasCompressed and $processProc and $processProc eq \&ProcessPNG_Compressed;
|
974
976
|
# rewrite this directory if necessary (but always process TextualData normally)
|
975
977
|
if ($outBuff and not $processProc and $subTable ne \%Image::ExifTool::PNG::TextualData) {
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
$
|
981
|
-
} else {
|
982
|
-
return 1 unless $$et{EDIT_DIRS}{$dirName};
|
983
|
-
$$outBuff = $et->WriteDirectory(\%subdirInfo, $subTable);
|
984
|
-
if ($tagName eq 'XMP' and $$outBuff) {
|
985
|
-
# make sure the XMP is marked as read-only
|
986
|
-
Image::ExifTool::XMP::ValidateXMP($outBuff,'r');
|
987
|
-
}
|
988
|
-
DoneDir($et, $dirName, $outBuff, $$tagInfo{NonStandard});
|
978
|
+
return 1 unless $$et{EDIT_DIRS}{$dirName};
|
979
|
+
$$outBuff = $et->WriteDirectory(\%subdirInfo, $subTable);
|
980
|
+
if ($tagName eq 'XMP' and $$outBuff) {
|
981
|
+
# make sure the XMP is marked as read-only
|
982
|
+
Image::ExifTool::XMP::ValidateXMP($outBuff,'r');
|
989
983
|
}
|
984
|
+
DoneDir($et, $dirName, $outBuff, $$tagInfo{NonStandard});
|
990
985
|
} else {
|
991
986
|
$processed = $et->ProcessDirectory(\%subdirInfo, $subTable, $processProc);
|
992
987
|
}
|
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
|
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
38
38
|
use Image::ExifTool::Exif;
|
39
39
|
|
40
|
-
$VERSION = '2.
|
40
|
+
$VERSION = '2.21';
|
41
41
|
|
42
42
|
sub ProcessLeicaLEIC($$$);
|
43
43
|
sub WhiteBalanceConv($;$$);
|
@@ -1991,6 +1991,15 @@ my %shootingMode = (
|
|
1991
1991
|
},
|
1992
1992
|
PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_',
|
1993
1993
|
},
|
1994
|
+
0x05ff => {
|
1995
|
+
Name => 'CameraIFD', # (Leica Q3)
|
1996
|
+
Condition => '$$valPt =~ /^(II\x2a\0\x08\0\0\0|MM\0\x2a\0\0\0\x08)/',
|
1997
|
+
SubDirectory => {
|
1998
|
+
TagTable => 'Image::ExifTool::PanasonicRaw::CameraIFD',
|
1999
|
+
Base => '$start',
|
2000
|
+
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
2001
|
+
},
|
2002
|
+
},
|
1994
2003
|
);
|
1995
2004
|
|
1996
2005
|
# Leica type5 ShotInfo (ref PH) (X2)
|
@@ -2834,10 +2843,14 @@ sub ProcessLeicaTrailer($;$)
|
|
2834
2843
|
my $val = Image::ExifTool::Exif::RebuildMakerNotes($et, \%dirInfo, $tagTablePtr);
|
2835
2844
|
unless (defined $val) {
|
2836
2845
|
$et->Warn('Error rebuilding maker notes (may be corrupt)') if $len > 4;
|
2837
|
-
$val = $buff
|
2846
|
+
$val = $buff;
|
2838
2847
|
}
|
2839
2848
|
my $key = $et->FoundTag($tagInfo, $val);
|
2840
2849
|
$et->SetGroup($key, 'ExifIFD');
|
2850
|
+
if ($$et{MAKER_NOTE_FIXUP}) {
|
2851
|
+
$$et{TAG_EXTRA}{$key}{Fixup} = $$et{MAKER_NOTE_FIXUP};
|
2852
|
+
delete $$et{MAKER_NOTE_FIXUP};
|
2853
|
+
}
|
2841
2854
|
}
|
2842
2855
|
}
|
2843
2856
|
SetByteOrder($oldOrder);
|
@@ -15,7 +15,7 @@ use Image::ExifTool::Exif;
|
|
15
15
|
use Image::ExifTool::IPTC;
|
16
16
|
use Image::ExifTool::XMP;
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.08';
|
19
19
|
|
20
20
|
sub ProcessPhotoMechanic($$);
|
21
21
|
|
@@ -138,7 +138,7 @@ my %rawCropConv = (
|
|
138
138
|
ValueConv => 'Image::ExifTool::Exif::ExifTime($val)',
|
139
139
|
ValueConvInv => 'Image::ExifTool::IPTC::IptcTime($val)',
|
140
140
|
},
|
141
|
-
CreatorIdentity => { },
|
141
|
+
CreatorIdentity => { List => 'Seq' },
|
142
142
|
);
|
143
143
|
|
144
144
|
#------------------------------------------------------------------------------
|