exiftool-vendored.exe 13.41.0 → 13.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/exiftool.exe CHANGED
Binary file
@@ -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.43';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -144,9 +144,9 @@ my $countNewDir; # count of directories created
144
144
  my $countSameWr; # count files written OK but not changed
145
145
  my $critical; # flag for critical operations (disable CTRL-C)
146
146
  my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
147
- my $csvAdd; # flag to add CSV information to existing lists
148
147
  my $csvDelim; # delimiter for CSV files
149
- my $csvSaveCount; # save counter for last CSV file loaded
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 $csvAdd;
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
- $csvSaveCount = 0;
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 'csv' or 'file'
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 = 'file';
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 $csvFile = $1;
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
- if ($csvFile) {
945
- push @newValues, { SaveCount => ++$saveCount }; # marker to save new values now
946
- $csvSaveCount = $saveCount;
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
- if ($csvFile) {
952
- $csvFile =~ s/^(\+?=)//;
953
- $csvAdd = 2 if $1 eq '+=';
954
- $vout = \*STDERR if $srcStdin;
955
- $verbose and print $vout "Reading CSV file $csvFile\n";
956
- my $msg;
957
- if ($mt->Open(\*CSVFILE, $csvFile)) {
958
- binmode CSVFILE;
959
- require Image::ExifTool::Import;
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
- $msg = "Error opening CSV file '${csvFile}'";
973
+ my $chset = $mt->Options('Charset');
974
+ $msg = Image::ExifTool::Import::ReadJSON(\*CSVFILE, \%database, $forcePrint, $chset);
964
975
  }
965
- $msg and Warn("$msg\n");
966
- $isWriting = 1;
976
+ close(CSVFILE);
977
+ } else {
978
+ $msg = "Error opening $dbType file '${dbFile}'";
967
979
  }
968
- $csv = 'CSV';
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 'csv') {
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 'csv' and /(<|>)/) {
1414
+ if (not $setTagsFile and $tagsFrom ne 'CSV' and /(<|>)/) {
1437
1415
  AddSetTagsFile($setTagsFile = '@');
1438
- $tagsFrom = 'file';
1416
+ $tagsFrom = 'File';
1439
1417
  }
1440
- if ($tagsFrom eq 'csv') {
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} == $csvSaveCount;
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, $csvExifTool);
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
- $csvExifTool = Image::ExifTool->new unless $csvExifTool;
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, 'Unknown' while @grps < 2;
3304
- $csvExifTool->FoundTag($name, $$csvInfo{$csvTag}, @grps);
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 => $csvAdd,
3342
- ProtectSaved => $csvSaveCount);
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 ($csvExifTool) {
3331
+ if ($csvEtPrt) {
3348
3332
  my @excl = map "-$_", @csvExclude; # add back leading dashes
3349
- $et->SetNewValuesFromFile($csvExifTool, @tags, @excl);
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.98';
91
+ $VERSION = '5.00';
92
92
 
93
93
  # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
94
94
  # (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -492,6 +492,7 @@ $VERSION = '4.98';
492
492
  '368.12' => 'Sigma 18-35mm f/1.8 DC HSM | A', #50
493
493
  '368.13' => 'Sigma 24-105mm f/4 DG OS HSM | A', #forum3833
494
494
  '368.14' => 'Sigma 18-300mm f/3.5-6.3 DC Macro OS HSM | C', #forum15280 (014)
495
+ '368.15' => 'Sigma 24mm F1.4 DG HSM | A', #50 (015)
495
496
  # Note: LensType 488 (0x1e8) is reported as 232 (0xe8) in 7D CameraSettings
496
497
  488 => 'Canon EF-S 15-85mm f/3.5-5.6 IS USM', #PH
497
498
  489 => 'Canon EF 70-300mm f/4-5.6L IS USM', #Gerald Kapounek
@@ -643,6 +644,7 @@ $VERSION = '4.98';
643
644
  '61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
644
645
  '61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
645
646
  '61182.65' => 'Canon RF 85mm F1.4 L VCM', #github350
647
+ '61182.66' => 'Canon RF 45mm F1.2 STM', #42
646
648
  65535 => 'n/a',
647
649
  );
648
650
 
@@ -1009,10 +1011,11 @@ $VERSION = '4.98';
1009
1011
  0x80000487 => 'EOS R8', #42
1010
1012
  0x80000491 => 'PowerShot V10', #25
1011
1013
  0x80000495 => 'EOS R1', #PH
1012
- 0x80000496 => 'R5 Mark II', #forum16406
1014
+ 0x80000496 => 'EOS R5 Mark II', #forum16406
1013
1015
  0x80000497 => 'PowerShot V1', #PH
1014
1016
  0x80000498 => 'EOS R100', #25
1015
1017
  0x80000516 => 'EOS R50 V', #42
1018
+ 0x80000518 => 'EOS R6 Mark III', #42
1016
1019
  0x80000520 => 'EOS D2000C', #IB
1017
1020
  0x80000560 => 'EOS D6000C', #PH (guess)
1018
1021
  );
@@ -1421,6 +1424,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1421
1424
  Condition => '$$self{Model} =~ /\bEOS (R6m2|R8|R50)$/',
1422
1425
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6m2' },
1423
1426
  },
1427
+ {
1428
+ Name => 'CanonCameraInfoR6m3',
1429
+ Condition => '$$self{Model} =~ /\bEOS R6 Mark III$/',
1430
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6m3' },
1431
+ },
1424
1432
  {
1425
1433
  Name => 'CanonCameraInfoG5XII',
1426
1434
  Condition => '$$self{Model} =~ /\bG5 X Mark II$/',
@@ -4792,6 +4800,22 @@ my %ciMaxFocal = (
4792
4800
  },
4793
4801
  );
4794
4802
 
4803
+ %Image::ExifTool::Canon::CameraInfoR6m3 = (
4804
+ %binaryDataAttrs,
4805
+ FIRST_ENTRY => 0,
4806
+ PRIORITY => 0,
4807
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4808
+ NOTES => 'CameraInfo tags for the EOS R6 Mark II.',
4809
+ 0x086d => { #forum17745
4810
+ Name => 'ShutterCount',
4811
+ Format => 'int32u',
4812
+ # (upper 2 bytes are currently unknown for this tag in JPEG images --
4813
+ # we need samples ideally spanning the 65536 count)
4814
+ RawConv => '$$self{PATH}[2] eq "UUID-Canon" ? $val : $val & 0xffff',
4815
+ Notes => 'includes electronic + mechanical shutter',
4816
+ },
4817
+ );
4818
+
4795
4819
  # ref https://exiftool.org/forum/index.php?topic=15356.0
4796
4820
  %Image::ExifTool::Canon::CameraInfoG5XII = (
4797
4821
  %binaryDataAttrs,
@@ -7053,6 +7077,7 @@ my %ciMaxFocal = (
7053
7077
  326 => 'Canon RF 24mm F1.4 L VCM', #42
7054
7078
  327 => 'Canon RF 20mm F1.4 L VCM', #42
7055
7079
  328 => 'Canon RF 85mm F1.4 L VCM', #42/github350
7080
+ 330 => 'Canon RF 45mm F1.2 STM', #42
7056
7081
  # Note: add new RF lenses to %canonLensTypes with ID 61182
7057
7082
  },
7058
7083
  },
@@ -14,9 +14,9 @@ use vars qw($VERSION);
14
14
  use Image::ExifTool qw(:DataAccess :Utils);
15
15
  use Image::ExifTool::Import;
16
16
 
17
- $VERSION = '1.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)) {
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
  use Image::ExifTool::Exif;
39
39
 
40
- $VERSION = '2.26';
40
+ $VERSION = '2.27';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -916,13 +916,21 @@ my %shootingMode = (
916
916
  Name => 'AFPointPosition',
917
917
  Writable => 'rational64u',
918
918
  Count => 2,
919
- Notes => 'X Y coordinates of primary AF area center, in the range 0.0 to 1.0',
919
+ Notes => q{
920
+ X Y coordinates of primary AF area center, in the range 0.0 to 1.0, or
921
+ "n/a" or "none" for invalid values
922
+ },
920
923
  PrintConv => q{
921
924
  return 'none' if $val eq '16777216 16777216';
925
+ return 'n/a' if $val =~ /^4194303\.9/;
922
926
  my @a = split ' ', $val;
923
927
  sprintf("%.2g %.2g",@a);
924
928
  },
925
- PrintConvInv => '$val eq "none" ? "16777216 16777216" : $val',
929
+ PrintConvInv => q{
930
+ return '16777216 16777216' if $val eq 'none';
931
+ return '4294967295/1024 4294967295/1024' if $val eq 'n/a';
932
+ return $val;
933
+ },
926
934
  },
927
935
  0x4e => { #PH
928
936
  Name => 'FaceDetInfo',
@@ -1441,8 +1449,8 @@ my %shootingMode = (
1441
1449
  Writable => 'rational64u',
1442
1450
  Notes => 'relative to size of image. "n/a" for manual focus',
1443
1451
  Count => 2,
1444
- PrintConv => '$val =~ /^4194303.999/ ? "n/a" : $val',
1445
- PrintConvInv => '$val eq "n/a" ? "4194303.999 4194303.999" : $val',
1452
+ PrintConv => '$val =~ /^4194303\.9/ ? "n/a" : $val',
1453
+ PrintConvInv => '$val eq "n/a" ? "4294967295/1024 4294967295/1024" : $val',
1446
1454
  },
1447
1455
  0xe4 => { #IB
1448
1456
  Name => 'LensTypeModel',
@@ -49,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
49
49
  use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
 
52
- $VERSION = '3.23';
52
+ $VERSION = '3.24';
53
53
 
54
54
  sub ProcessMOV($$;$);
55
55
  sub ProcessKeys($$$);
@@ -494,6 +494,7 @@ my %qtFlags = ( #12
494
494
  ispe => 1, # primary item must have an ispe and pixi, so no need to inherit these
495
495
  pixi => 1,
496
496
  irot => 1, # (tmap may have a different irot)
497
+ imir => 1, # (ditto)
497
498
  pasp => 1, # (NC)
498
499
  hvcC => 2, # (hvcC is a property of hvc1 referred to by primary grid)
499
500
  colr => 2, # (colr is a property of primary grid or hvc1 referred to by primary)
@@ -2833,6 +2834,7 @@ my %userDefined = (
2833
2834
  'xml ' => {
2834
2835
  Name => 'XML',
2835
2836
  Flags => [ 'Binary', 'Protected' ],
2837
+ BlockExtract => 1,
2836
2838
  SubDirectory => {
2837
2839
  TagTable => 'Image::ExifTool::XMP::XML',
2838
2840
  IgnoreProp => { NonRealTimeMeta => 1 }, # ignore container for Sony 'nrtm'
@@ -2883,6 +2885,7 @@ my %userDefined = (
2883
2885
  },
2884
2886
  idat => {
2885
2887
  Name => 'MetaImageSize', #PH (NC)
2888
+ Condition => '$$self{FileType} eq "HEIC"',
2886
2889
  Format => 'int16u',
2887
2890
  # (don't know what the first two numbers are for)
2888
2891
  PrintConv => '$val =~ s/^(\d+) (\d+) (\d+) (\d+)/${3}x$4/; $val',
@@ -2968,7 +2971,6 @@ my %userDefined = (
2968
2971
  Condition => '$$valPt =~ /^(prof|rICC)/',
2969
2972
  # (don't do this because Apple Preview won't display an HEIC with a 0-length profile)
2970
2973
  # Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
2971
- Permanent => 1,
2972
2974
  SubDirectory => {
2973
2975
  TagTable => 'Image::ExifTool::ICC_Profile::Main',
2974
2976
  Start => 4,
@@ -2989,6 +2991,22 @@ my %userDefined = (
2989
2991
  3 => 'Rotate 90 CW',
2990
2992
  },
2991
2993
  },
2994
+ imir => { # (applied before rotation)
2995
+ Name => 'Mirroring',
2996
+ Format => 'int8u',
2997
+ # yes, I realize this making this writable is useless without the ability to
2998
+ # create/delete this box because it is the existence of this box that is
2999
+ # significant. (The people who wrote the specification succeeded in making
3000
+ # this as complicated as possible because creating/deleting boxes from the
3001
+ # item property container is a real pain in the ass!)
3002
+ Writable => 'int8u',
3003
+ Protected => 1,
3004
+ PrintConv => {
3005
+ 0 => 'Vertical',
3006
+ 1 => 'Horizontal',
3007
+ # (it would have been great if the specification allowed for a "no mirroring" value)
3008
+ },
3009
+ },
2992
3010
  ispe => {
2993
3011
  Name => 'ImageSpatialExtent',
2994
3012
  Condition => '$$valPt =~ /^\0{4}/', # (version/flags == 0/0)
@@ -6620,7 +6638,7 @@ my %userDefined = (
6620
6638
  This directory contains a list of key names which are used to decode tags
6621
6639
  written by the "mdta" handler. Also in this table are a few tags found in
6622
6640
  timed metadata that are not yet writable by ExifTool. The prefix of
6623
- "com.apple.quicktime." has been removed from the TagID's below. These tags
6641
+ "com.apple.quicktime." has been removed from most TagID's below. These tags
6624
6642
  support alternate languages in the same way as the
6625
6643
  L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> tags. Note
6626
6644
  that by default,
@@ -6714,14 +6732,17 @@ my %userDefined = (
6714
6732
  'encoder' => { }, # forum15418 (written by ffmpeg)
6715
6733
  #
6716
6734
  # the following tags aren't in the com.apple.quicktime namespace:
6735
+ # (Note: must add any non-'com' prefix to %fullKeysID in WriteQuickTime.pl
6736
+ # to avoid adding the 'com.apple.quicktime' prefix when writing)
6717
6737
  #
6718
6738
  'com.android.version' => 'AndroidVersion',
6719
6739
  'com.android.capture.fps' => { Name => 'AndroidCaptureFPS', Writable => 'float' },
6720
6740
  'com.android.manufacturer' => 'AndroidMake',
6721
6741
  'com.android.model' => 'AndroidModel',
6722
6742
  'com.xiaomi.preview_video_cover' => { Name => 'XiaomiPreviewVideoCover', Writable => 'int32s' },
6723
- 'xiaomi.exifInfo.videoinfo' => 'XiaomiExifInfo',
6724
6743
  'com.xiaomi.hdr10' => { Name => 'XiaomiHDR10', Writable => 'int32s' },
6744
+ 'xiaomi.exifInfo.videoinfo' => 'XiaomiExifInfo',
6745
+ 'samsung.android.utc_offset' => { Name => 'AndroidTimeZone', Groups => { 2 => 'Time' } },
6725
6746
  #
6726
6747
  # also seen
6727
6748
  #
@@ -9774,6 +9795,7 @@ sub ProcessKeys($$$)
9774
9795
  $name = "Tag_$name" if length $name < 2;
9775
9796
  $newInfo = { Name => $name, Groups => { 1 => 'Keys' } };
9776
9797
  $msg = ' (Unknown)';
9798
+ $et->VPrint(0, $$et{INDENT}, "[adding Keys:$tag]\n");
9777
9799
  }
9778
9800
  # substitute this tag in the ItemList table with the given index
9779
9801
  my $id = $$et{KeysCount} . '.' . $index;
@@ -211,7 +211,7 @@ my %insvLimit = (
211
211
  },
212
212
  },{
213
213
  Name => 'gpmd_Wolfbox', # Wolfbox G900 Dashcam and Redtiger F9 4K
214
- Condition => '$$valPt =~ /^.{136}0{16}(HYTH|XXXX)/s',
214
+ Condition => '$$valPt =~ /^.{136}(0{16}[A-Z]{4}|https:\/\/www.redtiger\0)/s',
215
215
  SubDirectory => {
216
216
  TagTable => 'Image::ExifTool::QuickTime::Stream',
217
217
  ProcessProc => \&ProcessWolfbox,
@@ -30,7 +30,7 @@ use strict;
30
30
  use vars qw($VERSION $AUTOLOAD);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
 
33
- $VERSION = '1.72';
33
+ $VERSION = '1.73';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -851,6 +851,7 @@ my %code2charset = (
851
851
  Name => 'DateCreated',
852
852
  Groups => { 2 => 'Time' },
853
853
  ValueConv => '$_=$val; s/-/:/g; $_',
854
+ PrintConv => '$self->ConvertDateTime($val)',
854
855
  },
855
856
  ICRP => 'Cropped',
856
857
  IDIM => 'Dimensions',