exiftool_vendored 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b44cbb111004a5ad11908f51cc4df6fdb3408e89fe85601272c4a842be84530
4
- data.tar.gz: 9fb67bb8d2dc211216e00bfc588ea0da0eead4ca9580feeb4b8dd8a92b7fbec6
3
+ metadata.gz: 769a367333375cb7b0796e2b334c49c8eaed8da6ca289b2de271f9a1a5499b6f
4
+ data.tar.gz: 7e7044a2d8044fe48f633c11b2812ed752e5091c5d19db7153fc415cec06bb95
5
5
  SHA512:
6
- metadata.gz: f572f1cc80a9d132fce1708b51c4f644518df142874e852cf26ff828d8f3840ad9bd130a7d788690d9a682ecd38d703ce732940ee3147bc712094c92928c6714
7
- data.tar.gz: 87ba2fe582b1808334ad6e0a8581eef8153a91c50cad28f9374cd2aee6507aa6c07d0ea0a74769f2e8a87f5f2feca5f5767967d2ca200e2f5b7469fb4e1ab94a
6
+ metadata.gz: 18a51166538f3a2de6aaf41f8d896b30ff5baba653051eb77f16f91b35502c52e7d7c251081a3ee95c8f7efad8c5dcc1731afc284dfc67b1a6f79b879d1b049b
7
+ data.tar.gz: cb7a7f441bd277e0b96ee7caecc3d65dc424eb035fdc6fc6d1a7c9c128d23040ee5d512fc66d0245d3857a9b5c14d38a21e95aa9a55dbd72c426e8711d67b8ab
data/bin/Changes CHANGED
@@ -7,6 +7,21 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 13.36. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Nov. 17, 2025 - Version 13.42
11
+
12
+ - Added warning if tag arguments come before -csv= or -json= in a command
13
+ - Added a new CanonModelID and RFLensType (thanks Norbert Wasser)
14
+ - Added ability to read XML as a block from Sony MP4 videos
15
+ - Added "EOS" to the R5 Mark II CanonModelID string
16
+ - Decode ReEditData in Samsung trailer
17
+ - Decode a couple more Sony rtmd tags from MP4 videos
18
+ - Tolerate some types of trailer corruption as caused by Samsung Gallery
19
+ - Restrict decoding of MetaImageSize to HEIC files only
20
+ - Fixed issue writing Keys tags to Sony PMW-EX1R videos
21
+ - Fixed behaviour of CSV/JSON import when specifying tags to import into an
22
+ existing list, or when importing ValueConv values (ie. "TAG#"), or when
23
+ specifying a group name of "All"
24
+
10
25
  Nov. 5, 2025 - Version 13.41
11
26
 
12
27
  - Added a new Canon LensType
data/bin/META.json CHANGED
@@ -50,6 +50,6 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.41",
53
+ "version" : "13.42",
54
54
  "x_serialization_backend" : "JSON::PP version 4.06"
55
55
  }
data/bin/META.yml CHANGED
@@ -31,5 +31,5 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.41'
34
+ version: '13.42'
35
35
  x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
data/bin/README CHANGED
@@ -111,8 +111,8 @@ your home directory, then you would type the following commands in a
111
111
  terminal window to extract and run ExifTool:
112
112
 
113
113
  cd ~/Desktop
114
- gzip -dc Image-ExifTool-13.41.tar.gz | tar -xf -
115
- cd Image-ExifTool-13.41
114
+ gzip -dc Image-ExifTool-13.42.tar.gz | tar -xf -
115
+ cd Image-ExifTool-13.42
116
116
  ./exiftool t/images/ExifTool.jpg
117
117
 
118
118
  Note: These commands extract meta information from one of the test images.
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.41';
14
+ my $version = '13.42';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -152,9 +152,9 @@ my $countNewDir; # count of directories created
152
152
  my $countSameWr; # count files written OK but not changed
153
153
  my $critical; # flag for critical operations (disable CTRL-C)
154
154
  my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
155
- my $csvAdd; # flag to add CSV information to existing lists
156
155
  my $csvDelim; # delimiter for CSV files
157
- my $csvSaveCount; # save counter for last CSV file loaded
156
+ my $dbAdd; # flag to add CSV/JSON information to existing lists
157
+ my $dbSaveCount; # save counter for last CSV/JSON file loaded
158
158
  my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
159
159
  my $diff; # file name for comparing differences
160
160
  my $disableOutput; # flag to disable normal output
@@ -485,7 +485,7 @@ undef $binSep;
485
485
  undef $binTerm;
486
486
  undef $comma;
487
487
  undef $csv;
488
- undef $csvAdd;
488
+ undef $dbAdd;
489
489
  undef $deleteOrig;
490
490
  undef $diff;
491
491
  undef $disableOutput;
@@ -550,7 +550,7 @@ $countGoodWr = 0;
550
550
  $countNewDir = 0;
551
551
  $countSameWr = 0;
552
552
  $csvDelim = ',';
553
- $csvSaveCount = 0;
553
+ $dbSaveCount = 0;
554
554
  $fileTrailer = '';
555
555
  $filterFlag = 0;
556
556
  $html = 0;
@@ -580,7 +580,7 @@ my $escapeXML; # flag to escape printed values for xml
580
580
  my $setTagsFile; # filename for last TagsFromFile option
581
581
  my $sortOpt; # sort option is used
582
582
  my $srcStdin; # one of the source files is STDIN
583
- my $tagsFrom = ''; # tags on command line come from 'csv' or 'file'
583
+ my $tagsFrom = ''; # tags on command line come from 'CSV' or 'File'
584
584
  my $useMWG; # flag set if we are using any MWG tag
585
585
 
586
586
  my ($argsLeft, @nextPass, $badCmd);
@@ -815,7 +815,7 @@ for (;;) {
815
815
  }
816
816
  # create necessary lists, etc for this new -tagsFromFile file
817
817
  AddSetTagsFile($setTagsFile, { Replace => ($1 and lc($1) eq 'add') ? 0 : 1 } );
818
- $tagsFrom = 'file';
818
+ $tagsFrom = 'File';
819
819
  next;
820
820
  }
821
821
  if ($a eq '@') {
@@ -923,36 +923,50 @@ for (;;) {
923
923
  next;
924
924
  }
925
925
  /^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
926
- if (/^csv(\+?=.*)?$/i) {
927
- my $csvFile = $1;
926
+ if (/^(csv|j(son)?)(\+?=.*)?$/i) {
927
+ my $dbFile = $3;
928
+ my $dbType = lc($1) eq 'csv' ? 'CSV' : 'JSON';
929
+ unless ($dbFile) {
930
+ if ($dbType eq 'CSV') {
931
+ $csv = $dbType;
932
+ } else {
933
+ $json = 1;
934
+ $html = $xml = 0;
935
+ $mt->Options(Duplicates => 1);
936
+ require Image::ExifTool::XMP; # for FixUTF8()
937
+ }
938
+ next;
939
+ }
928
940
  # must process on 2nd pass so -f and -charset options are available
929
941
  unless ($pass) {
942
+ @tags and Warn("Tag arguments should come after the -$1= option\n");
930
943
  push @nextPass, "-$_";
931
- if ($csvFile) {
932
- push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
933
- $csvSaveCount = $saveCount;
934
- $tagsFrom = 'csv';
935
- }
944
+ push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
945
+ $dbSaveCount = $saveCount;
946
+ $tagsFrom = 'CSV';
936
947
  next;
937
948
  }
938
- if ($csvFile) {
939
- $csvFile =~ s/^(\+?=)//;
940
- $csvAdd = 2 if $1 eq '+=';
941
- $vout = \*STDERR if $srcStdin;
942
- $verbose and print $vout "Reading CSV file $csvFile\n";
943
- my $msg;
944
- if ($mt->Open(\*CSVFILE, $csvFile)) {
945
- binmode CSVFILE;
946
- require Image::ExifTool::Import;
949
+ $dbFile =~ s/^(\+?=)//;
950
+ $dbAdd = 2 if $1 eq '+=';
951
+ $vout = \*STDERR if $srcStdin;
952
+ $verbose and print $vout "Reading $dbType file $dbFile\n";
953
+ my $msg;
954
+ if ($mt->Open(\*CSVFILE, $dbFile)) {
955
+ binmode CSVFILE;
956
+ require Image::ExifTool::Import;
957
+ if ($dbType eq 'CSV') {
947
958
  $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
948
- close(CSVFILE);
949
959
  } else {
950
- $msg = "Error opening CSV file '${csvFile}'";
960
+ my $chset = $mt->Options('Charset');
961
+ $msg = Image::ExifTool::Import::ReadJSON(\*CSVFILE, \%database, $forcePrint, $chset);
951
962
  }
952
- $msg and Warn("$msg\n");
953
- $isWriting = 1;
963
+ close(CSVFILE);
964
+ } else {
965
+ $msg = "Error opening $dbType file '${dbFile}'";
954
966
  }
955
- $csv = 'CSV';
967
+ $msg and Warn("$msg\n");
968
+ $isWriting = 1;
969
+ $csv = $dbType;
956
970
  next;
957
971
  }
958
972
  if (/^csvdelim$/i) {
@@ -1115,42 +1129,6 @@ for (;;) {
1115
1129
  push @condition, $cond;
1116
1130
  next;
1117
1131
  }
1118
- if (/^j(son)?(\+?=.*)?$/i) {
1119
- if ($2) {
1120
- # must process on 2nd pass because we need -f and -charset options
1121
- unless ($pass) {
1122
- push @nextPass, "-$_";
1123
- push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
1124
- $csvSaveCount = $saveCount;
1125
- $tagsFrom = 'csv';
1126
- next;
1127
- }
1128
- my $jsonFile = $2;
1129
- $jsonFile =~ s/^(\+?=)//;
1130
- $csvAdd = 2 if $1 eq '+=';
1131
- $vout = \*STDERR if $srcStdin;
1132
- $verbose and print $vout "Reading JSON file $jsonFile\n";
1133
- my $chset = $mt->Options('Charset');
1134
- my $msg;
1135
- if ($mt->Open(\*JSONFILE, $jsonFile)) {
1136
- binmode JSONFILE;
1137
- require Image::ExifTool::Import;
1138
- $msg = Image::ExifTool::Import::ReadJSON(\*JSONFILE, \%database, $forcePrint, $chset);
1139
- close(JSONFILE);
1140
- } else {
1141
- $msg = "Error opening JSON file '${jsonFile}'";
1142
- }
1143
- $msg and Warn("$msg\n");
1144
- $isWriting = 1;
1145
- $csv = 'JSON';
1146
- } else {
1147
- $json = 1;
1148
- $html = $xml = 0;
1149
- $mt->Options(Duplicates => 1);
1150
- require Image::ExifTool::XMP; # for FixUTF8()
1151
- }
1152
- next;
1153
- }
1154
1132
  /^(k|pause)$/i and $pause = 1, next;
1155
1133
  (/^l$/ or $a eq 'long') and --$outFormat, next;
1156
1134
  (/^L$/ or $a eq 'latin') and $mt->Options(Charset => 'Latin'), next;
@@ -1373,7 +1351,7 @@ for (;;) {
1373
1351
  $tag =~ s/\ball\b/\*/ig; # replace 'all' with '*' in tag names
1374
1352
  if (not $tagsFrom) {
1375
1353
  push @exclude, $tag;
1376
- } elsif ($tagsFrom eq 'csv') {
1354
+ } elsif ($tagsFrom eq 'CSV') {
1377
1355
  push @csvExclude, $tag;
1378
1356
  } else {
1379
1357
  push @{$setTags{$setTagsFile}}, "-$tag";
@@ -1420,11 +1398,11 @@ for (;;) {
1420
1398
  } else {
1421
1399
  # assume '-tagsFromFile @' if tags are being redirected
1422
1400
  # and not from CSV and -tagsFromFile hasn't already been specified
1423
- if (not $setTagsFile and $tagsFrom ne 'csv' and /(<|>)/) {
1401
+ if (not $setTagsFile and $tagsFrom ne 'CSV' and /(<|>)/) {
1424
1402
  AddSetTagsFile($setTagsFile = '@');
1425
- $tagsFrom = 'file';
1403
+ $tagsFrom = 'File';
1426
1404
  }
1427
- if ($tagsFrom eq 'csv') {
1405
+ if ($tagsFrom eq 'CSV') {
1428
1406
  my $lst = s/^-// ? \@csvExclude : \@tags;
1429
1407
  push @$lst, $_;
1430
1408
  } elsif ($setTagsFile) {
@@ -1732,7 +1710,7 @@ if (@newValues) {
1732
1710
  $saveCount = $mt->SaveNewValues();
1733
1711
  $needSave = 0;
1734
1712
  # insert marker to load values from CSV file now if this was the CSV file
1735
- push @dynamicFiles, \$csv if $$_{SaveCount} == $csvSaveCount;
1713
+ push @dynamicFiles, \$csv if $$_{SaveCount} == $dbSaveCount;
1736
1714
  }
1737
1715
  next;
1738
1716
  }
@@ -3262,7 +3240,7 @@ sub SetImageInfo($$$)
3262
3240
  next;
3263
3241
  } elsif (ref $dyFile eq 'SCALAR') {
3264
3242
  # set new values from CSV or JSON database
3265
- my ($f, $found, $csvTag, $tg, $csvExifTool);
3243
+ my ($f, $found, $csvTag, $tg, $csvEtPrt, $csvEtVal);
3266
3244
  undef $evalWarning;
3267
3245
  local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
3268
3246
  # force UTF-8 if the database was JSON
@@ -3294,13 +3272,19 @@ sub SetImageInfo($$$)
3294
3272
  }
3295
3273
  if (@tags) {
3296
3274
  # prepare a dummy ExifTool object to hold appropriate tags from the database
3297
- $csvExifTool = Image::ExifTool->new unless $csvExifTool;
3275
+ $csvEtPrt = Image::ExifTool->new unless $csvEtPrt;
3298
3276
  foreach $csvTag (OrderedKeys($csvInfo)) {
3299
3277
  next if $csvTag =~ /^([-_0-9A-Z]+:)*(SourceFile|Directory|FileName)$/i;
3300
3278
  my @grps = split /:/, $csvTag;
3301
3279
  my $name = pop @grps;
3302
- unshift @grps, 'Unknown' while @grps < 2;
3303
- $csvExifTool->FoundTag($name, $$csvInfo{$csvTag}, @grps);
3280
+ unshift @grps, 'All' while @grps < 2;
3281
+ if ($name =~ s/#$//) {
3282
+ # handle ValueConv tags separately
3283
+ $csvEtVal = Image::ExifTool->new unless $csvEtVal;
3284
+ $csvEtVal->FoundTag($name, $$csvInfo{$csvTag}, @grps);
3285
+ } else {
3286
+ $csvEtPrt->FoundTag($name, $$csvInfo{$csvTag}, @grps);
3287
+ }
3304
3288
  }
3305
3289
  next;
3306
3290
  }
@@ -3337,15 +3321,20 @@ ExclMatch: foreach $exclTag (@exclTags) {
3337
3321
  next if $excluded;
3338
3322
  }
3339
3323
  my ($rtn, $wrn) = $et->SetNewValue($csvTag, $$csvInfo{$csvTag},
3340
- Protected => 1, AddValue => $csvAdd,
3341
- ProtectSaved => $csvSaveCount);
3324
+ Protected => 1, AddValue => $dbAdd,
3325
+ ProtectSaved => $dbSaveCount);
3342
3326
  $wrn and Warn "$wrn\n" if $verbose;
3343
3327
  }
3344
3328
  }
3345
3329
  # set specified tags now
3346
- if ($csvExifTool) {
3330
+ if ($csvEtPrt) {
3347
3331
  my @excl = map "-$_", @csvExclude; # add back leading dashes
3348
- $et->SetNewValuesFromFile($csvExifTool, @tags, @excl);
3332
+ my $opts = { AddValue => $dbAdd, Replace => 0 };
3333
+ $et->SetNewValuesFromFile($csvEtPrt, $opts, @tags, @excl);
3334
+ if ($csvEtVal) {
3335
+ $$opts{Type} = 'ValueConv';
3336
+ $et->SetNewValuesFromFile($csvEtVal, $opts, @tags, @excl);
3337
+ }
3349
3338
  }
3350
3339
  $et->Options(Charset => $old) if $csv eq 'JSON';
3351
3340
  unless ($found) {
@@ -5788,12 +5777,15 @@ single command.
5788
5777
 
5789
5778
  Specific tags may be imported from the CSV database by adding B<->I<TAG>
5790
5779
  options to the command after B<-csv=>I<CSVFILE>, or excluded with
5791
- B<-->I<TAG>, with exclusions taking priority. Group names and wildcards are
5792
- allowed, and tags from the CSV may be redirected and written to different
5793
- tags in the target file with support for advanced-formatting expressions
5794
- using the same syntax as the B<-tagsFromFile> feature. If no tags are
5795
- specified, then all tags except FileName, Directory and excluded tags are
5796
- imported (in the same order as the database entries).
5780
+ B<-->I<TAG>, with exclusions taking priority. Group names and wildcards in
5781
+ tag names are allowed, but the group name must match exactly the group in
5782
+ the CSV file (eg. a C<XMP-dc:Subject> column in the CSV file won't match
5783
+ C<-XMP:Subject> on the command line. Also, tags from the CSV may be
5784
+ redirected and written to different tags in the target file with support for
5785
+ advanced-formatting expressions using the same syntax as the
5786
+ B<-tagsFromFile> feature. If no tags are specified, then all tags except
5787
+ FileName, Directory and excluded tags are imported (in the same order as the
5788
+ database entries).
5797
5789
 
5798
5790
  When exporting a CSV file, the B<-g> or B<-G> option adds group names to the
5799
5791
  tag headings. If the B<-a> option is used to allow duplicate tag names, the
@@ -5815,7 +5807,8 @@ List-type tags are stored as simple strings in a CSV file, but the B<-sep>
5815
5807
  option may be used to split them back into separate items when importing.
5816
5808
 
5817
5809
  Special feature: B<-csv>+=I<CSVFILE> may be used to add items to existing
5818
- lists. This affects only list-type tags. Also applies to the B<-j> option.
5810
+ lists in the file. This affects only list-type tags. Also applies to the
5811
+ B<-j> option.
5819
5812
 
5820
5813
  Note that this and the B<-plot> options are fundamentally different than all
5821
5814
  other output format options because they require information from all input
@@ -5984,18 +5977,22 @@ input JSON file may be suffixed with a C<#> to disable print conversion.
5984
5977
 
5985
5978
  Specific tags may be imported from the JSON database by adding B<->I<TAG>
5986
5979
  options to the command after B<-j=>I<JSONFILE>, or excluded with
5987
- B<-->I<TAG>, with exclusions taking priority. Group names and wildcards are
5988
- allowed, and tags from JSON may be redirected and written to different tags
5989
- in the target file with support for advanced-formatting expressions using
5990
- the same syntax as the B<-tagsFromFile> feature. If no tags are specified,
5991
- then all tags except FileName, Directory and excluded tags are imported (in
5992
- the same order as the database entries).
5980
+ B<-->I<TAG>, with exclusions taking priority. Group names and wildcards in
5981
+ tag names are allowed, but the group name must match exactly the group in
5982
+ the JSON file (eg. a C<XMP-dc:Subject> entry in the JSON file won't match
5983
+ C<-XMP:Subject> on the command line. Also, tags from JSON may be redirected
5984
+ and written to different tags in the target file with support for
5985
+ advanced-formatting expressions using the same syntax as the
5986
+ B<-tagsFromFile> feature. If no tags are specified, then all tags except
5987
+ FileName, Directory and excluded tags are imported (in the same order as the
5988
+ database entries).
5993
5989
 
5994
5990
  Unlike CSV import, empty values are not ignored, and will cause an empty
5995
5991
  value to be written if supported by the specific metadata type. Tags are
5996
5992
  deleted by using the B<-f> option and setting the tag value to "-" (or to
5997
5993
  the MissingTagValue setting if this API option was used). Importing with
5998
- B<-j>+=I<JSONFILE> causes new values to be added to existing lists.
5994
+ B<-j>+=I<JSONFILE> causes new values to be added to existing lists in the
5995
+ target file.
5999
5996
 
6000
5997
  =item B<-l> (B<-long>)
6001
5998
 
@@ -6130,7 +6127,7 @@ with this command:
6130
6127
 
6131
6128
  produces output like this:
6132
6129
 
6133
- -- Generated by ExifTool 13.41 --
6130
+ -- Generated by ExifTool 13.42 --
6134
6131
  File: a.jpg - 2003:10:31 15:44:19
6135
6132
  (f/5.6, 1/60s, ISO 100)
6136
6133
  File: b.jpg - 2006:05:23 11:57:38
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.98';
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.10';
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
- my $tagTablePtr = GetTagTable('Image::ExifTool::JSON::Main');
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.58';
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::JSON::Main' },
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
- last unless $buff =~ /^SEFH/ and $len >= 12; # validate SEFH header
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.79';
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 => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1","24000 1001" frame rate?
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 28858 tags, with 17929 unique tag names.
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 JSON
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
- next unless ref $tagInfo eq 'HASH'; # (shouldn't happen, but somehow there is forum17260)
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.41';
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'],
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 13.41
3
+ Version: 13.42
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('13.41.0')
4
+ VERSION = Gem::Version.new('13.42.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.41.0
4
+ version: 13.42.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen