exiftool-vendored.pl 12.44.0 → 12.49.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 (61) hide show
  1. package/bin/Changes +112 -3
  2. package/bin/MANIFEST +9 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +45 -44
  6. package/bin/config_files/acdsee.config +2 -1
  7. package/bin/config_files/frameCount.config +56 -0
  8. package/bin/config_files/tiff_version.config +1 -1
  9. package/bin/exiftool +85 -73
  10. package/bin/fmt_files/gpx.fmt +3 -0
  11. package/bin/fmt_files/gpx_wpt.fmt +3 -0
  12. package/bin/lib/Image/ExifTool/Apple.pm +6 -2
  13. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +17 -9
  14. package/bin/lib/Image/ExifTool/Canon.pm +33 -15
  15. package/bin/lib/Image/ExifTool/CanonRaw.pm +8 -1
  16. package/bin/lib/Image/ExifTool/CanonVRD.pm +7 -8
  17. package/bin/lib/Image/ExifTool/EXE.pm +9 -1
  18. package/bin/lib/Image/ExifTool/Exif.pm +11 -7
  19. package/bin/lib/Image/ExifTool/FLAC.pm +17 -3
  20. package/bin/lib/Image/ExifTool/FLIR.pm +4 -3
  21. package/bin/lib/Image/ExifTool/FlashPix.pm +4 -2
  22. package/bin/lib/Image/ExifTool/FujiFilm.pm +31 -5
  23. package/bin/lib/Image/ExifTool/GPS.pm +2 -2
  24. package/bin/lib/Image/ExifTool/ICC_Profile.pm +3 -2
  25. package/bin/lib/Image/ExifTool/ICO.pm +141 -0
  26. package/bin/lib/Image/ExifTool/ID3.pm +6 -6
  27. package/bin/lib/Image/ExifTool/M2TS.pm +55 -8
  28. package/bin/lib/Image/ExifTool/MIE.pm +9 -3
  29. package/bin/lib/Image/ExifTool/MISB.pm +494 -0
  30. package/bin/lib/Image/ExifTool/MakerNotes.pm +3 -1
  31. package/bin/lib/Image/ExifTool/Matroska.pm +24 -16
  32. package/bin/lib/Image/ExifTool/Nikon.pm +39 -31
  33. package/bin/lib/Image/ExifTool/NikonSettings.pm +5 -3
  34. package/bin/lib/Image/ExifTool/Panasonic.pm +21 -4
  35. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +25 -5
  36. package/bin/lib/Image/ExifTool/Photoshop.pm +29 -3
  37. package/bin/lib/Image/ExifTool/QuickTime.pm +113 -8
  38. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +44 -6
  39. package/bin/lib/Image/ExifTool/README +1 -1
  40. package/bin/lib/Image/ExifTool/RIFF.pm +106 -9
  41. package/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  42. package/bin/lib/Image/ExifTool/Sigma.pm +27 -1
  43. package/bin/lib/Image/ExifTool/SigmaRaw.pm +37 -13
  44. package/bin/lib/Image/ExifTool/Sony.pm +8 -3
  45. package/bin/lib/Image/ExifTool/TagLookup.pm +188 -7
  46. package/bin/lib/Image/ExifTool/TagNames.pod +3051 -2732
  47. package/bin/lib/Image/ExifTool/Text.pm +3 -4
  48. package/bin/lib/Image/ExifTool/Torrent.pm +2 -3
  49. package/bin/lib/Image/ExifTool/Validate.pm +3 -3
  50. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +7 -0
  51. package/bin/lib/Image/ExifTool/WriteExif.pl +100 -23
  52. package/bin/lib/Image/ExifTool/WriteIPTC.pl +2 -6
  53. package/bin/lib/Image/ExifTool/WriteRIFF.pl +359 -0
  54. package/bin/lib/Image/ExifTool/Writer.pl +10 -3
  55. package/bin/lib/Image/ExifTool/XMP.pm +76 -58
  56. package/bin/lib/Image/ExifTool/XMP2.pl +11 -4
  57. package/bin/lib/Image/ExifTool.pm +75 -15
  58. package/bin/lib/Image/ExifTool.pod +61 -57
  59. package/bin/perl-Image-ExifTool.spec +43 -43
  60. package/bin/pp_build_exe.args +7 -4
  61. package/package.json +2 -2
@@ -63,7 +63,7 @@ use Image::ExifTool::Exif;
63
63
  use Image::ExifTool::GPS;
64
64
  use Image::ExifTool::XMP;
65
65
 
66
- $VERSION = '4.08';
66
+ $VERSION = '4.12';
67
67
 
68
68
  sub LensIDConv($$$);
69
69
  sub ProcessNikonAVI($$$);
@@ -363,6 +363,7 @@ sub GetAFPointGrid($$;$);
363
363
  '26 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
364
364
  'E1 58 37 37 14 14 1C 02' => 'Sigma 24mm F1.8 EX DG Aspherical Macro',
365
365
  '02 46 37 37 25 25 02 00' => 'Sigma 24mm F2.8 Super Wide II Macro',
366
+ '7E 54 37 37 0C 0C 4B 06' => 'Sigma 24mm F1.4 DG HSM | A', #30
366
367
  '26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
367
368
  '48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM',
368
369
  'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD
@@ -669,6 +670,7 @@ sub GetAFPointGrid($$;$);
669
670
  '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
670
671
  '07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
671
672
  '71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
673
+ 'FD 00 50 50 18 18 DF 00' => 'Voigtlander APO-Lanthar 50mm F2 Aspherical', #35
672
674
  #
673
675
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
674
676
  '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -1624,6 +1626,11 @@ my %base64coord = (
1624
1626
  3 => 'Small',
1625
1627
  },
1626
1628
  },
1629
+ 0x003f => { #https://github.com/darktable-org/darktable/issues/12282
1630
+ Name => 'WhiteBalanceFineTune',
1631
+ Writable => 'rational64s',
1632
+ Count => 2,
1633
+ },
1627
1634
  0x0045 => { #IB
1628
1635
  Name => 'CropArea',
1629
1636
  Notes => 'left, top, width, height',
@@ -2081,7 +2088,7 @@ my %base64coord = (
2081
2088
  TagTable => 'Image::ExifTool::Nikon::ShotInfoZ9',
2082
2089
  DecryptStart => 4,
2083
2090
  # TODO: eventually set the length dynamically according to actual offsets!
2084
- DecryptLen => 0xec4b + 1907, # decoded thru end of Offset26
2091
+ DecryptLen => 0xec4b + 2105, # decoded thru end of Offset26
2085
2092
  ByteOrder => 'LittleEndian',
2086
2093
  },
2087
2094
  },
@@ -4175,7 +4182,7 @@ my %base64coord = (
4175
4182
  },
4176
4183
  );
4177
4184
 
4178
- %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' ( Z9)
4185
+ %Image::ExifTool::Nikon::AFInfo2V0400 = ( #V0400 related fields begin at x'3c' (Z9)
4179
4186
  %binaryDataAttrs,
4180
4187
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4181
4188
  DATAMEMBER => [ 0 ],
@@ -4219,9 +4226,13 @@ my %base64coord = (
4219
4226
  Name => 'AFAreaHeight',
4220
4227
  Format => 'int16u',
4221
4228
  RawConv => '$val ? $val : undef',
4222
- }
4223
- # AFFocusResult is the result of the last AF operation and not necessarily an indication of the state of the of the capture (e.g., the subject may have moved or the image re-framed)
4224
- #0x4a => { Name => 'AFFocusResult',PrintConv => {0=> "No Focus", 1=>"Focus"} }, #new tag created because Z9 uses a hybrid contrast/phase AF (closest former tag was ContrastDetectAFInFocus).
4229
+ },
4230
+ 0x4a => {
4231
+ Name => 'FocusResult',
4232
+ # in Manual Foucs mode, reflects the state of viewfinder focus indicator.
4233
+ # In AF-C or AF-S, reflects the result of the last AF operation.
4234
+ PrintConv => { 0=> "Out of Focus", 1=>"Focus"},
4235
+ },
4225
4236
  );
4226
4237
 
4227
4238
  # Nikon AF fine-tune information (ref 28)
@@ -5038,31 +5049,31 @@ my %nikonFocalConversions = (
5038
5049
  0x4c => { #28
5039
5050
  Name => 'FocusDistanceRangeWidth', #reflects the number of discrete absolute lens positions that are mapped to the reported FocusDistance. Will be 1 near CFD reflecting very narrow focus distance bands (i.e., quite accurate). Near Infinity will be something like 32. Note: 0 at infinity.
5040
5051
  Format => 'int8u',
5041
- Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5052
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5042
5053
  RawConv => '$$self{FocusDistanceRangeWidth} = $val',
5043
5054
  Unknown => 1,
5044
5055
  },
5045
5056
  0x4e => { #28
5046
5057
  Name => 'FocusDistance',
5047
5058
  Format => 'int16u',
5048
- Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5059
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5049
5060
  RawConv => '$val = $val/256', # 1st byte is the fractional component. This byte was not previously considered in the legacy calculation (which only used the 2nd byte). When 2nd byte < 80; distance is < 1 meter
5050
5061
  ValueConv => '0.01 * 10**($val/40)', # in m
5051
5062
  ValueConvInv => '$val>0 ? 40*log($val*100)/log(10) : 0',
5052
5063
  PrintConv => q{
5053
- $$self{FocusDistanceRangeWidth} == 0 ? "Inf" : $val < 1 ? $val < 0.35 ? sprintf("%.4f m", $val): sprintf("%.3f m", $val): sprintf("%.2f m", $val), #distances less than 35mm are quite accurate with increasingly less precision past 1m
5064
+ (defined $$self{FocusDistanceRangeWidth} and not $$self{FocusDistanceRangeWidth}) ? "Inf" : $val < 1 ? $val < 0.35 ? sprintf("%.4f m", $val): sprintf("%.3f m", $val): sprintf("%.2f m", $val), #distances less than 35mm are quite accurate with increasingly less precision past 1m
5054
5065
  },
5055
5066
  },
5056
5067
  0x56 => { #28
5057
5068
  Name => 'LensDriveEnd', # byte contains: 1 at CFD/MOD; 2 at Infinity; 0 otherwise
5058
- Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5069
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5059
5070
  Format => 'int8u',
5060
- RawConv => 'unless ($$self{FocusDistanceRangeWidth} == 0 ) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
5071
+ RawConv => 'unless (defined $$self{FocusDistanceRangeWidth} and not $$self{FocusDistanceRangeWidth}) { if ($val == 0 ) {$$self{LensDriveEnd} = "No"} else { $$self{LensDriveEnd} = "CFD"}; } else{ $$self{LensDriveEnd} = "Inf"}',
5061
5072
  Unknown => 1,
5062
5073
  },
5063
5074
  0x5a => { #28
5064
5075
  Name => 'LensPositionAbsolute', # <=0 at infinity. Typical value at CFD might be 58000. Only valid for Z-mount lenses.
5065
- Condition => '$$self{NewLensData} and $$self{LensMountType} == 1',
5076
+ Condition => '$$self{NewLensData} and $$self{LensMountType} and $$self{LensMountType} == 1',
5066
5077
  Format => 'int32s',
5067
5078
  Unknown => 1,
5068
5079
  },
@@ -8036,8 +8047,8 @@ my %nikonFocalConversions = (
8036
8047
  WRITE_PROC => \&Image::ExifTool::Nikon::ProcessNikonEncrypted,
8037
8048
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
8038
8049
  VARS => { ID_LABEL => 'Index' },
8039
- DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c98,
8040
- 0x6c9a, 0x7717, 0x7844, 0xeaea, 0xeb6f, 0xeb70 ],
8050
+ DATAMEMBER => [ 0x04, 0x30, 0x38, 0x84, 0x8c, 0x6c6f, 0x6c90, 0x6c98,
8051
+ 0x6c9a, 0xeaea, 0xeb6f, 0xeb70 ],
8041
8052
  IS_SUBDIR => [ 0xec4b ],
8042
8053
  WRITABLE => 1,
8043
8054
  FIRST_ENTRY => 0,
@@ -8114,6 +8125,15 @@ my %nikonFocalConversions = (
8114
8125
  # account for variable location of Offset3 data
8115
8126
  Hook => '$varSize = $$self{Offset3} - 0x6c70',
8116
8127
  },
8128
+ 0x6c90 => {
8129
+ Name => 'FocusShiftShooting',
8130
+ RawConv => '$$self{FocusShiftShooting} = $val',
8131
+ PrintConv => q{
8132
+ return 'Off' if $val == 0 ;
8133
+ my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8134
+ return "On: $i"
8135
+ },
8136
+ },
8117
8137
  0x6c98 => {
8118
8138
  Name => 'IntervalShooting',
8119
8139
  RawConv => '$$self{IntervalShooting} = $val',
@@ -8133,23 +8153,6 @@ my %nikonFocalConversions = (
8133
8153
  Format => 'int16u',
8134
8154
  Hidden => 1,
8135
8155
  },
8136
- ### 0x7718 - Offset5 info start (Z9 firmware 1.00)
8137
- 0x7717 => {
8138
- Name => 'Offsset5Hook',
8139
- Hidden => 1,
8140
- RawConv => 'undef',
8141
- # account for variable location of Offset5 data
8142
- Hook => '$varSize = $$self{Offset5} - 0x7718',
8143
- },
8144
- 0x7844 => {
8145
- Name => 'FocusShiftShooting',
8146
- RawConv => '$$self{FocusShiftShooting} = $val',
8147
- PrintConv => q{
8148
- return 'Off' if $val == 0 ;
8149
- my $i = sprintf("Frame %.0f of %.0f",$val, $$self{FocusShiftNumberShots}); # something like Frame 1 of 100"
8150
- return "On: $i"
8151
- },
8152
- },
8153
8156
  ### 0xeaeb - OrientationInfo start (Z9 firmware 1.00)
8154
8157
  0xeaea => {
8155
8158
  Name => 'OrientationHook',
@@ -10897,9 +10900,14 @@ my %nikonFocalConversions = (
10897
10900
  Name => 'LocationInfo',
10898
10901
  SubDirectory => { TagTable => 'Image::ExifTool::Nikon::LocationInfo' },
10899
10902
  },
10903
+ 0x200003f => 'WhiteBalanceFineTune',
10900
10904
  # 0x200003f - rational64s[2]: "0 0"
10901
10905
  # 0x2000042 - undef[6]: "0100\x03\0"
10902
10906
  # 0x2000043 - undef[12]: all zeros
10907
+ 0x200004e => {
10908
+ Name => 'NikonSettings',
10909
+ SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' },
10910
+ },
10903
10911
  0x2000083 => {
10904
10912
  Name => 'LensType',
10905
10913
  # credit to Tom Christiansen (ref 7) for figuring this out...
@@ -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},
@@ -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.17';
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',
@@ -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
  }
@@ -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' },
@@ -332,6 +355,7 @@ my %unicodeString = (
332
355
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
333
356
  WRITE_PROC => \&Image::ExifTool::WriteBinaryData,
334
357
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
358
+ DATAMEMBER => [ 1 ],
335
359
  FORMAT => 'int16s',
336
360
  GROUPS => { 2 => 'Image' },
337
361
  0 => {
@@ -342,6 +366,7 @@ my %unicodeString = (
342
366
  },
343
367
  1 => {
344
368
  Name => 'PhotoshopFormat',
369
+ RawConv => '$$self{PhotoshopFormat} = $val',
345
370
  PrintConv => {
346
371
  0x0000 => 'Standard',
347
372
  0x0001 => 'Optimized',
@@ -350,6 +375,7 @@ my %unicodeString = (
350
375
  },
351
376
  2 => {
352
377
  Name => 'ProgressiveScans',
378
+ Condition => '$$self{PhotoshopFormat} == 0x0101',
353
379
  PrintConv => {
354
380
  1 => '3 Scans',
355
381
  2 => '4 Scans',
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
47
47
  use Image::ExifTool::Exif;
48
48
  use Image::ExifTool::GPS;
49
49
 
50
- $VERSION = '2.75';
50
+ $VERSION = '2.79';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -66,6 +66,7 @@ sub ProcessRIFFTrailer($$$);
66
66
  sub ProcessTTAD($$$);
67
67
  sub ProcessNMEA($$$);
68
68
  sub ProcessGPSLog($$$);
69
+ sub ProcessGarminGPS($$$);
69
70
  sub SaveMetaKeys($$$);
70
71
  # ++^^^^^^^^^^^^++
71
72
  sub ParseItemLocation($$);
@@ -556,12 +557,16 @@ my %eeBox2 = (
556
557
  mdat => { Name => 'MediaData', Unknown => 1, Binary => 1 },
557
558
  'mdat-size' => {
558
559
  Name => 'MediaDataSize',
560
+ RawConv => '$$self{MediaDataSize} = $val',
559
561
  Notes => q{
560
562
  not a real tag ID, this tag represents the size of the 'mdat' data in bytes
561
563
  and is used in the AvgBitrate calculation
562
564
  },
563
565
  },
564
- 'mdat-offset' => 'MediaDataOffset',
566
+ 'mdat-offset' => {
567
+ Name => 'MediaDataOffset',
568
+ RawConv => '$$self{MediaDataOffset} = $val',
569
+ },
565
570
  junk => { Unknown => 1, Binary => 1 }, #8
566
571
  uuid => [
567
572
  { #9 (MP4 files)
@@ -897,7 +902,7 @@ my %eeBox2 = (
897
902
  },
898
903
  colr => {
899
904
  Name => 'ColorRepresentation',
900
- ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
905
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
901
906
  },
902
907
  pasp => {
903
908
  Name => 'PixelAspectRatio',
@@ -1118,6 +1123,23 @@ my %eeBox2 = (
1118
1123
  Start => 16,
1119
1124
  },
1120
1125
  },
1126
+ {
1127
+ Name => 'GarminGPS',
1128
+ Condition => '$$valPt=~/^\x9b\x63\x0f\x8d\x63\x74\x40\xec\x82\x04\xbc\x5f\xf5\x09\x17\x28/ and $$self{OPTIONS}{ExtractEmbedded}',
1129
+ SubDirectory => {
1130
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
1131
+ ProcessProc => \&ProcessGarminGPS,
1132
+ },
1133
+ },
1134
+ {
1135
+ Name => 'GarminGPS',
1136
+ Condition => '$$valPt=~/^\x9b\x63\x0f\x8d\x63\x74\x40\xec\x82\x04\xbc\x5f\xf5\x09\x17\x28/',
1137
+ Notes => 'Garmin GPS sensor data',
1138
+ RawConv => q{
1139
+ $self->WarnOnce('Use the ExtractEmbedded option to decode timed Garmin GPS',3);
1140
+ return \$val;
1141
+ },
1142
+ },
1121
1143
  {
1122
1144
  Name => 'UUID-Unknown',
1123
1145
  %unknownInfo,
@@ -2732,7 +2754,7 @@ my %eeBox2 = (
2732
2754
  },
2733
2755
  },{
2734
2756
  Name => 'ColorRepresentation',
2735
- ValueConv => 'join(" ", substr($val,0,4), unpack("x4n*",$val))',
2757
+ SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::ColorRep' },
2736
2758
  }],
2737
2759
  irot => {
2738
2760
  Name => 'Rotation',
@@ -2792,6 +2814,78 @@ my %eeBox2 = (
2792
2814
  },
2793
2815
  );
2794
2816
 
2817
+ # ref https://aomediacodec.github.io/av1-spec/av1-spec.pdf
2818
+ %Image::ExifTool::QuickTime::ColorRep = (
2819
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
2820
+ GROUPS => { 2 => 'Video' },
2821
+ FIRST_ENTRY => 0,
2822
+ 0 => { Name => 'ColorProfiles', Format => 'undef[4]' },
2823
+ 4 => {
2824
+ Name => 'ColorPrimaries',
2825
+ Format => 'int16u',
2826
+ PrintConv => {
2827
+ 1 => 'BT.709',
2828
+ 2 => 'Unspecified',
2829
+ 4 => 'BT.470 System M (historical)',
2830
+ 5 => 'BT.470 System B, G (historical)',
2831
+ 6 => 'BT.601',
2832
+ 7 => 'SMPTE 240',
2833
+ 8 => 'Generic film (color filters using illuminant C)',
2834
+ 9 => 'BT.2020, BT.2100',
2835
+ 10 => 'SMPTE 428 (CIE 1921 XYZ)',
2836
+ 11 => 'SMPTE RP 431-2',
2837
+ 12 => 'SMPTE EG 432-1',
2838
+ 22 => 'EBU Tech. 3213-E',
2839
+ },
2840
+ },
2841
+ 6 => {
2842
+ Name => 'TransferCharacteristics',
2843
+ Format => 'int16u',
2844
+ PrintConv => {
2845
+ 0 => 'For future use (0)',
2846
+ 1 => 'BT.709',
2847
+ 2 => 'Unspecified',
2848
+ 3 => 'For future use (3)',
2849
+ 4 => 'BT.470 System M (historical)',
2850
+ 5 => 'BT.470 System B, G (historical)',
2851
+ 6 => 'BT.601',
2852
+ 7 => 'SMPTE 240 M',
2853
+ 8 => 'Linear',
2854
+ 9 => 'Logarithmic (100 : 1 range)',
2855
+ 10 => 'Logarithmic (100 * Sqrt(10) : 1 range)',
2856
+ 11 => 'IEC 61966-2-4',
2857
+ 12 => 'BT.1361',
2858
+ 13 => 'sRGB or sYCC',
2859
+ 14 => 'BT.2020 10-bit systems',
2860
+ 15 => 'BT.2020 12-bit systems',
2861
+ 16 => 'SMPTE ST 2084, ITU BT.2100 PQ',
2862
+ 17 => 'SMPTE ST 428',
2863
+ 18 => 'BT.2100 HLG, ARIB STD-B67',
2864
+ },
2865
+ },
2866
+ 8 => {
2867
+ Name => 'MatrixCoefficients',
2868
+ Format => 'int16u',
2869
+ PrintConv => {
2870
+ 0 => 'Identity matrix',
2871
+ 1 => 'BT.709',
2872
+ 2 => 'Unspecified',
2873
+ 3 => 'For future use (3)',
2874
+ 4 => 'US FCC 73.628',
2875
+ 5 => 'BT.470 System B, G (historical)',
2876
+ 6 => 'BT.601',
2877
+ 7 => 'SMPTE 240 M',
2878
+ 8 => 'YCgCo',
2879
+ 9 => 'BT.2020 non-constant luminance, BT.2100 YCbCr',
2880
+ 10 => 'BT.2020 constant luminance',
2881
+ 11 => 'SMPTE ST 2085 YDzDx',
2882
+ 12 => 'Chromaticity-derived non-constant luminance',
2883
+ 13 => 'Chromaticity-derived constant luminance',
2884
+ 14 => 'BT.2100 ICtCp',
2885
+ },
2886
+ },
2887
+ );
2888
+
2795
2889
  # HEVC configuration (ref https://github.com/MPEGGroup/isobmff/blob/master/IsoLib/libisomediafile/src/HEVCConfigAtom.c)
2796
2890
  %Image::ExifTool::QuickTime::HEVCConfig = (
2797
2891
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -7554,6 +7648,11 @@ my %eeBox2 = (
7554
7648
  Format => 'undef[4]',
7555
7649
  RawConv => '$$self{MetaFormat} = $val', # (yes, use MetaFormat for this too)
7556
7650
  },
7651
+ 24 => {
7652
+ Condition => '$$self{MetaFormat} eq "tmcd"',
7653
+ Name => 'PlaybackFrameRate', # (may differ from recorded FrameRate eg. ../pics/FujiFilmX-H1.mov)
7654
+ Format => 'rational64u',
7655
+ },
7557
7656
  #
7558
7657
  # Observed offsets for child atoms of various OtherFormat types:
7559
7658
  #
@@ -8006,9 +8105,12 @@ sub AUTOLOAD
8006
8105
  # Returns: 9-element rotation matrix as a string (with 0 x/y offsets)
8007
8106
  sub GetRotationMatrix($)
8008
8107
  {
8009
- my $ang = 3.1415926536 * shift() / 180;
8108
+ my $ang = 3.14159265358979323846264 * shift() / 180;
8010
8109
  my $cos = cos $ang;
8011
8110
  my $sin = sin $ang;
8111
+ # round to zero
8112
+ $cos = 0 if abs($cos) < 1e-12;
8113
+ $sin = 0 if abs($sin) < 1e-12;
8012
8114
  my $msn = -$sin;
8013
8115
  return "$cos $sin 0 $msn $cos 0 0 0 1";
8014
8116
  }
@@ -9561,10 +9663,14 @@ ItemID: foreach $id (keys %$items) {
9561
9663
  require Image::ExifTool::Font;
9562
9664
  $lang = $Image::ExifTool::Font::ttLang{Macintosh}{$lang};
9563
9665
  }
9666
+ } else {
9667
+ # for the default language code of 0x0000, use UTF-8 instead
9668
+ # of the CharsetQuickTime setting if obviously UTF8
9669
+ $enc = 'UTF8' if Image::ExifTool::IsUTF8(\$str) > 0;
9564
9670
  }
9565
9671
  # the spec says only "Macintosh text encoding", but
9566
9672
  # allow this to be configured by the user
9567
- $enc = $charsetQuickTime;
9673
+ $enc = $charsetQuickTime unless $enc;
9568
9674
  } else {
9569
9675
  # convert language code to ASCII (ignore read-only bit)
9570
9676
  $lang = UnpackLang($lang);
@@ -9605,8 +9711,7 @@ ItemID: foreach $id (keys %$items) {
9605
9711
  if (not ref $$vp and length($$vp) <= 65536 and $$vp =~ /[\x80-\xff]/) {
9606
9712
  # the encoding of this is not specified, so use CharsetQuickTime
9607
9713
  # unless the string is valid UTF-8
9608
- require Image::ExifTool::XMP;
9609
- my $enc = Image::ExifTool::XMP::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
9714
+ my $enc = Image::ExifTool::IsUTF8($vp) > 0 ? 'UTF8' : $charsetQuickTime;
9610
9715
  $$vp = $et->Decode($$vp, $enc);
9611
9716
  }
9612
9717
  }