exiftool_vendored 12.42.0 → 12.52.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 (84) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +226 -6
  3. data/bin/MANIFEST +14 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -44
  7. data/bin/config_files/acdsee.config +2 -1
  8. data/bin/config_files/frameCount.config +56 -0
  9. data/bin/config_files/tiff_version.config +1 -1
  10. data/bin/exiftool +116 -97
  11. data/bin/fmt_files/gpx.fmt +3 -0
  12. data/bin/fmt_files/gpx_wpt.fmt +3 -0
  13. data/bin/lib/Image/ExifTool/Apple.pm +16 -3
  14. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
  15. data/bin/lib/Image/ExifTool/Canon.pm +66 -37
  16. data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  17. data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  18. data/bin/lib/Image/ExifTool/Casio.pm +3 -3
  19. data/bin/lib/Image/ExifTool/DJI.pm +2 -1
  20. data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  21. data/bin/lib/Image/ExifTool/EXE.pm +9 -1
  22. data/bin/lib/Image/ExifTool/Exif.pm +17 -12
  23. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  24. data/bin/lib/Image/ExifTool/FLIR.pm +9 -7
  25. data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
  26. data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
  27. data/bin/lib/Image/ExifTool/GPS.pm +31 -5
  28. data/bin/lib/Image/ExifTool/Geotag.pm +36 -8
  29. data/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
  30. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  31. data/bin/lib/Image/ExifTool/ID3.pm +6 -6
  32. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  33. data/bin/lib/Image/ExifTool/JPEG.pm +1 -0
  34. data/bin/lib/Image/ExifTool/Jpeg2000.pm +24 -3
  35. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  36. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  37. data/bin/lib/Image/ExifTool/Lang/fr.pm +6015 -759
  38. data/bin/lib/Image/ExifTool/Lang/sk.pm +1927 -0
  39. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  40. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  41. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  42. data/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
  43. data/bin/lib/Image/ExifTool/Matroska.pm +272 -48
  44. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  45. data/bin/lib/Image/ExifTool/Nikon.pm +746 -382
  46. data/bin/lib/Image/ExifTool/NikonCustom.pm +139 -106
  47. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  48. data/bin/lib/Image/ExifTool/Olympus.pm +6 -4
  49. data/bin/lib/Image/ExifTool/PNG.pm +8 -1
  50. data/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
  51. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  52. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  53. data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
  54. data/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
  55. data/bin/lib/Image/ExifTool/QuickTime.pm +166 -13
  56. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +161 -22
  57. data/bin/lib/Image/ExifTool/README +15 -4
  58. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  59. data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  60. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  61. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  62. data/bin/lib/Image/ExifTool/Sony.pm +75 -47
  63. data/bin/lib/Image/ExifTool/TagInfoXML.pm +13 -6
  64. data/bin/lib/Image/ExifTool/TagLookup.pm +4791 -4519
  65. data/bin/lib/Image/ExifTool/TagNames.pod +2056 -1446
  66. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  67. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  68. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  69. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  70. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  71. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  72. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  73. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +12 -7
  74. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  75. data/bin/lib/Image/ExifTool/WriteXMP.pl +15 -1
  76. data/bin/lib/Image/ExifTool/Writer.pl +46 -18
  77. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  78. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  79. data/bin/lib/Image/ExifTool/ZIP.pm +19 -7
  80. data/bin/lib/Image/ExifTool.pm +146 -38
  81. data/bin/lib/Image/ExifTool.pod +83 -69
  82. data/bin/perl-Image-ExifTool.spec +43 -43
  83. data/lib/exiftool_vendored/version.rb +1 -1
  84. metadata +10 -4
@@ -6,14 +6,16 @@
6
6
  # Revisions: 2019-10-23 - P. Harvey Created
7
7
  #
8
8
  # References: 1) https://developer.parrot.com/docs/pdraw/metadata.html
9
+ # --> changed to https://developer.parrot.com/docs/pdraw/video-metadata.html
9
10
  #------------------------------------------------------------------------------
10
11
 
11
12
  package Image::ExifTool::Parrot;
12
13
 
13
14
  use strict;
14
15
  use vars qw($VERSION);
16
+ use Image::ExifTool qw(:DataAccess :Utils);
15
17
 
16
- $VERSION = '1.01';
18
+ $VERSION = '1.02';
17
19
 
18
20
  sub Process_mett($$$);
19
21
 
@@ -21,7 +23,10 @@ sub Process_mett($$$);
21
23
  %Image::ExifTool::Parrot::mett = (
22
24
  PROCESS_PROC => \&Process_mett,
23
25
  # put the 'P' records first in the documentation
24
- VARS => { SORT_PROC => sub { my ($a,$b)=@_; $a=~s/P/A/; $b=~s/P/A/; $a cmp $b } },
26
+ VARS => {
27
+ SORT_PROC => sub { my ($a,$b)=@_; $a=~s/P/A/; $b=~s/P/A/; $a cmp $b },
28
+ LONG_TAGS => 1
29
+ },
25
30
  NOTES => q{
26
31
  Streaming metadata found in Parrot drone videos. See
27
32
  L<https://developer.parrot.com/docs/pdraw/metadata.html> for the
@@ -51,6 +56,23 @@ sub Process_mett($$$);
51
56
  Name => 'ParrotAutomation',
52
57
  SubDirectory => { TagTable => 'Image::ExifTool::Parrot::Automation' },
53
58
  },
59
+ # timed metadata written by ARCore (see forum13653)
60
+ 'application/arcore-accel' => {
61
+ Name => 'ARCoreAccel',
62
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreAccel', ByteOrder => 'II' },
63
+ },
64
+ 'application/arcore-gyro' => {
65
+ Name => 'ARCoreGyro',
66
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreGyro', ByteOrder => 'II' },
67
+ },
68
+ 'application/arcore-video-0' => {
69
+ Name => 'ARCoreVideo',
70
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreVideo', ByteOrder => 'II' },
71
+ },
72
+ 'application/arcore-custom-event' => {
73
+ Name => 'ARCoreCustom',
74
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreCustom', ByteOrder => 'II' },
75
+ },
54
76
  );
55
77
 
56
78
  # tags found in the Parrot 'mett' V1 timed metadata (ref 1) [untested]
@@ -629,6 +651,69 @@ sub Process_mett($$$);
629
651
  },
630
652
  );
631
653
 
654
+ # ARCore Accel data (ref PH)
655
+ %Image::ExifTool::Parrot::ARCoreAccel = (
656
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
657
+ GROUPS => { 2 => 'Location' },
658
+ NOTES => 'ARCore accelerometer data.',
659
+ FIRST_ENTRY => 0,
660
+ # 00-04: always 10 34 16 1 29
661
+ 4 => {
662
+ Name => 'AccelerometerUnknown',
663
+ Format => 'undef[16]',
664
+ Unknown => 1,
665
+ ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)',
666
+ },
667
+ 5 => { # (NC)
668
+ Name => 'Accelerometer',
669
+ Format => 'undef[14]',
670
+ RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
671
+ },
672
+ # 05-08: float Accelerometer X
673
+ # 09: 37
674
+ # 10-13: float Accelerometer Y
675
+ # 14: 45
676
+ # 15-18: float Accelerometer Z
677
+ # 19: 48
678
+ # 20-24: 128-255
679
+ # 25: 246 then 247
680
+ # 26: 188
681
+ # 27: 2
682
+ # 28: 56
683
+ # 29-32: 128-255
684
+ # 33: increments slowly (about once every 56 samples or so)
685
+ );
686
+
687
+ # ARCore Gyro data (ref PH)
688
+ %Image::ExifTool::Parrot::ARCoreGyro = (
689
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
690
+ GROUPS => { 2 => 'Location' },
691
+ NOTES => 'ARCore accelerometer data.',
692
+ FIRST_ENTRY => 0,
693
+ # 00-04: always 10 34 16 3 29
694
+ 4 => {
695
+ Name => 'GyroscopeUnknown',
696
+ Format => 'undef[16]',
697
+ Unknown => 1, # always "29 37 45 48" in my sample, just like AccelerometerUnknown
698
+ ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)',
699
+ },
700
+ 5 => { # (NC)
701
+ Name => 'Gyroscope',
702
+ Format => 'undef[14]',
703
+ RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
704
+ },
705
+ );
706
+
707
+ %Image::ExifTool::Parrot::ARCoreVideo = (
708
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
709
+ FIRST_ENTRY => 0,
710
+ );
711
+
712
+ %Image::ExifTool::Parrot::ARCoreCustom = (
713
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
714
+ FIRST_ENTRY => 0,
715
+ );
716
+
632
717
  %Image::ExifTool::Parrot::Composite = (
633
718
  GPSDateTime => {
634
719
  Description => 'GPS Date/Time',
@@ -676,9 +761,18 @@ sub Process_mett($$$)
676
761
  my $dataPos = $$dirInfo{DataPos};
677
762
  my $dirEnd = length $$dataPt;
678
763
  my $pos = $$dirInfo{DirStart} || 0;
764
+ my $metaType = $$et{MetaType} || '';
679
765
 
680
766
  $et->VerboseDir('Parrot mett', undef, $dirEnd);
681
767
 
768
+ if ($$tagTbl{$metaType}) {
769
+ $et->HandleTag($tagTbl, $metaType, undef,
770
+ DataPt => $dataPt,
771
+ DataPos => $dataPos,
772
+ Base => $$dirInfo{Base},
773
+ );
774
+ return 1;
775
+ }
682
776
  while ($pos + 4 < $dirEnd) {
683
777
  my ($id, $nwords) = unpack("x${pos}a2n", $$dataPt);
684
778
  my $size;
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
58
58
  use Image::ExifTool::GPS;
59
59
  use Image::ExifTool::HP;
60
60
 
61
- $VERSION = '3.40';
61
+ $VERSION = '3.41';
62
62
 
63
63
  sub CryptShutterCount($$);
64
64
  sub PrintFilter($$$);
@@ -365,10 +365,15 @@ sub DecodeAFPoints($$$$;$);
365
365
  '8 255.4' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #PH
366
366
  '8 255.5' => 'Sigma 50-200mm F4-5.6 DC OS', #26
367
367
  '8 255.6' => 'Sigma 24-70mm F2.8 EX DG HSM', #29
368
+
369
+ '9 0' => '645 Manual Lens', #PH (NC)
370
+ '9 3' => 'HD PENTAX-FA 43mm F1.9 Limited', #IB
371
+ '9 24' => 'HD PENTAX-FA 77mm F1.8 Limited', #IB
372
+ '9 39' => 'HD PENTAX-FA 31mm F1.8 AL Limited', #IB
373
+ '9 247' => 'HD PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED [IF]', #IB
368
374
  #
369
375
  # 645 lenses
370
376
  #
371
- '9 0' => '645 Manual Lens', #PH (NC)
372
377
  '10 0' => '645 A Series Lens', #PH
373
378
  '11 1' => 'smc PENTAX-FA 645 75mm F2.8', #PH
374
379
  '11 2' => 'smc PENTAX-FA 645 45mm F2.8', #PH
@@ -25,15 +25,28 @@
25
25
  package Image::ExifTool::Photoshop;
26
26
 
27
27
  use strict;
28
- use vars qw($VERSION $AUTOLOAD $iptcDigestInfo);
28
+ use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
29
29
  use Image::ExifTool qw(:DataAccess :Utils);
30
30
 
31
- $VERSION = '1.65';
31
+ $VERSION = '1.67';
32
32
 
33
33
  sub ProcessPhotoshop($$$);
34
34
  sub WritePhotoshop($$$);
35
35
  sub ProcessLayers($$$);
36
36
 
37
+ # PrintFlags bit definitions (ref forum13785)
38
+ %printFlags = (
39
+ 0 => 'Labels',
40
+ 1 => 'Corner crop marks',
41
+ 2 => 'Color bars', # (deprecated)
42
+ 3 => 'Registration marks',
43
+ 4 => 'Negative',
44
+ 5 => 'Emulsion down',
45
+ 6 => 'Interpolate', # (deprecated)
46
+ 7 => 'Description',
47
+ 8 => 'Print flags',
48
+ );
49
+
37
50
  # map of where information is stored in PSD image
38
51
  my %psdMap = (
39
52
  IPTC => 'Photoshop',
@@ -106,7 +119,17 @@ my %unicodeString = (
106
119
  0x03f0 => { Unknown => 1, Name => 'PStringCaption' },
107
120
  0x03f1 => { Unknown => 1, Name => 'BorderInformation' },
108
121
  0x03f2 => { Unknown => 1, Name => 'BackgroundColor' },
109
- 0x03f3 => { Unknown => 1, Name => 'PrintFlags', Format => 'int8u' },
122
+ 0x03f3 => {
123
+ Unknown => 1,
124
+ Name => 'PrintFlags',
125
+ Format => 'int8u',
126
+ PrintConv => q{
127
+ my $byte = 0;
128
+ my @bits = $val =~ /\d+/g;
129
+ $byte = ($byte << 1) | ($_ ? 1 : 0) foreach reverse @bits;
130
+ return DecodeBits($byte, \%Image::ExifTool::Photoshop::printFlags);
131
+ },
132
+ },
110
133
  0x03f4 => { Unknown => 1, Name => 'BW_HalftoningInfo' },
111
134
  0x03f5 => { Unknown => 1, Name => 'ColorHalftoningInfo' },
112
135
  0x03f6 => { Unknown => 1, Name => 'DuotoneHalftoningInfo' },
@@ -332,6 +355,7 @@ my %unicodeString = (
332
355
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
333
356
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
334
357
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
358
+ DATAMEMBER => [ 1 ],
335
359
  FORMAT => 'int16s',
336
360
  GROUPS => { 2 => 'Image' },
337
361
  0 => {
@@ -342,6 +366,7 @@ my %unicodeString = (
342
366
  },
343
367
  1 => {
344
368
  Name => 'PhotoshopFormat',
369
+ RawConv => '$$self{PhotoshopFormat} = $val',
345
370
  PrintConv => {
346
371
  0x0000 => 'Standard',
347
372
  0x0001 => 'Optimized',
@@ -350,6 +375,7 @@ my %unicodeString = (
350
375
  },
351
376
  2 => {
352
377
  Name => 'ProgressiveScans',
378
+ Condition => '$$self{PhotoshopFormat} == 0x0101',
353
379
  PrintConv => {
354
380
  1 => '3 Scans',
355
381
  2 => '4 Scans',
@@ -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.74';
50
+ $VERSION = '2.81';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -66,6 +66,7 @@ sub ProcessRIFFTrailer($$$);
66
66
  sub ProcessTTAD($$$);
67
67
  sub ProcessNMEA($$$);
68
68
  sub ProcessGPSLog($$$);
69
+ sub ProcessGarminGPS($$$);
69
70
  sub SaveMetaKeys($$$);
70
71
  # ++^^^^^^^^^^^^++
71
72
  sub ParseItemLocation($$);
@@ -521,6 +522,12 @@ my %eeBox2 = (
521
522
  return substr($val, 12, $len);
522
523
  },
523
524
  },
525
+ {
526
+ Name => 'SkipInfo', # (found in 70mai Pro Plus+ MP4 videos)
527
+ # (look for something that looks like a QuickTime atom header)
528
+ Condition => '$$valPt =~ /^\0[\0-\x04]..[a-zA-Z ]{4}/s',
529
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::SkipInfo' },
530
+ },
524
531
  { Name => 'Skip', Unknown => 1, Binary => 1 },
525
532
  ],
526
533
  wide => { Unknown => 1, Binary => 1 },
@@ -556,12 +563,16 @@ my %eeBox2 = (
556
563
  mdat => { Name => 'MediaData', Unknown => 1, Binary => 1 },
557
564
  'mdat-size' => {
558
565
  Name => 'MediaDataSize',
566
+ RawConv => '$$self{MediaDataSize} = $val',
559
567
  Notes => q{
560
568
  not a real tag ID, this tag represents the size of the 'mdat' data in bytes
561
569
  and is used in the AvgBitrate calculation
562
570
  },
563
571
  },
564
- 'mdat-offset' => 'MediaDataOffset',
572
+ 'mdat-offset' => {
573
+ Name => 'MediaDataOffset',
574
+ RawConv => '$$self{MediaDataOffset} = $val',
575
+ },
565
576
  junk => { Unknown => 1, Binary => 1 }, #8
566
577
  uuid => [
567
578
  { #9 (MP4 files)
@@ -754,6 +765,19 @@ my %eeBox2 = (
754
765
  # 'samn'? - seen in Vantrue N2S sample video
755
766
  );
756
767
 
768
+ # stuff seen in 'skip' atom (70mai Pro Plus+ MP4 videos)
769
+ %Image::ExifTool::QuickTime::SkipInfo = (
770
+ PROCESS_PROC => \&ProcessMOV,
771
+ GROUPS => { 2 => 'Video' },
772
+ 'ver ' => 'Version',
773
+ # tima - int32u: seen 0x3c
774
+ thma => {
775
+ Name => 'ThumbnailImage',
776
+ Groups => { 2 => 'Preview' },
777
+ Binary => 1,
778
+ },
779
+ );
780
+
757
781
  # MPEG-4 'ftyp' atom
758
782
  # (ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html)
759
783
  %Image::ExifTool::QuickTime::FileType = (
@@ -897,7 +921,7 @@ my %eeBox2 = (
897
921
  },
898
922
  colr => {
899
923
  Name => 'ColorRepresentation',
900
- ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
924
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
901
925
  },
902
926
  pasp => {
903
927
  Name => 'PixelAspectRatio',
@@ -1118,6 +1142,23 @@ my %eeBox2 = (
1118
1142
  Start => 16,
1119
1143
  },
1120
1144
  },
1145
+ {
1146
+ Name => 'GarminGPS',
1147
+ Condition => '$$valPt=~/^\x9b\x63\x0f\x8d\x63\x74\x40\xec\x82\x04\xbc\x5f\xf5\x09\x17\x28/ and $$self{OPTIONS}{ExtractEmbedded}',
1148
+ SubDirectory => {
1149
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
1150
+ ProcessProc => \&ProcessGarminGPS,
1151
+ },
1152
+ },
1153
+ {
1154
+ Name => 'GarminGPS',
1155
+ Condition => '$$valPt=~/^\x9b\x63\x0f\x8d\x63\x74\x40\xec\x82\x04\xbc\x5f\xf5\x09\x17\x28/',
1156
+ Notes => 'Garmin GPS sensor data',
1157
+ RawConv => q{
1158
+ $self->WarnOnce('Use the ExtractEmbedded option to decode timed Garmin GPS',3);
1159
+ return \$val;
1160
+ },
1161
+ },
1121
1162
  {
1122
1163
  Name => 'UUID-Unknown',
1123
1164
  %unknownInfo,
@@ -1311,12 +1352,14 @@ my %eeBox2 = (
1311
1352
  },
1312
1353
  { #https://github.com/google/spatial-media/blob/master/docs/spherical-video-rfc.md
1313
1354
  Name => 'SphericalVideoXML',
1355
+ # (this tag is readable/writable as a block through the Extra SphericalVideoXML tags)
1314
1356
  Condition => '$$valPt=~/^\xff\xcc\x82\x63\xf8\x55\x4a\x93\x88\x14\x58\x7a\x02\x52\x1f\xdd/',
1315
1357
  WriteGroup => 'GSpherical', # write only GSpherical XMP tags here
1316
1358
  HandlerType => 'vide', # only write in video tracks
1317
1359
  SubDirectory => {
1318
1360
  TagTable => 'Image::ExifTool::XMP::Main',
1319
1361
  Start => 16,
1362
+ ProcessProc => 'Image::ExifTool::XMP::ProcessGSpherical',
1320
1363
  WriteProc => 'Image::ExifTool::XMP::WriteGSpherical',
1321
1364
  },
1322
1365
  },
@@ -2732,7 +2775,7 @@ my %eeBox2 = (
2732
2775
  },
2733
2776
  },{
2734
2777
  Name => 'ColorRepresentation',
2735
- ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
2778
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
2736
2779
  }],
2737
2780
  irot => {
2738
2781
  Name => 'Rotation',
@@ -2792,6 +2835,78 @@ my %eeBox2 = (
2792
2835
  },
2793
2836
  );
2794
2837
 
2838
+ # ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
2839
+ %Image::ExifTool::QuickTime::ColorRep = (
2840
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2841
+ GROUPS => { 2 => 'Video' },
2842
+ FIRST_ENTRY => 0,
2843
+ 0 => { Name => 'ColorProfiles', Format => 'undef[4]' },
2844
+ 4 => {
2845
+ Name => 'ColorPrimaries',
2846
+ Format => 'int16u',
2847
+ PrintConv => {
2848
+ 1 => 'BT.709',
2849
+ 2 => 'Unspecified',
2850
+ 4 => 'BT.470 System M (historical)',
2851
+ 5 => 'BT.470 System B, G (historical)',
2852
+ 6 => 'BT.601',
2853
+ 7 => 'SMPTE 240',
2854
+ 8 => 'Generic film (color filters using illuminant C)',
2855
+ 9 => 'BT.2020, BT.2100',
2856
+ 10 => 'SMPTE 428 (CIE 1921 XYZ)',
2857
+ 11 => 'SMPTE RP 431-2',
2858
+ 12 => 'SMPTE EG 432-1',
2859
+ 22 => 'EBU Tech. 3213-E',
2860
+ },
2861
+ },
2862
+ 6 => {
2863
+ Name => 'TransferCharacteristics',
2864
+ Format => 'int16u',
2865
+ PrintConv => {
2866
+ 0 => 'For future use (0)',
2867
+ 1 => 'BT.709',
2868
+ 2 => 'Unspecified',
2869
+ 3 => 'For future use (3)',
2870
+ 4 => 'BT.470 System M (historical)',
2871
+ 5 => 'BT.470 System B, G (historical)',
2872
+ 6 => 'BT.601',
2873
+ 7 => 'SMPTE 240 M',
2874
+ 8 => 'Linear',
2875
+ 9 => 'Logarithmic (100 : 1 range)',
2876
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
2877
+ 11 => 'IEC 61966-2-4',
2878
+ 12 => 'BT.1361',
2879
+ 13 => 'sRGB or sYCC',
2880
+ 14 => 'BT.2020 10-bit systems',
2881
+ 15 => 'BT.2020 12-bit systems',
2882
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
2883
+ 17 => 'SMPTE ST 428',
2884
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
2885
+ },
2886
+ },
2887
+ 8 => {
2888
+ Name => 'MatrixCoefficients',
2889
+ Format => 'int16u',
2890
+ PrintConv => {
2891
+ 0 => 'Identity matrix',
2892
+ 1 => 'BT.709',
2893
+ 2 => 'Unspecified',
2894
+ 3 => 'For future use (3)',
2895
+ 4 => 'US FCC 73.628',
2896
+ 5 => 'BT.470 System B, G (historical)',
2897
+ 6 => 'BT.601',
2898
+ 7 => 'SMPTE 240 M',
2899
+ 8 => 'YCgCo',
2900
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
2901
+ 10 => 'BT.2020 constant luminance',
2902
+ 11 => 'SMPTE ST 2085 YDzDx',
2903
+ 12 => 'Chromaticity-derived non-constant luminance',
2904
+ 13 => 'Chromaticity-derived constant luminance',
2905
+ 14 => 'BT.2100 ICtCp',
2906
+ },
2907
+ },
2908
+ );
2909
+
2795
2910
  # HEVC configuration (ref https://github.com/MPEGGroup/isobmff/blob/master/IsoLib/libisomediafile/src/HEVCConfigAtom.c)
2796
2911
  %Image::ExifTool::QuickTime::HEVCConfig = (
2797
2912
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -5921,6 +6036,7 @@ my %eeBox2 = (
5921
6036
  plID => { #10 (or TV season)
5922
6037
  Name => 'PlayListID',
5923
6038
  Format => 'int8u', # actually int64u, but split it up
6039
+ Count => 8,
5924
6040
  Writable => 'int32s', #27
5925
6041
  },
5926
6042
  purd => 'PurchaseDate', #7
@@ -7516,6 +7632,12 @@ my %eeBox2 = (
7516
7632
  Format => 'undef[4]',
7517
7633
  RawConv => '$$self{MetaFormat} = $val',
7518
7634
  },
7635
+ 8 => { # starts at 8 for MetaFormat eq 'camm', and 17 for 'mett'
7636
+ Name => 'MetaType',
7637
+ Format => 'undef[$size-8]',
7638
+ # may start at various locations!
7639
+ RawConv => '$$self{MetaType} = ($val=~/(application[^\0]+)/ ? $1 : undef)',
7640
+ },
7519
7641
  #
7520
7642
  # Observed offsets for child atoms of various MetaFormat types:
7521
7643
  #
@@ -7548,6 +7670,11 @@ my %eeBox2 = (
7548
7670
  Format => 'undef[4]',
7549
7671
  RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too)
7550
7672
  },
7673
+ 24 => {
7674
+ Condition => '$$self{MetaFormat} eq "tmcd"',
7675
+ Name => 'PlaybackFrameRate', # (may differ from recorded FrameRate eg. ../pics/FujiFilmX-H1.mov)
7676
+ Format => 'rational64u',
7677
+ },
7551
7678
  #
7552
7679
  # Observed offsets for child atoms of various OtherFormat types:
7553
7680
  #
@@ -8000,9 +8127,12 @@ sub AUTOLOAD
8000
8127
  # Returns: 9-element rotation matrix as a string (with 0 x/y offsets)
8001
8128
  sub GetRotationMatrix($)
8002
8129
  {
8003
- my $ang = 3.1415926536 * shift() / 180;
8130
+ my $ang = 3.14159265358979323846264 * shift() / 180;
8004
8131
  my $cos = cos $ang;
8005
8132
  my $sin = sin $ang;
8133
+ # round to zero
8134
+ $cos = 0 if abs($cos) < 1e-12;
8135
+ $sin = 0 if abs($sin) < 1e-12;
8006
8136
  my $msn = -$sin;
8007
8137
  return "$cos $sin 0 $msn $cos 0 0 0 1";
8008
8138
  }
@@ -8583,7 +8713,7 @@ sub HandleItemInfo($)
8583
8713
  $et->VPrint(0, "$$et{INDENT}Item $id) '${type}' ($len bytes)\n");
8584
8714
  }
8585
8715
  # get ExifTool name for this item
8586
- my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type} || '';
8716
+ my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP', jpeg => 'PreviewImage' }->{$type} || '';
8587
8717
  my ($warn, $extent);
8588
8718
  $warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding};
8589
8719
  $warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
@@ -8660,6 +8790,21 @@ sub HandleItemInfo($)
8660
8790
  }
8661
8791
  $subTable = GetTagTable('Image::ExifTool::Exif::Main');
8662
8792
  $proc = \&Image::ExifTool::ProcessTIFF;
8793
+ } elsif ($name eq 'PreviewImage') {
8794
+ # take a quick stab at determining the size of the image
8795
+ # (based on JPEG previews found in Fuji X-H2S HIF images)
8796
+ my $type = 'PreviewImage';
8797
+ if ($buff =~ /^.{556}\xff\xc0\0\x11.(.{4})/s) {
8798
+ my ($h, $w) = unpack('n2', $1);
8799
+ # (not sure if $h is ever the long dimension, but test it just in case)
8800
+ if ($w == 160 or $h == 160) {
8801
+ $type = 'ThumbnailImage';
8802
+ } elsif ($w == 1920 or $h == 1920) {
8803
+ $type = 'OtherImage'; # (large preview)
8804
+ } # (PreviewImage is 640x480)
8805
+ }
8806
+ $et->FoundTag($type => $buff);
8807
+ next;
8663
8808
  } else {
8664
8809
  $start = 0;
8665
8810
  $subTable = GetTagTable('Image::ExifTool::XMP::Main');
@@ -9100,12 +9245,13 @@ sub ProcessMOV($$;$)
9100
9245
  # temporarily set ExtractEmbedded option for CRX files
9101
9246
  $saveOptions{ExtractEmbedded} = $et->Options(ExtractEmbedded => 1) if $fileType eq 'CRX';
9102
9247
  } else {
9103
- $et->SetFileType(); # MOV
9248
+ $et->SetFileType(); # MOV
9104
9249
  }
9105
9250
  SetByteOrder('MM');
9106
9251
  $$et{PRIORITY_DIR} = 'XMP'; # have XMP take priority
9107
9252
  }
9108
- $$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode
9253
+ my $fast = $$et{OPTIONS}{FastScan} || 0;
9254
+ $$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
9109
9255
 
9110
9256
  my $ee = $$et{OPTIONS}{ExtractEmbedded};
9111
9257
  if ($ee) {
@@ -9133,8 +9279,10 @@ sub ProcessMOV($$;$)
9133
9279
  $et->VPrint(0,"$$et{INDENT}Tag '${t}' extends to end of file");
9134
9280
  if ($$tagTablePtr{"$tag-size"}) {
9135
9281
  my $pos = $raf->Tell();
9136
- $raf->Seek(0, 2);
9137
- $et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos);
9282
+ unless ($fast) {
9283
+ $raf->Seek(0, 2);
9284
+ $et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos);
9285
+ }
9138
9286
  $et->HandleTag($tagTablePtr, "$tag-offset", $pos) if $$tagTablePtr{"$tag-offset"};
9139
9287
  }
9140
9288
  }
@@ -9237,6 +9385,8 @@ sub ProcessMOV($$;$)
9237
9385
  $et->HandleTag($tagTablePtr, "$tag-size", $size);
9238
9386
  $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
9239
9387
  }
9388
+ # stop processing at mdat/idat if -fast2 is used
9389
+ last if $fast > 1 and ($tag eq 'mdat' or $tag eq 'idat');
9240
9390
  # load values only if associated with a tag (or verbose) and not too big
9241
9391
  if ($size > 0x2000000) { # start to get worried above 32 MB
9242
9392
  # check for RIFF trailer (written by Auto-Vox dashcam)
@@ -9555,10 +9705,14 @@ ItemID: foreach $id (keys %$items) {
9555
9705
  require Image::ExifTool::Font;
9556
9706
  $lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
9557
9707
  }
9708
+ } else {
9709
+ # for the default language code of 0x0000, use UTF-8 instead
9710
+ # of the CharsetQuickTime setting if obviously UTF8
9711
+ $enc = 'UTF8' if Image::ExifTool::IsUTF8(\$str) > 0;
9558
9712
  }
9559
9713
  # the spec says only "Macintosh text encoding", but
9560
9714
  # allow this to be configured by the user
9561
- $enc = $charsetQuickTime;
9715
+ $enc = $charsetQuickTime unless $enc;
9562
9716
  } else {
9563
9717
  # convert language code to ASCII (ignore read-only bit)
9564
9718
  $lang = UnpackLang($lang);
@@ -9599,8 +9753,7 @@ ItemID: foreach $id (keys %$items) {
9599
9753
  if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) {
9600
9754
  # the encoding of this is not specified, so use CharsetQuickTime
9601
9755
  # unless the string is valid UTF-8
9602
- require Image::ExifTool::XMP;
9603
- my $enc = Image::ExifTool::XMP::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
9756
+ my $enc = Image::ExifTool::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
9604
9757
  $$vp = $et->Decode($$vp, $enc);
9605
9758
  }
9606
9759
  }