exiftool_vendored 12.41.0 → 12.50.0

Sign up to get free protection for your applications and to get access to all the features.
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',