exiftool-vendored.exe 12.26.0 → 12.33.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 (53) hide show
  1. package/bin/exiftool_files/Changes +119 -4
  2. package/bin/exiftool_files/README +44 -43
  3. package/bin/exiftool_files/arg_files/xmp2exif.args +2 -1
  4. package/bin/exiftool_files/config_files/convert_regions.config +25 -14
  5. package/bin/exiftool_files/config_files/example.config +1 -1
  6. package/bin/exiftool_files/exiftool.pl +79 -66
  7. package/bin/exiftool_files/fmt_files/gpx.fmt +1 -1
  8. package/bin/exiftool_files/fmt_files/gpx_wpt.fmt +1 -1
  9. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +11 -3
  10. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +331 -0
  11. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +26 -7
  12. package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +13 -2
  13. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +98 -4
  14. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +35 -10
  15. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -0
  16. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +13 -2
  17. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +15 -3
  19. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +7 -3
  20. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +60 -26
  21. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +153 -0
  22. package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +60 -59
  23. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +103 -7
  24. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +2 -2
  25. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +14 -3
  26. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +10 -2
  27. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +9 -2
  28. package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +93 -0
  29. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +9 -12
  30. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -6
  31. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +14 -3
  32. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +27 -5
  33. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +6 -0
  34. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +105 -24
  35. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +203 -121
  36. package/bin/exiftool_files/lib/Image/ExifTool/README +5 -2
  37. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +6 -1
  38. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +47 -10
  39. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +85 -34
  40. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +65 -5
  41. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +153 -32
  42. package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +18 -11
  43. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -0
  44. package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +2 -0
  45. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +8 -4
  46. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +3 -0
  47. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +21 -4
  48. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +3 -1
  49. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +3 -1
  50. package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +121 -2
  51. package/bin/exiftool_files/lib/Image/ExifTool.pm +8867 -8835
  52. package/bin/exiftool_files/lib/Image/ExifTool.pod +58 -56
  53. package/package.json +3 -3
@@ -31,7 +31,7 @@ use strict;
31
31
  use vars qw($VERSION);
32
32
  use Image::ExifTool qw(:DataAccess :Utils);
33
33
 
34
- $VERSION = '1.19';
34
+ $VERSION = '1.21';
35
35
 
36
36
  # program map table "stream_type" lookup (ref 6/1)
37
37
  my %streamType = (
@@ -113,6 +113,8 @@ my %noSyntax = (
113
113
  0xff => 1, # program_stream_directory
114
114
  );
115
115
 
116
+ my $knotsToKph = 1.852; # knots --> km/h
117
+
116
118
  # information extracted from the MPEG-2 transport stream
117
119
  %Image::ExifTool::M2TS::Main = (
118
120
  GROUPS => { 2 => 'Video' },
@@ -327,7 +329,90 @@ sub ParsePID($$$$$)
327
329
  my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
328
330
  Image::ExifTool::QuickTime::ProcessFreeGPS($et, { DataPt => \$dat }, $tbl);
329
331
  $more = 1;
332
+ } elsif ($$dataPt =~ /^A([NS])([EW])\0/s) {
333
+ # INNOVV TS video (same format is INNOVV MP4)
334
+ SetByteOrder('II');
335
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
336
+ while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) {
337
+ my $dat = $1;
338
+ my $lat = abs(GetFloat(\$dat, 4)); # (abs just to be safe)
339
+ my $lon = abs(GetFloat(\$dat, 8)); # (abs just to be safe)
340
+ my $spd = GetFloat(\$dat, 12) * $knotsToKph;
341
+ my $trk = GetFloat(\$dat, 16);
342
+ my @acc = unpack('x20V3', $dat);
343
+ map { $_ = $_ - 4294967296 if $_ >= 0x80000000 } @acc;
344
+ Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
345
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
346
+ $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * (substr($dat,1,1) eq 'S' ? -1 : 1));
347
+ $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * (substr($dat,2,1) eq 'W' ? -1 : 1));
348
+ $et->HandleTag($tagTbl, GPSSpeed => $spd);
349
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
350
+ $et->HandleTag($tagTbl, GPSTrack => $trk);
351
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
352
+ $et->HandleTag($tagTbl, Accelerometer => "@acc");
353
+ }
354
+ SetByteOrder('MM');
355
+ $more = 1;
356
+ } elsif ($$dataPt =~ /^\$(GPSINFO|GSNRINFO),/) {
357
+ # $GPSINFO,0x0004,2021.08.09 13:27:36,2341.54561,12031.70135,8.0,51,153,0,0,\x0d
358
+ # $GSNRINFO,0.01,0.04,0.25\0
359
+ $$dataPt =~ tr/\x0d/\x0a/;
360
+ $$dataPt =~ tr/\0//d;
361
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
362
+ my @lines = split /\x0a/, $$dataPt;
363
+ my ($line, $lastTime);
364
+ foreach $line (@lines) {
365
+ if ($line =~ /^\$GPSINFO/) {
366
+ my @a = split /,/, $lines[0];
367
+ next unless @a > 7;
368
+ # ignore duplicate fixes
369
+ next if $lastTime and $a[2] eq $lastTime;
370
+ $lastTime = $a[2];
371
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
372
+ $a[2] =~ tr/./:/;
373
+ # (untested, and probably doesn't work for S/W hemispheres)
374
+ my ($lat, $lon) = @a[3,4];
375
+ Image::ExifTool::QuickTime::ConvertLatLon($lat, $lon);
376
+ # $a[0] - flags? values: '0x0001','0x0004','0x0008','0x0010'
377
+ $et->HandleTag($tagTbl, GPSDateTime => $a[2]);
378
+ $et->HandleTag($tagTbl, GPSLatitude => $lat);
379
+ $et->HandleTag($tagTbl, GPSLongitude => $lon);
380
+ $et->HandleTag($tagTbl, GPSSpeed => $a[5]);
381
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
382
+ # $a[6] - values: 48-60
383
+ $et->HandleTag($tagTbl, GPSTrack => $a[7]);
384
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
385
+ # #a[8,9] - always 0
386
+ } elsif ($line =~ /^\$GSNRINFO/) {
387
+ my @a = split /,/, $line;
388
+ shift @a;
389
+ $et->HandleTag($tagTbl, Accelerometer => "@a");
390
+ }
391
+ }
392
+ $more = 1;
393
+ } elsif ($$dataPt =~ /^.{44}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s and length($$dataPt) >= 84) {
394
+ #forum11320
395
+ SetByteOrder('II');
396
+ my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
397
+ my $lat = abs(GetFloat($dataPt, 48)); # (abs just to be safe)
398
+ my $lon = abs(GetFloat($dataPt, 56)); # (abs just to be safe)
399
+ my $spd = GetFloat($dataPt, 64);
400
+ my $trk = GetFloat($dataPt, 68);
401
+ $et->WarnOnce('GPSLatitude/Longitude encryption is not yet known, so these will be wrong');
402
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
403
+ my @date = unpack('x32V3x28V3', $$dataPt);
404
+ $date[3] += 2000;
405
+ $et->HandleTag($tagTbl, GPSDateTime => sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d', @date[3..5,0..2]));
406
+ $et->HandleTag($tagTbl, GPSLatitude => abs($lat) * ($1 eq 'S' ? -1 : 1));
407
+ $et->HandleTag($tagTbl, GPSLongitude => abs($lon) * ($2 eq 'W' ? -1 : 1));
408
+ $et->HandleTag($tagTbl, GPSSpeed => $spd);
409
+ $et->HandleTag($tagTbl, GPSSpeedRef => 'K');
410
+ $et->HandleTag($tagTbl, GPSTrack => $trk);
411
+ $et->HandleTag($tagTbl, GPSTrackRef => 'T');
412
+ SetByteOrder('MM');
413
+ $more = 1;
330
414
  }
415
+ delete $$et{DOC_NUM};
331
416
  }
332
417
  return $more;
333
418
  }
@@ -379,14 +464,21 @@ sub ProcessM2TS($$)
379
464
  );
380
465
  my %didPID = ( 1 => 0, 2 => 0, 0x1fff => 0 );
381
466
  my %needPID = ( 0 => 1 ); # lookup for stream PID's that we still need to parse
467
+ # PID's that may contain GPS info
468
+ my %gpsPID = (
469
+ 0x0300 => 1, # Novatek INNOVV
470
+ 0x01e4 => 1, # vsys a6l dashcam
471
+ );
382
472
  my $pEnd = 0;
383
473
 
384
- # scan entire file for GPS program 0x0300 if ExtractEmbedded option is 3 or higher
385
- # (some dashcams write this program but don't include it in the PMT)
474
+ # scan entire file for GPS programs if ExtractEmbedded option is 3 or higher
475
+ # (some dashcams write these programs but don't include it in the PMT)
386
476
  if (($et->Options('ExtractEmbedded') || 0) > 2) {
387
- $needPID{0x0300} = 1;
388
- $pidType{0x0300} = -1;
389
- $pidName{0x0300} = 'unregistered dashcam GPS';
477
+ foreach (keys %gpsPID) {
478
+ $needPID{$_} = 1;
479
+ $pidType{$_} = -1;
480
+ $pidName{$_} ='unregistered dashcam GPS';
481
+ }
390
482
  }
391
483
 
392
484
  # parse packets from MPEG-2 Transport Stream
@@ -675,7 +767,11 @@ sub ProcessM2TS($$)
675
767
  }
676
768
  $data{$pid} = substr($buff, $pos, $pEnd-$pos);
677
769
  } else {
678
- next unless defined $data{$pid};
770
+ unless (defined $data{$pid}) {
771
+ # (vsys a6l dashcam GPS record doesn't have a start indicator)
772
+ next unless $gpsPID{$pid};
773
+ $data{$pid} = '';
774
+ }
679
775
  # accumulate data for each elementary stream
680
776
  $data{$pid} .= substr($buff, $pos, $pEnd-$pos);
681
777
  }
@@ -52,7 +52,7 @@ my %mdDateInfo = (
52
52
  NOTES => q{
53
53
  MDItem tags are extracted using the "mdls" utility. They are extracted if
54
54
  any "MDItem*" tag or the MacOS group is specifically requested, or by
55
- setting the L<MDItemTags|../ExifTool.html#MDItemTags> API option to 1 or the L<RequestAll|../ExifTool.html#RequestAll> API option to 2 or
55
+ setting the API L<MDItemTags|../ExifTool.html#MDItemTags> option to 1 or the API L<RequestAll|../ExifTool.html#RequestAll> option to 2 or
56
56
  higher. Note that these tags do not necessarily reflect the current
57
57
  metadata of a file -- it may take some time for the MacOS mdworker daemon to
58
58
  index the file after a metadata change.
@@ -244,7 +244,7 @@ my %mdDateInfo = (
244
244
  NOTES => q{
245
245
  XAttr tags are extracted using the "xattr" utility. They are extracted if
246
246
  any "XAttr*" tag or the MacOS group is specifically requested, or by setting
247
- the L<XAttrTags|../ExifTool.html#XAttrTags> API option to 1 or the L<RequestAll|../ExifTool.html#RequestAll> API option to 2 or higher.
247
+ the API L<XAttrTags|../ExifTool.html#XAttrTags> option to 1 or the API L<RequestAll|../ExifTool.html#RequestAll> option to 2 or higher.
248
248
  And they are extracted by default from MacOS "._" files when reading
249
249
  these files directly.
250
250
  },
@@ -62,7 +62,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
62
62
  use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
64
 
65
- $VERSION = '3.96';
65
+ $VERSION = '4.00';
66
66
 
67
67
  sub LensIDConv($$$);
68
68
  sub ProcessNikonAVI($$$);
@@ -272,6 +272,7 @@ sub GetAFPointGrid($$;$);
272
272
  '9F 58 44 44 14 14 A1 06' => 'AF-S DX Nikkor 35mm f/1.8G', #27
273
273
  'A0 54 50 50 0C 0C A2 06' => 'AF-S Nikkor 50mm f/1.4G',
274
274
  'A1 40 18 37 2C 34 A3 06' => 'AF-S DX Nikkor 10-24mm f/3.5-4.5G ED',
275
+ 'A1 40 2D 53 2C 3C CB 86' => 'AF-P DX Nikkor 18-55mm f/3.5-5.6G', #30
275
276
  'A2 48 5C 80 24 24 A4 0E' => 'AF-S Nikkor 70-200mm f/2.8G ED VR II',
276
277
  'A3 3C 29 44 30 30 A5 0E' => 'AF-S Nikkor 16-35mm f/4G ED VR',
277
278
  'A4 54 37 37 0C 0C A6 06' => 'AF-S Nikkor 24mm f/1.4G ED',
@@ -495,6 +496,7 @@ sub GetAFPointGrid($$;$);
495
496
  '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
496
497
  '02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5',
497
498
  '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
499
+ '02 3B 5C 82 30 3C 02 00' => 'Sigma Zoom-K 70-210mm F4-5.6', #30
498
500
  '26 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 DG Macro',
499
501
  '56 3C 5C 8E 30 3C 1C 02' => 'Sigma 70-300mm F4-5.6 APO Macro Super II',
500
502
  'E0 3C 5C 8E 30 3C 4B 06' => 'Sigma 70-300mm F4-5.6 APO DG Macro HSM', #22
@@ -554,6 +556,7 @@ sub GetAFPointGrid($$;$);
554
556
  'F3 54 2B 50 24 24 84 0E' => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical (IF) (B005)',
555
557
  '00 3F 2D 80 2B 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) (A14)',
556
558
  '00 3F 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14)',
559
+ 'EC 3E 3C 8E 2C 40 DF 0E' => 'Tamron 28-300mm f/3.5-6.3 Di VC PZD A010', #30
557
560
  '00 40 2D 80 2C 40 00 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #NJ
558
561
  'FC 40 2D 80 2C 40 DF 06' => 'Tamron AF 18-200mm f/3.5-6.3 XR Di II LD Aspherical (IF) Macro (A14NII)', #PH (NC)
559
562
  'E6 40 2D 80 2C 40 DF 0E' => 'Tamron 18-200mm f/3.5-6.3 Di II VC (B018)', #Tanel (removed AF designation, ref 37)
@@ -595,6 +598,7 @@ sub GetAFPointGrid($$;$);
595
598
  '00 48 5C 8E 30 3C 00 06' => 'Tamron AF 70-300mm f/4-5.6 Di LD Macro 1:2 (A17NII)', #JD
596
599
  'F1 47 5C 8E 30 3C DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A005)',
597
600
  'CF 47 5C 8E 31 3D DF 0E' => 'Tamron SP 70-300mm f/4-5.6 Di VC USD (A030)', #forum9773
601
+ 'CC 44 68 98 34 41 DF 0E' => 'Tamron 100-400mm f/4.5-6.3 Di VC USD', #30
598
602
  'EB 40 76 A6 38 40 DF 0E' => 'Tamron SP AF 150-600mm f/5-6.3 VC USD (A011)',
599
603
  'E3 40 76 A6 38 40 DF 4E' => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #30
600
604
  '20 3C 80 98 3D 3D 1E 02' => 'Tamron AF 200-400mm f/5.6 LD IF (75D)',
@@ -612,6 +616,7 @@ sub GetAFPointGrid($$;$);
612
616
  '7A 48 1C 29 24 24 7E 06' => 'Tokina AT-X 116 PRO DX II (AF 11-16mm f/2.8)',
613
617
  '80 48 1C 29 24 24 7A 06' => 'Tokina atx-i 11-16mm F2.8 CF', #exiv2 issue 1078
614
618
  '7A 48 1C 30 24 24 7E 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)',
619
+ '8B 48 1C 30 24 24 85 06' => 'Tokina AT-X 11-20 F2.8 PRO DX (AF 11-20mm f/2.8)', #forum12687
615
620
  '00 3C 1F 37 30 30 00 06' => 'Tokina AT-X 124 AF PRO DX (AF 12-24mm f/4)',
616
621
  '7A 3C 1F 37 30 30 7E 06.2' => 'Tokina AT-X 124 AF PRO DX II (AF 12-24mm f/4)',
617
622
  '7A 3C 1F 3C 30 30 7E 06' => 'Tokina AT-X 12-28 PRO DX (AF 12-28mm f/4)',
@@ -718,6 +723,9 @@ sub GetAFPointGrid($$;$);
718
723
  '00 40 11 11 2C 2C 00 00' => 'Samyang 8mm f/3.5 Fish-Eye',
719
724
  '00 58 64 64 20 20 00 00' => 'Soligor C/D Macro MC 90mm f/2.5',
720
725
  '4A 58 30 30 14 0C 4D 02' => 'Rokinon 20mm f/1.8 ED AS UMC', #30
726
+ #
727
+ 'A0 56 44 44 14 14 A2 06' => 'Sony FE 35mm F1.8', #IB (Techart adapter)
728
+ 'A0 37 5C 8E 34 3C A2 06' => 'Sony FE 70-300mm F4.5-5.6 G OSS', #IB (Techart adapter)
721
729
  );
722
730
 
723
731
  # text encoding used in LocationInfo (ref PH)
@@ -4720,6 +4728,9 @@ my %nikonFocalConversions = (
4720
4728
  21 => 'Nikkor Z 50mm f/1.2 S', #IB
4721
4729
  22 => 'Nikkor Z 24-50mm f/4-6.3', #IB
4722
4730
  23 => 'Nikkor Z 14-24mm f/2.8 S', #IB
4731
+ 24 => 'Nikkor Z MC 105mm f/2.8 VR S', #IB
4732
+ 27 => 'Nikkor Z MC 50mm f/2.8', #IB
4733
+ 29 => 'Nikkor Z 28mm f/2.8', #IB
4723
4734
  },
4724
4735
  },
4725
4736
  0x36 => {
@@ -8492,8 +8503,8 @@ my %nikonFocalConversions = (
8492
8503
  # 0x02 - undef[148]
8493
8504
  # 0x03 - undef[284]
8494
8505
  # 0x04 - undef[148,212]
8495
- # 0x05 - undef[84]
8496
- # 0x06 - undef[116]
8506
+ # 0x05 - undef[84] (barrel distortion params at offsets 0x14,0x1c,0x24, ref 28)
8507
+ # 0x06 - undef[116] (vignette correction params at offsets 0x24,0x34,0x44, ref 28)
8497
8508
  # 0x07 - undef[104]
8498
8509
  # 0x08 - undef[24]
8499
8510
  # 0x09 - undef[36]
@@ -17,7 +17,7 @@ use strict;
17
17
  use vars qw($VERSION);
18
18
  use Image::ExifTool qw(:DataAccess :Utils);
19
19
 
20
- $VERSION = '1.03';
20
+ $VERSION = '1.04';
21
21
 
22
22
  sub ProcessNikonSettings($$$);
23
23
 
@@ -592,7 +592,7 @@ my %infoD6 = (
592
592
  },
593
593
  },
594
594
  0x026 => { Name => 'AF-AssistIlluminator', PrintConv => \%onOff }, # CSa11 (Z7_2)
595
- # 0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa18 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens
595
+ 0x027 => { Name => 'ManualFocusRingInAFMode', PrintConv => \%onOff }, # CSa12 (D6,Z7_2) capability documented in manual, but visibility (& ability to test) requires a compatible lens
596
596
  0x029 => { Name => 'ISOStepSize', PrintConv => \%thirdHalfFull }, # CSb1 (D6)
597
597
  0x02a => { Name => 'ExposureControlStepSize', PrintConv => \%thirdHalfFull }, # CSb2 (D6), CSb1 (Z7_2)
598
598
  0x02b => { # CSb4 (D6), CSb2 (Z7_2)
@@ -1920,6 +1920,14 @@ my %infoD6 = (
1920
1920
  },
1921
1921
  },
1922
1922
  0x170 => { Name => 'PreferSubSelectorCenter', PrintConv => \%offOn }, # CSf13 (D6 firmware v1.2.0)
1923
+ 0x171 => { # CSb8 (D6 firmware v1.3.0)
1924
+ Name => 'KeepExposureWithTeleconverter',
1925
+ PrintConv => {
1926
+ 1 => 'Off',
1927
+ 2 => 'Shutter Speed',
1928
+ 3 => 'ISO',
1929
+ },
1930
+ },
1923
1931
  0x174 => { # CSa17-d (D6 firmware v1.2.0)
1924
1932
  Name => 'FocusPointSelectionSpeed',
1925
1933
  PrintConv => {
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
40
40
  use Image::ExifTool::Exif;
41
41
  use Image::ExifTool::APP12;
42
42
 
43
- $VERSION = '2.71';
43
+ $VERSION = '2.75';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -113,6 +113,8 @@ my %olympusLensTypes = (
113
113
  '0 34 00' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
114
114
  '0 34 10' => 'Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro', #IB
115
115
  '0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
116
+ '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB
117
+ '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
116
118
  # Sigma lenses
117
119
  '1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8
118
120
  '1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ
@@ -138,7 +140,6 @@ my %olympusLensTypes = (
138
140
  '1 15 00' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11
139
141
  '1 16 00' => 'Sigma APO 70-200mm F2.8 II EX DG Macro HSM', #11
140
142
  '1 17 00' => 'Sigma 50mm F1.4 EX DG HSM', #11
141
- '1 18 60' => 'Test',
142
143
  # Panasonic/Leica lenses
143
144
  '2 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
144
145
  '2 01 10' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16
@@ -183,6 +184,7 @@ my %olympusLensTypes = (
183
184
  '2 36 10' => 'Leica DG Elmarit 200mm F2.8 Power OIS', #IB
184
185
  '2 37 10' => 'Leica DG Vario-Elmarit 50-200mm F2.8-4 Asph. Power OIS', #IB
185
186
  '2 38 10' => 'Leica DG Vario-Summilux 10-25mm F1.7 Asph.', #IB
187
+ '2 40 10' => 'Leica DG Vario-Summilux 25-50mm F1.7 Asph.', #IB (H-X2550)
186
188
  '3 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
187
189
  '3 02 00' => 'Leica D Summilux 25mm F1.4 Asph.', #11
188
190
  # Tamron lenses
@@ -429,6 +431,7 @@ my %olympusCameraTypes = (
429
431
  S0085 => 'E-PL10', #IB
430
432
  S0089 => 'E-M5MarkIII',
431
433
  S0092 => 'E-M1MarkIII', #IB
434
+ S0093 => 'E-P7', #IB
432
435
  SR45 => 'D220',
433
436
  SR55 => 'D320L',
434
437
  SR83 => 'D340L',
@@ -3606,6 +3609,10 @@ my %indexInfo = (
3606
3609
  Format => 'string[24]',
3607
3610
  Groups => { 2 => 'Time' },
3608
3611
  },
3612
+ 0x17f => {
3613
+ Name => 'LensModel',
3614
+ Format => 'string[32]'
3615
+ },
3609
3616
  );
3610
3617
 
3611
3618
  # yet a different "thmb" atom format (PH, E-M5)
@@ -0,0 +1,93 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: Other.pm
3
+ #
4
+ # Description: Read meta information from other uncommon formats
5
+ #
6
+ # Revisions: 2021/07/16 - P. Harvey Created
7
+ #
8
+ # References: 1) PFM - http://www.pauldebevec.com/Research/HDR/PFM/
9
+ #------------------------------------------------------------------------------
10
+
11
+ package Image::ExifTool::Other;
12
+
13
+ use strict;
14
+ use vars qw($VERSION);
15
+ use Image::ExifTool qw(:DataAccess :Utils);
16
+ use Image::ExifTool::Exif;
17
+
18
+ $VERSION = '1.00';
19
+
20
+ # Other info
21
+ %Image::ExifTool::Other::PFM = (
22
+ GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Image' },
23
+ VARS => { NO_ID => 1 },
24
+ NOTES => q{
25
+ Tags extracted from Portable FloatMap images. See
26
+ L<http://www.pauldebevec.com/Research/HDR/PFM/> for the specification.
27
+ },
28
+ ColorSpace => { PrintConv => { PF => 'RGB', 'Pf' => 'Monochrome'} },
29
+ ImageWidth => { },
30
+ ImageHeight => { },
31
+ ByteOrder => { PrintConv => '$val > 0 ? "Big-endian" : "Little-endian"' },
32
+ );
33
+
34
+ #------------------------------------------------------------------------------
35
+ # Extract information from a Portable FloatMap image
36
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference
37
+ # Returns: 1 on success, 0 if this wasn't a valid PFM file
38
+ sub ProcessPFM2($$)
39
+ {
40
+ my ($et, $dirInfo) = @_;
41
+ my $raf = $$dirInfo{RAF};
42
+ my $buff;
43
+ return 0 unless $raf->Read($buff, 256) and $buff =~ /^(P[Ff])\x0a(\d+) (\d+)\x0a([-+0-9.]+)\x0a/;
44
+ $et->SetFileType('PFM', 'image/x-pfm');
45
+ my $tagTablePtr = GetTagTable('Image::ExifTool::Other::PFM');
46
+ $et->HandleTag($tagTablePtr, ColorSpace => $1);
47
+ $et->HandleTag($tagTablePtr, ImageWidth => $2);
48
+ $et->HandleTag($tagTablePtr, ImageHeight => $3);
49
+ $et->HandleTag($tagTablePtr, ByteOrder => $4);
50
+ # hack to set proper file description (extension is the same for Printer Font Metrics files)
51
+ $Image::ExifTool::static_vars{OverrideFileDescription}{PFM} = 'Portable FloatMap',
52
+ return 1;
53
+ }
54
+
55
+ 1; # end
56
+
57
+ __END__
58
+
59
+ =head1 NAME
60
+
61
+ Image::ExifTool::Other - Read meta information from other uncommon formats
62
+
63
+ =head1 SYNOPSIS
64
+
65
+ This module is used by Image::ExifTool
66
+
67
+ =head1 DESCRIPTION
68
+
69
+ This module contains routines required by Image::ExifTool to extract
70
+ information from Portable FloatMap (PFM) images.
71
+
72
+ =head1 AUTHOR
73
+
74
+ Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
75
+
76
+ This library is free software; you can redistribute it and/or modify it
77
+ under the same terms as Perl itself.
78
+
79
+ =head1 REFERENCES
80
+
81
+ =over 4
82
+
83
+ =item PFM L<http://www.pauldebevec.com/Research/HDR/PFM/>
84
+
85
+ =back
86
+
87
+ =head1 SEE ALSO
88
+
89
+ L<Image::ExifTool::TagNames/Other Tags>,
90
+ L<Image::ExifTool(3pm)|Image::ExifTool>
91
+
92
+ =cut
93
+
@@ -21,7 +21,7 @@ use vars qw($VERSION $AUTOLOAD $lastFetched);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
  require Exporter;
23
23
 
24
- $VERSION = '1.51';
24
+ $VERSION = '1.53';
25
25
 
26
26
  sub FetchObject($$$$);
27
27
  sub ExtractObject($$;$$);
@@ -280,7 +280,10 @@ my %supportedFilter = (
280
280
  ConvertToDict => 1,
281
281
  },
282
282
  Cs1 => {
283
- SubDirectory => { TagTable => 'Image::ExifTool::PDF::Cs1' },
283
+ SubDirectory => { TagTable => 'Image::ExifTool::PDF::ICCBased' },
284
+ },
285
+ CS0 => {
286
+ SubDirectory => { TagTable => 'Image::ExifTool::PDF::ICCBased' },
284
287
  },
285
288
  );
286
289
 
@@ -291,14 +294,7 @@ my %supportedFilter = (
291
294
  },
292
295
  );
293
296
 
294
- # tags in PDF Cs1 dictionary
295
- %Image::ExifTool::PDF::Cs1 = (
296
- _stream => {
297
- SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
298
- },
299
- );
300
-
301
- # tags in PDF ICCBased dictionary
297
+ # tags in PDF ICCBased, Cs1 and CS0 dictionaries
302
298
  %Image::ExifTool::PDF::ICCBased = (
303
299
  _stream => {
304
300
  SubDirectory => { TagTable => 'Image::ExifTool::ICC_Profile::Main' },
@@ -1989,16 +1985,17 @@ sub ProcessDict($$$$;$$)
1989
1985
  } else {
1990
1986
  $val = ReadPDFValue($val);
1991
1987
  }
1992
- # convert from UTF-16 (big endian) to UTF-8 or Latin if necessary
1993
- # unless this is binary data (hex-encoded strings would not have been converted)
1994
1988
  if (ref $val) {
1995
1989
  if (ref $val eq 'ARRAY') {
1990
+ delete $$et{LIST_TAGS}{$tagInfo} if $$tagInfo{List};
1996
1991
  my $v;
1997
1992
  foreach $v (@$val) {
1998
1993
  $et->FoundTag($tagInfo, $v);
1999
1994
  }
2000
1995
  }
2001
1996
  } elsif (defined $val) {
1997
+ # convert from UTF-16 (big endian) to UTF-8 or Latin if necessary
1998
+ # unless this is binary data (hex-encoded strings would not have been converted)
2002
1999
  my $format = $$tagInfo{Format} || $$tagInfo{Writable} || 'string';
2003
2000
  $val = ConvertPDFDate($val) if $format eq 'date';
2004
2001
  if (not $$tagInfo{Binary} and $val =~ /[\x18-\x1f\x80-\xff]/) {
@@ -36,7 +36,7 @@ use strict;
36
36
  use vars qw($VERSION $AUTOLOAD %stdCase);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
 
39
- $VERSION = '1.57';
39
+ $VERSION = '1.59';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -89,7 +89,7 @@ $Image::ExifTool::PNG::colorType = -1;
89
89
 
90
90
  # data and text chunk types
91
91
  my %isDatChunk = ( IDAT => 1, JDAT => 1, JDAA => 1 );
92
- my %isTxtChunk = ( tEXt => 1, zTXt => 1, iTXt => 1 );
92
+ my %isTxtChunk = ( tEXt => 1, zTXt => 1, iTXt => 1, eXIf => 1 );
93
93
 
94
94
  # chunks that we shouldn't move other chunks across (ref 3)
95
95
  my %noLeapFrog = ( SAVE => 1, SEEK => 1, IHDR => 1, JHDR => 1, IEND => 1, MEND => 1,
@@ -478,6 +478,8 @@ my %unreg = ( Notes => 'unregistered' );
478
478
  if the L<Compress|../ExifTool.html#Compress> option is used and Compress::Zlib is available. Raw profile
479
479
  information is always created as compressed zTXt if Compress::Zlib is
480
480
  available, or tEXt otherwise. Standard XMP is written as uncompressed iTXt.
481
+ User-defined tags may set an 'iTXt' flag in the tag definition to be written
482
+ only as iTXt.
481
483
 
482
484
  Alternate languages are accessed by suffixing the tag name with a '-',
483
485
  followed by an RFC 3066 language code (eg. "PNG:Comment-fr", or
@@ -1382,9 +1384,8 @@ sub ProcessPNG($$)
1382
1384
  # to add it as a text profile chunk if this isn't successful
1383
1385
  # (ie. if Compress::Zlib wasn't available)
1384
1386
  Add_iCCP($et, $outfile);
1385
- AddChunks($et, $outfile) or $err = 1; # all all text chunks
1386
- # add EXIF before end chunk if not found already
1387
- AddChunks($et, $outfile, 'IFD0') if $chunk eq $endChunk;
1387
+ AddChunks($et, $outfile) or $err = 1; # add all text chunks
1388
+ AddChunks($et, $outfile, 'IFD0') or $err = 1; # and eXIf chunk
1388
1389
  } elsif ($chunk eq 'PLTE') {
1389
1390
  # iCCP chunk must come before PLTE (and IDAT, handled above)
1390
1391
  # (ignore errors -- will add later as text profile if this fails)
@@ -1444,7 +1445,7 @@ sub ProcessPNG($$)
1444
1445
  } else {
1445
1446
  $msg = 'fixed';
1446
1447
  }
1447
- $et->WarnOnce("Text chunk(s) found after $$et{FileType} $wasDat ($msg)", 1);
1448
+ $et->WarnOnce("Text/EXIF chunk(s) found after $$et{FileType} $wasDat ($msg)", 1);
1448
1449
  }
1449
1450
  # read chunk data and CRC
1450
1451
  unless ($raf->Read($dbuf,$len)==$len and $raf->Read($cbuf, 4)==4) {
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
  use Image::ExifTool::Exif;
39
39
 
40
- $VERSION = '2.14';
40
+ $VERSION = '2.16';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -449,7 +449,7 @@ my %shootingMode = (
449
449
  same as the number printed on the camera body
450
450
  },
451
451
  PrintConv => q{
452
- return $val unless $val=~/^([A-Z]\d{2})(\d{2})(\d{2})(\d{2})(\d{4})/;
452
+ return $val unless $val=~/^([A-Z][0-9A-Z]{2})(\d{2})(\d{2})(\d{2})(\d{4})/;
453
453
  my $yr = $2 + ($2 < 70 ? 2000 : 1900);
454
454
  return "($1) $yr:$3:$4 no. $5";
455
455
  },
@@ -1423,7 +1423,18 @@ my %shootingMode = (
1423
1423
  Name => 'NoiseReductionStrength',
1424
1424
  Writable => 'rational64s',
1425
1425
  },
1426
- # 0xe4 - LensID (ref IB)
1426
+ 0xe4 => { #IB
1427
+ Name => 'LensTypeModel',
1428
+ Condition => '$format eq "int16u"',
1429
+ Writable => 'int16u',
1430
+ RawConv => q{
1431
+ return undef unless $val;
1432
+ require Image::ExifTool::Olympus; # (to load Composite LensID)
1433
+ return $val;
1434
+ },
1435
+ ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_',
1436
+ ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)',
1437
+ },
1427
1438
  0x0e00 => {
1428
1439
  Name => 'PrintIM',
1429
1440
  Description => 'Print Image Matching',
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
58
58
  use Image::ExifTool::GPS;
59
59
  use Image::ExifTool::HP;
60
60
 
61
- $VERSION = '3.37';
61
+ $VERSION = '3.39';
62
62
 
63
63
  sub CryptShutterCount($$);
64
64
  sub PrintFilter($$$);
@@ -340,6 +340,7 @@ sub DecodeAFPoints($$$$;$);
340
340
  '8 64' => 'HD PENTAX-D FA* 50mm F1.4 SDM AW', #27
341
341
  '8 65' => 'HD PENTAX-D FA 70-210mm F4 ED SDM WR', #PH
342
342
  '8 66' => 'HD PENTAX-D FA 85mm F1.4 ED SDM AW', #James O'Neill
343
+ '8 195' => 'HD PENTAX DA* 16-50mm F2.8 ED PLM AW', #27
343
344
  '8 196' => 'HD PENTAX-DA* 11-18mm F2.8 ED DC AW', #29
344
345
  '8 197' => 'HD PENTAX-DA 55-300mm F4.5-6.3 ED PLM WR RE', #29
345
346
  '8 198' => 'smc PENTAX-DA L 18-50mm F4-5.6 DC WR RE', #29
@@ -2223,6 +2224,7 @@ my %binaryDataAttrs = (
2223
2224
  17 => '17 (K-70)', #29
2224
2225
  18 => '18 (KP)', #PH
2225
2226
  19 => '19 (GR III)', #PH
2227
+ 20 => '20 (K-3III)', #PH
2226
2228
  },
2227
2229
  },
2228
2230
  0x0067 => { #PH (K-5)
@@ -2455,6 +2457,7 @@ my %binaryDataAttrs = (
2455
2457
  '2 0' => 'Standard',
2456
2458
  '3 0' => 'Fast',
2457
2459
  # '1 108' - seen for GR III
2460
+ # '3 84' - seen for K-3III
2458
2461
  },
2459
2462
  },
2460
2463
  0x007b => { #PH (K-5)
@@ -2598,8 +2601,9 @@ my %binaryDataAttrs = (
2598
2601
  },
2599
2602
  },
2600
2603
  },
2601
- 0x0095 => { #31
2604
+ 0x0095 => [{ #31
2602
2605
  Name => 'SkinToneCorrection',
2606
+ Condition => '$count == 2',
2603
2607
  Writable => 'int8s',
2604
2608
  Count => 2,
2605
2609
  PrintConv => {
@@ -2607,7 +2611,15 @@ my %binaryDataAttrs = (
2607
2611
  '1 1' => 'On (type 1)',
2608
2612
  '1 2' => 'On (type 2)',
2609
2613
  },
2610
- },
2614
+ },{
2615
+ Name => 'SkinToneCorrection',
2616
+ Condition => '$count == 3',
2617
+ Writable => 'int8s',
2618
+ Count => 3,
2619
+ PrintConv => {
2620
+ '0 0 0' => 'Off',
2621
+ },
2622
+ }],
2611
2623
  0x0096 => { #31
2612
2624
  Name => 'ClarityControl',
2613
2625
  Writable => 'int8s',
@@ -2843,8 +2855,18 @@ my %binaryDataAttrs = (
2843
2855
  # High: 0000000238c0e960fde0f9203140f5a0fce0f1e031403f00e600fb00f7803760f120fc60ef403460
2844
2856
  # Very High:000000023d20e520fdc0f7203420f4c0fb60ee6036404400e120fae0f5403aa0f020fac0eb403a00
2845
2857
  },
2846
- # 0x021c - undef[18] (K-5)
2847
- # 0x021d - undef[18] (K-5)
2858
+ 0x021c => { #IB
2859
+ Name => 'ColorMatrixA2',
2860
+ Format => 'int16s',
2861
+ Writable => 'undef',
2862
+ Count => 9,
2863
+ },
2864
+ 0x021d => { #IB
2865
+ Name => 'ColorMatrixB2',
2866
+ Format => 'int16s',
2867
+ Writable => 'undef',
2868
+ Count => 9,
2869
+ },
2848
2870
  # 0x021e - undef[8] (K-5, Q)
2849
2871
  0x021f => { #JD
2850
2872
  Name => 'AFInfo',
@@ -988,6 +988,12 @@ sub ProcessPhotoshop($$$)
988
988
  $size += 1 if $size & 0x01; # size is padded to an even # bytes
989
989
  $pos += $size;
990
990
  }
991
+ # warn about incorrect IPTCDigest
992
+ if ($$et{VALUE}{IPTCDigest} and $$et{VALUE}{CurrentIPTCDigest} and
993
+ $$et{VALUE}{IPTCDigest} ne $$et{VALUE}{CurrentIPTCDigest})
994
+ {
995
+ $et->WarnOnce('IPTCDigest is not current. XMP may be out of sync');
996
+ }
991
997
  delete $$et{LOW_PRIORITY_DIR}{'*'};
992
998
  return $success;
993
999
  }