exiftool-vendored.pl 12.70.0 → 12.73.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 (206) hide show
  1. package/bin/Changes +53 -1
  2. package/bin/MANIFEST +5 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +11 -11
  6. package/bin/exiftool +47 -27
  7. package/bin/lib/File/RandomAccess.pm +1 -1
  8. package/bin/lib/File/RandomAccess.pod +2 -2
  9. package/bin/lib/Image/ExifTool/AAC.pm +177 -0
  10. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  11. package/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  12. package/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  13. package/bin/lib/Image/ExifTool/APE.pm +1 -1
  14. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  15. package/bin/lib/Image/ExifTool/ASF.pm +1 -1
  16. package/bin/lib/Image/ExifTool/Apple.pm +1 -1
  17. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  18. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  19. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  20. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  21. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  22. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +4 -3
  23. package/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  24. package/bin/lib/Image/ExifTool/Canon.pm +22 -7
  25. package/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  26. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  27. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  28. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  29. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  30. package/bin/lib/Image/ExifTool/Charset.pm +1 -1
  31. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  32. package/bin/lib/Image/ExifTool/DJI.pm +1 -1
  33. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  34. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  35. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  36. package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  37. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  38. package/bin/lib/Image/ExifTool/EXE.pm +1 -1
  39. package/bin/lib/Image/ExifTool/Exif.pm +31 -10
  40. package/bin/lib/Image/ExifTool/FITS.pm +1 -1
  41. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  42. package/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  43. package/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  44. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  45. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  46. package/bin/lib/Image/ExifTool/FlashPix.pm +60 -7
  47. package/bin/lib/Image/ExifTool/Font.pm +1 -1
  48. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  49. package/bin/lib/Image/ExifTool/FujiFilm.pm +6 -3
  50. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  51. package/bin/lib/Image/ExifTool/GIF.pm +1 -1
  52. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  53. package/bin/lib/Image/ExifTool/GPS.pm +1 -1
  54. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  55. package/bin/lib/Image/ExifTool/Geotag.pm +1 -1
  56. package/bin/lib/Image/ExifTool/GoPro.pm +17 -2
  57. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  58. package/bin/lib/Image/ExifTool/HP.pm +1 -1
  59. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  60. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  61. package/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  62. package/bin/lib/Image/ExifTool/ICO.pm +1 -1
  63. package/bin/lib/Image/ExifTool/ID3.pm +8 -5
  64. package/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  65. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  66. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  67. package/bin/lib/Image/ExifTool/Import.pm +1 -1
  68. package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  69. package/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
  70. package/bin/lib/Image/ExifTool/JPEG.pm +5 -2
  71. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  72. package/bin/lib/Image/ExifTool/JSON.pm +5 -2
  73. package/bin/lib/Image/ExifTool/JVC.pm +3 -3
  74. package/bin/lib/Image/ExifTool/Jpeg2000.pm +17 -6
  75. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  76. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  77. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  78. package/bin/lib/Image/ExifTool/LNK.pm +1 -1
  79. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  80. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  81. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  82. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  83. package/bin/lib/Image/ExifTool/Lang/es.pm +4 -4
  84. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  85. package/bin/lib/Image/ExifTool/Lang/fr.pm +4 -5
  86. package/bin/lib/Image/ExifTool/Lang/it.pm +3 -3
  87. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Leaf.pm +3 -3
  98. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  99. package/bin/lib/Image/ExifTool/M2TS.pm +22 -17
  100. package/bin/lib/Image/ExifTool/MIE.pm +3 -3
  101. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  102. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  103. package/bin/lib/Image/ExifTool/MISB.pm +1 -1
  104. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  105. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  106. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  107. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  108. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  109. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MXF.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  114. package/bin/lib/Image/ExifTool/Matroska.pm +1 -1
  115. package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  116. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  117. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  118. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  119. package/bin/lib/Image/ExifTool/Nikon.pm +166 -97
  120. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  121. package/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  122. package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  123. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  124. package/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  125. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  126. package/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  127. package/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  128. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  129. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  130. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  131. package/bin/lib/Image/ExifTool/PDF.pm +1 -1
  132. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  133. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  134. package/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  135. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  136. package/bin/lib/Image/ExifTool/PNG.pm +24 -2
  137. package/bin/lib/Image/ExifTool/PPM.pm +1 -1
  138. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  139. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  140. package/bin/lib/Image/ExifTool/Panasonic.pm +27 -2
  141. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  142. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  143. package/bin/lib/Image/ExifTool/Pentax.pm +46 -16
  144. package/bin/lib/Image/ExifTool/PhaseOne.pm +4 -4
  145. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  146. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  147. package/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  148. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  149. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  150. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  151. package/bin/lib/Image/ExifTool/QuickTime.pm +50 -11
  152. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +148 -12
  153. package/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  154. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  155. package/bin/lib/Image/ExifTool/RTF.pm +1 -1
  156. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  157. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  158. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  159. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  160. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  161. package/bin/lib/Image/ExifTool/Ricoh.pm +111 -3
  162. package/bin/lib/Image/ExifTool/Samsung.pm +4 -3
  163. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  164. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  165. package/bin/lib/Image/ExifTool/Shift.pl +1 -1
  166. package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  168. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  169. package/bin/lib/Image/ExifTool/Sony.pm +85 -6
  170. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  171. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  172. package/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  173. package/bin/lib/Image/ExifTool/TagLookup.pm +4878 -4830
  174. package/bin/lib/Image/ExifTool/TagNames.pod +11518 -11379
  175. package/bin/lib/Image/ExifTool/Text.pm +1 -1
  176. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  177. package/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  178. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  179. package/bin/lib/Image/ExifTool/VCard.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Validate.pm +1 -1
  181. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  182. package/bin/lib/Image/ExifTool/WPG.pm +1 -1
  183. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  184. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  185. package/bin/lib/Image/ExifTool/WriteExif.pl +20 -5
  186. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  187. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  188. package/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  189. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  190. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  191. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +4 -1
  192. package/bin/lib/Image/ExifTool/WriteRIFF.pl +1 -1
  193. package/bin/lib/Image/ExifTool/WriteXMP.pl +5 -3
  194. package/bin/lib/Image/ExifTool/Writer.pl +87 -15
  195. package/bin/lib/Image/ExifTool/XISF.pm +1 -1
  196. package/bin/lib/Image/ExifTool/XMP.pm +19 -3
  197. package/bin/lib/Image/ExifTool/XMP2.pl +1 -1
  198. package/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  199. package/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  200. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  201. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  202. package/bin/lib/Image/ExifTool.pm +35 -8
  203. package/bin/lib/Image/ExifTool.pod +29 -16
  204. package/bin/perl-Image-ExifTool.spec +9 -9
  205. package/bin/pp_build_exe.args +6 -5
  206. package/package.json +4 -5
@@ -83,7 +83,8 @@ my %processByMetaFormat = (
83
83
 
84
84
  # data lengths for each INSV/INSP record type
85
85
  my %insvDataLen = (
86
- 0x200 => 0, # PreivewImage (any size) (a duplicate of PreviewImage in APP2 of INSP files)
86
+ 0x000 => 0, # directory table (any size)
87
+ 0x200 => 0, # PreviewImage (any size) (a duplicate of PreviewImage in APP2 of INSP files)
87
88
  0x300 => 0, # accelerometer (could be either 20 or 56 bytes)
88
89
  0x400 => 16, # exposure (ref 6)
89
90
  0x600 => 8, # timestamps (ref 6)
@@ -91,6 +92,8 @@ my %insvDataLen = (
91
92
  # 0x900 => 48, # ? (Insta360 X3)
92
93
  # 0xa00 => 5?, # ? (Insta360 ONE RS)
93
94
  # 0xb00 => 10, # ? (Insta360 X3)
95
+ # 0xd00 => 10, # ? (Insta360 Ace Pro)
96
+ # 0x1200 ? # ? (Insta360 Ace Pro)
94
97
  );
95
98
 
96
99
  # limit the default amount of data we read for some record types
@@ -106,11 +109,13 @@ my %insvLimit = (
106
109
  The tags below are extracted from timed metadata in QuickTime and other
107
110
  formats of video files when the ExtractEmbedded option is used. Although
108
111
  most of these tags are combined into the single table below, ExifTool
109
- currently reads 66 different formats of timed GPS metadata from video files.
112
+ currently reads 68 different formats of timed GPS metadata from video files.
110
113
  },
111
114
  VARS => { NO_ID => 1 },
112
115
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
113
116
  GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
117
+ GPSLatitude2 => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")' },
118
+ GPSLongitude2=> { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
114
119
  GPSAltitude => { PrintConv => '(sprintf("%.4f", $val) + 0) . " m"' }, # round to 4 decimals
115
120
  GPSSpeed => { PrintConv => 'sprintf("%.4f", $val) + 0', Notes => 'in km/h unless GPSSpeedRef says otherwise' },
116
121
  GPSSpeedRef => { PrintConv => { K => 'km/h', M => 'mph', N => 'knots' } },
@@ -122,6 +127,11 @@ my %insvLimit = (
122
127
  RawConv => '$$self{FoundGPSDateTime} = 1; $val',
123
128
  PrintConv => '$self->ConvertDateTime($val)',
124
129
  },
130
+ DateTimeOriginal => {
131
+ Groups => { 2 => 'Time' },
132
+ Description => 'Date/Time Original',
133
+ PrintConv => '$self->ConvertDateTime($val)',
134
+ },
125
135
  GPSTimeStamp => { PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)', Groups => { 2 => 'Time' } },
126
136
  GPSSatellites=> { },
127
137
  GPSDOP => { Description => 'GPS Dilution Of Precision' },
@@ -2043,7 +2053,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2043
2053
  return 1;
2044
2054
 
2045
2055
  } elsif ($$dataPt =~ /^.{28}A.{11}([NS]).{15}([EW])/s) {
2046
-
2056
+
2047
2057
  $debug and $et->FoundTag(GPSType => '2G');
2048
2058
  # Vantrue N4 dashcam
2049
2059
  # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
@@ -2423,6 +2433,83 @@ sub Process_gsen($$$)
2423
2433
  return 1;
2424
2434
  }
2425
2435
 
2436
+ #------------------------------------------------------------------------------
2437
+ # Process LIGOGPS JSON-format GPS from Yada RoadCam Pro 4K BT58189
2438
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
2439
+ # Returns: 1 on success
2440
+ # Sample data (chained 512-byte records starting like this):
2441
+ # 0000: 4c 49 47 4f 47 50 53 49 4e 46 4f 20 7b 22 48 6f [LIGOGPSINFO {"Ho]
2442
+ # 0010: 75 72 22 3a 20 22 32 33 22 2c 20 22 4d 69 6e 75 [ur": "23", "Minu]
2443
+ # 0020: 74 65 22 3a 20 22 31 30 22 2c 20 22 53 65 63 6f [te": "10", "Seco]
2444
+ # 0030: 6e 64 22 3a 20 22 32 32 22 2c 20 22 59 65 61 72 [nd": "22", "Year]
2445
+ # 0040: 22 3a 20 22 32 30 32 33 22 2c 20 22 4d 6f 6e 74 [": "2023", "Mont]
2446
+ # 0050: 68 22 3a 20 22 31 32 22 2c 20 22 44 61 79 22 3a [h": "12", "Day":]
2447
+ # 0060: 20 22 32 38 22 2c 20 22 73 74 61 74 75 73 22 3a [ "28", "status":]
2448
+ sub ProcessLIGO_JSON($$$)
2449
+ {
2450
+ my ($et, $dirInfo, $tagTbl) = @_;
2451
+ my $dataPt = $$dirInfo{DataPt};
2452
+ my $dirLen = $$dirInfo{DirLen};
2453
+ require Image::ExifTool::Import;
2454
+ $et->VerboseDir('LIGO_JSON', undef, length($$dataPt));
2455
+ while ($$dataPt =~ /LIGOGPSINFO (\{.*?\})/g) {
2456
+ my $json = $1;
2457
+ my $raf = new File::RandomAccess(\$json);
2458
+ my %dbase;
2459
+ Image::ExifTool::Import::ReadJSON($raf, \%dbase);
2460
+ my $info = $dbase{'*'} or next;
2461
+ # my sample contains the following JSON fields (in this order):
2462
+ # Hour Minute Second Year Month Day (GPS UTC time)
2463
+ # status NS EW Latitude Longitude Speed (speed in knots)
2464
+ # GsensorX GsensorY GsensorZ (units? - only seen "000" for all)
2465
+ # MHour MMinute MSecond MYear MMonth MDay (local dashcam clock time)
2466
+ # OLatitude OLongitude (? same values as Latitude/Longitude)
2467
+ next unless defined $$info{status} and $$info{status} eq 'A'; # only read if GPS is active
2468
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2469
+ my $num = 0;
2470
+ defined $$info{$_} and ++$num foreach qw(Year Month Day Hour Minute Second);
2471
+ if ($num == 6) {
2472
+ # this is the GPS time in UTC
2473
+ my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ',@$info{qw{Year Month Day Hour Minute Second}});
2474
+ $et->HandleTag($tagTbl, GPSDateTime => $time);
2475
+ }
2476
+ if ($$info{Latitude} and $$info{Longitude}) {
2477
+ my $lat = $$info{Latitude};
2478
+ $lat = -$lat if $$info{NS} and $$info{NS} eq 'S';
2479
+ my $lon = $$info{Longitude};
2480
+ $lon = -$lon if $$info{EW} and $$info{EW} eq 'W';
2481
+ $et->HandleTag($tagTbl, GPSLatitude => $lat);
2482
+ $et->HandleTag($tagTbl, GPSLongitude => $lon);
2483
+ }
2484
+ $et->HandleTag($tagTbl, GPSSpeed => $$info{Speed} * $knotsToKph) if defined $$info{Speed};
2485
+ if (defined $$info{GsensorX} and defined $$info{GsensorY} and defined $$info{GsensorZ}) {
2486
+ # (don't know conversion factor for accel data, so leave it raw for now)
2487
+ $et->HandleTag($tagTbl, Accelerometer => "$$info{GsensorX} $$info{GsensorY} $$info{GsensorZ}");
2488
+ }
2489
+ $num = 0;
2490
+ defined $$info{$_} and ++$num foreach qw(MYear MMonth MDay MHour MMinute MSecond);
2491
+ if ($num == 6) {
2492
+ # this is the dashcam clock time (local time zone)
2493
+ my $time = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d',@$info{qw{MYear MMonth MDay MHour MMinute MSecond}});
2494
+ $et->HandleTag($tagTbl, DateTimeOriginal => $time);
2495
+ }
2496
+ if (defined $$info{OLatitude} and defined $$info{OLongitude}) {
2497
+ my $lat = $$info{OLatitude};
2498
+ $lat = -$lat if $$info{NS} and $$info{NS} eq 'S';
2499
+ my $lon = $$info{OLongitude};
2500
+ $lon = -$lon if $$info{EW} and $$info{EW} eq 'W';
2501
+ $et->HandleTag($tagTbl, GPSLatitude2 => $lat);
2502
+ $et->HandleTag($tagTbl, GPSLongitude2 => $lon);
2503
+ }
2504
+ unless ($et->Options('ExtractEmbedded')) {
2505
+ $et->WarnOnce('Use the ExtractEmbedded option to extract all timed GPS',3);
2506
+ last;
2507
+ }
2508
+ }
2509
+ delete $$et{DOC_NUM};
2510
+ return 1;
2511
+ }
2512
+
2426
2513
  #------------------------------------------------------------------------------
2427
2514
  # Process Kenwood drv-a301w dashcam 'udta' atom (ref PH)
2428
2515
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -2461,6 +2548,10 @@ sub ProcessKenwood($$$)
2461
2548
  push @acc, $1/1000, $2/1000, $3/1000;
2462
2549
  }
2463
2550
  $et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc;
2551
+ unless ($et->Options('ExtractEmbedded')) {
2552
+ $et->WarnOnce('Use the ExtractEmbedded option to extract all timed GPS',3);
2553
+ last;
2554
+ }
2464
2555
  }
2465
2556
  delete $$et{DOC_NUM};
2466
2557
  return 1;
@@ -2778,7 +2869,7 @@ sub ProcessInsta360($;$)
2778
2869
  my ($et, $dirInfo) = @_;
2779
2870
  my $raf = $$et{RAF};
2780
2871
  my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0;
2781
- my $buff;
2872
+ my ($buff, $dirTable, $dirTablePos);
2782
2873
 
2783
2874
  return 0 unless $raf->Seek(-78-$offset, 2) and $raf->Read($buff, 78) == 78 and
2784
2875
  substr($buff,-32) eq "8db42d694ccc418790edff439fe026bf"; # check magic number
@@ -2868,7 +2959,19 @@ sub ProcessInsta360($;$)
2868
2959
  if ($len % $dlen and $id != 0x700) { # (have seen one 0x700 record which was expected format but not multiple of 53 bytes)
2869
2960
  $et->Warn(sprintf('Unexpected Insta360 record 0x%x length',$id));
2870
2961
  } elsif ($id == 0x200) {
2871
- $et->FoundTag(PreviewImage => $buff);
2962
+ # there are 4 types of record 0x200
2963
+ # 1. JPEG preview (starts with ff d8 ff e1)
2964
+ # 2. TIFF preview (starts with 01 00 00 00, then record length)
2965
+ # 3. Unknown 1 (starts with 00 00 00 01)
2966
+ # 4. Unknown 2 (starts with 00 00 01 34)
2967
+ if ($buff =~ /^\xff\xd8\xff/) {
2968
+ $et->FoundTag(PreviewImage => $buff);
2969
+ } elsif ($buff =~ /^\x01\0\0\0(.{4})\x01/s and unpack('V',$1) == $dlen) {
2970
+ my ($w, $h) = unpack('x16V2',$buff);
2971
+ # build the TIFF image (could the 1 at byte 9 be the SamplesPerPixel?)
2972
+ my $hdr = Image::ExifTool::MakeTiffHeader($w, $h, 1, 8);
2973
+ $et->FoundTag(PreviewTIFF => $hdr . substr($buff, 40));
2974
+ }
2872
2975
  } elsif ($id == 0x300) {
2873
2976
  for ($p=0; $p<$len; $p+=$dlen) {
2874
2977
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
@@ -2899,7 +3002,7 @@ sub ProcessInsta360($;$)
2899
3002
  my $tmp = substr($buff, $p, $dlen);
2900
3003
  my @a = unpack('VVvaa8aa8aa8a8a8', $tmp);
2901
3004
  unless (($a[5] eq 'N' or $a[5] eq 'S') and # (quick validation)
2902
- ($a[7] eq 'E' or $a[7] eq 'W' or
3005
+ ($a[7] eq 'E' or $a[7] eq 'W' or
2903
3006
  # (odd, but I've seen "O" instead of "W". Perhaps
2904
3007
  # when the language is french? ie. "Ouest"?)
2905
3008
  $a[7] eq 'O'))
@@ -2913,13 +3016,15 @@ sub ProcessInsta360($;$)
2913
3016
  $a[$_] = GetDouble(\$a[$_], 0) foreach 4,6,8,9,10;
2914
3017
  $a[4] = -abs($a[4]) if $a[5] eq 'S'; # (abs just in case it was already signed)
2915
3018
  $a[6] = -abs($a[6]) if $a[7] ne 'E';
2916
- $et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($a[0]) . 'Z');
3019
+ my $ms = '';
3020
+ $a[2] and ($ms = sprintf('.%.3d', $a[2])) =~ s/0+$//;
3021
+ $et->HandleTag($tagTbl, GPSDateTime => Image::ExifTool::ConvertUnixTime($a[0]) . $ms . 'Z');
2917
3022
  $et->HandleTag($tagTbl, GPSLatitude => $a[4]);
2918
3023
  $et->HandleTag($tagTbl, GPSLongitude => $a[6]);
2919
3024
  $et->HandleTag($tagTbl, GPSSpeed => $a[8] * $mpsToKph);
2920
3025
  $et->HandleTag($tagTbl, GPSTrack => $a[9]);
2921
3026
  $et->HandleTag($tagTbl, GPSAltitude => $a[10]);
2922
- $et->HandleTag($tagTbl, Unknown02 => "@a[1,2]") if $unknown; # millisecond counter (https://exiftool.org/forum/index.php?topic=9884.msg65143#msg65143)
3027
+ $et->HandleTag($tagTbl, Unknown02 => $a[1]) if $unknown;
2923
3028
  }
2924
3029
  }
2925
3030
  } elsif ($id == 0x101) {
@@ -2932,10 +3037,41 @@ sub ProcessInsta360($;$)
2932
3037
  $et->HandleTag($tagTablePtr, $t, $val);
2933
3038
  $p += 2 + $n;
2934
3039
  }
3040
+ } elsif ($id == 0x0) {
3041
+ last if not $len;
3042
+ # example directory table for record locations from Insta360AcePro MP4 video:
3043
+ # vv vv - record ID
3044
+ # vv vv vv vv - record size
3045
+ # vv vv vv vv - offset from start of footer
3046
+ # 00 00 00 00 00 00 00 00 00 00
3047
+ # 01 01 82 04 00 00 1b 45 62 00
3048
+ # 02 00 28 46 05 00 ed fe 5c 00
3049
+ # 03 00 40 aa 24 00 ed fe 34 00
3050
+ # 04 00 00 c1 01 00 ed fe 30 00
3051
+ # [...]
3052
+ unless ($dirTable) {
3053
+ $dirTable = $buff;
3054
+ $dirTablePos = 0;
3055
+ }
2935
3056
  }
2936
- ($epos -= 6) + $trailerLen < 0 and last; # step back to previous record
2937
- $raf->Seek($epos, 2) or last;
2938
- $raf->Read($buff, 6) == 6 or last;
3057
+ # step through directory table instead of sequential scanning if possible
3058
+ if ($dirTable) {
3059
+ undef $epos;
3060
+ for (;;) {
3061
+ last if $dirTablePos + 10 > length($dirTable);
3062
+ my ($id, $siz, $off) = unpack("x${dirTablePos}vVV", $dirTable);
3063
+ $dirTablePos += 10;
3064
+ if ($id and $siz and $off + $siz < $trailerLen) {
3065
+ $epos = $off + $siz - $trailerLen;
3066
+ last;
3067
+ }
3068
+ }
3069
+ last unless defined $epos;
3070
+ } else {
3071
+ ($epos -= 6) + $trailerLen < 0 and last; # step back to previous record
3072
+ }
3073
+ $raf->Seek($epos, 2) or last; # seek to start of next footer
3074
+ $raf->Read($buff, 6) == 6 or last; # read footer
2939
3075
  }
2940
3076
  $$et{DOC_NUM} = 0;
2941
3077
  SetByteOrder('MM');
@@ -3173,7 +3309,7 @@ information like GPS tracks from MOV, MP4 and INSV media data.
3173
3309
 
3174
3310
  =head1 AUTHOR
3175
3311
 
3176
- Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
3312
+ Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
3177
3313
 
3178
3314
  This library is free software; you can redistribute it and/or modify it
3179
3315
  under the same terms as Perl itself.
@@ -2199,7 +2199,7 @@ including AVI videos, WAV audio files and WEBP images.
2199
2199
 
2200
2200
  =head1 AUTHOR
2201
2201
 
2202
- Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
2202
+ Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
2203
2203
 
2204
2204
  This library is free software; you can redistribute it and/or modify it
2205
2205
  under the same terms as Perl itself.
@@ -225,7 +225,7 @@ resource files.
225
225
 
226
226
  =head1 AUTHOR
227
227
 
228
- Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
228
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
369
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
128
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
171
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
718
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
434
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
306
+ Copyright 2003-2024, 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.
@@ -9,6 +9,7 @@
9
9
  # 2) http://homepage3.nifty.com/kamisaka/makernote/makernote_ricoh.htm
10
10
  # 3) Tim Gray private communication (GR)
11
11
  # 4) https://github.com/atotto/ricoh-theta-tools/
12
+ # 5) https://github.com/ricohapi/theta-api-specs/blob/main/theta-metadata/README.md
12
13
  # IB) Iliah Borg private communication (LibRaw)
13
14
  #------------------------------------------------------------------------------
14
15
 
@@ -18,11 +19,13 @@ use strict;
18
19
  use vars qw($VERSION);
19
20
  use Image::ExifTool qw(:DataAccess :Utils);
20
21
  use Image::ExifTool::Exif;
22
+ use Image::ExifTool::GPS;
21
23
 
22
- $VERSION = '1.36';
24
+ $VERSION = '1.38';
23
25
 
24
26
  sub ProcessRicohText($$$);
25
27
  sub ProcessRicohRMETA($$$);
28
+ sub ProcessRicohRDT($$$);
26
29
 
27
30
  # lens types for Ricoh GXR
28
31
  my %ricohLensIDs = (
@@ -908,6 +911,65 @@ my %ricohLensIDs = (
908
911
  },
909
912
  );
910
913
 
914
+ # real-time metadata in RDTA atom (ref 5)
915
+ %Image::ExifTool::Ricoh::RDTA = (
916
+ PROCESS_PROC => \&ProcessRicohRDT,
917
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
918
+ 0 => { Name => 'Accelerometer', Format => 'float[3]' },
919
+ 16 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
920
+ );
921
+
922
+ # real-time metadata in RDTB atom (ref 5)
923
+ %Image::ExifTool::Ricoh::RDTB = (
924
+ PROCESS_PROC => \&ProcessRicohRDT,
925
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
926
+ 0 => { Name => 'Gyroscope', Format => 'float[3]', Notes => 'rad/s' },
927
+ 16 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
928
+ );
929
+
930
+ # real-time metadata in RDTC atom (ref 5)
931
+ %Image::ExifTool::Ricoh::RDTC = (
932
+ PROCESS_PROC => \&ProcessRicohRDT,
933
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
934
+ 0 => { Name => 'MagneticField', Format => 'float[3]' },
935
+ 16 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
936
+ );
937
+
938
+ # real-time metadata in RDTG atom (ref 5)
939
+ %Image::ExifTool::Ricoh::RDTG = (
940
+ PROCESS_PROC => \&ProcessRicohRDT,
941
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
942
+ 0 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
943
+ 100 => { Name => 'FrameNumber', Notes => 'generated internally' },
944
+ );
945
+
946
+ # real-time metadata in RDTL atom (ref 5)
947
+ %Image::ExifTool::Ricoh::RDTL = (
948
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
949
+ 0 => {
950
+ Name => 'GPSDateTime',
951
+ Groups => { 2 => 'Time' },
952
+ Format => 'double',
953
+ ValueConv => 'ConvertUnixTime($val*1e-9, 1, 9)', # (NC -- what is the epoch?)
954
+ PrintConv => '$self->ConvertDateTime($val)',
955
+ },
956
+ 8 => {
957
+ Name => 'GPSLatitude',
958
+ Format => 'double',
959
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
960
+ },
961
+ 16 => {
962
+ Name => 'GPSLongitude',
963
+ Format => 'double',
964
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
965
+ },
966
+ 24 => {
967
+ Name => 'GPSAltitude',
968
+ Format => 'double',
969
+ PrintConv => '($val =~ s/^-// ? "$val m Below" : "$val m Above") . " Sea Level"',
970
+ },
971
+ );
972
+
911
973
  # Ricoh composite tags
912
974
  %Image::ExifTool::Ricoh::Composite = (
913
975
  GROUPS => { 2 => 'Camera' },
@@ -932,6 +994,52 @@ my %ricohLensIDs = (
932
994
  Image::ExifTool::AddCompositeTags('Image::ExifTool::Ricoh');
933
995
 
934
996
 
997
+ #------------------------------------------------------------------------------
998
+ # Process Ricoh RDT* real-time metadata
999
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
1000
+ # Returns: 1 on success, otherwise returns 0 and sets a Warning
1001
+ sub ProcessRicohRDT($$$)
1002
+ {
1003
+ my ($et, $dirInfo, $tagTablePtr) = @_;
1004
+ my $dataPt = $$dirInfo{DataPt};
1005
+ my $dirLen = $$dirInfo{DirLen};
1006
+ my $dirName = $$dirInfo{DirName};
1007
+ my ($i, $rdtg);
1008
+ return 0 if $dirLen < 16;
1009
+ my $ee = $et->Options('ExtractEmbedded');
1010
+ unless ($ee) {
1011
+ $et->WarnOnce('Use ExtractEmbedded option to read Ricoh real-time metadata',3);
1012
+ return 1;
1013
+ }
1014
+ my $endian = substr($$dataPt, 8, 2);
1015
+ SetByteOrder($endian eq "\x23\x01" ? 'II' : 'MM');
1016
+ my $count = Get32u($dataPt, 0);
1017
+ my $len = Get16u($dataPt, 6);
1018
+ if ($dirName eq 'RicohRDTG') {
1019
+ if ($ee < 2) {
1020
+ $et->WarnOnce('Set ExtractEmbedded option to 2 or higher to extract frame timestamps',3);
1021
+ return 1;
1022
+ }
1023
+ $rdtg = 0;
1024
+ $et->WarnOnce('Unexpected RDTG record length') if $len > 8;
1025
+ }
1026
+ if ($count * $len + 16 > $dirLen) {
1027
+ $et->Warn("Truncated $dirName data");
1028
+ $count = int(($dirLen - 16) / $len);
1029
+ }
1030
+ $et->VerboseDir($dirName);
1031
+ $$dirInfo{DirStart} = 16;
1032
+ $$dirInfo{DirLen} = $len;
1033
+ for ($i=0; $i<$count; ++$i) {;
1034
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
1035
+ $et->HandleTag($tagTablePtr, 100, $rdtg++) if defined $rdtg;
1036
+ $et->ProcessBinaryData($dirInfo, $tagTablePtr);
1037
+ $$dirInfo{DirStart} += $len;
1038
+ }
1039
+ delete $$et{DOC_NUM};
1040
+ return 1;
1041
+ }
1042
+
935
1043
  #------------------------------------------------------------------------------
936
1044
  # Process Ricoh text-based maker notes
937
1045
  # Inputs: 0) ExifTool object reference
@@ -970,7 +1078,7 @@ sub ProcessRicohText($$$)
970
1078
  $tagInfo = {
971
1079
  Name => "Ricoh_Text_$tag",
972
1080
  Unknown => 1,
973
- PrintConv => 'length($val) > 60 ? substr($val,0,55) . "[...]" : $val',
1081
+ PrintConv => \&Image::ExifTool::LimitLongValues,
974
1082
  };
975
1083
  # add tag information to table
976
1084
  AddTagToTable($tagTablePtr, $tag, $tagInfo);
@@ -1144,7 +1252,7 @@ interpret Ricoh maker notes EXIF meta information.
1144
1252
 
1145
1253
  =head1 AUTHOR
1146
1254
 
1147
- Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
1255
+ Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1148
1256
 
1149
1257
  This library is free software; you can redistribute it and/or modify it
1150
1258
  under the same terms as Perl itself.
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
24
 
25
- $VERSION = '1.54';
25
+ $VERSION = '1.55';
26
26
 
27
27
  sub WriteSTMN($$$);
28
28
  sub ProcessINFO($$$);
@@ -904,9 +904,10 @@ my %formatMinMax = (
904
904
  Name => 'SamsungSvss',
905
905
  SubDirectory => { TagTable => 'Image::ExifTool::Samsung::svss' },
906
906
  },
907
+ mdln => 'SamsungModel', #PH (Samsung SM-A136U, etc)
907
908
  # swtr - 4 bytes, all zero
908
909
  # scid - 8 bytes, all zero
909
- # saut - 4 bytes, all zero
910
+ # saut - 4 or 6 bytes, all zero
910
911
  );
911
912
 
912
913
  # Samsung MP4 svss information (PH - from SM-C101 sample)
@@ -1722,7 +1723,7 @@ Samsung maker notes in EXIF information.
1722
1723
 
1723
1724
  =head1 AUTHOR
1724
1725
 
1725
- Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
1726
+ Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1726
1727
 
1727
1728
  This library is free software; you can redistribute it and/or modify it
1728
1729
  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-2023, Phil Harvey (philharvey66 at gmail.com)
422
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
131
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
635
+ Copyright 2003-2024, 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.
@@ -344,7 +344,7 @@ name prefix.
344
344
 
345
345
  =head1 AUTHOR
346
346
 
347
- Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
347
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
867
+ Copyright 2003-2024, 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-2023, Phil Harvey (philharvey66 at gmail.com)
683
+ Copyright 2003-2024, 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.