exiftool-vendored.exe 13.41.0 → 13.42.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 +5 -2
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +7 -6
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +2 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +127 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +4 -2
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +66 -0
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +114 -2
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +8 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pm +3 -3
- package/bin/exiftool_files/windows_exiftool.txt +20 -16
- 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.42';
|
|
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 = '4.
|
|
91
|
+
$VERSION = '4.99';
|
|
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)
|
|
@@ -643,6 +643,7 @@ $VERSION = '4.98';
|
|
|
643
643
|
'61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
|
|
644
644
|
'61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
|
|
645
645
|
'61182.65' => 'Canon RF 85mm F1.4 L VCM', #github350
|
|
646
|
+
'61182.66' => 'Canon RF 45mm F1.2 STM', #42
|
|
646
647
|
65535 => 'n/a',
|
|
647
648
|
);
|
|
648
649
|
|
|
@@ -1009,10 +1010,11 @@ $VERSION = '4.98';
|
|
|
1009
1010
|
0x80000487 => 'EOS R8', #42
|
|
1010
1011
|
0x80000491 => 'PowerShot V10', #25
|
|
1011
1012
|
0x80000495 => 'EOS R1', #PH
|
|
1012
|
-
0x80000496 => 'R5 Mark II', #forum16406
|
|
1013
|
+
0x80000496 => 'EOS R5 Mark II', #forum16406
|
|
1013
1014
|
0x80000497 => 'PowerShot V1', #PH
|
|
1014
1015
|
0x80000498 => 'EOS R100', #25
|
|
1015
1016
|
0x80000516 => 'EOS R50 V', #42
|
|
1017
|
+
0x80000518 => 'EOS R6 Mark III', #42
|
|
1016
1018
|
0x80000520 => 'EOS D2000C', #IB
|
|
1017
1019
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
1018
1020
|
);
|
|
@@ -7053,6 +7055,7 @@ my %ciMaxFocal = (
|
|
|
7053
7055
|
326 => 'Canon RF 24mm F1.4 L VCM', #42
|
|
7054
7056
|
327 => 'Canon RF 20mm F1.4 L VCM', #42
|
|
7055
7057
|
328 => 'Canon RF 85mm F1.4 L VCM', #42/github350
|
|
7058
|
+
330 => 'Canon RF 45mm F1.2 STM', #42
|
|
7056
7059
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
7057
7060
|
},
|
|
7058
7061
|
},
|
|
@@ -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)) {
|
|
@@ -2833,6 +2833,7 @@ my %userDefined = (
|
|
|
2833
2833
|
'xml ' => {
|
|
2834
2834
|
Name => 'XML',
|
|
2835
2835
|
Flags => [ 'Binary', 'Protected' ],
|
|
2836
|
+
BlockExtract => 1,
|
|
2836
2837
|
SubDirectory => {
|
|
2837
2838
|
TagTable => 'Image::ExifTool::XMP::XML',
|
|
2838
2839
|
IgnoreProp => { NonRealTimeMeta => 1 }, # ignore container for Sony 'nrtm'
|
|
@@ -2883,6 +2884,7 @@ my %userDefined = (
|
|
|
2883
2884
|
},
|
|
2884
2885
|
idat => {
|
|
2885
2886
|
Name => 'MetaImageSize', #PH (NC)
|
|
2887
|
+
Condition => '$$self{FileType} eq "HEIC"',
|
|
2886
2888
|
Format => 'int16u',
|
|
2887
2889
|
# (don't know what the first two numbers are for)
|
|
2888
2890
|
PrintConv => '$val =~ s/^(\d+) (\d+) (\d+) (\d+)/${3}x$4/; $val',
|
|
@@ -21,8 +21,9 @@ use strict;
|
|
|
21
21
|
use vars qw($VERSION %samsungLensTypes);
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
23
23
|
use Image::ExifTool::Exif;
|
|
24
|
+
use Image::ExifTool::JSON;
|
|
24
25
|
|
|
25
|
-
$VERSION = '1.
|
|
26
|
+
$VERSION = '1.59';
|
|
26
27
|
|
|
27
28
|
sub WriteSTMN($$$);
|
|
28
29
|
sub ProcessINFO($$$);
|
|
@@ -1277,7 +1278,15 @@ my %formatMinMax = (
|
|
|
1277
1278
|
# 0x0b51-name - seen 'Intelligent_PhotoEditor_Data' #forum16086
|
|
1278
1279
|
# 0x0b60-name - seen 'UltraWide_PhotoEditor_Data' #forum16086
|
|
1279
1280
|
# 0x0b90-name - seen 'Document_Scan_Info' #forum16086
|
|
1280
|
-
# 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap'
|
|
1281
|
+
# 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap','PhotoEditor_Re_Edit_Data'
|
|
1282
|
+
'0x0ba1' => [{
|
|
1283
|
+
Name => 'ReEditData',
|
|
1284
|
+
Condition => '$$self{SamsungTagName} eq "PhotoEditor_Re_Edit_Data"',
|
|
1285
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ReEditData' },
|
|
1286
|
+
},{
|
|
1287
|
+
Name => 'OriginalPathHashKey',
|
|
1288
|
+
Condition => '$$self{SamsungTagName} eq "Original_Path_Hash_Key"',
|
|
1289
|
+
}],
|
|
1281
1290
|
# 0x0ba2-name - seen 'Copy_Available_Edit_Info' #forum16086
|
|
1282
1291
|
# 0x0bc0-name - seen 'Single_Relighting_Bokeh_Info' #forum16086
|
|
1283
1292
|
# 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
|
|
@@ -1300,7 +1309,7 @@ my %formatMinMax = (
|
|
|
1300
1309
|
'0x0d91' => { #forum16086/16242
|
|
1301
1310
|
Name => 'PEg_Info',
|
|
1302
1311
|
Description => 'PEg Info',
|
|
1303
|
-
SubDirectory => { TagTable => 'Image::ExifTool::
|
|
1312
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PEgInfo' },
|
|
1304
1313
|
},
|
|
1305
1314
|
# 0x0da1-name - seen 'Captured_App_Info' #forum16086
|
|
1306
1315
|
# 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
|
|
@@ -1380,6 +1389,113 @@ my %formatMinMax = (
|
|
|
1380
1389
|
perfMode => { },
|
|
1381
1390
|
);
|
|
1382
1391
|
|
|
1392
|
+
%Image::ExifTool::Samsung::ReEditData = (
|
|
1393
|
+
GROUPS => { 0 => 'JSON', 2 => 'Image' },
|
|
1394
|
+
PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
|
|
1395
|
+
VARS => { LONG_TAGS => 2 },
|
|
1396
|
+
originalPath => { },
|
|
1397
|
+
representativeFrameLoc => { },
|
|
1398
|
+
startMotionVideo => { },
|
|
1399
|
+
endMotionVideo => { },
|
|
1400
|
+
isMotionVideoMute => { },
|
|
1401
|
+
isTrimMotionVideo => { },
|
|
1402
|
+
clipInfoValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ClipInfo' } },
|
|
1403
|
+
toneValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::ToneInfo' } },
|
|
1404
|
+
effectValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::EffectInfo' } },
|
|
1405
|
+
portraitEffectValue => { SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PortraitEffect' } },
|
|
1406
|
+
isBlending => { },
|
|
1407
|
+
isNotReEdit => { },
|
|
1408
|
+
sepVersion => { Name => 'SEPVersion' },
|
|
1409
|
+
ndeVersion => { Name => 'NDEVersion' },
|
|
1410
|
+
reSize => { },
|
|
1411
|
+
isScaleAI => { },
|
|
1412
|
+
rotation => { },
|
|
1413
|
+
adjustmentValue => { },
|
|
1414
|
+
isApplyShapeCorrection => { },
|
|
1415
|
+
isNewReEditOnly => { },
|
|
1416
|
+
isDecoReEditOnly => { },
|
|
1417
|
+
isAIFilterReEditOnly=> { },
|
|
1418
|
+
);
|
|
1419
|
+
|
|
1420
|
+
%Image::ExifTool::Samsung::ClipInfo = (
|
|
1421
|
+
GROUPS => { 0 => 'JSON', 2 => 'Image' },
|
|
1422
|
+
PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
|
|
1423
|
+
mCenterX => { Name => 'ClipCenterX' },
|
|
1424
|
+
mCenterY => { Name => 'ClipCenterY' },
|
|
1425
|
+
mWidth => { Name => 'ClipWidth' },
|
|
1426
|
+
mHeight => { Name => 'ClipHeight' },
|
|
1427
|
+
mRotation => { Name => 'ClipRotation' },
|
|
1428
|
+
mRotate => { Name => 'ClipRotate' },
|
|
1429
|
+
mHFlip => { Name => 'ClipHFlip' },
|
|
1430
|
+
mVFlip => { Name => 'ClipVFlip' },
|
|
1431
|
+
mRotationEffect => { Name => 'ClipRotationEffect' },
|
|
1432
|
+
mRotateEffect => { Name => 'ClipRotateEffect' },
|
|
1433
|
+
mHFlipEffect => { Name => 'ClipHFlipEffect' },
|
|
1434
|
+
mVFlipEffect => { Name => 'ClipVFlipEffect' },
|
|
1435
|
+
mHozPerspective => { Name => 'ClipHozPerspective' },
|
|
1436
|
+
mVerPerspective => { Name => 'ClipVerPerspective' },
|
|
1437
|
+
);
|
|
1438
|
+
|
|
1439
|
+
%Image::ExifTool::Samsung::ToneInfo = (
|
|
1440
|
+
GROUPS => { 0 => 'JSON', 2 => 'Image' },
|
|
1441
|
+
PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
|
|
1442
|
+
brightness => { },
|
|
1443
|
+
exposure => { },
|
|
1444
|
+
contrast => { },
|
|
1445
|
+
saturation => { },
|
|
1446
|
+
hue => { },
|
|
1447
|
+
wbMode => { Name => 'WBMode' },
|
|
1448
|
+
wbTemperature => { Name => 'WBTemperature' },
|
|
1449
|
+
tint => { },
|
|
1450
|
+
shadow => { },
|
|
1451
|
+
highlight => { },
|
|
1452
|
+
lightbalance => { },
|
|
1453
|
+
sharpness => { },
|
|
1454
|
+
definition => { },
|
|
1455
|
+
isBrightnessIPE => { },
|
|
1456
|
+
isExposureIPE => { },
|
|
1457
|
+
isContrastIPE => { },
|
|
1458
|
+
isSaturationIPE => { },
|
|
1459
|
+
);
|
|
1460
|
+
|
|
1461
|
+
%Image::ExifTool::Samsung::EffectInfo = (
|
|
1462
|
+
GROUPS => { 0 => 'JSON', 2 => 'Image' },
|
|
1463
|
+
PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
|
|
1464
|
+
filterIndication=> { },
|
|
1465
|
+
alphaValue => { },
|
|
1466
|
+
filterType => { },
|
|
1467
|
+
);
|
|
1468
|
+
|
|
1469
|
+
%Image::ExifTool::Samsung::PortraitEffect = (
|
|
1470
|
+
GROUPS => { 0 => 'JSON', 2 => 'Image' },
|
|
1471
|
+
PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
|
|
1472
|
+
VARS => { LONG_TAGS => 1 },
|
|
1473
|
+
effectId => { Name => 'PortraitEffectID' },
|
|
1474
|
+
effectLevel => { Name => 'PortraitEffectLevel' },
|
|
1475
|
+
exifRotation => { Name => 'PortraitExifRotation' },
|
|
1476
|
+
lightLevel => { Name => 'PortraitLightLevel' },
|
|
1477
|
+
touchX => { Name => 'PortraitTouchX' },
|
|
1478
|
+
touchY => { Name => 'PortraitTouchY' },
|
|
1479
|
+
refocusX => { Name => 'PortraitRefocusX' },
|
|
1480
|
+
refocusY => { Name => 'PortraitRefocusY' },
|
|
1481
|
+
effectIdOriginal => { Name => 'PortraitEffectIDOriginal' },
|
|
1482
|
+
effectLevelOriginal => { Name => 'EffectLevelOriginal' },
|
|
1483
|
+
lightLevelOriginal => { Name => 'LightLevelOriginal' },
|
|
1484
|
+
touchXOriginal => { },
|
|
1485
|
+
touchYOriginal => { },
|
|
1486
|
+
refocusXOriginal=> { },
|
|
1487
|
+
refocusYOriginal=> { },
|
|
1488
|
+
waterMarkRemoved=> { Name => 'WaterMarkRemoved' },
|
|
1489
|
+
waterMarkRemovedOriginal => { Name => 'WaterMarkRemovedOriginal' },
|
|
1490
|
+
);
|
|
1491
|
+
|
|
1492
|
+
%Image::ExifTool::Samsung::PEgInfo = (
|
|
1493
|
+
GROUPS => { 0 => 'JSON', 2 => 'Image' },
|
|
1494
|
+
PROCESS_PROC => \&Image::ExifTool::JSON::ProcessJSON,
|
|
1495
|
+
genImageVersion => { },
|
|
1496
|
+
connectorType => { },
|
|
1497
|
+
);
|
|
1498
|
+
|
|
1383
1499
|
# Samsung composite tags
|
|
1384
1500
|
%Image::ExifTool::Samsung::Composite = (
|
|
1385
1501
|
GROUPS => { 2 => 'Image' },
|
|
@@ -1625,7 +1741,14 @@ SamBlock:
|
|
|
1625
1741
|
}
|
|
1626
1742
|
next;
|
|
1627
1743
|
}
|
|
1628
|
-
|
|
1744
|
+
# validate SEFH header
|
|
1745
|
+
unless ($buff =~ /^SEFH/ and $len >= 12) {
|
|
1746
|
+
# tolerate extra junk written by Samsung Gallery
|
|
1747
|
+
last unless $buff =~ /\0\0SEFT/g;
|
|
1748
|
+
$et->Warn('Trailer likely corrupted by Samsung Gallery');
|
|
1749
|
+
$blockEnd += pos($buff);
|
|
1750
|
+
next;
|
|
1751
|
+
}
|
|
1629
1752
|
my $dirPos = $raf->Tell() - $len;
|
|
1630
1753
|
# my $ver = Get32u(\$buff, 0x04); # version (=101)
|
|
1631
1754
|
my $count = Get32u(\$buff, 0x08);
|
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
34
34
|
use Image::ExifTool::Exif;
|
|
35
35
|
use Image::ExifTool::Minolta;
|
|
36
36
|
|
|
37
|
-
$VERSION = '3.
|
|
37
|
+
$VERSION = '3.80';
|
|
38
38
|
|
|
39
39
|
sub ProcessSRF($$$);
|
|
40
40
|
sub ProcessSR2($$$);
|
|
@@ -10656,7 +10656,7 @@ my %isoSetting2010 = (
|
|
|
10656
10656
|
0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1,2
|
|
10657
10657
|
0x8104 => { Name => 'Sony_rtmd_0x8104', Format => 'int16u', %hidUnk }, # seen: 35616
|
|
10658
10658
|
0x8105 => { Name => 'Sony_rtmd_0x8105', Format => 'int16u', %hidUnk }, # seen: 20092
|
|
10659
|
-
0x8106 => { Name => '
|
|
10659
|
+
0x8106 => { Name => 'FrameRate', Format => 'rational64u', PrintConv => 'sprintf("%.2f",$val)' },
|
|
10660
10660
|
0x8109 => { #forum12218
|
|
10661
10661
|
Name => 'ExposureTime',
|
|
10662
10662
|
Format => 'rational64u',
|
|
@@ -10674,7 +10674,9 @@ my %isoSetting2010 = (
|
|
|
10674
10674
|
Format => 'int16u',
|
|
10675
10675
|
},
|
|
10676
10676
|
0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 0,1
|
|
10677
|
+
0x8114 => { Name => 'SerialNumber', Format => 'string' }, # (and model, eg. "ILCE-7SM3 5072108")
|
|
10677
10678
|
0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100 - ISO
|
|
10679
|
+
# 0x8119 - seen "P" (same as 0x811e?)
|
|
10678
10680
|
# 0x8300 - container for other tags in this format
|
|
10679
10681
|
0x8500 => {
|
|
10680
10682
|
Name => 'GPSVersionID',
|
|
@@ -7840,6 +7840,7 @@ my %tagExists = (
|
|
|
7840
7840
|
'adjustedtbnimagewidth' => 1,
|
|
7841
7841
|
'adjustmentdata' => 1,
|
|
7842
7842
|
'adjustmentssettingsstatisticslightmap' => 1,
|
|
7843
|
+
'adjustmentvalue' => 1,
|
|
7843
7844
|
'adobe_cm' => 1,
|
|
7844
7845
|
'adobecmtype' => 1,
|
|
7845
7846
|
'adobecrw' => 1,
|
|
@@ -7948,6 +7949,7 @@ my %tagExists = (
|
|
|
7948
7949
|
'alphaoffset' => 1,
|
|
7949
7950
|
'alphapreprocessing' => 1,
|
|
7950
7951
|
'alphasample' => 1,
|
|
7952
|
+
'alphavalue' => 1,
|
|
7951
7953
|
'alternatealtitude' => 1,
|
|
7952
7954
|
'alternateduotonecolors' => 1,
|
|
7953
7955
|
'alternateellipsoidheight' => 1,
|
|
@@ -8719,11 +8721,26 @@ my %tagExists = (
|
|
|
8719
8721
|
'cleanfaxdata' => 1,
|
|
8720
8722
|
'clientid' => 1,
|
|
8721
8723
|
'clipboundary' => 1,
|
|
8724
|
+
'clipcenterx' => 1,
|
|
8725
|
+
'clipcentery' => 1,
|
|
8726
|
+
'clipheight' => 1,
|
|
8727
|
+
'cliphflip' => 1,
|
|
8728
|
+
'cliphflipeffect' => 1,
|
|
8729
|
+
'cliphozperspective' => 1,
|
|
8730
|
+
'clipinfovalue' => 1,
|
|
8722
8731
|
'clipobjects' => 1,
|
|
8723
8732
|
'clippath' => 1,
|
|
8724
8733
|
'clippingboundary' => 1,
|
|
8725
8734
|
'clippinglimit' => 1,
|
|
8726
8735
|
'clippingpathname' => 1,
|
|
8736
|
+
'cliprotate' => 1,
|
|
8737
|
+
'cliprotateeffect' => 1,
|
|
8738
|
+
'cliprotation' => 1,
|
|
8739
|
+
'cliprotationeffect' => 1,
|
|
8740
|
+
'clipverperspective' => 1,
|
|
8741
|
+
'clipvflip' => 1,
|
|
8742
|
+
'clipvflipeffect' => 1,
|
|
8743
|
+
'clipwidth' => 1,
|
|
8727
8744
|
'cloneid' => 1,
|
|
8728
8745
|
'cloneobject' => 1,
|
|
8729
8746
|
'clonetype' => 1,
|
|
@@ -8895,6 +8912,7 @@ my %tagExists = (
|
|
|
8895
8912
|
'confidencemapimage' => 1,
|
|
8896
8913
|
'confirmedobjectsize' => 1,
|
|
8897
8914
|
'connectionspaceilluminant' => 1,
|
|
8915
|
+
'connectortype' => 1,
|
|
8898
8916
|
'consecutivebadfaxlines' => 1,
|
|
8899
8917
|
'consoledata' => 1,
|
|
8900
8918
|
'consolefedata' => 1,
|
|
@@ -9183,6 +9201,7 @@ my %tagExists = (
|
|
|
9183
9201
|
'defectlistpacked' => 1,
|
|
9184
9202
|
'defineobject' => 1,
|
|
9185
9203
|
'definequantizationtable' => 1,
|
|
9204
|
+
'definition' => 1,
|
|
9186
9205
|
'delay' => 1,
|
|
9187
9206
|
'delaycols' => 1,
|
|
9188
9207
|
'delaytime' => 1,
|
|
@@ -9420,9 +9439,11 @@ my %tagExists = (
|
|
|
9420
9439
|
'ef' => 1,
|
|
9421
9440
|
'effect' => 1,
|
|
9422
9441
|
'effectivebw' => 1,
|
|
9442
|
+
'effectleveloriginal' => 1,
|
|
9423
9443
|
'effectstrength' => 1,
|
|
9424
9444
|
'effectsvisible' => 1,
|
|
9425
9445
|
'effecttype' => 1,
|
|
9446
|
+
'effectvalue' => 1,
|
|
9426
9447
|
'eighteenpercentpoint' => 1,
|
|
9427
9448
|
'eighthlanguage' => 1,
|
|
9428
9449
|
'electricalextendermagnification' => 1,
|
|
@@ -9469,6 +9490,7 @@ my %tagExists = (
|
|
|
9469
9490
|
'encryption' => 1,
|
|
9470
9491
|
'enddate' => 1,
|
|
9471
9492
|
'endianness' => 1,
|
|
9493
|
+
'endmotionvideo' => 1,
|
|
9472
9494
|
'endpoints' => 1,
|
|
9473
9495
|
'endtime' => 1,
|
|
9474
9496
|
'endtimecode' => 1,
|
|
@@ -9702,6 +9724,7 @@ my %tagExists = (
|
|
|
9702
9724
|
'filmrollnumber' => 1,
|
|
9703
9725
|
'filmsize' => 1,
|
|
9704
9726
|
'filter' => 1,
|
|
9727
|
+
'filterindication' => 1,
|
|
9705
9728
|
'filterinfo' => 1,
|
|
9706
9729
|
'filtering' => 1,
|
|
9707
9730
|
'filtermodel' => 1,
|
|
@@ -9710,6 +9733,7 @@ my %tagExists = (
|
|
|
9710
9733
|
'filterparametersexportexportdata' => 1,
|
|
9711
9734
|
'filterpartnumber' => 1,
|
|
9712
9735
|
'filterserialnumber' => 1,
|
|
9736
|
+
'filtertype' => 1,
|
|
9713
9737
|
'finalflushsequence' => 1,
|
|
9714
9738
|
'finalframeblocks' => 1,
|
|
9715
9739
|
'finetune' => 1,
|
|
@@ -9920,6 +9944,7 @@ my %tagExists = (
|
|
|
9920
9944
|
'genericflagdata01' => 1,
|
|
9921
9945
|
'genflags' => 1,
|
|
9922
9946
|
'gengraphicsmode' => 1,
|
|
9947
|
+
'genimageversion' => 1,
|
|
9923
9948
|
'genmediaheader' => 1,
|
|
9924
9949
|
'genmediainfo' => 1,
|
|
9925
9950
|
'genmediaversion' => 1,
|
|
@@ -10428,15 +10453,25 @@ my %tagExists = (
|
|
|
10428
10453
|
'irwindowtransmission' => 1,
|
|
10429
10454
|
'is_protected' => 1,
|
|
10430
10455
|
'is_trusted' => 1,
|
|
10456
|
+
'isaifilterreeditonly' => 1,
|
|
10457
|
+
'isapplyshapecorrection' => 1,
|
|
10431
10458
|
'isartbokeh' => 1,
|
|
10432
10459
|
'isattachment' => 1,
|
|
10433
10460
|
'isbasefont' => 1,
|
|
10461
|
+
'isblending' => 1,
|
|
10462
|
+
'isbrightnessipe' => 1,
|
|
10434
10463
|
'iscompleted' => 1,
|
|
10464
|
+
'iscontrastipe' => 1,
|
|
10465
|
+
'isdecoreeditonly' => 1,
|
|
10435
10466
|
'isdeleted' => 1,
|
|
10467
|
+
'isexposureipe' => 1,
|
|
10436
10468
|
'isfixedpitch' => 1,
|
|
10437
10469
|
'isfixedv' => 1,
|
|
10438
10470
|
'isinfoa100' => 1,
|
|
10471
|
+
'ismotionvideomute' => 1,
|
|
10439
10472
|
'isnetworkfeed' => 1,
|
|
10473
|
+
'isnewreeditonly' => 1,
|
|
10474
|
+
'isnotreedit' => 1,
|
|
10440
10475
|
'isoautooffset' => 1,
|
|
10441
10476
|
'isocalibrationgaintable' => 1,
|
|
10442
10477
|
'isoinfo' => 1,
|
|
@@ -10449,6 +10484,9 @@ my %tagExists = (
|
|
|
10449
10484
|
'isprotected' => 1,
|
|
10450
10485
|
'isrcnumber' => 1,
|
|
10451
10486
|
'isrecurring' => 1,
|
|
10487
|
+
'issaturationipe' => 1,
|
|
10488
|
+
'isscaleai' => 1,
|
|
10489
|
+
'istrimmotionvideo' => 1,
|
|
10452
10490
|
'isvbr' => 1,
|
|
10453
10491
|
'it8header' => 1,
|
|
10454
10492
|
'italic' => 1,
|
|
@@ -10716,7 +10754,9 @@ my %tagExists = (
|
|
|
10716
10754
|
'licenseedir' => 1,
|
|
10717
10755
|
'licenseinfourl' => 1,
|
|
10718
10756
|
'licenseurl' => 1,
|
|
10757
|
+
'lightbalance' => 1,
|
|
10719
10758
|
'lightingopt' => 1,
|
|
10759
|
+
'lightleveloriginal' => 1,
|
|
10720
10760
|
'lightness' => 1,
|
|
10721
10761
|
'lightroomworkflow' => 1,
|
|
10722
10762
|
'lights' => 1,
|
|
@@ -11271,6 +11311,7 @@ my %tagExists = (
|
|
|
11271
11311
|
'nativeyresolution' => 1,
|
|
11272
11312
|
'nbcd' => 1,
|
|
11273
11313
|
'ncc' => 1,
|
|
11314
|
+
'ndeversion' => 1,
|
|
11274
11315
|
'nemoblurkernel' => 1,
|
|
11275
11316
|
'nemodarklimit' => 1,
|
|
11276
11317
|
'nemogainfactors' => 1,
|
|
@@ -11508,6 +11549,8 @@ my %tagExists = (
|
|
|
11508
11549
|
'originalmedia' => 1,
|
|
11509
11550
|
'originalmediatype' => 1,
|
|
11510
11551
|
'originalmedium' => 1,
|
|
11552
|
+
'originalpath' => 1,
|
|
11553
|
+
'originalpathhashkey' => 1,
|
|
11511
11554
|
'originalpayloadframecount' => 1,
|
|
11512
11555
|
'originalrawcreator' => 1,
|
|
11513
11556
|
'originalrawfiletype' => 1,
|
|
@@ -11759,9 +11802,19 @@ my %tagExists = (
|
|
|
11759
11802
|
'popularimeter' => 1,
|
|
11760
11803
|
'popupfillattributes' => 1,
|
|
11761
11804
|
'popupflash' => 1,
|
|
11805
|
+
'portraiteffectid' => 1,
|
|
11806
|
+
'portraiteffectidoriginal' => 1,
|
|
11807
|
+
'portraiteffectlevel' => 1,
|
|
11808
|
+
'portraiteffectvalue' => 1,
|
|
11809
|
+
'portraitexifrotation' => 1,
|
|
11810
|
+
'portraitlightlevel' => 1,
|
|
11762
11811
|
'portraitmatrix' => 1,
|
|
11763
11812
|
'portraitoffset' => 1,
|
|
11813
|
+
'portraitrefocusx' => 1,
|
|
11814
|
+
'portraitrefocusy' => 1,
|
|
11764
11815
|
'portraittonescaletable' => 1,
|
|
11816
|
+
'portraittouchx' => 1,
|
|
11817
|
+
'portraittouchy' => 1,
|
|
11765
11818
|
'poseyawdegrees' => 1,
|
|
11766
11819
|
'position' => 1,
|
|
11767
11820
|
'postertime' => 1,
|
|
@@ -12096,6 +12149,7 @@ my %tagExists = (
|
|
|
12096
12149
|
'redtrc' => 1,
|
|
12097
12150
|
'redx' => 1,
|
|
12098
12151
|
'redy' => 1,
|
|
12152
|
+
'reeditdata' => 1,
|
|
12099
12153
|
'reelnumber' => 1,
|
|
12100
12154
|
'reeltimecode' => 1,
|
|
12101
12155
|
'reference' => 1,
|
|
@@ -12106,6 +12160,8 @@ my %tagExists = (
|
|
|
12106
12160
|
'reflection' => 1,
|
|
12107
12161
|
'reflectionhardcopyorigcolorimetry' => 1,
|
|
12108
12162
|
'reflectionprintoutputcolorimetry' => 1,
|
|
12163
|
+
'refocusxoriginal' => 1,
|
|
12164
|
+
'refocusyoriginal' => 1,
|
|
12109
12165
|
'refresh' => 1,
|
|
12110
12166
|
'regionxformtackpoint' => 1,
|
|
12111
12167
|
'registerreadtiming' => 1,
|
|
@@ -12148,6 +12204,7 @@ my %tagExists = (
|
|
|
12148
12204
|
'replyto' => 1,
|
|
12149
12205
|
'representativedisparityfar' => 1,
|
|
12150
12206
|
'representativedisparitynear' => 1,
|
|
12207
|
+
'representativeframeloc' => 1,
|
|
12151
12208
|
'representativeimage' => 1,
|
|
12152
12209
|
'requestid' => 1,
|
|
12153
12210
|
'requeststate' => 1,
|
|
@@ -12164,6 +12221,7 @@ my %tagExists = (
|
|
|
12164
12221
|
'reservedblob7' => 1,
|
|
12165
12222
|
'reservedblob8' => 1,
|
|
12166
12223
|
'reservedblob9' => 1,
|
|
12224
|
+
'resize' => 1,
|
|
12167
12225
|
'resolutioninfo' => 1,
|
|
12168
12226
|
'resolutionxlengthunit' => 1,
|
|
12169
12227
|
'resolutionxunit' => 1,
|
|
@@ -12440,6 +12498,7 @@ my %tagExists = (
|
|
|
12440
12498
|
'sensorrightborder' => 1,
|
|
12441
12499
|
'sensorvelocityeast' => 1,
|
|
12442
12500
|
'sensorvelocitynorth' => 1,
|
|
12501
|
+
'sepversion' => 1,
|
|
12443
12502
|
'seqcount' => 1,
|
|
12444
12503
|
'seqfinal' => 1,
|
|
12445
12504
|
'seqframeinfo' => 1,
|
|
@@ -12668,6 +12727,7 @@ my %tagExists = (
|
|
|
12668
12727
|
'starring' => 1,
|
|
12669
12728
|
'startdate' => 1,
|
|
12670
12729
|
'startedgecode' => 1,
|
|
12730
|
+
'startmotionvideo' => 1,
|
|
12671
12731
|
'startofframe' => 1,
|
|
12672
12732
|
'startreading' => 1,
|
|
12673
12733
|
'starttime' => 1,
|
|
@@ -13048,6 +13108,7 @@ my %tagExists = (
|
|
|
13048
13108
|
'tonescale9' => 1,
|
|
13049
13109
|
'tonescale9spline' => 1,
|
|
13050
13110
|
'tonespaceflow' => 1,
|
|
13111
|
+
'tonevalue' => 1,
|
|
13051
13112
|
'tonscaletable' => 1,
|
|
13052
13113
|
'tool_name' => 1,
|
|
13053
13114
|
'tool_version' => 1,
|
|
@@ -13070,6 +13131,8 @@ my %tagExists = (
|
|
|
13070
13131
|
'totalparts' => 1,
|
|
13071
13132
|
'totalsamples' => 1,
|
|
13072
13133
|
'totalsize' => 1,
|
|
13134
|
+
'touchxoriginal' => 1,
|
|
13135
|
+
'touchyoriginal' => 1,
|
|
13073
13136
|
'toycamerafilter' => 1,
|
|
13074
13137
|
'trackaperture' => 1,
|
|
13075
13138
|
'trackcategory' => 1,
|
|
@@ -13379,6 +13442,8 @@ my %tagExists = (
|
|
|
13379
13442
|
'watched' => 1,
|
|
13380
13443
|
'watercolorfilter' => 1,
|
|
13381
13444
|
'watermark' => 1,
|
|
13445
|
+
'watermarkremoved' => 1,
|
|
13446
|
+
'watermarkremovedoriginal' => 1,
|
|
13382
13447
|
'watermarktype' => 1,
|
|
13383
13448
|
'watermarkurl' => 1,
|
|
13384
13449
|
'wave' => 1,
|
|
@@ -13432,6 +13497,7 @@ my %tagExists = (
|
|
|
13432
13497
|
'wbredtungsten' => 1,
|
|
13433
13498
|
'wbsettings' => 1,
|
|
13434
13499
|
'wbsettings2' => 1,
|
|
13500
|
+
'wbtemperature' => 1,
|
|
13435
13501
|
'wcsprofiles' => 1,
|
|
13436
13502
|
'weaponfired' => 1,
|
|
13437
13503
|
'weaponload' => 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 28932 tags, with 17990 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
|
|
@@ -21924,7 +21924,9 @@ HEIC images from models such as the S10+.
|
|
|
21924
21924
|
EmbeddedVideoFile no
|
|
21925
21925
|
EmbeddedVideoType no
|
|
21926
21926
|
MCCData no
|
|
21927
|
-
PEg_Info
|
|
21927
|
+
PEg_Info Samsung PEgInfo
|
|
21928
|
+
ReEditData Samsung ReEditData
|
|
21929
|
+
OriginalPathHashKey no
|
|
21928
21930
|
RemasterInfo no
|
|
21929
21931
|
SamsungCaptureInfo no
|
|
21930
21932
|
SingleShotDepthMap no
|
|
@@ -21940,6 +21942,114 @@ HEIC images from models such as the S10+.
|
|
|
21940
21942
|
16 DepthMapWidth no
|
|
21941
21943
|
17 DepthMapHeight no
|
|
21942
21944
|
|
|
21945
|
+
=head3 Samsung PEgInfo Tags
|
|
21946
|
+
|
|
21947
|
+
Tag ID Tag Name Writable
|
|
21948
|
+
------ -------- --------
|
|
21949
|
+
'connectorType' ConnectorType no
|
|
21950
|
+
'genImageVersion' GenImageVersion no
|
|
21951
|
+
|
|
21952
|
+
=head3 Samsung ReEditData Tags
|
|
21953
|
+
|
|
21954
|
+
Tag ID Tag Name Writable
|
|
21955
|
+
------ -------- --------
|
|
21956
|
+
'adjustmentValue' AdjustmentValue no
|
|
21957
|
+
'clipInfoValue' ClipInfoValue Samsung ClipInfo
|
|
21958
|
+
'effectValue' EffectValue Samsung EffectInfo
|
|
21959
|
+
'endMotionVideo' EndMotionVideo no
|
|
21960
|
+
'isAIFilterReEditOnly' IsAIFilterReEditOnly no
|
|
21961
|
+
'isApplyShapeCorrection'
|
|
21962
|
+
IsApplyShapeCorrection no
|
|
21963
|
+
'isBlending' IsBlending no
|
|
21964
|
+
'isDecoReEditOnly' IsDecoReEditOnly no
|
|
21965
|
+
'isMotionVideoMute' IsMotionVideoMute no
|
|
21966
|
+
'isNewReEditOnly' IsNewReEditOnly no
|
|
21967
|
+
'isNotReEdit' IsNotReEdit no
|
|
21968
|
+
'isScaleAI' IsScaleAI no
|
|
21969
|
+
'isTrimMotionVideo' IsTrimMotionVideo no
|
|
21970
|
+
'ndeVersion' NDEVersion no
|
|
21971
|
+
'originalPath' OriginalPath no
|
|
21972
|
+
'portraitEffectValue' PortraitEffectValue Samsung PortraitEffect
|
|
21973
|
+
'reSize' ReSize no
|
|
21974
|
+
'representativeFrameLoc'
|
|
21975
|
+
RepresentativeFrameLoc no
|
|
21976
|
+
'rotation' Rotation no
|
|
21977
|
+
'sepVersion' SEPVersion no
|
|
21978
|
+
'startMotionVideo' StartMotionVideo no
|
|
21979
|
+
'toneValue' ToneValue Samsung ToneInfo
|
|
21980
|
+
|
|
21981
|
+
=head3 Samsung ClipInfo Tags
|
|
21982
|
+
|
|
21983
|
+
Tag ID Tag Name Writable
|
|
21984
|
+
------ -------- --------
|
|
21985
|
+
'mCenterX' ClipCenterX no
|
|
21986
|
+
'mCenterY' ClipCenterY no
|
|
21987
|
+
'mHFlip' ClipHFlip no
|
|
21988
|
+
'mHFlipEffect' ClipHFlipEffect no
|
|
21989
|
+
'mHeight' ClipHeight no
|
|
21990
|
+
'mHozPerspective' ClipHozPerspective no
|
|
21991
|
+
'mRotate' ClipRotate no
|
|
21992
|
+
'mRotateEffect' ClipRotateEffect no
|
|
21993
|
+
'mRotation' ClipRotation no
|
|
21994
|
+
'mRotationEffect' ClipRotationEffect no
|
|
21995
|
+
'mVFlip' ClipVFlip no
|
|
21996
|
+
'mVFlipEffect' ClipVFlipEffect no
|
|
21997
|
+
'mVerPerspective' ClipVerPerspective no
|
|
21998
|
+
'mWidth' ClipWidth no
|
|
21999
|
+
|
|
22000
|
+
=head3 Samsung EffectInfo Tags
|
|
22001
|
+
|
|
22002
|
+
Tag ID Tag Name Writable
|
|
22003
|
+
------ -------- --------
|
|
22004
|
+
'alphaValue' AlphaValue no
|
|
22005
|
+
'filterIndication' FilterIndication no
|
|
22006
|
+
'filterType' FilterType no
|
|
22007
|
+
|
|
22008
|
+
=head3 Samsung PortraitEffect Tags
|
|
22009
|
+
|
|
22010
|
+
Tag ID Tag Name Writable
|
|
22011
|
+
------ -------- --------
|
|
22012
|
+
'effectId' PortraitEffectID no
|
|
22013
|
+
'effectIdOriginal' PortraitEffectIDOriginal no
|
|
22014
|
+
'effectLevel' PortraitEffectLevel no
|
|
22015
|
+
'effectLevelOriginal' EffectLevelOriginal no
|
|
22016
|
+
'exifRotation' PortraitExifRotation no
|
|
22017
|
+
'lightLevel' PortraitLightLevel no
|
|
22018
|
+
'lightLevelOriginal' LightLevelOriginal no
|
|
22019
|
+
'refocusX' PortraitRefocusX no
|
|
22020
|
+
'refocusXOriginal' RefocusXOriginal no
|
|
22021
|
+
'refocusY' PortraitRefocusY no
|
|
22022
|
+
'refocusYOriginal' RefocusYOriginal no
|
|
22023
|
+
'touchX' PortraitTouchX no
|
|
22024
|
+
'touchXOriginal' TouchXOriginal no
|
|
22025
|
+
'touchY' PortraitTouchY no
|
|
22026
|
+
'touchYOriginal' TouchYOriginal no
|
|
22027
|
+
'waterMarkRemoved' WaterMarkRemoved no
|
|
22028
|
+
'waterMarkRemovedOriginal'
|
|
22029
|
+
WaterMarkRemovedOriginal no
|
|
22030
|
+
|
|
22031
|
+
=head3 Samsung ToneInfo Tags
|
|
22032
|
+
|
|
22033
|
+
Tag ID Tag Name Writable
|
|
22034
|
+
------ -------- --------
|
|
22035
|
+
'brightness' Brightness no
|
|
22036
|
+
'contrast' Contrast no
|
|
22037
|
+
'definition' Definition no
|
|
22038
|
+
'exposure' Exposure no
|
|
22039
|
+
'highlight' Highlight no
|
|
22040
|
+
'hue' Hue no
|
|
22041
|
+
'isBrightnessIPE' IsBrightnessIPE no
|
|
22042
|
+
'isContrastIPE' IsContrastIPE no
|
|
22043
|
+
'isExposureIPE' IsExposureIPE no
|
|
22044
|
+
'isSaturationIPE' IsSaturationIPE no
|
|
22045
|
+
'lightbalance' Lightbalance no
|
|
22046
|
+
'saturation' Saturation no
|
|
22047
|
+
'shadow' Shadow no
|
|
22048
|
+
'sharpness' Sharpness no
|
|
22049
|
+
'tint' Tint no
|
|
22050
|
+
'wbMode' WBMode no
|
|
22051
|
+
'wbTemperature' WBTemperature no
|
|
22052
|
+
|
|
21943
22053
|
=head3 Samsung SingleShotMeta Tags
|
|
21944
22054
|
|
|
21945
22055
|
Tag ID Tag Name Writable
|
|
@@ -24074,10 +24184,12 @@ some models when the ExtractEmbedded option is used.
|
|
|
24074
24184
|
Tag ID Tag Name Writable
|
|
24075
24185
|
------ -------- --------
|
|
24076
24186
|
0x8000 FNumber no
|
|
24187
|
+
0x8106 FrameRate no
|
|
24077
24188
|
0x8109 ExposureTime no
|
|
24078
24189
|
0x810a MasterGainAdjustment no
|
|
24079
24190
|
0x810b ISO no
|
|
24080
24191
|
0x810c ElectricalExtenderMagnification no
|
|
24192
|
+
0x8114 SerialNumber no
|
|
24081
24193
|
0x8500 GPSVersionID no
|
|
24082
24194
|
0x8501 GPSLatitudeRef no
|
|
24083
24195
|
0x8502 GPSLatitude no
|
|
@@ -1731,7 +1731,14 @@ ItemID2: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
|
1731
1731
|
# (note that $tag may be a binary Keys index here)
|
|
1732
1732
|
foreach $tag (@addTags) {
|
|
1733
1733
|
my $tagInfo = $$dirs{$tag} || $$newTags{$tag};
|
|
1734
|
-
|
|
1734
|
+
unless (ref $tagInfo eq 'HASH') { # (shouldn't happen, but somehow there is forum17260)
|
|
1735
|
+
# (also can happen if Meta exists but Keys does not since 'keys' is an array ref.
|
|
1736
|
+
# SonyPMW-EX1R.mp4 has a Movie-Meta atom with XML and no Keys that triggers this
|
|
1737
|
+
# issue. Note that in this case the Meta HandlerType is 'meta' instead of 'mdta',
|
|
1738
|
+
# which isn't a problem for ExifTool, but may be for other software?)
|
|
1739
|
+
next unless ref $tagInfo eq 'ARRAY';
|
|
1740
|
+
$tagInfo = $et->GetTagInfo($tagTablePtr, $tag) or next;
|
|
1741
|
+
}
|
|
1735
1742
|
next if defined $$tagInfo{CanCreate} and not $$tagInfo{CanCreate};
|
|
1736
1743
|
next if defined $$tagInfo{MediaType} and $$et{MediaType} ne $$tagInfo{MediaType};
|
|
1737
1744
|
my $subdir = $$tagInfo{SubDirectory};
|
|
@@ -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 $configFile @configFiles $noConfig);
|
|
31
31
|
|
|
32
|
-
$VERSION = '13.
|
|
32
|
+
$VERSION = '13.42';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -392,9 +392,9 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
|
|
|
392
392
|
LFR => 'LFP', # (Light Field RAW)
|
|
393
393
|
LIF => ['LIF', 'Leica Image File'],
|
|
394
394
|
LNK => ['LNK', 'Windows shortcut'],
|
|
395
|
-
LRF => ['MOV', 'Low-Resolution video File'],
|
|
395
|
+
LRF => ['MOV', 'Low-Resolution video File'], # (DJI)
|
|
396
396
|
LRI => ['LRI', 'Light RAW'],
|
|
397
|
-
LRV => ['MOV', 'Low-Resolution Video'],
|
|
397
|
+
LRV => ['MOV', 'Low-Resolution Video'], # (GoPro)
|
|
398
398
|
M2T => 'M2TS',
|
|
399
399
|
M2TS => ['M2TS', 'MPEG-2 Transport Stream'],
|
|
400
400
|
M2V => ['MPEG', 'MPEG-2 Video'],
|
|
@@ -744,12 +744,14 @@ OPTIONS
|
|
|
744
744
|
Specific tags may be imported from the CSV database by adding
|
|
745
745
|
-*TAG* options to the command after -csv=*CSVFILE*, or excluded
|
|
746
746
|
with --*TAG*, with exclusions taking priority. Group names and
|
|
747
|
-
wildcards are allowed,
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
same
|
|
747
|
+
wildcards in tag names are allowed, but the group name must match
|
|
748
|
+
exactly the group in the CSV file (eg. a "XMP-dc:Subject" column in
|
|
749
|
+
the CSV file won't match "-XMP:Subject" on the command line. Also,
|
|
750
|
+
tags from the CSV may be redirected and written to different tags
|
|
751
|
+
in the target file with support for advanced-formatting expressions
|
|
752
|
+
using the same syntax as the -tagsFromFile feature. If no tags are
|
|
753
|
+
specified, then all tags except FileName, Directory and excluded
|
|
754
|
+
tags are imported (in the same order as the database entries).
|
|
753
755
|
|
|
754
756
|
When exporting a CSV file, the -g or -G option adds group names to
|
|
755
757
|
the tag headings. If the -a option is used to allow duplicate tag
|
|
@@ -774,8 +776,8 @@ OPTIONS
|
|
|
774
776
|
importing.
|
|
775
777
|
|
|
776
778
|
Special feature: -csv+=*CSVFILE* may be used to add items to
|
|
777
|
-
existing lists. This affects only list-type tags. Also
|
|
778
|
-
the -j option.
|
|
779
|
+
existing lists in the file. This affects only list-type tags. Also
|
|
780
|
+
applies to the -j option.
|
|
779
781
|
|
|
780
782
|
Note that this and the -plot options are fundamentally different
|
|
781
783
|
than all other output format options because they require
|
|
@@ -944,19 +946,21 @@ OPTIONS
|
|
|
944
946
|
Specific tags may be imported from the JSON database by adding
|
|
945
947
|
-*TAG* options to the command after -j=*JSONFILE*, or excluded with
|
|
946
948
|
--*TAG*, with exclusions taking priority. Group names and wildcards
|
|
947
|
-
are allowed,
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
same
|
|
949
|
+
in tag names are allowed, but the group name must match exactly the
|
|
950
|
+
group in the JSON file (eg. a "XMP-dc:Subject" entry in the JSON
|
|
951
|
+
file won't match "-XMP:Subject" on the command line. Also, tags
|
|
952
|
+
from JSON may be redirected and written to different tags in the
|
|
953
|
+
target file with support for advanced-formatting expressions using
|
|
954
|
+
the same syntax as the -tagsFromFile feature. If no tags are
|
|
955
|
+
specified, then all tags except FileName, Directory and excluded
|
|
956
|
+
tags are imported (in the same order as the database entries).
|
|
953
957
|
|
|
954
958
|
Unlike CSV import, empty values are not ignored, and will cause an
|
|
955
959
|
empty value to be written if supported by the specific metadata
|
|
956
960
|
type. Tags are deleted by using the -f option and setting the tag
|
|
957
961
|
value to "-" (or to the MissingTagValue setting if this API option
|
|
958
962
|
was used). Importing with -j+=*JSONFILE* causes new values to be
|
|
959
|
-
added to existing lists.
|
|
963
|
+
added to existing lists in the target file.
|
|
960
964
|
|
|
961
965
|
-l (-long)
|
|
962
966
|
Use long 2-line Canon-style output format. Adds a description and
|
|
@@ -1094,7 +1098,7 @@ OPTIONS
|
|
|
1094
1098
|
|
|
1095
1099
|
produces output like this:
|
|
1096
1100
|
|
|
1097
|
-
-- Generated by ExifTool 13.
|
|
1101
|
+
-- Generated by ExifTool 13.42 --
|
|
1098
1102
|
File: a.jpg - 2003:10:31 15:44:19
|
|
1099
1103
|
(f/5.6, 1/60s, ISO 100)
|
|
1100
1104
|
File: b.jpg - 2006:05:23 11:57:38
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "exiftool-vendored.exe",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.42.0",
|
|
4
4
|
"description": "Vendored win32 ExifTool for Node.js",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"homepage": "https://github.com/photostructure/exiftool-vendored.exe#readme",
|
|
@@ -51,11 +51,11 @@
|
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"cross-zip": "^4.0.1",
|
|
54
|
-
"mocha": "^11.7.
|
|
55
|
-
"npm-check-updates": "^19.1.
|
|
54
|
+
"mocha": "^11.7.5",
|
|
55
|
+
"npm-check-updates": "^19.1.2",
|
|
56
56
|
"npm-run-all": "4.1.5",
|
|
57
57
|
"prettier": "^3.6.2",
|
|
58
|
-
"release-it": "^19.0.
|
|
58
|
+
"release-it": "^19.0.6",
|
|
59
59
|
"xml2js": "^0.6.2"
|
|
60
60
|
}
|
|
61
61
|
}
|