exiftool-vendored.pl 12.39.0 → 12.42.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 (46) hide show
  1. package/bin/Changes +66 -1
  2. package/bin/MANIFEST +1 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +2 -2
  6. package/bin/arg_files/exif2xmp.args +5 -0
  7. package/bin/arg_files/xmp2exif.args +6 -0
  8. package/bin/config_files/acdsee.config +6 -6
  9. package/bin/config_files/photoshop_paths.config +30 -7
  10. package/bin/config_files/picasa_faces.config +1 -1
  11. package/bin/config_files/pix4d.config +2 -2
  12. package/bin/config_files/tiff_version.config +2 -2
  13. package/bin/exiftool +54 -22
  14. package/bin/lib/Image/ExifTool/Canon.pm +89 -6
  15. package/bin/lib/Image/ExifTool/DJI.pm +59 -1
  16. package/bin/lib/Image/ExifTool/DNG.pm +8 -2
  17. package/bin/lib/Image/ExifTool/Exif.pm +53 -20
  18. package/bin/lib/Image/ExifTool/Geotag.pm +3 -2
  19. package/bin/lib/Image/ExifTool/ICC_Profile.pm +10 -8
  20. package/bin/lib/Image/ExifTool/ID3.pm +5 -5
  21. package/bin/lib/Image/ExifTool/MacOS.pm +9 -9
  22. package/bin/lib/Image/ExifTool/MakerNotes.pm +17 -1
  23. package/bin/lib/Image/ExifTool/Nikon.pm +44 -12
  24. package/bin/lib/Image/ExifTool/NikonCustom.pm +4 -1
  25. package/bin/lib/Image/ExifTool/Olympus.pm +27 -7
  26. package/bin/lib/Image/ExifTool/PDF.pm +2 -1
  27. package/bin/lib/Image/ExifTool/Panasonic.pm +10 -1
  28. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  29. package/bin/lib/Image/ExifTool/Photoshop.pm +6 -5
  30. package/bin/lib/Image/ExifTool/QuickTime.pm +9 -5
  31. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +2 -2
  32. package/bin/lib/Image/ExifTool/Samsung.pm +237 -2
  33. package/bin/lib/Image/ExifTool/Shortcuts.pm +3 -1
  34. package/bin/lib/Image/ExifTool/Sony.pm +10 -4
  35. package/bin/lib/Image/ExifTool/TagLookup.pm +6376 -6354
  36. package/bin/lib/Image/ExifTool/TagNames.pod +79 -28
  37. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +7 -3
  38. package/bin/lib/Image/ExifTool/WriteXMP.pl +2 -0
  39. package/bin/lib/Image/ExifTool/Writer.pl +1 -1
  40. package/bin/lib/Image/ExifTool/XMP.pm +9 -1
  41. package/bin/lib/Image/ExifTool/XMPStruct.pl +21 -7
  42. package/bin/lib/Image/ExifTool.pm +20 -12
  43. package/bin/lib/Image/ExifTool.pod +7 -6
  44. package/bin/perl-Image-ExifTool.spec +1 -1
  45. package/bin/pp_build_exe.args +4 -4
  46. package/package.json +14 -3
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
21
21
  sub WriteUnknownOrPreview($$$);
22
22
  sub FixLeicaBase($$;$);
23
23
 
24
- $VERSION = '2.10';
24
+ $VERSION = '2.11';
25
25
 
26
26
  my $debug; # set to 1 to enable debugging code
27
27
 
@@ -89,6 +89,11 @@ my $debug; # set to 1 to enable debugging code
89
89
  FixBase => 1, # necessary for AVI and MOV videos
90
90
  },
91
91
  },
92
+ {
93
+ Name => 'MakerNoteDJIInfo',
94
+ Condition => '$$valPt =~ /^\[ae_dbg_info:/',
95
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
96
+ },
92
97
  {
93
98
  Name => 'MakerNoteDJI',
94
99
  Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^...\@AMBA/s',
@@ -570,6 +575,17 @@ my $debug; # set to 1 to enable debugging code
570
575
  ByteOrder => 'Unknown',
571
576
  },
572
577
  },
578
+ {
579
+ Name => 'MakerNoteOlympus3',
580
+ # new Olympus maker notes start with "OLYMPUS\0"
581
+ Condition => '$$valPt =~ /^OM SYSTEM\0/',
582
+ SubDirectory => {
583
+ TagTable => 'Image::ExifTool::Olympus::Main',
584
+ Start => '$valuePtr + 16',
585
+ Base => '$start - 16',
586
+ ByteOrder => 'Unknown',
587
+ },
588
+ },
573
589
  {
574
590
  Name => 'MakerNoteLeica',
575
591
  # (starts with "LEICA\0\0\0")
@@ -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.04';
66
+ $VERSION = '4.06';
67
67
 
68
68
  sub LensIDConv($$$);
69
69
  sub ProcessNikonAVI($$$);
@@ -437,6 +437,7 @@ sub GetAFPointGrid($$;$);
437
437
  'A5 40 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC OS HSM',
438
438
  # LensFStops varies with FocalLength for this lens (ref 2):
439
439
  '92 2C 2D 88 2C 40 4B 0E' => 'Sigma 18-250mm F3.5-6.3 DC Macro OS HSM', #2
440
+ '87 2C 2D 8E 2C 40 4B 0E' => 'Sigma 18-300mm F3.5-6.3 DC Macro HSM', #30
440
441
  # '92 2C 2D 88 2C 40 4B 0E' (250mm)
441
442
  # '92 2B 2D 88 2C 40 4B 0E' (210mm)
442
443
  # '92 2C 2D 88 2C 40 4B 0E' (185mm)
@@ -495,6 +496,7 @@ sub GetAFPointGrid($$;$);
495
496
  '7A 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II',
496
497
  'EE 48 5C 80 24 24 4B 06' => 'Sigma 70-200mm F2.8 EX APO DG Macro HSM II', #JD
497
498
  '9C 48 5C 80 24 24 4B 0E' => 'Sigma 70-200mm F2.8 EX DG OS HSM', #Rolando Ruzic
499
+ 'BB 48 5C 80 24 24 4B 4E' => 'Sigma 70-200mm F2.8 DG OS HSM | S', #forum13207
498
500
  '02 46 5C 82 25 25 02 00' => 'Sigma 70-210mm F2.8 APO', #JD
499
501
  '02 40 5C 82 2C 35 02 00' => 'Sigma APO 70-210mm F3.5-4.5',
500
502
  '26 3C 5C 82 30 3C 1C 02' => 'Sigma 70-210mm F4-5.6 UC-II',
@@ -665,6 +667,7 @@ sub GetAFPointGrid($$;$);
665
667
  '00 54 55 55 0C 0C 00 00' => 'Voigtlander Nokton 58mm F1.4 SLII',
666
668
  '00 40 64 64 2C 2C 00 00' => 'Voigtlander APO-Lanthar 90mm F3.5 SLII Close Focus',
667
669
  '07 40 30 45 2D 35 03 02.2' => 'Voigtlander Ultragon 19-35mm F3.5-4.5 VMV', #NJ
670
+ '71 48 64 64 24 24 00 00' => 'Voigtlander APO-Skopar 90mm F2.8 SL IIs', #30
668
671
  #
669
672
  '00 40 2D 2D 2C 2C 00 00' => 'Carl Zeiss Distagon T* 3.5/18 ZF.2',
670
673
  '00 48 27 27 24 24 00 00' => 'Carl Zeiss Distagon T* 2.8/15 ZF.2', #MykytaKozlov
@@ -1220,6 +1223,16 @@ my %binaryDataAttrs = (
1220
1223
  my %base64bin = ( ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)' );
1221
1224
  my %base64int32u = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); unpack("V",$$val)' );
1222
1225
  my %base64bytes = ( ValueConv => 'my $val=Image::ExifTool::XMP::DecodeBase64($val); join(".",unpack("C*",$$val))' );
1226
+ my %base64double = (
1227
+ ValueConv => q{
1228
+ my $val=Image::ExifTool::XMP::DecodeBase64($val);
1229
+ my $saveOrder = GetByteOrder();
1230
+ SetByteOrder('II');
1231
+ $val = GetDouble($val,0);
1232
+ SetByteOrder($saveOrder);
1233
+ return $val;
1234
+ },
1235
+ );
1223
1236
  my %base64coord = (
1224
1237
  ValueConv => q{
1225
1238
  my $val=Image::ExifTool::XMP::DecodeBase64($val);
@@ -4180,7 +4193,7 @@ my %base64coord = (
4180
4193
  Format => 'int16u',
4181
4194
  },
4182
4195
  0x43 => {
4183
- Name => 'FocusPositionHoriontal',
4196
+ Name => 'FocusPositionHorizontal',
4184
4197
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29 ); }, #493 focus points for Z9 fall in a 30x18 grid (some coordinates are not accessible)
4185
4198
  },
4186
4199
  0x45 => {
@@ -8565,7 +8578,19 @@ my %nikonFocalConversions = (
8565
8578
  444 => { Name => 'FlashRemoteControl', PrintConv => \%flashRemoteControlZ7, Unknown => 1},
8566
8579
  456 => { Name => 'FlashWirelessOption', PrintConv => \%flashWirelessOptionZ7, Unknown => 1},
8567
8580
  #526 FocusMode
8568
- #528 AFAreaMode
8581
+ 528 => {
8582
+ Name => 'AFAreaMode',
8583
+ PrintConv => {
8584
+ 1 => 'Single',
8585
+ 2 => 'Dynamic',
8586
+ 3 => 'Wide (S)',
8587
+ 4 => 'Wide (L)',
8588
+ 5 => '3D',
8589
+ 6 => 'Auto',
8590
+ 12 => 'Wide (C1)',
8591
+ 13 => 'Wide (C2)',
8592
+ },
8593
+ },
8569
8594
  530 => { Name => 'VRMode', PrintConv => \%vRModeZ9},
8570
8595
  534 => {
8571
8596
  Name => 'BracketSet',
@@ -8634,6 +8659,8 @@ my %nikonFocalConversions = (
8634
8659
  2 => 'H.265 8-bit (MOV)',
8635
8660
  3 => 'H.265 10-bit (MOV)',
8636
8661
  4 => 'ProRes 422 HQ 10-bit (MOV)',
8662
+ 5 => 'ProRes RAW HQ 12-bit (MOV)',
8663
+ 6 => 'NRAW 12-bit (NEV)'
8637
8664
  },
8638
8665
  },
8639
8666
  616 => {
@@ -11055,17 +11082,22 @@ my %nikonFocalConversions = (
11055
11082
  },
11056
11083
  GPSAltitude => {
11057
11084
  Groups => { 2 => 'Location' },
11058
- ValueConv => q{
11059
- my $val=Image::ExifTool::XMP::DecodeBase64($val);
11060
- my $saveOrder = GetByteOrder();
11061
- SetByteOrder('II');
11062
- $val = GetDouble($val,0);
11063
- SetByteOrder($saveOrder);
11064
- return $val;
11065
- },
11085
+ %base64double,
11066
11086
  PrintConv => '"$val m"',
11067
11087
  },
11068
- GPSMapDatum => { },
11088
+ GPSMapDatum => { Groups => { 2 => 'Location' } },
11089
+ GPSImgDirection => {
11090
+ Groups => { 2 => 'Location' },
11091
+ %base64double,
11092
+ PrintConv => 'sprintf("%.2f", $val)',
11093
+ },
11094
+ GPSImgDirectionRef => {
11095
+ Groups => { 2 => 'Location' },
11096
+ PrintConv => {
11097
+ M => 'Magnetic North',
11098
+ T => 'True North',
11099
+ },
11100
+ },
11069
11101
  );
11070
11102
  %Image::ExifTool::Nikon::sdc = (
11071
11103
  GROUPS => { 0 => 'XMP', 1 => 'XMP-sdc', 2 => 'Image' },
@@ -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',
@@ -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.75';
43
+ $VERSION = '2.78';
44
44
 
45
45
  sub PrintLensInfo($$$);
46
46
 
@@ -432,6 +432,7 @@ my %olympusCameraTypes = (
432
432
  S0089 => 'E-M5MarkIII',
433
433
  S0092 => 'E-M1MarkIII', #IB
434
434
  S0093 => 'E-P7', #IB
435
+ S0095 => 'OM-1', #IB
435
436
  SR45 => 'D220',
436
437
  SR55 => 'D320L',
437
438
  SR83 => 'D340L',
@@ -1910,6 +1911,23 @@ my %indexInfo = (
1910
1911
  Name => 'FocusBracketStepSize',
1911
1912
  Writable => 'int8u',
1912
1913
  },
1914
+ 0x309 => { #forum13341
1915
+ Name => 'AISubjectTrackingMode',
1916
+ Writable => 'int16u',
1917
+ ValueConv => '($val >> 8) . " " . ($val & 0xff)',
1918
+ ValueConvInv => 'my @a = split " ", $val; $val = $a[0]*256 + $a[1]',
1919
+ PrintConv => [{
1920
+ 0 => 'Off',
1921
+ 1 => 'Motorsports',
1922
+ 2 => 'Airplnes',
1923
+ 3 => 'Trains',
1924
+ 4 => 'Birds',
1925
+ 5 => 'Dogs & Cats',
1926
+ },{
1927
+ 0 => 'Object Not Found',
1928
+ 1 => 'Object Found',
1929
+ }],
1930
+ },
1913
1931
  0x400 => { #6
1914
1932
  Name => 'FlashMode',
1915
1933
  Writable => 'int16u',
@@ -2537,11 +2555,13 @@ my %indexInfo = (
2537
2555
  '3 8' => 'ND8 (3EV)', #IB
2538
2556
  '3 16' => 'ND16 (4EV)', #IB
2539
2557
  '3 32' => 'ND32 (5EV)', #IB
2558
+ '3 64' => 'ND64 (6EV)', #forum13341
2540
2559
  '5 4' => 'HDR1', #forum8906
2541
2560
  '6 4' => 'HDR2', #forum8906
2542
2561
  '8 8' => 'Tripod high resolution', #IB
2543
2562
  '9 *' => 'Focus-stacked (* images)', #IB (* = 2-15)
2544
- '11 16' => 'Hand-held high resolution', #IB (perhaps '11 15' would be possible, ref 24)
2563
+ '11 12' => 'Hand-held high resolution (11 12)', #forum13341 (OM-1)
2564
+ '11 16' => 'Hand-held high resolution (11 16)', #IB (perhaps '11 15' would be possible, ref 24)
2545
2565
  OTHER => sub {
2546
2566
  my ($val, $inv, $conv) = @_;
2547
2567
  if ($inv) {
@@ -3430,7 +3450,7 @@ my %indexInfo = (
3430
3450
  0x2a => {
3431
3451
  Name => 'FNumber',
3432
3452
  Format => 'rational64u',
3433
- PrintConv => 'sprintf("%.1f",$val)',
3453
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3434
3454
  },
3435
3455
  0x32 => { #(NC)
3436
3456
  Name => 'ExposureCompensation',
@@ -3476,7 +3496,7 @@ my %indexInfo = (
3476
3496
  0x3a => {
3477
3497
  Name => 'FNumber',
3478
3498
  Format => 'rational64u',
3479
- PrintConv => 'sprintf("%.1f",$val)',
3499
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3480
3500
  },
3481
3501
  0x42 => { #(NC)
3482
3502
  Name => 'ExposureCompensation',
@@ -3527,7 +3547,7 @@ my %indexInfo = (
3527
3547
  0x28 => {
3528
3548
  Name => 'FNumber',
3529
3549
  Format => 'rational64u',
3530
- PrintConv => 'sprintf("%.1f",$val)',
3550
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3531
3551
  },
3532
3552
  0x30 => { #(NC)
3533
3553
  Name => 'ExposureCompensation',
@@ -3744,7 +3764,7 @@ my %indexInfo = (
3744
3764
  0x5a => {
3745
3765
  Name => 'FNumber',
3746
3766
  Format => 'rational64u',
3747
- PrintConv => 'sprintf("%.1f",$val)',
3767
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3748
3768
  },
3749
3769
  0x7f => {
3750
3770
  Name => 'DateTimeOriginal', #(NC)
@@ -3789,7 +3809,7 @@ my %indexInfo = (
3789
3809
  0x5e => {
3790
3810
  Name => 'FNumber',
3791
3811
  Format => 'rational64u',
3792
- PrintConv => 'sprintf("%.1f",$val)',
3812
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
3793
3813
  },
3794
3814
  0x83 => {
3795
3815
  Name => 'DateTime1',
@@ -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.17';
41
41
 
42
42
  sub ProcessLeicaLEIC($$$);
43
43
  sub WhiteBalanceConv($;$$);
@@ -2472,6 +2472,15 @@ my %shootingMode = (
2472
2472
  Start => 12,
2473
2473
  },
2474
2474
  },
2475
+ 0x200080 => { # (GH6)
2476
+ Name => 'ExifData',
2477
+ Condition => '$$valPt =~ /^\xff\xd8\xff\xe1..Exif\0\0/s',
2478
+ SubDirectory => {
2479
+ TagTable => 'Image::ExifTool::Exif::Main',
2480
+ ProcessProc => \&Image::ExifTool::ProcessTIFF,
2481
+ Start => 12,
2482
+ },
2483
+ },
2475
2484
  );
2476
2485
 
2477
2486
  # Panasonic Composite tags
@@ -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',
@@ -248,11 +248,12 @@ my %unicodeString = (
248
248
  Protected => 1,
249
249
  Notes => q{
250
250
  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
251
+ that the XMP is synchronized with the IPTC. The MWG recommendation is to
252
+ ignore the XMP if IPTCDigest exists and doesn't match the CurrentIPTCDigest.
253
+ When writing, special values of "new" and "old" represent the digests of the
254
+ IPTC from the edited and original files respectively, and are undefined if
255
+ the IPTC does not exist in the respective file. Set this to "new" as an
256
+ indication that the XMP is synchronized with the IPTC
256
257
  },
257
258
  # also note the 'new' feature requires that the IPTC comes before this tag is written
258
259
  ValueConv => 'unpack("H*", $val)',
@@ -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.73';
50
+ $VERSION = '2.74';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -2232,7 +2232,7 @@ my %eeBox2 = (
2232
2232
  # 4 ? - "1e 00"
2233
2233
  # 6 int16u - record length in bytes
2234
2234
  # 8 ? - "23 01 00 00 00 00 00 00"
2235
- # 16 - start of records (each record ends in an int64u timestamp in ns)
2235
+ # 16 - start of records (each record ends in an int64u timestamp "ts" in ns)
2236
2236
  # RDTA - float[4],ts: "-0.31289672 -0.2245330 11.303817 0 775.780"
2237
2237
  # RDTB - float[4],ts: "-0.04841613 -0.2166595 0.0724792 0 775.780"
2238
2238
  # RDTC - float[4],ts: "27.60925 -27.10037 -13.27285 0 775.829"
@@ -8795,16 +8795,20 @@ sub ProcessSampleDesc($$$)
8795
8795
 
8796
8796
  my $num = Get32u($dataPt, 4); # get number of sample entries in table
8797
8797
  $pos += 8;
8798
- my $i;
8798
+ my ($i, $err);
8799
8799
  for ($i=0; $i<$num; ++$i) { # loop through sample entries
8800
- last if $pos + 8 > $dirLen;
8800
+ $pos + 8 > $dirLen and $err = 1, last;
8801
8801
  my $size = Get32u($dataPt, $pos);
8802
- last if $pos + $size > $dirLen;
8802
+ $pos + $size > $dirLen and $err = 1, last;
8803
8803
  $$dirInfo{DirStart} = $pos;
8804
8804
  $$dirInfo{DirLen} = $size;
8805
8805
  ProcessHybrid($et, $dirInfo, $tagTablePtr);
8806
8806
  $pos += $size;
8807
8807
  }
8808
+ if ($err and $$et{HandlerType}) {
8809
+ my $grp = $$et{SET_GROUP1} || $$dirInfo{Parent} || 'unknown';
8810
+ $et->Warn("Truncated $$et{HandlerType} sample table for $grp");
8811
+ }
8808
8812
  return 1;
8809
8813
  }
8810
8814
 
@@ -1144,13 +1144,13 @@ sub ProcessSamples($)
1144
1144
  }
1145
1145
  @$size < @$start + $samplesPerChunk and $et->WarnOnce('Sample size error'), last;
1146
1146
  my $sampleStart = $chunkStart;
1147
- for ($i=0; ; ) {
1147
+ Sample: for ($i=0; ; ) {
1148
1148
  push @$start, $sampleStart;
1149
1149
  if (defined $time) {
1150
1150
  until ($timeCount) {
1151
1151
  if (@$stts < 2) {
1152
1152
  undef $time;
1153
- last;
1153
+ last Sample;
1154
1154
  }
1155
1155
  $timeCount = shift @$stts;
1156
1156
  $timeDelta = shift @$stts;
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
24
 
25
- $VERSION = '1.50';
25
+ $VERSION = '1.52';
26
26
 
27
27
  sub WriteSTMN($$$);
28
28
  sub ProcessINFO($$$);
@@ -454,6 +454,8 @@ my %formatMinMax = (
454
454
  0xa018 => { #1
455
455
  Name => 'ExposureTime',
456
456
  Writable => 'rational64u',
457
+ ValueConv => '$val=~s/ .*//; $val', # some models write 2 values here
458
+ ValueConvInv => '$val',
457
459
  PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
458
460
  PrintConvInv => '$val',
459
461
  },
@@ -461,6 +463,8 @@ my %formatMinMax = (
461
463
  Name => 'FNumber',
462
464
  Priority => 0,
463
465
  Writable => 'rational64u',
466
+ ValueConv => '$val=~s/ .*//; $val', # some models write 2 values here
467
+ ValueConvInv => '$val',
464
468
  PrintConv => 'sprintf("%.1f",$val)',
465
469
  PrintConvInv => '$val',
466
470
  },
@@ -996,7 +1000,238 @@ my %formatMinMax = (
996
1000
  '0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161
997
1001
  # 0x0aa1-name - seen 'MCC_Data'
998
1002
  # 0x0aa1 - seen '204','222','234','302','429'
999
- '0x0aa1' => 'MCCData', # (unknown meaning)
1003
+ '0x0aa1' => {
1004
+ Name => 'MCCData',
1005
+ Groups => { 2 => 'Location' },
1006
+ PrintConv => {
1007
+ 202 => 'Greece',
1008
+ 204 => 'Netherlands',
1009
+ 206 => 'Belgium',
1010
+ 208 => 'France',
1011
+ 212 => 'Monaco',
1012
+ 213 => 'Andorra',
1013
+ 214 => 'Spain',
1014
+ 216 => 'Hungary',
1015
+ 218 => 'Bosnia & Herzegov.',
1016
+ 219 => 'Croatia',
1017
+ 220 => 'Serbia',
1018
+ 221 => 'Kosovo',
1019
+ 222 => 'Italy',
1020
+ 226 => 'Romania',
1021
+ 228 => 'Switzerland',
1022
+ 230 => 'Czech Rep.',
1023
+ 231 => 'Slovakia',
1024
+ 232 => 'Austria',
1025
+ 234 => 'United Kingdom',
1026
+ 235 => 'United Kingdom',
1027
+ 238 => 'Denmark',
1028
+ 240 => 'Sweden',
1029
+ 242 => 'Norway',
1030
+ 244 => 'Finland',
1031
+ 246 => 'Lithuania',
1032
+ 247 => 'Latvia',
1033
+ 248 => 'Estonia',
1034
+ 250 => 'Russian Federation',
1035
+ 255 => 'Ukraine',
1036
+ 257 => 'Belarus',
1037
+ 259 => 'Moldova',
1038
+ 260 => 'Poland',
1039
+ 262 => 'Germany',
1040
+ 266 => 'Gibraltar',
1041
+ 268 => 'Portugal',
1042
+ 270 => 'Luxembourg',
1043
+ 272 => 'Ireland',
1044
+ 274 => 'Iceland',
1045
+ 276 => 'Albania',
1046
+ 278 => 'Malta',
1047
+ 280 => 'Cyprus',
1048
+ 282 => 'Georgia',
1049
+ 283 => 'Armenia',
1050
+ 284 => 'Bulgaria',
1051
+ 286 => 'Turkey',
1052
+ 288 => 'Faroe Islands',
1053
+ 289 => 'Abkhazia',
1054
+ 290 => 'Greenland',
1055
+ 292 => 'San Marino',
1056
+ 293 => 'Slovenia',
1057
+ 294 => 'Macedonia',
1058
+ 295 => 'Liechtenstein',
1059
+ 297 => 'Montenegro',
1060
+ 302 => 'Canada',
1061
+ 308 => 'St. Pierre & Miquelon',
1062
+ 310 => 'United States / Guam',
1063
+ 311 => 'United States / Guam',
1064
+ 312 => 'United States',
1065
+ 316 => 'United States',
1066
+ 330 => 'Puerto Rico',
1067
+ 334 => 'Mexico',
1068
+ 338 => 'Jamaica',
1069
+ 340 => 'French Guiana / Guadeloupe / Martinique',
1070
+ 342 => 'Barbados',
1071
+ 344 => 'Antigua and Barbuda',
1072
+ 346 => 'Cayman Islands',
1073
+ 348 => 'British Virgin Islands',
1074
+ 350 => 'Bermuda',
1075
+ 352 => 'Grenada',
1076
+ 354 => 'Montserrat',
1077
+ 356 => 'Saint Kitts and Nevis',
1078
+ 358 => 'Saint Lucia',
1079
+ 360 => 'St. Vincent & Gren.',
1080
+ 362 => 'Bonaire, Sint Eustatius and Saba / Curacao / Netherlands Antilles',
1081
+ 363 => 'Aruba',
1082
+ 364 => 'Bahamas',
1083
+ 365 => 'Anguilla',
1084
+ 366 => 'Dominica',
1085
+ 368 => 'Cuba',
1086
+ 370 => 'Dominican Republic',
1087
+ 372 => 'Haiti',
1088
+ 374 => 'Trinidad and Tobago',
1089
+ 376 => 'Turks and Caicos Islands / US Virgin Islands',
1090
+ 400 => 'Azerbaijan',
1091
+ 401 => 'Kazakhstan',
1092
+ 402 => 'Bhutan',
1093
+ 404 => 'India',
1094
+ 405 => 'India',
1095
+ 410 => 'Pakistan',
1096
+ 412 => 'Afghanistan',
1097
+ 413 => 'Sri Lanka',
1098
+ 414 => 'Myanmar (Burma)',
1099
+ 415 => 'Lebanon',
1100
+ 416 => 'Jordan',
1101
+ 417 => 'Syrian Arab Republic',
1102
+ 418 => 'Iraq',
1103
+ 419 => 'Kuwait',
1104
+ 420 => 'Saudi Arabia',
1105
+ 421 => 'Yemen',
1106
+ 422 => 'Oman',
1107
+ 424 => 'United Arab Emirates',
1108
+ 425 => 'Israel / Palestinian Territory',
1109
+ 426 => 'Bahrain',
1110
+ 427 => 'Qatar',
1111
+ 428 => 'Mongolia',
1112
+ 429 => 'Nepal',
1113
+ 430 => 'United Arab Emirates',
1114
+ 431 => 'United Arab Emirates',
1115
+ 432 => 'Iran',
1116
+ 434 => 'Uzbekistan',
1117
+ 436 => 'Tajikistan',
1118
+ 437 => 'Kyrgyzstan',
1119
+ 438 => 'Turkmenistan',
1120
+ 440 => 'Japan',
1121
+ 441 => 'Japan',
1122
+ 450 => 'South Korea',
1123
+ 452 => 'Viet Nam',
1124
+ 454 => 'Hongkong, China',
1125
+ 455 => 'Macao, China',
1126
+ 456 => 'Cambodia',
1127
+ 457 => 'Laos P.D.R.',
1128
+ 460 => 'China',
1129
+ 466 => 'Taiwan',
1130
+ 467 => 'North Korea',
1131
+ 470 => 'Bangladesh',
1132
+ 472 => 'Maldives',
1133
+ 502 => 'Malaysia',
1134
+ 505 => 'Australia',
1135
+ 510 => 'Indonesia',
1136
+ 514 => 'Timor-Leste',
1137
+ 515 => 'Philippines',
1138
+ 520 => 'Thailand',
1139
+ 525 => 'Singapore',
1140
+ 528 => 'Brunei Darussalam',
1141
+ 530 => 'New Zealand',
1142
+ 537 => 'Papua New Guinea',
1143
+ 539 => 'Tonga',
1144
+ 540 => 'Solomon Islands',
1145
+ 541 => 'Vanuatu',
1146
+ 542 => 'Fiji',
1147
+ 544 => 'American Samoa',
1148
+ 545 => 'Kiribati',
1149
+ 546 => 'New Caledonia',
1150
+ 547 => 'French Polynesia',
1151
+ 548 => 'Cook Islands',
1152
+ 549 => 'Samoa',
1153
+ 550 => 'Micronesia',
1154
+ 552 => 'Palau',
1155
+ 553 => 'Tuvalu',
1156
+ 555 => 'Niue',
1157
+ 602 => 'Egypt',
1158
+ 603 => 'Algeria',
1159
+ 604 => 'Morocco',
1160
+ 605 => 'Tunisia',
1161
+ 606 => 'Libya',
1162
+ 607 => 'Gambia',
1163
+ 608 => 'Senegal',
1164
+ 609 => 'Mauritania',
1165
+ 610 => 'Mali',
1166
+ 611 => 'Guinea',
1167
+ 612 => 'Ivory Coast',
1168
+ 613 => 'Burkina Faso',
1169
+ 614 => 'Niger',
1170
+ 615 => 'Togo',
1171
+ 616 => 'Benin',
1172
+ 617 => 'Mauritius',
1173
+ 618 => 'Liberia',
1174
+ 619 => 'Sierra Leone',
1175
+ 620 => 'Ghana',
1176
+ 621 => 'Nigeria',
1177
+ 622 => 'Chad',
1178
+ 623 => 'Central African Rep.',
1179
+ 624 => 'Cameroon',
1180
+ 625 => 'Cape Verde',
1181
+ 626 => 'Sao Tome & Principe',
1182
+ 627 => 'Equatorial Guinea',
1183
+ 628 => 'Gabon',
1184
+ 629 => 'Congo, Republic',
1185
+ 630 => 'Congo, Dem. Rep.',
1186
+ 631 => 'Angola',
1187
+ 632 => 'Guinea-Bissau',
1188
+ 633 => 'Seychelles',
1189
+ 634 => 'Sudan',
1190
+ 635 => 'Rwanda',
1191
+ 636 => 'Ethiopia',
1192
+ 637 => 'Somalia',
1193
+ 638 => 'Djibouti',
1194
+ 639 => 'Kenya',
1195
+ 640 => 'Tanzania',
1196
+ 641 => 'Uganda',
1197
+ 642 => 'Burundi',
1198
+ 643 => 'Mozambique',
1199
+ 645 => 'Zambia',
1200
+ 646 => 'Madagascar',
1201
+ 647 => 'Reunion',
1202
+ 648 => 'Zimbabwe',
1203
+ 649 => 'Namibia',
1204
+ 650 => 'Malawi',
1205
+ 651 => 'Lesotho',
1206
+ 652 => 'Botswana',
1207
+ 653 => 'Swaziland',
1208
+ 654 => 'Comoros',
1209
+ 655 => 'South Africa',
1210
+ 657 => 'Eritrea',
1211
+ 659 => 'South Sudan',
1212
+ 702 => 'Belize',
1213
+ 704 => 'Guatemala',
1214
+ 706 => 'El Salvador',
1215
+ 708 => 'Honduras',
1216
+ 710 => 'Nicaragua',
1217
+ 712 => 'Costa Rica',
1218
+ 714 => 'Panama',
1219
+ 716 => 'Peru',
1220
+ 722 => 'Argentina Republic',
1221
+ 724 => 'Brazil',
1222
+ 730 => 'Chile',
1223
+ 732 => 'Colombia',
1224
+ 734 => 'Venezuela',
1225
+ 736 => 'Bolivia',
1226
+ 738 => 'Guyana',
1227
+ 740 => 'Ecuador',
1228
+ 744 => 'Paraguay',
1229
+ 746 => 'Suriname',
1230
+ 748 => 'Uruguay',
1231
+ 750 => 'Falkland Islands (Malvinas)',
1232
+ 901 => 'International Networks / Satellite Networks',
1233
+ },
1234
+ },
1000
1235
  # 0x0ab0-name - seen 'DualShot_Meta_Info'
1001
1236
  '0x0ab1-name' => {
1002
1237
  Name => 'DepthMapName',