exiftool-vendored.exe 12.26.0 → 12.33.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.
- package/bin/exiftool_files/Changes +119 -4
- package/bin/exiftool_files/README +44 -43
- package/bin/exiftool_files/arg_files/xmp2exif.args +2 -1
- package/bin/exiftool_files/config_files/convert_regions.config +25 -14
- package/bin/exiftool_files/config_files/example.config +1 -1
- package/bin/exiftool_files/exiftool.pl +79 -66
- package/bin/exiftool_files/fmt_files/gpx.fmt +1 -1
- package/bin/exiftool_files/fmt_files/gpx_wpt.fmt +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +11 -3
- package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +331 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +26 -7
- package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +13 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +98 -4
- package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +35 -10
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +13 -2
- package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +15 -3
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +7 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +60 -26
- package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +153 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +60 -59
- package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +103 -7
- package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +14 -3
- package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +10 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +9 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +93 -0
- package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +9 -12
- package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +14 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +27 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +6 -0
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +105 -24
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +203 -121
- package/bin/exiftool_files/lib/Image/ExifTool/README +5 -2
- package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +6 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +47 -10
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +85 -34
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +65 -5
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +153 -32
- package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +18 -11
- package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -0
- package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +2 -0
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +8 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +3 -0
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +21 -4
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +121 -2
- package/bin/exiftool_files/lib/Image/ExifTool.pm +8867 -8835
- package/bin/exiftool_files/lib/Image/ExifTool.pod +58 -56
- package/package.json +3 -3
|
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
47
47
|
use Image::ExifTool::Exif;
|
|
48
48
|
use Image::ExifTool::GPS;
|
|
49
49
|
|
|
50
|
-
$VERSION = '2.
|
|
50
|
+
$VERSION = '2.70';
|
|
51
51
|
|
|
52
52
|
sub ProcessMOV($$;$);
|
|
53
53
|
sub ProcessKeys($$$);
|
|
@@ -229,9 +229,10 @@ my %timeInfo = (
|
|
|
229
229
|
Writable => 1,
|
|
230
230
|
Permanent => 1,
|
|
231
231
|
DelValue => 0,
|
|
232
|
-
# It is not uncommon for brain-dead software to use the wrong time zero,
|
|
233
|
-
# so assume a time zero of Jan 1, 1970 if the date is before this
|
|
232
|
+
# It is not uncommon for brain-dead software to use the wrong time zero, it should be
|
|
233
|
+
# Jan 1, 1904, so assume a time zero of Jan 1, 1970 if the date is before this
|
|
234
234
|
# Note: This value will be in UTC if generated by a system that is aware of the time zone
|
|
235
|
+
# (also note: this code is duplicated for the CreateDate tag)
|
|
235
236
|
RawConv => q{
|
|
236
237
|
my $offset = (66 * 365 + 17) * 24 * 3600;
|
|
237
238
|
return $val - $offset if $val >= $offset or $$self{OPTIONS}{QuickTimeUTC};
|
|
@@ -733,6 +734,11 @@ my %eeBox2 = (
|
|
|
733
734
|
Unknown => 1,
|
|
734
735
|
Binary => 1,
|
|
735
736
|
},
|
|
737
|
+
sefd => {
|
|
738
|
+
Name => 'SamsungTrailer',
|
|
739
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' },
|
|
740
|
+
},
|
|
741
|
+
# 'samn'? - seen in Vantrue N2S sample video
|
|
736
742
|
);
|
|
737
743
|
|
|
738
744
|
# MPEG-4 'ftyp' atom
|
|
@@ -1194,6 +1200,15 @@ my %eeBox2 = (
|
|
|
1194
1200
|
Name => 'CreateDate',
|
|
1195
1201
|
Groups => { 2 => 'Time' },
|
|
1196
1202
|
%timeInfo,
|
|
1203
|
+
RawConv => q{
|
|
1204
|
+
my $offset = (66 * 365 + 17) * 24 * 3600;
|
|
1205
|
+
if ($val >= $offset or $$self{OPTIONS}{QuickTimeUTC}) {
|
|
1206
|
+
$val -= $offset;
|
|
1207
|
+
} elsif ($val and not $$self{IsWriting}) {
|
|
1208
|
+
$self->WarnOnce('Patched incorrect time zero for QuickTime date/time tag',1);
|
|
1209
|
+
}
|
|
1210
|
+
return $$self{CreateDate} = $val;
|
|
1211
|
+
},
|
|
1197
1212
|
# this is int64u if MovieHeaderVersion == 1 (ref 13)
|
|
1198
1213
|
Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
|
|
1199
1214
|
},
|
|
@@ -2254,6 +2269,12 @@ my %eeBox2 = (
|
|
|
2254
2269
|
# opax - 164 bytes unknown (center and affine arrays? ref 26)
|
|
2255
2270
|
# opai - 32 bytes (maybe contains a serial number starting at byte 16? - PH) (rgb gains, degamma, gamma? ref 26)
|
|
2256
2271
|
# intv - 16 bytes all zero
|
|
2272
|
+
# ---- Xaiomi ----
|
|
2273
|
+
mcvr => {
|
|
2274
|
+
Name => 'PreviewImage',
|
|
2275
|
+
Groups => { 2 => 'Preview' },
|
|
2276
|
+
Binary => 1,
|
|
2277
|
+
},
|
|
2257
2278
|
# ---- Unknown ----
|
|
2258
2279
|
# CDET - 128 bytes (unknown origin)
|
|
2259
2280
|
# mtyp - 4 bytes all zero (some drone video)
|
|
@@ -2691,6 +2712,7 @@ my %eeBox2 = (
|
|
|
2691
2712
|
colr => [{
|
|
2692
2713
|
Name => 'ICC_Profile',
|
|
2693
2714
|
Condition => '$$valPt =~ /^(prof|rICC)/',
|
|
2715
|
+
Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
|
|
2694
2716
|
SubDirectory => {
|
|
2695
2717
|
TagTable => 'Image::ExifTool::ICC_Profile::Main',
|
|
2696
2718
|
Start => 4,
|
|
@@ -6429,10 +6451,11 @@ my %eeBox2 = (
|
|
|
6429
6451
|
# iTunes info ('----') atoms
|
|
6430
6452
|
%Image::ExifTool::QuickTime::iTunesInfo = (
|
|
6431
6453
|
PROCESS_PROC => \&ProcessMOV,
|
|
6432
|
-
GROUPS => { 2 => 'Audio' },
|
|
6454
|
+
GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
|
|
6433
6455
|
NOTES => q{
|
|
6434
6456
|
ExifTool will extract any iTunesInfo tags that exist, even if they are not
|
|
6435
|
-
defined in this table.
|
|
6457
|
+
defined in this table. These tags belong to the family 1 "iTunes" group,
|
|
6458
|
+
and are not currently writable.
|
|
6436
6459
|
},
|
|
6437
6460
|
# 'mean'/'name'/'data' atoms form a triplet, but unfortunately
|
|
6438
6461
|
# I haven't been able to find any documentation on this.
|
|
@@ -6493,9 +6516,45 @@ my %eeBox2 = (
|
|
|
6493
6516
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::EncodingParams' },
|
|
6494
6517
|
},
|
|
6495
6518
|
# also heard about 'iTunPGAP', but I haven't seen a sample
|
|
6496
|
-
|
|
6497
|
-
|
|
6498
|
-
|
|
6519
|
+
# all tags below were added based on samples I have seen - PH
|
|
6520
|
+
DISCNUMBER => 'DiscNumber',
|
|
6521
|
+
TRACKNUMBER => 'TrackNumber',
|
|
6522
|
+
ARTISTS => 'Artists',
|
|
6523
|
+
CATALOGNUMBER => 'CatalogNumber',
|
|
6524
|
+
RATING => 'Rating',
|
|
6525
|
+
MEDIA => 'Media',
|
|
6526
|
+
SCRIPT => 'Script', # character set? (seen 'Latn')
|
|
6527
|
+
BARCODE => 'Barcode',
|
|
6528
|
+
LABEL => 'Label',
|
|
6529
|
+
MOOD => 'Mood',
|
|
6530
|
+
popularimeter => 'Popularimeter',
|
|
6531
|
+
'Dynamic Range (DR)'=> 'DynamicRange',
|
|
6532
|
+
initialkey => 'InitialKey',
|
|
6533
|
+
originalyear => 'OriginalYear',
|
|
6534
|
+
originaldate => 'OriginalDate',
|
|
6535
|
+
'~length' => 'Length', # play length? (ie. duration?)
|
|
6536
|
+
replaygain_track_gain=>'ReplayTrackGain',
|
|
6537
|
+
replaygain_track_peak=>'ReplayTrackPeak',
|
|
6538
|
+
'Volume Level (ReplayGain)'=> 'ReplayVolumeLevel',
|
|
6539
|
+
'Dynamic Range (R128)'=> 'DynamicRangeR128',
|
|
6540
|
+
'Volume Level (R128)' => 'VolumeLevelR128',
|
|
6541
|
+
'Peak Level (Sample)' => 'PeakLevelSample',
|
|
6542
|
+
'Peak Level (R128)' => 'PeakLevelR128',
|
|
6543
|
+
# also seen (many from forum12777):
|
|
6544
|
+
# 'MusicBrainz Album Release Country'
|
|
6545
|
+
# 'MusicBrainz Album Type'
|
|
6546
|
+
# 'MusicBrainz Album Status'
|
|
6547
|
+
# 'MusicBrainz Track Id'
|
|
6548
|
+
# 'MusicBrainz Release Track Id'
|
|
6549
|
+
# 'MusicBrainz Album Id'
|
|
6550
|
+
# 'MusicBrainz Album Artist Id'
|
|
6551
|
+
# 'MusicBrainz Artist Id'
|
|
6552
|
+
# 'Acoustid Id' (sic)
|
|
6553
|
+
# 'Tool Version'
|
|
6554
|
+
# 'Tool Name'
|
|
6555
|
+
# 'ISRC'
|
|
6556
|
+
# 'HDCD'
|
|
6557
|
+
# 'Waveform'
|
|
6499
6558
|
);
|
|
6500
6559
|
|
|
6501
6560
|
# iTunes audio encoding parameters
|
|
@@ -8864,20 +8923,28 @@ sub ProcessKeys($$$)
|
|
|
8864
8923
|
my $ns = substr($$dataPt, $pos + 4, 4);
|
|
8865
8924
|
my $tag = substr($$dataPt, $pos + 8, $len - 8);
|
|
8866
8925
|
$tag =~ s/\0.*//s; # truncate at null
|
|
8926
|
+
my $full = $tag;
|
|
8867
8927
|
$tag =~ s/^com\.(apple\.quicktime\.)?// if $ns eq 'mdta'; # remove apple quicktime domain
|
|
8868
8928
|
$tag = "Tag_$ns" unless $tag;
|
|
8869
|
-
|
|
8870
|
-
my $tagInfo
|
|
8871
|
-
|
|
8872
|
-
$tagInfo = $et->GetTagInfo($
|
|
8873
|
-
|
|
8929
|
+
my $short = $tag;
|
|
8930
|
+
my $tagInfo;
|
|
8931
|
+
for (;;) {
|
|
8932
|
+
$tagInfo = $et->GetTagInfo($tagTablePtr, $tag) and last;
|
|
8933
|
+
# also try ItemList and UserData tables
|
|
8934
|
+
$tagInfo = $et->GetTagInfo($itemList, $tag) and last;
|
|
8935
|
+
$tagInfo = $et->GetTagInfo($userData, $tag) and last;
|
|
8936
|
+
# (I have some samples where the tag is a reversed ItemList or UserData tag ID)
|
|
8937
|
+
if ($tag =~ /^\w{3}\xa9$/) {
|
|
8938
|
+
$tag = pack('N', unpack('V', $tag));
|
|
8939
|
+
$tagInfo = $et->GetTagInfo($itemList, $tag) and last;
|
|
8874
8940
|
$tagInfo = $et->GetTagInfo($userData, $tag);
|
|
8875
|
-
|
|
8876
|
-
$tag = pack('N', unpack('V', $tag));
|
|
8877
|
-
$tagInfo = $et->GetTagInfo($itemList, $tag);
|
|
8878
|
-
$tagInfo or $tagInfo = $et->GetTagInfo($userData, $tag);
|
|
8879
|
-
}
|
|
8941
|
+
last;
|
|
8880
8942
|
}
|
|
8943
|
+
if ($tag eq $full) {
|
|
8944
|
+
$tag = $short;
|
|
8945
|
+
last;
|
|
8946
|
+
}
|
|
8947
|
+
$tag = $full;
|
|
8881
8948
|
}
|
|
8882
8949
|
my ($newInfo, $msg);
|
|
8883
8950
|
if ($tagInfo) {
|
|
@@ -8918,6 +8985,7 @@ sub ProcessKeys($$$)
|
|
|
8918
8985
|
delete $$itemList{$id};
|
|
8919
8986
|
}
|
|
8920
8987
|
if ($newInfo) {
|
|
8988
|
+
$$newInfo{KeysID} = $tag; # save original ID for use in family 7 group name
|
|
8921
8989
|
AddTagToTable($itemList, $id, $newInfo);
|
|
8922
8990
|
$msg or $msg = '';
|
|
8923
8991
|
$out and print $out "$$et{INDENT}Added ItemList Tag $id = ($ns) $tag$msg\n";
|
|
@@ -9045,6 +9113,12 @@ sub ProcessMOV($$;$)
|
|
|
9045
9113
|
} else {
|
|
9046
9114
|
my $t = PrintableTagID($tag,2);
|
|
9047
9115
|
$et->VPrint(0,"$$et{INDENT}Tag '${t}' extends to end of file");
|
|
9116
|
+
if ($$tagTablePtr{"$tag-size"}) {
|
|
9117
|
+
my $pos = $raf->Tell();
|
|
9118
|
+
$raf->Seek(0, 2);
|
|
9119
|
+
$et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos);
|
|
9120
|
+
$et->HandleTag($tagTablePtr, "$tag-offset", $pos) if $$tagTablePtr{"$tag-offset"};
|
|
9121
|
+
}
|
|
9048
9122
|
}
|
|
9049
9123
|
last;
|
|
9050
9124
|
}
|
|
@@ -9271,6 +9345,7 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9271
9345
|
Name => $name,
|
|
9272
9346
|
Description => $desc,
|
|
9273
9347
|
};
|
|
9348
|
+
$et->VPrint(0, $$et{INDENT}, "[adding QuickTime:$name]\n");
|
|
9274
9349
|
AddTagToTable($tagTablePtr, $tag, $tagInfo);
|
|
9275
9350
|
}
|
|
9276
9351
|
# ignore 8-byte header
|
|
@@ -9282,9 +9357,9 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9282
9357
|
$val = \$buff;
|
|
9283
9358
|
}
|
|
9284
9359
|
}
|
|
9285
|
-
|
|
9360
|
+
$$tagInfo{List} = 1; # (allow any of these tags to have multiple data elements)
|
|
9361
|
+
$et->VerboseInfo($tag, $tagInfo, Value => $val) if $verbose;
|
|
9286
9362
|
} else {
|
|
9287
|
-
undef %triplet if $tag eq 'mean';
|
|
9288
9363
|
$triplet{$tag} = substr($val,4) if length($val) > 4;
|
|
9289
9364
|
undef $tagInfo; # don't store this tag
|
|
9290
9365
|
}
|
|
@@ -9368,7 +9443,13 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9368
9443
|
# (shouldn't be null terminated, but some software writes it anyway)
|
|
9369
9444
|
$value =~ s/\0$// unless $$tagInfo{Binary};
|
|
9370
9445
|
} else {
|
|
9371
|
-
|
|
9446
|
+
if (not $format) {
|
|
9447
|
+
$format = QuickTimeFormat($flags, $len);
|
|
9448
|
+
} elsif ($format =~ /^int\d+([us])$/) {
|
|
9449
|
+
# adjust integer to available length (but not int64)
|
|
9450
|
+
my $fmt = { 1=>'int8', 2=>'int16', 4=>'int32' }->{$len};
|
|
9451
|
+
$format = $fmt . $1 if defined $fmt;
|
|
9452
|
+
}
|
|
9372
9453
|
if ($format) {
|
|
9373
9454
|
$value = ReadValue(\$value, 0, $format, $$tagInfo{Count}, $len);
|
|
9374
9455
|
} elsif (not $$tagInfo{ValueConv}) {
|
|
@@ -9524,9 +9605,9 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9524
9605
|
($size, $tag) = unpack('Na4', $buff);
|
|
9525
9606
|
++$index if defined $index;
|
|
9526
9607
|
}
|
|
9527
|
-
# tweak file type based on track content ("iso*" ftyp only)
|
|
9528
|
-
if ($$et{VALUE}{FileType} and $$et{VALUE}{FileType} eq 'MP4' and
|
|
9529
|
-
$$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^iso/ and
|
|
9608
|
+
# tweak file type based on track content ("iso*" and "dash" ftyp only)
|
|
9609
|
+
if ($topLevel and $$et{VALUE}{FileType} and $$et{VALUE}{FileType} eq 'MP4' and
|
|
9610
|
+
$$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
|
|
9530
9611
|
$$et{HasHandler}{soun} and not $$et{HasHandler}{vide})
|
|
9531
9612
|
{
|
|
9532
9613
|
$et->OverrideFileType('M4A', 'audio/mp4');
|