exiftool-vendored.exe 13.0.0 → 13.17.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 (208) hide show
  1. package/bin/exiftool.exe +0 -0
  2. package/bin/exiftool_files/exiftool.pl +169 -65
  3. package/bin/exiftool_files/lib/File/RandomAccess.pm +1 -1
  4. package/bin/exiftool_files/lib/File/RandomAccess.pod +2 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/AAC.pm +1 -1
  6. package/bin/exiftool_files/lib/Image/ExifTool/AES.pm +1 -1
  7. package/bin/exiftool_files/lib/Image/ExifTool/AFCP.pm +6 -6
  8. package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +2 -2
  9. package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +2 -2
  10. package/bin/exiftool_files/lib/Image/ExifTool/APP12.pm +1 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/ASF.pm +2 -2
  12. package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +11 -9
  13. package/bin/exiftool_files/lib/Image/ExifTool/Audible.pm +1 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/BMP.pm +1 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/BPG.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/BZZ.pm +1 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/BigTIFF.pm +1 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +46 -26
  19. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +5 -2
  20. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +68 -28
  21. package/bin/exiftool_files/lib/Image/ExifTool/CanonCustom.pm +1 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +1 -1
  23. package/bin/exiftool_files/lib/Image/ExifTool/CanonVRD.pm +1 -1
  24. package/bin/exiftool_files/lib/Image/ExifTool/CaptureOne.pm +1 -1
  25. package/bin/exiftool_files/lib/Image/ExifTool/Casio.pm +1 -1
  26. package/bin/exiftool_files/lib/Image/ExifTool/Charset.pm +1 -1
  27. package/bin/exiftool_files/lib/Image/ExifTool/DICOM.pm +1 -1
  28. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +196 -30
  29. package/bin/exiftool_files/lib/Image/ExifTool/DNG.pm +1 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +1 -1
  31. package/bin/exiftool_files/lib/Image/ExifTool/DV.pm +1 -1
  32. package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +1 -1
  33. package/bin/exiftool_files/lib/Image/ExifTool/DjVu.pm +1 -1
  34. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +138 -33
  35. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +29 -16
  36. package/bin/exiftool_files/lib/Image/ExifTool/FITS.pm +3 -3
  37. package/bin/exiftool_files/lib/Image/ExifTool/FLAC.pm +1 -1
  38. package/bin/exiftool_files/lib/Image/ExifTool/FLIF.pm +3 -3
  39. package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +1 -1
  40. package/bin/exiftool_files/lib/Image/ExifTool/Fixup.pm +1 -1
  41. package/bin/exiftool_files/lib/Image/ExifTool/Flash.pm +1 -1
  42. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +17 -21
  43. package/bin/exiftool_files/lib/Image/ExifTool/Font.pm +2 -2
  44. package/bin/exiftool_files/lib/Image/ExifTool/FotoStation.pm +1 -1
  45. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -1
  46. package/bin/exiftool_files/lib/Image/ExifTool/GE.pm +1 -1
  47. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +144 -93
  48. package/bin/exiftool_files/lib/Image/ExifTool/GIMP.pm +1 -1
  49. package/bin/exiftool_files/lib/Image/ExifTool/GM.pm +1 -1
  50. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +34 -30
  51. package/bin/exiftool_files/lib/Image/ExifTool/GeoTiff.pm +1 -1
  52. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
  53. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.pm +19 -9
  54. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +46 -12
  55. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +120 -8
  56. package/bin/exiftool_files/lib/Image/ExifTool/H264.pm +1 -1
  57. package/bin/exiftool_files/lib/Image/ExifTool/HP.pm +2 -2
  58. package/bin/exiftool_files/lib/Image/ExifTool/HTML.pm +1 -1
  59. package/bin/exiftool_files/lib/Image/ExifTool/HtmlDump.pm +1 -1
  60. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +81 -2
  61. package/bin/exiftool_files/lib/Image/ExifTool/ICO.pm +1 -1
  62. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +8 -8
  63. package/bin/exiftool_files/lib/Image/ExifTool/IPTC.pm +10 -7
  64. package/bin/exiftool_files/lib/Image/ExifTool/ISO.pm +1 -1
  65. package/bin/exiftool_files/lib/Image/ExifTool/ITC.pm +1 -1
  66. package/bin/exiftool_files/lib/Image/ExifTool/Import.pm +5 -4
  67. package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +2 -2
  68. package/bin/exiftool_files/lib/Image/ExifTool/InfiRay.pm +1 -1
  69. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +38 -5
  70. package/bin/exiftool_files/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  71. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +1 -1
  72. package/bin/exiftool_files/lib/Image/ExifTool/JVC.pm +1 -1
  73. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +10 -9
  74. package/bin/exiftool_files/lib/Image/ExifTool/Kodak.pm +1 -1
  75. package/bin/exiftool_files/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  76. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +1 -1
  77. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +2 -2
  78. package/bin/exiftool_files/lib/Image/ExifTool/Lang/cs.pm +1 -1
  79. package/bin/exiftool_files/lib/Image/ExifTool/Lang/de.pm +1 -1
  80. package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  81. package/bin/exiftool_files/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  82. package/bin/exiftool_files/lib/Image/ExifTool/Lang/es.pm +1 -1
  83. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fi.pm +1 -1
  84. package/bin/exiftool_files/lib/Image/ExifTool/Lang/fr.pm +1 -1
  85. package/bin/exiftool_files/lib/Image/ExifTool/Lang/it.pm +1 -1
  86. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ja.pm +1 -1
  87. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ko.pm +1 -1
  88. package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +1 -1
  89. package/bin/exiftool_files/lib/Image/ExifTool/Lang/pl.pm +1 -1
  90. package/bin/exiftool_files/lib/Image/ExifTool/Lang/ru.pm +1 -1
  91. package/bin/exiftool_files/lib/Image/ExifTool/Lang/sk.pm +1 -1
  92. package/bin/exiftool_files/lib/Image/ExifTool/Lang/sv.pm +1 -1
  93. package/bin/exiftool_files/lib/Image/ExifTool/Lang/tr.pm +1 -1
  94. package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  95. package/bin/exiftool_files/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  96. package/bin/exiftool_files/lib/Image/ExifTool/Leaf.pm +1 -1
  97. package/bin/exiftool_files/lib/Image/ExifTool/LigoGPS.pm +409 -0
  98. package/bin/exiftool_files/lib/Image/ExifTool/Lytro.pm +1 -1
  99. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +57 -18
  100. package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +15 -6
  101. package/bin/exiftool_files/lib/Image/ExifTool/MIEUnits.pod +1 -1
  102. package/bin/exiftool_files/lib/Image/ExifTool/MIFF.pm +1 -1
  103. package/bin/exiftool_files/lib/Image/ExifTool/MISB.pm +1 -1
  104. package/bin/exiftool_files/lib/Image/ExifTool/MNG.pm +1 -1
  105. package/bin/exiftool_files/lib/Image/ExifTool/MOI.pm +1 -1
  106. package/bin/exiftool_files/lib/Image/ExifTool/MPC.pm +1 -1
  107. package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +1 -1
  108. package/bin/exiftool_files/lib/Image/ExifTool/MPF.pm +1 -1
  109. package/bin/exiftool_files/lib/Image/ExifTool/MRC.pm +1 -1
  110. package/bin/exiftool_files/lib/Image/ExifTool/MWG.pm +1 -1
  111. package/bin/exiftool_files/lib/Image/ExifTool/MXF.pm +3 -3
  112. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +3 -2
  113. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +1 -1
  114. package/bin/exiftool_files/lib/Image/ExifTool/Matroska.pm +22 -6
  115. package/bin/exiftool_files/lib/Image/ExifTool/Microsoft.pm +2 -2
  116. package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +1 -1
  117. package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  118. package/bin/exiftool_files/lib/Image/ExifTool/Motorola.pm +1 -1
  119. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +457 -103
  120. package/bin/exiftool_files/lib/Image/ExifTool/NikonCapture.pm +1 -1
  121. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +6 -6
  122. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +1 -1
  123. package/bin/exiftool_files/lib/Image/ExifTool/Nintendo.pm +1 -1
  124. package/bin/exiftool_files/lib/Image/ExifTool/OOXML.pm +8 -8
  125. package/bin/exiftool_files/lib/Image/ExifTool/Ogg.pm +1 -1
  126. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +1 -1
  127. package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +1 -1
  128. package/bin/exiftool_files/lib/Image/ExifTool/Opus.pm +1 -1
  129. package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +1 -1
  130. package/bin/exiftool_files/lib/Image/ExifTool/PCX.pm +1 -1
  131. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +49 -18
  132. package/bin/exiftool_files/lib/Image/ExifTool/PGF.pm +1 -1
  133. package/bin/exiftool_files/lib/Image/ExifTool/PICT.pm +1 -1
  134. package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +4 -4
  135. package/bin/exiftool_files/lib/Image/ExifTool/PLUS.pm +1 -1
  136. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +20 -8
  137. package/bin/exiftool_files/lib/Image/ExifTool/PPM.pm +12 -3
  138. package/bin/exiftool_files/lib/Image/ExifTool/PSP.pm +1 -1
  139. package/bin/exiftool_files/lib/Image/ExifTool/Palm.pm +1 -1
  140. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +27 -3
  141. package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  142. package/bin/exiftool_files/lib/Image/ExifTool/Parrot.pm +1 -1
  143. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +1 -1
  144. package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +4 -4
  145. package/bin/exiftool_files/lib/Image/ExifTool/PhotoCD.pm +1 -1
  146. package/bin/exiftool_files/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  147. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +65 -4
  148. package/bin/exiftool_files/lib/Image/ExifTool/PostScript.pm +1 -1
  149. package/bin/exiftool_files/lib/Image/ExifTool/PrintIM.pm +1 -1
  150. package/bin/exiftool_files/lib/Image/ExifTool/Protobuf.pm +270 -0
  151. package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +1 -1
  152. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +327 -88
  153. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +199 -195
  154. package/bin/exiftool_files/lib/Image/ExifTool/README +12 -2
  155. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +21 -6
  156. package/bin/exiftool_files/lib/Image/ExifTool/RSRC.pm +1 -1
  157. package/bin/exiftool_files/lib/Image/ExifTool/RTF.pm +2 -2
  158. package/bin/exiftool_files/lib/Image/ExifTool/Radiance.pm +1 -1
  159. package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +1 -1
  160. package/bin/exiftool_files/lib/Image/ExifTool/Real.pm +1 -1
  161. package/bin/exiftool_files/lib/Image/ExifTool/Reconyx.pm +1 -1
  162. package/bin/exiftool_files/lib/Image/ExifTool/Red.pm +1 -1
  163. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +4 -4
  164. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +6 -2
  165. package/bin/exiftool_files/lib/Image/ExifTool/Sanyo.pm +1 -1
  166. package/bin/exiftool_files/lib/Image/ExifTool/Scalado.pm +1 -1
  167. package/bin/exiftool_files/lib/Image/ExifTool/Shift.pl +1 -1
  168. package/bin/exiftool_files/lib/Image/ExifTool/Shortcuts.pm +1 -1
  169. package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +1 -1
  170. package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  171. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +6 -5
  172. package/bin/exiftool_files/lib/Image/ExifTool/SonyIDC.pm +1 -1
  173. package/bin/exiftool_files/lib/Image/ExifTool/Stim.pm +1 -1
  174. package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +6 -5
  175. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +7028 -6968
  176. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +12079 -11630
  177. package/bin/exiftool_files/lib/Image/ExifTool/Text.pm +4 -3
  178. package/bin/exiftool_files/lib/Image/ExifTool/Theora.pm +1 -1
  179. package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +3 -3
  180. package/bin/exiftool_files/lib/Image/ExifTool/Trailer.pm +318 -0
  181. package/bin/exiftool_files/lib/Image/ExifTool/Unknown.pm +1 -1
  182. package/bin/exiftool_files/lib/Image/ExifTool/VCard.pm +3 -3
  183. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +6 -6
  184. package/bin/exiftool_files/lib/Image/ExifTool/Vorbis.pm +1 -1
  185. package/bin/exiftool_files/lib/Image/ExifTool/WPG.pm +1 -1
  186. package/bin/exiftool_files/lib/Image/ExifTool/WTV.pm +1 -1
  187. package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  188. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +3 -3
  189. package/bin/exiftool_files/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  190. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
  191. package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +1 -1
  192. package/bin/exiftool_files/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  193. package/bin/exiftool_files/lib/Image/ExifTool/WritePostScript.pl +1 -1
  194. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +170 -79
  195. package/bin/exiftool_files/lib/Image/ExifTool/WriteRIFF.pl +17 -6
  196. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +3 -3
  197. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +89 -96
  198. package/bin/exiftool_files/lib/Image/ExifTool/XISF.pm +1 -1
  199. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +28 -13
  200. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +106 -3
  201. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +2 -3
  202. package/bin/exiftool_files/lib/Image/ExifTool/ZIP.pm +2 -2
  203. package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +1 -1
  204. package/bin/exiftool_files/lib/Image/ExifTool/iWork.pm +1 -1
  205. package/bin/exiftool_files/lib/Image/ExifTool.pm +467 -228
  206. package/bin/exiftool_files/lib/Image/ExifTool.pod +118 -72
  207. package/bin/exiftool_files/windows_exiftool.txt +96 -51
  208. package/package.json +8 -8
@@ -17,6 +17,7 @@
17
17
  # 2022/06/21 - PH Added ability to read Google Takeout JSON files
18
18
  # 2024/04/23 - PH Added ability to read more OpenTracks GPS tags
19
19
  # 2024/08/28 - PH Added support for new Google Takeout JSON format
20
+ # 2024/11/26 - PH Also write GPSMeasureMode and GPSDOP
20
21
  #
21
22
  # References: 1) http://www.topografix.com/GPX/1/1/
22
23
  # 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
@@ -31,7 +32,7 @@ use vars qw($VERSION);
31
32
  use Image::ExifTool qw(:Public);
32
33
  use Image::ExifTool::GPS;
33
34
 
34
- $VERSION = '1.79';
35
+ $VERSION = '1.81';
35
36
 
36
37
  sub JITTER() { return 2 } # maximum time jitter
37
38
 
@@ -90,12 +91,25 @@ my %fixInfoKeys = (
90
91
  orient => [ 'dir', 'pitch', 'roll' ],
91
92
  atemp => [ 'atemp' ],
92
93
  err => [ 'err' ],
94
+ dop => [ 'hdop', 'vdop', 'pdop' ],
93
95
  );
94
96
 
95
- my %isOrient = ( dir => 1, pitch => 1, roll => 1 ); # test for orientation key
97
+ # category for select keys
98
+ my %keyCategory = (
99
+ dir => 'orient',
100
+ pitch => 'orient',
101
+ roll => 'orient',
102
+ hdop => 'dop',
103
+ pdop => 'dop',
104
+ vdop => 'dop',
105
+ );
96
106
 
97
107
  # tags which may exist separately in some formats (eg. CSV)
98
- my %sepTags = ( dir => 1, pitch => 1, roll => 1, track => 1, speed => 1 );
108
+ my %sepTags = (
109
+ dir => 1, pitch => 1, roll => 1, track => 1, speed => 1,
110
+ # (plus other tags we don't want to scan outwards for)
111
+ hdop => 1, pdop => 1, vdop => 1,
112
+ );
99
113
 
100
114
  # conversion factors for GPSSpeed (standard EXIF units only)
101
115
  my %speedConv = (
@@ -348,8 +362,8 @@ sub LoadTrackLog($$;$)
348
362
  my $tag = $xmlTag{lc $2};
349
363
  if ($tag) {
350
364
  $$fix{$tag} = $4;
351
- if ($isOrient{$tag}) {
352
- $$has{orient} = 1;
365
+ if ($keyCategory{$tag}) {
366
+ $$has{$keyCategory{$tag}} = 1;
353
367
  } elsif ($tag eq 'alt') {
354
368
  # validate altitude
355
369
  undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/;
@@ -394,8 +408,8 @@ sub LoadTrackLog($$;$)
394
408
  } else {
395
409
  $$fix{$tag} = $1;
396
410
  }
397
- if ($isOrient{$tag}) {
398
- $$has{orient} = 1;
411
+ if ($keyCategory{$tag}) {
412
+ $$has{$keyCategory{$tag}} = 1;
399
413
  } elsif ($tag eq 'alt') {
400
414
  # validate altitude
401
415
  undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/;
@@ -562,8 +576,8 @@ DoneFix: $isDate = 1;
562
576
  next;
563
577
  } elsif ($format eq 'JSON') {
564
578
  # Google Takeout JSON format
565
- if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp|startTime|point|durationMinutesOffsetFromStartTime)"\s*:\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
566
- if ($1 eq 'timestamp') {
579
+ if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp|startTime|point|durationMinutesOffsetFromStartTime|time)"\s*:\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
580
+ if ($1 eq 'timestamp' or $1 eq 'time') {
567
581
  $time = GetTime($2);
568
582
  goto DoneFix if $time and $$fix{lat} and $$fix{lon};
569
583
  } elsif ($1 eq 'startTime') { # (new format)
@@ -1145,7 +1159,7 @@ sub SetGeoValues($$;$)
1145
1159
  # loop through available fix information categories
1146
1160
  # (pos, track, alt, orient)
1147
1161
  my ($category, $key);
1148
- Category: foreach $category (qw{pos track alt orient atemp err}) {
1162
+ Category: foreach $category (qw{pos track alt orient atemp err dop}) {
1149
1163
  next unless $$has{$category};
1150
1164
  my ($f, $p0b, $p1b, $f0b);
1151
1165
  # loop through specific fix information keys
@@ -1303,6 +1317,25 @@ Category: foreach $category (qw{pos track alt orient atemp err}) {
1303
1317
  if ($$has{err}) {
1304
1318
  @r = $et->SetNewValue(GPSHPositioningError => $$fix{err}, %opts);
1305
1319
  }
1320
+ if ($$has{dop}) {
1321
+ my ($dop, $mm);
1322
+ if (defined $$fix{pdop}) {
1323
+ $dop = $$fix{pdop};
1324
+ $mm = 3;
1325
+ } elsif (defined $$fix{hdop}) {
1326
+ if (defined $$fix{vdop}) {
1327
+ $dop = sqrt($$fix{hdop} * $$fix{hdop} + $$fix{vdop} * $$fix{vdop});
1328
+ $mm = 3;
1329
+ } else {
1330
+ $dop = $$fix{hdop};
1331
+ $mm = 2;
1332
+ }
1333
+ }
1334
+ if (defined $dop) {
1335
+ $et->SetNewValue(GPSMeasureMode => $mm, %opts);
1336
+ $et->SetNewValue(GPSDOP => $dop, %opts);
1337
+ }
1338
+ }
1306
1339
  unless ($xmp) {
1307
1340
  my ($latRef, $lonRef);
1308
1341
  $latRef = ($$fix{lat} > 0 ? 'N' : 'S') if defined $$fix{lat};
@@ -1328,7 +1361,8 @@ Category: foreach $category (qw{pos track alt orient atemp err}) {
1328
1361
  GPSAltitude GPSAltitudeRef GPSDateStamp GPSTimeStamp GPSDateTime
1329
1362
  GPSTrack GPSTrackRef GPSSpeed GPSSpeedRef GPSImgDirection
1330
1363
  GPSImgDirectionRef GPSPitch GPSRoll CameraElevationAngle
1331
- AmbientTemperature GPSHPositioningError GPSCoordinates))
1364
+ AmbientTemperature GPSHPositioningError GPSCoordinates
1365
+ GPSMeasureMode GPSDOP))
1332
1366
  {
1333
1367
  my @r = $et->SetNewValue($_, undef, %opts);
1334
1368
  }
@@ -1527,7 +1561,7 @@ user-defined tag GPSRoll, must be active.
1527
1561
 
1528
1562
  =head1 AUTHOR
1529
1563
 
1530
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1564
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1531
1565
 
1532
1566
  This library is free software; you can redistribute it and/or modify it
1533
1567
  under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::QuickTime;
18
18
 
19
- $VERSION = '1.08';
19
+ $VERSION = '1.11';
20
20
 
21
21
  sub ProcessGoPro($$$);
22
22
  sub ProcessString($$$);
@@ -72,6 +72,7 @@ my %addUnits = (
72
72
  let me know if you discover the meaning of any of these unknown tags. See
73
73
  L<https://github.com/gopro/gpmf-parser> for details about this format.
74
74
  },
75
+ # ABSC (GPMF) - seen: 0 (fmt f)
75
76
  ACCL => { #2 (gpmd)
76
77
  Name => 'Accelerometer',
77
78
  Notes => 'accelerator readings in m/s2',
@@ -81,7 +82,9 @@ my %addUnits = (
81
82
  # ANGY (GPMF-GEOC) - seen 179.9 (fmt d, Max)
82
83
  # ANGZ (GPMF-GEOC) - seen 0.152 (fmt d, Max)
83
84
  ALLD => 'AutoLowLightDuration', #1 (gpmd) (untested)
84
- # APTO (GPMF) - seen: 'RAW', 'DYNM' (fmt c)
85
+ # APTO (GPMF) - seen: 'OFF', 'RAW', 'DYNM' (fmt c)
86
+ # ARUW (GPMF) - seen: 1.14285719394684 (fmt f)
87
+ # ARWA (GPMF) - seen: 1.14285719394684 (fmt f)
85
88
  ATTD => { #PH (Karma)
86
89
  Name => 'Attitude',
87
90
  # UNIT=s,rad,rad,rad,rad/s,rad/s,rad/s,
@@ -96,8 +99,10 @@ my %addUnits = (
96
99
  # SCAL=1000 1 1 1 1
97
100
  Binary => 1,
98
101
  },
102
+ # AUBT (GPMF) - seen: ''N' (type c)
99
103
  AUDO => 'AudioSetting', #PH (GPMF - seen: 'WIND', fmt c)
100
104
  # AUPT (GPMF) - seen: 'N','Y' (fmt c)
105
+ # BITR (GPMF) - seen: 'STANDARD' (fmt c)
101
106
  BPOS => { #PH (Karma)
102
107
  Name => 'Controller',
103
108
  Unknown => 1,
@@ -111,9 +116,16 @@ my %addUnits = (
111
116
  # CALH (GPMF-GEOC) - seen 3040 (fmt L, Max)
112
117
  # CALW (GPMF-GEOC) - seen 4056 (fmt L, Max)
113
118
  CASN => 'CameraSerialNumber', #PH (GPMF - seen: 'C3221324545448', fmt c)
119
+ # CDAT (GPMF) - seen: 1732152823 (fmt J)
120
+ # CDTM (GPMF) - seen: 0 (fmt L)
114
121
  # CINF (GPMF) - seen: 0x67376be7709bc8876a8baf3940908618, 0xe230988539b30cf5f016627ae8fc5395,
115
122
  # 0x8bcbe424acc5b37d7d77001635198b3b (fmt B) (Camera INFormation?)
123
+ # CLDP (GPMF) - seen: 'Y' (fmt c)
124
+ # CLKC (GPMF) - seen: 0 (fmt L)
125
+ # CLKS (GPMF) - seen: 2 (fmt B)
116
126
  # CMOD (GPMF) - seen: 12,13,17 [12 360 video, 13 time-laps video, 17 JPEG] (fmt B)
127
+ # CPID (GPMF) - seen: '1194885996 3387225026 733916448 2433577768' (fmt L)
128
+ # CPIN (GPMF) - seen: 1
117
129
  # CRTX (GPMF-BACK/FRNT) - double[1]
118
130
  # CRTY (GPMF-BACK/FRNT) - double[1]
119
131
  CSEN => { #PH (Karma)
@@ -123,6 +135,7 @@ my %addUnits = (
123
135
  # SCAL=1000 1 1 1 1 1 1 1 1 1 1
124
136
  Binary => 1,
125
137
  },
138
+ # CTRL (GPMF) - seen: 'Pro' (fmt c)
126
139
  CYTS => { #PH (Karma)
127
140
  Name => 'CoyoteStatus',
128
141
  # UNIT=s,,,,,rad,rad,rad,,
@@ -141,6 +154,8 @@ my %addUnits = (
141
154
  # (Max) DVID='FRNT',DVNM='Front Lens',KLNS,CTRX,CTRY,MFOV,SFTR
142
155
  # (Max) DVID='HLMT',DVNM='Highlights'
143
156
  },
157
+ # DNSC (GPMF) - seen: 'HIGH' (fmt c)
158
+ # DUST (GPMF) - seen: 'NO_LIMIT' (fmt c)
144
159
  # DVID (GPMF) - DeviceID; seen: 1 (fmt L), HLMT (fmt F), GEOC (fmt F), 'BACK' (fmt F, Max)
145
160
  DVID => { Name => 'DeviceID', Unknown => 1 }, #2 (gpmd)
146
161
  # DVNM (GPMF) seen: 'Video Global Settings' (fmt c), 'Highlights' (fmt c), 'Geometry Calibrations' (Max)
@@ -150,6 +165,7 @@ my %addUnits = (
150
165
  Name => 'DigitalZoom',
151
166
  PrintConv => { N => 'No', Y => 'Yes' },
152
167
  },
168
+ # DZMX (GPMF) - seen: 1.39999997615814 (fmt f)
153
169
  # DZST (GPMF) - seen: 0 (fmt L) (something to do with digital zoom maybe?)
154
170
  EISA => { #PH (GPMF) - seen: 'Y','N','HS EIS','N/A' (fmt c) [N was for a time-lapse video]
155
171
  Name => 'ElectronicImageStabilization',
@@ -188,10 +204,20 @@ my %addUnits = (
188
204
  },
189
205
  GPS5 => { #2 (gpmd)
190
206
  Name => 'GPSInfo',
207
+ # UNIT=deg,deg,m,m/s,m/s
208
+ # TYPE=l
191
209
  # SCAL=10000000,10000000,1000,1000,100
192
210
  RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data
193
211
  SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPS5' },
194
212
  },
213
+ GPS9 => { #PH (gpmd, Hero 13)
214
+ Name => 'GPSInfo9',
215
+ # UNIT=deg,deg,m,m/s,m/s,,s,,
216
+ # TYPE=lllllllSS
217
+ # SCAL=10000000 10000000 1000 1000 100 1 1000 100 1
218
+ RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data
219
+ SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPS9' },
220
+ },
195
221
  GPSF => { #2 (gpmd)
196
222
  Name => 'GPSMeasureMode',
197
223
  PrintConv => {
@@ -216,7 +242,10 @@ my %addUnits = (
216
242
  Notes => 'gyroscope readings in rad/s',
217
243
  Binary => 1,
218
244
  },
245
+ # HCTL (GPMF) - seen: "Off" (fmt c)
246
+ # HDRV (GPMF) - seen: "N" (fmt c)
219
247
  # HFLG (APP6) - seen: 0
248
+ # HSGT (GPMF) - seen: 'OFF' (fmt c)
220
249
  ISOE => 'ISOSpeeds', #PH (gpmd)
221
250
  ISOG => { #2 (gpmd)
222
251
  Name => 'ImageSensorGain',
@@ -232,6 +261,7 @@ my %addUnits = (
232
261
  },
233
262
  # KLNS (GPMF-BACK/FRNT) - double[5] (fmt d, Max)
234
263
  # LINF (GPMF) - seen: LAJ7061916601668,C3341326002180,C33632245450981 (fmt c) (Lens INFormation?)
264
+ # LMOD (GPMF) - seen: 'NONE' (fmt F)
235
265
  LNED => { #PH (Karma)
236
266
  Name => 'LocalPositionNED',
237
267
  # UNIT=s,m,m,m,m/s,m/s,m/s
@@ -240,14 +270,20 @@ my %addUnits = (
240
270
  Binary => 1,
241
271
  },
242
272
  MAGN => 'Magnetometer', #1 (gpmd) (units of uT)
273
+ # MAPX (GPMF) - seen: 1 (fmt f)
274
+ # MAPY (GPMF) - seen: 1 (fmt f)
243
275
  # MFOV (GPMF-BACK/FRNT) - seen: 100 (fmt d, Max)
244
276
  MINF => { #PH (GPMF - seen: HERO6 Black, fmt c)
245
277
  Name => 'Model',
246
278
  Groups => { 2 => 'Camera' },
247
279
  Description => 'Camera Model Name',
248
280
  },
281
+ # MMOD (GPMF) - seen: 'STEREO' (fmt c)
249
282
  # MTYP (GPMF) - seen: 0,1,5,11 [1 for time-lapse video, 5 for 360 video, 11 for JPEG] (fmt B)
250
283
  # MUID (GPMF) - seen: 3882563431 2278071152 967805802 411471936 0 0 0 0 (fmt L)
284
+ # MXCF (GPMF) - seen: 'x1' (fmt c)
285
+ # MYCF (GPMF) - seen: 'y1' (fmt c)
286
+ # ORDP (GPMF) - seen: 'Y' (fmt c)
251
287
  OREN => { #PH (GPMF - seen: 'U', fmt c)
252
288
  Name => 'AutoRotation',
253
289
  PrintConv => {
@@ -258,11 +294,16 @@ my %addUnits = (
258
294
  },
259
295
  # (most of the "P" tags are ProTune settings - PH)
260
296
  PHDR => 'HDRSetting', #PH (APP6 - seen: 0)
297
+ # PIMD (GPMF) - seen: 'AUTO' (fmt c)
261
298
  PIMN => 'AutoISOMin', #PH (GPMF - seen: 100, fmt L)
262
299
  PIMX => 'AutoISOMax', #PH (GPMF - seen: 1600, fmt L)
300
+ # POLY (GPMF) - seen: '0 2.11120247840881 0.14325800538063 -1.030...' (fmt f)
263
301
  # PRAW (APP6) - seen: 0, 'N', 'Y' (fmt c)
302
+ # PRCN (GPMF) - seen: 65 zeros (fmt B)
264
303
  PRES => 'PhotoResolution', #PH (APP6 - seen: '12MP_W')
265
304
  # PRJT (APP6) - seen: 'GPRO','EACO' (fmt F, Hero8, Max)
305
+ # PRNA (GPMF) - seen 10 (fmt B)
306
+ # PRNU (GPMF) - seen 0 (fmt B)
266
307
  PRTN => { #PH (GPMF - seen: 'N', fmt c)
267
308
  Name => 'ProTune',
268
309
  PrintConv => {
@@ -275,6 +316,9 @@ my %addUnits = (
275
316
  PTSH => 'Sharpness', #PH (GPMF - seen: 'HIGH', fmt c)
276
317
  PTWB => 'WhiteBalance', #PH (GPMF - seen: 'AUTO', fmt c)
277
318
  # PVUL (APP6) - seen: 'F' (fmt c, Hero8, Max)
319
+ # PWPR (GPMF) - seen: 'PERFORMANCE' (fmt c)
320
+ # PYCF (GPMF) - seen: '[r0,r1,r2,r3,r4,r5,r6]' (fmt c)
321
+ # RAMP (GPMF) - seen: empty string (fmt c)
278
322
  RATE => 'Rate', #PH (GPMF - seen: '0_5SEC', fmt c; APP6 - seen: '4_1SEC')
279
323
  RMRK => { #2 (gpmd)
280
324
  Name => 'Comments',
@@ -284,6 +328,7 @@ my %addUnits = (
284
328
  Name => 'ScaleFactor',
285
329
  Unknown => 1,
286
330
  },
331
+ # SCAP (GPMF) - seen: 'N' (fmt c)
287
332
  SCPR => { #PH (Karma) [stream was empty]
288
333
  Name => 'ScaledPressure',
289
334
  # UNIT=s,Pa,Pa,degC
@@ -291,6 +336,7 @@ my %addUnits = (
291
336
  # SCAL=1000 0.00999999977648258 0.00999999977648258 100
292
337
  %addUnits,
293
338
  },
339
+ # SCTM (GPMF) - seen 0 (fmt L)
294
340
  # SFTR (GPMF-BACK/FRNT) - seen 0.999,1.00004 (fmt d, Max)
295
341
  # SHFX (GPMF-GEOC) - seen 22.92 (fmt d, Max)
296
342
  # SHFY (GPMF-GEOC) - seen 0.123 (fmt d, Max)
@@ -355,6 +401,10 @@ my %addUnits = (
355
401
  # TOCK => { Name => 'OutTime', Unknown => 1, ValueConv => '$val/1000' }, #1 (gpmd)
356
402
  TSMP => { Name => 'TotalSamples', Unknown => 1 }, #2 (gpmd)
357
403
  TYPE => { Name => 'StructureType', Unknown => 1 }, #2 (gpmd,GPMF - eg 'LLLllfFff', fmt c)
404
+ TZON => { # (GPMF) - seen: 60 (fmt s)
405
+ Name => 'TimeZone',
406
+ PrintConv => 'Image::ExifTool::TimeZoneString($val)',
407
+ },
358
408
  UNIT => { #2 (gpmd) alternative units
359
409
  Name => 'Units',
360
410
  Unknown => 1,
@@ -373,6 +423,7 @@ my %addUnits = (
373
423
  },
374
424
  },
375
425
  # VLTA (GPMF) - seen: 78 ('N') (fmt B -- wrong format?)
426
+ VFPS => { Name => 'VideoFrameRate', PrintConv => '$val=~s( )(/);$val' }, #PH (GPMF, fmt L)
376
427
  VFRH => { #PH (Karma)
377
428
  Name => 'VisualFlightRulesHUD',
378
429
  BinaryData => 1,
@@ -380,13 +431,17 @@ my %addUnits = (
380
431
  # TYPE=ffffsS
381
432
  },
382
433
  # VLTE (GPMF) - seen: 'Y','N' (fmt c)
434
+ VRES => { Name => 'VideoFrameSize', PrintConv => '$val=~s/ /x/;$val' }, #PH (GPMF, fmt L)
383
435
  WBAL => 'ColorTemperatures', #PH (gpmd)
384
436
  WRGB => { #PH (gpmd)
385
437
  Name => 'WhiteBalanceRGB',
386
438
  Binary => 1,
387
439
  },
388
440
  # ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max)
389
- # the following ref forum12825
441
+ # ZMPL (GPMF) - seen: 0.652929663658142 (fmt f)
442
+ #
443
+ # the following ref forum12825
444
+ #
390
445
  MUID => {
391
446
  Name => 'MediaUniqueID',
392
447
  PrintConv => q{
@@ -418,7 +473,7 @@ my %addUnits = (
418
473
  YAVG => 'LumaAverage',
419
474
  );
420
475
 
421
- # GoPro GPS5 tags (ref 2) (Hero5,Hero6)
476
+ # GoPro GPS5 tags (ref 2) (Hero5,Hero6,Hero9)
422
477
  %Image::ExifTool::GoPro::GPS5 = (
423
478
  PROCESS_PROC => \&ProcessString,
424
479
  GROUPS => { 1 => 'GoPro', 2 => 'Location' },
@@ -435,8 +490,65 @@ my %addUnits = (
435
490
  Name => 'GPSAltitude',
436
491
  PrintConv => '"$val m"',
437
492
  },
438
- 3 => 'GPSSpeed', # (unit='m/s')
439
- 4 => 'GPSSpeed3D', # (unit='m/s')
493
+ 3 => {
494
+ Name => 'GPSSpeed',
495
+ Notes => 'stored as m/s but converted to km/h when extracted',
496
+ ValueConv => '$val * 3.6',
497
+ },
498
+ 4 => {
499
+ Name => 'GPSSpeed3D',
500
+ Notes => 'stored as m/s but converted to km/h when extracted',
501
+ ValueConv => '$val * 3.6',
502
+ },
503
+ );
504
+
505
+ # GoPro GPS9 tags (Hero13)
506
+ %Image::ExifTool::GoPro::GPS9 = (
507
+ PROCESS_PROC => \&ProcessString,
508
+ GROUPS => { 1 => 'GoPro', 2 => 'Location' },
509
+ VARS => { HEX_ID => 0, ID_LABEL => 'Index' },
510
+ 0 => { # (unit='deg')
511
+ Name => 'GPSLatitude',
512
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
513
+ },
514
+ 1 => { # (unit='deg')
515
+ Name => 'GPSLongitude',
516
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
517
+ },
518
+ 2 => { # (unit='m')
519
+ Name => 'GPSAltitude',
520
+ PrintConv => '"$val m"',
521
+ },
522
+ 3 => {
523
+ Name => 'GPSSpeed',
524
+ Notes => 'stored as m/s but converted to km/h when extracted',
525
+ ValueConv => '$val * 3.6',
526
+ },
527
+ 4 => {
528
+ Name => 'GPSSpeed3D',
529
+ Notes => 'stored as m/s but converted to km/h when extracted',
530
+ ValueConv => '$val * 3.6',
531
+ },
532
+ 5 => { # days since 2000
533
+ Name => 'GPSDays',
534
+ RawConv => '$$self{GPSDays} = $val; undef',
535
+ Hidden => 1,
536
+ },
537
+ 6 => { # seconds of date/time
538
+ Name => 'GPSDateTime',
539
+ Groups => { 2 => 'Time' },
540
+ # (10957 days from Jan 1 1970 to Jan 1 2000)
541
+ RawConv => 'ConvertUnixTime(($$self{GPSDays} + 10957) * 24 * 3600 + $val, undef, 3)',
542
+ PrintConv => '$self->ConvertDateTime($val)',
543
+ },
544
+ 7 => 'GPSDOP',
545
+ 8 => {
546
+ Name => 'GPSMeasureMode', #PH (NC)
547
+ PrintConv => {
548
+ 2 => '2-Dimensional Measurement',
549
+ 3 => '3-Dimensional Measurement',
550
+ },
551
+ },
440
552
  );
441
553
 
442
554
  # GoPro GPRI tags (ref PH) (Karma)
@@ -604,7 +716,7 @@ sub ScaleValues($$)
604
716
  sub AddUnits($$$)
605
717
  {
606
718
  my ($et, $val, $tag) = @_;
607
- if ($et and $$et{TAG_EXTRA}{$tag} and $$et{TAG_EXTRA}{$tag}{Units}) {
719
+ if ($et and $$et{TAG_EXTRA}{$tag}{Units}) {
608
720
  my $u = $$et{TAG_EXTRA}{$tag}{Units};
609
721
  $u = [ $u ] unless ref $u eq 'ARRAY';
610
722
  my @a = split ' ', $val;
@@ -748,7 +860,7 @@ metadata from GoPro MP4 videos.
748
860
 
749
861
  =head1 AUTHOR
750
862
 
751
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
863
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
752
864
 
753
865
  This library is free software; you can redistribute it and/or modify it
754
866
  under the same terms as Perl itself.
@@ -1123,7 +1123,7 @@ information from H.264 video streams.
1123
1123
 
1124
1124
  =head1 AUTHOR
1125
1125
 
1126
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1126
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1127
1127
 
1128
1128
  This library is free software; you can redistribute it and/or modify it
1129
1129
  under the same terms as Perl itself.
@@ -225,7 +225,7 @@ sub ProcessHP($$$)
225
225
  # scan for other tag ID's
226
226
  foreach $tagID (sort(TagTableKeys($tagTablePtr))) {
227
227
  next if $tagID eq 'PreviewImage';
228
- next unless $$dataPt =~ /$tagID:\s*([\x20-\x7f]+)/i;
228
+ next unless $$dataPt =~ /$tagID:\s*([\x20-\x7e]+)/i;
229
229
  $et->HandleTag($tagTablePtr, $tagID, $1);
230
230
  }
231
231
  return 1;
@@ -250,7 +250,7 @@ Hewlett-Packard maker notes.
250
250
 
251
251
  =head1 AUTHOR
252
252
 
253
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
253
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
254
254
 
255
255
  This library is free software; you can redistribute it and/or modify it
256
256
  under the same terms as Perl itself.
@@ -555,7 +555,7 @@ meta information from HTML documents.
555
555
 
556
556
  =head1 AUTHOR
557
557
 
558
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
558
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
559
559
 
560
560
  This library is free software; you can redistribute it and/or modify it
561
561
  under the same terms as Perl itself.
@@ -920,7 +920,7 @@ page.
920
920
 
921
921
  =head1 AUTHOR
922
922
 
923
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
923
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
924
924
 
925
925
  This library is free software; you can redistribute it and/or modify it
926
926
  under the same terms as Perl itself.
@@ -12,6 +12,7 @@
12
12
  # 5) http://www.color.org/icc_specs2.xalter (approved revisions, 2010-07-16)
13
13
  # 6) Eef Vreeland private communication
14
14
  # 7) https://color.org/specification/ICC.2-2019.pdf
15
+ # 8) https://www.color.org/specification/ICC.1-2022-05.pdf
15
16
  #
16
17
  # Notes: The ICC profile information is different: the format of each
17
18
  # tag is embedded in the information instead of in the directory
@@ -25,7 +26,7 @@ use strict;
25
26
  use vars qw($VERSION);
26
27
  use Image::ExifTool qw(:DataAccess :Utils);
27
28
 
28
- $VERSION = '1.40';
29
+ $VERSION = '1.41';
29
30
 
30
31
  sub ProcessICC($$);
31
32
  sub ProcessICC_Profile($$$);
@@ -367,6 +368,7 @@ my %manuSig = ( #6
367
368
  Groups => { 2 => 'Time' },
368
369
  PrintConv => '$self->ConvertDateTime($val)',
369
370
  },
371
+
370
372
  targ => {
371
373
  Name => 'CharTarget',
372
374
  ValueConv => '$val=~s/\0.*//; length $val > 128 ? \$val : $val',
@@ -493,6 +495,10 @@ my %manuSig = ( #6
493
495
  },
494
496
  },
495
497
  ciis => 'ColorimetricIntentImageState', #5
498
+ cicp => { #8 (Coding-independent Code Points)
499
+ Name => 'ColorRepresentation',
500
+ SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::ColorRep' },
501
+ },
496
502
  scoe => 'SceneColorimetryEstimates', #5
497
503
  sape => 'SceneAppearanceEstimates', #5
498
504
  fpce => 'FocalPlaneColorimetryEstimates', #5
@@ -628,6 +634,7 @@ my %manuSig = ( #6
628
634
  s2cp => 'StandardToCustomPcc',
629
635
  smap => 'SurfaceMap',
630
636
  # smwp ? (seen in some v5 samples [was a mistake in sample production])
637
+ hdgm => { Name => 'HDGainMapInfo', Binary => 1 }, #PH
631
638
 
632
639
  # the following entry represents the ICC profile header, and doesn't
633
640
  # exist as a tag in the directory. It is only in this table to provide
@@ -747,6 +754,78 @@ my %manuSig = ( #6
747
754
  },
748
755
  );
749
756
 
757
+ # Coding-independent code points (cicp) definition
758
+ # (NOTE: conversions are the same as Image::ExifTool::QuickTime::ColorRep tags)
759
+ %Image::ExifTool::ICC_Profile::ColorRep = (
760
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
761
+ GROUPS => { 0 => 'ICC_Profile', 1 => 'ICC-cicp', 2 => 'Image' },
762
+ 8 => {
763
+ Name => 'ColorPrimaries',
764
+ PrintConv => {
765
+ 1 => 'BT.709',
766
+ 2 => 'Unspecified',
767
+ 4 => 'BT.470 System M (historical)',
768
+ 5 => 'BT.470 System B, G (historical)',
769
+ 6 => 'BT.601',
770
+ 7 => 'SMPTE 240',
771
+ 8 => 'Generic film (color filters using illuminant C)',
772
+ 9 => 'BT.2020, BT.2100',
773
+ 10 => 'SMPTE 428 (CIE 1931 XYZ)', #forum14766
774
+ 11 => 'SMPTE RP 431-2',
775
+ 12 => 'SMPTE EG 432-1',
776
+ 22 => 'EBU Tech. 3213-E',
777
+ },
778
+ },
779
+ 9 => {
780
+ Name => 'TransferCharacteristics',
781
+ PrintConv => {
782
+ 0 => 'For future use (0)',
783
+ 1 => 'BT.709',
784
+ 2 => 'Unspecified',
785
+ 3 => 'For future use (3)',
786
+ 4 => 'BT.470 System M (historical)', # Gamma 2.2? (ref forum14960)
787
+ 5 => 'BT.470 System B, G (historical)', # Gamma 2.8? (ref forum14960)
788
+ 6 => 'BT.601',
789
+ 7 => 'SMPTE 240 M',
790
+ 8 => 'Linear',
791
+ 9 => 'Logarithmic (100 : 1 range)',
792
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
793
+ 11 => 'IEC 61966-2-4',
794
+ 12 => 'BT.1361',
795
+ 13 => 'sRGB or sYCC',
796
+ 14 => 'BT.2020 10-bit systems',
797
+ 15 => 'BT.2020 12-bit systems',
798
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
799
+ 17 => 'SMPTE ST 428',
800
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
801
+ },
802
+ },
803
+ 10 => {
804
+ Name => 'MatrixCoefficients',
805
+ PrintConv => {
806
+ 0 => 'Identity matrix',
807
+ 1 => 'BT.709',
808
+ 2 => 'Unspecified',
809
+ 3 => 'For future use (3)',
810
+ 4 => 'US FCC 73.628',
811
+ 5 => 'BT.470 System B, G (historical)',
812
+ 6 => 'BT.601',
813
+ 7 => 'SMPTE 240 M',
814
+ 8 => 'YCgCo',
815
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
816
+ 10 => 'BT.2020 constant luminance',
817
+ 11 => 'SMPTE ST 2085 YDzDx',
818
+ 12 => 'Chromaticity-derived non-constant luminance',
819
+ 13 => 'Chromaticity-derived constant luminance',
820
+ 14 => 'BT.2100 ICtCp',
821
+ },
822
+ },
823
+ 11 => {
824
+ Name => 'VideoFullRangeFlag',
825
+ PrintConv => { 0 => 'Limited', 1 => 'Full' },
826
+ },
827
+ );
828
+
750
829
  # viewingConditionsType (view) definition
751
830
  %Image::ExifTool::ICC_Profile::ViewingConditions = (
752
831
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -1357,7 +1436,7 @@ data created on one device into another device's native color space.
1357
1436
 
1358
1437
  =head1 AUTHOR
1359
1438
 
1360
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
1439
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
1361
1440
 
1362
1441
  This library is free software; you can redistribute it and/or modify it
1363
1442
  under the same terms as Perl itself.
@@ -121,7 +121,7 @@ information from Windows ICO (icon) and CUR (cursor) files.
121
121
 
122
122
  =head1 AUTHOR
123
123
 
124
- Copyright 2003-2024, Phil Harvey (philharvey66 at gmail.com)
124
+ Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
125
125
 
126
126
  This library is free software; you can redistribute it and/or modify it
127
127
  under the same terms as Perl itself.