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.
- 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
|
}
|