exiftool_vendored 12.52.0 → 12.55.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (204) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +42 -1
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +3 -3
  6. data/bin/exiftool +12 -10
  7. data/bin/fmt_files/kml_track.fmt +3 -3
  8. data/bin/lib/File/RandomAccess.pm +1 -1
  9. data/bin/lib/File/RandomAccess.pod +2 -2
  10. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  11. data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  12. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  13. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  14. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  15. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  16. data/bin/lib/Image/ExifTool/Apple.pm +197 -27
  17. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  18. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  19. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  20. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  21. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  22. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +4 -4
  23. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  24. data/bin/lib/Image/ExifTool/Canon.pm +14 -2
  25. data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  26. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  27. data/bin/lib/Image/ExifTool/CanonVRD.pm +9 -9
  28. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  29. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  31. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  32. data/bin/lib/Image/ExifTool/DJI.pm +1 -1
  33. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  34. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  35. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  36. data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  37. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  38. data/bin/lib/Image/ExifTool/EXE.pm +1 -1
  39. data/bin/lib/Image/ExifTool/Exif.pm +5 -16
  40. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  41. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  42. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  44. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  45. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  46. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  47. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  48. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  49. data/bin/lib/Image/ExifTool/FujiFilm.pm +21 -13
  50. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  51. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  52. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  53. data/bin/lib/Image/ExifTool/GPS.pm +1 -1
  54. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  55. data/bin/lib/Image/ExifTool/Geotag.pm +14 -5
  56. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  57. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  58. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  59. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  60. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  61. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  62. data/bin/lib/Image/ExifTool/ICO.pm +1 -1
  63. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  64. data/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  65. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  66. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  67. data/bin/lib/Image/ExifTool/Import.pm +1 -1
  68. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  69. data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  70. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  71. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  72. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  73. data/bin/lib/Image/ExifTool/Jpeg2000.pm +11 -5
  74. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  75. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  76. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  77. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  78. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  79. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  80. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  81. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  82. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  83. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  84. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/sk.pm +1806 -1927
  92. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  96. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  97. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  98. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  99. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  100. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  101. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  102. data/bin/lib/Image/ExifTool/MISB.pm +1 -1
  103. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  104. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  105. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  106. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  107. data/bin/lib/Image/ExifTool/MPF.pm +1 -1
  108. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  109. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  110. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  111. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  112. data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  113. data/bin/lib/Image/ExifTool/Matroska.pm +5 -5
  114. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  115. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  116. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  117. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  118. data/bin/lib/Image/ExifTool/Nikon.pm +219 -10
  119. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  120. data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  121. data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  122. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  123. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  124. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  125. data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  126. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  127. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  128. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  129. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  130. data/bin/lib/Image/ExifTool/PDF.pm +1 -1
  131. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  132. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  133. data/bin/lib/Image/ExifTool/PLIST.pm +12 -7
  134. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  135. data/bin/lib/Image/ExifTool/PNG.pm +1 -1
  136. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  137. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  138. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  139. data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  140. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  141. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  142. data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  143. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  144. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  145. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  147. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  148. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  149. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  150. data/bin/lib/Image/ExifTool/QuickTime.pm +23 -7
  151. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +122 -28
  152. data/bin/lib/Image/ExifTool/README +3 -0
  153. data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  154. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  155. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  156. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  157. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  158. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  159. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  160. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  161. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  162. data/bin/lib/Image/ExifTool/Samsung.pm +3 -1
  163. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  164. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Shift.pl +1 -1
  166. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  167. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  168. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  169. data/bin/lib/Image/ExifTool/Sony.pm +3 -3
  170. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  171. data/bin/lib/Image/ExifTool/Stim.pm +1 -1
  172. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  173. data/bin/lib/Image/ExifTool/TagLookup.pm +1023 -979
  174. data/bin/lib/Image/ExifTool/TagNames.pod +99 -9
  175. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  176. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  177. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  178. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  179. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  180. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  181. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  182. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  183. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  184. data/bin/lib/Image/ExifTool/WriteExif.pl +14 -1
  185. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  186. data/bin/lib/Image/ExifTool/WritePDF.pl +5 -1
  187. data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  188. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  189. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  190. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +18 -7
  191. data/bin/lib/Image/ExifTool/WriteRIFF.pl +1 -1
  192. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  193. data/bin/lib/Image/ExifTool/Writer.pl +2 -2
  194. data/bin/lib/Image/ExifTool/XMP.pm +23 -3
  195. data/bin/lib/Image/ExifTool/XMP2.pl +20 -1
  196. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  197. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  198. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  199. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  200. data/bin/lib/Image/ExifTool.pm +4 -3
  201. data/bin/lib/Image/ExifTool.pod +39 -38
  202. data/bin/perl-Image-ExifTool.spec +1 -1
  203. data/lib/exiftool_vendored/version.rb +1 -1
  204. metadata +2 -2
@@ -102,7 +102,7 @@ my %insvLimit = (
102
102
  The tags below are extracted from timed metadata in QuickTime and other
103
103
  formats of video files when the ExtractEmbedded option is used. Although
104
104
  most of these tags are combined into the single table below, ExifTool
105
- currently reads 62 different formats of timed GPS metadata from video files.
105
+ currently reads 66 different formats of timed GPS metadata from video files.
106
106
  },
107
107
  VARS => { NO_ID => 1 },
108
108
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -880,9 +880,10 @@ sub HandleTextTags($$$)
880
880
  #------------------------------------------------------------------------------
881
881
  # Process subtitle 'text'
882
882
  # Inputs: 0) ExifTool ref, 1) data ref or dirInfo ref, 2) tag table ref
883
- sub Process_text($$$)
883
+ # 3) flag set if text was already stored
884
+ sub Process_text($$$;$)
884
885
  {
885
- my ($et, $dataPt, $tagTbl) = @_;
886
+ my ($et, $dataPt, $tagTbl, $handled) = @_;
886
887
  my %tags;
887
888
 
888
889
  return if $$et{NoMoreTextDecoding};
@@ -938,6 +939,16 @@ sub Process_text($$$)
938
939
  $tags{GPSSatellites} = $10 if defined $10;
939
940
  $tags{GPSDOP} = $11 if defined $11;
940
941
  $tags{GPSAltitude} = $12 if defined $12;
942
+ # ($G and $GS are ref https://exiftool.org/forum/index.php?topic=13115.msg71743#msg71743)
943
+ } elsif ($tag eq 'G' and $dat =~ /:(\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2})-([NS])(\d+\.\d+)-([EW])(\d+\.\d+)-S(\d+)/) {
944
+ $tags{GPSDateTime} = "$1:$2:$3 $4";
945
+ $tags{GPSLatitude} = $6 * ($5 eq 'S' ? -1 : 1);
946
+ $tags{GPSLongitude} = $8 * ($7 eq 'W' ? -1 : 1);
947
+ $tags{GPSSpeed} = $9;
948
+ } elsif ($tag eq 'GS' and $dat =~ /:([-+]?\d+),([-+]?\d+),([-+]?\d+)/) {
949
+ # scale and re-arrange to match gsensor output from Win app (forum11665)
950
+ my @acc = ( ($2+2432)/1000, ($3 + 361)/1000, ($1-3708)/1000 );
951
+ $tags{Accelerometer} = "@acc";
941
952
  } elsif ($tag eq 'BEGINGSENSOR' and $dat =~ /^:([-+]\d+\.\d+):([-+]\d+\.\d+):([-+]\d+\.\d+)/) {
942
953
  $tags{Accelerometer} = "$1 $2 $3";
943
954
  } elsif ($tag eq 'TIME' and $dat =~ /^:(\d+)/) {
@@ -946,7 +957,7 @@ sub Process_text($$$)
946
957
  $tags{Text} = $dat if length $dat;
947
958
  $tags{done} = 1;
948
959
  } elsif ($tag ne 'END') {
949
- $tags{Text} = "\$$tag$dat";
960
+ $tags{Text} = "\$$tag$dat" unless $handled;
950
961
  }
951
962
  }
952
963
  %tags and HandleTextTags($et, $tagTbl, \%tags), return;
@@ -1234,6 +1245,7 @@ Sample: for ($i=0; ; ) {
1234
1245
  ($type eq 'sbtl' and $metaFormat eq 'tx3g' and $buff =~ /^..PNDM/s))
1235
1246
  {
1236
1247
 
1248
+ my $handled;
1237
1249
  FoundSomething($et, $tagTbl, $time[$i], $dur[$i]);
1238
1250
  unless ($buff =~ /^\$BEGIN/) {
1239
1251
  # remove ending "encd" box if it exists
@@ -1273,9 +1285,10 @@ Sample: for ($i=0; ; ) {
1273
1285
  }
1274
1286
  unless (defined $val) {
1275
1287
  $et->HandleTag($tagTbl, Text => $buff); # just store any other text
1288
+ $handled = 1;
1276
1289
  }
1277
1290
  }
1278
- Process_text($et, \$buff, $tagTbl);
1291
+ Process_text($et, \$buff, $tagTbl, $handled);
1279
1292
 
1280
1293
  } elsif ($processByMetaFormat{$type}) {
1281
1294
 
@@ -1371,6 +1384,7 @@ sub ProcessFreeGPS($$$)
1371
1384
 
1372
1385
  if (substr($$dataPt,18,8) eq "\xaa\xaa\xf2\xe1\xf0\xee\x54\x54") {
1373
1386
 
1387
+ $debug and $et->FoundTag(GPSType => '1A');
1374
1388
  # (this is very similar to the encrypted text format)
1375
1389
  # decode encrypted ASCII-based GPS (DashCam Azdome GS63H, ref 5)
1376
1390
  # header looks like this in my sample:
@@ -1425,10 +1439,10 @@ sub ProcessFreeGPS($$$)
1425
1439
  } elsif ($buf2 =~ /^.{173}([-+]\d{3})([-+]\d{3})([-+]\d{3})/s) { # (Azdome)
1426
1440
  @acc = ($1/100, $2/100, $3/100);
1427
1441
  }
1428
- $debug and $et->FoundTag(GPSType => '1A');
1429
1442
 
1430
1443
  } elsif ($$dataPt =~ /^.{52}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/s) {
1431
1444
 
1445
+ $debug and $et->FoundTag(GPSType => '1B');
1432
1446
  # decode NMEA-format GPS data (NextBase 512GW dashcam, ref PH)
1433
1447
  # header looks like this in my sample:
1434
1448
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 40 01 00 00 [....freeGPS @...]
@@ -1454,10 +1468,10 @@ sub ProcessFreeGPS($$$)
1454
1468
  # change to signed integer and divide by 256
1455
1469
  map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1456
1470
  }
1457
- $debug and $et->FoundTag(GPSType => '1B');
1458
1471
 
1459
1472
  } elsif ($$dataPt =~ /^.{37}\0\0\0A([NS])([EW])/s) {
1460
1473
 
1474
+ $debug and $et->FoundTag(GPSType => '1C');
1461
1475
  # decode freeGPS from ViofoA119v3 dashcam (similar to Novatek GPS format)
1462
1476
  # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1463
1477
  # 0010: 05 00 00 00 2f 00 00 00 03 00 00 00 13 00 00 00 [..../...........]
@@ -1489,10 +1503,10 @@ sub ProcessFreeGPS($$$)
1489
1503
  map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1490
1504
  }
1491
1505
  SetByteOrder('MM');
1492
- $debug and $et->FoundTag(GPSType => '1C');
1493
1506
 
1494
1507
  } elsif ($$dataPt =~ /^.{21}\0\0\0A([NS])([EW])/s) {
1495
1508
 
1509
+ $debug and $et->FoundTag(GPSType => '1D');
1496
1510
  # also decode 'gpmd' chunk from Kingslim D4 dashcam videos
1497
1511
  # 0000: 0a 00 00 00 0b 00 00 00 07 00 00 00 e5 07 00 00 [................]
1498
1512
  # 0010: 06 00 00 00 03 00 00 00 41 4e 57 31 91 52 83 45 [........ANW1.R.E]
@@ -1518,10 +1532,10 @@ sub ProcessFreeGPS($$$)
1518
1532
  $acc[1] = GetFloat($dataPt, 0x30);
1519
1533
  $acc[2] = GetFloat($dataPt, 0x34);
1520
1534
  SetByteOrder('MM');
1521
- $debug and $et->FoundTag(GPSType => '1D');
1522
1535
 
1523
1536
  } elsif ($$dataPt =~ /^.{60}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s) {
1524
1537
 
1538
+ $debug and $et->FoundTag(GPSType => '1E');
1525
1539
  # decode freeGPS from Akaso dashcam
1526
1540
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 60 00 00 00 [....freeGPS `...]
1527
1541
  # 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
@@ -1539,10 +1553,10 @@ sub ProcessFreeGPS($$$)
1539
1553
  $trk = GetFloat($dataPt, 0x54) + 180; # (why is this off by 180?)
1540
1554
  $trk -= 360 if $trk >= 360;
1541
1555
  SetByteOrder('MM');
1542
- $debug and $et->FoundTag(GPSType => '1E');
1543
1556
 
1544
1557
  } elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) {
1545
1558
 
1559
+ $debug and $et->FoundTag(GPSType => '1F');
1546
1560
  # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 01 00 00 [..@.freeGPS ....]
1547
1561
  # 0010: 5a 58 53 42 4e 58 59 53 00 00 00 00 00 00 00 00 [ZXSBNXYS........]
1548
1562
  # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
@@ -1557,10 +1571,10 @@ sub ProcessFreeGPS($$$)
1557
1571
  $yr += ($yr >= 70 ? 1900 : 2000);
1558
1572
  $spd = $9 * $knotsToKph if length $9;
1559
1573
  $trk = $10 if length $10;
1560
- $debug and $et->FoundTag(GPSType => '1F');
1561
1574
 
1562
1575
  } elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0{5}/s) {
1563
1576
 
1577
+ $debug and $et->FoundTag(GPSType => '1G');
1564
1578
  # Akaso V1 dascham
1565
1579
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
1566
1580
  # 0010: 59 6e 64 41 6b 61 73 6f 43 61 72 00 00 00 00 00 [YndAkasoCar.....]
@@ -1601,10 +1615,10 @@ sub ProcessFreeGPS($$$)
1601
1615
 
1602
1616
  SetByteOrder('MM');
1603
1617
  #my $serialNum = substr($$dataPt, 0x68, 20);
1604
- $debug and $et->FoundTag(GPSType => '1G');
1605
1618
 
1606
1619
  } elsif ($$dataPt =~ /^.{12}\xac\0\0\0.{44}(.{72})/s) {
1607
1620
 
1621
+ $debug and $et->FoundTag(GPSType => '1H');
1608
1622
  # EACHPAI dash cam
1609
1623
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 ac 00 00 00 [....freeGPS ....]
1610
1624
  # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
@@ -1624,10 +1638,10 @@ sub ProcessFreeGPS($$$)
1624
1638
  # bytes 7-12 are the timestamp in ASCII HHMMSS after xor-ing with 0x70
1625
1639
  substr($time,7,6) = pack 'C*', map { $_ ^= 0x70 } unpack 'C*', substr($time,7,6);
1626
1640
  # (other values are currently unknown)
1627
- $debug and $et->FoundTag(GPSType => '1H');
1628
1641
 
1629
1642
  } elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) {
1630
1643
 
1644
+ $debug and $et->FoundTag(GPSType => '1I');
1631
1645
  # Vantrue S1 dashcam
1632
1646
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
1633
1647
  # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
@@ -1650,10 +1664,10 @@ sub ProcessFreeGPS($$$)
1650
1664
  $trk = GetFloat($dataPt, 0x68);
1651
1665
  $alt = GetFloat($dataPt, 0x6c);
1652
1666
  SetByteOrder('MM');
1653
- $debug and $et->FoundTag(GPSType => '1I');
1654
1667
 
1655
1668
  } else {
1656
1669
 
1670
+ $debug and $et->FoundTag(GPSType => '1J');
1657
1671
  # decode binary GPS format (Viofo A119S, ref 2)
1658
1672
  # header looks like this in my sample:
1659
1673
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
@@ -1687,7 +1701,6 @@ sub ProcessFreeGPS($$$)
1687
1701
  $yr += 2000 if $yr < 2000;
1688
1702
  $spd *= $knotsToKph; # convert speed to km/h
1689
1703
  # ($trk is not confirmed; may be GPSImageDirection, ref PH)
1690
- $debug and $et->FoundTag(GPSType => '1J');
1691
1704
  }
1692
1705
  #
1693
1706
  # save tag values extracted by above code
@@ -1734,6 +1747,7 @@ sub ProcessFreeGPS2($$$)
1734
1747
 
1735
1748
  if (substr($$dataPt,0x45,3) eq 'ATC') {
1736
1749
 
1750
+ $debug and $et->FoundTag(GPSType => '2A');
1737
1751
  # header looks like this: (sample 1)
1738
1752
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 38 06 00 00 [....freeGPS 8...]
1739
1753
  # 0010: 49 51 53 32 30 31 33 30 33 30 36 42 00 00 00 00 [IQS20130306B....]
@@ -1841,11 +1855,11 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1841
1855
  }
1842
1856
  # save position of most recent record (needed when parsing the next freeGPS block)
1843
1857
  $$et{FreeGPS2}{RecentRecPos} = $lastRecPos;
1844
- $debug and $et->FoundTag(GPSType => '2A');
1845
1858
  return 1;
1846
1859
 
1847
1860
  } elsif ($$dataPt =~ /^.{60}A\0.{10}([NS])\0.{14}([EW])\0/s) {
1848
1861
 
1862
+ $debug and $et->FoundTag(GPSType => '2B');
1849
1863
  # header looks like this in my sample:
1850
1864
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 08 01 00 00 [....freeGPS ....]
1851
1865
  # 0010: 32 30 31 33 30 38 31 35 2e 30 31 00 00 00 00 00 [20130815.01.....]
@@ -1873,7 +1887,6 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1873
1887
  $lon = GetDouble($dataPt, 0x50);
1874
1888
  $spd = GetDouble($dataPt, 0x60) * $knotsToKph;
1875
1889
  $trk = GetDouble($dataPt, 0x68);
1876
- $debug and $et->FoundTag(GPSType => '2B');
1877
1890
 
1878
1891
  } elsif ($$dataPt =~ /^.{72}A([NS])([EW])/s) {
1879
1892
 
@@ -1900,6 +1913,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1900
1913
  ($latRef, $lonRef) = ($1, $2);
1901
1914
  ($hr,$min,$sec,$yr,$mon,$day) = unpack('x48V6', $$dataPt);
1902
1915
  if (substr($$dataPt, 16, 3) eq 'IQS') {
1916
+ $debug and $et->FoundTag(GPSType => '2C');
1903
1917
  # Type 3b (ref PH)
1904
1918
  # header looks like this in my sample:
1905
1919
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
@@ -1910,20 +1924,20 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1910
1924
  $lon = abs Get32s($dataPt, 0x50) / 1e7;
1911
1925
  $spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
1912
1926
  $alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
1913
- $debug and $et->FoundTag(GPSType => '2C');
1914
1927
 
1915
1928
  } else {
1929
+ $debug and $et->FoundTag(GPSType => '2D');
1916
1930
  # Type 3 (ref 2)
1917
1931
  # (no sample with this format)
1918
1932
  $lat = GetFloat($dataPt, 0x4c);
1919
1933
  $lon = GetFloat($dataPt, 0x50);
1920
1934
  $spd = GetFloat($dataPt, 0x54) * $knotsToKph;
1921
1935
  $trk = GetFloat($dataPt, 0x58);
1922
- $debug and $et->FoundTag(GPSType => '2D');
1923
1936
  }
1924
1937
 
1925
1938
  } elsif ($$dataPt =~ /^.{60}A\0.{6}([NS])\0.{6}([EW])\0/s and $dirLen >= 112) {
1926
1939
 
1940
+ $debug and $et->FoundTag(GPSType => '2E');
1927
1941
  # header looks like this in my sample (unknown dashcam, "Anticlock 2 2020_1125_1455_007.MOV"):
1928
1942
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 68 00 00 00 [....freeGPS h...]
1929
1943
  # 0010: 32 30 31 33 30 33 32 35 41 00 00 00 00 00 00 00 [20130325A.......]
@@ -1940,10 +1954,10 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1940
1954
  $lon = GetFloat($dataPt, 0x48);
1941
1955
  $spd = GetFloat($dataPt, 0x50);
1942
1956
  $trk = GetFloat($dataPt, 0x54);
1943
- $debug and $et->FoundTag(GPSType => '2E');
1944
1957
 
1945
1958
  } elsif ($$dataPt =~ /^.{16}A([NS])([EW])\0/s) {
1946
1959
 
1960
+ $debug and $et->FoundTag(GPSType => '2F');
1947
1961
  # INNOVV MP4 video (same format as INNOVV TS)
1948
1962
  while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) {
1949
1963
  my $dat = $1;
@@ -1961,11 +1975,36 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1961
1975
  $et->HandleTag($tagTbl, GPSTrack => $trk);
1962
1976
  $et->HandleTag($tagTbl, Accelerometer => "@acc");
1963
1977
  }
1964
- $debug and $et->FoundTag(GPSType => '2F');
1965
1978
  return 1;
1966
1979
 
1980
+ } elsif ($$dataPt =~ /^.{28}A.{11}([NS]).{15}([EW])/s) {
1981
+
1982
+ $debug and $et->FoundTag(GPSType => '2G');
1983
+ # Vantrue N4 dashcam
1984
+ # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1985
+ # 0010: 0d 00 00 00 16 00 00 00 1e 00 00 00 41 00 00 00 [............A...]
1986
+ # 0020: 2c b7 b4 1a 5a 71 b2 40 4e 00 00 00 00 00 00 00 [,...Zq.@N.......]
1987
+ # 0030: fb ae 08 fe 77 f6 89 40 45 00 00 00 00 00 00 00 [....w..@E.......]
1988
+ # 0040: be 9f 1a 2f dd 84 36 40 5c 8f c2 f5 28 fc 68 40 [.../..6@\...(.h@]
1989
+ # 0050: 16 00 00 00 0c 00 00 00 0e 00 00 00 f2 fb ff ff [................]
1990
+ # 0060: 42 00 00 00 02 00 00 00 20 24 47 4e 52 4d 43 2c [B....... $GNRMC,]
1991
+ # 0070: 31 33 32 32 33 30 2e 30 30 30 2c 41 2c 34 37 32 [132230.000,A,472]
1992
+ # 0080: 31 2e 33 35 31 39 37 2c 4e 2c 30 30 38 33 30 2e [1.35197,N,00830.]
1993
+ # 0090: 38 30 38 35 39 2c 45 2c 32 32 2e 35 31 39 2c 31 [80859,E,22.519,1]
1994
+ # 00a0: 39 39 2e 38 38 2c 31 34 31 32 32 32 2c 2c 2c 41 [99.88,141222,,,A]
1995
+ # 00b0: 2a 37 35 0d 0a 00 00 00 00 00 00 00 00 00 00 00 [*75.............]
1996
+ ($latRef, $lonRef) = ($1, $2);
1997
+ ($hr,$min,$sec,$yr,$mon,$day,@acc) = unpack('x16V3x52V3V3',$$dataPt);
1998
+ $lat = abs(GetDouble($dataPt, 32)); # (abs just to be safe)
1999
+ $lon = abs(GetDouble($dataPt, 48)); # (abs just to be safe)
2000
+ $spd = GetDouble($dataPt, 64) * $knotsToKph;
2001
+ $trk = GetDouble($dataPt, 72);
2002
+ map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1000 } @acc; # (NC)
2003
+ # (not necessary to read RMC sentence because we already have it all)
2004
+
1967
2005
  } else {
1968
2006
 
2007
+ $debug and $et->FoundTag(GPSType => '2H');
1969
2008
  # (look for binary GPS as stored by NextBase 512G, ref PH)
1970
2009
  # header looks like this in my sample:
1971
2010
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...]
@@ -2008,7 +2047,6 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2008
2047
  $et->HandleTag($tagTbl, GPSTrack => $trk);
2009
2048
  last if $pos += 0x20 > length($$dataPt) - 0x1e;
2010
2049
  }
2011
- $debug and $et->FoundTag(GPSType => '2G');
2012
2050
  return $$et{DOC_NUM} ? 1 : 0; # return 0 if nothing extracted
2013
2051
  }
2014
2052
  #
@@ -2025,9 +2063,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2025
2063
  $et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
2026
2064
  $et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd; # (now in km/h)
2027
2065
  $et->HandleTag($tagTbl, GPSTrack => $trk) if defined $trk;
2028
- if (defined $alt) {
2029
- $et->HandleTag($tagTbl, GPSAltitude => $alt);
2030
- }
2066
+ $et->HandleTag($tagTbl, GPSAltitude => $alt) if defined $alt;
2031
2067
  $et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc;
2032
2068
  return 1;
2033
2069
  }
@@ -2243,6 +2279,7 @@ sub Process_3gf($$$)
2243
2279
 
2244
2280
  #------------------------------------------------------------------------------
2245
2281
  # Process DuDuBell M1 dashcam / VSYS M6L 'gps0' atom (ref PH)
2282
+ # (Lamax S9 dual dashcam also uses 'gps0' atom, but encrypted text format)
2246
2283
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
2247
2284
  # Returns: 1 on success
2248
2285
  sub Process_gps0($$$)
@@ -2250,14 +2287,28 @@ sub Process_gps0($$$)
2250
2287
  my ($et, $dirInfo, $tagTbl) = @_;
2251
2288
  my $dataPt = $$dirInfo{DataPt};
2252
2289
  my $dirLen = $$dirInfo{DirLen};
2253
- my $recLen = 32; # 32-byte record length
2290
+ my ($pos, $recLen);
2254
2291
  $et->VerboseDir('gps0', undef, $dirLen);
2292
+ # check for encrypted format written by Lamax S9 dual dashcam
2293
+ # (similar to Ambarella A12, but in multiple 311-byte records)
2294
+ if ($$dataPt =~ /^.{2}\xf2\xe1\xf0\xeeTT\x98/s) {
2295
+ $recLen = 311;
2296
+ for ($pos=0; $pos+$recLen<=$dirLen; $pos+=$recLen) {
2297
+ my $dat = substr($$dataPt, $pos, $recLen);
2298
+ last unless $dat =~ /^.{2}\xf2\xe1\xf0\xeeTT\x98/s;
2299
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2300
+ Process_text($et, \$dat, $tagTbl);
2301
+ $pos += $recLen;
2302
+ }
2303
+ delete $$et{DOC_NUM};
2304
+ return 1;
2305
+ }
2306
+ $recLen = 32; # 32-byte record length
2255
2307
  SetByteOrder('II');
2256
2308
  if ($dirLen > $recLen and not $et->Options('ExtractEmbedded')) {
2257
2309
  $dirLen = $recLen;
2258
2310
  EEWarn($et);
2259
2311
  }
2260
- my $pos;
2261
2312
  for ($pos=0; $pos+$recLen<=$dirLen; $pos+=$recLen) {
2262
2313
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2263
2314
  # lat/long are in DDDMM.MMMM format
@@ -2307,6 +2358,49 @@ sub Process_gsen($$$)
2307
2358
  return 1;
2308
2359
  }
2309
2360
 
2361
+ #------------------------------------------------------------------------------
2362
+ # Process Kenwood drv-a301w dashcam 'udta' atom (ref PH)
2363
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
2364
+ # Returns: 1 on success
2365
+ # Sample data:
2366
+ # 0000: 56 49 44 45 4f 55 55 55 55 55 55 55 55 55 55 55 [VIDEOUUUUUUUUUUU]
2367
+ # 0010: 55 55 55 55 55 55 55 55 55 55 55 fe fe 32 30 32 [UUUUUUUUUUU..202]
2368
+ # 0020: 33 30 31 30 37 31 31 31 39 31 34 2e 32 30 32 33 [30107111914.2023]
2369
+ # 0030: 30 31 30 37 31 31 31 39 31 35 03 4e 34 37 33 37 [0107111915.N4737]
2370
+ # 0040: 37 30 35 33 57 31 32 32 30 39 39 30 31 34 2b 30 [7053W122099014+0]
2371
+ # 0050: 30 35 38 30 30 30 2b 30 30 36 2b 30 30 39 2b 30 [058000+006+009+0]
2372
+ # 0060: 30 34 2b 30 30 32 2b 30 30 39 2b 30 30 35 2b 30 [04+002+009+005+0]
2373
+ sub ProcessKenwood($$$)
2374
+ {
2375
+ my ($et, $dirInfo, $tagTbl) = @_;
2376
+ my $dataPt = $$dirInfo{DataPt};
2377
+ my $dirLen = $$dirInfo{DirLen};
2378
+ while ($$dataPt =~ /\xfe\xfe([^\xfe]+)/g) {
2379
+ my $dat = $1;
2380
+ next unless $dat =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})./gs;
2381
+ my $time = "$1:$2:$3 $4:$5:$6"; # (likely local time zone, but not confirmed)
2382
+ # ignore second date (what is this for?)
2383
+ next unless $dat =~ /\G(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})./gs;
2384
+ next unless $dat =~ /\G([NS])(\d+)([EW])(\d+)/g;
2385
+ my ($lat, $lon) = ($2/1e4, $4/1e4);
2386
+ ConvertLatLon($lat, $lon);
2387
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2388
+ $et->HandleTag($tagTbl, GPSDateTime => $time);
2389
+ $et->HandleTag($tagTbl, GPSLatitude => $lat * ($1 eq 'S' ? -1 : 1));
2390
+ $et->HandleTag($tagTbl, GPSLongitude => $lon * ($3 eq 'W' ? -1 : 1));
2391
+ next unless $dat =~ /\G([-+]\d{4})(\d+)/g;
2392
+ $et->HandleTag($tagTbl, GPSAltitude => $1 + 0); # (NC, educated guess)
2393
+ $et->HandleTag($tagTbl, GPSSpeed => $2); # (km/h)
2394
+ my @acc;
2395
+ while ($dat =~ /\G([-+]\d+)([-+]\d+)([-+]\d+)/g) {
2396
+ push @acc, $1/1000, $2/1000, $3/1000;
2397
+ }
2398
+ $et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc;
2399
+ }
2400
+ delete $$et{DOC_NUM};
2401
+ return 1;
2402
+ }
2403
+
2310
2404
  #------------------------------------------------------------------------------
2311
2405
  # Process RIFF-format trailer written by Auto-Vox dashcam (ref PH)
2312
2406
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -3005,7 +3099,7 @@ information like GPS tracks from MOV, MP4 and INSV media data.
3005
3099
 
3006
3100
  =head1 AUTHOR
3007
3101
 
3008
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
3102
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
3009
3103
 
3010
3104
  This library is free software; you can redistribute it and/or modify it
3011
3105
  under the same terms as Perl itself.
@@ -3,6 +3,9 @@ File: Image/ExifTool/README
3
3
 
4
4
  Description: ExifTool support modules documentation
5
5
 
6
+ Note: This documentation is a reference to be used by developers when
7
+ adding new tags to ExifTool.
8
+
6
9
  The ExifTool support modules are loaded by ExifTool to allow processing of
7
10
  various meta information formats.
8
11
 
@@ -2126,7 +2126,7 @@ including AVI videos, WAV audio files and WEBP images.
2126
2126
 
2127
2127
  =head1 AUTHOR
2128
2128
 
2129
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2129
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
2130
2130
 
2131
2131
  This library is free software; you can redistribute it and/or modify it
2132
2132
  under the same terms as Perl itself.
@@ -225,7 +225,7 @@ resource files.
225
225
 
226
226
  =head1 AUTHOR
227
227
 
228
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
228
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
369
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
128
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
171
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
718
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
434
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
306
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
1146
+ Copyright 2003-2023, 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.
@@ -1261,8 +1261,10 @@ my %formatMinMax = (
1261
1261
  },
1262
1262
  # 0x0b41-name - seen 'SingeShot_DepthMap_1' (Yes, "Singe") (SM-N975X front camera)
1263
1263
  '0x0b41' => { Name => 'SingleShotDepthMap', Binary => 1 },
1264
+ # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data'
1264
1265
  # 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
1265
1266
  # 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360)
1267
+ # 0x0c81-name - seen 'Watermark_Info'
1266
1268
  );
1267
1269
 
1268
1270
  # DualShot Extra Info (ref PH)
@@ -1720,7 +1722,7 @@ Samsung maker notes in EXIF information.
1720
1722
 
1721
1723
  =head1 AUTHOR
1722
1724
 
1723
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1725
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
1724
1726
 
1725
1727
  This library is free software; you can redistribute it and/or modify it
1726
1728
  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-2022, Phil Harvey (philharvey66 at gmail.com)
422
+ Copyright 2003-2023, 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-2022, Phil Harvey (philharvey66 at gmail.com)
131
+ Copyright 2003-2023, 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.
@@ -632,7 +632,7 @@ limited to the range 1970 to 2038 on 32-bit systems.
632
632
 
633
633
  =head1 AUTHOR
634
634
 
635
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
635
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
636
636
 
637
637
  This library is free software; you can redistribute it and/or modify it
638
638
  under the same terms as Perl itself.
@@ -343,7 +343,7 @@ name prefix.
343
343
 
344
344
  =head1 AUTHOR
345
345
 
346
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
346
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
347
347
 
348
348
  This library is free software; you can redistribute it and/or modify it
349
349
  under the same terms as Perl itself.
@@ -863,7 +863,7 @@ Sigma and Foveon maker notes in EXIF information.
863
863
 
864
864
  =head1 AUTHOR
865
865
 
866
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
866
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
867
867
 
868
868
  This library is free software; you can redistribute it and/or modify it
869
869
  under the same terms as Perl itself.
@@ -674,7 +674,7 @@ Sigma and Foveon X3F images.
674
674
 
675
675
  =head1 AUTHOR
676
676
 
677
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
677
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
678
678
 
679
679
  This library is free software; you can redistribute it and/or modify it
680
680
  under the same terms as Perl itself.
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.55';
37
+ $VERSION = '3.56';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -10364,7 +10364,7 @@ my %isoSetting2010 = (
10364
10364
  return 'inf' if $val >= 255;
10365
10365
  return (2**($val/16-5) + 1) * $val[1] / 1000;
10366
10366
  },
10367
- PrintConv => '$val eq "inf" ? $val : sprintf("%.2f m",$val)',
10367
+ PrintConv => '$val eq "inf" ? $val : sprintf("%.4g m", $val)',
10368
10368
  },
10369
10369
  GPSDateTime => {
10370
10370
  Description => 'GPS Date/Time',
@@ -11317,7 +11317,7 @@ Minolta.
11317
11317
 
11318
11318
  =head1 AUTHOR
11319
11319
 
11320
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
11320
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
11321
11321
 
11322
11322
  This library is free software; you can redistribute it and/or modify it
11323
11323
  under the same terms as Perl itself.
@@ -379,7 +379,7 @@ write Sony Image Data Converter version 3.0 metadata in ARW images.
379
379
 
380
380
  =head1 AUTHOR
381
381
 
382
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
382
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
383
383
 
384
384
  This library is free software; you can redistribute it and/or modify it
385
385
  under the same terms as Perl itself.
@@ -174,7 +174,7 @@ information.
174
174
 
175
175
  =head1 AUTHOR
176
176
 
177
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
177
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
178
178
 
179
179
  This library is free software; you can redistribute it and/or modify it
180
180
  under the same terms as Perl itself.
@@ -650,7 +650,7 @@ and values.
650
650
 
651
651
  ~head1 AUTHOR
652
652
 
653
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
653
+ Copyright 2003-2023, 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.
@@ -834,7 +834,7 @@ Number of modules updated, or negative on error.
834
834
 
835
835
  =head1 AUTHOR
836
836
 
837
- Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
837
+ Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
838
838
 
839
839
  This library is free software; you can redistribute it and/or modify it
840
840
  under the same terms as Perl itself.