exiftool-vendored.pl 12.45.0 → 12.50.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.
- package/bin/Changes +122 -6
- package/bin/MANIFEST +12 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +45 -44
- package/bin/config_files/acdsee.config +2 -1
- package/bin/config_files/frameCount.config +56 -0
- package/bin/config_files/tiff_version.config +1 -1
- package/bin/exiftool +89 -75
- package/bin/lib/Image/ExifTool/Apple.pm +6 -2
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +17 -9
- package/bin/lib/Image/ExifTool/Canon.pm +31 -14
- package/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
- package/bin/lib/Image/ExifTool/Exif.pm +13 -8
- package/bin/lib/Image/ExifTool/FLAC.pm +17 -3
- package/bin/lib/Image/ExifTool/FlashPix.pm +4 -2
- package/bin/lib/Image/ExifTool/FujiFilm.pm +31 -5
- package/bin/lib/Image/ExifTool/Geotag.pm +1 -1
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
- package/bin/lib/Image/ExifTool/ICO.pm +143 -0
- package/bin/lib/Image/ExifTool/ID3.pm +5 -5
- package/bin/lib/Image/ExifTool/IPTC.pm +5 -1
- package/bin/lib/Image/ExifTool/M2TS.pm +98 -8
- package/bin/lib/Image/ExifTool/MIE.pm +9 -3
- package/bin/lib/Image/ExifTool/MISB.pm +494 -0
- package/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
- package/bin/lib/Image/ExifTool/Nikon.pm +220 -109
- package/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
- package/bin/lib/Image/ExifTool/Olympus.pm +2 -1
- package/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +12 -5
- package/bin/lib/Image/ExifTool/Pentax.pm +7 -2
- package/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
- package/bin/lib/Image/ExifTool/QuickTime.pm +78 -10
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +76 -5
- package/bin/lib/Image/ExifTool/README +5 -1
- package/bin/lib/Image/ExifTool/RIFF.pm +106 -9
- package/bin/lib/Image/ExifTool/Samsung.pm +2 -2
- package/bin/lib/Image/ExifTool/Sigma.pm +27 -1
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
- package/bin/lib/Image/ExifTool/Sony.pm +35 -16
- package/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
- package/bin/lib/Image/ExifTool/TagLookup.pm +4700 -4520
- package/bin/lib/Image/ExifTool/TagNames.pod +4796 -4463
- package/bin/lib/Image/ExifTool/Text.pm +3 -4
- package/bin/lib/Image/ExifTool/Torrent.pm +2 -3
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
- package/bin/lib/Image/ExifTool/WriteExif.pl +19 -1
- package/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
- package/bin/lib/Image/ExifTool/Writer.pl +6 -2
- package/bin/lib/Image/ExifTool/XMP.pm +72 -57
- package/bin/lib/Image/ExifTool/XMP2.pl +9 -1
- package/bin/lib/Image/ExifTool.pm +81 -18
- package/bin/lib/Image/ExifTool.pod +64 -60
- package/bin/perl-Image-ExifTool.spec +43 -43
- package/bin/pp_build_exe.args +7 -4
- package/package.json +2 -2
|
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
|
|
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
38
38
|
use Image::ExifTool::Exif;
|
|
39
39
|
|
|
40
|
-
$VERSION = '2.
|
|
40
|
+
$VERSION = '2.18';
|
|
41
41
|
|
|
42
42
|
sub ProcessLeicaLEIC($$$);
|
|
43
43
|
sub WhiteBalanceConv($;$$);
|
|
@@ -543,7 +543,11 @@ my %shootingMode = (
|
|
|
543
543
|
0x2c => [
|
|
544
544
|
{
|
|
545
545
|
Name => 'ContrastMode',
|
|
546
|
-
Condition =>
|
|
546
|
+
Condition => q{
|
|
547
|
+
$$self{Model} !~ /^DMC-(FX10|G1|L1|L10|LC80|GF\d+|G2|TZ10|ZS7)$/ and
|
|
548
|
+
# tested for DC-GH6, but rule out other DC- models just in case - PH
|
|
549
|
+
$$self{Model} !~ /^DC-/
|
|
550
|
+
},
|
|
547
551
|
Flags => 'PrintHex',
|
|
548
552
|
Writable => 'int16u',
|
|
549
553
|
Notes => q{
|
|
@@ -1129,7 +1133,10 @@ my %shootingMode = (
|
|
|
1129
1133
|
8 => 'Cinelike D', #forum11194
|
|
1130
1134
|
9 => 'Cinelike V', #forum11194
|
|
1131
1135
|
11 => 'L. Monochrome', #forum11194
|
|
1136
|
+
12 => 'Like709', #forum14033
|
|
1132
1137
|
15 => 'L. Monochrome D', #forum11194
|
|
1138
|
+
17 => 'V-Log', #forum14033
|
|
1139
|
+
18 => 'Cinelike D2', #forum14033
|
|
1133
1140
|
},
|
|
1134
1141
|
},
|
|
1135
1142
|
0x8a => { #18
|
|
@@ -1255,8 +1262,9 @@ my %shootingMode = (
|
|
|
1255
1262
|
Writable => 'rational64u',
|
|
1256
1263
|
Format => 'int32u',
|
|
1257
1264
|
PrintConv => {
|
|
1258
|
-
'0 0' => 'Expressive',
|
|
1259
|
-
|
|
1265
|
+
# '0 0' => 'Expressive', #forum11194
|
|
1266
|
+
'0 0' => 'Off', #forum14033 (GH6)
|
|
1267
|
+
'0 1' => 'Expressive', #forum14033 (GH6) (have also seen this for XS1)
|
|
1260
1268
|
'0 2' => 'Retro',
|
|
1261
1269
|
'0 4' => 'High Key',
|
|
1262
1270
|
'0 8' => 'Sepia',
|
|
@@ -1435,6 +1443,15 @@ my %shootingMode = (
|
|
|
1435
1443
|
ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_',
|
|
1436
1444
|
ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)',
|
|
1437
1445
|
},
|
|
1446
|
+
0xe8 => { #PH (DC-GH6)
|
|
1447
|
+
Name => 'MinimumISO',
|
|
1448
|
+
Writable => 'int32u',
|
|
1449
|
+
},
|
|
1450
|
+
0xee => { #PH (DC-GH6)
|
|
1451
|
+
Name => 'DynamicRangeBoost',
|
|
1452
|
+
Writable => 'int16u',
|
|
1453
|
+
PrintConv => { 0 => 'Off', 1 => 'On' },
|
|
1454
|
+
},
|
|
1438
1455
|
0x0e00 => {
|
|
1439
1456
|
Name => 'PrintIM',
|
|
1440
1457
|
Description => 'Print Image Matching',
|
|
@@ -21,7 +21,7 @@ use vars qw($VERSION);
|
|
|
21
21
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
22
22
|
use Image::ExifTool::Exif;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.27';
|
|
25
25
|
|
|
26
26
|
sub ProcessJpgFromRaw($$$);
|
|
27
27
|
sub WriteJpgFromRaw($$$);
|
|
@@ -739,6 +739,7 @@ sub WriteDistortionInfo($$$)
|
|
|
739
739
|
# 3 - reference to list of original offset values
|
|
740
740
|
# 4 - IFD format number
|
|
741
741
|
# 5 - (pointer to StripOffsets value added by this PatchRawDataOffset routine)
|
|
742
|
+
# 6 - flag set if this is a fixed offset (Panasonic GH6 fixed-offset hack)
|
|
742
743
|
sub PatchRawDataOffset($$$)
|
|
743
744
|
{
|
|
744
745
|
my ($offsetInfo, $raf, $ifd) = @_;
|
|
@@ -752,10 +753,16 @@ sub PatchRawDataOffset($$$)
|
|
|
752
753
|
} else {
|
|
753
754
|
# the DC-GH6 and DC-GH5M2 write RawDataOffset with no Strip tags, so we need
|
|
754
755
|
# to create fake StripByteCounts information for copying the data
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
756
|
+
if ($$offsetInfo{0x118}) { # (just to be safe)
|
|
757
|
+
$stripByteCounts = $$offsetInfo{0x117} = [ $PanasonicRaw::Main{0x117}, 0, 1, [ 0 ], 4 ];
|
|
758
|
+
# set flag so the offset will be fixed (GH6 hack, see https://exiftool.org/forum/index.php?topic=13861.0)
|
|
759
|
+
# (of course, fixing up the offset is now unnecessary, but continue to do this even
|
|
760
|
+
# though the fixup adjustment will be 0 because this allows us to delete the following
|
|
761
|
+
# line to remove the fix-offset restriction if Panasonic ever sees the light, but note
|
|
762
|
+
# that in this case we should investigate the purpose of the seemily-duplicate raw
|
|
763
|
+
# data offset contained within PanasonicRaw_0x0044)
|
|
764
|
+
$$offsetInfo{0x118}[6] = 1;
|
|
765
|
+
}
|
|
759
766
|
}
|
|
760
767
|
if ($rawDataOffset and not $err) {
|
|
761
768
|
$err = 1 unless $$rawDataOffset[2] == 1;
|
|
@@ -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.80';
|
|
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 },
|
|
@@ -758,6 +765,19 @@ my %eeBox2 = (
|
|
|
758
765
|
# 'samn'? - seen in Vantrue N2S sample video
|
|
759
766
|
);
|
|
760
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
|
+
|
|
761
781
|
# MPEG-4 'ftyp' atom
|
|
762
782
|
# (ref http://developer.apple.com/mac/library/documentation/QuickTime/QTFF/QTFFChap1/qtff1.html)
|
|
763
783
|
%Image::ExifTool::QuickTime::FileType = (
|
|
@@ -1122,6 +1142,23 @@ my %eeBox2 = (
|
|
|
1122
1142
|
Start => 16,
|
|
1123
1143
|
},
|
|
1124
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
|
+
},
|
|
1125
1162
|
{
|
|
1126
1163
|
Name => 'UUID-Unknown',
|
|
1127
1164
|
%unknownInfo,
|
|
@@ -7630,6 +7667,11 @@ my %eeBox2 = (
|
|
|
7630
7667
|
Format => 'undef[4]',
|
|
7631
7668
|
RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too)
|
|
7632
7669
|
},
|
|
7670
|
+
24 => {
|
|
7671
|
+
Condition => '$$self{MetaFormat} eq "tmcd"',
|
|
7672
|
+
Name => 'PlaybackFrameRate', # (may differ from recorded FrameRate eg. ../pics/FujiFilmX-H1.mov)
|
|
7673
|
+
Format => 'rational64u',
|
|
7674
|
+
},
|
|
7633
7675
|
#
|
|
7634
7676
|
# Observed offsets for child atoms of various OtherFormat types:
|
|
7635
7677
|
#
|
|
@@ -8082,9 +8124,12 @@ sub AUTOLOAD
|
|
|
8082
8124
|
# Returns: 9-element rotation matrix as a string (with 0 x/y offsets)
|
|
8083
8125
|
sub GetRotationMatrix($)
|
|
8084
8126
|
{
|
|
8085
|
-
my $ang = 3.
|
|
8127
|
+
my $ang = 3.14159265358979323846264 * shift() / 180;
|
|
8086
8128
|
my $cos = cos $ang;
|
|
8087
8129
|
my $sin = sin $ang;
|
|
8130
|
+
# round to zero
|
|
8131
|
+
$cos = 0 if abs($cos) < 1e-12;
|
|
8132
|
+
$sin = 0 if abs($sin) < 1e-12;
|
|
8088
8133
|
my $msn = -$sin;
|
|
8089
8134
|
return "$cos $sin 0 $msn $cos 0 0 0 1";
|
|
8090
8135
|
}
|
|
@@ -8665,7 +8710,7 @@ sub HandleItemInfo($)
|
|
|
8665
8710
|
$et->VPrint(0, "$$et{INDENT}Item $id) '${type}' ($len bytes)\n");
|
|
8666
8711
|
}
|
|
8667
8712
|
# get ExifTool name for this item
|
|
8668
|
-
my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP' }->{$type} || '';
|
|
8713
|
+
my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP', jpeg => 'PreviewImage' }->{$type} || '';
|
|
8669
8714
|
my ($warn, $extent);
|
|
8670
8715
|
$warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding};
|
|
8671
8716
|
$warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
|
|
@@ -8742,6 +8787,21 @@ sub HandleItemInfo($)
|
|
|
8742
8787
|
}
|
|
8743
8788
|
$subTable = GetTagTable('Image::ExifTool::Exif::Main');
|
|
8744
8789
|
$proc = \&Image::ExifTool::ProcessTIFF;
|
|
8790
|
+
} elsif ($name eq 'PreviewImage') {
|
|
8791
|
+
# take a quick stab at determining the size of the image
|
|
8792
|
+
# (based on JPEG previews found in Fuji X-H2S HIF images)
|
|
8793
|
+
my $type = 'PreviewImage';
|
|
8794
|
+
if ($buff =~ /^.{556}\xff\xc0\0\x11.(.{4})/s) {
|
|
8795
|
+
my ($h, $w) = unpack('n2', $1);
|
|
8796
|
+
# (not sure if $h is ever the long dimension, but test it just in case)
|
|
8797
|
+
if ($w == 160 or $h == 160) {
|
|
8798
|
+
$type = 'ThumbnailImage';
|
|
8799
|
+
} elsif ($w == 1920 or $h == 1920) {
|
|
8800
|
+
$type = 'OtherImage'; # (large preview)
|
|
8801
|
+
} # (PreviewImage is 640x480)
|
|
8802
|
+
}
|
|
8803
|
+
$et->FoundTag($type => $buff);
|
|
8804
|
+
next;
|
|
8745
8805
|
} else {
|
|
8746
8806
|
$start = 0;
|
|
8747
8807
|
$subTable = GetTagTable('Image::ExifTool::XMP::Main');
|
|
@@ -9182,12 +9242,13 @@ sub ProcessMOV($$;$)
|
|
|
9182
9242
|
# temporarily set ExtractEmbedded option for CRX files
|
|
9183
9243
|
$saveOptions{ExtractEmbedded} = $et->Options(ExtractEmbedded => 1) if $fileType eq 'CRX';
|
|
9184
9244
|
} else {
|
|
9185
|
-
$et->SetFileType();
|
|
9245
|
+
$et->SetFileType(); # MOV
|
|
9186
9246
|
}
|
|
9187
9247
|
SetByteOrder('MM');
|
|
9188
9248
|
$$et{PRIORITY_DIR} = 'XMP'; # have XMP take priority
|
|
9189
9249
|
}
|
|
9190
|
-
|
|
9250
|
+
my $fast = $$et{OPTIONS}{FastScan} || 0;
|
|
9251
|
+
$$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
|
|
9191
9252
|
|
|
9192
9253
|
my $ee = $$et{OPTIONS}{ExtractEmbedded};
|
|
9193
9254
|
if ($ee) {
|
|
@@ -9215,8 +9276,10 @@ sub ProcessMOV($$;$)
|
|
|
9215
9276
|
$et->VPrint(0,"$$et{INDENT}Tag '${t}' extends to end of file");
|
|
9216
9277
|
if ($$tagTablePtr{"$tag-size"}) {
|
|
9217
9278
|
my $pos = $raf->Tell();
|
|
9218
|
-
$
|
|
9219
|
-
|
|
9279
|
+
unless ($fast) {
|
|
9280
|
+
$raf->Seek(0, 2);
|
|
9281
|
+
$et->HandleTag($tagTablePtr, "$tag-size", $raf->Tell() - $pos);
|
|
9282
|
+
}
|
|
9220
9283
|
$et->HandleTag($tagTablePtr, "$tag-offset", $pos) if $$tagTablePtr{"$tag-offset"};
|
|
9221
9284
|
}
|
|
9222
9285
|
}
|
|
@@ -9319,6 +9382,8 @@ sub ProcessMOV($$;$)
|
|
|
9319
9382
|
$et->HandleTag($tagTablePtr, "$tag-size", $size);
|
|
9320
9383
|
$et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
|
|
9321
9384
|
}
|
|
9385
|
+
# stop processing at mdat/idat if -fast2 is used
|
|
9386
|
+
last if $fast > 1 and ($tag eq 'mdat' or $tag eq 'idat');
|
|
9322
9387
|
# load values only if associated with a tag (or verbose) and not too big
|
|
9323
9388
|
if ($size > 0x2000000) { # start to get worried above 32 MB
|
|
9324
9389
|
# check for RIFF trailer (written by Auto-Vox dashcam)
|
|
@@ -9637,10 +9702,14 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9637
9702
|
require Image::ExifTool::Font;
|
|
9638
9703
|
$lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
|
|
9639
9704
|
}
|
|
9705
|
+
} else {
|
|
9706
|
+
# for the default language code of 0x0000, use UTF-8 instead
|
|
9707
|
+
# of the CharsetQuickTime setting if obviously UTF8
|
|
9708
|
+
$enc = 'UTF8' if Image::ExifTool::IsUTF8(\$str) > 0;
|
|
9640
9709
|
}
|
|
9641
9710
|
# the spec says only "Macintosh text encoding", but
|
|
9642
9711
|
# allow this to be configured by the user
|
|
9643
|
-
$enc = $charsetQuickTime;
|
|
9712
|
+
$enc = $charsetQuickTime unless $enc;
|
|
9644
9713
|
} else {
|
|
9645
9714
|
# convert language code to ASCII (ignore read-only bit)
|
|
9646
9715
|
$lang = UnpackLang($lang);
|
|
@@ -9681,8 +9750,7 @@ ItemID: foreach $id (keys %$items) {
|
|
|
9681
9750
|
if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) {
|
|
9682
9751
|
# the encoding of this is not specified, so use CharsetQuickTime
|
|
9683
9752
|
# unless the string is valid UTF-8
|
|
9684
|
-
|
|
9685
|
-
my $enc = Image::ExifTool::XMP::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
|
|
9753
|
+
my $enc = Image::ExifTool::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
|
|
9686
9754
|
$$vp = $et->Decode($$vp, $enc);
|
|
9687
9755
|
}
|
|
9688
9756
|
}
|
|
@@ -27,6 +27,8 @@ sub ProcessFreeGPS2($$$);
|
|
|
27
27
|
sub Process360Fly($$$);
|
|
28
28
|
sub ProcessFMAS($$$);
|
|
29
29
|
|
|
30
|
+
my $debug; # set to 1 for extra debugging messages
|
|
31
|
+
|
|
30
32
|
# QuickTime data types that have ExifTool equivalents
|
|
31
33
|
# (ref https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW35)
|
|
32
34
|
my %qtFmt = (
|
|
@@ -99,7 +101,7 @@ my %insvLimit = (
|
|
|
99
101
|
The tags below are extracted from timed metadata in QuickTime and other
|
|
100
102
|
formats of video files when the ExtractEmbedded option is used. Although
|
|
101
103
|
most of these tags are combined into the single table below, ExifTool
|
|
102
|
-
currently reads
|
|
104
|
+
currently reads 62 different formats of timed GPS metadata from video files.
|
|
103
105
|
},
|
|
104
106
|
VARS => { NO_ID => 1 },
|
|
105
107
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
|
@@ -896,10 +898,15 @@ sub Process_text($$$)
|
|
|
896
898
|
my $time = "$1:$2:$3";
|
|
897
899
|
if ($$et{LastTime}) {
|
|
898
900
|
if ($$et{LastTime} eq $time) {
|
|
901
|
+
# combine with the previous NMEA sentence
|
|
899
902
|
$$et{DOC_NUM} = $$et{LastDoc};
|
|
900
903
|
} elsif (%tags) {
|
|
904
|
+
# handle existing tags and start a new document
|
|
905
|
+
# (see https://exiftool.org/forum/index.php?msg=75422)
|
|
901
906
|
HandleTextTags($et, $tagTbl, \%tags);
|
|
902
|
-
|
|
907
|
+
undef %tags;
|
|
908
|
+
# increment document number and update document count if necessary
|
|
909
|
+
$$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
|
|
903
910
|
}
|
|
904
911
|
}
|
|
905
912
|
$$et{LastTime} = $time;
|
|
@@ -918,7 +925,8 @@ sub Process_text($$$)
|
|
|
918
925
|
$$et{DOC_NUM} = $$et{LastDoc};
|
|
919
926
|
} elsif (%tags) {
|
|
920
927
|
HandleTextTags($et, $tagTbl, \%tags);
|
|
921
|
-
|
|
928
|
+
undef %tags;
|
|
929
|
+
$$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
|
|
922
930
|
}
|
|
923
931
|
}
|
|
924
932
|
$$et{LastTime} = $time;
|
|
@@ -1416,6 +1424,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1416
1424
|
} elsif ($buf2 =~ /^.{173}([-+]\d{3})([-+]\d{3})([-+]\d{3})/s) { # (Azdome)
|
|
1417
1425
|
@acc = ($1/100, $2/100, $3/100);
|
|
1418
1426
|
}
|
|
1427
|
+
$debug and $et->FoundTag(GPSType => '1A');
|
|
1419
1428
|
|
|
1420
1429
|
} elsif ($$dataPt =~ /^.{52}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/s) {
|
|
1421
1430
|
|
|
@@ -1444,6 +1453,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1444
1453
|
# change to signed integer and divide by 256
|
|
1445
1454
|
map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
|
|
1446
1455
|
}
|
|
1456
|
+
$debug and $et->FoundTag(GPSType => '1B');
|
|
1447
1457
|
|
|
1448
1458
|
} elsif ($$dataPt =~ /^.{37}\0\0\0A([NS])([EW])/s) {
|
|
1449
1459
|
|
|
@@ -1454,13 +1464,27 @@ sub ProcessFreeGPS($$$)
|
|
|
1454
1464
|
# 0030: f1 47 40 46 66 66 d2 41 85 eb 83 41 00 00 00 00 [.G@Fff.A...A....]
|
|
1455
1465
|
($latRef, $lonRef) = ($1, $2);
|
|
1456
1466
|
($hr,$min,$sec,$yr,$mon,$day) = unpack('x16V6', $$dataPt);
|
|
1457
|
-
$yr
|
|
1467
|
+
if ($yr < 2000) {
|
|
1468
|
+
$yr += 2000;
|
|
1469
|
+
} else {
|
|
1470
|
+
# Kenwood dashcam sometimes stores absolute year and local time
|
|
1471
|
+
# (but sometimes year since 2000 and UTC time in same video!)
|
|
1472
|
+
require Time::Local;
|
|
1473
|
+
my $time = Image::ExifTool::TimeLocal($sec,$min,$hr,$day,$mon-1,$yr-1900);
|
|
1474
|
+
($sec,$min,$hr,$day,$mon,$yr) = gmtime($time);
|
|
1475
|
+
$yr += 1900;
|
|
1476
|
+
++$mon;
|
|
1477
|
+
$et->WarnOnce('Converting GPSDateTime to UTC based on local time zone',1);
|
|
1478
|
+
}
|
|
1458
1479
|
SetByteOrder('II');
|
|
1459
1480
|
$lat = GetFloat($dataPt, 0x2c);
|
|
1460
1481
|
$lon = GetFloat($dataPt, 0x30);
|
|
1461
1482
|
$spd = GetFloat($dataPt, 0x34) * $knotsToKph; # (convert knots to km/h)
|
|
1462
1483
|
$trk = GetFloat($dataPt, 0x38);
|
|
1484
|
+
@acc = unpack('x60V3', $$dataPt); # (may be all zeros if not valid)
|
|
1485
|
+
map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
|
|
1463
1486
|
SetByteOrder('MM');
|
|
1487
|
+
$debug and $et->FoundTag(GPSType => '1C');
|
|
1464
1488
|
|
|
1465
1489
|
} elsif ($$dataPt =~ /^.{21}\0\0\0A([NS])([EW])/s) {
|
|
1466
1490
|
|
|
@@ -1489,6 +1513,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1489
1513
|
$acc[1] = GetFloat($dataPt, 0x30);
|
|
1490
1514
|
$acc[2] = GetFloat($dataPt, 0x34);
|
|
1491
1515
|
SetByteOrder('MM');
|
|
1516
|
+
$debug and $et->FoundTag(GPSType => '1D');
|
|
1492
1517
|
|
|
1493
1518
|
} elsif ($$dataPt =~ /^.{60}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s) {
|
|
1494
1519
|
|
|
@@ -1509,6 +1534,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1509
1534
|
$trk = GetFloat($dataPt, 0x54) + 180; # (why is this off by 180?)
|
|
1510
1535
|
$trk -= 360 if $trk >= 360;
|
|
1511
1536
|
SetByteOrder('MM');
|
|
1537
|
+
$debug and $et->FoundTag(GPSType => '1E');
|
|
1512
1538
|
|
|
1513
1539
|
} elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) {
|
|
1514
1540
|
|
|
@@ -1526,6 +1552,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1526
1552
|
$yr += ($yr >= 70 ? 1900 : 2000);
|
|
1527
1553
|
$spd = $9 * $knotsToKph if length $9;
|
|
1528
1554
|
$trk = $10 if length $10;
|
|
1555
|
+
$debug and $et->FoundTag(GPSType => '1F');
|
|
1529
1556
|
|
|
1530
1557
|
} elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0{5}/s) {
|
|
1531
1558
|
|
|
@@ -1569,6 +1596,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1569
1596
|
|
|
1570
1597
|
SetByteOrder('MM');
|
|
1571
1598
|
#my $serialNum = substr($$dataPt, 0x68, 20);
|
|
1599
|
+
$debug and $et->FoundTag(GPSType => '1G');
|
|
1572
1600
|
|
|
1573
1601
|
} elsif ($$dataPt =~ /^.{12}\xac\0\0\0.{44}(.{72})/s) {
|
|
1574
1602
|
|
|
@@ -1591,6 +1619,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1591
1619
|
# bytes 7-12 are the timestamp in ASCII HHMMSS after xor-ing with 0x70
|
|
1592
1620
|
substr($time,7,6) = pack 'C*', map { $_ ^= 0x70 } unpack 'C*', substr($time,7,6);
|
|
1593
1621
|
# (other values are currently unknown)
|
|
1622
|
+
$debug and $et->FoundTag(GPSType => '1H');
|
|
1594
1623
|
|
|
1595
1624
|
} elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) {
|
|
1596
1625
|
|
|
@@ -1616,6 +1645,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1616
1645
|
$trk = GetFloat($dataPt, 0x68);
|
|
1617
1646
|
$alt = GetFloat($dataPt, 0x6c);
|
|
1618
1647
|
SetByteOrder('MM');
|
|
1648
|
+
$debug and $et->FoundTag(GPSType => '1I');
|
|
1619
1649
|
|
|
1620
1650
|
} else {
|
|
1621
1651
|
|
|
@@ -1652,6 +1682,7 @@ sub ProcessFreeGPS($$$)
|
|
|
1652
1682
|
$yr += 2000 if $yr < 2000;
|
|
1653
1683
|
$spd *= $knotsToKph; # convert speed to km/h
|
|
1654
1684
|
# ($trk is not confirmed; may be GPSImageDirection, ref PH)
|
|
1685
|
+
$debug and $et->FoundTag(GPSType => '1J');
|
|
1655
1686
|
}
|
|
1656
1687
|
#
|
|
1657
1688
|
# save tag values extracted by above code
|
|
@@ -1805,6 +1836,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1805
1836
|
}
|
|
1806
1837
|
# save position of most recent record (needed when parsing the next freeGPS block)
|
|
1807
1838
|
$$et{FreeGPS2}{RecentRecPos} = $lastRecPos;
|
|
1839
|
+
$debug and $et->FoundTag(GPSType => '2A');
|
|
1808
1840
|
return 1;
|
|
1809
1841
|
|
|
1810
1842
|
} elsif ($$dataPt =~ /^.{60}A\0.{10}([NS])\0.{14}([EW])\0/s) {
|
|
@@ -1836,6 +1868,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1836
1868
|
$lon = GetDouble($dataPt, 0x50);
|
|
1837
1869
|
$spd = GetDouble($dataPt, 0x60) * $knotsToKph;
|
|
1838
1870
|
$trk = GetDouble($dataPt, 0x68);
|
|
1871
|
+
$debug and $et->FoundTag(GPSType => '2B');
|
|
1839
1872
|
|
|
1840
1873
|
} elsif ($$dataPt =~ /^.{72}A([NS])([EW])/s) {
|
|
1841
1874
|
|
|
@@ -1872,6 +1905,8 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1872
1905
|
$lon = abs Get32s($dataPt, 0x50) / 1e7;
|
|
1873
1906
|
$spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
|
|
1874
1907
|
$alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
|
|
1908
|
+
$debug and $et->FoundTag(GPSType => '2C');
|
|
1909
|
+
|
|
1875
1910
|
} else {
|
|
1876
1911
|
# Type 3 (ref 2)
|
|
1877
1912
|
# (no sample with this format)
|
|
@@ -1879,6 +1914,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1879
1914
|
$lon = GetFloat($dataPt, 0x50);
|
|
1880
1915
|
$spd = GetFloat($dataPt, 0x54) * $knotsToKph;
|
|
1881
1916
|
$trk = GetFloat($dataPt, 0x58);
|
|
1917
|
+
$debug and $et->FoundTag(GPSType => '2D');
|
|
1882
1918
|
}
|
|
1883
1919
|
|
|
1884
1920
|
} elsif ($$dataPt =~ /^.{60}A\0.{6}([NS])\0.{6}([EW])\0/s and $dirLen >= 112) {
|
|
@@ -1899,6 +1935,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1899
1935
|
$lon = GetFloat($dataPt, 0x48);
|
|
1900
1936
|
$spd = GetFloat($dataPt, 0x50);
|
|
1901
1937
|
$trk = GetFloat($dataPt, 0x54);
|
|
1938
|
+
$debug and $et->FoundTag(GPSType => '2E');
|
|
1902
1939
|
|
|
1903
1940
|
} elsif ($$dataPt =~ /^.{16}A([NS])([EW])\0/s) {
|
|
1904
1941
|
|
|
@@ -1919,6 +1956,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1919
1956
|
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
1920
1957
|
$et->HandleTag($tagTbl, Accelerometer => "@acc");
|
|
1921
1958
|
}
|
|
1959
|
+
$debug and $et->FoundTag(GPSType => '2F');
|
|
1922
1960
|
return 1;
|
|
1923
1961
|
|
|
1924
1962
|
} else {
|
|
@@ -1965,6 +2003,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1965
2003
|
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
1966
2004
|
last if $pos += 0x20 > length($$dataPt) - 0x1e;
|
|
1967
2005
|
}
|
|
2006
|
+
$debug and $et->FoundTag(GPSType => '2G');
|
|
1968
2007
|
return $$et{DOC_NUM} ? 1 : 0; # return 0 if nothing extracted
|
|
1969
2008
|
}
|
|
1970
2009
|
#
|
|
@@ -2533,7 +2572,7 @@ sub ProcessTTAD($$$)
|
|
|
2533
2572
|
# (I think "5" may be the number of satellites. seen: 5,6,7 - PH)
|
|
2534
2573
|
FoundSomething($et, $tagTbl, $sampleTime / 1000);
|
|
2535
2574
|
my $t = GetDouble($dataPt, $pos);
|
|
2536
|
-
$et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($t,undef,3).'Z');
|
|
2575
|
+
$et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($t,undef,3) . 'Z');
|
|
2537
2576
|
$et->HandleTag($tagTbl, GPSLatitude => GetDouble($dataPt, $pos+0x1c));
|
|
2538
2577
|
$et->HandleTag($tagTbl, GPSLongitude => GetDouble($dataPt, $pos+0x24));
|
|
2539
2578
|
$et->HandleTag($tagTbl, GPSAltitude => GetDouble($dataPt, $pos+0x14));
|
|
@@ -2734,6 +2773,38 @@ sub ProcessInsta360($;$)
|
|
|
2734
2773
|
return 1;
|
|
2735
2774
|
}
|
|
2736
2775
|
|
|
2776
|
+
#------------------------------------------------------------------------------
|
|
2777
|
+
# Process Garmin GPS 'uuid' atom (ref PH)
|
|
2778
|
+
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
2779
|
+
# Returns: 1 on success
|
|
2780
|
+
# Note: This format is used by the Garmin DriveAssist 51, but the DriveAssist 50
|
|
2781
|
+
# uses a completely different format. :(
|
|
2782
|
+
sub ProcessGarminGPS($$$)
|
|
2783
|
+
{
|
|
2784
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
|
2785
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
2786
|
+
my $dataLen = length $$dataPt;
|
|
2787
|
+
my $pos = 33;
|
|
2788
|
+
my $epoch = (66 * 365 + 17) * 24 * 3600; # time is relative to Jan 1, 1904
|
|
2789
|
+
my $scl = 180 / (32768 * 65536); # scaling factor for lat/lon
|
|
2790
|
+
$et->VerboseDir('GarminGPS');
|
|
2791
|
+
while ($pos + 20 <= $dataLen) {
|
|
2792
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
|
2793
|
+
my $time = Image::ExifTool::ConvertUnixTime(Get32u($dataPt, $pos) - $epoch) . 'Z';
|
|
2794
|
+
my $lat = Get32s($dataPt, $pos + 12) * $scl;
|
|
2795
|
+
my $lon = Get32s($dataPt, $pos + 16) * $scl;
|
|
2796
|
+
my $spd = Get16u($dataPt, $pos + 4); # (in mph)
|
|
2797
|
+
$et->HandleTag($tagTbl, 'GPSDateTime', $time);
|
|
2798
|
+
$et->HandleTag($tagTbl, 'GPSLatitude', $lat);
|
|
2799
|
+
$et->HandleTag($tagTbl, 'GPSLongitude', $lon);
|
|
2800
|
+
$et->HandleTag($tagTbl, 'GPSSpeed', $spd);
|
|
2801
|
+
$et->HandleTag($tagTbl, 'GPSSpeedRef', 'M');
|
|
2802
|
+
$pos += 20;
|
|
2803
|
+
}
|
|
2804
|
+
delete $$et{DOC_NUM};
|
|
2805
|
+
return 1;
|
|
2806
|
+
}
|
|
2807
|
+
|
|
2737
2808
|
#------------------------------------------------------------------------------
|
|
2738
2809
|
# Process 360Fly 'uuid' atom containing sensor data
|
|
2739
2810
|
# (ref https://github.com/JamesHeinrich/getID3/blob/master/getid3/module.audio-video.quicktime.php)
|
|
@@ -720,7 +720,7 @@ numerical, and generated automatically otherwise.
|
|
|
720
720
|
condition exists, then a 'true' condition is assumed. The
|
|
721
721
|
expression may use $self to access the ExifTool object. The
|
|
722
722
|
first 128 bytes of the raw data value are accessible through
|
|
723
|
-
the reference $valPt for EXIF, Jpeg2000, QuickTime and
|
|
723
|
+
the reference $valPt for EXIF, Jpeg2000, QuickTime, FLAC and
|
|
724
724
|
BinaryData tags only (note that for BinaryData tags, the raw
|
|
725
725
|
data of $$valPt is always 'undef' type, and may not be used
|
|
726
726
|
when writing except for SubDirectory tags). EXIF tags (and
|
|
@@ -967,6 +967,10 @@ numerical, and generated automatically otherwise.
|
|
|
967
967
|
OtherLang : [reserved] Used internally by QuickTime module to store a list
|
|
968
968
|
of tag ID's for alternate-language tags based on this one.
|
|
969
969
|
|
|
970
|
+
ParentTagInfo : [reserved] Used internally to store a reference to the tag
|
|
971
|
+
information hash of the parent structure for flattened
|
|
972
|
+
structure tags.
|
|
973
|
+
|
|
970
974
|
RootTagInfo : [reserved] Used internally to store a reference to the tag
|
|
971
975
|
information hash of the top-level structure for flattened
|
|
972
976
|
structure tags.
|