exiftool-vendored.exe 13.26.0 → 13.30.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 (45) hide show
  1. package/LICENSE +254 -254
  2. package/bin/README.txt +14 -14
  3. package/bin/exiftool.exe +0 -0
  4. package/bin/exiftool_files/exiftool.pl +7 -8
  5. package/bin/exiftool_files/lib/CPAN/Config.pm +98 -98
  6. package/bin/exiftool_files/lib/Config.pm +111 -111
  7. package/bin/exiftool_files/lib/Config_git.pl +12 -12
  8. package/bin/exiftool_files/lib/Config_heavy.pl +1470 -1470
  9. package/bin/exiftool_files/lib/DynaLoader.pm +761 -761
  10. package/bin/exiftool_files/lib/Errno.pm +2638 -2638
  11. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +1 -1
  12. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +4 -2
  13. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +3 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +2 -1
  15. package/bin/exiftool_files/lib/Image/ExifTool/GIMP.pm +1 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
  17. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +20 -8
  18. package/bin/exiftool_files/lib/Image/ExifTool/LigoGPS.pm +16 -2
  19. package/bin/exiftool_files/lib/Image/ExifTool/MPF.pm +5 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +3 -3
  21. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +6 -2
  22. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +9 -1
  23. package/bin/exiftool_files/lib/Image/ExifTool/Parrot.pm +54 -7
  24. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +151 -11
  25. package/bin/exiftool_files/lib/Image/ExifTool/Plot.pm +36 -15
  26. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +73 -6
  27. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +80 -14
  28. package/bin/exiftool_files/lib/Image/ExifTool/README +12 -2
  29. package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +12 -4
  30. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +8 -3
  31. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +3745 -3729
  32. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +147 -89
  33. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +2 -0
  34. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +3 -0
  35. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +18 -7
  36. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +2 -2
  37. package/bin/exiftool_files/lib/Image/ExifTool.pm +12 -7
  38. package/bin/exiftool_files/lib/Image/ExifTool.pod +11 -11
  39. package/bin/exiftool_files/lib/Win32/FindFile.pm +82 -82
  40. package/bin/exiftool_files/lib/Win32API/File/cFile.pc +168 -168
  41. package/bin/exiftool_files/lib/XSLoader.pm +372 -372
  42. package/bin/exiftool_files/lib/auto/Compress/Raw/Lzma/autosplit.ix +3 -3
  43. package/bin/exiftool_files/readme_windows.txt +16 -16
  44. package/bin/exiftool_files/windows_exiftool.txt +15 -9
  45. package/package.json +54 -53
@@ -995,7 +995,7 @@ TagID: foreach $tagID (@keys) {
995
995
  if ($format and $format =~ /\$val\{/ and
996
996
  ($$tagInfo{Writable} or not defined $$tagInfo{Writable}))
997
997
  {
998
- warn "Warning: \$var{} used in Format of writable tag - $short $name\n"
998
+ warn "Warning: \$val{} used in Format of writable tag - $short $name\n"
999
999
  }
1000
1000
  }
1001
1001
  if ($$tagInfo{Hidden}) {
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.89';
91
+ $VERSION = '4.91';
92
92
 
93
93
  # Note: Removed 'USM' from 'L' lenses since it is redundant - PH
94
94
  # (or is it? Ref 32 shows 5 non-USM L-type lenses)
@@ -638,6 +638,7 @@ $VERSION = '4.89';
638
638
  '61182.60' => 'Canon RF 16-28mm F2.8 IS STM', #42
639
639
  '61182.61' => 'Canon RF 50mm F1.4 L VCM', #42
640
640
  '61182.62' => 'Canon RF 24mm F1.4 L VCM', #42
641
+ '61182.63' => 'Canon RF 20mm F1.4 L VCM', #42
641
642
  65535 => 'n/a',
642
643
  );
643
644
 
@@ -1410,7 +1411,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1410
1411
  },
1411
1412
  {
1412
1413
  Name => 'CanonCameraInfoR6m2',
1413
- Condition => '$$self{Model} =~ /\bEOS R6m2$/',
1414
+ Condition => '$$self{Model} =~ /\bEOS (R6m2|R8|R50)$/',
1414
1415
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::CameraInfoR6m2' },
1415
1416
  },
1416
1417
  {
@@ -7033,6 +7034,7 @@ my %ciMaxFocal = (
7033
7034
  323 => 'Canon RF 16-28mm F2.8 IS STM', #42
7034
7035
  325 => 'Canon RF 50mm F1.4 L VCM', #42
7035
7036
  326 => 'Canon RF 24mm F1.4 L VCM', #42
7037
+ 327 => 'Canon RF 20mm F1.4 L VCM', #42
7036
7038
  # Note: add new RF lenses to %canonLensTypes with ID 61182
7037
7039
  },
7038
7040
  },
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
57
57
  use Image::ExifTool qw(:DataAccess :Utils);
58
58
  use Image::ExifTool::MakerNotes;
59
59
 
60
- $VERSION = '4.56';
60
+ $VERSION = '4.57';
61
61
 
62
62
  sub ProcessExif($$$);
63
63
  sub WriteExif($$$);
@@ -5804,6 +5804,8 @@ sub PrintLensID($$@)
5804
5804
  }
5805
5805
  if ($$et{Make} eq 'SONY') {
5806
5806
  if ($lensType eq 65535) {
5807
+ # patch for manual lens (forum17379)
5808
+ return $$printConv{$lensType} if $$printConv{$lensType} and not $focalLength and $maxAperture == 1;
5807
5809
  # handle Sony E-type lenses when LensType2 isn't valid (NEX/ILCE models only)
5808
5810
  if ($$et{Model} =~ /NEX|ILCE/) {
5809
5811
  unless (%sonyEtype) {
@@ -31,7 +31,7 @@ use vars qw($VERSION);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
  use Image::ExifTool::Exif;
33
33
 
34
- $VERSION = '1.96';
34
+ $VERSION = '1.97';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -628,6 +628,7 @@ my %faceCategories = (
628
628
  0x60006 => 'Partial Color Purple',
629
629
  0x70000 => 'Soft Focus',
630
630
  0x90000 => 'Low Key',
631
+ 0x100000 => 'Light Leak', #forum17392
631
632
  },
632
633
  },
633
634
  0x1210 => { #2
@@ -279,7 +279,7 @@ under the same terms as Perl itself.
279
279
 
280
280
  =over 4
281
281
 
282
- =item L<GIMP source code>
282
+ =item L<https://developer.gimp.org/core/setup/git/>
283
283
 
284
284
  =item L<http://svn.gnome.org/viewvc/gimp/trunk/devel-docs/xcf.txt?view=markup>
285
285
 
@@ -260,15 +260,9 @@ sub ProcessJPEG_HDR($$$);
260
260
  Condition => '$$valPt =~ /^UNICODE\0/',
261
261
  Notes => 'PhotoStudio Unicode comment',
262
262
  }, {
263
- Name => 'HDRGainCurve', #PH (NC)
263
+ Name => 'HDRGainInfo', #PH (NC)
264
264
  Condition => '$$valPt =~ /^AROT\0\0.{4}/s',
265
- Groups => { 1 => 'APP10', 2 => 'Image' },
266
- ValueConv => q{
267
- my $n = unpack('x6N', $val);
268
- return '<truncated AROT data>' if length($val)-6 < $n * 4;
269
- my $str = join ' ', unpack("x10V$n", $val);
270
- return \$str;
271
- },
265
+ SubDirectory => { TagTable => 'Image::ExifTool::JPEG::HDRGainInfo' },
272
266
  }],
273
267
  APP11 => [{
274
268
  Name => 'JPEG-HDR',
@@ -347,6 +341,9 @@ sub ProcessJPEG_HDR($$$);
347
341
  $$valPt =~ /~\0\x04\0zmie~\0\0\x0a.{8}[\x10\x18]\x08$/s
348
342
  },
349
343
  SubDirectory => { TagTable => 'Image::ExifTool::MIE::Main' },
344
+ }, {
345
+ Name => 'MPF',
346
+ SubDirectory => { TagTable => 'Image::ExifTool::MPF::Main' },
350
347
  }, {
351
348
  Name => 'Samsung',
352
349
  Condition => '$$valPt =~ /QDIOBS$/',
@@ -382,6 +379,21 @@ sub ProcessJPEG_HDR($$$);
382
379
  }],
383
380
  );
384
381
 
382
+ # HDR gain information (ref PH)
383
+ %Image::ExifTool::JPEG::HDRGainInfo = (
384
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
385
+ GROUPS => { 0 => 'APP10', 1 => 'AROT', 2 => 'Image' },
386
+ 6 => {
387
+ Name => 'HDRGainCurveSize',
388
+ Format => 'int32u',
389
+ },
390
+ 10 => {
391
+ Name => 'HDRGainCurve', # (NC)
392
+ Format => 'int32uRev[$val{6}]',
393
+ Binary => 1,
394
+ },
395
+ );
396
+
385
397
  # JPS APP3 segment (ref http://paulbourke.net/stereographics/stereoimage/)
386
398
  %Image::ExifTool::JPEG::JPS = (
387
399
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -11,7 +11,7 @@ use strict;
11
11
  use vars qw($VERSION);
12
12
  use Image::ExifTool;
13
13
 
14
- $VERSION = '1.02';
14
+ $VERSION = '1.05';
15
15
 
16
16
  sub ProcessLigoGPS($$$;$);
17
17
  sub ProcessLigoJSON($$$);
@@ -264,6 +264,20 @@ sub ParseLigoGPS($$$;$)
264
264
  delete $$et{SET_GROUP1};
265
265
  }
266
266
 
267
+ #------------------------------------------------------------------------------
268
+ # Process GKU dashcam trailer containing JSON-format LigoGPS
269
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
270
+ # Returns: 1 on success
271
+ sub ProcessGKU($$$;$)
272
+ {
273
+ my ($et, $dirInfo, $tagTbl) = @_;
274
+ my $dataPt = $$dirInfo{DataPt};
275
+ my $pos = unpack('V', $$dataPt);
276
+ return 0 if $pos + 13 > length $$dataPt or substr($$dataPt, $pos, 13) ne 'LIGOGPSINFO {';
277
+ pos($$dataPt) = $pos;
278
+ return ProcessLigoJSON($et, $dirInfo, $tagTbl);
279
+ }
280
+
267
281
  #------------------------------------------------------------------------------
268
282
  # Process LIGOGPSINFO data (non-JSON format)
269
283
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -315,7 +329,7 @@ sub ProcessLigoJSON($$$)
315
329
  my $dataPt = $$dirInfo{DataPt};
316
330
  my $dirLen = $$dirInfo{DirLen};
317
331
  require Image::ExifTool::Import;
318
- $et->VerboseDir('LIGO_JSON', undef, length($$dataPt));
332
+ $et->VerboseDir('LIGO_JSON', undef, length($$dataPt) - (pos($$dataPt) || 0));
319
333
  $$et{SET_GROUP1} = 'LIGO';
320
334
  while ($$dataPt =~ /LIGOGPSINFO (\{.*?\})/g) {
321
335
  my $json = $1;
@@ -15,7 +15,7 @@ use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
  use Image::ExifTool::Exif;
17
17
 
18
- $VERSION = '1.15';
18
+ $VERSION = '1.16';
19
19
 
20
20
  sub ProcessMPImageList($$$);
21
21
 
@@ -127,11 +127,15 @@ sub ProcessMPImageList($$$);
127
127
  0x000000 => 'Undefined',
128
128
  0x010001 => 'Large Thumbnail (VGA equivalent)',
129
129
  0x010002 => 'Large Thumbnail (full HD equivalent)',
130
+ 0x010003 => 'Large Thumbnail (4K equivalent)',
131
+ 0x010004 => 'Large Thumbnail (8K equivalent)',
132
+ 0x010005 => 'Large Thumbnail (16K equivalent)',
130
133
  0x020001 => 'Multi-frame Panorama',
131
134
  0x020002 => 'Multi-frame Disparity',
132
135
  0x020003 => 'Multi-angle',
133
136
  0x030000 => 'Baseline MP Primary Image',
134
137
  0x040000 => 'Original Preservation Image', # (Exif 3.0)
138
+ 0x050000 => 'Gain Map Image',
135
139
  },
136
140
  },
137
141
  4 => {
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
21
21
  sub WriteUnknownOrPreview($$$);
22
22
  sub FixLeicaBase($$;$);
23
23
 
24
- $VERSION = '2.16';
24
+ $VERSION = '2.17';
25
25
 
26
26
  my $debug; # set to 1 to enable debugging code
27
27
 
@@ -991,9 +991,9 @@ my $debug; # set to 1 to enable debugging code
991
991
  {
992
992
  Name => 'MakerNoteSigma',
993
993
  Condition => q{
994
- return undef unless $$self{Make}=~/^(SIGMA|FOVEON)/;
994
+ return undef unless $$self{Make}=~/^(SIGMA|FOVEON)/i;
995
995
  # save version number in "MakerNoteSigmaVer" member variable
996
- $$self{MakerNoteSigmaVer} = $$valPt=~/^SIGMA\0\0\0\0(.)/ ? ord($1) : -1;
996
+ $$self{MakerNoteSigmaVer} = $$valPt=~/^SIGMA\0\0\0.(.)/s ? ord($1) : -1;
997
997
  return 1;
998
998
  },
999
999
  SubDirectory => {
@@ -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.85';
43
+ $VERSION = '2.86';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -113,7 +113,7 @@ 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
116
+ '0 35 10' => 'Olympus M.Zuiko 100-400mm F5.0-6.3', #IB (also OM System M.Zuiko Digital ED 100-400mm F5.0-6.3 IS II", forum2833)
117
117
  '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
118
118
  '0 37 10' => 'Olympus M.Zuiko Digital ED 40-150mm F4.0 Pro', #forum3833
119
119
  '0 39 10' => 'Olympus M.Zuiko Digital ED 90mm F3.5 Macro IS Pro', #forum3833
@@ -550,6 +550,7 @@ my %filters = (
550
550
  4 => 'Light Tone',
551
551
  5 => 'Pin Hole', # (SZ-10 magic filter 2,SZ-31MR,E-PL3)
552
552
  6 => 'Grainy Film',
553
+ 8 => 'Underwater', #forum17348
553
554
  9 => 'Diorama',
554
555
  10 => 'Cross Process',
555
556
  12 => 'Fish Eye', # (SZ-10 magic filter 3)
@@ -581,6 +582,9 @@ my %filters = (
581
582
  39 => 'Partial Color', #forum6269
582
583
  40 => 'Partial Color II', #forum6269
583
584
  41 => 'Partial Color III', #forum6269
585
+ 42 => 'Bleach Bypass', #forum17348
586
+ 43 => 'Bleach Bypass II', #forum17348
587
+ 44 => 'Instant Film', #forum17348
584
588
  );
585
589
 
586
590
  my %toneLevelType = (
@@ -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.24';
40
+ $VERSION = '2.25';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -1436,6 +1436,14 @@ my %shootingMode = (
1436
1436
  Name => 'NoiseReductionStrength',
1437
1437
  Writable => 'rational64s',
1438
1438
  },
1439
+ 0xde => { #forum17299
1440
+ Name => 'AFAreaSize',
1441
+ Writable => 'rational64u',
1442
+ Notes => 'relative to size of image',
1443
+ Count => 2,
1444
+ PrintConv => '$val =~ /^4194303.999/ ? "n/a" : $val',
1445
+ PrintConvInv => '$val eq "n/a" ? "4194303.999 4194303.999" : $val',
1446
+ },
1439
1447
  0xe4 => { #IB
1440
1448
  Name => 'LensTypeModel',
1441
1449
  Condition => '$format eq "int16u"',
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.02';
18
+ $VERSION = '1.03';
19
19
 
20
20
  sub Process_mett($$$);
21
21
 
@@ -61,10 +61,18 @@ sub Process_mett($$$);
61
61
  Name => 'ARCoreAccel',
62
62
  SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreAccel', ByteOrder => 'II' },
63
63
  },
64
+ 'application/arcore-accel-0' => {
65
+ Name => 'ARCoreAccel0',
66
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreAccel0', ByteOrder => 'II' },
67
+ },
64
68
  'application/arcore-gyro' => {
65
69
  Name => 'ARCoreGyro',
66
70
  SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreGyro', ByteOrder => 'II' },
67
71
  },
72
+ 'application/arcore-gyro-0' => {
73
+ Name => 'ARCoreGyro0',
74
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreGyro0', ByteOrder => 'II' },
75
+ },
68
76
  'application/arcore-video-0' => {
69
77
  Name => 'ARCoreVideo',
70
78
  SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreVideo', ByteOrder => 'II' },
@@ -684,11 +692,24 @@ sub Process_mett($$$);
684
692
  # 33: increments slowly (about once every 56 samples or so)
685
693
  );
686
694
 
695
+ # ARCore Accel data (ref PH)
696
+ %Image::ExifTool::Parrot::ARCoreAccel0 = (
697
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
698
+ GROUPS => { 2 => 'Location' },
699
+ NOTES => 'ARCore accelerometer data.',
700
+ FIRST_ENTRY => 0,
701
+ 9 => { # (NC)
702
+ Name => 'Accelerometer',
703
+ Format => 'undef[14]',
704
+ RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
705
+ },
706
+ );
707
+
687
708
  # ARCore Gyro data (ref PH)
688
709
  %Image::ExifTool::Parrot::ARCoreGyro = (
689
710
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
690
711
  GROUPS => { 2 => 'Location' },
691
- NOTES => 'ARCore accelerometer data.',
712
+ NOTES => 'ARCore gyro data.',
692
713
  FIRST_ENTRY => 0,
693
714
  # 00-04: always 10 34 16 3 29
694
715
  4 => {
@@ -704,6 +725,19 @@ sub Process_mett($$$);
704
725
  },
705
726
  );
706
727
 
728
+ # ARCore Gyro data (ref PH)
729
+ %Image::ExifTool::Parrot::ARCoreGyro0 = (
730
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
731
+ GROUPS => { 2 => 'Location' },
732
+ NOTES => 'ARCore gyro data.',
733
+ FIRST_ENTRY => 0,
734
+ 9 => { # (NC)
735
+ Name => 'Gyroscope',
736
+ Format => 'undef[14]',
737
+ RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
738
+ },
739
+ );
740
+
707
741
  %Image::ExifTool::Parrot::ARCoreVideo = (
708
742
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
709
743
  FIRST_ENTRY => 0,
@@ -766,11 +800,24 @@ sub Process_mett($$$)
766
800
  $et->VerboseDir('Parrot mett', undef, $dirEnd);
767
801
 
768
802
  if ($$tagTbl{$metaType}) {
769
- $et->HandleTag($tagTbl, $metaType, undef,
770
- DataPt => $dataPt,
771
- DataPos => $dataPos,
772
- Base => $$dirInfo{Base},
773
- );
803
+ # loop through ARCore records
804
+ while ($pos < $dirEnd - 2) {
805
+ last unless substr($$dataPt,$pos,1) eq "\x0a";
806
+ my $len = ord(substr($$dataPt, $pos+1, 1));
807
+ if ($pos + $len + 2 > $dirEnd) {
808
+ $et->Warn("Unexpected length for $metaType record", 1);
809
+ last;
810
+ }
811
+ $len or $len = $dirEnd - $pos - 2; # use entire record if length is 0
812
+ $et->HandleTag($tagTbl, $metaType, undef,
813
+ DataPt => $dataPt,
814
+ DataPos => $dataPos,
815
+ DirStart => $pos,
816
+ DirLen => $len,
817
+ Base => $$dirInfo{Base},
818
+ );
819
+ $pos += $len + 2;
820
+ }
774
821
  return 1;
775
822
  }
776
823
  while ($pos + 4 < $dirEnd) {
@@ -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.48';
61
+ $VERSION = '3.51';
62
62
 
63
63
  sub CryptShutterCount($$);
64
64
  sub PrintFilter($$$);
@@ -737,6 +737,18 @@ my %filterSettings = (
737
737
  52 => ['Toning2', '%+d'], #31 Extract Color (-3-+3)
738
738
  );
739
739
 
740
+ # order of selectable K-3iii AF points. The array looks like this:
741
+ # B1 C1 E1 G1 I1 K1 L1
742
+ # A3 B3 C3 E3 G3 I3 K3 L3 M3
743
+ # A5 B5 C5 E5 G5 I5 K5 L5 M5
744
+ # A7 B7 C7 E7 G7 I7 K7 L7 M7
745
+ # B9 C9 E9 G9 I9 K9 L9
746
+ my @k3iiiAF = qw(
747
+ C1 E1 G1 I1 K1 C3 E3 G3 I3 K3 C5 E5 G5
748
+ I5 K5 C7 E7 G7 I7 K7 C9 E9 G9 I9 K9 A5 M5 B3
749
+ L3 B5 L5 B7 L7 B1 L1 B9 L9 A3 M3 A7 M7
750
+ );
751
+
740
752
  # decoding for Pentax Firmware ID tags - PH
741
753
  my %pentaxFirmwareID = (
742
754
  # the first 2 numbers are the firmware version, I'm not sure what the second 2 mean
@@ -1251,7 +1263,7 @@ my %binaryDataAttrs = (
1251
1263
  }],
1252
1264
  },{
1253
1265
  Name => 'AFPointSelected',
1254
- Condition => '$$self{Model} =~ /K-3\b/',
1266
+ Condition => '$$self{Model} =~ /(K-3|KP)\b/',
1255
1267
  Writable => 'int16u',
1256
1268
  Notes => 'K-3',
1257
1269
  PrintConvColumns => 2,
@@ -1944,6 +1956,7 @@ my %binaryDataAttrs = (
1944
1956
  '18 3' => 'Auto Program (MTF)', #PH (NC)
1945
1957
  '18 22' => 'Auto Program (Shallow DOF)', #PH (NC)
1946
1958
  '20 22' => 'Blur Control', #PH (Q)
1959
+ '26 0' => 'Shutter and Aperture Priority (TAv)', #PH (K-3III)
1947
1960
  '249 0' => 'Movie (TAv)', #31
1948
1961
  '250 0' => 'Movie (TAv, Auto Aperture)', #31
1949
1962
  '251 0' => 'Movie (Manual)', #31
@@ -3025,6 +3038,10 @@ my %binaryDataAttrs = (
3025
3038
  # 0x0236 - undef[52] (Q)
3026
3039
  # 0x0237 - undef[11] possibly related to smart effect setting? (Q)
3027
3040
  # 0x0238 - undef[9] (Q)
3041
+ 0x0238 => { #KarstenGieselmann
3042
+ Name => 'CAFPointInfo',
3043
+ SubDirectory => { TagTable => 'Image::ExifTool::Pentax::CAFPointInfo' },
3044
+ },
3028
3045
  0x0239 => { #PH
3029
3046
  Name => 'LensInfoQ',
3030
3047
  SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfoQ' },
@@ -4918,6 +4935,7 @@ my %binaryDataAttrs = (
4918
4935
  # CalFlag, ContrastFlag, PrecalFlag, SelectSensor
4919
4936
  0x00 => { #PH
4920
4937
  Name => 'AFPointsUnknown1',
4938
+ Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
4921
4939
  Unknown => 1,
4922
4940
  Format => 'int16u',
4923
4941
  ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff',
@@ -4945,6 +4963,7 @@ my %binaryDataAttrs = (
4945
4963
  },
4946
4964
  0x02 => { #PH
4947
4965
  Name => 'AFPointsUnknown2',
4966
+ Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
4948
4967
  Unknown => 1,
4949
4968
  Format => 'int16u',
4950
4969
  ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff',
@@ -4986,10 +5005,10 @@ my %binaryDataAttrs = (
4986
5005
  # 0x0a - values: 00,05,0d,15,86,8e,a6,ae
4987
5006
  0x0b => { #JD
4988
5007
  Name => 'AFPointsInFocus',
4989
- Condition => '$$self{Model} !~ /K-[13]\b/',
5008
+ Condition => '$$self{Model} !~ /(K-(1|3|70)|KP)\b/',
4990
5009
  Notes => q{
4991
- models other than the K-1 and K-3. May report two points in focus even
4992
- though a single AFPoint has been selected, in which case the selected
5010
+ models other than the K-1, K-3, K-70 and KP. May report two points in focus
5011
+ even though a single AFPoint has been selected, in which case the selected
4993
5012
  AFPoint is the first reported
4994
5013
  },
4995
5014
  PrintConvColumns => 2,
@@ -5017,6 +5036,41 @@ my %binaryDataAttrs = (
5017
5036
  20 => 'Mid-right',
5018
5037
  },
5019
5038
  },
5039
+ 0x14 => {
5040
+ Name => 'AFPointValues',
5041
+ Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
5042
+ Format => 'int16uRev[69]',
5043
+ Unknown => 1,
5044
+ Notes => 'some unknown values related to each AFPoint',
5045
+ # order is the same as AFPoints below, but there is an additional value for
5046
+ # each AF point starting at offset 28 in the array (yes, the range overlaps
5047
+ # with the 1st values)
5048
+ # (values are int16s stored in reversed byte order)
5049
+ ValueConv => 'my @a=split " ",$val;$_>32767 and $_-=65536 foreach @a;join " ",@a',
5050
+ PrintConv => \&AFPointValues,
5051
+ },
5052
+ 0x12a => { # byte has a value of 2 if corresponding AF point is selected
5053
+ Name => 'AFPointsSelected',
5054
+ Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
5055
+ Notes => q{
5056
+ K-3III only. 41 selectable AF points from a total of 101 available in a 13x9
5057
+ grid. Columns are labelled A-M and rows are 1-9. The center point is G5
5058
+ },
5059
+ Format => 'int8u[41]',
5060
+ PrintConv => 'Image::ExifTool::Pentax::AFPointsK3iii($val,$self,2)',
5061
+ },
5062
+ #
5063
+ # (maybe not coincidentally, there are 60 unknown bytes
5064
+ # here, and there are also 60 non-selectable AF points)
5065
+ #
5066
+ 0x18f => { # byte has a value of 1 if corresponding AF point is ... in focus maybe?
5067
+ # usually the same points as AFPoints above, but not always
5068
+ Name => 'AFPointsUnknown',
5069
+ Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
5070
+ Unknown => 1,
5071
+ Format => 'int8u[41]',
5072
+ PrintConv => \&AFPointsK3iii,
5073
+ },
5020
5074
  0x1fa => {
5021
5075
  Name => 'LiveView',
5022
5076
  Notes => 'decoded only for the K-3 III',
@@ -5031,6 +5085,37 @@ my %binaryDataAttrs = (
5031
5085
  },
5032
5086
  );
5033
5087
 
5088
+ # AF information for K-01 and later (ref Karsten Gieselmann private communication)
5089
+ %Image::ExifTool::Pentax::CAFPointInfo = (
5090
+ %binaryDataAttrs,
5091
+ FIRST_ENTRY => 0,
5092
+ DATAMEMBER => [ 1 ],
5093
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
5094
+ NOTES => 'Contrast-detect AF-point information for the K-01 and later models.',
5095
+ 1 => {
5096
+ Name => 'NumCAFPoints',
5097
+ RawConv => '$$self{NumCAFPoints} = ($val & 0x0f) * ($val >> 4); $val',
5098
+ ValueConv => '($val >> 4) * ($val & 0x0f)',
5099
+ },
5100
+ 1.1 => {
5101
+ Name => 'CAFGridSize',
5102
+ ValueConv => '($val >> 4) . " " . ($val & 0x0f)', # (width x height)
5103
+ PrintConv => '$val =~ tr/ /x/; $val',
5104
+ },
5105
+ 2 => {
5106
+ Name => 'CAFPointsInFocus',
5107
+ Format => 'int8u[int(($val{1}+3)/4)]',
5108
+ Writable => 0,
5109
+ PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumCAFPoints},2,0x02)',
5110
+ },
5111
+ 2.1 => {
5112
+ Name => 'CAFPointsSelected',
5113
+ Format => 'int8u[int(($val{1}+3)/4)]',
5114
+ Writable => 0,
5115
+ PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumCAFPoints},2,0x03)',
5116
+ },
5117
+ );
5118
+
5034
5119
  # Kelvin white balance information (ref 28, topic 4834)
5035
5120
  %Image::ExifTool::Pentax::KelvinWB = (
5036
5121
  %binaryDataAttrs,
@@ -5697,29 +5782,34 @@ my %binaryDataAttrs = (
5697
5782
  %Image::ExifTool::Pentax::AFPointInfo = (
5698
5783
  %binaryDataAttrs,
5699
5784
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
5785
+ DATAMEMBER => [ 2 ],
5700
5786
  NOTES => 'AF point information written by the K-1.',
5701
5787
  # 0 - int16u: 1 (version?)
5702
5788
  2 => {
5703
5789
  Name => 'NumAFPoints',
5704
5790
  Format => 'int16u',
5791
+ RawConv => '$$self{NumAFPoints} = $val',
5705
5792
  },
5706
5793
  4 => {
5707
5794
  Name => 'AFPointsInFocus',
5708
5795
  Condition => '$$self{Model} =~ /K-1\b/',
5709
- Format => 'int8u[9]',
5710
- PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,33,2,0x02)',
5796
+ Format => 'int8u[int(($val{2}+3)/4)]',
5797
+ Writable => 0,
5798
+ PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumAFPoints},2,0x02)',
5711
5799
  },
5712
5800
  4.1 => {
5713
5801
  Name => 'AFPointsSelected',
5714
5802
  Condition => '$$self{Model} =~ /K-1\b/',
5715
- Format => 'int8u[9]',
5716
- PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,33,2,0x03)',
5803
+ Format => 'int8u[int(($val{2}+3)/4)]',
5804
+ Writable => 0,
5805
+ PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumAFPoints},2,0x03)',
5717
5806
  },
5718
5807
  4.2 => {
5719
5808
  Name => 'AFPointsSpecial',
5720
5809
  Condition => '$$self{Model} =~ /K-1\b/',
5721
- Format => 'int8u[9]',
5722
- PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,33,2,0x03,0x03)',
5810
+ Format => 'int8u[int(($val{2}+3)/4)]',
5811
+ Writable => 0,
5812
+ PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumAFPoints},2,0x03,0x03)',
5723
5813
  },
5724
5814
  );
5725
5815
 
@@ -5740,6 +5830,7 @@ my %binaryDataAttrs = (
5740
5830
  # more quickly than CameraTemperature when shooting video.)
5741
5831
  0x0c => {
5742
5832
  Name => 'SensorTemperature', #forum6677 (was CameraTemperature2)
5833
+ Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
5743
5834
  Format => 'int16s',
5744
5835
  ValueConv => '$val / 10',
5745
5836
  ValueConvInv => '$val * 10',
@@ -5748,6 +5839,7 @@ my %binaryDataAttrs = (
5748
5839
  },
5749
5840
  0x0e => {
5750
5841
  Name => 'SensorTemperature2', #forum6677 (was CameraTemperature3)
5842
+ Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
5751
5843
  Format => 'int16s',
5752
5844
  ValueConv => '$val / 10',
5753
5845
  ValueConvInv => '$val * 10',
@@ -5769,6 +5861,15 @@ my %binaryDataAttrs = (
5769
5861
  PrintConvInv => '$val=~s/ ?c$//i; $val',
5770
5862
  },
5771
5863
  # 0x18,0x1a,0x1c,0x1e = int16u[4] BlackPoint - PH
5864
+ 0x2a => {
5865
+ Name => 'SensorTemperature',
5866
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
5867
+ Format => 'int16s',
5868
+ ValueConv => '$val / 10',
5869
+ ValueConvInv => '$val * 10',
5870
+ PrintConv => 'sprintf("%.1f C", $val)',
5871
+ PrintConvInv => '$val=~s/ ?c$//i; $val',
5872
+ },
5772
5873
  );
5773
5874
 
5774
5875
  # currently unknown info
@@ -6357,6 +6458,45 @@ sub DecodeAFPoints($$$$;$)
6357
6458
  return join(',', @bitList);
6358
6459
  }
6359
6460
 
6461
+ #------------------------------------------------------------------------------
6462
+ # Print AF Point names for K-3III (ref PH)
6463
+ # Inputs: 0) value, 1) ExifTool ref, 2) optional value to match
6464
+ sub AFPointsK3iii($$;$)
6465
+ {
6466
+ my @a = split ' ', $_[0];
6467
+ my $match = $_[2];
6468
+ my @pts;
6469
+ if ($match) {
6470
+ $a[$_] == $match and push @pts, $k3iiiAF[$_] || "Unknown($_)" foreach 0..$#a;
6471
+ } else {
6472
+ $a[$_] and push @pts, $k3iiiAF[$_] || "Unknown($_)" foreach 0..$#a;
6473
+ }
6474
+ return @pts ? join ',', sort @pts : '(none)';
6475
+ }
6476
+
6477
+ #------------------------------------------------------------------------------
6478
+ # Print AF point values for K-3III (ref PH)
6479
+ # Inputs: 0) value, 1) ExifTool ref
6480
+ # Notes: this is experimental and not well understood
6481
+ sub AFPointValues($$)
6482
+ {
6483
+ my @a = split ' ', shift;
6484
+ my @vals;
6485
+ # (I really don't understand why Pentax seemed to use 28 instead of 41 for
6486
+ # the first index of the 2nd value, because as it stands there is
6487
+ # overlap between the ranges of the 1st and 2nd values, and there is
6488
+ # no way to tell which is which for cases were multiple points have values)
6489
+ foreach (0 .. $#a) {
6490
+ next unless $a[$_];
6491
+ my $pt = $k3iiiAF[$_] ? $k3iiiAF[$_] . '=' : $k3iiiAF[$_-28] . '=/';
6492
+ push @vals, "$pt$a[$_]";
6493
+ next unless $a[$_ + 28];
6494
+ $vals[-1] .= '/' . $a[$_ + 28];
6495
+ $a[$_ + 28] = undef;
6496
+ }
6497
+ return @vals ? join ',', sort @vals : '(none)';
6498
+ }
6499
+
6360
6500
  #------------------------------------------------------------------------------
6361
6501
  # Convert Pentax hex-based EV (modulo 8) to real number
6362
6502
  # Inputs: 0) value to convert