exiftool_vendored 10.65.0 → 11.41.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +818 -19
  3. data/bin/MANIFEST +38 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +48 -44
  7. data/bin/arg_files/exif2xmp.args +4 -1
  8. data/bin/arg_files/gps2xmp.args +4 -1
  9. data/bin/arg_files/iptcCore.args +8 -0
  10. data/bin/arg_files/xmp2exif.args +4 -1
  11. data/bin/arg_files/xmp2gps.args +4 -1
  12. data/bin/config_files/dji.config +131 -0
  13. data/bin/config_files/example.config +6 -2
  14. data/bin/config_files/gps2utm.config +256 -256
  15. data/bin/config_files/nksc.config +146 -0
  16. data/bin/config_files/picasa_faces.config +382 -382
  17. data/bin/exiftool +688 -408
  18. data/bin/fmt_files/gpx.fmt +10 -6
  19. data/bin/fmt_files/gpx_wpt.fmt +10 -6
  20. data/bin/fmt_files/kml.fmt +8 -5
  21. data/bin/lib/File/RandomAccess.pm +48 -8
  22. data/bin/lib/File/RandomAccess.pod +21 -2
  23. data/bin/lib/Image/ExifTool.pm +645 -256
  24. data/bin/lib/Image/ExifTool.pod +219 -164
  25. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  26. data/bin/lib/Image/ExifTool/AFCP.pm +3 -8
  27. data/bin/lib/Image/ExifTool/AIFF.pm +12 -4
  28. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  29. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  30. data/bin/lib/Image/ExifTool/ASF.pm +19 -6
  31. data/bin/lib/Image/ExifTool/Apple.pm +13 -5
  32. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  33. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  34. data/bin/lib/Image/ExifTool/BPG.pm +17 -15
  35. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  36. data/bin/lib/Image/ExifTool/BigTIFF.pm +30 -15
  37. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +103 -52
  38. data/bin/lib/Image/ExifTool/Canon.pm +684 -112
  39. data/bin/lib/Image/ExifTool/CanonCustom.pm +119 -9
  40. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  41. data/bin/lib/Image/ExifTool/CanonVRD.pm +13 -26
  42. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  43. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  44. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  45. data/bin/lib/Image/ExifTool/DICOM.pm +12 -5
  46. data/bin/lib/Image/ExifTool/DJI.pm +51 -3
  47. data/bin/lib/Image/ExifTool/DNG.pm +15 -8
  48. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  49. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  50. data/bin/lib/Image/ExifTool/DarwinCore.pm +63 -23
  51. data/bin/lib/Image/ExifTool/DjVu.pm +4 -2
  52. data/bin/lib/Image/ExifTool/EXE.pm +30 -6
  53. data/bin/lib/Image/ExifTool/Exif.pm +351 -109
  54. data/bin/lib/Image/ExifTool/FITS.pm +148 -0
  55. data/bin/lib/Image/ExifTool/FLAC.pm +2 -2
  56. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  57. data/bin/lib/Image/ExifTool/FLIR.pm +109 -13
  58. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  59. data/bin/lib/Image/ExifTool/Flash.pm +3 -3
  60. data/bin/lib/Image/ExifTool/FlashPix.pm +433 -9
  61. data/bin/lib/Image/ExifTool/Font.pm +2 -2
  62. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  63. data/bin/lib/Image/ExifTool/FujiFilm.pm +336 -16
  64. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  65. data/bin/lib/Image/ExifTool/GIF.pm +5 -7
  66. data/bin/lib/Image/ExifTool/GIMP.pm +39 -3
  67. data/bin/lib/Image/ExifTool/GPS.pm +48 -22
  68. data/bin/lib/Image/ExifTool/GeoTiff.pm +23 -23
  69. data/bin/lib/Image/ExifTool/Geotag.pm +80 -45
  70. data/bin/lib/Image/ExifTool/GoPro.pm +709 -0
  71. data/bin/lib/Image/ExifTool/H264.pm +40 -18
  72. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  73. data/bin/lib/Image/ExifTool/HTML.pm +19 -12
  74. data/bin/lib/Image/ExifTool/HtmlDump.pm +37 -26
  75. data/bin/lib/Image/ExifTool/ICC_Profile.pm +297 -23
  76. data/bin/lib/Image/ExifTool/ID3.pm +12 -7
  77. data/bin/lib/Image/ExifTool/IPTC.pm +48 -19
  78. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  79. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  80. data/bin/lib/Image/ExifTool/Import.pm +13 -9
  81. data/bin/lib/Image/ExifTool/InDesign.pm +3 -5
  82. data/bin/lib/Image/ExifTool/JPEG.pm +22 -11
  83. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  84. data/bin/lib/Image/ExifTool/JSON.pm +3 -3
  85. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
  87. data/bin/lib/Image/ExifTool/Kodak.pm +1233 -58
  88. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  89. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/de.pm +33 -24
  92. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +64 -2
  93. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +64 -2
  94. data/bin/lib/Image/ExifTool/Lang/es.pm +8 -4
  95. data/bin/lib/Image/ExifTool/Lang/fi.pm +46 -4
  96. data/bin/lib/Image/ExifTool/Lang/fr.pm +5 -3
  97. data/bin/lib/Image/ExifTool/Lang/it.pm +6 -3
  98. data/bin/lib/Image/ExifTool/Lang/ja.pm +15 -3
  99. data/bin/lib/Image/ExifTool/Lang/ko.pm +5 -2
  100. data/bin/lib/Image/ExifTool/Lang/nl.pm +6 -3
  101. data/bin/lib/Image/ExifTool/Lang/pl.pm +2 -2
  102. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  103. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  104. data/bin/lib/Image/ExifTool/Lang/tr.pm +4 -2
  105. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  106. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  107. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  108. data/bin/lib/Image/ExifTool/Lytro.pm +4 -8
  109. data/bin/lib/Image/ExifTool/M2TS.pm +10 -9
  110. data/bin/lib/Image/ExifTool/MIE.pm +12 -8
  111. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  112. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  113. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  114. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  115. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  116. data/bin/lib/Image/ExifTool/MPEG.pm +2 -3
  117. data/bin/lib/Image/ExifTool/MPF.pm +6 -6
  118. data/bin/lib/Image/ExifTool/MWG.pm +4 -4
  119. data/bin/lib/Image/ExifTool/MXF.pm +2 -2
  120. data/bin/lib/Image/ExifTool/MacOS.pm +184 -34
  121. data/bin/lib/Image/ExifTool/MakerNotes.pm +101 -18
  122. data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
  123. data/bin/lib/Image/ExifTool/Microsoft.pm +5 -3
  124. data/bin/lib/Image/ExifTool/Minolta.pm +89 -62
  125. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  126. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  127. data/bin/lib/Image/ExifTool/Nikon.pm +1511 -380
  128. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  129. data/bin/lib/Image/ExifTool/NikonCustom.pm +2758 -2935
  130. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  131. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  132. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  133. data/bin/lib/Image/ExifTool/Olympus.pm +47 -8
  134. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  135. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  136. data/bin/lib/Image/ExifTool/PCX.pm +138 -0
  137. data/bin/lib/Image/ExifTool/PDF.pm +58 -42
  138. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  139. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  140. data/bin/lib/Image/ExifTool/PLIST.pm +12 -5
  141. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PNG.pm +108 -10
  143. data/bin/lib/Image/ExifTool/PPM.pm +3 -3
  144. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  145. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Panasonic.pm +299 -31
  147. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +201 -19
  148. data/bin/lib/Image/ExifTool/Pentax.pm +164 -143
  149. data/bin/lib/Image/ExifTool/PhaseOne.pm +12 -5
  150. data/bin/lib/Image/ExifTool/PhotoCD.pm +9 -10
  151. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  152. data/bin/lib/Image/ExifTool/Photoshop.pm +230 -60
  153. data/bin/lib/Image/ExifTool/PostScript.pm +29 -4
  154. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  155. data/bin/lib/Image/ExifTool/Qualcomm.pm +2 -2
  156. data/bin/lib/Image/ExifTool/QuickTime.pm +1539 -279
  157. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1857 -0
  158. data/bin/lib/Image/ExifTool/README +84 -46
  159. data/bin/lib/Image/ExifTool/RIFF.pm +116 -23
  160. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  161. data/bin/lib/Image/ExifTool/RTF.pm +6 -4
  162. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  163. data/bin/lib/Image/ExifTool/Rawzor.pm +3 -2
  164. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Reconyx.pm +261 -7
  166. data/bin/lib/Image/ExifTool/Red.pm +325 -0
  167. data/bin/lib/Image/ExifTool/Ricoh.pm +3 -7
  168. data/bin/lib/Image/ExifTool/Samsung.pm +95 -25
  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 +26 -12
  172. data/bin/lib/Image/ExifTool/Shortcuts.pm +9 -2
  173. data/bin/lib/Image/ExifTool/Sigma.pm +36 -30
  174. data/bin/lib/Image/ExifTool/SigmaRaw.pm +3 -8
  175. data/bin/lib/Image/ExifTool/Sony.pm +531 -177
  176. data/bin/lib/Image/ExifTool/SonyIDC.pm +63 -3
  177. data/bin/lib/Image/ExifTool/Stim.pm +2 -2
  178. data/bin/lib/Image/ExifTool/TagInfoXML.pm +23 -23
  179. data/bin/lib/Image/ExifTool/TagLookup.pm +6352 -5062
  180. data/bin/lib/Image/ExifTool/TagNames.pod +3024 -565
  181. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  182. data/bin/lib/Image/ExifTool/Torrent.pm +2 -2
  183. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  184. data/bin/lib/Image/ExifTool/VCard.pm +47 -9
  185. data/bin/lib/Image/ExifTool/Validate.pm +391 -99
  186. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  187. data/bin/lib/Image/ExifTool/WTV.pm +319 -0
  188. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  189. data/bin/lib/Image/ExifTool/WriteExif.pl +91 -18
  190. data/bin/lib/Image/ExifTool/WriteIPTC.pl +6 -6
  191. data/bin/lib/Image/ExifTool/WritePDF.pl +13 -12
  192. data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  193. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  194. data/bin/lib/Image/ExifTool/WritePostScript.pl +2 -2
  195. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +764 -121
  196. data/bin/lib/Image/ExifTool/WriteXMP.pl +176 -67
  197. data/bin/lib/Image/ExifTool/Writer.pl +490 -246
  198. data/bin/lib/Image/ExifTool/XMP.pm +216 -76
  199. data/bin/lib/Image/ExifTool/XMP2.pl +54 -10
  200. data/bin/lib/Image/ExifTool/XMPStruct.pl +14 -11
  201. data/bin/lib/Image/ExifTool/ZIP.pm +60 -15
  202. data/bin/lib/Image/ExifTool/iWork.pm +12 -5
  203. data/bin/perl-Image-ExifTool.spec +46 -44
  204. data/lib/exiftool_vendored/version.rb +1 -1
  205. metadata +14 -4
@@ -119,7 +119,7 @@ information from Progressive Graphics File (PGF) images.
119
119
 
120
120
  =head1 AUTHOR
121
121
 
122
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
122
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
123
123
 
124
124
  This library is free software; you can redistribute it and/or modify it
125
125
  under the same terms as Perl itself.
@@ -1236,7 +1236,7 @@ Verbose or the Unknown option.
1236
1236
 
1237
1237
  =head1 AUTHOR
1238
1238
 
1239
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
1239
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
1240
1240
 
1241
1241
  This library is free software; you can redistribute it and/or modify it
1242
1242
  under the same terms as Perl itself.
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::XMP;
22
22
  use Image::ExifTool::GPS;
23
23
 
24
- $VERSION = '1.07';
24
+ $VERSION = '1.09';
25
25
 
26
26
  sub ExtractObject($$;$);
27
27
  sub Get24u($$);
@@ -37,6 +37,11 @@ my %readProc = (
37
37
  0x108 => \&GetDouble,
38
38
  );
39
39
 
40
+ # recognize different types of PLIST files based on certain tags
41
+ my %plistType = (
42
+ adjustmentBaseVersion => 'AAE',
43
+ );
44
+
40
45
  # PLIST tags (generated on-the-fly for most tags)
41
46
  %Image::ExifTool::PLIST::Main = (
42
47
  PROCESS_PROC => \&ProcessPLIST,
@@ -173,6 +178,8 @@ sub FoundTag($$$$;$)
173
178
  delete $$et{LIST_TAGS}{$$et{LastPListTag}};
174
179
  }
175
180
  $$et{LastPListTag} = $tagInfo;
181
+ # override file type if applicable
182
+ $et->OverrideFileType($plistType{$tag}) if $plistType{$tag} and $$et{FILE_TYPE} eq 'XMP';
176
183
  # save the tag
177
184
  $et->HandleTag($tagTablePtr, $tag, $val);
178
185
 
@@ -323,12 +330,12 @@ sub ProcessBinaryPLIST($$$)
323
330
  {
324
331
  my ($et, $dirInfo, $tagTablePtr) = @_;
325
332
  my ($i, $buff, @table);
333
+ my $dataPt = $$dirInfo{DataPt};
326
334
 
327
335
  $et->VerboseDir('Binary PLIST');
328
336
  SetByteOrder('MM');
329
337
 
330
- unless ($$dirInfo{RAF}) {
331
- my $dataPt = $$dirInfo{DataPt};
338
+ if ($dataPt) {
332
339
  my $start = $$dirInfo{DirStart};
333
340
  if ($start or ($$dirInfo{DirLen} and $$dirInfo{DirLen} != length $$dataPt)) {
334
341
  my $buf2 = substr($$dataPt, $start || 0, $$dirInfo{DirLen});
@@ -339,7 +346,7 @@ sub ProcessBinaryPLIST($$$)
339
346
  my $strt = $$dirInfo{DirStart} || 0;
340
347
  }
341
348
  # read and parse the trailer
342
- my $raf = $$dirInfo{RAF};
349
+ my $raf = $$dirInfo{RAF} or return 0;
343
350
  $raf->Seek(-32,2) and $raf->Read($buff,32)==32 or return 0;
344
351
  my $intSize = Get8u(\$buff, 6);
345
352
  my $refSize = Get8u(\$buff, 7);
@@ -431,7 +438,7 @@ This module decodes both the binary and XML-based PLIST format.
431
438
 
432
439
  =head1 AUTHOR
433
440
 
434
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
441
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
435
442
 
436
443
  This library is free software; you can redistribute it and/or modify it
437
444
  under the same terms as Perl itself.
@@ -2586,7 +2586,7 @@ Definitions for PLUS (Picture Licensing Universal System) tags.
2586
2586
 
2587
2587
  =head1 AUTHOR
2588
2588
 
2589
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
2589
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
2590
2590
 
2591
2591
  This library is free software; you can redistribute it and/or modify it
2592
2592
  under the same terms as Perl itself.
@@ -12,6 +12,7 @@
12
12
  # 3) http://www.libpng.org/pub/mng/
13
13
  # 4) http://www.libpng.org/pub/png/spec/register/
14
14
  # 5) ftp://ftp.simplesystems.org/pub/png/documents/pngext-1.4.0-pdg.html
15
+ # 6) ftp://ftp.simplesystems.org/pub/png/documents/pngext-1.5.0.html
15
16
  #
16
17
  # Notes: Writing meta information in PNG images is a pain in the butt
17
18
  # for a number of reasons: One biggie is that you have to
@@ -26,7 +27,7 @@ use strict;
26
27
  use vars qw($VERSION $AUTOLOAD %stdCase);
27
28
  use Image::ExifTool qw(:DataAccess :Utils);
28
29
 
29
- $VERSION = '1.44';
30
+ $VERSION = '1.47';
30
31
 
31
32
  sub ProcessPNG_tEXt($$$);
32
33
  sub ProcessPNG_iTXt($$$);
@@ -39,6 +40,8 @@ sub Add_iCCP($$);
39
40
  sub DoneDir($$$;$);
40
41
  sub GetLangInfo($$);
41
42
  sub BuildTextChunk($$$$$);
43
+ sub ConvertPNGDate($$);
44
+ sub InversePNGDate($$);
42
45
 
43
46
  # translate lower-case to actual case used for eXIf/zXIf chunks
44
47
  %stdCase = ( 'zxif' => 'zxIf', exif => 'eXIf' );
@@ -234,7 +237,7 @@ $Image::ExifTool::PNG::colorType = -1;
234
237
  tXMP => {
235
238
  Name => 'XMP',
236
239
  Notes => 'obsolete location specified by a September 2001 XMP draft',
237
- NonStandard => 1,
240
+ NonStandard => 'XMP',
238
241
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
239
242
  },
240
243
  vpAg => { # private imagemagick chunk
@@ -255,7 +258,7 @@ $Image::ExifTool::PNG::colorType = -1;
255
258
  TagTable => 'Image::ExifTool::PNG::AnimationControl',
256
259
  },
257
260
  },
258
- # eXIf
261
+ # eXIf (ref 6)
259
262
  $stdCase{exif} => {
260
263
  Name => $stdCase{exif},
261
264
  Notes => 'this is where ExifTool will create new EXIF',
@@ -269,6 +272,7 @@ $Image::ExifTool::PNG::colorType = -1;
269
272
  $stdCase{zxif} => {
270
273
  Name => $stdCase{zxif},
271
274
  Notes => 'a once-proposed chunk for compressed EXIF',
275
+ NonStandard => 'EXIF',
272
276
  SubDirectory => {
273
277
  TagTable => 'Image::ExifTool::Exif::Main',
274
278
  DirName => 'EXIF', # (to write as a block)
@@ -447,6 +451,11 @@ my %unreg = ( Notes => 'unregistered' );
447
451
  Name => 'CreationTime',
448
452
  Groups => { 2 => 'Time' },
449
453
  Shift => 'Time',
454
+ Notes => 'stored in RFC-1123 format and converted to/from EXIF format by ExifTool',
455
+ RawConv => \&ConvertPNGDate,
456
+ ValueConvInv => \&InversePNGDate,
457
+ PrintConv => '$self->ConvertDateTime($val)',
458
+ PrintConvInv => '$self->InverseDateTime($val,undef,1)',
450
459
  },
451
460
  Software => { },
452
461
  Disclaimer => { },
@@ -503,7 +512,7 @@ my %unreg = ( Notes => 'unregistered' );
503
512
  # (No condition because this is just for BuildTagLookup)
504
513
  Name => 'APP1_Profile',
505
514
  %unreg,
506
- NonStandard => 1,
515
+ NonStandard => 'EXIF',
507
516
  SubDirectory => {
508
517
  TagTable => 'Image::ExifTool::Exif::Main',
509
518
  ProcessProc => \&ProcessProfile,
@@ -511,7 +520,7 @@ my %unreg = ( Notes => 'unregistered' );
511
520
  },
512
521
  {
513
522
  Name => 'APP1_Profile',
514
- NonStandard => 1,
523
+ NonStandard => 'XMP',
515
524
  SubDirectory => {
516
525
  TagTable => 'Image::ExifTool::XMP::Main',
517
526
  ProcessProc => \&ProcessProfile,
@@ -521,7 +530,7 @@ my %unreg = ( Notes => 'unregistered' );
521
530
  'Raw profile type exif' => {
522
531
  Name => 'EXIF_Profile',
523
532
  %unreg,
524
- NonStandard => 1,
533
+ NonStandard => 'EXIF',
525
534
  SubDirectory => {
526
535
  TagTable => 'Image::ExifTool::Exif::Main',
527
536
  ProcessProc => \&ProcessProfile,
@@ -557,7 +566,7 @@ my %unreg = ( Notes => 'unregistered' );
557
566
  'Raw profile type xmp' => {
558
567
  Name => 'XMP_Profile',
559
568
  %unreg,
560
- NonStandard => 1,
569
+ NonStandard => 'XMP',
561
570
  SubDirectory => {
562
571
  TagTable => 'Image::ExifTool::XMP::Main',
563
572
  ProcessProc => \&ProcessProfile,
@@ -612,6 +621,88 @@ sub StandardLangCase($)
612
621
  return lc($lang);
613
622
  }
614
623
 
624
+ #------------------------------------------------------------------------------
625
+ # Convert date from PNG to EXIF format
626
+ # Inputs: 0) Date/time in PNG format, 1) ExifTool ref
627
+ # Returns: EXIF formatted date/time string
628
+ my %monthNum = (
629
+ Jan=>1, Feb=>2, Mar=>3, Apr=>4, May=>5, Jun=>6,
630
+ Jul=>7, Aug=>8, Sep=>9, Oct=>10,Nov=>11,Dec=>12
631
+ );
632
+ my %tzConv = (
633
+ UT => '+00:00', GMT => '+00:00', UTC => '+00:00', # (UTC not in spec -- PH addition)
634
+ EST => '-05:00', EDT => '-04:00',
635
+ CST => '-06:00', CDT => '-05:00',
636
+ MST => '-07:00', MDT => '-06:00',
637
+ PST => '-08:00', PDT => '-07:00',
638
+ A => '-01:00', N => '+01:00',
639
+ B => '-02:00', O => '+02:00',
640
+ C => '-03:00', P => '+03:00',
641
+ D => '-04:00', Q => '+04:00',
642
+ E => '-05:00', R => '+05:00',
643
+ F => '-06:00', S => '+06:00',
644
+ G => '-07:00', T => '+07:00',
645
+ H => '-08:00', U => '+08:00',
646
+ I => '-09:00', V => '+09:00',
647
+ K => '-10:00', W => '+10:00',
648
+ L => '-11:00', X => '+11:00',
649
+ M => '-12:00', Y => '+12:00',
650
+ Z => '+00:00',
651
+ );
652
+ sub ConvertPNGDate($$)
653
+ {
654
+ my ($val, $et) = @_;
655
+ # standard format is like "Mon, 1 Jan 2018 12:10:22 EST" (RFC-1123 section 5.2.14)
656
+ while ($val =~ /(\d+)\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s*(\d+)\s+(\d+):(\d{2})(:\d{2})?\s*(\S*)/i) {
657
+ my ($day,$mon,$yr,$hr,$min,$sec,$tz) = ($1,$2,$3,$4,$5,$6,$7);
658
+ $yr += $yr > 70 ? 1900 : 2000 if $yr < 100; # boost year to 4 digits if necessary
659
+ $mon = $monthNum{ucfirst lc $mon} or return $val;
660
+ if (not $tz) {
661
+ $tz = '';
662
+ } elsif ($tzConv{uc $tz}) {
663
+ $tz = $tzConv{uc $tz};
664
+ } elsif ($tz =~ /^([-+]\d+):?(\d{2})/) {
665
+ $tz = $1 . ':' . $2;
666
+ } else {
667
+ last; # (non-standard date)
668
+ }
669
+ return sprintf("%.4d:%.2d:%.2d %.2d:%.2d%s%s",$yr,$mon,$day,$hr,$min,$sec||':00',$tz);
670
+ }
671
+ if (($et->Options('StrictDate') and not $$et{TAGS_FROM_FILE}) or $et->Options('Validate')) {
672
+ $et->Warn('Non standard PNG date/time format', 1);
673
+ }
674
+ return $val;
675
+ }
676
+
677
+ #------------------------------------------------------------------------------
678
+ # Convert EXIF date/time to PNG format
679
+ # Inputs: 0) Date/time in EXIF format, 1) ExifTool ref
680
+ # Returns: PNG formatted date/time string
681
+ sub InversePNGDate($$)
682
+ {
683
+ my ($val, $et) = @_;
684
+ if ($et->Options('StrictDate')) {
685
+ my $err;
686
+ if ($val =~ /^(\d{4}):(\d{2}):(\d{2}) (\d{2})(:\d{2})(:\d{2})?(?:\.\d*)?\s*(\S*)/) {
687
+ my ($yr,$mon,$day,$hr,$min,$sec,$tz) = ($1,$2,$3,$4,$5,$6,$7);
688
+ $sec or $sec = '';
689
+ my %monName = map { $monthNum{$_} => $_ } keys %monthNum;
690
+ $mon = $monName{$mon + 0} or $err = 1;
691
+ if (length $tz) {
692
+ $tz =~ /^(Z|[-+]\d{2}:?\d{2})/ or $err = 1;
693
+ $tz =~ tr/://d;
694
+ $tz = ' ' . $tz;
695
+ }
696
+ $val = "$day $mon $yr $hr$min$sec$tz" unless $err;
697
+ }
698
+ if ($err) {
699
+ warn "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])\n";
700
+ undef $val;
701
+ }
702
+ }
703
+ return $val;
704
+ }
705
+
615
706
  #------------------------------------------------------------------------------
616
707
  # Get localized version of tagInfo hash
617
708
  # Inputs: 0) tagInfo hash ref, 1) language code (eg. "x-default")
@@ -639,7 +730,7 @@ sub FoundPNG($$$$;$$$$)
639
730
  my ($et, $tagTablePtr, $tag, $val, $compressed, $outBuff, $enc, $lang) = @_;
640
731
  return 0 unless defined $val;
641
732
  my $verbose = $et->Options('Verbose');
642
- my $id = $tag; # generate tag ID which include language code
733
+ my $id = $tag; # generate tag ID which includes language code
643
734
  if ($lang) {
644
735
  # case of language code must be normalized since they are case insensitive
645
736
  $lang = StandardLangCase($lang);
@@ -700,6 +791,9 @@ sub FoundPNG($$$$;$$$$)
700
791
  my $tagName = $$tagInfo{Name};
701
792
  my $processed;
702
793
  if ($$tagInfo{SubDirectory}) {
794
+ if ($$et{OPTIONS}{Validate} and $$tagInfo{NonStandard}) {
795
+ $et->Warn("Non-standard $$tagInfo{NonStandard} in PNG $tag chunk", 1);
796
+ }
703
797
  my $subdir = $$tagInfo{SubDirectory};
704
798
  my $dirName = $$subdir{DirName} || $tagName;
705
799
  if (not $compressed) {
@@ -998,7 +1092,7 @@ sub ProcessProfile($$$)
998
1092
  } else {
999
1093
  my $profName = $profileType;
1000
1094
  $profName =~ tr/\x00-\x1f\x7f-\xff/./;
1001
- $et->Warn("Unknown raw profile '$profName'");
1095
+ $et->Warn("Unknown raw profile '${profName}'");
1002
1096
  }
1003
1097
  if ($outBuff and defined $$outBuff and length $$outBuff) {
1004
1098
  if ($$et{CHANGED} != $oldChanged) {
@@ -1145,6 +1239,8 @@ sub ProcessPNG($$)
1145
1239
  # check to be sure this is a valid PNG/MNG/JNG image
1146
1240
  return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig};
1147
1241
 
1242
+ $$raf{NoBuffer} = 1 if $et->Options('FastScan'); # disable buffering in FastScan mode
1243
+
1148
1244
  my $earlyXMP = $et->Options('PNGEarlyXMP');
1149
1245
  if ($outfile) {
1150
1246
  delete $$et{TextChunkType};
@@ -1163,6 +1259,8 @@ sub ProcessPNG($$)
1163
1259
  $et->InitWriteDirs(\%pngMap,'PNG');
1164
1260
  # write XMP before IDAT if we would delete it later anyway
1165
1261
  $earlyXMP = 1 if $$et{DEL_GROUP}{XMP};
1262
+ } elsif ($$et{OPTIONS}{Validate}) {
1263
+ $earlyXMP = 1; # warn about XMP after IDAT when validating
1166
1264
  }
1167
1265
  my ($fileType, $hdrChunk, $endChunk) = @{$pngLookup{$sig}};
1168
1266
  $et->SetFileType($fileType); # set the FileType tag
@@ -1346,7 +1444,7 @@ and JNG (JPEG Network Graphics) images.
1346
1444
 
1347
1445
  =head1 AUTHOR
1348
1446
 
1349
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
1447
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
1350
1448
 
1351
1449
  This library is free software; you can redistribute it and/or modify it
1352
1450
  under the same terms as Perl itself.
@@ -16,7 +16,7 @@ use strict;
16
16
  use vars qw($VERSION);
17
17
  use Image::ExifTool qw(:DataAccess :Utils);
18
18
 
19
- $VERSION = '1.08';
19
+ $VERSION = '1.09';
20
20
 
21
21
  #------------------------------------------------------------------------------
22
22
  # Read or write information in a PPM/PGM/PBM image
@@ -114,7 +114,7 @@ sub ProcessPPM($$)
114
114
  #
115
115
  if ($verbose > 2) {
116
116
  print $out "$type header ($len bytes):\n";
117
- HexDump(\$buff, $len, Out => $out);
117
+ $et->VerboseDump(\$buff, Len => $len);
118
118
  }
119
119
  my $tag;
120
120
  foreach $tag (qw{Comment ImageWidth ImageHeight MaxVal}) {
@@ -143,7 +143,7 @@ BitMap) images.
143
143
 
144
144
  =head1 AUTHOR
145
145
 
146
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
146
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
147
147
 
148
148
  This library is free software; you can redistribute it and/or modify it
149
149
  under the same terms as Perl itself.
@@ -284,7 +284,7 @@ information from Paint Shop Pro images.
284
284
 
285
285
  =head1 AUTHOR
286
286
 
287
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
287
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
288
288
 
289
289
  This library is free software; you can redistribute it and/or modify it
290
290
  under the same terms as Perl itself.
@@ -379,7 +379,7 @@ KF7 and KF8 books (AZW and AZW3).
379
379
 
380
380
  =head1 AUTHOR
381
381
 
382
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
382
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
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.
@@ -14,6 +14,7 @@
14
14
  # 9) http://forums.dpreview.com/forums/read.asp?forum=1033&message=22756430
15
15
  # 10) http://bretteville.com/pdfs/M8Metadata_v2.pdf
16
16
  # 11) http://www.digital-leica.com/lens_codes/index.html
17
+ # (now https://www.l-camera-forum.com/leica-news/leica-lens-codes/)
17
18
  # 12) Joerg - http://www.cpanforum.com/threads/11602 (LX3 firmware 2.0)
18
19
  # 13) Michael Byczkowski private communication (Leica M9)
19
20
  # 14) Carl Bretteville private communication (M9)
@@ -22,6 +23,8 @@
22
23
  # 17) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4922.0.html
23
24
  # 18) Thomas Modes private communication (G6)
24
25
  # 19) http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,5533.0.html
26
+ # 20) Bernd-Michael Kemper private communication (DMC-GX80/85)
27
+ # 21) Klaus Homeister forum post
25
28
  # JD) Jens Duttke private communication (TZ3,FZ30,FZ50)
26
29
  #------------------------------------------------------------------------------
27
30
 
@@ -32,7 +35,7 @@ use vars qw($VERSION %leicaLensTypes);
32
35
  use Image::ExifTool qw(:DataAccess :Utils);
33
36
  use Image::ExifTool::Exif;
34
37
 
35
- $VERSION = '1.92';
38
+ $VERSION = '2.04';
36
39
 
37
40
  sub ProcessLeicaLEIC($$$);
38
41
  sub WhiteBalanceConv($;$$);
@@ -77,6 +80,8 @@ sub WhiteBalanceConv($;$$);
77
80
  7 => 'Summicron-M 90mm f/2 (II)', # 11136/11137
78
81
  9 => 'Elmarit-M 135mm f/2.8 (I/II)', # 11829
79
82
  '9 0' => 'Apo-Telyt-M 135mm f/3.4', # 11889
83
+ 11 => 'Summaron-M 28mm f/5.6', # ? (ref IB)
84
+ 12 => 'Thambar-M 90mm f/2.2', # ? (ref IB)
80
85
  16 => 'Tri-Elmar-M 16-18-21mm f/4 ASPH.',# 11626
81
86
  '16 1' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 16mm)',
82
87
  '16 2' => 'Tri-Elmar-M 16-18-21mm f/4 ASPH. (at 18mm)',
@@ -120,6 +125,7 @@ sub WhiteBalanceConv($;$$);
120
125
  52 => 'Super-Elmar-M 18mm f/3.8 ASPH.', # ? (ref PH/11)
121
126
  '53 2' => 'Apo-Telyt-M 135mm f/3.4', #16
122
127
  '53 3' => 'Apo-Summicron-M 50mm f/2 (VI)', #LR
128
+ 58 => 'Noctilux-M 75mm f/1.25 ASPH.', # ? (ref IB)
123
129
  );
124
130
 
125
131
  # M9 frame selector bits for each lens
@@ -220,6 +226,7 @@ my %shootingMode = (
220
226
  55 => 'Handheld Night Shot', #PH (FZ47)
221
227
  57 => '3D', #PH (3D1)
222
228
  59 => 'Creative Control', #PH (FZ47)
229
+ 60 => 'Intelligent Auto Plus', #20
223
230
  62 => 'Panorama', #17
224
231
  63 => 'Glass Through', #17
225
232
  64 => 'HDR', #17
@@ -258,13 +265,14 @@ my %shootingMode = (
258
265
  0x01 => {
259
266
  Name => 'ImageQuality',
260
267
  Writable => 'int16u',
268
+ Notes => 'quality of the main image, which may be in a different file',
261
269
  PrintConv => {
262
270
  1 => 'TIFF', #PH (FZ20)
263
271
  2 => 'High',
264
272
  3 => 'Normal',
265
273
  # 5 - seen this for 1920x1080, 30fps SZ7 video - PH
266
274
  6 => 'Very High', #3 (Leica)
267
- 7 => 'Raw', #3 (Leica)
275
+ 7 => 'RAW', #3 (Leica)
268
276
  9 => 'Motion Picture', #PH (LZ6)
269
277
  11 => 'Full HD Movie', #PH (V-LUX)
270
278
  12 => '4k Movie', #PH (V-LUX)
@@ -298,9 +306,13 @@ my %shootingMode = (
298
306
  5 => 'Manual',
299
307
  8 => 'Flash',
300
308
  10 => 'Black & White', #3 (Leica)
301
- 11 => 'Manual', #PH (FZ8)
309
+ 11 => 'Manual 2', #PH (FZ8)
302
310
  12 => 'Shade', #PH (FS7)
303
311
  13 => 'Kelvin', #PeterK (NC)
312
+ 14 => 'Manual 3', #forum9296
313
+ 15 => 'Manual 4', #forum9296
314
+ # also seen 18,26 (forum9296)
315
+ 19 => 'Auto (cool)', #PH (Leica C-Lux)
304
316
  },
305
317
  },
306
318
  0x07 => {
@@ -336,7 +348,7 @@ my %shootingMode = (
336
348
  '0 1' => '9-area', # (FS7)
337
349
  '0 16' => '3-area (high speed)', # (FZ8)
338
350
  '0 23' => '23-area', #PH (FZ47,NC)
339
- # '0 49' - seen for LX100, V-LUX (PH)
351
+ '0 49' => '49-area', #20
340
352
  '1 0' => 'Spot Focusing', # (FZ8)
341
353
  '1 1' => '5-area', # (FZ8)
342
354
  '16' => 'Normal?', # (only mode for DMC-LC20)
@@ -363,6 +375,8 @@ my %shootingMode = (
363
375
  5 => 'Panning', #18
364
376
  # GF1 also has a "Mode 3" - PH
365
377
  6 => 'On, Mode 3', #PH (GX7, sensor shift?)
378
+ 9 => 'Dual IS', #20
379
+ 11 => 'Dual2 IS', #forum9298
366
380
  },
367
381
  },
368
382
  0x1c => {
@@ -469,9 +483,12 @@ my %shootingMode = (
469
483
  $val -= $h * 3600;
470
484
  my $m = int($val / 60);
471
485
  $val -= $m * 60;
472
- my $s = int($val);
473
- my $f = 100 * ($val - int($val));
474
- return sprintf("%s%.2d:%.2d:%.2d.%.2d",$str,$h,$m,$s,$f);
486
+ my $ss = sprintf('%05.2f', $val);
487
+ if ($ss >= 60) {
488
+ $ss = '00.00';
489
+ ++$m >= 60 and $m -= 60, ++$h;
490
+ }
491
+ return sprintf("%s%.2d:%.2d:%s",$str,$h,$m,$ss);
475
492
  },
476
493
  PrintConvInv => sub {
477
494
  my $val = shift;
@@ -617,6 +634,7 @@ my %shootingMode = (
617
634
  2 => 'High (+1)',
618
635
  3 => 'Lowest (-2)', #JD
619
636
  4 => 'Highest (+2)', #JD
637
+ # 6 - seen for DC-S1/S1R (IB)
620
638
  # 65531 - seen for LX100/FZ2500 "NR1" test shots at imaging-resource (PH)
621
639
  # 0 - seen for FZ2500 "NR6D" test shots (PH)
622
640
  },
@@ -629,7 +647,7 @@ my %shootingMode = (
629
647
  2 => '10 s',
630
648
  3 => '2 s',
631
649
  4 => '10 s / 3 pictures', #17
632
- # 258 - seen for FZ2500,TZ90 (PH)
650
+ # 258 - seen for FZ2500,TZ90,LeicaCLux (PH)
633
651
  },
634
652
  },
635
653
  # 0x2f - values: 1 (LZ6,FX10K)
@@ -720,11 +738,12 @@ my %shootingMode = (
720
738
  },
721
739
  0x3c => { #PH
722
740
  Name => 'ProgramISO', # (maybe should rename this ISOSetting?)
723
- Writable => 'int16u',
741
+ Writable => 'int16u', # (new models store a long here)
724
742
  PrintConv => {
725
743
  OTHER => sub { shift },
726
744
  65534 => 'Intelligent ISO', #PH (FS7)
727
745
  65535 => 'n/a',
746
+ -1 => 'n/a',
728
747
  },
729
748
  },
730
749
  0x3d => { #PH
@@ -773,7 +792,17 @@ my %shootingMode = (
773
792
  # 12 => 'Multi Film'? (in the GH1 specs)
774
793
  },
775
794
  },
776
- # 0x43 - int16u: 2,3
795
+ 0x43 => { #forum9369
796
+ Name => 'JPEGQuality',
797
+ Writable => 'int16u',
798
+ PrintConv => {
799
+ 0 => 'n/a (Movie)',
800
+ 2 => 'High',
801
+ 3 => 'Standard',
802
+ 6 => 'Very High',
803
+ 255 => 'n/a (RAW only)',
804
+ },
805
+ },
777
806
  0x44 => {
778
807
  Name => 'ColorTempKelvin',
779
808
  Format => 'int16u',
@@ -873,7 +902,7 @@ my %shootingMode = (
873
902
  ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces
874
903
  ValueConvInv => '$val',
875
904
  },
876
- # 0x55 - int16u: 1
905
+ # 0x55 - int16u: 1 (see forum9372)
877
906
  # 0x57 - int16u: 0
878
907
  0x59 => { #PH (FS7)
879
908
  Name => 'Transform',
@@ -999,6 +1028,11 @@ my %shootingMode = (
999
1028
  },
1000
1029
  # 0x72,0x73,0x74,0x75,0x77,0x78: 0
1001
1030
  # 0x76: 0, (3 for G6 with HDR on, ref 18)
1031
+ 0x76 => { #18/21
1032
+ Name => 'HDRShot',
1033
+ Writable => 'int16u',
1034
+ PrintConv => { 0 => 'Off', 3 => 'On' },
1035
+ },
1002
1036
  0x79 => { #PH (GH2)
1003
1037
  Name => 'IntelligentD-Range',
1004
1038
  Writable => 'int16u',
@@ -1057,6 +1091,12 @@ my %shootingMode = (
1057
1091
  1 => 'On'
1058
1092
  }
1059
1093
  },
1094
+ 0x8b => { #21
1095
+ Name => 'WBShiftIntelligentAuto',
1096
+ Writable => 'int16u',
1097
+ Format => 'int16s',
1098
+ Notes => 'value is -9 for blue to +9 for amber. Valid for Intelligent-Auto modes',
1099
+ },
1060
1100
  0x8c => {
1061
1101
  Name => 'AccelerometerZ',
1062
1102
  Writable => 'int16u',
@@ -1103,6 +1143,12 @@ my %shootingMode = (
1103
1143
  ValueConv => '-$val / 10',
1104
1144
  ValueConvInv => '-$val * 10',
1105
1145
  },
1146
+ 0x92 => { #21 (forum9453)
1147
+ Name => 'WBShiftCreativeControl',
1148
+ Writable => 'int8u',
1149
+ Format => 'int8s',
1150
+ Notes => 'WB shift or style strength. Valid for Creative-Control modes',
1151
+ },
1106
1152
  0x93 => { #18
1107
1153
  Name => 'SweepPanoramaDirection',
1108
1154
  Writable => 'int8u',
@@ -1153,17 +1199,32 @@ my %shootingMode = (
1153
1199
  2 => 'Hybrid', #PH (GM1, 1st curtain electronic, 2nd curtain mechanical)
1154
1200
  },
1155
1201
  },
1202
+ # 0xa0 - undef[32]: AWB gains and black levels (ref forum9303)
1156
1203
  0xa3 => { #18
1157
1204
  Name => 'ClearRetouchValue',
1158
1205
  Writable => 'rational64u',
1159
1206
  # undef if ClearRetouch is off, 0 if it is on
1160
1207
  },
1208
+ 0xa7 => { #forum9374 (conversion table for 14- to 16-bit mapping)
1209
+ Name => 'OutputLUT',
1210
+ Binary => 1,
1211
+ Notes => q{
1212
+ 2-column by 432-row binary lookup table of unsigned short values for
1213
+ converting to 16-bit output (1st column) from 14 bits (2nd column) with
1214
+ camera contrast
1215
+ },
1216
+ },
1161
1217
  0xab => { #18
1162
1218
  Name => 'TouchAE',
1163
1219
  Writable => 'int16u',
1164
1220
  PrintConv => { 0 => 'Off', 1 => 'On' },
1165
1221
  },
1166
- 0xaf => { #PH
1222
+ 0xad => { #forum9360
1223
+ Name => 'HighlightShadow',
1224
+ Writable => 'int16u',
1225
+ Count => 2,
1226
+ },
1227
+ 0xaf => { #PH (is this in UTC maybe? -- sometimes different time zone other times)
1167
1228
  Name => 'TimeStamp',
1168
1229
  Writable => 'string',
1169
1230
  Groups => { 2 => 'Time' },
@@ -1171,13 +1232,43 @@ my %shootingMode = (
1171
1232
  PrintConv => '$self->ConvertDateTime($val)',
1172
1233
  PrintConvInv => '$self->InverseDateTime($val)',
1173
1234
  },
1235
+ 0xb4 => { #forum9429
1236
+ Name => 'MultiExposure',
1237
+ Writable => 'int16u',
1238
+ PrintConv => { 0 => 'n/a', 1 => 'Off', 2 => 'On' },
1239
+ },
1240
+ 0xb9 => { #forum9425
1241
+ Name => 'RedEyeRemoval',
1242
+ Writable => 'int16u',
1243
+ PrintConv => { 0 => 'Off', 1 => 'On' },
1244
+ },
1245
+ 0xbb => { #forum9282
1246
+ Name => 'VideoBurstMode',
1247
+ Writable => 'int32u',
1248
+ PrintHex => 1,
1249
+ PrintConv => {
1250
+ 0x01 => 'Off',
1251
+ 0x04 => 'Post Focus',
1252
+ 0x18 => '4K Burst',
1253
+ 0x28 => '4K Burst (Start/Stop)',
1254
+ 0x48 => '4K Pre-burst',
1255
+ 0x108 => 'Loop Recording',
1256
+ },
1257
+ },
1258
+ 0xbc => { #forum9282
1259
+ Name => 'DiffractionCorrection',
1260
+ Writable => 'int16u',
1261
+ PrintConv => { 0 => 'Off', 1 => 'Auto' },
1262
+ },
1174
1263
  0x0e00 => {
1175
1264
  Name => 'PrintIM',
1176
1265
  Description => 'Print Image Matching',
1177
1266
  Writable => 0,
1178
- SubDirectory => {
1179
- TagTable => 'Image::ExifTool::PrintIM::Main',
1180
- },
1267
+ SubDirectory => { TagTable => 'Image::ExifTool::PrintIM::Main' },
1268
+ },
1269
+ 0x2003 => { #21
1270
+ Name => 'TimeInfo',
1271
+ SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::TimeInfo' },
1181
1272
  },
1182
1273
  0x8000 => { #PH
1183
1274
  Name => 'MakerNoteVersion',
@@ -1192,9 +1283,16 @@ my %shootingMode = (
1192
1283
  %shootingMode,
1193
1284
  },
1194
1285
  },
1195
- # 0x8002 - values: 1,2 related to focus? (PH/JD)
1196
- # 1 for HDR modes, 2 for Portrait (ref 12)
1197
- # 0x8003 - values: 1,2 related to focus? (PH/JD)
1286
+ 0x8002 => { #21
1287
+ Name => 'HighlightWarning',
1288
+ Writable => 'int16u',
1289
+ PrintConv => { 0 => 'Disabled', 1 => 'No', 2 => 'Yes' },
1290
+ },
1291
+ 0x8003 => { #21
1292
+ Name => 'DarkFocusEnvironment',
1293
+ Writable => 'int16u',
1294
+ PrintConv => { 1 => 'No', 2 => 'Yes' },
1295
+ },
1198
1296
  0x8004 => { #PH/JD
1199
1297
  Name => 'WBRedLevel',
1200
1298
  Writable => 'int16u',
@@ -1207,11 +1305,11 @@ my %shootingMode = (
1207
1305
  Name => 'WBBlueLevel',
1208
1306
  Writable => 'int16u',
1209
1307
  },
1210
- 0x8007 => { #PH
1211
- Name => 'FlashFired',
1212
- Writable => 'int16u',
1213
- PrintConv => { 1 => 'No', 2 => 'Yes' },
1214
- },
1308
+ #0x8007 => { #PH - questionable [disabled because it conflicts with EXIF in too many samples]
1309
+ # Name => 'FlashFired',
1310
+ # Writable => 'int16u',
1311
+ # PrintConv => { 0 => 'Yes', 1 => 'No' },
1312
+ #},
1215
1313
  0x8008 => { #PH (TZ5/FS7)
1216
1314
  # (tags 0x3b, 0x3e, 0x8008 and 0x8009 have the same values in all my samples - PH)
1217
1315
  Name => 'TextStamp',
@@ -1356,6 +1454,10 @@ my %shootingMode = (
1356
1454
  GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
1357
1455
  WRITABLE => 1,
1358
1456
  NOTES => 'These tags are used by the Leica R8 and R9 digital backs.',
1457
+ 0x0b => { #IB
1458
+ Name => 'SerialInfo',
1459
+ SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::SerialInfo' },
1460
+ },
1359
1461
  0x0d => {
1360
1462
  Name => 'WB_RGBLevels',
1361
1463
  Writable => 'int16u',
@@ -1363,6 +1465,18 @@ my %shootingMode = (
1363
1465
  },
1364
1466
  );
1365
1467
 
1468
+ # Leica serial number info (ref IB)
1469
+ %Image::ExifTool::Panasonic::SerialInfo = (
1470
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1471
+ GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
1472
+ TAG_PREFIX => 'Leica_SerialInfo',
1473
+ FIRST_ENTRY => 0,
1474
+ 4 => {
1475
+ Name => 'SerialNumber',
1476
+ Format => 'string[8]',
1477
+ }
1478
+ );
1479
+
1366
1480
  # Leica type4 maker notes (ref PH) (M9)
1367
1481
  %Image::ExifTool::Panasonic::Leica4 = (
1368
1482
  WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
@@ -1566,6 +1680,38 @@ my %shootingMode = (
1566
1680
  # 0x3903 - larger binary data block
1567
1681
  );
1568
1682
 
1683
+ # time stamp information (ref 21)
1684
+ %Image::ExifTool::Panasonic::TimeInfo = (
1685
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1686
+ WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
1687
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
1688
+ GROUPS => { 0 => 'MakerNotes', 1 => 'Panasonic', 2 => 'Image' },
1689
+ FIRST_ENTRY => 0,
1690
+ WRITABLE => 1,
1691
+ 0 => {
1692
+ Name => 'PanasonicDateTime',
1693
+ Groups => { 2 => 'Time' },
1694
+ Shift => 'Time',
1695
+ Format => 'undef[8]',
1696
+ RawConv => '$val =~ /^\0/ ? undef : $val',
1697
+ ValueConv => 'sprintf("%s:%s:%s %s:%s:%s.%s", unpack "H4H2H2H2H2H2H2", $val)',
1698
+ ValueConvInv => q{
1699
+ $val =~ s/[-+].*//; # remove time zone
1700
+ $val =~ tr/0-9//dc; # remove non-digits
1701
+ $val = pack("H*",$val);
1702
+ $val .= "\0" while length $val < 8;
1703
+ return $val;
1704
+ },
1705
+ PrintConv => '$self->ConvertDateTime($val)',
1706
+ PrintConvInv => '$self->InverseDateTime($val)',
1707
+ },
1708
+ # 8 - 8 bytes usually 8 x 0xff (spot for another date/time?)
1709
+ 16 => {
1710
+ Name => 'TimeLapseShotNumber',
1711
+ Format => 'int32u',
1712
+ },
1713
+ );
1714
+
1569
1715
  %Image::ExifTool::Panasonic::Data1 = (
1570
1716
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1571
1717
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
@@ -1576,10 +1722,10 @@ my %shootingMode = (
1576
1722
  FIRST_ENTRY => 0,
1577
1723
  0x0016 => {
1578
1724
  Name => 'LensType',
1579
- Writable => 'int32u',
1725
+ Format => 'int32u',
1580
1726
  Priority => 0,
1581
1727
  SeparateTable => 1,
1582
- ValueConv => '($val >> 2) . " " . ($val & 0x3)',
1728
+ ValueConv => '(($val >> 2) & 0xffff) . " " . ($val & 0x3)',
1583
1729
  ValueConvInv => \&LensTypeConvInv,
1584
1730
  PrintConv => \%leicaLensTypes,
1585
1731
  },
@@ -1601,14 +1747,26 @@ my %shootingMode = (
1601
1747
  PRIORITY => 0,
1602
1748
  NOTES => 'This information is written by the X1, X2, X VARIO and T.',
1603
1749
  0x0303 => {
1604
- Name => 'LensModel',
1750
+ Name => 'LensType',
1605
1751
  Condition => '$format eq "string"',
1606
1752
  Notes => 'Leica T only',
1607
1753
  Writable => 'string',
1608
1754
  },
1755
+ # 0x0304 - int8u[1]: may be M-lens ID for Leica SL, mounted through "M-adapter L" (ref IB)
1756
+ # --> int8u[4] for some models (maybe not lens ID for these?) - PH
1757
+ # (see http://us.leica-camera.com/Photography/Leica-APS-C/Lenses-for-Leica-TL/L-Adapters/M-Adapter-L)
1758
+ # 58 = 'Leica Noctilux-M 75mm F1.25 ASPH (Typ 601) on Leica SL
1759
+ 0x0305 => { #IB
1760
+ Name => 'SerialNumber',
1761
+ Writable => 'int32u',
1762
+ },
1609
1763
  # 0x0406 - saturation or sharpness
1610
1764
  0x0407 => { Name => 'OriginalFileName', Writable => 'string' },
1611
1765
  0x0408 => { Name => 'OriginalDirectory',Writable => 'string' },
1766
+ 0x040a => { #IB
1767
+ Name => 'FocusInfo',
1768
+ SubDirectory => { TagTable => 'Image::ExifTool::Panasonic::FocusInfo' },
1769
+ },
1612
1770
  # 0x040b - related to white balance
1613
1771
  0x040d => {
1614
1772
  Name => 'ExposureMode',
@@ -1631,6 +1789,16 @@ my %shootingMode = (
1631
1789
  # 0x0411 - int8u[4]: first number is FilmMode (1=Standard,2=Vivid,3=Natural,4=BW Natural,5=BW High Contrast)
1632
1790
  0x0412 => { Name => 'FilmMode', Writable => 'string' },
1633
1791
  0x0413 => { Name => 'WB_RGBLevels', Writable => 'rational64u', Count => 3 },
1792
+ 0x0500 => {
1793
+ Name => 'InternalSerialNumber',
1794
+ Writable => 'undef',
1795
+ PrintConv => q{
1796
+ return $val unless $val=~/^(.{3})(\d{2})(\d{2})(\d{2})(\d{4})/;
1797
+ my $yr = $2 + ($2 < 70 ? 2000 : 1900);
1798
+ return "($1) $yr:$3:$4 no. $5";
1799
+ },
1800
+ PrintConvInv => '$_=$val; tr/A-Z0-9//dc; s/(.{3})(19|20)/$1/; $_',
1801
+ },
1634
1802
  );
1635
1803
 
1636
1804
  # Leica type5 ShotInfo (ref PH) (X2)
@@ -1648,6 +1816,34 @@ my %shootingMode = (
1648
1816
  },
1649
1817
  );
1650
1818
 
1819
+ # Leica type5 FocusInfo (ref IB)
1820
+ %Image::ExifTool::Panasonic::FocusInfo = (
1821
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
1822
+ WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
1823
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
1824
+ GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
1825
+ TAG_PREFIX => 'Leica_FocusInfo',
1826
+ FIRST_ENTRY => 0,
1827
+ WRITABLE => 1,
1828
+ FORMAT => 'int16u',
1829
+ 0 => {
1830
+ Name => 'FocusDistance',
1831
+ ValueConv => '$val / 1000',
1832
+ ValueConvInv => '$val * 1000',
1833
+ PrintConv => '$val < 65535 ? "$val m" : "inf"',
1834
+ PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 65535',
1835
+ },
1836
+ 1 => {
1837
+ Name => 'FocalLength',
1838
+ Priority => 0,
1839
+ RawConv => '$val ? $val : undef',
1840
+ ValueConv => '$val / 1000',
1841
+ ValueConvInv => '$val * 1000',
1842
+ PrintConv => 'sprintf("%.1f mm",$val)',
1843
+ PrintConvInv => '$val=~s/\s*mm$//;$val',
1844
+ },
1845
+ );
1846
+
1651
1847
  # Leica type6 maker notes (ref PH) (S2)
1652
1848
  %Image::ExifTool::Panasonic::Leica6 = (
1653
1849
  WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
@@ -1678,22 +1874,83 @@ my %shootingMode = (
1678
1874
  Notes => 'unknown 320kB block, not copied to JPEG images',
1679
1875
  Flags => [ 'Unknown', 'Binary', 'Drop' ],
1680
1876
  },
1681
- # 0x302 - same value as 4 unknown bytes at the end of JPEG or after the DNG TIFF header
1877
+ # 0x302 - same value as 4 unknown bytes at the end of JPEG or after the DNG TIFF header (ImageID, ref IB)
1682
1878
  0x303 => {
1683
1879
  Name => 'LensType',
1684
1880
  Writable => 'string',
1685
1881
  ValueConv => '$val=~s/ +$//; $val', # trim trailing spaces
1686
1882
  ValueConvInv => '$val',
1687
1883
  },
1688
- # 0x340 - same as 0x302
1884
+ 0x304 => { #IB
1885
+ Name => 'FocusDistance',
1886
+ Notes => 'focus distance in mm for most models, but cm for others',
1887
+ Writable => 'int32u',
1888
+ },
1889
+ 0x311 => {
1890
+ Name => 'ExternalSensorBrightnessValue',
1891
+ Condition => '$$self{Model} =~ /Typ 006/',
1892
+ Notes => 'Leica S only',
1893
+ Format => 'rational64s', # (may be incorrectly unsigned in JPEG images)
1894
+ Writable => 'rational64s',
1895
+ PrintConv => 'sprintf("%.2f", $val)',
1896
+ PrintConvInv => '$val',
1897
+ },
1898
+ 0x312 => {
1899
+ Name => 'MeasuredLV',
1900
+ Condition => '$$self{Model} =~ /Typ 006/',
1901
+ Notes => 'Leica S only',
1902
+ Format => 'rational64s', # (may be incorrectly unsigned in JPEG images)
1903
+ Writable => 'rational64s',
1904
+ PrintConv => 'sprintf("%.2f", $val)',
1905
+ PrintConvInv => '$val',
1906
+ },
1907
+ 0x320 => {
1908
+ Name => 'FirmwareVersion',
1909
+ Condition => '$$self{Model} =~ /Typ 006/',
1910
+ Notes => 'Leica S only',
1911
+ Writable => 'int8u',
1912
+ Count => 4,
1913
+ PrintConv => '$val=~tr/ /./; $val',
1914
+ PrintConvInv => '$val=~tr/./ /; $val',
1915
+ },
1916
+ 0x321 => { #IB
1917
+ Name => 'LensSerialNumber',
1918
+ Condition => '$$self{Model} =~ /Typ 006/',
1919
+ Notes => 'Leica S only',
1920
+ Writable => 'int32u',
1921
+ PrintConv => 'sprintf("%.10d",$val)',
1922
+ PrintConvInv => '$val',
1923
+ },
1924
+ # 0x321 - SerialNumber for Leica S? (ref IB)
1925
+ # 0x340 - same as 0x302 (ImageID, ref IB)
1689
1926
  );
1690
1927
 
1691
- # Leica type9 maker notes (ref PH) (S)
1928
+ # Leica type9 maker notes (ref IB) (S)
1692
1929
  %Image::ExifTool::Panasonic::Leica9 = (
1693
1930
  WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
1694
1931
  CHECK_PROC => \&Image::ExifTool::Exif::CheckExif,
1695
1932
  GROUPS => { 0 => 'MakerNotes', 1 => 'Leica', 2 => 'Camera' },
1696
1933
  NOTES => 'This information is written by the Leica S (Typ 007).',
1934
+ 0x304 => {
1935
+ Name => 'FocusDistance',
1936
+ Notes => 'focus distance in mm for most models, but cm for others',
1937
+ Writable => 'int32u',
1938
+ },
1939
+ 0x311 => {
1940
+ Name => 'ExternalSensorBrightnessValue',
1941
+ Format => 'rational64s', # (may be incorrectly unsigned in JPEG images)
1942
+ Writable => 'rational64s',
1943
+ PrintConv => 'sprintf("%.2f", $val)',
1944
+ PrintConvInv => '$val',
1945
+ },
1946
+ 0x312 => {
1947
+ Name => 'MeasuredLV',
1948
+ Format => 'rational64s', # (may be incorrectly unsigned in JPEG images)
1949
+ Writable => 'rational64s',
1950
+ PrintConv => 'sprintf("%.2f", $val)',
1951
+ PrintConvInv => '$val',
1952
+ },
1953
+ # 0x340 - ImageUniqueID
1697
1954
  );
1698
1955
 
1699
1956
  # Type 2 tags (ref PH)
@@ -1868,6 +2125,17 @@ my %shootingMode = (
1868
2125
  Format => 'string[16]',
1869
2126
  RawConv => '$$self{Model} = $val',
1870
2127
  },
2128
+ 0x10 => { # (DC-FT7)
2129
+ Name => 'JPEG-likeData',
2130
+ # looks like a JPEG preview, but not a well-formed JPEG file
2131
+ Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s',
2132
+ Format => 'undef[$size-0x10]',
2133
+ SubDirectory => {
2134
+ TagTable => 'Image::ExifTool::Exif::Main',
2135
+ ProcessProc => \&Image::ExifTool::ProcessTIFF,
2136
+ Start => 12,
2137
+ },
2138
+ },
1871
2139
  0x16 => {
1872
2140
  Name => 'Model',
1873
2141
  Condition => '$$self{LeicaLEIC}',
@@ -2318,7 +2586,7 @@ sub ProcessLeicaTrailer($;$)
2318
2586
  $dirInfo{DirLen} += 8;
2319
2587
  $$et{MAKER_NOTE_BYTE_ORDER} = GetByteOrder();
2320
2588
  # rebuild maker notes (creates $$et{MAKER_NOTE_FIXUP})
2321
- my $val = Image::ExifTool::Exif::RebuildMakerNotes($et, $tagTablePtr, \%dirInfo);
2589
+ my $val = Image::ExifTool::Exif::RebuildMakerNotes($et, \%dirInfo, $tagTablePtr);
2322
2590
  unless (defined $val) {
2323
2591
  $et->Warn('Error rebuilding maker notes (may be corrupt)') if $len > 4;
2324
2592
  $val = $buff,
@@ -2350,7 +2618,7 @@ Panasonic and Leica maker notes in EXIF information.
2350
2618
 
2351
2619
  =head1 AUTHOR
2352
2620
 
2353
- Copyright 2003-2017, Phil Harvey (phil at owl.phy.queensu.ca)
2621
+ Copyright 2003-2019, Phil Harvey (phil at owl.phy.queensu.ca)
2354
2622
 
2355
2623
  This library is free software; you can redistribute it and/or modify it
2356
2624
  under the same terms as Perl itself.