exiftool-vendored.exe 12.26.0 → 12.33.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.
Files changed (53) hide show
  1. package/bin/exiftool_files/Changes +119 -4
  2. package/bin/exiftool_files/README +44 -43
  3. package/bin/exiftool_files/arg_files/xmp2exif.args +2 -1
  4. package/bin/exiftool_files/config_files/convert_regions.config +25 -14
  5. package/bin/exiftool_files/config_files/example.config +1 -1
  6. package/bin/exiftool_files/exiftool.pl +79 -66
  7. package/bin/exiftool_files/fmt_files/gpx.fmt +1 -1
  8. package/bin/exiftool_files/fmt_files/gpx_wpt.fmt +1 -1
  9. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +11 -3
  10. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +331 -0
  11. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +26 -7
  12. package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +13 -2
  13. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +98 -4
  14. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +35 -10
  15. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -0
  16. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +13 -2
  17. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +15 -3
  19. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +7 -3
  20. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +60 -26
  21. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +153 -0
  22. package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +60 -59
  23. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +103 -7
  24. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +2 -2
  25. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +14 -3
  26. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +10 -2
  27. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +9 -2
  28. package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +93 -0
  29. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +9 -12
  30. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -6
  31. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +14 -3
  32. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +27 -5
  33. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +6 -0
  34. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +105 -24
  35. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +203 -121
  36. package/bin/exiftool_files/lib/Image/ExifTool/README +5 -2
  37. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +6 -1
  38. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +47 -10
  39. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +85 -34
  40. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +65 -5
  41. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +153 -32
  42. package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +18 -11
  43. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -0
  44. package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +2 -0
  45. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +8 -4
  46. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +3 -0
  47. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +21 -4
  48. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +3 -1
  49. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +3 -1
  50. package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +121 -2
  51. package/bin/exiftool_files/lib/Image/ExifTool.pm +8867 -8835
  52. package/bin/exiftool_files/lib/Image/ExifTool.pod +58 -56
  53. package/package.json +3 -3
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
47
47
  use Image::ExifTool::Exif;
48
48
  use Image::ExifTool::GPS;
49
49
 
50
- $VERSION = '2.64';
50
+ $VERSION = '2.70';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -229,9 +229,10 @@ my %timeInfo = (
229
229
  Writable => 1,
230
230
  Permanent => 1,
231
231
  DelValue => 0,
232
- # It is not uncommon for brain-dead software to use the wrong time zero,
233
- # so assume a time zero of Jan 1, 1970 if the date is before this
232
+ # It is not uncommon for brain-dead software to use the wrong time zero, it should be
233
+ # Jan 1, 1904, so assume a time zero of Jan 1, 1970 if the date is before this
234
234
  # Note: This value will be in UTC if generated by a system that is aware of the time zone
235
+ # (also note: this code is duplicated for the CreateDate tag)
235
236
  RawConv => q{
236
237
  my $offset = (66 * 365 + 17) * 24 * 3600;
237
238
  return $val - $offset if $val >= $offset or $$self{OPTIONS}{QuickTimeUTC};
@@ -733,6 +734,11 @@ my %eeBox2 = (
733
734
  Unknown => 1,
734
735
  Binary => 1,
735
736
  },
737
+ sefd => {
738
+ Name => 'SamsungTrailer',
739
+ SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' },
740
+ },
741
+ # 'samn'? - seen in Vantrue N2S sample video
736
742
  );
737
743
 
738
744
  # MPEG-4 'ftyp' atom
@@ -1194,6 +1200,15 @@ my %eeBox2 = (
1194
1200
  Name => 'CreateDate',
1195
1201
  Groups => { 2 => 'Time' },
1196
1202
  %timeInfo,
1203
+ RawConv => q{
1204
+ my $offset = (66 * 365 + 17) * 24 * 3600;
1205
+ if ($val >= $offset or $$self{OPTIONS}{QuickTimeUTC}) {
1206
+ $val -= $offset;
1207
+ } elsif ($val and not $$self{IsWriting}) {
1208
+ $self->WarnOnce('Patched incorrect time zero for QuickTime date/time tag',1);
1209
+ }
1210
+ return $$self{CreateDate} = $val;
1211
+ },
1197
1212
  # this is int64u if MovieHeaderVersion == 1 (ref 13)
1198
1213
  Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
1199
1214
  },
@@ -2254,6 +2269,12 @@ my %eeBox2 = (
2254
2269
  # opax - 164 bytes unknown (center and affine arrays? ref 26)
2255
2270
  # opai - 32 bytes (maybe contains a serial number starting at byte 16? - PH) (rgb gains, degamma, gamma? ref 26)
2256
2271
  # intv - 16 bytes all zero
2272
+ # ---- Xaiomi ----
2273
+ mcvr => {
2274
+ Name => 'PreviewImage',
2275
+ Groups => { 2 => 'Preview' },
2276
+ Binary => 1,
2277
+ },
2257
2278
  # ---- Unknown ----
2258
2279
  # CDET - 128 bytes (unknown origin)
2259
2280
  # mtyp - 4 bytes all zero (some drone video)
@@ -2691,6 +2712,7 @@ my %eeBox2 = (
2691
2712
  colr => [{
2692
2713
  Name => 'ICC_Profile',
2693
2714
  Condition => '$$valPt =~ /^(prof|rICC)/',
2715
+ Permanent => 0, # (in QuickTime, this writes a zero-length box instead of deleting)
2694
2716
  SubDirectory => {
2695
2717
  TagTable => 'Image::ExifTool::ICC_Profile::Main',
2696
2718
  Start => 4,
@@ -6429,10 +6451,11 @@ my %eeBox2 = (
6429
6451
  # iTunes info ('----') atoms
6430
6452
  %Image::ExifTool::QuickTime::iTunesInfo = (
6431
6453
  PROCESS_PROC => \&ProcessMOV,
6432
- GROUPS => { 2 => 'Audio' },
6454
+ GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
6433
6455
  NOTES => q{
6434
6456
  ExifTool will extract any iTunesInfo tags that exist, even if they are not
6435
- defined in this table.
6457
+ defined in this table. These tags belong to the family 1 "iTunes" group,
6458
+ and are not currently writable.
6436
6459
  },
6437
6460
  # 'mean'/'name'/'data' atoms form a triplet, but unfortunately
6438
6461
  # I haven't been able to find any documentation on this.
@@ -6493,9 +6516,45 @@ my %eeBox2 = (
6493
6516
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::EncodingParams' },
6494
6517
  },
6495
6518
  # also heard about 'iTunPGAP', but I haven't seen a sample
6496
- DISCNUMBER => 'DiscNumber', #PH
6497
- TRACKNUMBER => 'TrackNumber', #PH
6498
- popularimeter => 'Popularimeter', #PH
6519
+ # all tags below were added based on samples I have seen - PH
6520
+ DISCNUMBER => 'DiscNumber',
6521
+ TRACKNUMBER => 'TrackNumber',
6522
+ ARTISTS => 'Artists',
6523
+ CATALOGNUMBER => 'CatalogNumber',
6524
+ RATING => 'Rating',
6525
+ MEDIA => 'Media',
6526
+ SCRIPT => 'Script', # character set? (seen 'Latn')
6527
+ BARCODE => 'Barcode',
6528
+ LABEL => 'Label',
6529
+ MOOD => 'Mood',
6530
+ popularimeter => 'Popularimeter',
6531
+ 'Dynamic Range (DR)'=> 'DynamicRange',
6532
+ initialkey => 'InitialKey',
6533
+ originalyear => 'OriginalYear',
6534
+ originaldate => 'OriginalDate',
6535
+ '~length' => 'Length', # play length? (ie. duration?)
6536
+ replaygain_track_gain=>'ReplayTrackGain',
6537
+ replaygain_track_peak=>'ReplayTrackPeak',
6538
+ 'Volume Level (ReplayGain)'=> 'ReplayVolumeLevel',
6539
+ 'Dynamic Range (R128)'=> 'DynamicRangeR128',
6540
+ 'Volume Level (R128)' => 'VolumeLevelR128',
6541
+ 'Peak Level (Sample)' => 'PeakLevelSample',
6542
+ 'Peak Level (R128)' => 'PeakLevelR128',
6543
+ # also seen (many from forum12777):
6544
+ # 'MusicBrainz Album Release Country'
6545
+ # 'MusicBrainz Album Type'
6546
+ # 'MusicBrainz Album Status'
6547
+ # 'MusicBrainz Track Id'
6548
+ # 'MusicBrainz Release Track Id'
6549
+ # 'MusicBrainz Album Id'
6550
+ # 'MusicBrainz Album Artist Id'
6551
+ # 'MusicBrainz Artist Id'
6552
+ # 'Acoustid Id' (sic)
6553
+ # 'Tool Version'
6554
+ # 'Tool Name'
6555
+ # 'ISRC'
6556
+ # 'HDCD'
6557
+ # 'Waveform'
6499
6558
  );
6500
6559
 
6501
6560
  # iTunes audio encoding parameters
@@ -8864,20 +8923,28 @@ sub ProcessKeys($$$)
8864
8923
  my $ns = substr($$dataPt, $pos + 4, 4);
8865
8924
  my $tag = substr($$dataPt, $pos + 8, $len - 8);
8866
8925
  $tag =~ s/\0.*//s; # truncate at null
8926
+ my $full = $tag;
8867
8927
  $tag =~ s/^com\.(apple\.quicktime\.)?// if $ns eq 'mdta'; # remove apple quicktime domain
8868
8928
  $tag = "Tag_$ns" unless $tag;
8869
- # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
8870
- my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
8871
- unless ($tagInfo) {
8872
- $tagInfo = $et->GetTagInfo($itemList, $tag);
8873
- unless ($tagInfo) {
8929
+ my $short = $tag;
8930
+ my $tagInfo;
8931
+ for (;;) {
8932
+ $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) and last;
8933
+ # also try ItemList and UserData tables
8934
+ $tagInfo = $et->GetTagInfo($itemList, $tag) and last;
8935
+ $tagInfo = $et->GetTagInfo($userData, $tag) and last;
8936
+ # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
8937
+ if ($tag =~ /^\w{3}\xa9$/) {
8938
+ $tag = pack('N', unpack('V', $tag));
8939
+ $tagInfo = $et->GetTagInfo($itemList, $tag) and last;
8874
8940
  $tagInfo = $et->GetTagInfo($userData, $tag);
8875
- if (not $tagInfo and $tag =~ /^\w{3}\xa9$/) {
8876
- $tag = pack('N', unpack('V', $tag));
8877
- $tagInfo = $et->GetTagInfo($itemList, $tag);
8878
- $tagInfo or $tagInfo = $et->GetTagInfo($userData, $tag);
8879
- }
8941
+ last;
8880
8942
  }
8943
+ if ($tag eq $full) {
8944
+ $tag = $short;
8945
+ last;
8946
+ }
8947
+ $tag = $full;
8881
8948
  }
8882
8949
  my ($newInfo, $msg);
8883
8950
  if ($tagInfo) {
@@ -8918,6 +8985,7 @@ sub ProcessKeys($$$)
8918
8985
  delete $$itemList{$id};
8919
8986
  }
8920
8987
  if ($newInfo) {
8988
+ $$newInfo{KeysID} = $tag; # save original ID for use in family 7 group name
8921
8989
  AddTagToTable($itemList, $id, $newInfo);
8922
8990
  $msg or $msg = '';
8923
8991
  $out and print $out "$$et{INDENT}Added ItemList Tag $id = ($ns) $tag$msg\n";
@@ -9045,6 +9113,12 @@ sub ProcessMOV($$;$)
9045
9113
  } else {
9046
9114
  my $t = PrintableTagID($tag,2);
9047
9115
  $et->VPrint(0,"$$et{INDENT}Tag '${t}' extends to end of file");
9116
+ if ($$tagTablePtr{"$tag-size"}) {
9117
+ my $pos = $raf->Tell();
9118
+ $raf->Seek(0, 2);
9119
+ $et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos);
9120
+ $et->HandleTag($tagTablePtr, "$tag-offset", $pos) if $$tagTablePtr{"$tag-offset"};
9121
+ }
9048
9122
  }
9049
9123
  last;
9050
9124
  }
@@ -9271,6 +9345,7 @@ ItemID: foreach $id (keys %$items) {
9271
9345
  Name => $name,
9272
9346
  Description => $desc,
9273
9347
  };
9348
+ $et->VPrint(0, $$et{INDENT}, "[adding QuickTime:$name]\n");
9274
9349
  AddTagToTable($tagTablePtr, $tag, $tagInfo);
9275
9350
  }
9276
9351
  # ignore 8-byte header
@@ -9282,9 +9357,9 @@ ItemID: foreach $id (keys %$items) {
9282
9357
  $val = \$buff;
9283
9358
  }
9284
9359
  }
9285
- undef %triplet;
9360
+ $$tagInfo{List} = 1; # (allow any of these tags to have multiple data elements)
9361
+ $et->VerboseInfo($tag, $tagInfo, Value => $val) if $verbose;
9286
9362
  } else {
9287
- undef %triplet if $tag eq 'mean';
9288
9363
  $triplet{$tag} = substr($val,4) if length($val) > 4;
9289
9364
  undef $tagInfo; # don't store this tag
9290
9365
  }
@@ -9368,7 +9443,13 @@ ItemID: foreach $id (keys %$items) {
9368
9443
  # (shouldn't be null terminated, but some software writes it anyway)
9369
9444
  $value =~ s/\0$// unless $$tagInfo{Binary};
9370
9445
  } else {
9371
- $format = QuickTimeFormat($flags, $len) unless $format;
9446
+ if (not $format) {
9447
+ $format = QuickTimeFormat($flags, $len);
9448
+ } elsif ($format =~ /^int\d+([us])$/) {
9449
+ # adjust integer to available length (but not int64)
9450
+ my $fmt = { 1=>'int8', 2=>'int16', 4=>'int32' }->{$len};
9451
+ $format = $fmt . $1 if defined $fmt;
9452
+ }
9372
9453
  if ($format) {
9373
9454
  $value = ReadValue(\$value, 0, $format, $$tagInfo{Count}, $len);
9374
9455
  } elsif (not $$tagInfo{ValueConv}) {
@@ -9524,9 +9605,9 @@ ItemID: foreach $id (keys %$items) {
9524
9605
  ($size, $tag) = unpack('Na4', $buff);
9525
9606
  ++$index if defined $index;
9526
9607
  }
9527
- # tweak file type based on track content ("iso*" ftyp only)
9528
- if ($$et{VALUE}{FileType} and $$et{VALUE}{FileType} eq 'MP4' and
9529
- $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^iso/ and
9608
+ # tweak file type based on track content ("iso*" and "dash" ftyp only)
9609
+ if ($topLevel and $$et{VALUE}{FileType} and $$et{VALUE}{FileType} eq 'MP4' and
9610
+ $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
9530
9611
  $$et{HasHandler}{soun} and not $$et{HasHandler}{vide})
9531
9612
  {
9532
9613
  $et->OverrideFileType('M4A', 'audio/mp4');