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.
Files changed (196) hide show
  1. package/LICENSE +254 -247
  2. package/bin/exiftool_files/Changes +130 -4
  3. package/bin/exiftool_files/README +45 -45
  4. package/bin/exiftool_files/arg_files/xmp2exif.args +2 -1
  5. package/bin/exiftool_files/exiftool.pl +143 -101
  6. package/bin/exiftool_files/lib/File/RandomAccess.pm +1 -1
  7. package/bin/exiftool_files/lib/File/RandomAccess.pod +2 -2
  8. package/bin/exiftool_files/lib/Image/ExifTool/AES.pm +1 -1
  9. package/bin/exiftool_files/lib/Image/ExifTool/AFCP.pm +1 -1
  10. package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +1 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +1 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/APP12.pm +1 -1
  13. package/bin/exiftool_files/lib/Image/ExifTool/ASF.pm +1 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +1 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/Audible.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/BMP.pm +1 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/BPG.pm +1 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/BZZ.pm +1 -1
  19. package/bin/exiftool_files/lib/Image/ExifTool/BigTIFF.pm +1 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +17 -5
  21. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +331 -0
  22. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +171 -13
  23. package/bin/exiftool_files/lib/Image/ExifTool/CanonCustom.pm +13 -3
  24. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +1 -1
  25. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +1 -1
  26. package/bin/exiftool_files/lib/Image/ExifTool/CaptureOne.pm +1 -1
  27. package/bin/exiftool_files/lib/Image/ExifTool/Casio.pm +1 -1
  28. package/bin/exiftool_files/lib/Image/ExifTool/Charset.pm +3 -1
  29. package/bin/exiftool_files/lib/Image/ExifTool/DICOM.pm +1 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +1 -1
  31. package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +1 -1
  32. package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +1 -1
  33. package/bin/exiftool_files/lib/Image/ExifTool/DV.pm +1 -1
  34. package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +3 -3
  35. package/bin/exiftool_files/lib/Image/ExifTool/DjVu.pm +1 -1
  36. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +1 -1
  37. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +118 -4
  38. package/bin/exiftool_files/lib/Image/ExifTool/FITS.pm +1 -1
  39. package/bin/exiftool_files/lib/Image/ExifTool/FLAC.pm +1 -1
  40. package/bin/exiftool_files/lib/Image/ExifTool/FLIF.pm +1 -1
  41. package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +48 -11
  42. package/bin/exiftool_files/lib/Image/ExifTool/Fixup.pm +1 -1
  43. package/bin/exiftool_files/lib/Image/ExifTool/Flash.pm +1 -1
  44. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +1 -1
  45. package/bin/exiftool_files/lib/Image/ExifTool/Font.pm +1 -1
  46. package/bin/exiftool_files/lib/Image/ExifTool/FotoStation.pm +1 -1
  47. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -1
  48. package/bin/exiftool_files/lib/Image/ExifTool/GE.pm +1 -1
  49. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +6 -2
  50. package/bin/exiftool_files/lib/Image/ExifTool/GIMP.pm +1 -1
  51. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +15 -11
  52. package/bin/exiftool_files/lib/Image/ExifTool/GeoTiff.pm +1 -1
  53. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +14 -3
  54. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +1 -1
  55. package/bin/exiftool_files/lib/Image/ExifTool/H264.pm +1 -1
  56. package/bin/exiftool_files/lib/Image/ExifTool/HP.pm +1 -1
  57. package/bin/exiftool_files/lib/Image/ExifTool/HTML.pm +1 -1
  58. package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +1 -1
  59. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +97 -5
  60. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +1 -1
  61. package/bin/exiftool_files/lib/Image/ExifTool/IPTC.pm +1 -1
  62. package/bin/exiftool_files/lib/Image/ExifTool/ISO.pm +1 -1
  63. package/bin/exiftool_files/lib/Image/ExifTool/ITC.pm +1 -1
  64. package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +1 -1
  65. package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +1 -1
  66. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +6 -2
  67. package/bin/exiftool_files/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  68. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +8 -4
  69. package/bin/exiftool_files/lib/Image/ExifTool/JVC.pm +1 -1
  70. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +155 -25
  71. package/bin/exiftool_files/lib/Image/ExifTool/Kodak.pm +1 -1
  72. package/bin/exiftool_files/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  73. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +1 -1
  74. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +1 -1
  75. package/bin/exiftool_files/lib/Image/ExifTool/Lang/cs.pm +1 -1
  76. package/bin/exiftool_files/lib/Image/ExifTool/Lang/de.pm +1 -1
  77. package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  78. package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  79. package/bin/exiftool_files/lib/Image/ExifTool/Lang/es.pm +1 -1
  80. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fi.pm +1 -1
  81. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fr.pm +1 -1
  82. package/bin/exiftool_files/lib/Image/ExifTool/Lang/it.pm +1 -1
  83. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ja.pm +1 -1
  84. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ko.pm +1 -1
  85. package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +1 -1
  86. package/bin/exiftool_files/lib/Image/ExifTool/Lang/pl.pm +1 -1
  87. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ru.pm +1 -1
  88. package/bin/exiftool_files/lib/Image/ExifTool/Lang/sv.pm +1 -1
  89. package/bin/exiftool_files/lib/Image/ExifTool/Lang/tr.pm +1 -1
  90. package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  91. package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  92. package/bin/exiftool_files/lib/Image/ExifTool/Leaf.pm +1 -1
  93. package/bin/exiftool_files/lib/Image/ExifTool/Lytro.pm +1 -1
  94. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +1 -1
  95. package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +1 -1
  96. package/bin/exiftool_files/lib/Image/ExifTool/MIEUnits.pod +1 -1
  97. package/bin/exiftool_files/lib/Image/ExifTool/MIFF.pm +1 -1
  98. package/bin/exiftool_files/lib/Image/ExifTool/MNG.pm +1 -1
  99. package/bin/exiftool_files/lib/Image/ExifTool/MOI.pm +1 -1
  100. package/bin/exiftool_files/lib/Image/ExifTool/MPC.pm +1 -1
  101. package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +1 -1
  102. package/bin/exiftool_files/lib/Image/ExifTool/MPF.pm +1 -1
  103. package/bin/exiftool_files/lib/Image/ExifTool/MRC.pm +1 -1
  104. package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -1
  105. package/bin/exiftool_files/lib/Image/ExifTool/MXF.pm +1 -1
  106. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +3 -3
  107. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +1 -1
  108. package/bin/exiftool_files/lib/Image/ExifTool/Matroska.pm +9 -5
  109. package/bin/exiftool_files/lib/Image/ExifTool/Microsoft.pm +1 -1
  110. package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +1 -1
  111. package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  112. package/bin/exiftool_files/lib/Image/ExifTool/Motorola.pm +1 -1
  113. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1895 -74
  114. package/bin/exiftool_files/lib/Image/ExifTool/NikonCapture.pm +1 -1
  115. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +523 -6
  116. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +150 -87
  117. package/bin/exiftool_files/lib/Image/ExifTool/Nintendo.pm +1 -1
  118. package/bin/exiftool_files/lib/Image/ExifTool/OOXML.pm +1 -1
  119. package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +1 -1
  120. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +6 -2
  121. package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +5 -3
  122. package/bin/exiftool_files/lib/Image/ExifTool/Opus.pm +1 -1
  123. package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +1 -1
  124. package/bin/exiftool_files/lib/Image/ExifTool/PCX.pm +1 -1
  125. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +6 -4
  126. package/bin/exiftool_files/lib/Image/ExifTool/PGF.pm +1 -1
  127. package/bin/exiftool_files/lib/Image/ExifTool/PICT.pm +1 -1
  128. package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +1 -1
  129. package/bin/exiftool_files/lib/Image/ExifTool/PLUS.pm +1 -1
  130. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +29 -8
  131. package/bin/exiftool_files/lib/Image/ExifTool/PPM.pm +1 -1
  132. package/bin/exiftool_files/lib/Image/ExifTool/PSP.pm +1 -1
  133. package/bin/exiftool_files/lib/Image/ExifTool/Palm.pm +1 -1
  134. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +3 -3
  135. package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  136. package/bin/exiftool_files/lib/Image/ExifTool/Parrot.pm +1 -1
  137. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +4 -2
  138. package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +1 -1
  139. package/bin/exiftool_files/lib/Image/ExifTool/PhotoCD.pm +1 -1
  140. package/bin/exiftool_files/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  141. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +1 -1
  142. package/bin/exiftool_files/lib/Image/ExifTool/PostScript.pm +1 -1
  143. package/bin/exiftool_files/lib/Image/ExifTool/PrintIM.pm +1 -1
  144. package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +1 -1
  145. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +25 -4
  146. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +125 -81
  147. package/bin/exiftool_files/lib/Image/ExifTool/README +9 -2
  148. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +1 -1
  149. package/bin/exiftool_files/lib/Image/ExifTool/RSRC.pm +1 -1
  150. package/bin/exiftool_files/lib/Image/ExifTool/RTF.pm +1 -1
  151. package/bin/exiftool_files/lib/Image/ExifTool/Radiance.pm +1 -1
  152. package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +1 -1
  153. package/bin/exiftool_files/lib/Image/ExifTool/Real.pm +1 -1
  154. package/bin/exiftool_files/lib/Image/ExifTool/Reconyx.pm +1 -1
  155. package/bin/exiftool_files/lib/Image/ExifTool/Red.pm +1 -1
  156. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +1 -1
  157. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +1 -1
  158. package/bin/exiftool_files/lib/Image/ExifTool/Sanyo.pm +1 -1
  159. package/bin/exiftool_files/lib/Image/ExifTool/Scalado.pm +1 -1
  160. package/bin/exiftool_files/lib/Image/ExifTool/Shift.pl +3 -1
  161. package/bin/exiftool_files/lib/Image/ExifTool/Shortcuts.pm +1 -1
  162. package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +1 -1
  163. package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  164. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +34 -14
  165. package/bin/exiftool_files/lib/Image/ExifTool/SonyIDC.pm +1 -1
  166. package/bin/exiftool_files/lib/Image/ExifTool/Stim.pm +1 -1
  167. package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +11 -6
  168. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6589 -5877
  169. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +1681 -65
  170. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +1 -1
  171. package/bin/exiftool_files/lib/Image/ExifTool/Theora.pm +1 -1
  172. package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +1 -1
  173. package/bin/exiftool_files/lib/Image/ExifTool/Unknown.pm +1 -1
  174. package/bin/exiftool_files/lib/Image/ExifTool/VCard.pm +1 -1
  175. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +1 -1
  176. package/bin/exiftool_files/lib/Image/ExifTool/Vorbis.pm +1 -1
  177. package/bin/exiftool_files/lib/Image/ExifTool/WTV.pm +1 -1
  178. package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  179. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +1 -1
  180. package/bin/exiftool_files/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  181. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
  182. package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +30 -10
  183. package/bin/exiftool_files/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  184. package/bin/exiftool_files/lib/Image/ExifTool/WritePostScript.pl +1 -1
  185. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +12 -1
  186. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +11 -12
  187. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +56 -10
  188. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +164 -52
  189. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +6 -3
  190. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +4 -2
  191. package/bin/exiftool_files/lib/Image/ExifTool/ZIP.pm +10 -2
  192. package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +1 -1
  193. package/bin/exiftool_files/lib/Image/ExifTool/iWork.pm +1 -1
  194. package/bin/exiftool_files/lib/Image/ExifTool.pm +8939 -8864
  195. package/bin/exiftool_files/lib/Image/ExifTool.pod +76 -67
  196. 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 55 different formats of timed GPS metadata from video files.
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' }, # round to 4 decimals
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' }, # round to 4 decimals
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 (length $10) {
905
- $tags{GPSSpeed} = $10 * $knotsToKph;
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 ($val =~ /^\d+$/) {
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 ($$dataPt =~ /,\s*H.S\s+([-+]?\d+\.?\d*)/) {
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 (length $11) {
1090
- $tags{GPSSpeed} = $11 * $knotsToKph;
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 => Get16u(\$buff, 8+$n) * $mphToKph);
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 =~ /^.{16}YndAkasoCar/s) {
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 (defined $spd) {
1629
- $et->HandleTag($tagTbl, GPSSpeed => $spd);
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 (defined $spd) {
1950
- $et->HandleTag($tagTbl, GPSSpeed => $spd); # (now in km/h)
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 => $a[3] / 1e3);
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
- if (defined $fix{spd}) {
2362
- $et->HandleTag($tagTbl, GPSSpeed => $fix{spd} * $knotsToKph);
2363
- $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
2364
- }
2365
- if (defined $fix{trk}) {
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 if $dirInfo;
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 => Image::ExifTool::ConvertUnixTime($a[0]) . 'Z');
2661
- $et->HandleTag($tagTbl, GPSLatitude => $a[4]);
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 => $a[8] * $mpsToKph);
2664
- $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
2665
- $et->HandleTag($tagTbl, GPSTrack => $a[9]);
2666
- $et->HandleTag($tagTbl, GPSTrackRef => 'T');
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-2021, Phil Harvey (philharvey66 at gmail.com)
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 'unsafe' tag, which is not set via
481
+ Bit 0x01 indicates an 'Unsafe' tag, which is not set via
475
482
  SetNewValuesFromFile() unless specified explicitly.
476
- Bit 0x02 indicates a 'protected' tag, which should not be set
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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-2021, Phil Harvey (philharvey66 at gmail.com)
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.