exiftool_vendored 13.10.0 → 13.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +33 -0
  3. data/bin/MANIFEST +1 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +3 -3
  7. data/bin/exiftool +206 -148
  8. data/bin/lib/File/RandomAccess.pm +1 -1
  9. data/bin/lib/File/RandomAccess.pod +2 -2
  10. data/bin/lib/Image/ExifTool/AAC.pm +1 -1
  11. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  12. data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  13. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  14. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  15. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  16. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  17. data/bin/lib/Image/ExifTool/Apple.pm +1 -1
  18. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  19. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  20. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  21. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  22. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  23. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +6 -6
  24. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  25. data/bin/lib/Image/ExifTool/Canon.pm +8 -4
  26. data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  27. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  28. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  29. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  31. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  32. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  33. data/bin/lib/Image/ExifTool/DJI.pm +96 -45
  34. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  35. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  36. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  37. data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  38. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  39. data/bin/lib/Image/ExifTool/EXE.pm +123 -32
  40. data/bin/lib/Image/ExifTool/Exif.pm +7 -4
  41. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  42. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  43. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  44. data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  45. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  46. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  47. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  48. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  49. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  50. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  51. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  52. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  53. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  54. data/bin/lib/Image/ExifTool/GM.pm +1 -1
  55. data/bin/lib/Image/ExifTool/GPS.pm +1 -1
  56. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  57. data/bin/lib/Image/ExifTool/Geolocation.pm +1 -1
  58. data/bin/lib/Image/ExifTool/Geotag.pm +1 -1
  59. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  60. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  61. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  62. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  63. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  64. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  65. data/bin/lib/Image/ExifTool/ICO.pm +1 -1
  66. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  67. data/bin/lib/Image/ExifTool/IPTC.pm +8 -5
  68. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  69. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  70. data/bin/lib/Image/ExifTool/Import.pm +5 -4
  71. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  72. data/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
  73. data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  74. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  75. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  76. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  77. data/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
  78. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  79. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  80. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  81. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  82. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  83. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  84. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  92. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
  96. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  97. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  98. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  99. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  100. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  101. data/bin/lib/Image/ExifTool/LigoGPS.pm +408 -0
  102. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  103. data/bin/lib/Image/ExifTool/M2TS.pm +22 -13
  104. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  105. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  106. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  107. data/bin/lib/Image/ExifTool/MISB.pm +1 -1
  108. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  109. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  110. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  111. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  112. data/bin/lib/Image/ExifTool/MPF.pm +1 -1
  113. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  114. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  115. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  116. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  117. data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  118. data/bin/lib/Image/ExifTool/Matroska.pm +12 -4
  119. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  120. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  121. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  122. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  123. data/bin/lib/Image/ExifTool/Nikon.pm +164 -35
  124. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  125. data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  126. data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  127. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  128. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  129. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  130. data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  131. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  132. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  133. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  134. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  135. data/bin/lib/Image/ExifTool/PDF.pm +1 -1
  136. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  137. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  138. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  139. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  140. data/bin/lib/Image/ExifTool/PNG.pm +1 -1
  141. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  143. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  144. data/bin/lib/Image/ExifTool/Panasonic.pm +20 -2
  145. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  147. data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  148. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  149. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  150. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  151. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  152. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  153. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  154. data/bin/lib/Image/ExifTool/Protobuf.pm +24 -14
  155. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  156. data/bin/lib/Image/ExifTool/QuickTime.pm +46 -17
  157. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -302
  158. data/bin/lib/Image/ExifTool/README +4 -0
  159. data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  160. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  161. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  162. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  163. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  164. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  166. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  167. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  168. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  169. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  170. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  171. data/bin/lib/Image/ExifTool/Shift.pl +1 -1
  172. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  173. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  174. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  175. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  176. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  177. data/bin/lib/Image/ExifTool/Stim.pm +1 -1
  178. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  179. data/bin/lib/Image/ExifTool/TagLookup.pm +11 -5
  180. data/bin/lib/Image/ExifTool/TagNames.pod +84 -34
  181. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  182. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  183. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  184. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  185. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  186. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  187. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  188. data/bin/lib/Image/ExifTool/WPG.pm +1 -1
  189. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  190. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  191. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  192. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  193. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  194. data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  195. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  196. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  197. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -3
  198. data/bin/lib/Image/ExifTool/WriteRIFF.pl +1 -1
  199. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  200. data/bin/lib/Image/ExifTool/Writer.pl +9 -8
  201. data/bin/lib/Image/ExifTool/XISF.pm +1 -1
  202. data/bin/lib/Image/ExifTool/XMP.pm +1 -1
  203. data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
  204. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  205. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  206. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  207. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  208. data/bin/lib/Image/ExifTool.pm +13 -7
  209. data/bin/lib/Image/ExifTool.pod +14 -5
  210. data/bin/perl-Image-ExifTool.spec +1 -1
  211. data/lib/exiftool_vendored/version.rb +1 -1
  212. metadata +3 -2
@@ -29,6 +29,7 @@ sub Process360Fly($$$);
29
29
  sub ProcessFMAS($$$);
30
30
  sub ProcessWolfbox($$$);
31
31
  sub ProcessCAMM($$$);
32
+ sub OrderCipherDigits($$$;$);
32
33
 
33
34
  # QuickTime data types that have ExifTool equivalents
34
35
  # (ref https://developer.apple.com/library/content/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW35)
@@ -110,7 +111,7 @@ my %insvLimit = (
110
111
  The tags below are extracted from timed metadata in QuickTime and other
111
112
  formats of video files when the ExtractEmbedded option is used. Although
112
113
  most of these tags are combined into the single table below, ExifTool
113
- currently reads 96 different types of timed GPS metadata from video files.
114
+ currently reads 98 different types of timed GPS metadata from video files.
114
115
  },
115
116
  VARS => { NO_ID => 1 },
116
117
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -146,7 +147,7 @@ my %insvLimit = (
146
147
  CameraDateTime=>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
147
148
  DateTimeStamp =>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
148
149
  VideoTimeStamp => { Groups => { 2 => 'Video' } },
149
- Accelerometer=> { Notes => '3-axis acceleration in units of g' },
150
+ Accelerometer=> { Notes => '3-axis acceleration, usually in units of g' },
150
151
  AccelerometerData => { },
151
152
  AngularVelocity => { },
152
153
  GSensor => { },
@@ -354,8 +355,7 @@ my %insvLimit = (
354
355
  Unknown01 => { Unknown => 1 },
355
356
  Unknown02 => { Unknown => 1 },
356
357
  Unknown03 => { Unknown => 1 },
357
- M => { Name => 'Unknown_M', Unknown => 1 }, # (from LIGOGPSINFO)
358
- H => { Name => 'Unknown_H', Unknown => 1 }, # (from LIGOGPSINFO)
358
+ MagneticVariation => { }, # (from LIGOGPSINFO)
359
359
  );
360
360
 
361
361
  # tags found in 'camm' type 0 timed metadata (ref 4)
@@ -1755,31 +1755,34 @@ sub ProcessFreeGPS($$$)
1755
1755
 
1756
1756
  $debug and $et->FoundTag(GPSType => 5);
1757
1757
  my $pos = length $1;
1758
- # iiway s1 dual dash cam
1758
+ # iiway s1 dual dash cam - offset 16, encrypted and fuzzed with scale 1
1759
1759
  # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1760
1760
  # 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
1761
1761
  # 0020: 0a 00 00 00 23 23 23 23 6a 00 00 00 c0 20 20 20 [....####j.... ]
1762
1762
  # 0030: 20 f0 12 10 12 22 e1 0e 10 12 2f 90 10 13 02 f2 [ ...."..../.....]
1763
- # ABASK A8 4K Dashcam (different scaling factor)
1764
- # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1765
- # 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
1766
- # 0020: 00 00 00 00 23 23 23 23 69 00 00 00 c0 20 20 20 [....####i.... ]
1767
- # 0030: 20 f0 12 10 12 23 e5 0e 10 12 2f 99 10 11 02 f2 [ ....#..../.....]
1768
- # XGODY 12" 4K Dashcam
1763
+ # XGODY 12" 4K Dashcam - offset 16, encrypted and fuzzed with scale 1
1769
1764
  # 0000: 00 00 00 a8 66 72 65 65 47 50 53 20 98 00 00 00 [....freeGPS ....]
1770
1765
  # 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
1771
1766
  # 0020: cd 61 00 00 23 23 23 23 6d 00 00 00 c1 ec 41 20 [.a..####m.....A ]
1772
1767
  # 0030: 20 f0 12 10 12 24 e5 0e 10 11 2f 92 10 12 00 f6 [ ....$..../.....]
1773
- # Rexing dashcam V1GW-4K
1768
+ # ABASK A8 4K Dashcam - offset 16, encrypted and fuzzed with scale 3
1769
+ # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1770
+ # 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
1771
+ # 0020: 00 00 00 00 23 23 23 23 69 00 00 00 c0 20 20 20 [....####i.... ]
1772
+ # 0030: 20 f0 12 10 12 23 e5 0e 10 12 2f 99 10 11 02 f2 [ ....#..../.....]
1773
+ # Unknown dashcam (forum16060) - offset 16, enciphered and fuzzed with scale 1
1774
+ # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 98 00 00 00 [..@.freeGPS ....]
1775
+ # 0010: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 0d [LIGOGPSINFO.....]
1776
+ # 0020: 0a 00 00 00 23 23 23 23 3b 00 a0 34 46 44 46 31 [....####;..4FDF1]
1777
+ # 0030: 2f 44 39 2f 45 38 20 44 3d 4c 47 4a 4c 39 38 20 [/D9/E8 D=LGJL98 ]
1778
+ # Rexing dashcam V1GW-4K - offset 48, encrypted and fuzzed with scale 1
1774
1779
  # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1775
1780
  # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
1776
1781
  # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
1777
1782
  # 0030: 4c 49 47 4f 47 50 53 49 4e 46 4f 00 00 00 00 05 [LIGOGPSINFO.....]
1778
1783
  # 0040: 01 00 00 00 23 23 23 23 73 00 00 00 c0 20 20 20 [....####s.... ]
1779
1784
  # 0050: 20 f0 12 10 12 23 e5 0e 10 12 2f 95 10 12 01 f3 [ ....#..../.....]
1780
- # 0060: 16 18 10 26 b4 1a 10 04 f2 6e 18 12 20 f0 0e 11 [...&.....n.. ...]
1781
- # 0070: 13 22 b3 16 10 01 fb 76 18 10 24 fa 0e 11 10 22 [.".....v..$...."]
1782
- # Kingslim D4 dashcam
1785
+ # Kingslim D4 dashcam - offset 80, encrypted and fuzzed with scale 1
1783
1786
  # 0000: 0a 00 00 00 0b 00 00 00 07 00 00 00 e5 07 00 00 [................]
1784
1787
  # 0010: 06 00 00 00 03 00 00 00 41 4e 57 31 91 52 83 45 [........ANW1.R.E]
1785
1788
  # 0020: 15 70 fe c5 29 5c c3 41 ae c7 af 42 00 00 d1 be [.p..)\.A...B....]
@@ -1792,7 +1795,7 @@ sub ProcessFreeGPS($$$)
1792
1795
  # (this is weak, but the only difference I could find between these 2 headers)
1793
1796
  # (NOTE: ../testpics/gps_video/forum16229.mp4 uses this word for a counter!)
1794
1797
  $$et{LigoGPSScale} = 3 if $pos == 16 and $$dataPt =~ /^.{12}\xf0\x03\0\0.{16}\0{4}/s;
1795
- ProcessLigoGPS($et, \%dirInfo, $tagTbl);
1798
+ Image::ExifTool::LigoGPS::ProcessLigoGPS($et, \%dirInfo, $tagTbl);
1796
1799
  $done = 1;
1797
1800
 
1798
1801
  # also... when offset is 0x50 (Kingslim), the GPS also exists in this format:
@@ -2735,291 +2738,6 @@ sub Process_nbmt($$$)
2735
2738
  return 1;
2736
2739
  }
2737
2740
 
2738
- #------------------------------------------------------------------------------
2739
- # Un-do LIGOGPS fuzzing
2740
- # Inputs: 0) fuzzed latitude, 1) fuzzed longitude, 2) scale factor
2741
- # Returns: 0) latitude, 1) longitude
2742
- sub UnfuzzLigoGPS($$$)
2743
- {
2744
- my ($lat, $lon, $scl) = @_;
2745
- my $lat2 = int($lat / 10) * 10;
2746
- my $lon2 = int($lon / 10) * 10;
2747
- return($lat2 + ($lon - $lon2) * $scl, $lon2 + ($lat - $lat2) * $scl);
2748
- }
2749
-
2750
- #------------------------------------------------------------------------------
2751
- # Decrypt LIGOGPSINFO record (starting with "####")
2752
- # Inputs: 0) encrypted GPS record incuding 8-byte header
2753
- # Returns: decrypted record including 4-byte uint32 header, or undef on error
2754
- sub DecryptLigoGPS($)
2755
- {
2756
- my $str = shift;
2757
- my $num = unpack('x4V',$str);
2758
- return undef if $num < 4;
2759
- $num = 0x84 if $num > 0x84; # (be safe)
2760
- my @in = unpack("x8C$num",$str);
2761
- my @out;
2762
- while (@in) {
2763
- my $b = shift @in;
2764
- my $steeringBits = $b & 0xe0;
2765
- if ($steeringBits >= 0xc0) {
2766
- return undef if @in < 4;
2767
- push @out, (shift(@in) | $b & 0x01) ^ 0x20,
2768
- (shift(@in) | $b & 0x02) ^ 0x20,
2769
- (shift(@in) | $b & 0x0c) ^ 0x20,
2770
- shift(@in) ^ 0x20 | $b & 0x30;
2771
- } elsif ($steeringBits >= 0x40) {
2772
- return undef if @in < 3;
2773
- if ($steeringBits == 0x40) {
2774
- push @out, 0x20,
2775
- (shift(@in) | $b & 0x01) ^ 0x20,
2776
- (shift(@in) | $b & 0x06) ^ 0x20,
2777
- (shift(@in) | $b & 0x18) ^ 0x20;
2778
- } elsif ($steeringBits == 0x60) {
2779
- push @out, (shift(@in) | $b & 0x03) ^ 0x20,
2780
- 0x20,
2781
- (shift(@in) | $b & 0x04) ^ 0x20,
2782
- (shift(@in) | $b & 0x18) ^ 0x20;
2783
- } elsif ($steeringBits == 0x80) {
2784
- push @out, (shift(@in) | $b & 0x03) ^ 0x20,
2785
- (shift(@in) | $b & 0x0c) ^ 0x20,
2786
- 0x20,
2787
- (shift(@in) | $b & 0x10) ^ 0x20;
2788
- } else {
2789
- push @out, (shift(@in) | $b & 0x01) ^ 0x20,
2790
- (shift(@in) | $b & 0x06) ^ 0x20,
2791
- (shift(@in) | $b & 0x18) ^ 0x20,
2792
- 0x20;
2793
- }
2794
- } elsif ($steeringBits == 0x00) {
2795
- return undef if @in < 1;
2796
- push @out, shift(@in) | $b & 0x13;
2797
- } else {
2798
- return undef; # (shouldn't happen)
2799
- }
2800
- }
2801
- return pack 'C*', @out;
2802
- }
2803
-
2804
- #------------------------------------------------------------------------------
2805
- # Decipher and parse LIGOGPSINFO record (starting with "####")
2806
- # Inputs: 0) ExifTool ref, 1) enciphered string, 2) tag table ref
2807
- # Returns: true if this looked like an enciphered string
2808
- # Notes: handles contained tags, but may defer handling until full cipher is known
2809
- sub DecipherLigoGPS($$$)
2810
- {
2811
- my ($et, $str, $tagTbl) = @_;
2812
-
2813
- # (enciphered characters must be in the range 0x30-0x5f ('0' - '_'))
2814
- $str =~ m[^####.{4}([0-_])[0-_]{3}/[0-_]{2}/[0-_]{2} ..([0-_])..([0-_]).([0-_]) ]s or return undef;
2815
- return undef unless $2 eq $3; # (colons in time string must be the same)
2816
-
2817
- my $cipherInfo = $$et{LigoCipher};
2818
- $cipherInfo or $cipherInfo = $$et{LigoCipher} = { cache => [ ], secs => [ ], two => -1 };
2819
- my $decipher = $$cipherInfo{decipher};
2820
- my $cache = $$cipherInfo{cache};
2821
-
2822
- # determine the cipher code table based on the advancing 1's digit of seconds
2823
- unless ($decipher) {
2824
- push @$cache, $str; # cache records until we can decipher them
2825
- my ($millennium, $colon) = ($1, $2);
2826
- # determine the Caesar cipher lookup table
2827
- # (only characters in range 0x30-0x5f are encrypted)
2828
- my $secs = $$cipherInfo{secs};
2829
- push @$secs, $4 unless @$secs and $${secs}[-1] eq $4;
2830
- $$cipherInfo{two} = $#$secs if $4 eq $millennium; # save index of enciphered '2'
2831
- return 1 if @$secs < 10; # must cache the data until we know all 10 digits
2832
- my $two = $$cipherInfo{two}; # (index of '2' in the array)
2833
- my %decipher = ( $colon => ':' ); # (':' is the time separator)
2834
- foreach (0..9) {
2835
- my $ch = $$secs[($_ + $two - 2 + 10) % 10];
2836
- if ($two < 0 or defined $decipher{$ch}) { # (must be a unique code for each digit)
2837
- @$cipherInfo{'secs','two'} = ([ ], -1); # reset and try again
2838
- $et->Warn('Hiccup while deciphering LIGOGPSINFO');
2839
- return 1;
2840
- }
2841
- $decipher{$ch} = chr($_ + 0x30);
2842
- }
2843
- # also know the lat/lon quadrant from the signs of the coordinates
2844
- if ($str =~ / ([0-_])$colon(-?).*? ([0-_])$colon(-?)/) {
2845
- @decipher{$1,$3} = ($2 ? 'S' : 'N', $4 ? 'W' : 'E');
2846
- }
2847
- # fill in unknown entries with '?' (only chars 0x30-0x5f are enciphered)
2848
- defined $decipher{$_} or $decipher{$_} = '?' foreach map(chr, 0x30..0x5f);
2849
- $decipher = $$cipherInfo{decipher} = \%decipher;
2850
- $str = shift @$cache; # start deciphering at oldest cache entry
2851
- }
2852
-
2853
- # apply reverse Caesar cipher and extract GPS information
2854
- do {
2855
- my $pre = substr($str, 4, 4); # save second 4 bytes of header
2856
- ($str = substr($str,8)) =~ s/\0+$//; # remove 8-byte header and null padding
2857
- $str =~ s/([0-_])/$$decipher{$1}/g; # decipher
2858
- if ($$et{OPTIONS}{Verbose} > 1) {
2859
- $et->VPrint(1, "$$et{INDENT}\(Deciphered: ".unpack('H8',$pre)." $str)\n");
2860
- }
2861
- # add back leading 4 bytes (int16u counter plus 2 unknown bytes), and parse
2862
- # (not fuzzed in my only sample when found in standard 'skip' atom)
2863
- ParseLigoGPS($et, "$pre$str", $tagTbl, $$et{LigoType} eq 'LigoGPSInfo');
2864
- } while $str = shift @$cache;
2865
-
2866
- return 1;
2867
- }
2868
-
2869
- #------------------------------------------------------------------------------
2870
- # Parse decrypted/deciphered (but not defuzzed) LIGOGPSINFO record
2871
- # (record starts with 4-byte int32u counter followed by date/time, etc)
2872
- # Inputs: 0) ExifTool ref, 1) GPS string, 2) tag table ref, 3) not fuzzed
2873
- # Returns: nothing
2874
- sub ParseLigoGPS($$$;$)
2875
- {
2876
- my ($et, $str, $tagTbl, $noFuzz) = @_;
2877
-
2878
- # example string input
2879
- # "....2022/09/19 12:45:24 N:31.285065 W:124.759483 46.93 km/h x:-0.000 y:-0.000 z:-0.000"
2880
- unless ($str=~ /^.{4}(\S+ \S+)\s+([NS?]):(-?)([.\d]+)\s+([EW?]):(-?)([\.\d]+)\s+([.\d]+)/s) {
2881
- $et->Warn('LIGOGPSINFO format error');
2882
- return;
2883
- }
2884
- my ($time,$latRef,$latNeg,$lat,$lonRef,$lonNeg,$lon,$spd) = ($1,$2,$3,$4,$5,$6,$7,$8);
2885
- my %gpsScl = ( 1 => 1.524855137, 2 => 1.456027985, 3 => 1.15368 );
2886
- my $spdScl = $noFuzz ? $knotsToKph : 1.85407333;
2887
- $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2888
- $time =~ tr(/)(:);
2889
- # convert from DDMM.MMMMMM to DD.DDDDDD if necessary
2890
- # (speed wasn't scaled in my 1 sample with this format)
2891
- $lat =~ /^\d{3}/ and ConvertLatLon($lat,$lon), $spdScl = 1;
2892
- unless ($noFuzz) { # unfuzz the coordinates if necessary
2893
- my $scl = $$et{OPTIONS}{LigoGPSScale} || $$et{LigoGPSScale} || 1;
2894
- $scl = $gpsScl{$scl} if $gpsScl{$scl};
2895
- ($lat, $lon) = UnfuzzLigoGPS($lat, $lon, $scl);
2896
- }
2897
- # a final sanity check
2898
- ($lat > 90 or $lon > 180) and $et->Warn('LIGOGPSINFO coordinates out of range'), return;
2899
- $$et{SET_GROUP1} = 'LIGO';
2900
- $et->HandleTag($tagTbl, 'GPSDateTime', $time);
2901
- # (ignore N/S/E/W if coordinate is signed)
2902
- $et->HandleTag($tagTbl, 'GPSLatitude', $lat * (($latNeg or $latRef eq 'S') ? -1 : 1));
2903
- $et->HandleTag($tagTbl, 'GPSLongitude', $lon * (($lonNeg or $lonRef eq 'W') ? -1 : 1));
2904
- $et->HandleTag($tagTbl, 'GPSSpeed', $spd * $spdScl);
2905
- $et->HandleTag($tagTbl, 'GPSTrack', $1) if $str =~ /\bA:(\S+)/;
2906
- # (have a sample where tab is used to separate acc components)
2907
- $et->HandleTag($tagTbl, 'Accelerometer',"$1 $2 $3") if $str =~ /x:(\S+)\sy:(\S+)\sz:(\S+)/;
2908
- $et->HandleTag($tagTbl, 'M', $1) if $str =~ /\bM:(\S+)/;
2909
- $et->HandleTag($tagTbl, 'H', $1) if $str =~ /\bH:(\S+)/;
2910
- delete $$et{SET_GROUP1};
2911
- }
2912
-
2913
- #------------------------------------------------------------------------------
2914
- # Process LIGOGPSINFO data (non-JSON format)
2915
- # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2916
- # 3) 1=LIGOGPS lat/lon/spd weren't fuzzed
2917
- # Returns: 1 on success
2918
- sub ProcessLigoGPS($$$;$)
2919
- {
2920
- my ($et, $dirInfo, $tagTbl, $noFuzz) = @_;
2921
- my $dataPt = $$dirInfo{DataPt};
2922
- my $pos = ($$dirInfo{DirStart} || 0) + 0x14;
2923
- my $cipherInfo = $$et{LigoCipher};
2924
- return undef if $pos > length $$dataPt;
2925
- $$et{LigoType} = $$dirInfo{DirName} || 'LigoGPS';
2926
- push @{$$et{PATH}}, $$et{LigoType} unless $$dirInfo{DirID};
2927
- # not fuzzed if header is "LIGOGPSINFO\0\0\0\0\x01" (BlueSkySeaDV688)
2928
- $noFuzz = 1 if substr($$dataPt, $pos-8, 4) eq "\0\0\0\x01";
2929
- $et->VerboseDir($$et{LigoType});
2930
- for (; $pos + 0x84 <= length($$dataPt); $pos+=0x84) {
2931
- my $dat = substr($$dataPt, $pos, 0x84);
2932
- $dat =~ /^####/ or next; # (have seen blank records filled with zeros, so keep trying)
2933
- # decipher if we already know the encryption
2934
- $cipherInfo and $$cipherInfo{decipher} and DecipherLigoGPS($et, $dat, $tagTbl) and next;
2935
- my $str = DecryptLigoGPS($dat);
2936
- defined $str or DecipherLigoGPS($et, $dat, $tagTbl), next; # try to decipher
2937
- $et->VPrint(1, "$$et{INDENT}\(Decrypted: ",unpack('V',$str),' ',substr($str,4),")\n") if $$et{OPTIONS}{Verbose} > 1;
2938
- ParseLigoGPS($et, $str, $tagTbl, $noFuzz);
2939
- }
2940
- pop @{$$et{PATH}} unless $$dirInfo{DirID};
2941
- delete $$et{DOC_NUM};
2942
- return 1;
2943
- }
2944
-
2945
- #------------------------------------------------------------------------------
2946
- # Process LIGOGPSINFO JSON-format GPS (Yada RoadCam Pro 4K BT58189)
2947
- # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
2948
- # Returns: 1 on success
2949
- # Sample data (chained 512-byte records starting like this):
2950
- # 0000: 4c 49 47 4f 47 50 53 49 4e 46 4f 20 7b 22 48 6f [LIGOGPSINFO {"Ho]
2951
- # 0010: 75 72 22 3a 20 22 32 33 22 2c 20 22 4d 69 6e 75 [ur": "23", "Minu]
2952
- # 0020: 74 65 22 3a 20 22 31 30 22 2c 20 22 53 65 63 6f [te": "10", "Seco]
2953
- # 0030: 6e 64 22 3a 20 22 32 32 22 2c 20 22 59 65 61 72 [nd": "22", "Year]
2954
- # 0040: 22 3a 20 22 32 30 32 33 22 2c 20 22 4d 6f 6e 74 [": "2023", "Mont]
2955
- # 0050: 68 22 3a 20 22 31 32 22 2c 20 22 44 61 79 22 3a [h": "12", "Day":]
2956
- # 0060: 20 22 32 38 22 2c 20 22 73 74 61 74 75 73 22 3a [ "28", "status":]
2957
- sub ProcessLigoJSON($$$)
2958
- {
2959
- my ($et, $dirInfo, $tagTbl) = @_;
2960
- my $dataPt = $$dirInfo{DataPt};
2961
- my $dirLen = $$dirInfo{DirLen};
2962
- require Image::ExifTool::Import;
2963
- $et->VerboseDir('LIGO_JSON', undef, length($$dataPt));
2964
- $$et{SET_GROUP1} = 'LIGO';
2965
- while ($$dataPt =~ /LIGOGPSINFO (\{.*?\})/g) {
2966
- my $json = $1;
2967
- my %dbase;
2968
- Image::ExifTool::Import::ReadJSON(\$json, \%dbase);
2969
- my $info = $dbase{'*'} or next;
2970
- # my sample contains the following JSON fields (in this order):
2971
- # Hour Minute Second Year Month Day (GPS UTC time)
2972
- # status NS EW Latitude Longitude Speed (speed in knots)
2973
- # GsensorX GsensorY GsensorZ (units? - only seen "000" for all)
2974
- # MHour MMinute MSecond MYear MMonth MDay (local dashcam clock time)
2975
- # OLatitude OLongitude (? same values as Latitude/Longitude)
2976
- next unless defined $$info{status} and $$info{status} eq 'A'; # only read if GPS is active
2977
- $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2978
- my $num = 0;
2979
- defined $$info{$_} and ++$num foreach qw(Year Month Day Hour Minute Second);
2980
- if ($num == 6) {
2981
- # this is the GPS time in UTC
2982
- my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ',@$info{qw{Year Month Day Hour Minute Second}});
2983
- $et->HandleTag($tagTbl, GPSDateTime => $time);
2984
- }
2985
- if ($$info{Latitude} and $$info{Longitude}) {
2986
- my $lat = $$info{Latitude};
2987
- $lat = -$lat if $$info{NS} and $$info{NS} eq 'S';
2988
- my $lon = $$info{Longitude};
2989
- $lon = -$lon if $$info{EW} and $$info{EW} eq 'W';
2990
- $et->HandleTag($tagTbl, GPSLatitude => $lat);
2991
- $et->HandleTag($tagTbl, GPSLongitude => $lon);
2992
- }
2993
- $et->HandleTag($tagTbl, GPSSpeed => $$info{Speed} * $knotsToKph) if defined $$info{Speed};
2994
- if (defined $$info{GsensorX} and defined $$info{GsensorY} and defined $$info{GsensorZ}) {
2995
- # (don't know conversion factor for accel data, so leave it raw for now)
2996
- $et->HandleTag($tagTbl, Accelerometer => "$$info{GsensorX} $$info{GsensorY} $$info{GsensorZ}");
2997
- }
2998
- $num = 0;
2999
- defined $$info{$_} and ++$num foreach qw(MYear MMonth MDay MHour MMinute MSecond);
3000
- if ($num == 6) {
3001
- # this is the dashcam clock time (local time zone)
3002
- my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d',@$info{qw{MYear MMonth MDay MHour MMinute MSecond}});
3003
- $et->HandleTag($tagTbl, DateTimeOriginal => $time);
3004
- }
3005
- if (defined $$info{OLatitude} and defined $$info{OLongitude}) {
3006
- my $lat = $$info{OLatitude};
3007
- $lat = -$lat if $$info{NS} and $$info{NS} eq 'S';
3008
- my $lon = $$info{OLongitude};
3009
- $lon = -$lon if $$info{EW} and $$info{EW} eq 'W';
3010
- $et->HandleTag($tagTbl, GPSLatitude2 => $lat);
3011
- $et->HandleTag($tagTbl, GPSLongitude2 => $lon);
3012
- }
3013
- unless ($et->Options('ExtractEmbedded')) {
3014
- $et->Warn('Use the ExtractEmbedded option to extract all timed GPS',3);
3015
- last;
3016
- }
3017
- }
3018
- delete $$et{DOC_NUM};
3019
- delete $$et{SET_GROUP1};
3020
- return 1;
3021
- }
3022
-
3023
2741
  #------------------------------------------------------------------------------
3024
2742
  # Process Kenwood drv-a301w dashcam 'udta' atom (ref PH)
3025
2743
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -3912,7 +3630,7 @@ information like GPS tracks from MOV, MP4 and INSV media data.
3912
3630
 
3913
3631
  =head1 AUTHOR
3914
3632
 
3915
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
3633
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
3916
3634
 
3917
3635
  This library is free software; you can redistribute it and/or modify it
3918
3636
  under the same terms as Perl itself.
@@ -443,6 +443,10 @@ numerical, and generated automatically otherwise.
443
443
  list-type tag (unless it is a list of lang-alt lists, which is
444
444
  uncommon).
445
445
 
446
+ 'IsList' - Flag to mark tag as List-type in the documentation
447
+ without accumulating entries from subsequent tags. Used when
448
+ the value for a single tag is a complete list.
449
+
446
450
  'MakerNotes' - set if this tag is maker note data.
447
451
 
448
452
  'MakerPreview' - set in the PreviewImageStart tag information
@@ -2214,7 +2214,7 @@ including AVI videos, WAV audio files and WEBP images.
2214
2214
 
2215
2215
  =head1 AUTHOR
2216
2216
 
2217
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
2217
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
2218
2218
 
2219
2219
  This library is free software; you can redistribute it and/or modify it
2220
2220
  under the same terms as Perl itself.
@@ -225,7 +225,7 @@ resource files.
225
225
 
226
226
  =head1 AUTHOR
227
227
 
228
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
228
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
369
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
128
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
171
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
718
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
434
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
306
+ Copyright 2003-2025, 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.
@@ -1252,7 +1252,7 @@ interpret Ricoh maker notes EXIF meta information.
1252
1252
 
1253
1253
  =head1 AUTHOR
1254
1254
 
1255
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1255
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1256
1256
 
1257
1257
  This library is free software; you can redistribute it and/or modify it
1258
1258
  under the same terms as Perl itself.
@@ -1762,7 +1762,7 @@ Samsung maker notes in EXIF information.
1762
1762
 
1763
1763
  =head1 AUTHOR
1764
1764
 
1765
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1765
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1766
1766
 
1767
1767
  This library is free software; you can redistribute it and/or modify it
1768
1768
  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-2024, Phil Harvey (philharvey66 at gmail.com)
422
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
131
+ Copyright 2003-2025, 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.
@@ -631,7 +631,7 @@ limited to the range 1970 to 2038 on 32-bit systems.
631
631
 
632
632
  =head1 AUTHOR
633
633
 
634
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
634
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
635
635
 
636
636
  This library is free software; you can redistribute it and/or modify it
637
637
  under the same terms as Perl itself.
@@ -344,7 +344,7 @@ name prefix.
344
344
 
345
345
  =head1 AUTHOR
346
346
 
347
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
347
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
348
348
 
349
349
  This library is free software; you can redistribute it and/or modify it
350
350
  under the same terms as Perl itself.
@@ -864,7 +864,7 @@ Sigma and Foveon maker notes in EXIF information.
864
864
 
865
865
  =head1 AUTHOR
866
866
 
867
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
867
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
868
868
 
869
869
  This library is free software; you can redistribute it and/or modify it
870
870
  under the same terms as Perl itself.
@@ -680,7 +680,7 @@ Sigma and Foveon X3F images.
680
680
 
681
681
  =head1 AUTHOR
682
682
 
683
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
683
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
684
684
 
685
685
  This library is free software; you can redistribute it and/or modify it
686
686
  under the same terms as Perl itself.
@@ -11759,7 +11759,7 @@ Minolta.
11759
11759
 
11760
11760
  =head1 AUTHOR
11761
11761
 
11762
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
11762
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
11763
11763
 
11764
11764
  This library is free software; you can redistribute it and/or modify it
11765
11765
  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-2024, Phil Harvey (philharvey66 at gmail.com)
382
+ Copyright 2003-2025, 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-2024, Phil Harvey (philharvey66 at gmail.com)
177
+ Copyright 2003-2025, 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.
@@ -651,7 +651,7 @@ and values.
651
651
 
652
652
  ~head1 AUTHOR
653
653
 
654
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
654
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
655
655
 
656
656
  This library is free software; you can redistribute it and/or modify it
657
657
  under the same terms as Perl itself.
@@ -835,7 +835,7 @@ Number of modules updated, or negative on error.
835
835
 
836
836
  =head1 AUTHOR
837
837
 
838
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
838
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
839
839
 
840
840
  This library is free software; you can redistribute it and/or modify it
841
841
  under the same terms as Perl itself.