exiftool_vendored 12.42.0 → 12.52.0

Sign up to get free protection for your applications and to get access to all the features.
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
  }