exiftool-vendored.exe 12.31.0 → 12.39.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/LICENSE +254 -247
- package/bin/exiftool_files/Changes +130 -4
- package/bin/exiftool_files/README +45 -45
- package/bin/exiftool_files/arg_files/xmp2exif.args +2 -1
- package/bin/exiftool_files/exiftool.pl +143 -101
- package/bin/exiftool_files/lib/File/RandomAccess.pm +1 -1
- package/bin/exiftool_files/lib/File/RandomAccess.pod +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/AES.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/AFCP.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/APP12.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ASF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Audible.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/BMP.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/BPG.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/BZZ.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/BigTIFF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +17 -5
- package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +331 -0
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +171 -13
- package/bin/exiftool_files/lib/Image/ExifTool/CanonCustom.pm +13 -3
- package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/CaptureOne.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Casio.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Charset.pm +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DICOM.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DV.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/DjVu.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +118 -4
- package/bin/exiftool_files/lib/Image/ExifTool/FITS.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/FLAC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/FLIF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +48 -11
- package/bin/exiftool_files/lib/Image/ExifTool/Fixup.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Flash.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Font.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/FotoStation.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/GE.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +6 -2
- package/bin/exiftool_files/lib/Image/ExifTool/GIMP.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +15 -11
- package/bin/exiftool_files/lib/Image/ExifTool/GeoTiff.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +14 -3
- package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/H264.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/HP.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/HTML.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +97 -5
- package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/IPTC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ISO.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/ITC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +6 -2
- package/bin/exiftool_files/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +8 -4
- package/bin/exiftool_files/lib/Image/ExifTool/JVC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +155 -25
- package/bin/exiftool_files/lib/Image/ExifTool/Kodak.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/cs.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/de.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/es.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/fi.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/fr.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/it.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/ja.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/ko.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/pl.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/ru.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/sv.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/tr.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Leaf.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Lytro.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MIEUnits.pod +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MIFF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MNG.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MOI.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MPC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MPF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MRC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MXF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Matroska.pm +9 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Microsoft.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Motorola.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1895 -74
- package/bin/exiftool_files/lib/Image/ExifTool/NikonCapture.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +523 -6
- package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +150 -87
- package/bin/exiftool_files/lib/Image/ExifTool/Nintendo.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/OOXML.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +6 -2
- package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +5 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Opus.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PCX.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +6 -4
- package/bin/exiftool_files/lib/Image/ExifTool/PGF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PICT.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PLUS.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +29 -8
- package/bin/exiftool_files/lib/Image/ExifTool/PPM.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PSP.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Palm.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Parrot.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +4 -2
- package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PhotoCD.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PostScript.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PrintIM.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +25 -4
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +125 -81
- package/bin/exiftool_files/lib/Image/ExifTool/README +9 -2
- package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/RSRC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/RTF.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Radiance.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Real.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Reconyx.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Red.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Sanyo.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Scalado.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Shift.pl +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Shortcuts.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +34 -14
- package/bin/exiftool_files/lib/Image/ExifTool/SonyIDC.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Stim.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +11 -6
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6589 -5877
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +1681 -65
- package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Theora.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Unknown.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/VCard.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Vorbis.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WTV.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +30 -10
- package/bin/exiftool_files/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WritePostScript.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +12 -1
- package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +11 -12
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +56 -10
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +164 -52
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +6 -3
- package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +4 -2
- package/bin/exiftool_files/lib/Image/ExifTool/ZIP.pm +10 -2
- package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/iWork.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pm +8939 -8864
- package/bin/exiftool_files/lib/Image/ExifTool.pod +76 -67
- package/package.json +3 -3
|
@@ -25,6 +25,7 @@ sub Process_mebx($$$);
|
|
|
25
25
|
sub ProcessFreeGPS($$$);
|
|
26
26
|
sub ProcessFreeGPS2($$$);
|
|
27
27
|
sub Process360Fly($$$);
|
|
28
|
+
sub ProcessFMAS($$$);
|
|
28
29
|
|
|
29
30
|
# QuickTime data types that have ExifTool equivalents
|
|
30
31
|
# (ref https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW35)
|
|
@@ -98,15 +99,15 @@ my %insvLimit = (
|
|
|
98
99
|
The tags below are extracted from timed metadata in QuickTime and other
|
|
99
100
|
formats of video files when the ExtractEmbedded option is used. Although
|
|
100
101
|
most of these tags are combined into the single table below, ExifTool
|
|
101
|
-
currently reads
|
|
102
|
+
currently reads 59 different formats of timed GPS metadata from video files.
|
|
102
103
|
},
|
|
103
104
|
VARS => { NO_ID => 1 },
|
|
104
105
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
|
105
106
|
GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
|
|
106
107
|
GPSAltitude => { PrintConv => '(sprintf("%.4f", $val) + 0) . " m"' }, # round to 4 decimals
|
|
107
|
-
GPSSpeed => { PrintConv => 'sprintf("%.4f", $val) + 0'
|
|
108
|
+
GPSSpeed => { PrintConv => 'sprintf("%.4f", $val) + 0', Notes => 'in km/h unless GPSSpeedRef says otherwise' },
|
|
108
109
|
GPSSpeedRef => { PrintConv => { K => 'km/h', M => 'mph', N => 'knots' } },
|
|
109
|
-
GPSTrack => { PrintConv => 'sprintf("%.4f", $val) + 0'
|
|
110
|
+
GPSTrack => { PrintConv => 'sprintf("%.4f", $val) + 0', Notes => 'relative to true north unless GPSTrackRef says otherwise' },
|
|
110
111
|
GPSTrackRef => { PrintConv => { M => 'Magnetic North', T => 'True North' } },
|
|
111
112
|
GPSDateTime => {
|
|
112
113
|
Groups => { 2 => 'Time' },
|
|
@@ -181,6 +182,13 @@ my %insvLimit = (
|
|
|
181
182
|
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
|
182
183
|
ProcessProc => \&Process_text,
|
|
183
184
|
},
|
|
185
|
+
},{
|
|
186
|
+
Name => 'gpmd_FMAS', # Vantrue N2S binary format
|
|
187
|
+
Condition => '$$valPt =~ /^FMAS\0\0\0\0/',
|
|
188
|
+
SubDirectory => {
|
|
189
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
|
190
|
+
ProcessProc => \&ProcessFMAS,
|
|
191
|
+
},
|
|
184
192
|
},{
|
|
185
193
|
Name => 'gpmd_GoPro',
|
|
186
194
|
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' },
|
|
@@ -901,14 +909,8 @@ sub Process_text($$$)
|
|
|
901
909
|
$tags{GPSDateTime} = $dateTime;
|
|
902
910
|
$tags{GPSLatitude} = (($4 || 0) + $5/60) * ($6 eq 'N' ? 1 : -1);
|
|
903
911
|
$tags{GPSLongitude} = (($7 || 0) + $8/60) * ($9 eq 'E' ? 1 : -1);
|
|
904
|
-
if
|
|
905
|
-
|
|
906
|
-
$tags{GPSSpeedRef} = 'K';
|
|
907
|
-
}
|
|
908
|
-
if (length $11) {
|
|
909
|
-
$tags{GPSTrack} = $11;
|
|
910
|
-
$tags{GPSTrackRef} = 'T';
|
|
911
|
-
}
|
|
912
|
+
$tags{GPSSpeed} = $10 * $knotsToKph if length $10;
|
|
913
|
+
$tags{GPSTrack} = $11 if length $11;
|
|
912
914
|
} elsif ($tag =~ /^[A-Z]{2}GGA$/ and $dat =~ /^,(\d{2})(\d{2})(\d+(?:\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/s) {
|
|
913
915
|
my $time = "$1:$2:$3";
|
|
914
916
|
if ($$et{LastTime}) {
|
|
@@ -988,10 +990,7 @@ sub Process_text($$$)
|
|
|
988
990
|
$val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0x39, 5)));
|
|
989
991
|
$tags{GPSAltitude} = $val + 0 if $val =~ /^[-+]\d+$/;
|
|
990
992
|
$val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0x3e, 3)));
|
|
991
|
-
if
|
|
992
|
-
$tags{GPSSpeed} = $val + 0;
|
|
993
|
-
$tags{GPSSpeedRef} = 'K';
|
|
994
|
-
}
|
|
993
|
+
$tags{GPSSpeed} = $val + 0 if $val =~ /^\d+$/;
|
|
995
994
|
if ($$dataPt =~ /^\0\0..\xaa\xaa/s) { # (BlueSkySea)
|
|
996
995
|
$val = pack('C*', map { $_ ^ 0xaa } unpack('C*', substr($$dataPt, 0xad, 12)));
|
|
997
996
|
# the first X,Y,Z accelerometer readings from the AccelerometerData
|
|
@@ -1022,10 +1021,7 @@ sub Process_text($$$)
|
|
|
1022
1021
|
$tags{GPSLatitude} = $2;
|
|
1023
1022
|
$tags{GPSLongitude} = $1;
|
|
1024
1023
|
$tags{GPSAltitude} = $1 if $$dataPt =~ /,\s*H\s+([-+]?\d+\.?\d*)m/;
|
|
1025
|
-
if
|
|
1026
|
-
$tags{GPSSpeed} = $1 * $mpsToKph;
|
|
1027
|
-
$tags{GPSSpeedRef} = 'K';
|
|
1028
|
-
}
|
|
1024
|
+
$tags{GPSSpeed} = $1 * $mpsToKph if $$dataPt =~ /,\s*H.S\s+([-+]?\d+\.?\d*)/;
|
|
1029
1025
|
$tags{Distance} = $1 * $mpsToKph if $$dataPt =~ /,\s*D\s+(\d+\.?\d*)m/;
|
|
1030
1026
|
$tags{VerticalSpeed} = $1 if $$dataPt =~ /,\s*V.S\s+([-+]?\d+\.?\d*)/;
|
|
1031
1027
|
$tags{FNumber} = $1 if $$dataPt =~ /\bF\/(\d+\.?\d*)/;
|
|
@@ -1086,14 +1082,8 @@ sub Process_text($$$)
|
|
|
1086
1082
|
$tags{GPSDateTime} = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $year, $14, $13, $1, $2, $3);
|
|
1087
1083
|
$tags{GPSLatitude} = (($5 || 0) + $6/60) * ($7 eq 'N' ? 1 : -1);
|
|
1088
1084
|
$tags{GPSLongitude} = (($8 || 0) + $9/60) * ($10 eq 'E' ? 1 : -1);
|
|
1089
|
-
if
|
|
1090
|
-
|
|
1091
|
-
$tags{GPSSpeedRef} = 'K';
|
|
1092
|
-
}
|
|
1093
|
-
if (length $12) {
|
|
1094
|
-
$tags{GPSTrack} = $12;
|
|
1095
|
-
$tags{GPSTrackRef} = 'T';
|
|
1096
|
-
}
|
|
1085
|
+
$tags{GPSSpeed} = $11 * $knotsToKph if length $11;
|
|
1086
|
+
$tags{GPSTrack} = $12 if length $12;
|
|
1097
1087
|
}
|
|
1098
1088
|
$tags{GSensor} = $1 if $$dataPt =~ /\bgsensori,(.*?)(;|$)/;
|
|
1099
1089
|
$tags{Car} = $1 if $$dataPt =~ /\bCAR,(.*?)(;|$)/;
|
|
@@ -1268,8 +1258,7 @@ sub ProcessSamples($)
|
|
|
1268
1258
|
next if length($buff) < 20 + $n;
|
|
1269
1259
|
$et->HandleTag($tagTbl, GPSLatitude => Get32s(\$buff, 12+$n) * 180/0x80000000);
|
|
1270
1260
|
$et->HandleTag($tagTbl, GPSLongitude => Get32s(\$buff, 16+$n) * 180/0x80000000);
|
|
1271
|
-
$et->HandleTag($tagTbl, GPSSpeed
|
|
1272
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
1261
|
+
$et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, 8+$n) * $mphToKph);
|
|
1273
1262
|
SetGPSDateTime($et, $tagTbl, $time[$i]);
|
|
1274
1263
|
next; # all done (don't store/process as text)
|
|
1275
1264
|
}
|
|
@@ -1521,7 +1510,24 @@ sub ProcessFreeGPS($$$)
|
|
|
1521
1510
|
$trk -= 360 if $trk >= 360;
|
|
1522
1511
|
SetByteOrder('MM');
|
|
1523
1512
|
|
|
1524
|
-
} elsif ($$dataPt =~ /^.{
|
|
1513
|
+
} elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) {
|
|
1514
|
+
|
|
1515
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 01 00 00 [..@.freeGPS ....]
|
|
1516
|
+
# 0010: 5a 58 53 42 4e 58 59 53 00 00 00 00 00 00 00 00 [ZXSBNXYS........]
|
|
1517
|
+
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
1518
|
+
# 0030: 00 00 00 00 00 00 00 00 00 00 00 00 34 57 60 62 [............4W`b]
|
|
1519
|
+
# 0040: 5d 53 3c 41 44 45 41 41 42 3e 40 40 3c 51 3c 45 []S<ADEAAB>@@<Q<E]
|
|
1520
|
+
# 0050: 41 40 43 3e 41 47 49 48 44 3c 5e 3c 40 41 46 43 [A@C>AGIHD<^<@AFC]
|
|
1521
|
+
# 0060: 42 3e 49 49 40 42 45 3c 55 3c 45 47 3e 45 43 41 [B>II@BE<U<EG>ECA]
|
|
1522
|
+
# decipher $GPRMC by subtracting 16 from each character value
|
|
1523
|
+
$_ = pack 'C*', map { $_>=16 and $_-=16 } unpack('x60C80', $$dataPt);
|
|
1524
|
+
return 0 unless /[A-Z]{2}RMC,(\d{2})(\d{2})(\d+(\.\d*)?),A?,(\d*?\d{1,2}\.\d+),([NS]),(\d*?\d{1,2}\.\d+),([EW]),(\d*\.?\d*),(\d*\.?\d*),(\d{2})(\d{2})(\d+)/;
|
|
1525
|
+
($yr,$mon,$day,$hr,$min,$sec,$lat,$latRef,$lon,$lonRef) = ($13,$12,$11,$1,$2,$3,$5,$6,$7,$8);
|
|
1526
|
+
$yr += ($yr >= 70 ? 1900 : 2000);
|
|
1527
|
+
$spd = $9 * $knotsToKph if length $9;
|
|
1528
|
+
$trk = $10 if length $10;
|
|
1529
|
+
|
|
1530
|
+
} elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0/s) {
|
|
1525
1531
|
|
|
1526
1532
|
# Akaso V1 dascham
|
|
1527
1533
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
|
|
@@ -1533,6 +1539,17 @@ sub ProcessFreeGPS($$$)
|
|
|
1533
1539
|
# 0060: 4b dc c8 41 9a 79 a7 43 34 58 43 31 4f 37 31 35 [K..A.y.C4XC1O715]
|
|
1534
1540
|
# 0070: 35 31 32 36 36 35 37 35 59 4e 44 53 0d e7 cc f9 [51266575YNDS....]
|
|
1535
1541
|
# 0080: 00 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
1542
|
+
# Redtiger F7N dashcam
|
|
1543
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 01 00 00 [..@.freeGPS ....]
|
|
1544
|
+
# 0010: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
1545
|
+
# 0020: 01 00 00 00 b0 56 50 01 7b 18 68 45 17 02 3f 46 [.....VP.{.hE..?F]
|
|
1546
|
+
# 0030: 13 00 00 00 01 00 00 00 06 00 00 00 15 00 00 00 [................]
|
|
1547
|
+
# 0040: 0c 00 00 00 1c 00 00 00 41 4e 57 00 00 00 00 00 [........ANW.....]
|
|
1548
|
+
# 0050: 80 d4 26 4e 36 11 b5 40 74 b5 15 7b cd 7b f3 40 [..&N6..@t..{.{.@]
|
|
1549
|
+
# 0060: 0a d7 a3 3d cd 4c 4e 43 38 34 37 41 45 48 31 36 [...=.LNC847AEH16]
|
|
1550
|
+
# 0070: 33 36 30 38 32 34 35 37 59 53 4b 4a 01 00 00 00 [36082457YSKJ....]
|
|
1551
|
+
# 0080: ec ff ff ff 00 00 00 00 0e 00 00 00 01 00 00 00 [................]
|
|
1552
|
+
# 0090: 0a 00 00 00 e5 07 00 00 0c 00 00 00 1c 00 00 00 [................]
|
|
1536
1553
|
($hr,$min,$sec,$yr,$mon,$day,$stat,$latRef,$lonRef) =
|
|
1537
1554
|
unpack('x48V6a1a1a1x1', $$dataPt);
|
|
1538
1555
|
# ignore invalid fixes
|
|
@@ -1575,6 +1592,31 @@ sub ProcessFreeGPS($$$)
|
|
|
1575
1592
|
substr($time,7,6) = pack 'C*', map { $_ ^= 0x70 } unpack 'C*', substr($time,7,6);
|
|
1576
1593
|
# (other values are currently unknown)
|
|
1577
1594
|
|
|
1595
|
+
} elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) {
|
|
1596
|
+
|
|
1597
|
+
# Vantrue S1 dashcam
|
|
1598
|
+
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
|
|
1599
|
+
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
1600
|
+
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
1601
|
+
# 0030: 68 6f 72 73 6f 6e 74 65 63 68 00 00 00 00 00 00 [horsontech......]
|
|
1602
|
+
# 0040: 41 4e 45 00 15 00 00 00 07 00 00 00 02 00 00 00 [ANE.............]
|
|
1603
|
+
# 0050: 03 00 00 00 35 00 00 00 05 00 00 00 4f 74 4c 44 [....5.......OtLD]
|
|
1604
|
+
# 0060: e2 77 a0 45 89 c1 98 42 71 bd ac 42 02 ab 0d 43 [.w.E...Bq..B...C]
|
|
1605
|
+
# 0070: 05 00 00 00 7f 00 00 00 07 01 00 00 00 00 00 00 [................]
|
|
1606
|
+
($latRef, $lonRef) = ($1, $2);
|
|
1607
|
+
($yr,$mon,$day,$hr,$min,$sec,@acc) = unpack('x68V6x20V3', $$dataPt);
|
|
1608
|
+
return 0 unless $mon>=1 and $mon<=12 and $day>=1 and $day<=31;
|
|
1609
|
+
$yr += 2000 if $yr < 2000;
|
|
1610
|
+
# (not sure about acc scaling)
|
|
1611
|
+
map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1000 } @acc;
|
|
1612
|
+
SetByteOrder('II');
|
|
1613
|
+
$lon = GetFloat($dataPt, 0x5c);
|
|
1614
|
+
$lat = GetFloat($dataPt, 0x60);
|
|
1615
|
+
$spd = GetFloat($dataPt, 0x64) * $knotsToKph;
|
|
1616
|
+
$trk = GetFloat($dataPt, 0x68);
|
|
1617
|
+
$alt = GetFloat($dataPt, 0x6c);
|
|
1618
|
+
SetByteOrder('MM');
|
|
1619
|
+
|
|
1578
1620
|
} else {
|
|
1579
1621
|
|
|
1580
1622
|
# decode binary GPS format (Viofo A119S, ref 2)
|
|
@@ -1625,14 +1667,8 @@ sub ProcessFreeGPS($$$)
|
|
|
1625
1667
|
$et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
|
|
1626
1668
|
$et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
|
|
1627
1669
|
$et->HandleTag($tagTbl, GPSAltitude => $alt) if defined $alt;
|
|
1628
|
-
if
|
|
1629
|
-
|
|
1630
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
1631
|
-
}
|
|
1632
|
-
if (defined $trk) {
|
|
1633
|
-
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
1634
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
1635
|
-
}
|
|
1670
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd;
|
|
1671
|
+
$et->HandleTag($tagTbl, GPSTrack => $trk) if defined $trk;
|
|
1636
1672
|
while (@xtra) {
|
|
1637
1673
|
my $tag = shift @xtra;
|
|
1638
1674
|
$et->HandleTag($tagTbl, $tag => shift @xtra);
|
|
@@ -1751,9 +1787,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1751
1787
|
$et->HandleTag($tagTbl, GPSLatitude => Get32s(\$b, 0x10) / 1e7);
|
|
1752
1788
|
$et->HandleTag($tagTbl, GPSLongitude => Get32s(\$b, 0x18) / 1e7);
|
|
1753
1789
|
$et->HandleTag($tagTbl, GPSSpeed => Get32s(\$b, 0x20) / 100 * $mpsToKph);
|
|
1754
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
1755
1790
|
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
1756
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
1757
1791
|
$et->HandleTag($tagTbl, GPSAltitude => Get32s(\$b, 0x28) / 1000);
|
|
1758
1792
|
$lastRecPos = $recPos;
|
|
1759
1793
|
$foundNew = 1;
|
|
@@ -1879,9 +1913,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1879
1913
|
$et->HandleTag($tagTbl, GPSLatitude => $lat * (substr($dat,1,1) eq 'S' ? -1 : 1));
|
|
1880
1914
|
$et->HandleTag($tagTbl, GPSLongitude => $lon * (substr($dat,2,1) eq 'W' ? -1 : 1));
|
|
1881
1915
|
$et->HandleTag($tagTbl, GPSSpeed => $spd);
|
|
1882
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
1883
1916
|
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
1884
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
1885
1917
|
$et->HandleTag($tagTbl, Accelerometer => "@acc");
|
|
1886
1918
|
}
|
|
1887
1919
|
return 1;
|
|
@@ -1927,9 +1959,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1927
1959
|
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
|
1928
1960
|
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
|
1929
1961
|
$et->HandleTag($tagTbl, GPSSpeed => $spd / 100 * $mpsToKph);
|
|
1930
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
1931
1962
|
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
1932
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
1933
1963
|
last if $pos += 0x20 > length($$dataPt) - 0x1e;
|
|
1934
1964
|
}
|
|
1935
1965
|
return $$et{DOC_NUM} ? 1 : 0; # return 0 if nothing extracted
|
|
@@ -1946,14 +1976,8 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
1946
1976
|
$et->HandleTag($tagTbl, GPSDateTime => $time);
|
|
1947
1977
|
$et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
|
|
1948
1978
|
$et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
|
|
1949
|
-
if
|
|
1950
|
-
|
|
1951
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
1952
|
-
}
|
|
1953
|
-
if (defined $trk) {
|
|
1954
|
-
$et->HandleTag($tagTbl, GPSTrack => $trk);
|
|
1955
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
1956
|
-
}
|
|
1979
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd; # (now in km/h)
|
|
1980
|
+
$et->HandleTag($tagTbl, GPSTrack => $trk) if defined $trk;
|
|
1957
1981
|
if (defined $alt) {
|
|
1958
1982
|
$et->HandleTag($tagTbl, GPSAltitude => $alt);
|
|
1959
1983
|
}
|
|
@@ -2051,8 +2075,7 @@ sub ParseTag($$$)
|
|
|
2051
2075
|
$lon = -abs($lon) if $a[6] eq 'W';
|
|
2052
2076
|
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
|
2053
2077
|
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
|
2054
|
-
$et->HandleTag($tagTbl, GPSSpeed
|
|
2055
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
2078
|
+
$et->HandleTag($tagTbl, GPSSpeed => $a[3] / 1e3);
|
|
2056
2079
|
$pos += 36;
|
|
2057
2080
|
}
|
|
2058
2081
|
SetByteOrder('MM');
|
|
@@ -2201,9 +2224,7 @@ sub Process_gps0($$$)
|
|
|
2201
2224
|
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
|
2202
2225
|
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
|
2203
2226
|
$et->HandleTag($tagTbl, GPSSpeed => Get16u($dataPt, $pos+0x14));
|
|
2204
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
2205
2227
|
$et->HandleTag($tagTbl, GPSTrack => Get8u($dataPt, $pos+0x1c) * 2); # (NC)
|
|
2206
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
2207
2228
|
$et->HandleTag($tagTbl, GPSAltitude => Get32s($dataPt, $pos + 0x10));
|
|
2208
2229
|
# yet to be decoded:
|
|
2209
2230
|
# 0x1d - int8u[3] seen: "1 1 0"
|
|
@@ -2302,9 +2323,7 @@ sub ProcessRIFFTrailer($$$)
|
|
|
2302
2323
|
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
|
2303
2324
|
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
|
2304
2325
|
$et->HandleTag($tagTbl, GPSSpeed => Get16u(\$buff, $pos+0x18) * $knotsToKph);
|
|
2305
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
2306
2326
|
$et->HandleTag($tagTbl, GPSTrack => Get8u(\$buff, $pos+0x20) * 2);
|
|
2307
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
2308
2327
|
}
|
|
2309
2328
|
} elsif ($tag eq 'gsen') {
|
|
2310
2329
|
# (similar to record decoded in Process_gsen)
|
|
@@ -2358,17 +2377,11 @@ sub ProcessNMEA($$$)
|
|
|
2358
2377
|
$et->HandleTag($tagTbl, GPSDateTime => $fix{dat});
|
|
2359
2378
|
$et->HandleTag($tagTbl, GPSLatitude => $fix{lat});
|
|
2360
2379
|
$et->HandleTag($tagTbl, GPSLongitude => $fix{lon});
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
}
|
|
2365
|
-
|
|
2366
|
-
$et->HandleTag($tagTbl, GPSTrack => $fix{trk});
|
|
2367
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
2368
|
-
}
|
|
2369
|
-
$et->HandleTag($tagTbl, GPSAltitude => $fix{alt}) if defined $fix{alt};
|
|
2370
|
-
$et->HandleTag($tagTbl, GPSSatellites => $fix{nsats}+0) if defined $fix{nsats};
|
|
2371
|
-
$et->HandleTag($tagTbl, GPSDOP => $fix{hdop}) if defined $fix{hdop};
|
|
2380
|
+
$et->HandleTag($tagTbl, GPSSpeed => $fix{spd} * $knotsToKph) if defined $fix{spd};
|
|
2381
|
+
$et->HandleTag($tagTbl, GPSTrack => $fix{trk}) if defined $fix{trk};
|
|
2382
|
+
$et->HandleTag($tagTbl, GPSAltitude => $fix{alt}) if defined $fix{alt};
|
|
2383
|
+
$et->HandleTag($tagTbl, GPSSatellites=> $fix{nsats}+0) if defined $fix{nsats};
|
|
2384
|
+
$et->HandleTag($tagTbl, GPSDOP => $fix{hdop}) if defined $fix{hdop};
|
|
2372
2385
|
}
|
|
2373
2386
|
undef %fix;
|
|
2374
2387
|
}
|
|
@@ -2522,9 +2535,7 @@ sub ProcessTTAD($$$)
|
|
|
2522
2535
|
$et->HandleTag($tagTbl, GPSLongitude => GetDouble($dataPt, $pos+0x24));
|
|
2523
2536
|
$et->HandleTag($tagTbl, GPSAltitude => GetDouble($dataPt, $pos+0x14));
|
|
2524
2537
|
$et->HandleTag($tagTbl, GPSSpeed => GetDouble($dataPt, $pos+0x0c) * $mpsToKph);
|
|
2525
|
-
$et->HandleTag($tagTbl, GPSSpeedRef => 'K');
|
|
2526
2538
|
$et->HandleTag($tagTbl, GPSTrack => GetDouble($dataPt, $pos+0x30));
|
|
2527
|
-
$et->HandleTag($tagTbl, GPSTrackRef => 'T');
|
|
2528
2539
|
if ($unknown) {
|
|
2529
2540
|
my @a = map { GetDouble($dataPt, $pos+0x38+8*$_) } 0..2;
|
|
2530
2541
|
$et->HandleTag($tagTbl, Unknown03 => "@a");
|
|
@@ -2572,7 +2583,7 @@ sub ProcessInsta360($;$)
|
|
|
2572
2583
|
my $trailerLen = unpack('x38V', $buff);
|
|
2573
2584
|
$trailerLen > $fileEnd and $et->Warn('Bad Insta360 trailer size'), return 0;
|
|
2574
2585
|
if ($dirInfo) {
|
|
2575
|
-
$$dirInfo{DirLen} = $trailerLen
|
|
2586
|
+
$$dirInfo{DirLen} = $trailerLen;
|
|
2576
2587
|
$$dirInfo{DataPos} = $fileEnd - $trailerLen;
|
|
2577
2588
|
if ($$dirInfo{OutFile}) {
|
|
2578
2589
|
if ($$et{DEL_GROUP}{Insta360}) {
|
|
@@ -2657,15 +2668,13 @@ sub ProcessInsta360($;$)
|
|
|
2657
2668
|
$a[$_] = GetDouble(\$a[$_], 0) foreach 4,6,8,9,10;
|
|
2658
2669
|
$a[4] = -abs($a[4]) if $a[5] eq 'S'; # (abs just in case it was already signed)
|
|
2659
2670
|
$a[6] = -abs($a[6]) if $a[7] ne 'E';
|
|
2660
|
-
$et->HandleTag($tagTbl, GPSDateTime
|
|
2661
|
-
$et->HandleTag($tagTbl, GPSLatitude
|
|
2671
|
+
$et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($a[0]) . 'Z');
|
|
2672
|
+
$et->HandleTag($tagTbl, GPSLatitude => $a[4]);
|
|
2662
2673
|
$et->HandleTag($tagTbl, GPSLongitude => $a[6]);
|
|
2663
|
-
$et->HandleTag($tagTbl, GPSSpeed
|
|
2664
|
-
$et->HandleTag($tagTbl,
|
|
2665
|
-
$et->HandleTag($tagTbl,
|
|
2666
|
-
$et->HandleTag($tagTbl,
|
|
2667
|
-
$et->HandleTag($tagTbl, GPSAltitude => $a[10]);
|
|
2668
|
-
$et->HandleTag($tagTbl, Unknown02 => "@a[1,2]") if $unknown; # millisecond counter (https://exiftool.org/forum/index.php?topic=9884.msg65143#msg65143)
|
|
2674
|
+
$et->HandleTag($tagTbl, GPSSpeed => $a[8] * $mpsToKph);
|
|
2675
|
+
$et->HandleTag($tagTbl, GPSTrack => $a[9]);
|
|
2676
|
+
$et->HandleTag($tagTbl, GPSAltitude => $a[10]);
|
|
2677
|
+
$et->HandleTag($tagTbl, Unknown02 => "@a[1,2]") if $unknown; # millisecond counter (https://exiftool.org/forum/index.php?topic=9884.msg65143#msg65143)
|
|
2669
2678
|
}
|
|
2670
2679
|
}
|
|
2671
2680
|
} elsif ($id == 0x101) {
|
|
@@ -2721,6 +2730,41 @@ sub Process360Fly($$$)
|
|
|
2721
2730
|
return 1;
|
|
2722
2731
|
}
|
|
2723
2732
|
|
|
2733
|
+
#------------------------------------------------------------------------------
|
|
2734
|
+
# Process GPS from Vantrue N2S dashcam
|
|
2735
|
+
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
2736
|
+
# Returns: 1 on success
|
|
2737
|
+
sub ProcessFMAS($$$)
|
|
2738
|
+
{
|
|
2739
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
|
2740
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
2741
|
+
return 0 unless $$dataPt =~ /^FMAS\0\0\0\0.{72}SAMM.{36}A/s and length($$dataPt) >= 160;
|
|
2742
|
+
$et->VerboseDir('FMAS', undef, length($$dataPt));
|
|
2743
|
+
# 0000: 46 4d 41 53 00 00 00 00 00 00 00 00 00 00 00 00 [FMAS............]
|
|
2744
|
+
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
2745
|
+
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
2746
|
+
# 0030: 02 08 01 08 06 08 02 04 07 02 06 00 00 00 00 00 [................]
|
|
2747
|
+
# 0040: 00 00 00 00 00 00 00 00 4f 46 4e 49 4d 4d 41 53 [........OFNIMMAS]
|
|
2748
|
+
# 0050: 53 41 4d 4d 01 00 00 00 00 00 00 00 00 00 00 00 [SAMM............]
|
|
2749
|
+
# 0060: e5 07 09 18 08 00 22 00 02 00 00 00 a1 82 8a bf [......".........]
|
|
2750
|
+
# 0070: 89 23 8e bd 0b 2c 30 bc 41 57 4e 51 16 00 a1 01 [.#...,0.AWNQ....]
|
|
2751
|
+
# 0080: 29 26 27 0c 4b 00 49 00 00 00 00 00 00 00 00 00 [)&'.K.I.........]
|
|
2752
|
+
# 0090: 00 00 00 00 00 00 00 00 00 52 00 00 00 00 00 00 [.........R......]
|
|
2753
|
+
my @a = unpack('x96vCCCCCCx16AAACCCvCCvvv',$$dataPt);
|
|
2754
|
+
SetByteOrder('II');
|
|
2755
|
+
my $acc = ReadValue($dataPt, 0x6c, 'float', 3); # (looks like Z comes first in my sample)
|
|
2756
|
+
my $lon = $a[10] + ($a[11] + $a[13]/6000) / 60; # (why zero byte at $a[12]?)
|
|
2757
|
+
my $lat = $a[14] + ($a[15] + $a[16]/6000) / 60;
|
|
2758
|
+
$et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @a[0..5]));
|
|
2759
|
+
$et->HandleTag($tagTbl, GPSLatitude => $lat * ($a[9] eq 'S' ? -1 : 1));
|
|
2760
|
+
$et->HandleTag($tagTbl, GPSLongitude => $lon * ($a[8] eq 'W' ? -1 : 1));
|
|
2761
|
+
$et->HandleTag($tagTbl, GPSSpeed => $a[17] * $mphToKph); # convert mph -> kph
|
|
2762
|
+
$et->HandleTag($tagTbl, GPSTrack => $a[18]);
|
|
2763
|
+
$et->HandleTag($tagTbl, Accelerometer=> $acc);
|
|
2764
|
+
SetByteOrder('MM');
|
|
2765
|
+
return 1;
|
|
2766
|
+
}
|
|
2767
|
+
|
|
2724
2768
|
#------------------------------------------------------------------------------
|
|
2725
2769
|
# Scan media data for "freeGPS" metadata if not found already (ref PH)
|
|
2726
2770
|
# Inputs: 0) ExifTool ref
|
|
@@ -2822,7 +2866,7 @@ information like GPS tracks from MOV, MP4 and INSV media data.
|
|
|
2822
2866
|
|
|
2823
2867
|
=head1 AUTHOR
|
|
2824
2868
|
|
|
2825
|
-
Copyright 2003-
|
|
2869
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
2826
2870
|
|
|
2827
2871
|
This library is free software; you can redistribute it and/or modify it
|
|
2828
2872
|
under the same terms as Perl itself.
|
|
@@ -408,6 +408,9 @@ numerical, and generated automatically otherwise.
|
|
|
408
408
|
to be evaluated. Expression may access $val and $et,
|
|
409
409
|
and is evaluated only when reading.
|
|
410
410
|
|
|
411
|
+
'iTXt' - [PNG TextualData tags only] flag to write tag as PNG
|
|
412
|
+
iTXt chunk even if it contains no special characters.
|
|
413
|
+
|
|
411
414
|
'List' - flag indicating that duplicate entries of this tag
|
|
412
415
|
are allowed, and will be accumulated in a list. Note that for
|
|
413
416
|
XMP information, 3 different types of lists are supported and
|
|
@@ -447,6 +450,10 @@ numerical, and generated automatically otherwise.
|
|
|
447
450
|
may be written if the tag already exists. By default, all
|
|
448
451
|
MakerNotes tags are permanent unless otherwise specified.
|
|
449
452
|
|
|
453
|
+
'PreservePadding' - [QuickTime only] flag to preserve the
|
|
454
|
+
original size of the QuickTime atom by padding with nulls when
|
|
455
|
+
writing with the QuickTimePad option.
|
|
456
|
+
|
|
450
457
|
'PrintHex' - specifies that unknown PrintConv values should
|
|
451
458
|
be printed in hex (eg. 'Unknown (0x1)'). Also causes
|
|
452
459
|
numerical tag values to be printed in hex in the HTML tag name
|
|
@@ -471,9 +478,9 @@ numerical, and generated automatically otherwise.
|
|
|
471
478
|
tags in IFD1 of JPEG images which default to priority 0.
|
|
472
479
|
|
|
473
480
|
'Protected' - bit mask to protect tags from writing:
|
|
474
|
-
Bit 0x01 indicates an '
|
|
481
|
+
Bit 0x01 indicates an 'Unsafe' tag, which is not set via
|
|
475
482
|
SetNewValuesFromFile() unless specified explicitly.
|
|
476
|
-
Bit 0x02 indicates a '
|
|
483
|
+
Bit 0x02 indicates a 'Protected' tag, which should not be set
|
|
477
484
|
directly by the user.
|
|
478
485
|
|
|
479
486
|
'PutFirst' - [EXIF only] flag to place this value before IFD0
|
|
@@ -2029,7 +2029,7 @@ including AVI videos, WAV audio files and WEBP images.
|
|
|
2029
2029
|
|
|
2030
2030
|
=head1 AUTHOR
|
|
2031
2031
|
|
|
2032
|
-
Copyright 2003-
|
|
2032
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
2033
2033
|
|
|
2034
2034
|
This library is free software; you can redistribute it and/or modify it
|
|
2035
2035
|
under the same terms as Perl itself.
|
|
@@ -225,7 +225,7 @@ resource files.
|
|
|
225
225
|
|
|
226
226
|
=head1 AUTHOR
|
|
227
227
|
|
|
228
|
-
Copyright 2003-
|
|
228
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
229
229
|
|
|
230
230
|
This library is free software; you can redistribute it and/or modify it
|
|
231
231
|
under the same terms as Perl itself.
|
|
@@ -366,7 +366,7 @@ information from RTF (Rich Text Format) documents.
|
|
|
366
366
|
|
|
367
367
|
=head1 AUTHOR
|
|
368
368
|
|
|
369
|
-
Copyright 2003-
|
|
369
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
370
370
|
|
|
371
371
|
This library is free software; you can redistribute it and/or modify it
|
|
372
372
|
under the same terms as Perl itself.
|
|
@@ -125,7 +125,7 @@ images are a type of high dynamic-range image.
|
|
|
125
125
|
|
|
126
126
|
=head1 AUTHOR
|
|
127
127
|
|
|
128
|
-
Copyright 2003-
|
|
128
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
129
129
|
|
|
130
130
|
This library is free software; you can redistribute it and/or modify it
|
|
131
131
|
under the same terms as Perl itself.
|
|
@@ -168,7 +168,7 @@ information from Rawzor compressed images.
|
|
|
168
168
|
|
|
169
169
|
=head1 AUTHOR
|
|
170
170
|
|
|
171
|
-
Copyright 2003-
|
|
171
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
172
172
|
|
|
173
173
|
This library is free software; you can redistribute it and/or modify it
|
|
174
174
|
under the same terms as Perl itself.
|
|
@@ -715,7 +715,7 @@ little-endian, but the Real format is big-endian.
|
|
|
715
715
|
|
|
716
716
|
=head1 AUTHOR
|
|
717
717
|
|
|
718
|
-
Copyright 2003-
|
|
718
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
719
719
|
|
|
720
720
|
This library is free software; you can redistribute it and/or modify it
|
|
721
721
|
under the same terms as Perl itself.
|
|
@@ -431,7 +431,7 @@ maker notes in images from Reconyx cameras.
|
|
|
431
431
|
|
|
432
432
|
=head1 AUTHOR
|
|
433
433
|
|
|
434
|
-
Copyright 2003-
|
|
434
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
435
435
|
|
|
436
436
|
This library is free software; you can redistribute it and/or modify it
|
|
437
437
|
under the same terms as Perl itself.
|
|
@@ -303,7 +303,7 @@ from Redcode R3D version 1 and 2 video files.
|
|
|
303
303
|
|
|
304
304
|
=head1 AUTHOR
|
|
305
305
|
|
|
306
|
-
Copyright 2003-
|
|
306
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
307
307
|
|
|
308
308
|
This library is free software; you can redistribute it and/or modify it
|
|
309
309
|
under the same terms as Perl itself.
|
|
@@ -1143,7 +1143,7 @@ interpret Ricoh maker notes EXIF meta information.
|
|
|
1143
1143
|
|
|
1144
1144
|
=head1 AUTHOR
|
|
1145
1145
|
|
|
1146
|
-
Copyright 2003-
|
|
1146
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
1147
1147
|
|
|
1148
1148
|
This library is free software; you can redistribute it and/or modify it
|
|
1149
1149
|
under the same terms as Perl itself.
|
|
@@ -1485,7 +1485,7 @@ Samsung maker notes in EXIF information.
|
|
|
1485
1485
|
|
|
1486
1486
|
=head1 AUTHOR
|
|
1487
1487
|
|
|
1488
|
-
Copyright 2003-
|
|
1488
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
1489
1489
|
|
|
1490
1490
|
This library is free software; you can redistribute it and/or modify it
|
|
1491
1491
|
under the same terms as Perl itself.
|
|
@@ -419,7 +419,7 @@ Sanyo maker notes in EXIF information.
|
|
|
419
419
|
|
|
420
420
|
=head1 AUTHOR
|
|
421
421
|
|
|
422
|
-
Copyright 2003-
|
|
422
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
423
423
|
|
|
424
424
|
This library is free software; you can redistribute it and/or modify it
|
|
425
425
|
under the same terms as Perl itself.
|
|
@@ -128,7 +128,7 @@ metadata from the JPEG APP4 SCALADO segment.
|
|
|
128
128
|
|
|
129
129
|
=head1 AUTHOR
|
|
130
130
|
|
|
131
|
-
Copyright 2003-
|
|
131
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
132
132
|
|
|
133
133
|
This library is free software; you can redistribute it and/or modify it
|
|
134
134
|
under the same terms as Perl itself.
|
|
@@ -304,6 +304,8 @@ sub ShiftTime($;$$$)
|
|
|
304
304
|
$mode = defined $time[3] ? 'DateTime' : 'Date';
|
|
305
305
|
} elsif (defined $time[3]) {
|
|
306
306
|
$mode = 'Time';
|
|
307
|
+
} else {
|
|
308
|
+
$mode = '';
|
|
307
309
|
}
|
|
308
310
|
# get number of digits after the seconds decimal point
|
|
309
311
|
if (defined $time[5] and $time[5] =~ /\.(\d+)/) {
|
|
@@ -630,7 +632,7 @@ limited to the range 1970 to 2038 on 32-bit systems.
|
|
|
630
632
|
|
|
631
633
|
=head1 AUTHOR
|
|
632
634
|
|
|
633
|
-
Copyright 2003-
|
|
635
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
634
636
|
|
|
635
637
|
This library is free software; you can redistribute it and/or modify it
|
|
636
638
|
under the same terms as Perl itself.
|
|
@@ -341,7 +341,7 @@ name prefix.
|
|
|
341
341
|
|
|
342
342
|
=head1 AUTHOR
|
|
343
343
|
|
|
344
|
-
Copyright 2003-
|
|
344
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
345
345
|
|
|
346
346
|
This library is free software; you can redistribute it and/or modify it
|
|
347
347
|
under the same terms as Perl itself.
|
|
@@ -837,7 +837,7 @@ Sigma and Foveon maker notes in EXIF information.
|
|
|
837
837
|
|
|
838
838
|
=head1 AUTHOR
|
|
839
839
|
|
|
840
|
-
Copyright 2003-
|
|
840
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
841
841
|
|
|
842
842
|
This library is free software; you can redistribute it and/or modify it
|
|
843
843
|
under the same terms as Perl itself.
|
|
@@ -650,7 +650,7 @@ Sigma and Foveon X3F images.
|
|
|
650
650
|
|
|
651
651
|
=head1 AUTHOR
|
|
652
652
|
|
|
653
|
-
Copyright 2003-
|
|
653
|
+
Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
|
|
654
654
|
|
|
655
655
|
This library is free software; you can redistribute it and/or modify it
|
|
656
656
|
under the same terms as Perl itself.
|