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 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.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 $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 = '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'],
@@ -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, and tags from the CSV may be redirected and
748
- written to different tags in the target file with support for
749
- advanced-formatting expressions using the same syntax as the
750
- -tagsFromFile feature. If no tags are specified, then all tags
751
- except FileName, Directory and excluded tags are imported (in the
752
- same order as the database entries).
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 applies to
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, and tags from JSON may be redirected and written to
948
- different tags in the target file with support for
949
- advanced-formatting expressions using the same syntax as the
950
- -tagsFromFile feature. If no tags are specified, then all tags
951
- except FileName, Directory and excluded tags are imported (in the
952
- same order as the database entries).
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.41 --
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.41.0",
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.4",
55
- "npm-check-updates": "^19.1.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.5",
58
+ "release-it": "^19.0.6",
59
59
  "xml2js": "^0.6.2"
60
60
  }
61
61
  }