exiftool-vendored.exe 12.26.0 → 12.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/bin/exiftool_files/Changes +119 -4
  2. package/bin/exiftool_files/README +44 -43
  3. package/bin/exiftool_files/arg_files/xmp2exif.args +2 -1
  4. package/bin/exiftool_files/config_files/convert_regions.config +25 -14
  5. package/bin/exiftool_files/config_files/example.config +1 -1
  6. package/bin/exiftool_files/exiftool.pl +79 -66
  7. package/bin/exiftool_files/fmt_files/gpx.fmt +1 -1
  8. package/bin/exiftool_files/fmt_files/gpx_wpt.fmt +1 -1
  9. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +11 -3
  10. package/bin/exiftool_files/lib/Image/ExifTool/CBOR.pm +331 -0
  11. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +26 -7
  12. package/bin/exiftool_files/lib/Image/ExifTool/DPX.pm +13 -2
  13. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +98 -4
  14. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +35 -10
  15. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +1 -0
  16. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +13 -2
  17. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +16 -1
  18. package/bin/exiftool_files/lib/Image/ExifTool/ID3.pm +15 -3
  19. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +7 -3
  20. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +60 -26
  21. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +153 -0
  22. package/bin/exiftool_files/lib/Image/ExifTool/Lang/nl.pm +60 -59
  23. package/bin/exiftool_files/lib/Image/ExifTool/M2TS.pm +103 -7
  24. package/bin/exiftool_files/lib/Image/ExifTool/MacOS.pm +2 -2
  25. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +14 -3
  26. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +10 -2
  27. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +9 -2
  28. package/bin/exiftool_files/lib/Image/ExifTool/Other.pm +93 -0
  29. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +9 -12
  30. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -6
  31. package/bin/exiftool_files/lib/Image/ExifTool/Panasonic.pm +14 -3
  32. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +27 -5
  33. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +6 -0
  34. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +105 -24
  35. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +203 -121
  36. package/bin/exiftool_files/lib/Image/ExifTool/README +5 -2
  37. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +6 -1
  38. package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +47 -10
  39. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +85 -34
  40. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +65 -5
  41. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +153 -32
  42. package/bin/exiftool_files/lib/Image/ExifTool/Torrent.pm +18 -11
  43. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -0
  44. package/bin/exiftool_files/lib/Image/ExifTool/WritePNG.pl +2 -0
  45. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +8 -4
  46. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +3 -0
  47. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +21 -4
  48. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +3 -1
  49. package/bin/exiftool_files/lib/Image/ExifTool/XMPStruct.pl +3 -1
  50. package/bin/exiftool_files/lib/Image/ExifTool/ZISRAW.pm +121 -2
  51. package/bin/exiftool_files/lib/Image/ExifTool.pm +8867 -8835
  52. package/bin/exiftool_files/lib/Image/ExifTool.pod +58 -56
  53. package/package.json +3 -3
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.48';
91
+ $VERSION = '4.52';
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)
@@ -187,7 +187,7 @@ $VERSION = '4.48';
187
187
  37.2 => 'Tamron AF 28-300mm f/3.5-6.3 XR Di VC LD Aspherical [IF] Macro (A20)', #38
188
188
  37.3 => 'Tamron SP AF 17-50mm f/2.8 XR Di II VC LD Aspherical [IF]', #34
189
189
  37.4 => 'Tamron AF 18-270mm f/3.5-6.3 Di II VC LD Aspherical [IF] Macro', #forum2937
190
- 38 => 'Canon EF 80-200mm f/4.5-5.6', #32
190
+ 38 => 'Canon EF 80-200mm f/4.5-5.6 II', #32 (II added ref https://github.com/Exiv2/exiv2/issues/1906)
191
191
  39 => 'Canon EF 75-300mm f/4-5.6',
192
192
  40 => 'Canon EF 28-80mm f/3.5-5.6',
193
193
  41 => 'Canon EF 28-90mm f/4-5.6', #32
@@ -519,7 +519,8 @@ $VERSION = '4.48';
519
519
  507 => 'Canon EF 16-35mm f/4L IS USM', #42
520
520
  508 => 'Canon EF 11-24mm f/4L USM or Tamron Lens', #PH
521
521
  508.1 => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)', #PH
522
- 624 => 'Sigma 70-200mm f/2.8 DG OS HSM | S', #IB (018)
522
+ 624 => 'Sigma 70-200mm f/2.8 DG OS HSM | S or other Sigma Lens', #IB (018)
523
+ 624.1 => 'Sigma 150-600mm f/5-6.3 | C', #ChrisSkopec
523
524
  747 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens', #JR
524
525
  747.1 => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #50
525
526
  748 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens', #JR (1.4x Mk III)
@@ -557,7 +558,8 @@ $VERSION = '4.48';
557
558
  4158 => 'Canon EF-S 18-55mm f/4-5.6 IS STM', #PH
558
559
  4159 => 'Canon EF-M 32mm f/1.4 STM', #42
559
560
  4160 => 'Canon EF-S 35mm f/2.8 Macro IS STM', #42
560
- 4208 => 'Sigma 56mm f/1.4 DC DN | C', #forum10603
561
+ 4208 => 'Sigma 56mm f/1.4 DC DN | C or other Sigma Lens', #forum10603
562
+ 4208.1 => 'Sigma 30mm F1.4 DC DN | C', #git issue#83 (016)
561
563
  # (Nano USM lenses - 0x90xx)
562
564
  36910 => 'Canon EF 70-300mm f/4-5.6 IS II USM', #42
563
565
  36912 => 'Canon EF-S 18-135mm f/3.5-5.6 IS USM', #42
@@ -592,6 +594,9 @@ $VERSION = '4.48';
592
594
  '61182.20' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
593
595
  '61182.21' => 'Canon RF 70-200mm F4L IS USM', #42
594
596
  '61182.22' => 'Canon RF 50mm F1.8 STM', #42
597
+ '61182.23' => 'Canon RF 14-35mm F4L IS USM', #IB
598
+ '61182.24' => 'Canon RF 16mm F2.8 STM', #42
599
+ #'61182.xx' => 'Canon RF 100mm F2.8L MACRO IS USM',
595
600
  65535 => 'n/a',
596
601
  );
597
602
 
@@ -6727,7 +6732,17 @@ my %ciMaxFocal = (
6727
6732
  PrintConvInv => '$val =~ s/ ?m$//; IsFloat($val) ? $val : 655.35',
6728
6733
  },
6729
6734
  # 22 - values: 0, 1
6730
- # 23 - values: 0, 21, 22
6735
+ 23 => { #JohnMoyer (forum12925)
6736
+ Name => 'ShutterMode',
6737
+ PrintConv => {
6738
+ 0 => 'Mechanical',
6739
+ 1 => 'Electronic First Curtain',
6740
+ 2 => 'Electronic',
6741
+ # 3 => ?
6742
+ # 21 => ?
6743
+ # 22 => ?
6744
+ },
6745
+ },
6731
6746
  25 => { #PH
6732
6747
  Name => 'FlashExposureLock',
6733
6748
  PrintConv => \%offOn,
@@ -6760,6 +6775,9 @@ my %ciMaxFocal = (
6760
6775
  277 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
6761
6776
  278 => 'Canon RF 70-200mm F4L IS USM', #42
6762
6777
  280 => 'Canon RF 50mm F1.8 STM', #42
6778
+ 281 => 'Canon RF 14-35mm F4L IS USM', #42/IB
6779
+ 288 => 'Canon RF 16mm F2.8 STM', #42
6780
+ #xxx => 'Canon RF 100mm F2.8L MACRO IS USM',
6763
6781
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6764
6782
  },
6765
6783
  },
@@ -9253,8 +9271,9 @@ sub PrintLensID(@)
9253
9271
  push @likely, $tclens;
9254
9272
  if ($maxAperture) {
9255
9273
  # (not 100% sure that TC affects MaxAperture, but it should!)
9256
- next if $maxAperture < $sa * $tc - 0.15;
9257
- next if $maxAperture > $la * $tc + 0.15;
9274
+ # (RF 24-105mm F4L IS USM shows a MaxAperture of 4.177)
9275
+ next if $maxAperture < $sa * $tc - 0.18;
9276
+ next if $maxAperture > $la * $tc + 0.18;
9258
9277
  }
9259
9278
  push @matches, $tclens;
9260
9279
  }
@@ -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.05';
18
+ $VERSION = '1.06';
19
19
 
20
20
  # DPX tags
21
21
  %Image::ExifTool::DPX::Main = (
@@ -156,7 +156,18 @@ $VERSION = '1.05';
156
156
  1532=> { Name => 'SourceCreateDate', Format => 'string[24]' },
157
157
  1556=> { Name => 'InputDeviceName', Format => 'string[32]' },
158
158
  1588=> { Name => 'InputDeviceSerialNumber', Format => 'string[32]' },
159
- # 1620=> { Name => 'AspectRatio', Format => 'int32u' },
159
+ # 1620 => { Name => 'Border', Format => 'int16u[4]' },
160
+ 1628 => {
161
+ Name => 'AspectRatio',
162
+ Format => 'int32u[2]',
163
+ RawConv => '$val =~ /4294967295/ ? undef : $val', # ignore undefined values
164
+ PrintConv => q{
165
+ return 'undef' if $val eq '0 0';
166
+ return 'inf' if $val=~/ 0$/;
167
+ my @a=split(' ',$val);
168
+ return join(':', Rationalize($a[0]/$a[1]));
169
+ },
170
+ },
160
171
  1724 => { Name => 'OriginalFrameRate',Format => 'float' },
161
172
  1728 => { Name => 'ShutterAngle', Format => 'float', RawConv => '($val =~ /\d/ and $val !~ /nan/i) ? $val : undef' }, #2
162
173
  1732 => { Name => 'FrameID', Format => 'string[32]' },
@@ -56,7 +56,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
56
56
  use Image::ExifTool qw(:DataAccess :Utils);
57
57
  use Image::ExifTool::MakerNotes;
58
58
 
59
- $VERSION = '4.35';
59
+ $VERSION = '4.37';
60
60
 
61
61
  sub ProcessExif($$$);
62
62
  sub WriteExif($$$);
@@ -265,6 +265,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
265
265
  32892 => 'Sequential Color Filter', #JR (Sony ARQ)
266
266
  34892 => 'Linear Raw', #2
267
267
  51177 => 'Depth Map', # (DNG 1.5)
268
+ 52527 => 'Semantic Mask', # (DNG 1.6)
268
269
  );
269
270
 
270
271
  %orientation = (
@@ -291,6 +292,7 @@ sub BINARY_DATA_LIMIT { return 10 * 1024 * 1024; }
291
292
  9 => 'Depth map of reduced-resolution image', # (DNG 1.5)
292
293
  16 => 'Enhanced image data', # (DNG 1.5)
293
294
  0x10001 => 'Alternate reduced-resolution image', # (DNG 1.2)
295
+ 0x10004 => 'Semantic Mask', # (DNG 1.6)
294
296
  0xffffffff => 'invalid', #(found in E5700 NEF's)
295
297
  BITMASK => {
296
298
  0 => 'Reduced resolution',
@@ -366,6 +368,7 @@ my %opcodeInfo = (
366
368
  11 => 'DeltaPerColumn',
367
369
  12 => 'ScalePerRow',
368
370
  13 => 'ScalePerColumn',
371
+ 14 => 'WarpRectilinear2', # (DNG 1.6)
369
372
  },
370
373
  PrintConvInv => undef, # (so the inverse conversion is not performed)
371
374
  );
@@ -3038,12 +3041,12 @@ my %opcodeInfo = (
3038
3041
  },
3039
3042
  },
3040
3043
  #
3041
- # DNG tags 0xc6XX and 0xc7XX (ref 2 unless otherwise stated)
3044
+ # DNG tags 0xc6XX, 0xc7XX and 0xcdXX (ref 2 unless otherwise stated)
3042
3045
  #
3043
3046
  0xc612 => {
3044
3047
  Name => 'DNGVersion',
3045
3048
  Notes => q{
3046
- tags 0xc612-0xc7b5 are defined by the DNG specification unless otherwise
3049
+ tags 0xc612-0xcd3b are defined by the DNG specification unless otherwise
3047
3050
  noted. See L<https://helpx.adobe.com/photoshop/digital-negative.html> for
3048
3051
  the specification
3049
3052
  },
@@ -4041,6 +4044,97 @@ my %opcodeInfo = (
4041
4044
  Protected => 1,
4042
4045
  WriteGroup => 'IFD0',
4043
4046
  },
4047
+ 0xcd2d => { # DNG 1.6
4048
+ Name => 'ProfileGainTableMap',
4049
+ Writable => 'undef',
4050
+ WriteGroup => 'SubIFD',
4051
+ Protected => 1,
4052
+ Binary => 1,
4053
+ },
4054
+ 0xcd2e => { # DNG 1.6
4055
+ Name => 'SemanticName',
4056
+ # Writable => 'string',
4057
+ WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
4058
+ },
4059
+ 0xcd30 => { # DNG 1.6
4060
+ Name => 'SemanticInstanceIFD',
4061
+ # Writable => 'string',
4062
+ WriteGroup => 'SubIFD' #? (NC) Semantic Mask IFD (only for Validate)
4063
+ },
4064
+ 0xcd31 => { # DNG 1.6
4065
+ Name => 'CalibrationIlluminant3',
4066
+ Writable => 'int16u',
4067
+ WriteGroup => 'IFD0',
4068
+ Protected => 1,
4069
+ SeparateTable => 'LightSource',
4070
+ PrintConv => \%lightSource,
4071
+ },
4072
+ 0xcd32 => { # DNG 1.6
4073
+ Name => 'CameraCalibration3',
4074
+ Writable => 'rational64s',
4075
+ WriteGroup => 'IFD0',
4076
+ Count => -1,
4077
+ Protected => 1,
4078
+ },
4079
+ 0xcd33 => { # DNG 1.6
4080
+ Name => 'ColorMatrix3',
4081
+ Writable => 'rational64s',
4082
+ WriteGroup => 'IFD0',
4083
+ Count => -1,
4084
+ Protected => 1,
4085
+ },
4086
+ 0xcd34 => { # DNG 1.6
4087
+ Name => 'ForwardMatrix3',
4088
+ Writable => 'rational64s',
4089
+ WriteGroup => 'IFD0',
4090
+ Count => -1,
4091
+ Protected => 1,
4092
+ },
4093
+ 0xcd35 => { # DNG 1.6
4094
+ Name => 'IlluminantData1',
4095
+ Writable => 'undef',
4096
+ WriteGroup => 'IFD0',
4097
+ Protected => 1,
4098
+ },
4099
+ 0xcd36 => { # DNG 1.6
4100
+ Name => 'IlluminantData2',
4101
+ Writable => 'undef',
4102
+ WriteGroup => 'IFD0',
4103
+ Protected => 1,
4104
+ },
4105
+ 0xcd37 => { # DNG 1.6
4106
+ Name => 'IlluminantData3',
4107
+ Writable => 'undef',
4108
+ WriteGroup => 'IFD0',
4109
+ Protected => 1,
4110
+ },
4111
+ 0xcd38 => { # DNG 1.6
4112
+ Name => 'MaskSubArea',
4113
+ # Writable => 'int32u',
4114
+ WriteGroup => 'SubIFD', #? (NC) Semantic Mask IFD (only for Validate)
4115
+ Count => 4,
4116
+ },
4117
+ 0xcd39 => { # DNG 1.6
4118
+ Name => 'ProfileHueSatMapData3',
4119
+ %longBin,
4120
+ Writable => 'float',
4121
+ WriteGroup => 'IFD0',
4122
+ Count => -1,
4123
+ Protected => 1,
4124
+ },
4125
+ 0xcd3a => { # DNG 1.6
4126
+ Name => 'ReductionMatrix3',
4127
+ Writable => 'rational64s',
4128
+ WriteGroup => 'IFD0',
4129
+ Count => -1,
4130
+ Protected => 1,
4131
+ },
4132
+ 0xcd3b => { # DNG 1.6
4133
+ Name => 'RGBTables',
4134
+ Writable => 'undef',
4135
+ WriteGroup => 'IFD0',
4136
+ Protected => 1,
4137
+ },
4044
4138
  0xea1c => { #13
4045
4139
  Name => 'Padding',
4046
4140
  Binary => 1,
@@ -5918,7 +6012,7 @@ sub ProcessExif($$$)
5918
6012
  my $size = $count * $formatSize[$format];
5919
6013
  my $readSize = $size;
5920
6014
  if ($size > 4) {
5921
- if ($size > 0x7fffffff) {
6015
+ if ($size > 0x7fffffff and (not $tagInfo or not $$tagInfo{ReadFromRAF})) {
5922
6016
  $et->Warn(sprintf("Invalid size (%u) for %s %s",$size,$dir,TagName($tagID,$tagInfo)), $inMakerNotes);
5923
6017
  ++$warnCount;
5924
6018
  next;
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::Exif;
22
22
  use Image::ExifTool::ASF; # for GetGUID()
23
23
 
24
- $VERSION = '1.38';
24
+ $VERSION = '1.39';
25
25
 
26
26
  sub ProcessFPX($$);
27
27
  sub ProcessFPXR($$$);
@@ -1369,29 +1369,48 @@ sub ReadFPXValue($$$$$;$$)
1369
1369
  my $flags = $type & 0xf000;
1370
1370
  if ($flags) {
1371
1371
  if ($flags == VT_VECTOR) {
1372
- $noPad = 1; # values don't seem to be padded inside vectors
1372
+ $noPad = 1; # values sometimes aren't padded inside vectors!!
1373
1373
  my $size = $oleFormatSize{VT_VECTOR};
1374
- last if $valPos + $size > $dirEnd;
1374
+ if ($valPos + $size > $dirEnd) {
1375
+ $et->WarnOnce('Incorrect FPX VT_VECTOR size');
1376
+ last;
1377
+ }
1375
1378
  $count = Get32u($dataPt, $valPos);
1376
1379
  push @vals, '' if $count == 0; # allow zero-element vector
1377
1380
  $valPos += 4;
1378
1381
  } else {
1379
1382
  # can't yet handle this property flag
1383
+ $et->WarnOnce('Unknown FPX property');
1380
1384
  last;
1381
1385
  }
1382
1386
  }
1383
1387
  unless ($format =~ /^VT_/) {
1384
1388
  my $size = Image::ExifTool::FormatSize($format) * $count;
1385
- last if $valPos + $size > $dirEnd;
1389
+ if ($valPos + $size > $dirEnd) {
1390
+ $et->WarnOnce("Incorrect FPX $format size");
1391
+ last;
1392
+ }
1386
1393
  @vals = ReadValue($dataPt, $valPos, $format, $count, $size);
1387
1394
  # update position to end of value plus padding
1388
1395
  $valPos += ($count * $size + 3) & 0xfffffffc;
1389
1396
  last;
1390
1397
  }
1391
1398
  my $size = $oleFormatSize{$format};
1392
- my ($item, $val);
1399
+ my ($item, $val, $len);
1393
1400
  for ($item=0; $item<$count; ++$item) {
1394
- last if $valPos + $size > $dirEnd;
1401
+ if ($valPos + $size > $dirEnd) {
1402
+ $et->WarnOnce("Truncated FPX $format value");
1403
+ last;
1404
+ }
1405
+ # sometimes VT_VECTOR items are padded to even 4-byte boundaries, and sometimes they aren't
1406
+ if ($noPad and defined $len and $len & 0x03) {
1407
+ my $pad = 4 - ($len & 0x03);
1408
+ if ($valPos + $pad + $size <= $dirEnd) {
1409
+ # skip padding if all zeros
1410
+ $valPos += $pad if substr($$dataPt, $valPos, $pad) eq "\0" x $pad;
1411
+ }
1412
+ }
1413
+ undef $len;
1395
1414
  if ($format eq 'VT_VARIANT') {
1396
1415
  my $subType = Get32u($dataPt, $valPos);
1397
1416
  $valPos += $size;
@@ -1429,9 +1448,12 @@ sub ReadFPXValue($$$$$;$$)
1429
1448
  $val = ($val - 25569) * 24 * 3600 if $val != 0;
1430
1449
  $val = Image::ExifTool::ConvertUnixTime($val);
1431
1450
  } elsif ($format =~ /STR$/) {
1432
- my $len = Get32u($dataPt, $valPos);
1451
+ $len = Get32u($dataPt, $valPos);
1433
1452
  $len *= 2 if $format eq 'VT_LPWSTR'; # convert to byte count
1434
- last if $valPos + $len + 4 > $dirEnd;
1453
+ if ($valPos + $len + 4 > $dirEnd) {
1454
+ $et->WarnOnce("Truncated $format value");
1455
+ last;
1456
+ }
1435
1457
  $val = substr($$dataPt, $valPos + 4, $len);
1436
1458
  if ($format eq 'VT_LPWSTR') {
1437
1459
  # convert wide string from Unicode
@@ -1450,8 +1472,11 @@ sub ReadFPXValue($$$$$;$$)
1450
1472
  # on even 32-bit boundaries, but this isn't always the case)
1451
1473
  $valPos += $noPad ? $len : ($len + 3) & 0xfffffffc;
1452
1474
  } elsif ($format eq 'VT_BLOB' or $format eq 'VT_CF') {
1453
- my $len = Get32u($dataPt, $valPos);
1454
- last if $valPos + $len + 4 > $dirEnd;
1475
+ my $len = Get32u($dataPt, $valPos); # (use local $len because we always expect padding)
1476
+ if ($valPos + $len + 4 > $dirEnd) {
1477
+ $et->WarnOnce("Truncated $format value");
1478
+ last;
1479
+ }
1455
1480
  $val = substr($$dataPt, $valPos + 4, $len);
1456
1481
  # update position for data length plus padding
1457
1482
  # (does this padding disappear in arrays too?)
@@ -489,6 +489,7 @@ my %faceCategories = (
489
489
  3 => 'Electronic Front Curtain', #10
490
490
  },
491
491
  },
492
+ # 0x1100 - This may not work well for newer cameras (ref forum12682)
492
493
  0x1100 => [{
493
494
  Name => 'AutoBracketing',
494
495
  Condition => '$$self{Model} eq "X-T3"',
@@ -28,7 +28,7 @@ use vars qw($VERSION);
28
28
  use Image::ExifTool qw(:Public);
29
29
  use Image::ExifTool::GPS;
30
30
 
31
- $VERSION = '1.64';
31
+ $VERSION = '1.65';
32
32
 
33
33
  sub JITTER() { return 2 } # maximum time jitter
34
34
 
@@ -262,8 +262,10 @@ sub LoadTrackLog($$;$)
262
262
  $param = 'time';
263
263
  } elsif (/^(Pos)?Lat/i) {
264
264
  $param = 'lat';
265
+ /ref$/i and $param .= 'ref';
265
266
  } elsif (/^(Pos)?Lon/i) {
266
267
  $param = 'lon';
268
+ /ref$/i and $param .= 'ref';
267
269
  } elsif (/^(Pos)?Alt/i) {
268
270
  $param = 'alt';
269
271
  } elsif (/^(Angle)?(Heading|Track)/i) {
@@ -453,7 +455,7 @@ DoneFix: $isDate = 1;
453
455
  # (ExifTool enhancements allow for standard tag names or descriptions as the column headings,
454
456
  # add support for time zones and flexible coordinates, and allow new DateTime and Shift columns)
455
457
  #
456
- my ($param, $date, $secs);
458
+ my ($param, $date, $secs, %neg);
457
459
  foreach $param (@csvHeadings) {
458
460
  my $val = shift @vals;
459
461
  last unless defined $val;
@@ -479,6 +481,10 @@ DoneFix: $isDate = 1;
479
481
  }
480
482
  } elsif ($param eq 'lat' or $param eq 'lon') {
481
483
  $$fix{$param} = Image::ExifTool::GPS::ToDegrees($val, 1);
484
+ } elsif ($param eq 'latref') {
485
+ $neg{lat} = 1 if $val =~ /^S/i;
486
+ } elsif ($param eq 'lonref') {
487
+ $neg{lon} = 1 if $val =~ /^W/i;
482
488
  } elsif ($param eq 'runtime') {
483
489
  $date = $trackTime;
484
490
  $secs = $val;
@@ -486,6 +492,11 @@ DoneFix: $isDate = 1;
486
492
  $$fix{$param} = $val;
487
493
  }
488
494
  }
495
+ # make coordinate negative according to reference direction if necessary
496
+ foreach $param (keys %neg) {
497
+ next unless defined $$fix{$param};
498
+ $$fix{$param} = -abs($$fix{$param});
499
+ }
489
500
  if ($date and defined $secs and defined $$fix{lat} and defined $$fix{lon}) {
490
501
  $time = $date + $secs;
491
502
  $$has{alt} = 1 if defined $$fix{alt};
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::QuickTime;
18
18
 
19
- $VERSION = '1.06';
19
+ $VERSION = '1.07';
20
20
 
21
21
  sub ProcessGoPro($$$);
22
22
  sub ProcessString($$$);
@@ -386,6 +386,21 @@ my %addUnits = (
386
386
  Binary => 1,
387
387
  },
388
388
  # ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max)
389
+ # the following ref forum12825
390
+ MUID => {
391
+ Name => 'MediaUniqueID',
392
+ PrintConv => q{
393
+ my @a = split ' ', $val;
394
+ $_ = sprintf('%.8x',$_) foreach @a;
395
+ return join('', @a);
396
+ },
397
+ },
398
+ EXPT => 'MaximumShutterAngle',
399
+ MTRX => 'AccelerometerMatrix',
400
+ ORIN => 'InputOrientation',
401
+ ORIO => 'OutputOrientation',
402
+ UNIF => 'InputUniformity',
403
+ SROT => 'SensorReadoutTime',
389
404
  );
390
405
 
391
406
  # GoPro GPS5 tags (ref 2) (Hero5,Hero6)
@@ -18,11 +18,12 @@ use strict;
18
18
  use vars qw($VERSION);
19
19
  use Image::ExifTool qw(:DataAccess :Utils);
20
20
 
21
- $VERSION = '1.55';
21
+ $VERSION = '1.57';
22
22
 
23
23
  sub ProcessID3v2($$$);
24
24
  sub ProcessPrivate($$$);
25
25
  sub ProcessSynText($$$);
26
+ sub ProcessID3Dir($$$);
26
27
  sub ConvertID3v1Text($$);
27
28
  sub ConvertTimeStamp($);
28
29
 
@@ -69,9 +70,10 @@ my %dateTimeConv = (
69
70
  # This table is just for documentation purposes
70
71
  %Image::ExifTool::ID3::Main = (
71
72
  VARS => { NO_ID => 1 },
73
+ PROCESS_PROC => \&ProcessID3Dir, # (used to process 'id3 ' chunk in WAV files)
72
74
  NOTES => q{
73
- ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, AIFF, OGG,
74
- FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
75
+ ExifTool extracts ID3 and Lyrics3 information from MP3, MPEG, WAV, AIFF,
76
+ OGG, FLAC, APE, MPC and RealAudio files. ID3v2 tags which support multiple
75
77
  languages (eg. Comment and Lyrics) are extracted by specifying the tag name,
76
78
  followed by a dash ('-'), then a 3-character ISO 639-2 language code (eg.
77
79
  "Comment-spa"). See L<http://www.id3.org/> for the official ID3
@@ -1570,6 +1572,16 @@ sub ProcessID3($$)
1570
1572
  return $rtnVal;
1571
1573
  }
1572
1574
 
1575
+ #------------------------------------------------------------------------------
1576
+ # Process ID3 directory
1577
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference, 2) dummy tag table ref
1578
+ sub ProcessID3Dir($$$)
1579
+ {
1580
+ my ($et, $dirInfo, $tagTablePtr) = @_;
1581
+ $et->VerboseDir('ID3', undef, length ${$$dirInfo{DataPt}});
1582
+ return ProcessID3($et, $dirInfo);
1583
+ }
1584
+
1573
1585
  #------------------------------------------------------------------------------
1574
1586
  # Extract ID3 information from an MP3 audio file
1575
1587
  # Inputs: 0) ExifTool object reference, 1) dirInfo reference
@@ -14,7 +14,7 @@ use vars qw($VERSION);
14
14
  use Image::ExifTool qw(:DataAccess :Utils);
15
15
  use Image::ExifTool::Import;
16
16
 
17
- $VERSION = '1.03';
17
+ $VERSION = '1.05';
18
18
 
19
19
  sub ProcessJSON($$);
20
20
  sub ProcessTag($$$$%);
@@ -83,8 +83,12 @@ sub ProcessTag($$$$%)
83
83
  FoundTag($et, $tagTablePtr, $tag, $val, %flags, Struct => 1);
84
84
  return unless $et->Options('Struct') > 1;
85
85
  }
86
- foreach (sort keys %$val) {
87
- ProcessTag($et, $tagTablePtr, $tag . ucfirst, $$val{$_}, %flags, Flat => 1);
86
+ # support hashes with ordered keys
87
+ my @keys = $$val{_ordered_keys_} ? @{$$val{_ordered_keys_}} : sort keys %$val;
88
+ foreach (@keys) {
89
+ my $tg = $tag . ((/^\d/ and $tag =~ /\d$/) ? '_' : '') . ucfirst;
90
+ $tg =~ s/([^a-zA-Z])([a-z])/$1\U$2/g;
91
+ ProcessTag($et, $tagTablePtr, $tg, $$val{$_}, %flags, Flat => 1);
88
92
  }
89
93
  } elsif (ref $val eq 'ARRAY') {
90
94
  foreach (@$val) {