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.
- checksums.yaml +4 -4
- data/bin/Changes +226 -6
- data/bin/MANIFEST +14 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +45 -44
- data/bin/config_files/acdsee.config +2 -1
- data/bin/config_files/frameCount.config +56 -0
- data/bin/config_files/tiff_version.config +1 -1
- data/bin/exiftool +116 -97
- data/bin/fmt_files/gpx.fmt +3 -0
- data/bin/fmt_files/gpx_wpt.fmt +3 -0
- data/bin/lib/Image/ExifTool/Apple.pm +16 -3
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
- data/bin/lib/Image/ExifTool/Canon.pm +66 -37
- data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
- data/bin/lib/Image/ExifTool/Casio.pm +3 -3
- data/bin/lib/Image/ExifTool/DJI.pm +2 -1
- data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
- data/bin/lib/Image/ExifTool/EXE.pm +9 -1
- data/bin/lib/Image/ExifTool/Exif.pm +17 -12
- data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
- data/bin/lib/Image/ExifTool/FLIR.pm +9 -7
- data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
- data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
- data/bin/lib/Image/ExifTool/GPS.pm +31 -5
- data/bin/lib/Image/ExifTool/Geotag.pm +36 -8
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
- data/bin/lib/Image/ExifTool/ICO.pm +143 -0
- data/bin/lib/Image/ExifTool/ID3.pm +6 -6
- data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +1 -0
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +24 -3
- data/bin/lib/Image/ExifTool/LNK.pm +5 -2
- data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +6015 -759
- data/bin/lib/Image/ExifTool/Lang/sk.pm +1927 -0
- data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
- data/bin/lib/Image/ExifTool/MIE.pm +9 -3
- data/bin/lib/Image/ExifTool/MISB.pm +494 -0
- data/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +272 -48
- data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +746 -382
- data/bin/lib/Image/ExifTool/NikonCustom.pm +139 -106
- data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
- data/bin/lib/Image/ExifTool/Olympus.pm +6 -4
- data/bin/lib/Image/ExifTool/PNG.pm +8 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
- data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
- data/bin/lib/Image/ExifTool/Pentax.pm +7 -2
- data/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +166 -13
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +161 -22
- data/bin/lib/Image/ExifTool/README +15 -4
- data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
- data/bin/lib/Image/ExifTool/Samsung.pm +2 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
- data/bin/lib/Image/ExifTool/Sony.pm +75 -47
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +13 -6
- data/bin/lib/Image/ExifTool/TagLookup.pm +4791 -4519
- data/bin/lib/Image/ExifTool/TagNames.pod +2056 -1446
- data/bin/lib/Image/ExifTool/Text.pm +3 -4
- data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
- data/bin/lib/Image/ExifTool/Validate.pm +3 -3
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
- data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +12 -7
- data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
- data/bin/lib/Image/ExifTool/WriteXMP.pl +15 -1
- data/bin/lib/Image/ExifTool/Writer.pl +46 -18
- data/bin/lib/Image/ExifTool/XMP.pm +78 -59
- data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
- data/bin/lib/Image/ExifTool/ZIP.pm +19 -7
- data/bin/lib/Image/ExifTool.pm +146 -38
- data/bin/lib/Image/ExifTool.pod +83 -69
- data/bin/perl-Image-ExifTool.spec +43 -43
- data/lib/exiftool_vendored/version.rb +1 -1
- 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.
|
|
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 => {
|
|
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.
|
|
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.
|
|
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 => {
|
|
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.
|
|
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' =>
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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();
|
|
9248
|
+
$et->SetFileType(); # MOV
|
|
9104
9249
|
}
|
|
9105
9250
|
SetByteOrder('MM');
|
|
9106
9251
|
$$et{PRIORITY_DIR} = 'XMP'; # have XMP take priority
|
|
9107
9252
|
}
|
|
9108
|
-
|
|
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
|
-
$
|
|
9137
|
-
|
|
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
|
-
|
|
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
|
}
|