exiftool_vendored 12.41.0 → 12.50.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 (77) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +209 -6
  3. data/bin/MANIFEST +12 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -44
  7. data/bin/config_files/acdsee.config +2 -1
  8. data/bin/config_files/frameCount.config +56 -0
  9. data/bin/config_files/tiff_version.config +1 -1
  10. data/bin/exiftool +115 -96
  11. data/bin/fmt_files/gpx.fmt +3 -0
  12. data/bin/fmt_files/gpx_wpt.fmt +3 -0
  13. data/bin/lib/Image/ExifTool/Apple.pm +16 -3
  14. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +23 -12
  15. data/bin/lib/Image/ExifTool/Canon.pm +71 -33
  16. data/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  17. data/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  18. data/bin/lib/Image/ExifTool/DJI.pm +60 -1
  19. data/bin/lib/Image/ExifTool/DNG.pm +8 -2
  20. data/bin/lib/Image/ExifTool/DarwinCore.pm +13 -1
  21. data/bin/lib/Image/ExifTool/EXE.pm +9 -1
  22. data/bin/lib/Image/ExifTool/Exif.pm +26 -12
  23. data/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  24. data/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  25. data/bin/lib/Image/ExifTool/FlashPix.pm +26 -3
  26. data/bin/lib/Image/ExifTool/FujiFilm.pm +51 -4
  27. data/bin/lib/Image/ExifTool/GPS.pm +21 -1
  28. data/bin/lib/Image/ExifTool/Geotag.pm +25 -5
  29. data/bin/lib/Image/ExifTool/ICC_Profile.pm +12 -9
  30. data/bin/lib/Image/ExifTool/ICO.pm +143 -0
  31. data/bin/lib/Image/ExifTool/ID3.pm +11 -11
  32. data/bin/lib/Image/ExifTool/IPTC.pm +5 -1
  33. data/bin/lib/Image/ExifTool/LNK.pm +5 -2
  34. data/bin/lib/Image/ExifTool/M2TS.pm +98 -8
  35. data/bin/lib/Image/ExifTool/MIE.pm +9 -3
  36. data/bin/lib/Image/ExifTool/MISB.pm +494 -0
  37. data/bin/lib/Image/ExifTool/MakerNotes.pm +8 -1
  38. data/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  39. data/bin/lib/Image/ExifTool/Motorola.pm +8 -2
  40. data/bin/lib/Image/ExifTool/Nikon.pm +293 -122
  41. data/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
  42. data/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  43. data/bin/lib/Image/ExifTool/Olympus.pm +22 -2
  44. data/bin/lib/Image/ExifTool/PDF.pm +2 -1
  45. data/bin/lib/Image/ExifTool/Panasonic.pm +30 -4
  46. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  47. data/bin/lib/Image/ExifTool/Parrot.pm +96 -2
  48. data/bin/lib/Image/ExifTool/Pentax.pm +8 -3
  49. data/bin/lib/Image/ExifTool/Photoshop.pm +35 -8
  50. data/bin/lib/Image/ExifTool/QuickTime.pm +163 -13
  51. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +119 -13
  52. data/bin/lib/Image/ExifTool/README +13 -3
  53. data/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  54. data/bin/lib/Image/ExifTool/Samsung.pm +234 -3
  55. data/bin/lib/Image/ExifTool/Shortcuts.pm +2 -1
  56. data/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  57. data/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  58. data/bin/lib/Image/ExifTool/Sony.pm +71 -43
  59. data/bin/lib/Image/ExifTool/TagInfoXML.pm +3 -1
  60. data/bin/lib/Image/ExifTool/TagLookup.pm +4752 -4516
  61. data/bin/lib/Image/ExifTool/TagNames.pod +1885 -1434
  62. data/bin/lib/Image/ExifTool/Text.pm +3 -4
  63. data/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  64. data/bin/lib/Image/ExifTool/Validate.pm +3 -3
  65. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  66. data/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  67. data/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  68. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +5 -5
  69. data/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  70. data/bin/lib/Image/ExifTool/Writer.pl +14 -6
  71. data/bin/lib/Image/ExifTool/XMP.pm +78 -59
  72. data/bin/lib/Image/ExifTool/XMP2.pl +19 -4
  73. data/bin/lib/Image/ExifTool.pm +120 -33
  74. data/bin/lib/Image/ExifTool.pod +83 -69
  75. data/bin/perl-Image-ExifTool.spec +43 -43
  76. data/lib/exiftool_vendored/version.rb +1 -1
  77. metadata +9 -4
@@ -15,7 +15,7 @@ package Image::ExifTool::NikonCustom;
15
15
  use strict;
16
16
  use vars qw($VERSION);
17
17
 
18
- $VERSION = '1.19';
18
+ $VERSION = '1.20';
19
19
 
20
20
  my %buttonsZ9= (
21
21
  0 => 'None',
@@ -74,6 +74,9 @@ my %buttonsZ9= (
74
74
  82 => 'Select To Send (PC)',
75
75
  83 => 'Select To Send (FTP)',
76
76
  85 => 'Control Lock',
77
+ 86 => 'Save Focus Position',
78
+ 87 => 'Recall Focus Position',
79
+ 88 => 'Recall Shooting Functions (Hold)',
77
80
  );
78
81
  my %dialsZ9 = (
79
82
  0 => '1 Frame',
@@ -2036,11 +2036,13 @@ sub ProcessNikonSettings($$$)
2036
2036
  for ($i=0; $i<$num; ++$i) {
2037
2037
  my $entry = $start + 0x18 + $i * 8;
2038
2038
  my $tag = Get16u($dataPt, $entry);
2039
- my $fmt = Get16u($dataPt, $entry + 2);
2039
+ # this is odd, but either the format is 16-bit and always big-endian,
2040
+ # or it is 8-bit and we have an unknown byte in the entry...
2041
+ my $fmt = Get8u($dataPt, $entry + 3);
2040
2042
  my $val = Get32u($dataPt, $entry + 4);
2041
2043
  # abort if the tag has a format that we haven't yet seen
2042
- # (assuming this is a size/format code. So far we have only seen 0x400)
2043
- $fmt == 0x400 or $et->Warn(sprintf('Unknown format 0x%x for NikonSettings tag 0x%.4x',$fmt,$tag)), last;
2044
+ # (assuming this is a size/format code. So far we have only seen a code of 4)
2045
+ $fmt == 4 or $et->Warn(sprintf('Unknown format $fmt for NikonSettings tag 0x%.4x',$tag)), last;
2044
2046
  $et->HandleTag($tagTablePtr, $tag, $val,
2045
2047
  DataPt => $dataPt,
2046
2048
  DataPos => $$dirInfo{DataPos},
@@ -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.77';
43
+ $VERSION = '2.79';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -433,6 +433,7 @@ my %olympusCameraTypes = (
433
433
  S0092 => 'E-M1MarkIII', #IB
434
434
  S0093 => 'E-P7', #IB
435
435
  S0095 => 'OM-1', #IB
436
+ S0101 => 'OM-5', #IB
436
437
  SR45 => 'D220',
437
438
  SR55 => 'D320L',
438
439
  SR83 => 'D340L',
@@ -1911,6 +1912,23 @@ my %indexInfo = (
1911
1912
  Name => 'FocusBracketStepSize',
1912
1913
  Writable => 'int8u',
1913
1914
  },
1915
+ 0x309 => { #forum13341
1916
+ Name => 'AISubjectTrackingMode',
1917
+ Writable => 'int16u',
1918
+ ValueConv => '($val >> 8) . " " . ($val & 0xff)',
1919
+ ValueConvInv => 'my @a = split " ", $val; $val = $a[0]*256 + $a[1]',
1920
+ PrintConv => [{
1921
+ 0 => 'Off',
1922
+ 1 => 'Motorsports',
1923
+ 2 => 'Airplanes',
1924
+ 3 => 'Trains',
1925
+ 4 => 'Birds',
1926
+ 5 => 'Dogs & Cats',
1927
+ },{
1928
+ 0 => 'Object Not Found',
1929
+ 1 => 'Object Found',
1930
+ }],
1931
+ },
1914
1932
  0x400 => { #6
1915
1933
  Name => 'FlashMode',
1916
1934
  Writable => 'int16u',
@@ -2538,11 +2556,13 @@ my %indexInfo = (
2538
2556
  '3 8' => 'ND8 (3EV)', #IB
2539
2557
  '3 16' => 'ND16 (4EV)', #IB
2540
2558
  '3 32' => 'ND32 (5EV)', #IB
2559
+ '3 64' => 'ND64 (6EV)', #forum13341
2541
2560
  '5 4' => 'HDR1', #forum8906
2542
2561
  '6 4' => 'HDR2', #forum8906
2543
2562
  '8 8' => 'Tripod high resolution', #IB
2544
2563
  '9 *' => 'Focus-stacked (* images)', #IB (* = 2-15)
2545
- '11 16' => 'Hand-held high resolution', #IB (perhaps '11 15' would be possible, ref 24)
2564
+ '11 12' => 'Hand-held high resolution (11 12)', #forum13341 (OM-1)
2565
+ '11 16' => 'Hand-held high resolution (11 16)', #IB (perhaps '11 15' would be possible, ref 24)
2546
2566
  OTHER => sub {
2547
2567
  my ($val, $inv, $conv) = @_;
2548
2568
  if ($inv) {
@@ -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.54';
24
+ $VERSION = '1.55';
25
25
 
26
26
  sub FetchObject($$$$);
27
27
  sub ExtractObject($$;$$);
@@ -2276,6 +2276,7 @@ XRef:
2276
2276
  # load XRef stream in hybrid file if it exists
2277
2277
  push @xrefOffsets, $$mainDict{XRefStm}, 'XRefStm' if $$mainDict{XRefStm};
2278
2278
  $encrypt = $$mainDict{Encrypt} if $$mainDict{Encrypt};
2279
+ undef $encrypt if $encrypt and $encrypt eq 'null'; # (have seen "null")
2279
2280
  if ($$mainDict{ID} and ref $$mainDict{ID} eq 'ARRAY') {
2280
2281
  $id = ReadPDFValue($mainDict->{ID}->[0]);
2281
2282
  }
@@ -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.16';
40
+ $VERSION = '2.18';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -543,7 +543,11 @@ my %shootingMode = (
543
543
  0x2c => [
544
544
  {
545
545
  Name => 'ContrastMode',
546
- Condition => '$$self{Model} !~ /^DMC-(FX10|G1|L1|L10|LC80|GF\d+|G2|TZ10|ZS7)$/',
546
+ Condition => q{
547
+ $$self{Model} !~ /^DMC-(FX10|G1|L1|L10|LC80|GF\d+|G2|TZ10|ZS7)$/ and
548
+ # tested for DC-GH6, but rule out other DC- models just in case - PH
549
+ $$self{Model} !~ /^DC-/
550
+ },
547
551
  Flags => 'PrintHex',
548
552
  Writable => 'int16u',
549
553
  Notes => q{
@@ -1129,7 +1133,10 @@ my %shootingMode = (
1129
1133
  8 => 'Cinelike D', #forum11194
1130
1134
  9 => 'Cinelike V', #forum11194
1131
1135
  11 => 'L. Monochrome', #forum11194
1136
+ 12 => 'Like709', #forum14033
1132
1137
  15 => 'L. Monochrome D', #forum11194
1138
+ 17 => 'V-Log', #forum14033
1139
+ 18 => 'Cinelike D2', #forum14033
1133
1140
  },
1134
1141
  },
1135
1142
  0x8a => { #18
@@ -1255,8 +1262,9 @@ my %shootingMode = (
1255
1262
  Writable => 'rational64u',
1256
1263
  Format => 'int32u',
1257
1264
  PrintConv => {
1258
- '0 0' => 'Expressive',
1259
- # '0 1' => have seen this for XS1 (PH)
1265
+ # '0 0' => 'Expressive', #forum11194
1266
+ '0 0' => 'Off', #forum14033 (GH6)
1267
+ '0 1' => 'Expressive', #forum14033 (GH6) (have also seen this for XS1)
1260
1268
  '0 2' => 'Retro',
1261
1269
  '0 4' => 'High Key',
1262
1270
  '0 8' => 'Sepia',
@@ -1435,6 +1443,15 @@ my %shootingMode = (
1435
1443
  ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_',
1436
1444
  ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)',
1437
1445
  },
1446
+ 0xe8 => { #PH (DC-GH6)
1447
+ Name => 'MinimumISO',
1448
+ Writable => 'int32u',
1449
+ },
1450
+ 0xee => { #PH (DC-GH6)
1451
+ Name => 'DynamicRangeBoost',
1452
+ Writable => 'int16u',
1453
+ PrintConv => { 0 => 'Off', 1 => 'On' },
1454
+ },
1438
1455
  0x0e00 => {
1439
1456
  Name => 'PrintIM',
1440
1457
  Description => 'Print Image Matching',
@@ -2472,6 +2489,15 @@ my %shootingMode = (
2472
2489
  Start => 12,
2473
2490
  },
2474
2491
  },
2492
+ 0x200080 => { # (GH6)
2493
+ Name => 'ExifData',
2494
+ Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s',
2495
+ SubDirectory => {
2496
+ TagTable => 'Image::ExifTool::Exif::Main',
2497
+ ProcessProc => \&Image::ExifTool::ProcessTIFF,
2498
+ Start => 12,
2499
+ },
2500
+ },
2475
2501
  );
2476
2502
 
2477
2503
  # Panasonic Composite tags
@@ -21,7 +21,7 @@ use vars qw($VERSION);
21
21
  use Image::ExifTool qw(:DataAccess :Utils);
22
22
  use Image::ExifTool::Exif;
23
23
 
24
- $VERSION = '1.25';
24
+ $VERSION = '1.27';
25
25
 
26
26
  sub ProcessJpgFromRaw($$$);
27
27
  sub WriteJpgFromRaw($$$);
@@ -218,6 +218,7 @@ my %panasonicWhiteBalance = ( #forum9396
218
218
  0x30 => { Name => 'CropLeft', Writable => 'int16u' },
219
219
  0x31 => { Name => 'CropBottom', Writable => 'int16u' },
220
220
  0x32 => { Name => 'CropRight', Writable => 'int16u' },
221
+ # 0x44 - may contain another pointer to the raw data starting at byte 2 in this data (DC-GH6)
221
222
  0x10f => {
222
223
  Name => 'Make',
223
224
  Groups => { 2 => 'Camera' },
@@ -737,6 +738,8 @@ sub WriteDistortionInfo($$$)
737
738
  # 2 - value count
738
739
  # 3 - reference to list of original offset values
739
740
  # 4 - IFD format number
741
+ # 5 - (pointer to StripOffsets value added by this PatchRawDataOffset routine)
742
+ # 6 - flag set if this is a fixed offset (Panasonic GH6 fixed-offset hack)
740
743
  sub PatchRawDataOffset($$$)
741
744
  {
742
745
  my ($offsetInfo, $raf, $ifd) = @_;
@@ -745,15 +748,32 @@ sub PatchRawDataOffset($$$)
745
748
  my $rawDataOffset = $$offsetInfo{0x118};
746
749
  my $err;
747
750
  $err = 1 unless $ifd == 0;
748
- $err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
749
- if ($rawDataOffset) {
751
+ if ($stripOffsets or $stripByteCounts) {
752
+ $err = 1 unless $stripOffsets and $stripByteCounts and $$stripOffsets[2] == 1;
753
+ } else {
754
+ # the DC-GH6 and DC-GH5M2 write RawDataOffset with no Strip tags, so we need
755
+ # to create fake StripByteCounts information for copying the data
756
+ if ($$offsetInfo{0x118}) { # (just to be safe)
757
+ $stripByteCounts = $$offsetInfo{0x117} = [ $PanasonicRaw::Main{0x117}, 0, 1, [ 0 ], 4 ];
758
+ # set flag so the offset will be fixed (GH6 hack, see https://exiftool.org/forum/index.php?topic=13861.0)
759
+ # (of course, fixing up the offset is now unnecessary, but continue to do this even
760
+ # though the fixup adjustment will be 0 because this allows us to delete the following
761
+ # line to remove the fix-offset restriction if Panasonic ever sees the light, but note
762
+ # that in this case we should investigate the purpose of the seemily-duplicate raw
763
+ # data offset contained within PanasonicRaw_0x0044)
764
+ $$offsetInfo{0x118}[6] = 1;
765
+ }
766
+ }
767
+ if ($rawDataOffset and not $err) {
750
768
  $err = 1 unless $$rawDataOffset[2] == 1;
751
- $err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
769
+ if ($stripOffsets) {
770
+ $err = 1 unless $$stripOffsets[3][0] == 0xffffffff or $$stripByteCounts[3][0] == 0;
771
+ }
752
772
  }
753
773
  $err and return 'Unsupported Panasonic/Leica RAW variant';
754
774
  if ($rawDataOffset) {
755
775
  # update StripOffsets along with this tag if it contains a reasonable value
756
- unless ($$stripOffsets[3][0] == 0xffffffff) {
776
+ if ($stripOffsets and $$stripOffsets[3][0] != 0xffffffff) {
757
777
  # save pointer to StripOffsets value for updating later
758
778
  push @$rawDataOffset, $$stripOffsets[1];
759
779
  }
@@ -6,14 +6,16 @@
6
6
  # Revisions: 2019-10-23 - P. Harvey Created
7
7
  #
8
8
  # References: 1) https://developer.parrot.com/docs/pdraw/metadata.html
9
+ # --> changed to https://developer.parrot.com/docs/pdraw/video-metadata.html
9
10
  #------------------------------------------------------------------------------
10
11
 
11
12
  package Image::ExifTool::Parrot;
12
13
 
13
14
  use strict;
14
15
  use vars qw($VERSION);
16
+ use Image::ExifTool qw(:DataAccess :Utils);
15
17
 
16
- $VERSION = '1.01';
18
+ $VERSION = '1.02';
17
19
 
18
20
  sub Process_mett($$$);
19
21
 
@@ -21,7 +23,10 @@ sub Process_mett($$$);
21
23
  %Image::ExifTool::Parrot::mett = (
22
24
  PROCESS_PROC => \&Process_mett,
23
25
  # put the 'P' records first in the documentation
24
- VARS => { SORT_PROC => sub { my ($a,$b)=@_; $a=~s/P/A/; $b=~s/P/A/; $a cmp $b } },
26
+ VARS => {
27
+ SORT_PROC => sub { my ($a,$b)=@_; $a=~s/P/A/; $b=~s/P/A/; $a cmp $b },
28
+ LONG_TAGS => 1
29
+ },
25
30
  NOTES => q{
26
31
  Streaming metadata found in Parrot drone videos. See
27
32
  L<https://developer.parrot.com/docs/pdraw/metadata.html> for the
@@ -51,6 +56,23 @@ sub Process_mett($$$);
51
56
  Name => 'ParrotAutomation',
52
57
  SubDirectory => { TagTable => 'Image::ExifTool::Parrot::Automation' },
53
58
  },
59
+ # timed metadata written by ARCore (see forum13653)
60
+ 'application/arcore-accel' => {
61
+ Name => 'ARCoreAccel',
62
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreAccel', ByteOrder => 'II' },
63
+ },
64
+ 'application/arcore-gyro' => {
65
+ Name => 'ARCoreGyro',
66
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreGyro', ByteOrder => 'II' },
67
+ },
68
+ 'application/arcore-video-0' => {
69
+ Name => 'ARCoreVideo',
70
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreVideo', ByteOrder => 'II' },
71
+ },
72
+ 'application/arcore-custom-event' => {
73
+ Name => 'ARCoreCustom',
74
+ SubDirectory => { TagTable => 'Image::ExifTool::Parrot::ARCoreCustom', ByteOrder => 'II' },
75
+ },
54
76
  );
55
77
 
56
78
  # tags found in the Parrot 'mett' V1 timed metadata (ref 1) [untested]
@@ -629,6 +651,69 @@ sub Process_mett($$$);
629
651
  },
630
652
  );
631
653
 
654
+ # ARCore Accel data (ref PH)
655
+ %Image::ExifTool::Parrot::ARCoreAccel = (
656
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
657
+ GROUPS => { 2 => 'Location' },
658
+ NOTES => 'ARCore accelerometer data.',
659
+ FIRST_ENTRY => 0,
660
+ # 00-04: always 10 34 16 1 29
661
+ 4 => {
662
+ Name => 'AccelerometerUnknown',
663
+ Format => 'undef[16]',
664
+ Unknown => 1,
665
+ ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)',
666
+ },
667
+ 5 => { # (NC)
668
+ Name => 'Accelerometer',
669
+ Format => 'undef[14]',
670
+ RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
671
+ },
672
+ # 05-08: float Accelerometer X
673
+ # 09: 37
674
+ # 10-13: float Accelerometer Y
675
+ # 14: 45
676
+ # 15-18: float Accelerometer Z
677
+ # 19: 48
678
+ # 20-24: 128-255
679
+ # 25: 246 then 247
680
+ # 26: 188
681
+ # 27: 2
682
+ # 28: 56
683
+ # 29-32: 128-255
684
+ # 33: increments slowly (about once every 56 samples or so)
685
+ );
686
+
687
+ # ARCore Gyro data (ref PH)
688
+ %Image::ExifTool::Parrot::ARCoreGyro = (
689
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
690
+ GROUPS => { 2 => 'Location' },
691
+ NOTES => 'ARCore accelerometer data.',
692
+ FIRST_ENTRY => 0,
693
+ # 00-04: always 10 34 16 3 29
694
+ 4 => {
695
+ Name => 'GyroscopeUnknown',
696
+ Format => 'undef[16]',
697
+ Unknown => 1, # always "29 37 45 48" in my sample, just like AccelerometerUnknown
698
+ ValueConv => 'join " ", unpack("Cx4Cx4Cx4C", $val)',
699
+ },
700
+ 5 => { # (NC)
701
+ Name => 'Gyroscope',
702
+ Format => 'undef[14]',
703
+ RawConv => 'GetFloat(\$val,0) . " " . GetFloat(\$val,5) . " " . GetFloat(\$val,10)',
704
+ },
705
+ );
706
+
707
+ %Image::ExifTool::Parrot::ARCoreVideo = (
708
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
709
+ FIRST_ENTRY => 0,
710
+ );
711
+
712
+ %Image::ExifTool::Parrot::ARCoreCustom = (
713
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
714
+ FIRST_ENTRY => 0,
715
+ );
716
+
632
717
  %Image::ExifTool::Parrot::Composite = (
633
718
  GPSDateTime => {
634
719
  Description => 'GPS Date/Time',
@@ -676,9 +761,18 @@ sub Process_mett($$$)
676
761
  my $dataPos = $$dirInfo{DataPos};
677
762
  my $dirEnd = length $$dataPt;
678
763
  my $pos = $$dirInfo{DirStart} || 0;
764
+ my $metaType = $$et{MetaType} || '';
679
765
 
680
766
  $et->VerboseDir('Parrot mett', undef, $dirEnd);
681
767
 
768
+ if ($$tagTbl{$metaType}) {
769
+ $et->HandleTag($tagTbl, $metaType, undef,
770
+ DataPt => $dataPt,
771
+ DataPos => $dataPos,
772
+ Base => $$dirInfo{Base},
773
+ );
774
+ return 1;
775
+ }
682
776
  while ($pos + 4 < $dirEnd) {
683
777
  my ($id, $nwords) = unpack("x${pos}a2n", $$dataPt);
684
778
  my $size;
@@ -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.40';
61
+ $VERSION = '3.41';
62
62
 
63
63
  sub CryptShutterCount($$);
64
64
  sub PrintFilter($$$);
@@ -171,7 +171,7 @@ sub DecodeAFPoints($$$$;$);
171
171
  '3 255.4' => 'Sigma DF EX Aspherical 28-70mm F2.8', #12
172
172
  '3 255.5' => 'Sigma AF Tele 400mm F5.6 Multi-coated', #JD
173
173
  '3 255.6' => 'Sigma 24-60mm F2.8 EX DG', #PH
174
- '3 255.7' => 'Sigma 70-300mm F4-5.6 Macro', #JD
174
+ '3 255.7' => 'Sigma 70-300mm F4-5.6 Macro', #JD (also DG Macro, ref 27)
175
175
  '3 255.8' => 'Sigma 55-200mm F4-5.6 DC', #JD
176
176
  '3 255.9' => 'Sigma 18-50mm F2.8 EX DC', #JD (also Macro version - PH)
177
177
  '4 1' => 'smc PENTAX-FA SOFT 28mm F2.8',
@@ -365,10 +365,15 @@ sub DecodeAFPoints($$$$;$);
365
365
  '8 255.4' => 'Sigma 4.5mm F2.8 EX DC HSM Circular Fisheye', #PH
366
366
  '8 255.5' => 'Sigma 50-200mm F4-5.6 DC OS', #26
367
367
  '8 255.6' => 'Sigma 24-70mm F2.8 EX DG HSM', #29
368
+
369
+ '9 0' => '645 Manual Lens', #PH (NC)
370
+ '9 3' => 'HD PENTAX-FA 43mm F1.9 Limited', #IB
371
+ '9 24' => 'HD PENTAX-FA 77mm F1.8 Limited', #IB
372
+ '9 39' => 'HD PENTAX-FA 31mm F1.8 AL Limited', #IB
373
+ '9 247' => 'HD PENTAX-DA FISH-EYE 10-17mm F3.5-4.5 ED [IF]', #IB
368
374
  #
369
375
  # 645 lenses
370
376
  #
371
- '9 0' => '645 Manual Lens', #PH (NC)
372
377
  '10 0' => '645 A Series Lens', #PH
373
378
  '11 1' => 'smc PENTAX-FA 645 75mm F2.8', #PH
374
379
  '11 2' => 'smc PENTAX-FA 645 45mm F2.8', #PH
@@ -25,15 +25,28 @@
25
25
  package Image::ExifTool::Photoshop;
26
26
 
27
27
  use strict;
28
- use vars qw($VERSION $AUTOLOAD $iptcDigestInfo);
28
+ use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
29
29
  use Image::ExifTool qw(:DataAccess :Utils);
30
30
 
31
- $VERSION = '1.65';
31
+ $VERSION = '1.67';
32
32
 
33
33
  sub ProcessPhotoshop($$$);
34
34
  sub WritePhotoshop($$$);
35
35
  sub ProcessLayers($$$);
36
36
 
37
+ # PrintFlags bit definitions (ref forum13785)
38
+ %printFlags = (
39
+ 0 => 'Labels',
40
+ 1 => 'Corner crop marks',
41
+ 2 => 'Color bars', # (deprecated)
42
+ 3 => 'Registration marks',
43
+ 4 => 'Negative',
44
+ 5 => 'Emulsion down',
45
+ 6 => 'Interpolate', # (deprecated)
46
+ 7 => 'Description',
47
+ 8 => 'Print flags',
48
+ );
49
+
37
50
  # map of where information is stored in PSD image
38
51
  my %psdMap = (
39
52
  IPTC => 'Photoshop',
@@ -106,7 +119,17 @@ my %unicodeString = (
106
119
  0x03f0 => { Unknown => 1, Name => 'PStringCaption' },
107
120
  0x03f1 => { Unknown => 1, Name => 'BorderInformation' },
108
121
  0x03f2 => { Unknown => 1, Name => 'BackgroundColor' },
109
- 0x03f3 => { Unknown => 1, Name => 'PrintFlags', Format => 'int8u' },
122
+ 0x03f3 => {
123
+ Unknown => 1,
124
+ Name => 'PrintFlags',
125
+ Format => 'int8u',
126
+ PrintConv => q{
127
+ my $byte = 0;
128
+ my @bits = $val =~ /\d+/g;
129
+ $byte = ($byte << 1) | ($_ ? 1 : 0) foreach reverse @bits;
130
+ return DecodeBits($byte, \%Image::ExifTool::Photoshop::printFlags);
131
+ },
132
+ },
110
133
  0x03f4 => { Unknown => 1, Name => 'BW_HalftoningInfo' },
111
134
  0x03f5 => { Unknown => 1, Name => 'ColorHalftoningInfo' },
112
135
  0x03f6 => { Unknown => 1, Name => 'DuotoneHalftoningInfo' },
@@ -248,11 +271,12 @@ my %unicodeString = (
248
271
  Protected => 1,
249
272
  Notes => q{
250
273
  this tag indicates provides a way for XMP-aware applications to indicate
251
- that the XMP is synchronized with the IPTC. When writing, special values of
252
- "new" and "old" represent the digests of the IPTC from the edited and
253
- original files respectively, and are undefined if the IPTC does not exist in
254
- the respective file. Set this to "new" as an indication that the XMP is
255
- synchronized with the IPTC
274
+ that the XMP is synchronized with the IPTC. The MWG recommendation is to
275
+ ignore the XMP if IPTCDigest exists and doesn't match the CurrentIPTCDigest.
276
+ When writing, special values of "new" and "old" represent the digests of the
277
+ IPTC from the edited and original files respectively, and are undefined if
278
+ the IPTC does not exist in the respective file. Set this to "new" as an
279
+ indication that the XMP is synchronized with the IPTC
256
280
  },
257
281
  # also note the 'new' feature requires that the IPTC comes before this tag is written
258
282
  ValueConv => 'unpack("H*", $val)',
@@ -331,6 +355,7 @@ my %unicodeString = (
331
355
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
332
356
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
333
357
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
358
+ DATAMEMBER => [ 1 ],
334
359
  FORMAT => 'int16s',
335
360
  GROUPS => { 2 => 'Image' },
336
361
  0 => {
@@ -341,6 +366,7 @@ my %unicodeString = (
341
366
  },
342
367
  1 => {
343
368
  Name => 'PhotoshopFormat',
369
+ RawConv => '$$self{PhotoshopFormat} = $val',
344
370
  PrintConv => {
345
371
  0x0000 => 'Standard',
346
372
  0x0001 => 'Optimized',
@@ -349,6 +375,7 @@ my %unicodeString = (
349
375
  },
350
376
  2 => {
351
377
  Name => 'ProgressiveScans',
378
+ Condition => '$$self{PhotoshopFormat} == 0x0101',
352
379
  PrintConv => {
353
380
  1 => '3 Scans',
354
381
  2 => '4 Scans',