exiftool-vendored.exe 13.41.0 → 13.43.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.exe +0 -0
- package/bin/exiftool_files/exiftool.pl +66 -77
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +27 -2
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +7 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +13 -5
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +26 -4
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +137 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +5 -2
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +7178 -7107
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +127 -3
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +17 -2
- package/bin/exiftool_files/lib/Image/ExifTool.pm +3 -3
- package/bin/exiftool_files/windows_exiftool.txt +28 -20
- package/package.json +4 -4
package/bin/exiftool.exe
CHANGED
|
Binary file
|
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '13.
|
|
14
|
+
my $version = '13.43';
|
|
15
15
|
|
|
16
16
|
$^W = 1; # enable global warnings
|
|
17
17
|
|
|
@@ -144,9 +144,9 @@ my $countNewDir; # count of directories created
|
|
|
144
144
|
my $countSameWr; # count files written OK but not changed
|
|
145
145
|
my $critical; # flag for critical operations (disable CTRL-C)
|
|
146
146
|
my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
|
|
147
|
-
my $csvAdd; # flag to add CSV information to existing lists
|
|
148
147
|
my $csvDelim; # delimiter for CSV files
|
|
149
|
-
my $
|
|
148
|
+
my $dbAdd; # flag to add CSV/JSON information to existing lists
|
|
149
|
+
my $dbSaveCount; # save counter for last CSV/JSON file loaded
|
|
150
150
|
my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
|
|
151
151
|
my $diff; # file name for comparing differences
|
|
152
152
|
my $disableOutput; # flag to disable normal output
|
|
@@ -498,7 +498,7 @@ undef $binSep;
|
|
|
498
498
|
undef $binTerm;
|
|
499
499
|
undef $comma;
|
|
500
500
|
undef $csv;
|
|
501
|
-
undef $
|
|
501
|
+
undef $dbAdd;
|
|
502
502
|
undef $deleteOrig;
|
|
503
503
|
undef $diff;
|
|
504
504
|
undef $disableOutput;
|
|
@@ -563,7 +563,7 @@ $countGoodWr = 0;
|
|
|
563
563
|
$countNewDir = 0;
|
|
564
564
|
$countSameWr = 0;
|
|
565
565
|
$csvDelim = ',';
|
|
566
|
-
$
|
|
566
|
+
$dbSaveCount = 0;
|
|
567
567
|
$fileTrailer = '';
|
|
568
568
|
$filterFlag = 0;
|
|
569
569
|
$html = 0;
|
|
@@ -593,7 +593,7 @@ my $escapeXML; # flag to escape printed values for xml
|
|
|
593
593
|
my $setTagsFile; # filename for last TagsFromFile option
|
|
594
594
|
my $sortOpt; # sort option is used
|
|
595
595
|
my $srcStdin; # one of the source files is STDIN
|
|
596
|
-
my $tagsFrom = ''; # tags on command line come from '
|
|
596
|
+
my $tagsFrom = ''; # tags on command line come from 'CSV' or 'File'
|
|
597
597
|
my $useMWG; # flag set if we are using any MWG tag
|
|
598
598
|
|
|
599
599
|
my ($argsLeft, @nextPass, $badCmd);
|
|
@@ -828,7 +828,7 @@ for (;;) {
|
|
|
828
828
|
}
|
|
829
829
|
# create necessary lists, etc for this new -tagsFromFile file
|
|
830
830
|
AddSetTagsFile($setTagsFile, { Replace => ($1 and lc($1) eq 'add') ? 0 : 1 } );
|
|
831
|
-
$tagsFrom = '
|
|
831
|
+
$tagsFrom = 'File';
|
|
832
832
|
next;
|
|
833
833
|
}
|
|
834
834
|
if ($a eq '@') {
|
|
@@ -936,36 +936,50 @@ for (;;) {
|
|
|
936
936
|
next;
|
|
937
937
|
}
|
|
938
938
|
/^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
|
|
939
|
-
if (/^csv(\+?=.*)?$/i) {
|
|
940
|
-
my $
|
|
939
|
+
if (/^(csv|j(son)?)(\+?=.*)?$/i) {
|
|
940
|
+
my $dbFile = $3;
|
|
941
|
+
my $dbType = lc($1) eq 'csv' ? 'CSV' : 'JSON';
|
|
942
|
+
unless ($dbFile) {
|
|
943
|
+
if ($dbType eq 'CSV') {
|
|
944
|
+
$csv = $dbType;
|
|
945
|
+
} else {
|
|
946
|
+
$json = 1;
|
|
947
|
+
$html = $xml = 0;
|
|
948
|
+
$mt->Options(Duplicates => 1);
|
|
949
|
+
require Image::ExifTool::XMP; # for FixUTF8()
|
|
950
|
+
}
|
|
951
|
+
next;
|
|
952
|
+
}
|
|
941
953
|
# must process on 2nd pass so -f and -charset options are available
|
|
942
954
|
unless ($pass) {
|
|
955
|
+
@tags and Warn("Tag arguments should come after the -$1= option\n");
|
|
943
956
|
push @nextPass, "-$_";
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
$tagsFrom = 'csv';
|
|
948
|
-
}
|
|
957
|
+
push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
|
|
958
|
+
$dbSaveCount = $saveCount;
|
|
959
|
+
$tagsFrom = 'CSV';
|
|
949
960
|
next;
|
|
950
961
|
}
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
962
|
+
$dbFile =~ s/^(\+?=)//;
|
|
963
|
+
$dbAdd = 2 if $1 eq '+=';
|
|
964
|
+
$vout = \*STDERR if $srcStdin;
|
|
965
|
+
$verbose and print $vout "Reading $dbType file $dbFile\n";
|
|
966
|
+
my $msg;
|
|
967
|
+
if ($mt->Open(\*CSVFILE, $dbFile)) {
|
|
968
|
+
binmode CSVFILE;
|
|
969
|
+
require Image::ExifTool::Import;
|
|
970
|
+
if ($dbType eq 'CSV') {
|
|
960
971
|
$msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
|
|
961
|
-
close(CSVFILE);
|
|
962
972
|
} else {
|
|
963
|
-
$
|
|
973
|
+
my $chset = $mt->Options('Charset');
|
|
974
|
+
$msg = Image::ExifTool::Import::ReadJSON(\*CSVFILE, \%database, $forcePrint, $chset);
|
|
964
975
|
}
|
|
965
|
-
|
|
966
|
-
|
|
976
|
+
close(CSVFILE);
|
|
977
|
+
} else {
|
|
978
|
+
$msg = "Error opening $dbType file '${dbFile}'";
|
|
967
979
|
}
|
|
968
|
-
$
|
|
980
|
+
$msg and Warn("$msg\n");
|
|
981
|
+
$isWriting = 1;
|
|
982
|
+
$csv = $dbType;
|
|
969
983
|
next;
|
|
970
984
|
}
|
|
971
985
|
if (/^csvdelim$/i) {
|
|
@@ -1128,42 +1142,6 @@ for (;;) {
|
|
|
1128
1142
|
push @condition, $cond;
|
|
1129
1143
|
next;
|
|
1130
1144
|
}
|
|
1131
|
-
if (/^j(son)?(\+?=.*)?$/i) {
|
|
1132
|
-
if ($2) {
|
|
1133
|
-
# must process on 2nd pass because we need -f and -charset options
|
|
1134
|
-
unless ($pass) {
|
|
1135
|
-
push @nextPass, "-$_";
|
|
1136
|
-
push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
|
|
1137
|
-
$csvSaveCount = $saveCount;
|
|
1138
|
-
$tagsFrom = 'csv';
|
|
1139
|
-
next;
|
|
1140
|
-
}
|
|
1141
|
-
my $jsonFile = $2;
|
|
1142
|
-
$jsonFile =~ s/^(\+?=)//;
|
|
1143
|
-
$csvAdd = 2 if $1 eq '+=';
|
|
1144
|
-
$vout = \*STDERR if $srcStdin;
|
|
1145
|
-
$verbose and print $vout "Reading JSON file $jsonFile\n";
|
|
1146
|
-
my $chset = $mt->Options('Charset');
|
|
1147
|
-
my $msg;
|
|
1148
|
-
if ($mt->Open(\*JSONFILE, $jsonFile)) {
|
|
1149
|
-
binmode JSONFILE;
|
|
1150
|
-
require Image::ExifTool::Import;
|
|
1151
|
-
$msg = Image::ExifTool::Import::ReadJSON(\*JSONFILE, \%database, $forcePrint, $chset);
|
|
1152
|
-
close(JSONFILE);
|
|
1153
|
-
} else {
|
|
1154
|
-
$msg = "Error opening JSON file '${jsonFile}'";
|
|
1155
|
-
}
|
|
1156
|
-
$msg and Warn("$msg\n");
|
|
1157
|
-
$isWriting = 1;
|
|
1158
|
-
$csv = 'JSON';
|
|
1159
|
-
} else {
|
|
1160
|
-
$json = 1;
|
|
1161
|
-
$html = $xml = 0;
|
|
1162
|
-
$mt->Options(Duplicates => 1);
|
|
1163
|
-
require Image::ExifTool::XMP; # for FixUTF8()
|
|
1164
|
-
}
|
|
1165
|
-
next;
|
|
1166
|
-
}
|
|
1167
1145
|
/^(k|pause)$/i and $pause = 1, next;
|
|
1168
1146
|
(/^l$/ or $a eq 'long') and --$outFormat, next;
|
|
1169
1147
|
(/^L$/ or $a eq 'latin') and $mt->Options(Charset => 'Latin'), next;
|
|
@@ -1386,7 +1364,7 @@ for (;;) {
|
|
|
1386
1364
|
$tag =~ s/\ball\b/\*/ig; # replace 'all' with '*' in tag names
|
|
1387
1365
|
if (not $tagsFrom) {
|
|
1388
1366
|
push @exclude, $tag;
|
|
1389
|
-
} elsif ($tagsFrom eq '
|
|
1367
|
+
} elsif ($tagsFrom eq 'CSV') {
|
|
1390
1368
|
push @csvExclude, $tag;
|
|
1391
1369
|
} else {
|
|
1392
1370
|
push @{$setTags{$setTagsFile}}, "-$tag";
|
|
@@ -1433,11 +1411,11 @@ for (;;) {
|
|
|
1433
1411
|
} else {
|
|
1434
1412
|
# assume '-tagsFromFile @' if tags are being redirected
|
|
1435
1413
|
# and not from CSV and -tagsFromFile hasn't already been specified
|
|
1436
|
-
if (not $setTagsFile and $tagsFrom ne '
|
|
1414
|
+
if (not $setTagsFile and $tagsFrom ne 'CSV' and /(<|>)/) {
|
|
1437
1415
|
AddSetTagsFile($setTagsFile = '@');
|
|
1438
|
-
$tagsFrom = '
|
|
1416
|
+
$tagsFrom = 'File';
|
|
1439
1417
|
}
|
|
1440
|
-
if ($tagsFrom eq '
|
|
1418
|
+
if ($tagsFrom eq 'CSV') {
|
|
1441
1419
|
my $lst = s/^-// ? \@csvExclude : \@tags;
|
|
1442
1420
|
push @$lst, $_;
|
|
1443
1421
|
} elsif ($setTagsFile) {
|
|
@@ -1733,7 +1711,7 @@ if (@newValues) {
|
|
|
1733
1711
|
$saveCount = $mt->SaveNewValues();
|
|
1734
1712
|
$needSave = 0;
|
|
1735
1713
|
# insert marker to load values from CSV file now if this was the CSV file
|
|
1736
|
-
push @dynamicFiles, \$csv if $$_{SaveCount} == $
|
|
1714
|
+
push @dynamicFiles, \$csv if $$_{SaveCount} == $dbSaveCount;
|
|
1737
1715
|
}
|
|
1738
1716
|
next;
|
|
1739
1717
|
}
|
|
@@ -3263,7 +3241,7 @@ sub SetImageInfo($$$)
|
|
|
3263
3241
|
next;
|
|
3264
3242
|
} elsif (ref $dyFile eq 'SCALAR') {
|
|
3265
3243
|
# set new values from CSV or JSON database
|
|
3266
|
-
my ($f, $found, $csvTag, $tg, $
|
|
3244
|
+
my ($f, $found, $csvTag, $tg, $csvEtPrt, $csvEtVal);
|
|
3267
3245
|
undef $evalWarning;
|
|
3268
3246
|
local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
|
|
3269
3247
|
# force UTF-8 if the database was JSON
|
|
@@ -3295,13 +3273,19 @@ sub SetImageInfo($$$)
|
|
|
3295
3273
|
}
|
|
3296
3274
|
if (@tags) {
|
|
3297
3275
|
# prepare a dummy ExifTool object to hold appropriate tags from the database
|
|
3298
|
-
$
|
|
3276
|
+
$csvEtPrt = Image::ExifTool->new unless $csvEtPrt;
|
|
3299
3277
|
foreach $csvTag (OrderedKeys($csvInfo)) {
|
|
3300
3278
|
next if $csvTag =~ /^([-_0-9A-Z]+:)*(SourceFile|Directory|FileName)$/i;
|
|
3301
3279
|
my @grps = split /:/, $csvTag;
|
|
3302
3280
|
my $name = pop @grps;
|
|
3303
|
-
unshift @grps, '
|
|
3304
|
-
|
|
3281
|
+
unshift @grps, 'All' while @grps < 2;
|
|
3282
|
+
if ($name =~ s/#$//) {
|
|
3283
|
+
# handle ValueConv tags separately
|
|
3284
|
+
$csvEtVal = Image::ExifTool->new unless $csvEtVal;
|
|
3285
|
+
$csvEtVal->FoundTag($name, $$csvInfo{$csvTag}, @grps);
|
|
3286
|
+
} else {
|
|
3287
|
+
$csvEtPrt->FoundTag($name, $$csvInfo{$csvTag}, @grps);
|
|
3288
|
+
}
|
|
3305
3289
|
}
|
|
3306
3290
|
next;
|
|
3307
3291
|
}
|
|
@@ -3338,15 +3322,20 @@ ExclMatch: foreach $exclTag (@exclTags) {
|
|
|
3338
3322
|
next if $excluded;
|
|
3339
3323
|
}
|
|
3340
3324
|
my ($rtn, $wrn) = $et->SetNewValue($csvTag, $$csvInfo{$csvTag},
|
|
3341
|
-
Protected => 1, AddValue => $
|
|
3342
|
-
ProtectSaved => $
|
|
3325
|
+
Protected => 1, AddValue => $dbAdd,
|
|
3326
|
+
ProtectSaved => $dbSaveCount);
|
|
3343
3327
|
$wrn and Warn "$wrn\n" if $verbose;
|
|
3344
3328
|
}
|
|
3345
3329
|
}
|
|
3346
3330
|
# set specified tags now
|
|
3347
|
-
if ($
|
|
3331
|
+
if ($csvEtPrt) {
|
|
3348
3332
|
my @excl = map "-$_", @csvExclude; # add back leading dashes
|
|
3349
|
-
$
|
|
3333
|
+
my $opts = { AddValue => $dbAdd, Replace => 0 };
|
|
3334
|
+
$et->SetNewValuesFromFile($csvEtPrt, $opts, @tags, @excl);
|
|
3335
|
+
if ($csvEtVal) {
|
|
3336
|
+
$$opts{Type} = 'ValueConv';
|
|
3337
|
+
$et->SetNewValuesFromFile($csvEtVal, $opts, @tags, @excl);
|
|
3338
|
+
}
|
|
3350
3339
|
}
|
|
3351
3340
|
$et->Options(Charset => $old) if $csv eq 'JSON';
|
|
3352
3341
|
unless ($found) {
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '
|
|
91
|
+
$VERSION = '5.00';
|
|
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)
|
|
@@ -492,6 +492,7 @@ $VERSION = '4.98';
|
|
|
492
492
|
'368.12' => 'Sigma 18-35mm f/1.8 DC HSM | A', #50
|
|
493
493
|
'368.13' => 'Sigma 24-105mm f/4 DG OS HSM | A', #forum3833
|
|
494
494
|
'368.14' => 'Sigma 18-300mm f/3.5-6.3 DC Macro OS HSM | C', #forum15280 (014)
|
|
495
|
+
'368.15' => 'Sigma 24mm F1.4 DG HSM | A', #50 (015)
|
|
495
496
|
# Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings
|
|
496
497
|
488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH
|
|
497
498
|
489 => 'Canon EF 70-300mm f/4-5.6L IS USM', #Gerald Kapounek
|
|
@@ -643,6 +644,7 @@ $VERSION = '4.98';
|
|
|
643
644
|
'61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
|
|
644
645
|
'61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
|
|
645
646
|
'61182.65' => 'Canon RF 85mm F1.4 L VCM', #github350
|
|
647
|
+
'61182.66' => 'Canon RF 45mm F1.2 STM', #42
|
|
646
648
|
65535 => 'n/a',
|
|
647
649
|
);
|
|
648
650
|
|
|
@@ -1009,10 +1011,11 @@ $VERSION = '4.98';
|
|
|
1009
1011
|
0x80000487 => 'EOS R8', #42
|
|
1010
1012
|
0x80000491 => 'PowerShot V10', #25
|
|
1011
1013
|
0x80000495 => 'EOS R1', #PH
|
|
1012
|
-
0x80000496 => 'R5 Mark II', #forum16406
|
|
1014
|
+
0x80000496 => 'EOS R5 Mark II', #forum16406
|
|
1013
1015
|
0x80000497 => 'PowerShot V1', #PH
|
|
1014
1016
|
0x80000498 => 'EOS R100', #25
|
|
1015
1017
|
0x80000516 => 'EOS R50 V', #42
|
|
1018
|
+
0x80000518 => 'EOS R6 Mark III', #42
|
|
1016
1019
|
0x80000520 => 'EOS D2000C', #IB
|
|
1017
1020
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
1018
1021
|
);
|
|
@@ -1421,6 +1424,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
1421
1424
|
Condition => '$$self{Model} =~ /\bEOS (R6m2|R8|R50)$/',
|
|
1422
1425
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6m2' },
|
|
1423
1426
|
},
|
|
1427
|
+
{
|
|
1428
|
+
Name => 'CanonCameraInfoR6m3',
|
|
1429
|
+
Condition => '$$self{Model} =~ /\bEOS R6 Mark III$/',
|
|
1430
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6m3' },
|
|
1431
|
+
},
|
|
1424
1432
|
{
|
|
1425
1433
|
Name => 'CanonCameraInfoG5XII',
|
|
1426
1434
|
Condition => '$$self{Model} =~ /\bG5 X Mark II$/',
|
|
@@ -4792,6 +4800,22 @@ my %ciMaxFocal = (
|
|
|
4792
4800
|
},
|
|
4793
4801
|
);
|
|
4794
4802
|
|
|
4803
|
+
%Image::ExifTool::Canon::CameraInfoR6m3 = (
|
|
4804
|
+
%binaryDataAttrs,
|
|
4805
|
+
FIRST_ENTRY => 0,
|
|
4806
|
+
PRIORITY => 0,
|
|
4807
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
4808
|
+
NOTES => 'CameraInfo tags for the EOS R6 Mark II.',
|
|
4809
|
+
0x086d => { #forum17745
|
|
4810
|
+
Name => 'ShutterCount',
|
|
4811
|
+
Format => 'int32u',
|
|
4812
|
+
# (upper 2 bytes are currently unknown for this tag in JPEG images --
|
|
4813
|
+
# we need samples ideally spanning the 65536 count)
|
|
4814
|
+
RawConv => '$$self{PATH}[2] eq "UUID-Canon" ? $val : $val & 0xffff',
|
|
4815
|
+
Notes => 'includes electronic + mechanical shutter',
|
|
4816
|
+
},
|
|
4817
|
+
);
|
|
4818
|
+
|
|
4795
4819
|
# ref https://exiftool.org/forum/index.php?topic=15356.0
|
|
4796
4820
|
%Image::ExifTool::Canon::CameraInfoG5XII = (
|
|
4797
4821
|
%binaryDataAttrs,
|
|
@@ -7053,6 +7077,7 @@ my %ciMaxFocal = (
|
|
|
7053
7077
|
326 => 'Canon RF 24mm F1.4 L VCM', #42
|
|
7054
7078
|
327 => 'Canon RF 20mm F1.4 L VCM', #42
|
|
7055
7079
|
328 => 'Canon RF 85mm F1.4 L VCM', #42/github350
|
|
7080
|
+
330 => 'Canon RF 45mm F1.2 STM', #42
|
|
7056
7081
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
7057
7082
|
},
|
|
7058
7083
|
},
|
|
@@ -14,9 +14,9 @@ use vars qw($VERSION);
|
|
|
14
14
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
15
15
|
use Image::ExifTool::Import;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.11';
|
|
18
18
|
|
|
19
|
-
sub ProcessJSON(
|
|
19
|
+
sub ProcessJSON($$;$);
|
|
20
20
|
sub ProcessTag($$$$%);
|
|
21
21
|
|
|
22
22
|
%Image::ExifTool::JSON::Main = (
|
|
@@ -71,6 +71,7 @@ sub FoundTag($$$$%)
|
|
|
71
71
|
$name = Image::ExifTool::MakeTagName($name);
|
|
72
72
|
my $desc = Image::ExifTool::MakeDescription($name);
|
|
73
73
|
$desc =~ s/^C2 PA/C2PA/; # hack to get "C2PA" correct
|
|
74
|
+
$et->VPrint(0, $$et{INDENT}, "[adding $tag]\n");
|
|
74
75
|
AddTagToTable($tagTablePtr, $tag, {
|
|
75
76
|
Name => $name,
|
|
76
77
|
Description => $desc,
|
|
@@ -112,12 +113,12 @@ sub ProcessTag($$$$%)
|
|
|
112
113
|
|
|
113
114
|
#------------------------------------------------------------------------------
|
|
114
115
|
# Extract meta information from a JSON file
|
|
115
|
-
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
|
|
116
|
+
# Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) tag table ref
|
|
116
117
|
# Returns: 1 on success, 0 if this wasn't a recognized JSON file
|
|
117
|
-
sub ProcessJSON(
|
|
118
|
+
sub ProcessJSON($$;$)
|
|
118
119
|
{
|
|
119
120
|
local $_;
|
|
120
|
-
my ($et, $dirInfo) = @_;
|
|
121
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
|
121
122
|
my $raf = $$dirInfo{RAF};
|
|
122
123
|
my $structOpt = $et->Options('Struct');
|
|
123
124
|
my (%database, $key, $tag, $dataPt);
|
|
@@ -149,7 +150,7 @@ sub ProcessJSON($$)
|
|
|
149
150
|
|
|
150
151
|
$et->SetFileType() unless $dataPt;
|
|
151
152
|
|
|
152
|
-
|
|
153
|
+
$tagTablePtr or $tagTablePtr = GetTagTable('Image::ExifTool::JSON::Main');
|
|
153
154
|
|
|
154
155
|
# remove any old tag definitions in case they change flags
|
|
155
156
|
foreach $key (TagTableKeys($tagTablePtr)) {
|
|
@@ -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.27';
|
|
41
41
|
|
|
42
42
|
sub ProcessLeicaLEIC($$$);
|
|
43
43
|
sub WhiteBalanceConv($;$$);
|
|
@@ -916,13 +916,21 @@ my %shootingMode = (
|
|
|
916
916
|
Name => 'AFPointPosition',
|
|
917
917
|
Writable => 'rational64u',
|
|
918
918
|
Count => 2,
|
|
919
|
-
Notes =>
|
|
919
|
+
Notes => q{
|
|
920
|
+
X Y coordinates of primary AF area center, in the range 0.0 to 1.0, or
|
|
921
|
+
"n/a" or "none" for invalid values
|
|
922
|
+
},
|
|
920
923
|
PrintConv => q{
|
|
921
924
|
return 'none' if $val eq '16777216 16777216';
|
|
925
|
+
return 'n/a' if $val =~ /^4194303\.9/;
|
|
922
926
|
my @a = split ' ', $val;
|
|
923
927
|
sprintf("%.2g %.2g",@a);
|
|
924
928
|
},
|
|
925
|
-
PrintConvInv =>
|
|
929
|
+
PrintConvInv => q{
|
|
930
|
+
return '16777216 16777216' if $val eq 'none';
|
|
931
|
+
return '4294967295/1024 4294967295/1024' if $val eq 'n/a';
|
|
932
|
+
return $val;
|
|
933
|
+
},
|
|
926
934
|
},
|
|
927
935
|
0x4e => { #PH
|
|
928
936
|
Name => 'FaceDetInfo',
|
|
@@ -1441,8 +1449,8 @@ my %shootingMode = (
|
|
|
1441
1449
|
Writable => 'rational64u',
|
|
1442
1450
|
Notes => 'relative to size of image. "n/a" for manual focus',
|
|
1443
1451
|
Count => 2,
|
|
1444
|
-
PrintConv => '$val =~ /^4194303
|
|
1445
|
-
PrintConvInv => '$val eq "n/a" ? "
|
|
1452
|
+
PrintConv => '$val =~ /^4194303\.9/ ? "n/a" : $val',
|
|
1453
|
+
PrintConvInv => '$val eq "n/a" ? "4294967295/1024 4294967295/1024" : $val',
|
|
1446
1454
|
},
|
|
1447
1455
|
0xe4 => { #IB
|
|
1448
1456
|
Name => 'LensTypeModel',
|
|
@@ -49,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
49
49
|
use Image::ExifTool::Exif;
|
|
50
50
|
use Image::ExifTool::GPS;
|
|
51
51
|
|
|
52
|
-
$VERSION = '3.
|
|
52
|
+
$VERSION = '3.24';
|
|
53
53
|
|
|
54
54
|
sub ProcessMOV($$;$);
|
|
55
55
|
sub ProcessKeys($$$);
|
|
@@ -494,6 +494,7 @@ my %qtFlags = ( #12
|
|
|
494
494
|
ispe => 1, # primary item must have an ispe and pixi, so no need to inherit these
|
|
495
495
|
pixi => 1,
|
|
496
496
|
irot => 1, # (tmap may have a different irot)
|
|
497
|
+
imir => 1, # (ditto)
|
|
497
498
|
pasp => 1, # (NC)
|
|
498
499
|
hvcC => 2, # (hvcC is a property of hvc1 referred to by primary grid)
|
|
499
500
|
colr => 2, # (colr is a property of primary grid or hvc1 referred to by primary)
|
|
@@ -2833,6 +2834,7 @@ my %userDefined = (
|
|
|
2833
2834
|
'xml ' => {
|
|
2834
2835
|
Name => 'XML',
|
|
2835
2836
|
Flags => [ 'Binary', 'Protected' ],
|
|
2837
|
+
BlockExtract => 1,
|
|
2836
2838
|
SubDirectory => {
|
|
2837
2839
|
TagTable => 'Image::ExifTool::XMP::XML',
|
|
2838
2840
|
IgnoreProp => { NonRealTimeMeta => 1 }, # ignore container for Sony 'nrtm'
|
|
@@ -2883,6 +2885,7 @@ my %userDefined = (
|
|
|
2883
2885
|
},
|
|
2884
2886
|
idat => {
|
|
2885
2887
|
Name => 'MetaImageSize', #PH (NC)
|
|
2888
|
+
Condition => '$$self{FileType} eq "HEIC"',
|
|
2886
2889
|
Format => 'int16u',
|
|
2887
2890
|
# (don't know what the first two numbers are for)
|
|
2888
2891
|
PrintConv => '$val =~ s/^(\d+) (\d+) (\d+) (\d+)/${3}x$4/; $val',
|
|
@@ -2968,7 +2971,6 @@ my %userDefined = (
|
|
|
2968
2971
|
Condition => '$$valPt =~ /^(prof|rICC)/',
|
|
2969
2972
|
# (don't do this because Apple Preview won't display an HEIC with a 0-length profile)
|
|
2970
2973
|
# Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
|
|
2971
|
-
Permanent => 1,
|
|
2972
2974
|
SubDirectory => {
|
|
2973
2975
|
TagTable => 'Image::ExifTool::ICC_Profile::Main',
|
|
2974
2976
|
Start => 4,
|
|
@@ -2989,6 +2991,22 @@ my %userDefined = (
|
|
|
2989
2991
|
3 => 'Rotate 90 CW',
|
|
2990
2992
|
},
|
|
2991
2993
|
},
|
|
2994
|
+
imir => { # (applied before rotation)
|
|
2995
|
+
Name => 'Mirroring',
|
|
2996
|
+
Format => 'int8u',
|
|
2997
|
+
# yes, I realize this making this writable is useless without the ability to
|
|
2998
|
+
# create/delete this box because it is the existence of this box that is
|
|
2999
|
+
# significant. (The people who wrote the specification succeeded in making
|
|
3000
|
+
# this as complicated as possible because creating/deleting boxes from the
|
|
3001
|
+
# item property container is a real pain in the ass!)
|
|
3002
|
+
Writable => 'int8u',
|
|
3003
|
+
Protected => 1,
|
|
3004
|
+
PrintConv => {
|
|
3005
|
+
0 => 'Vertical',
|
|
3006
|
+
1 => 'Horizontal',
|
|
3007
|
+
# (it would have been great if the specification allowed for a "no mirroring" value)
|
|
3008
|
+
},
|
|
3009
|
+
},
|
|
2992
3010
|
ispe => {
|
|
2993
3011
|
Name => 'ImageSpatialExtent',
|
|
2994
3012
|
Condition => '$$valPt =~ /^\0{4}/', # (version/flags == 0/0)
|
|
@@ -6620,7 +6638,7 @@ my %userDefined = (
|
|
|
6620
6638
|
This directory contains a list of key names which are used to decode tags
|
|
6621
6639
|
written by the "mdta" handler. Also in this table are a few tags found in
|
|
6622
6640
|
timed metadata that are not yet writable by ExifTool. The prefix of
|
|
6623
|
-
"com.apple.quicktime." has been removed from
|
|
6641
|
+
"com.apple.quicktime." has been removed from most TagID's below. These tags
|
|
6624
6642
|
support alternate languages in the same way as the
|
|
6625
6643
|
L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> tags. Note
|
|
6626
6644
|
that by default,
|
|
@@ -6714,14 +6732,17 @@ my %userDefined = (
|
|
|
6714
6732
|
'encoder' => { }, # forum15418 (written by ffmpeg)
|
|
6715
6733
|
#
|
|
6716
6734
|
# the following tags aren't in the com.apple.quicktime namespace:
|
|
6735
|
+
# (Note: must add any non-'com' prefix to %fullKeysID in WriteQuickTime.pl
|
|
6736
|
+
# to avoid adding the 'com.apple.quicktime' prefix when writing)
|
|
6717
6737
|
#
|
|
6718
6738
|
'com.android.version' => 'AndroidVersion',
|
|
6719
6739
|
'com.android.capture.fps' => { Name => 'AndroidCaptureFPS', Writable => 'float' },
|
|
6720
6740
|
'com.android.manufacturer' => 'AndroidMake',
|
|
6721
6741
|
'com.android.model' => 'AndroidModel',
|
|
6722
6742
|
'com.xiaomi.preview_video_cover' => { Name => 'XiaomiPreviewVideoCover', Writable => 'int32s' },
|
|
6723
|
-
'xiaomi.exifInfo.videoinfo' => 'XiaomiExifInfo',
|
|
6724
6743
|
'com.xiaomi.hdr10' => { Name => 'XiaomiHDR10', Writable => 'int32s' },
|
|
6744
|
+
'xiaomi.exifInfo.videoinfo' => 'XiaomiExifInfo',
|
|
6745
|
+
'samsung.android.utc_offset' => { Name => 'AndroidTimeZone', Groups => { 2 => 'Time' } },
|
|
6725
6746
|
#
|
|
6726
6747
|
# also seen
|
|
6727
6748
|
#
|
|
@@ -9774,6 +9795,7 @@ sub ProcessKeys($$$)
|
|
|
9774
9795
|
$name = "Tag_$name" if length $name < 2;
|
|
9775
9796
|
$newInfo = { Name => $name, Groups => { 1 => 'Keys' } };
|
|
9776
9797
|
$msg = ' (Unknown)';
|
|
9798
|
+
$et->VPrint(0, $$et{INDENT}, "[adding Keys:$tag]\n");
|
|
9777
9799
|
}
|
|
9778
9800
|
# substitute this tag in the ItemList table with the given index
|
|
9779
9801
|
my $id = $$et{KeysCount} . '.' . $index;
|
|
@@ -211,7 +211,7 @@ my %insvLimit = (
|
|
|
211
211
|
},
|
|
212
212
|
},{
|
|
213
213
|
Name => 'gpmd_Wolfbox', # Wolfbox G900 Dashcam and Redtiger F9 4K
|
|
214
|
-
Condition => '$$valPt =~ /^.{136}0{16}
|
|
214
|
+
Condition => '$$valPt =~ /^.{136}(0{16}[A-Z]{4}|https:\/\/www.redtiger\0)/s',
|
|
215
215
|
SubDirectory => {
|
|
216
216
|
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
|
217
217
|
ProcessProc => \&ProcessWolfbox,
|
|
@@ -30,7 +30,7 @@ use strict;
|
|
|
30
30
|
use vars qw($VERSION $AUTOLOAD);
|
|
31
31
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
32
32
|
|
|
33
|
-
$VERSION = '1.
|
|
33
|
+
$VERSION = '1.73';
|
|
34
34
|
|
|
35
35
|
sub ConvertTimecode($);
|
|
36
36
|
sub ProcessSGLT($$$);
|
|
@@ -851,6 +851,7 @@ my %code2charset = (
|
|
|
851
851
|
Name => 'DateCreated',
|
|
852
852
|
Groups => { 2 => 'Time' },
|
|
853
853
|
ValueConv => '$_=$val; s/-/:/g; $_',
|
|
854
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
|
854
855
|
},
|
|
855
856
|
ICRP => 'Cropped',
|
|
856
857
|
IDIM => 'Dimensions',
|