exiftool-vendored.pl 12.33.0 → 12.40.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 (205) hide show
  1. package/LICENSE +10 -3
  2. package/bin/Changes +116 -0
  3. package/bin/MANIFEST +2 -0
  4. package/bin/META.json +1 -1
  5. package/bin/META.yml +1 -1
  6. package/bin/README +45 -45
  7. package/bin/config_files/acdsee.config +6 -6
  8. package/bin/config_files/photoshop_paths.config +30 -7
  9. package/bin/config_files/picasa_faces.config +1 -1
  10. package/bin/config_files/pix4d.config +2 -2
  11. package/bin/config_files/tiff_version.config +2 -2
  12. package/bin/exiftool +112 -82
  13. package/bin/lib/File/RandomAccess.pm +1 -1
  14. package/bin/lib/File/RandomAccess.pod +2 -2
  15. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  16. package/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  17. package/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  18. package/bin/lib/Image/ExifTool/APE.pm +1 -1
  19. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  20. package/bin/lib/Image/ExifTool/ASF.pm +1 -1
  21. package/bin/lib/Image/ExifTool/Apple.pm +1 -1
  22. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  23. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  24. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  25. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  26. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  27. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +15 -4
  28. package/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  29. package/bin/lib/Image/ExifTool/Canon.pm +225 -13
  30. package/bin/lib/Image/ExifTool/CanonCustom.pm +13 -3
  31. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  32. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  33. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  34. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  35. package/bin/lib/Image/ExifTool/Charset.pm +3 -1
  36. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  37. package/bin/lib/Image/ExifTool/DJI.pm +1 -1
  38. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  39. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  40. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  41. package/bin/lib/Image/ExifTool/DarwinCore.pm +3 -3
  42. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  43. package/bin/lib/Image/ExifTool/EXE.pm +1 -1
  44. package/bin/lib/Image/ExifTool/Exif.pm +64 -20
  45. package/bin/lib/Image/ExifTool/FITS.pm +1 -1
  46. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  47. package/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  48. package/bin/lib/Image/ExifTool/FLIR.pm +48 -11
  49. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  50. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  51. package/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  52. package/bin/lib/Image/ExifTool/Font.pm +1 -1
  53. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  54. package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  55. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  56. package/bin/lib/Image/ExifTool/GIF.pm +6 -2
  57. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  58. package/bin/lib/Image/ExifTool/GPS.pm +15 -11
  59. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  60. package/bin/lib/Image/ExifTool/Geotag.pm +4 -3
  61. package/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  62. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  63. package/bin/lib/Image/ExifTool/HP.pm +1 -1
  64. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  65. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  66. package/bin/lib/Image/ExifTool/ICC_Profile.pm +97 -5
  67. package/bin/lib/Image/ExifTool/ID3.pm +1 -1
  68. package/bin/lib/Image/ExifTool/IPTC.pm +1 -1
  69. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  70. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  71. package/bin/lib/Image/ExifTool/Import.pm +1 -1
  72. package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  73. package/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  74. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  75. package/bin/lib/Image/ExifTool/JSON.pm +1 -1
  76. package/bin/lib/Image/ExifTool/JVC.pm +1 -1
  77. package/bin/lib/Image/ExifTool/Jpeg2000.pm +109 -12
  78. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  79. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  80. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  81. package/bin/lib/Image/ExifTool/LNK.pm +1 -1
  82. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  83. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  84. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  85. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  86. package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  87. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  98. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  99. package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  100. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  101. package/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  102. package/bin/lib/Image/ExifTool/MIE.pm +1 -1
  103. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  104. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  105. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  106. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  107. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  108. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  109. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MXF.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  114. package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  115. package/bin/lib/Image/ExifTool/Matroska.pm +9 -5
  116. package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  117. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  118. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  119. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  120. package/bin/lib/Image/ExifTool/Nikon.pm +1918 -72
  121. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  122. package/bin/lib/Image/ExifTool/NikonCustom.pm +523 -6
  123. package/bin/lib/Image/ExifTool/NikonSettings.pm +150 -87
  124. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  125. package/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  126. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  127. package/bin/lib/Image/ExifTool/Olympus.pm +7 -7
  128. package/bin/lib/Image/ExifTool/OpenEXR.pm +5 -3
  129. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  130. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  131. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  132. package/bin/lib/Image/ExifTool/PDF.pm +6 -4
  133. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  134. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  135. package/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  136. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  137. package/bin/lib/Image/ExifTool/PNG.pm +29 -8
  138. package/bin/lib/Image/ExifTool/PPM.pm +1 -1
  139. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  140. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  141. package/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  142. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  143. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  144. package/bin/lib/Image/ExifTool/Pentax.pm +3 -2
  145. package/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  146. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  147. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  148. package/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  149. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  150. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  151. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  152. package/bin/lib/Image/ExifTool/QuickTime.pm +25 -7
  153. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +40 -4
  154. package/bin/lib/Image/ExifTool/README +4 -0
  155. package/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  156. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  157. package/bin/lib/Image/ExifTool/RTF.pm +1 -1
  158. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  159. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  160. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  161. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  162. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  163. package/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  164. package/bin/lib/Image/ExifTool/Samsung.pm +6 -2
  165. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  166. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Shift.pl +3 -1
  168. package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  169. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  170. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  171. package/bin/lib/Image/ExifTool/Sony.pm +34 -12
  172. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  173. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  174. package/bin/lib/Image/ExifTool/TagInfoXML.pm +11 -6
  175. package/bin/lib/Image/ExifTool/TagLookup.pm +6581 -5893
  176. package/bin/lib/Image/ExifTool/TagNames.pod +1641 -59
  177. package/bin/lib/Image/ExifTool/Text.pm +1 -1
  178. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  179. package/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  181. package/bin/lib/Image/ExifTool/VCard.pm +1 -1
  182. package/bin/lib/Image/ExifTool/Validate.pm +1 -1
  183. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  184. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  185. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  186. package/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  187. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  188. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  189. package/bin/lib/Image/ExifTool/WritePNG.pl +30 -10
  190. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  191. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  192. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +19 -4
  193. package/bin/lib/Image/ExifTool/WriteXMP.pl +13 -12
  194. package/bin/lib/Image/ExifTool/Writer.pl +56 -10
  195. package/bin/lib/Image/ExifTool/XMP.pm +169 -54
  196. package/bin/lib/Image/ExifTool/XMP2.pl +6 -4
  197. package/bin/lib/Image/ExifTool/XMPStruct.pl +22 -8
  198. package/bin/lib/Image/ExifTool/ZIP.pm +10 -2
  199. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  200. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  201. package/bin/lib/Image/ExifTool.pm +93 -13
  202. package/bin/lib/Image/ExifTool.pod +80 -70
  203. package/bin/perl-Image-ExifTool.spec +43 -43
  204. package/bin/pp_build_exe.args +5 -5
  205. package/package.json +3 -3
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
56
56
  use Image::ExifTool qw(:DataAccess :Utils);
57
57
  use Image::ExifTool::MakerNotes;
58
58
 
59
- $VERSION = '4.37';
59
+ $VERSION = '4.39';
60
60
 
61
61
  sub ProcessExif($$$);
62
62
  sub WriteExif($$$);
@@ -415,7 +415,14 @@ my %opcodeInfo = (
415
415
  WriteGroup => 'IFD0',
416
416
  # set priority directory if this is the full resolution image
417
417
  DataMember => 'SubfileType',
418
- RawConv => '$self->SetPriorityDir() if $val eq "0"; $$self{SubfileType} = $val',
418
+ RawConv => q{
419
+ if ($val == ($val & 0x02)) {
420
+ $self->SetPriorityDir() if $val == 0;
421
+ $$self{PageCount} = ($$self{PageCount} || 0) + 1;
422
+ $$self{MultiPage} = 1 if $val == 2 or $$self{PageCount} > 1;
423
+ }
424
+ $$self{SubfileType} = $val;
425
+ },
419
426
  PrintConv => \%subfileType,
420
427
  },
421
428
  0xff => {
@@ -425,7 +432,14 @@ my %opcodeInfo = (
425
432
  Writable => 'int16u',
426
433
  WriteGroup => 'IFD0',
427
434
  # set priority directory if this is the full resolution image
428
- RawConv => '$self->SetPriorityDir() if $val eq "1"; $val',
435
+ RawConv => q{
436
+ if ($val == 1 or $val == 3) {
437
+ $self->SetPriorityDir() if $val == 1;
438
+ $$self{PageCount} = ($$self{PageCount} || 0) + 1;
439
+ $$self{MultiPage} = 1 if $val == 3 or $$self{PageCount} > 1;
440
+ }
441
+ $val;
442
+ },
429
443
  PrintConv => {
430
444
  1 => 'Full-resolution image',
431
445
  2 => 'Reduced-resolution image',
@@ -2144,7 +2158,7 @@ my %opcodeInfo = (
2144
2158
  Notes => 'displayed in seconds, but stored as an APEX value',
2145
2159
  Format => 'rational64s', # Leica M8 patch (incorrectly written as rational64u)
2146
2160
  Writable => 'rational64s',
2147
- ValueConv => 'abs($val)<100 ? 2**(-$val) : 0',
2161
+ ValueConv => 'IsFloat($val) && abs($val)<100 ? 2**(-$val) : 0',
2148
2162
  ValueConvInv => '$val>0 ? -log($val)/log(2) : -100',
2149
2163
  PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
2150
2164
  PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)',
@@ -4816,11 +4830,32 @@ my %subSecConv = (
4816
4830
  },
4817
4831
  GPSPosition => {
4818
4832
  Groups => { 2 => 'Location' },
4833
+ Writable => 1,
4834
+ Protected => 1,
4835
+ WriteAlso => {
4836
+ GPSLatitude => '$val =~ /(.*?)( ?[NS])?,/ ? $1 : undef',
4837
+ GPSLatitudeRef => '$val =~ /(-?)(.*?) ?([NS]?),/ ? ($3 || ($1 ? "S" : "N")) : undef',
4838
+ GPSLongitude => '$val =~ /, ?(.*?)( ?[EW]?)$/ ? $1 : undef',
4839
+ GPSLongitudeRef => '$val =~ /, ?(-?)(.*?) ?([EW]?)$/ ? ($3 || ($1 ? "W" : "E")) : undef',
4840
+ },
4841
+ PrintConvInv => q{
4842
+ return undef unless $val =~ /(.*? ?[NS]?), ?(.*? ?[EW]?)$/;
4843
+ my ($lat, $lon) = ($1, $2);
4844
+ require Image::ExifTool::GPS;
4845
+ $lat = Image::ExifTool::GPS::ToDegrees($lat, 1, "lat");
4846
+ $lon = Image::ExifTool::GPS::ToDegrees($lon, 1, "lon");
4847
+ return "$lat, $lon";
4848
+ },
4819
4849
  Require => {
4820
4850
  0 => 'GPSLatitude',
4821
4851
  1 => 'GPSLongitude',
4822
4852
  },
4823
4853
  Priority => 0,
4854
+ Notes => q{
4855
+ when written, writes GPSLatitude, GPSLatitudeRef, GPSLongitude and
4856
+ GPSLongitudeRef. This tag may be written using the same coordinate
4857
+ format as provided by Google Maps when right-clicking on a location
4858
+ },
4824
4859
  ValueConv => '(length($val[0]) or length($val[1])) ? "$val[0] $val[1]" : undef',
4825
4860
  PrintConv => '"$prt[0], $prt[1]"',
4826
4861
  },
@@ -5228,6 +5263,7 @@ sub RedBlueBalance($@)
5228
5263
  sub PrintExposureTime($)
5229
5264
  {
5230
5265
  my $secs = shift;
5266
+ return $secs unless Image::ExifTool::IsFloat($secs);
5231
5267
  if ($secs < 0.25001 and $secs > 0) {
5232
5268
  return sprintf("1/%d",int(0.5 + 1/$secs));
5233
5269
  }
@@ -5833,7 +5869,7 @@ sub ProcessExif($$$)
5833
5869
  unless ($path =~ /^(JPEG-APP1-IFD0|TIFF-IFD0|PSD-EXIFInfo-IFD0)$/) {
5834
5870
  if ($Image::ExifTool::MWG::strict) {
5835
5871
  $et->Warn("Ignored non-standard EXIF at $path");
5836
- return 1;
5872
+ return 0;
5837
5873
  } else {
5838
5874
  $et->Warn("Non-standard EXIF at $path", 1);
5839
5875
  }
@@ -5876,10 +5912,6 @@ sub ProcessExif($$$)
5876
5912
  # also read next IFD pointer if available
5877
5913
  if ($raf->Read($buf2, $len+4) >= $len) {
5878
5914
  $buff .= $buf2;
5879
- # make copy of dirInfo since we're going to modify it
5880
- my %newDirInfo = %$dirInfo;
5881
- $dirInfo = \%newDirInfo;
5882
- # update directory parameters for the newly loaded IFD
5883
5915
  $dataPt = $$dirInfo{DataPt} = \$buff;
5884
5916
  $dataPos = $$dirInfo{DataPos} = $offset;
5885
5917
  $dataLen = $$dirInfo{DataLen} = length $buff;
@@ -6686,28 +6718,40 @@ sub ProcessExif($$$)
6686
6718
 
6687
6719
  # scan for subsequent IFD's if specified
6688
6720
  if ($$dirInfo{Multi} and $bytesFromEnd >= 4) {
6689
- my $offset = Get32u($dataPt, $dirEnd);
6690
- if ($offset) {
6691
- my $subdirStart = $offset - $dataPos;
6692
- # use same directory information for trailing directory,
6693
- # but change the start location (ProcessDirectory will
6694
- # test to make sure we don't reprocess the same dir twice)
6695
- my %newDirInfo = %$dirInfo;
6696
- $newDirInfo{DirStart} = $subdirStart;
6721
+ # use same directory information for trailing directory,
6722
+ # but change the start location (ProcessDirectory will
6723
+ # test to make sure we don't reprocess the same dir twice)
6724
+ my %newDirInfo = %$dirInfo;
6725
+ $newDirInfo{Multi} = 0; # prevent recursion
6726
+ $newDirInfo{OffsetName} = $nextOffName;
6727
+ $$et{INDENT} =~ s/..$//; # keep indent the same
6728
+ for (;;) {
6729
+ my $offset = Get32u($dataPt, $dirEnd) or last;
6730
+ $newDirInfo{DirStart} = $offset - $dataPos;
6697
6731
  # increment IFD number
6698
6732
  my $ifdNum = $newDirInfo{DirName} =~ s/(\d+)$// ? $1 : 0;
6699
6733
  $newDirInfo{DirName} .= $ifdNum + 1;
6700
- $newDirInfo{OffsetName} = $nextOffName;
6701
6734
  # must validate SubIFD1 because the nextIFD pointer is invalid for some RAW formats
6702
6735
  if ($newDirInfo{DirName} ne 'SubIFD1' or ValidateIFD(\%newDirInfo)) {
6703
- $$et{INDENT} =~ s/..$//; # keep indent the same
6704
6736
  my $cur = pop @{$$et{PATH}};
6705
6737
  $et->ProcessDirectory(\%newDirInfo, $tagTablePtr) or $success = 0;
6706
6738
  push @{$$et{PATH}}, $cur;
6739
+ if ($success and $newDirInfo{BytesFromEnd} >= 4) {
6740
+ $dataPt = $newDirInfo{DataPt};
6741
+ $dataPos = $newDirInfo{DataPos};
6742
+ $dirEnd = $newDirInfo{DirEnd};
6743
+ next;
6744
+ }
6707
6745
  } elsif ($verbose or $$et{TIFF_TYPE} eq 'TIFF') {
6708
6746
  $et->Warn('Ignored bad IFD linked from SubIFD');
6709
6747
  }
6748
+ last;
6710
6749
  }
6750
+ } elsif (defined $$dirInfo{Multi}) {
6751
+ # return necessary parameters for parsing next IFD
6752
+ $$dirInfo{DirEnd} = $dirEnd;
6753
+ $$dirInfo{OffsetName} = $nextOffName;
6754
+ $$dirInfo{BytesFromEnd} = $bytesFromEnd;
6711
6755
  }
6712
6756
  return $success;
6713
6757
  }
@@ -6731,7 +6775,7 @@ EXIF and TIFF meta information.
6731
6775
 
6732
6776
  =head1 AUTHOR
6733
6777
 
6734
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
6778
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
6735
6779
 
6736
6780
  This library is free software; you can redistribute it and/or modify it
6737
6781
  under the same terms as Perl itself.
@@ -137,7 +137,7 @@ information from FITS (Flexible Image Transport System) images.
137
137
 
138
138
  =head1 AUTHOR
139
139
 
140
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
140
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
141
141
 
142
142
  This library is free software; you can redistribute it and/or modify it
143
143
  under the same terms as Perl itself.
@@ -284,7 +284,7 @@ information from Free Lossless Audio Codec (FLAC) audio files.
284
284
 
285
285
  =head1 AUTHOR
286
286
 
287
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
287
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
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.
@@ -329,7 +329,7 @@ meta information in FLIF (Free Lossless Image Format) images.
329
329
 
330
330
  =head1 AUTHOR
331
331
 
332
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
332
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
333
333
 
334
334
  This library is free software; you can redistribute it and/or modify it
335
335
  under the same terms as Perl itself.
@@ -24,7 +24,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
24
24
  use Image::ExifTool::Exif;
25
25
  use Image::ExifTool::GPS;
26
26
 
27
- $VERSION = '1.18';
27
+ $VERSION = '1.20';
28
28
 
29
29
  sub ProcessFLIR($$;$);
30
30
  sub ProcessFLIRText($$$);
@@ -99,7 +99,7 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
99
99
  NOTES => q{
100
100
  Information extracted from FLIR FFF images and the APP1 FLIR segment of JPEG
101
101
  images. These tags may also be extracted from the first frame of an FLIR
102
- SEQ file.
102
+ SEQ file, or all frames if the ExtractEmbedded option is used.
103
103
  },
104
104
  "_header" => {
105
105
  Name => 'FFFHeader',
@@ -691,7 +691,15 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
691
691
  T => 'True North',
692
692
  },
693
693
  },
694
- # 0x48 - int32u: seen 0,77
694
+ 0x48 => { #PH (NC)
695
+ Name => 'GPSImgDirectionRef',
696
+ Format => 'string[2]',
697
+ RawConv => 'length($val) ? $val : undef',
698
+ PrintConv => {
699
+ M => 'Magnetic North',
700
+ T => 'True North',
701
+ },
702
+ },
695
703
  0x4c => {
696
704
  Name => 'GPSSpeed',
697
705
  %float2f,
@@ -702,7 +710,11 @@ my %float8g = ( Format => 'float', PrintConv => 'sprintf("%.8g",$val)' );
702
710
  %float2f,
703
711
  RawConv => '$val < 0 ? undef : $val',
704
712
  },
705
- # 0x54 - float: seen 0,-1
713
+ 0x54 => {
714
+ Name => 'GPSImgDirection',
715
+ %float2f,
716
+ RawConv => '$val < 0 ? undef : $val',
717
+ },
706
718
  0x58 => {
707
719
  Name => 'GPSMapDatum',
708
720
  Format => 'string[16]',
@@ -1457,6 +1469,7 @@ sub ProcessFLIR($$;$)
1457
1469
  my $raf = $$dirInfo{RAF} || new File::RandomAccess($$dirInfo{DataPt});
1458
1470
  my $verbose = $et->Options('Verbose');
1459
1471
  my $out = $et->Options('TextOut');
1472
+ my $base = $raf->Tell();
1460
1473
  my ($i, $hdr, $buff, $rec);
1461
1474
 
1462
1475
  # read and verify FFF header
@@ -1485,15 +1498,18 @@ sub ProcessFLIR($$;$)
1485
1498
  my $ver = Get32u(\$hdr, 0x14);
1486
1499
  last if $ver >= 100 and $ver < 200; # (have seen 100 and 101 - PH)
1487
1500
  ToggleByteOrder();
1488
- $i and $et->Warn("Unsupported FLIR $type version"), return 1;
1501
+ next unless $i;
1502
+ return 0 if $$et{DOC_NUM};
1503
+ $et->Warn("Unsupported FLIR $type version");
1504
+ return 1;
1489
1505
  }
1490
1506
 
1491
1507
  # read the FLIR record directory
1492
1508
  my $pos = Get32u(\$hdr, 0x18);
1493
1509
  my $num = Get32u(\$hdr, 0x1c);
1494
- unless ($raf->Seek($pos) and $raf->Read($buff, $num * 0x20) == $num * 0x20) {
1510
+ unless ($raf->Seek($base+$pos) and $raf->Read($buff, $num * 0x20) == $num * 0x20) {
1495
1511
  $et->Warn('Truncated FLIR FFF directory');
1496
- return 1;
1512
+ return $$et{DOC_NUM} ? 0 : 1;
1497
1513
  }
1498
1514
 
1499
1515
  unless ($tagTablePtr) {
@@ -1504,6 +1520,7 @@ sub ProcessFLIR($$;$)
1504
1520
  # process the header data
1505
1521
  $et->HandleTag($tagTablePtr, '_header', $hdr);
1506
1522
 
1523
+ my $success = 1;
1507
1524
  my $oldIndent = $$et{INDENT};
1508
1525
  $$et{INDENT} .= '| ';
1509
1526
  $et->VerboseDir($type, $num);
@@ -1533,12 +1550,22 @@ sub ProcessFLIR($$;$)
1533
1550
  $verbose and printf $out "%s%d) FLIR Record 0x%.2x, offset 0x%.4x, length 0x%.4x\n",
1534
1551
  $$et{INDENT}, $i, $recType, $recPos, $recLen;
1535
1552
 
1536
- unless ($raf->Seek($recPos) and $raf->Read($rec, $recLen) == $recLen) {
1537
- $et->Warn('Invalid FLIR record');
1553
+ # skip RawData records for embedded documents
1554
+ if ($recType == 1 and $$et{DOC_NUM}) {
1555
+ $raf->Seek($base+$recPos+$recLen) or $success = 0, last;
1556
+ next;
1557
+ }
1558
+ unless ($raf->Seek($base+$recPos) and $raf->Read($rec, $recLen) == $recLen) {
1559
+ if ($$et{DOC_NUM}) {
1560
+ $success = 0; # abort processing more documents
1561
+ } else {
1562
+ $et->Warn('Invalid FLIR record');
1563
+ }
1538
1564
  last;
1539
1565
  }
1540
1566
  if ($$tagTablePtr{$recType}) {
1541
1567
  $et->HandleTag($tagTablePtr, $recType, undef,
1568
+ Base => $base,
1542
1569
  DataPt => \$rec,
1543
1570
  DataPos => $recPos,
1544
1571
  Start => 0,
@@ -1550,7 +1577,17 @@ sub ProcessFLIR($$;$)
1550
1577
  }
1551
1578
  delete $$et{SET_GROUP0};
1552
1579
  $$et{INDENT} = $oldIndent;
1553
- return 1;
1580
+
1581
+ # extract information from subsequent frames in SEQ file if ExtractEmbedded is used
1582
+ if ($$dirInfo{RAF} and $et->Options('ExtractEmbedded') and not $$et{DOC_NUM}) {
1583
+ for (;;) {
1584
+ $$et{DOC_NUM} = $$et{DOC_COUNT} + 1;
1585
+ last unless ProcessFLIR($et, $dirInfo, $tagTablePtr);
1586
+ # (DOC_COUNT will be incremented automatically if we extracted any tags)
1587
+ }
1588
+ delete $$et{DOC_NUM};
1589
+ }
1590
+ return $success;
1554
1591
  }
1555
1592
 
1556
1593
  #------------------------------------------------------------------------------
@@ -1594,7 +1631,7 @@ Systems Inc. thermal image files (FFF, FPF and JPEG format).
1594
1631
 
1595
1632
  =head1 AUTHOR
1596
1633
 
1597
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1634
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1598
1635
 
1599
1636
  This library is free software; you can redistribute it and/or modify it
1600
1637
  under the same terms as Perl itself.
@@ -354,7 +354,7 @@ linear list when ApplyFixups() is called.
354
354
 
355
355
  =head1 AUTHOR
356
356
 
357
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
357
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
358
358
 
359
359
  This library is free software; you can redistribute it and/or modify it
360
360
  under the same terms as Perl itself.
@@ -721,7 +721,7 @@ will add AMF3 support.
721
721
 
722
722
  =head1 AUTHOR
723
723
 
724
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
724
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
725
725
 
726
726
  This library is free software; you can redistribute it and/or modify it
727
727
  under the same terms as Perl itself.
@@ -2395,7 +2395,7 @@ JPEG images.
2395
2395
 
2396
2396
  =head1 AUTHOR
2397
2397
 
2398
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2398
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2399
2399
 
2400
2400
  This library is free software; you can redistribute it and/or modify it
2401
2401
  under the same terms as Perl itself.
@@ -622,7 +622,7 @@ extracted from these formats.
622
622
 
623
623
  =head1 AUTHOR
624
624
 
625
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
625
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
626
626
 
627
627
  This library is free software; you can redistribute it and/or modify it
628
628
  under the same terms as Perl itself.
@@ -243,7 +243,7 @@ write information from the FotoWare FotoStation trailer.
243
243
 
244
244
  =head1 AUTHOR
245
245
 
246
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
246
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
247
247
 
248
248
  This library is free software; you can redistribute it and/or modify it
249
249
  under the same terms as Perl itself.
@@ -1670,7 +1670,7 @@ FujiFilm maker notes in EXIF information, and to read/write FujiFilm RAW
1670
1670
 
1671
1671
  =head1 AUTHOR
1672
1672
 
1673
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1673
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1674
1674
 
1675
1675
  This library is free software; you can redistribute it and/or modify it
1676
1676
  under the same terms as Perl itself.
@@ -68,7 +68,7 @@ General Imaging maker notes.
68
68
 
69
69
  =head1 AUTHOR
70
70
 
71
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
71
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
72
72
 
73
73
  This library is free software; you can redistribute it and/or modify it
74
74
  under the same terms as Perl itself.
@@ -20,7 +20,7 @@ use strict;
20
20
  use vars qw($VERSION);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
 
23
- $VERSION = '1.18';
23
+ $VERSION = '1.19';
24
24
 
25
25
  # road map of directory locations in GIF images
26
26
  my %gifMap = (
@@ -54,6 +54,7 @@ my %gifMap = (
54
54
  Extensions => { # (for documentation only)
55
55
  SubDirectory => { TagTable => 'Image::ExifTool::GIF::Extensions' },
56
56
  },
57
+ TransparentColor => { },
57
58
  );
58
59
 
59
60
  # GIF89a application extensions:
@@ -475,6 +476,9 @@ Block:
475
476
  my $delay = Get16u(\$buff, 1);
476
477
  $delayTime += $delay;
477
478
  $verbose and printf $out "Graphic Control: delay=%.2f\n", $delay / 100;
479
+ # get transparent colour
480
+ my $bits = Get8u(\$buff, 0);
481
+ $et->HandleTag($tagTablePtr, 'TransparentColor', Get8u(\$buff,3)) if $bits & 0x01;
478
482
  $raf->Seek(-$length, 1) or last;
479
483
 
480
484
  } elsif ($a == 0x01 and $length == 12) { # plain text extension
@@ -537,7 +541,7 @@ write GIF meta information.
537
541
 
538
542
  =head1 AUTHOR
539
543
 
540
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
544
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
541
545
 
542
546
  This library is free software; you can redistribute it and/or modify it
543
547
  under the same terms as Perl itself.
@@ -270,7 +270,7 @@ GIMP software.
270
270
 
271
271
  =head1 AUTHOR
272
272
 
273
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
273
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
274
274
 
275
275
  This library is free software; you can redistribute it and/or modify it
276
276
  under the same terms as Perl itself.
@@ -137,22 +137,26 @@ my %coordConv = (
137
137
  my ($v, $et) = @_;
138
138
  $v = $et->TimeNow() if lc($v) eq 'now';
139
139
  my @tz;
140
- if ($v =~ s/([-+])(.*)//s) { # remove timezone
140
+ if ($v =~ s/([-+])(\d{1,2}):?(\d{2})\s*(DST)?$//i) { # remove timezone
141
141
  my $s = $1 eq '-' ? 1 : -1; # opposite sign to convert back to UTC
142
142
  my $t = $2;
143
- @tz = ($s*$1, $s*$2) if $t =~ /^(\d{2}):?(\d{2})\s*$/;
143
+ @tz = ($s*$2, $s*$3);
144
144
  }
145
- my @a = ($v =~ /((?=\d|\.\d)\d*(?:\.\d*)?)/g);
146
- push @a, '00' while @a < 3;
145
+ # (note: we must allow '.' as a time separator, eg. '10.30.00', with is tricky due to decimal seconds)
146
+ # YYYYmmddHHMMSS[.ss] format
147
+ my @a = ($v =~ /^[^\d]*\d{4}[^\d]*\d{1,2}[^\d]*\d{1,2}[^\d]*(\d{1,2})[^\d]*(\d{2})[^\d]*(\d{2}(?:\.\d+)?)[^\d]*$/);
148
+ # HHMMSS[.ss] format
149
+ @a or @a = ($v =~ /^[^\d]*(\d{1,2})[^\d]*(\d{2})[^\d]*(\d{2}(?:\.\d+)?)[^\d]*$/);
150
+ @a or warn('Invalid time (use HH:MM:SS[.ss][+/-HH:MM|Z])'), return undef;
147
151
  if (@tz) {
148
152
  # adjust to UTC
149
- $a[-2] += $tz[1];
150
- $a[-3] += $tz[0];
151
- while ($a[-2] >= 60) { $a[-2] -= 60; ++$a[-3] }
152
- while ($a[-2] < 0) { $a[-2] += 60; --$a[-3] }
153
- $a[-3] = ($a[-3] + 24) % 24;
153
+ $a[1] += $tz[1];
154
+ $a[0] += $tz[0];
155
+ while ($a[1] >= 60) { $a[1] -= 60; ++$a[0] }
156
+ while ($a[1] < 0) { $a[1] += 60; --$a[0] }
157
+ $a[0] = ($a[0] + 24) % 24;
154
158
  }
155
- return "$a[-3]:$a[-2]:$a[-1]";
159
+ return join(':', @a);
156
160
  },
157
161
  },
158
162
  0x0008 => {
@@ -575,7 +579,7 @@ GPS (Global Positioning System) meta information in EXIF data.
575
579
 
576
580
  =head1 AUTHOR
577
581
 
578
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
582
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
579
583
 
580
584
  This library is free software; you can redistribute it and/or modify it
581
585
  under the same terms as Perl itself.
@@ -2242,7 +2242,7 @@ coordinates.
2242
2242
 
2243
2243
  =head1 AUTHOR
2244
2244
 
2245
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
2245
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
2246
2246
 
2247
2247
  This library is free software; you can redistribute it and/or modify it
2248
2248
  under the same terms as Perl itself.
@@ -28,7 +28,7 @@ use vars qw($VERSION);
28
28
  use Image::ExifTool qw(:Public);
29
29
  use Image::ExifTool::GPS;
30
30
 
31
- $VERSION = '1.65';
31
+ $VERSION = '1.66';
32
32
 
33
33
  sub JITTER() { return 2 } # maximum time jitter
34
34
 
@@ -210,13 +210,14 @@ sub LoadTrackLog($$;$)
210
210
  $raf->ReadLine($_) or last;
211
211
  # determine file format
212
212
  if (not $format) {
213
+ s/^\xef\xbb\xbf//; # remove leading BOM if it exists
213
214
  if (/^<(\?xml|gpx)[\s>]/) { # look for XML or GPX header
214
215
  $format = 'XML';
215
216
  # check for NMEA sentence
216
217
  # (must ONLY start with ones that have timestamps! eg. not GSA or PTNTHPR!)
217
218
  } elsif (/^.*\$([A-Z]{2}(RMC|GGA|GLL|ZDA)|PMGNTRK),/) {
218
219
  $format = 'NMEA';
219
- $nmeaStart = $2 || $1; # save type of first sentence
220
+ $nmeaStart = $2 || $1; # save type of first sentence
220
221
  } elsif (/^A(FLA|XSY|FIL)/) {
221
222
  # (don't set format yet because we want to read HFDTE first)
222
223
  $nmeaStart = 'B' ;
@@ -1423,7 +1424,7 @@ user-defined tag GPSRoll, must be active.
1423
1424
 
1424
1425
  =head1 AUTHOR
1425
1426
 
1426
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
1427
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
1427
1428
 
1428
1429
  This library is free software; you can redistribute it and/or modify it
1429
1430
  under the same terms as Perl itself.
@@ -733,7 +733,7 @@ metadata from GoPro MP4 videos.
733
733
 
734
734
  =head1 AUTHOR
735
735
 
736
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
736
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
737
737
 
738
738
  This library is free software; you can redistribute it and/or modify it
739
739
  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-2021, Phil Harvey (philharvey66 at gmail.com)
1126
+ Copyright 2003-2022, 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.
@@ -250,7 +250,7 @@ Hewlett-Packard maker notes.
250
250
 
251
251
  =head1 AUTHOR
252
252
 
253
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
253
+ Copyright 2003-2022, 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-2021, Phil Harvey (philharvey66 at gmail.com)
558
+ Copyright 2003-2022, 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.
@@ -917,7 +917,7 @@ page.
917
917
 
918
918
  =head1 AUTHOR
919
919
 
920
- Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
920
+ Copyright 2003-2022, Phil Harvey (philharvey66 at gmail.com)
921
921
 
922
922
  This library is free software; you can redistribute it and/or modify it
923
923
  under the same terms as Perl itself.