exiftool-vendored.pl 12.85.0 → 12.89.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 (47) hide show
  1. package/bin/Changes +69 -0
  2. package/bin/MANIFEST +1 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +16 -16
  5. package/bin/README +3 -2
  6. package/bin/build_geolocation +6 -3
  7. package/bin/config_files/example.config +5 -0
  8. package/bin/config_files/onone.config +28 -0
  9. package/bin/exiftool +20 -12
  10. package/bin/lib/Image/ExifTool/AIFF.pm +8 -4
  11. package/bin/lib/Image/ExifTool/ASF.pm +4 -1
  12. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +14 -8
  13. package/bin/lib/Image/ExifTool/Canon.pm +90 -6
  14. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  15. package/bin/lib/Image/ExifTool/CanonVRD.pm +5 -2
  16. package/bin/lib/Image/ExifTool/FujiFilm.pm +46 -4
  17. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  18. package/bin/lib/Image/ExifTool/Geolocation.pm +6 -0
  19. package/bin/lib/Image/ExifTool/ID3.pm +39 -33
  20. package/bin/lib/Image/ExifTool/InDesign.pm +8 -4
  21. package/bin/lib/Image/ExifTool/Jpeg2000.pm +0 -1
  22. package/bin/lib/Image/ExifTool/Lang/de.pm +2 -2
  23. package/bin/lib/Image/ExifTool/Matroska.pm +66 -10
  24. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -2
  25. package/bin/lib/Image/ExifTool/Nikon.pm +3 -2
  26. package/bin/lib/Image/ExifTool/Olympus.pm +27 -17
  27. package/bin/lib/Image/ExifTool/Panasonic.pm +1 -0
  28. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
  29. package/bin/lib/Image/ExifTool/Pentax.pm +80 -14
  30. package/bin/lib/Image/ExifTool/QuickTime.pm +52 -12
  31. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +24 -2
  32. package/bin/lib/Image/ExifTool/RIFF.pm +20 -10
  33. package/bin/lib/Image/ExifTool/Samsung.pm +29 -1
  34. package/bin/lib/Image/ExifTool/Sony.pm +21 -11
  35. package/bin/lib/Image/ExifTool/TagLookup.pm +6804 -6788
  36. package/bin/lib/Image/ExifTool/TagNames.pod +111 -50
  37. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  38. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +84 -15
  39. package/bin/lib/Image/ExifTool/Writer.pl +7 -4
  40. package/bin/lib/Image/ExifTool/XMP.pm +8 -8
  41. package/bin/lib/Image/ExifTool/XMP2.pl +51 -30
  42. package/bin/lib/Image/ExifTool/ZIP.pm +8 -4
  43. package/bin/lib/Image/ExifTool.pm +65 -42
  44. package/bin/lib/Image/ExifTool.pod +28 -20
  45. package/bin/perl-Image-ExifTool.spec +1 -1
  46. package/bin/pp_build_exe.args +4 -4
  47. package/package.json +3 -3
@@ -4697,7 +4697,7 @@ my %binaryDataAttrs = (
4697
4697
  3 => 'Grip Battery',
4698
4698
  4 => 'External Power Supply', #PH
4699
4699
  },
4700
- },{ #PH
4700
+ },{ #PH (forum15976)
4701
4701
  Name => 'PowerSource',
4702
4702
  Mask => 0x0f,
4703
4703
  Notes => 'K-3III',
@@ -4709,8 +4709,18 @@ my %binaryDataAttrs = (
4709
4709
  2 => 'Grip Battery',
4710
4710
  4 => 'External Power Supply',
4711
4711
  },
4712
- },{
4713
4712
  }],
4713
+ 0.2 => {
4714
+ Name => 'PowerAvailable',
4715
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
4716
+ Notes => 'K-3III',
4717
+ Mask => 0xf0,
4718
+ PrintConv => { BITMASK => {
4719
+ 0 => 'Body Battery',
4720
+ 1 => 'Grip Battery',
4721
+ 3 => 'External Power Supply',
4722
+ }},
4723
+ },
4714
4724
  1.1 => [
4715
4725
  {
4716
4726
  Name => 'BodyBatteryState',
@@ -4735,11 +4745,6 @@ my %binaryDataAttrs = (
4735
4745
  4 => 'Close to Full',
4736
4746
  5 => 'Full',
4737
4747
  },
4738
- },{
4739
- Name => 'BodyBatteryState',
4740
- Notes => 'decoding unknown for some models',
4741
- Unknown => 1, # (doesn't appear to be valid for the K-3 III)
4742
- Mask => 0xf0,
4743
4748
  },
4744
4749
  ],
4745
4750
  1.2 => [
@@ -4754,11 +4759,6 @@ my %binaryDataAttrs = (
4754
4759
  3 => 'Running Low',
4755
4760
  4 => 'Full',
4756
4761
  },
4757
- },{
4758
- Name => 'GripBatteryState',
4759
- Notes => 'decoding unknown for other models',
4760
- Unknown => 1, # (doesn't appear to be valid for the K-5)
4761
- Mask => 0x0f,
4762
4762
  },
4763
4763
  ],
4764
4764
  # internal and grip battery voltage Analogue to Digital measurements,
@@ -4794,7 +4794,19 @@ my %binaryDataAttrs = (
4794
4794
  # BodyBatteryVoltage4 6.10 V 7.55 V 7.45 V
4795
4795
  # "Meas" open-circuit voltages with DVM: AB=0V, AC=+8.33V, BC=+8.22V
4796
4796
  # (terminal "C" is closest to edge of battery)
4797
- },
4797
+ },{
4798
+ Name => 'BodyBatteryState',
4799
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
4800
+ Notes => 'K-3III',
4801
+ PrintConv => {
4802
+ 0 => 'Empty or Missing',
4803
+ 1 => 'Almost Empty',
4804
+ 2 => 'Running Low',
4805
+ 3 => 'Half Full',
4806
+ 4 => 'Close to Full',
4807
+ 5 => 'Full',
4808
+ },
4809
+ }
4798
4810
  ],
4799
4811
  3 => [
4800
4812
  {
@@ -4810,7 +4822,11 @@ my %binaryDataAttrs = (
4810
4822
  Name => 'BodyBatteryADLoad',
4811
4823
  Description => 'Body Battery A/D Load',
4812
4824
  Condition => '$$self{Model} =~ /(\*ist|K100D|K200D)\b/',
4813
- },
4825
+ },{
4826
+ Name => 'BodyBatteryPercent',
4827
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
4828
+ Notes => 'K-3III',
4829
+ }
4814
4830
  ],
4815
4831
  4 => [
4816
4832
  {
@@ -4827,6 +4843,15 @@ my %binaryDataAttrs = (
4827
4843
  PrintConv => 'sprintf("%.2f V", $val)',
4828
4844
  PrintConvInv => '$val =~ s/\s*V$//',
4829
4845
  },
4846
+ {
4847
+ Name => 'BodyBatteryVoltage',
4848
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
4849
+ Format => 'int32u',
4850
+ ValueConv => '$val * 4e-8 + 0.27219',
4851
+ ValueConvInv => '($val - 0.27219) / 4e-8',
4852
+ PrintConv => 'sprintf("%.2f V", $val)',
4853
+ PrintConvInv => '$val =~ s/\s*V$//',
4854
+ },
4830
4855
  ],
4831
4856
  5 => {
4832
4857
  Name => 'GripBatteryADLoad',
@@ -4853,6 +4878,34 @@ my %binaryDataAttrs = (
4853
4878
  PrintConv => 'sprintf("%.2f V", $val)',
4854
4879
  PrintConvInv => '$val =~ s/\s*V$//',
4855
4880
  },
4881
+ 16 => {
4882
+ Name => 'GripBatteryState',
4883
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
4884
+ Notes => 'K-3III',
4885
+ PrintConv => {
4886
+ 0 => 'Empty or Missing',
4887
+ 1 => 'Almost Empty',
4888
+ 2 => 'Running Low',
4889
+ 3 => 'Half Full',
4890
+ 4 => 'Close to Full',
4891
+ 5 => 'Full',
4892
+ },
4893
+ },
4894
+ 17 => {
4895
+ Name => 'GripBatteryPercent',
4896
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
4897
+ Notes => 'K-3III',
4898
+ },
4899
+ 18 => {
4900
+ Name => 'GripBatteryVoltage',
4901
+ Condition => '$$self{Model} =~ /K-3 Mark III/',
4902
+ Notes => 'K-3III',
4903
+ Format => 'int32u',
4904
+ ValueConv => '$val * 4e-8 + 0.27219',
4905
+ ValueConvInv => '($val - 0.27219) / 4e-8',
4906
+ PrintConv => 'sprintf("%.2f V", $val)',
4907
+ PrintConvInv => '$val =~ s/\s*V$//',
4908
+ },
4856
4909
  );
4857
4910
 
4858
4911
  # auto focus information
@@ -5521,14 +5574,27 @@ my %binaryDataAttrs = (
5521
5574
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
5522
5575
  FORMAT => 'int8s',
5523
5576
  NOTES => 'Tags decoded from the electronic level information for the K-3 III.',
5577
+ 1 => {
5578
+ Name => 'CameraOrientation',
5579
+ PrintConv => {
5580
+ 0 => 'Horizontal (normal)',
5581
+ 1 => 'Rotate 270 CW',
5582
+ 2 => 'Rotate 180',
5583
+ 3 => 'Rotate 90 CW',
5584
+ 4 => 'Upwards', # (to the sky)
5585
+ 5 => 'Downwards', # (to the ground)
5586
+ },
5587
+ },
5524
5588
  3 => {
5525
5589
  Name => 'RollAngle',
5590
+ Notes => 'converted to degrees of clockwise camera rotation',
5526
5591
  Format => 'int16s',
5527
5592
  ValueConv => '-$val / 2',
5528
5593
  ValueConvInv => '-$val * 2',
5529
5594
  },
5530
5595
  5 => {
5531
5596
  Name => 'PitchAngle',
5597
+ Notes => 'converted to degrees of upward camera tilt',
5532
5598
  Format => 'int16s',
5533
5599
  ValueConv => '-$val / 2',
5534
5600
  ValueConvInv => '-$val * 2',
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
50
50
 
51
- $VERSION = '2.97';
51
+ $VERSION = '2.98';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -238,7 +238,11 @@ my %useExt = ( GLV => 'MP4' );
238
238
 
239
239
  # information for int32u date/time tags (time zero is Jan 1, 1904)
240
240
  my %timeInfo = (
241
- Notes => 'converted from UTC to local time if the QuickTimeUTC option is set',
241
+ Notes => q{
242
+ converted from UTC to local time if the QuickTimeUTC option is set. This
243
+ tag is part of a binary data structure so it may not be deleted -- instead
244
+ the value is set to zero if the tag is deleted individually
245
+ },
242
246
  Shift => 'Time',
243
247
  Writable => 1,
244
248
  Permanent => 1,
@@ -503,6 +507,11 @@ my %eeBox2 = (
503
507
  # image types in AVIF and HEIC files
504
508
  my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
505
509
 
510
+ my %userDefined = (
511
+ ALBUMARTISTSORT => 'AlbumArtistSort',
512
+ ASIN => 'ASIN',
513
+ );
514
+
506
515
  # QuickTime atoms
507
516
  %Image::ExifTool::QuickTime::Main = (
508
517
  PROCESS_PROC => \&ProcessMOV,
@@ -2336,10 +2345,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
2336
2345
  Name => 'RicohInfo',
2337
2346
  Condition => '$$valPt =~ /^\xff\xe1..Exif\0\0/s',
2338
2347
  SubDirectory => {
2339
- TagTable => 'Image::ExifTool::Exif::Main',
2340
- ProcessProc => \&Image::ExifTool::ProcessTIFF,
2341
- Start => 10,
2342
- Base => '$start',
2348
+ TagTable => 'Image::ExifTool::JPEG::Main',
2349
+ ProcessProc => \&Image::ExifTool::ProcessJPEG,
2343
2350
  }
2344
2351
  },
2345
2352
  RTHU => { #PH (GR)
@@ -8985,12 +8992,20 @@ sub HandleItemInfo($)
8985
8992
  if ($$item{Extents} and @{$$item{Extents}}) {
8986
8993
  $len += $$_[2] foreach @{$$item{Extents}};
8987
8994
  }
8988
- $et->VPrint(0, "$$et{INDENT}Item $id) '${type}' ($len bytes)\n");
8995
+ my $enc = $$item{ContentEncoding} ? ", $$item{ContentEncoding} encoded" : '';
8996
+ $et->VPrint(0, "$$et{INDENT}Item $id) '${type}' ($len bytes$enc)\n");
8989
8997
  }
8990
8998
  # get ExifTool name for this item
8991
8999
  my $name = { Exif => 'EXIF', 'application/rdf+xml' => 'XMP', jpeg => 'PreviewImage' }->{$type} || '';
8992
9000
  my ($warn, $extent);
8993
- $warn = "Can't currently decode encoded $type metadata" if $$item{ContentEncoding};
9001
+ if ($$item{ContentEncoding}) {
9002
+ if ($$item{ContentEncoding} ne 'deflate') {
9003
+ # (other possible values are 'gzip' and 'compress', but I don't have samples of these)
9004
+ $warn = "Can't currently decode $$item{ContentEncoding} encoded $type metadata";
9005
+ } elsif (not eval { require Compress::Zlib }) {
9006
+ $warn = "Install Compress::Zlib to decode deflated $type metadata";
9007
+ }
9008
+ }
8994
9009
  $warn = "Can't currently decode protected $type metadata" if $$item{ProtectionIndex};
8995
9010
  $warn = "Can't currently extract $type with construction method $$item{ConstructionMethod}" if $$item{ConstructionMethod};
8996
9011
  $et->WarnOnce($warn) if $warn and $name;
@@ -9050,6 +9065,22 @@ sub HandleItemInfo($)
9050
9065
  next unless defined $buff;
9051
9066
  $buff = $val . $buff if length $val;
9052
9067
  next unless length $buff; # ignore empty directories
9068
+ if ($$item{ContentEncoding}) {
9069
+ my ($v2, $stat);
9070
+ my $inflate = Compress::Zlib::inflateInit();
9071
+ $inflate and ($v2, $stat) = $inflate->inflate($buff);
9072
+ if ($inflate and $stat == Compress::Zlib::Z_STREAM_END()) {
9073
+ $buff = $v2;
9074
+ my $len = length $buff;
9075
+ $et->VPrint(0, "$$et{INDENT}Inflated Item $id) '${type}' ($len bytes)\n");
9076
+ $et->VerboseDump(\$buff);
9077
+ } else {
9078
+ $warn = "Error inflating $name metadata";
9079
+ $et->WarnOnce($warn);
9080
+ $et->VPrint(0, "$$et{INDENT} [not extracted] ($warn)\n") if $verbose > 2;
9081
+ next;
9082
+ }
9083
+ }
9053
9084
  my ($start, $subTable, $proc);
9054
9085
  my $pos = $$item{Extents}[0][1] + $base;
9055
9086
  if ($name eq 'EXIF' and length $buff >= 4) {
@@ -9485,7 +9516,8 @@ sub ProcessMOV($$;$)
9485
9516
  my $dataPt = $$dirInfo{DataPt};
9486
9517
  my $verbose = $et->Options('Verbose');
9487
9518
  my $validate = $$et{OPTIONS}{Validate};
9488
- my $dataPos = $$dirInfo{Base} || 0;
9519
+ my $dirBase = $$dirInfo{Base} || 0;
9520
+ my $dataPos = $dirBase;
9489
9521
  my $dirID = $$dirInfo{DirID} || '';
9490
9522
  my $charsetQuickTime = $et->Options('CharsetQuickTime');
9491
9523
  my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
@@ -9570,6 +9602,7 @@ sub ProcessMOV($$;$)
9570
9602
  $atomCount = $$tagTablePtr{VARS}{ATOM_COUNT};
9571
9603
  }
9572
9604
  my $lastTag = '';
9605
+ my $lastPos = 0;
9573
9606
  for (;;) {
9574
9607
  my ($eeTag, $ignore);
9575
9608
  last if defined $atomCount and --$atomCount < 0;
@@ -9608,6 +9641,8 @@ sub ProcessMOV($$;$)
9608
9641
  } elsif (not $et->Options('LargeFileSupport')) {
9609
9642
  $warnStr = 'End of processing at large atom (LargeFileSupport not enabled)';
9610
9643
  last;
9644
+ } elsif ($et->Options('LargeFileSupport') eq '2') {
9645
+ $et->WarnOnce('Processing large atom (LargeFileSupport is 2)');
9611
9646
  }
9612
9647
  }
9613
9648
  $size = $hi * 4294967296 + $lo - 16;
@@ -10082,14 +10117,15 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
10082
10117
  ) if $verbose;
10083
10118
  if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) {
10084
10119
  my $t = PrintableTagID($tag,2);
10085
- $warnStr = "Truncated '${t}' data";
10120
+ $warnStr = sprintf("Truncated '${t}' data at offset 0x%x", $lastPos);
10086
10121
  last;
10087
10122
  }
10088
10123
  }
10089
10124
  $dataPos += $size + 8; # point to start of next atom data
10090
10125
  last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
10126
+ $lastPos = $raf->Tell() + $dirBase;
10091
10127
  $raf->Read($buff, 8) == 8 or last;
10092
- $lastTag = $tag if $$tagTablePtr{$tag};
10128
+ $lastTag = $tag if $$tagTablePtr{$tag} and $tag ne 'free'; # (Insta360 sometimes puts free block before trailer)
10093
10129
  ($size, $tag) = unpack('Na4', $buff);
10094
10130
  ++$index if defined $index;
10095
10131
  }
@@ -10099,7 +10135,11 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
10099
10135
  if (($lastTag eq 'mdat' or $lastTag eq 'moov') and (not $$tagTablePtr{$tag} or
10100
10136
  ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
10101
10137
  {
10102
- $et->Warn('Unknown trailer with '.lcfirst($warnStr));
10138
+ if ($size == 0x1000000 - 8 and $tag =~ /^(\x94\xc0\x7e\0|\0\x02\0\0)/) {
10139
+ $et->Warn(sprintf('Insta360 trailer at offset 0x%x', $lastPos), 1);
10140
+ } else {
10141
+ $et->Warn('Unknown trailer with '.lcfirst($warnStr));
10142
+ }
10103
10143
  } else {
10104
10144
  $et->Warn($warnStr);
10105
10145
  }
@@ -143,6 +143,7 @@ my %insvLimit = (
143
143
  ExposureCompensation => { PrintConv => 'Image::ExifTool::Exif::PrintFraction($val)', Groups => { 2 => 'Camera' } },
144
144
  ISO => { Groups => { 2 => 'Camera' } },
145
145
  CameraDateTime=>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
146
+ DateTimeStamp =>{ PrintConv => '$self->ConvertDateTime($val)', Groups => { 2 => 'Time' } },
146
147
  VideoTimeStamp => { Groups => { 2 => 'Video' } },
147
148
  Accelerometer=> { Notes => '3-axis acceleration in units of g' },
148
149
  AccelerometerData => { },
@@ -992,8 +993,29 @@ sub Process_text($$$;$)
992
993
  $tags{Text} = defined $tags{Text} ? $tags{Text} . "\$$tag$dat" : "\$$tag$dat";
993
994
  }
994
995
  }
995
- %tags and HandleTextTags($et, $tagTbl, \%tags), return;
996
-
996
+ if (%tags) {
997
+ unless ($tags{Accelerometer}) { # (probably unnecessary test)
998
+ # check for NextBase 622GW accelerometer data
999
+ # Example data (leading 2-byte length word has been stripped by ProcessSamples):
1000
+ # 0000: 00 00 00 00 32 30 32 32 30 39 30 35 31 36 34 30 [....202209051640]
1001
+ # 0010: 33 33 00 00 29 00 ba ff 48 ff 18 00 f2 07 5a ff [33..)...H.....Z.]
1002
+ # 0020: 64 ff e8 ff 58 ff e8 ff c1 07 43 ff 41 ff d2 ff [d...X.....C.A...]
1003
+ # 0030: 58 ff ea ff dc 07 50 ff 30 ff e0 ff 72 ff d8 ff [X.....P.0...r...]
1004
+ # 0040: f5 07 51 ff 16 ff dc ff 6a ff ca ff 33 08 45 ff [..Q.....j...3.E.]
1005
+ if ($$dataPt =~ /^\0{4}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\0\0.{2}/s) {
1006
+ $tags{DateTimeStamp} = "$1:$2:$2 $4:$5:$6";
1007
+ my $num = unpack('x20v', $$dataPt); # number of accelerometer readings
1008
+ if ($num and $num * 12 + 22 < length $$dataPt) {
1009
+ $num *= 6;
1010
+ my @acc = unpack("x22v$num", $$dataPt);
1011
+ map { $_ = $_ - 0x10000 if $_ >= 0x8000 } @acc;
1012
+ $tags{AccelerometerData} = "@acc";
1013
+ }
1014
+ }
1015
+ }
1016
+ HandleTextTags($et, $tagTbl, \%tags);
1017
+ return;
1018
+ }
997
1019
  # check for enciphered binary GPS data
998
1020
  # BlueSkySea:
999
1021
  # 0000: 00 00 aa aa aa aa 54 54 98 9a 9b 93 9a 92 98 9a [......TT........]
@@ -30,7 +30,7 @@ use strict;
30
30
  use vars qw($VERSION $AUTOLOAD);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
 
33
- $VERSION = '1.67';
33
+ $VERSION = '1.68';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -2041,11 +2041,16 @@ sub ProcessRIFF($$)
2041
2041
  last unless $moviEnd;
2042
2042
  # we arrived here because there was a problem parsing the movie data
2043
2043
  # so seek to the end to continue processing
2044
- if ($moviEnd > 0x7fffffff and not $et->Options('LargeFileSupport')) {
2045
- $et->Warn('Possibly corrupt LIST_movi data');
2046
- $et->Warn('Stopped parsing at large LIST_movi chunk (LargeFileSupport not set)');
2047
- undef $err;
2048
- last;
2044
+ if ($moviEnd > 0x7fffffff) {
2045
+ unless ($et->Options('LargeFileSupport')) {
2046
+ $et->Warn('Possibly corrupt LIST_movi data');
2047
+ $et->Warn('Stopped parsing at large LIST_movi chunk (LargeFileSupport not set)');
2048
+ undef $err;
2049
+ last;
2050
+ }
2051
+ if ($et->Options('LargeFileSupport') eq '2') {
2052
+ $et->WarnOnce('Processing large chunk (LargeFileSupport is 2)');
2053
+ }
2049
2054
  }
2050
2055
  if ($validate) {
2051
2056
  # (must actually try to read something after seeking to detect error)
@@ -2159,10 +2164,15 @@ sub ProcessRIFF($$)
2159
2164
  $moviEnd = $raf->Tell() + $len2;
2160
2165
  next; # parse into movi chunk
2161
2166
  } elsif (not $rewind) {
2162
- if ($len > 0x7fffffff and not $et->Options('LargeFileSupport')) {
2163
- $tag =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg;
2164
- $et->Warn("Stopped parsing at large $tag chunk (LargeFileSupport not set)");
2165
- last;
2167
+ if ($len > 0x7fffffff) {
2168
+ unless ($et->Options('LargeFileSupport')) {
2169
+ $tag =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg;
2170
+ $et->Warn("Stopped parsing at large $tag chunk (LargeFileSupport not set)");
2171
+ last;
2172
+ }
2173
+ if ($et->Options('LargeFileSupport') eq '2') {
2174
+ $et->WarnOnce('Processing large chunk (LargeFileSupport is 2)');
2175
+ }
2166
2176
  }
2167
2177
  if ($validate and $len2) {
2168
2178
  # (must actually try to read something after seeking to detect error)
@@ -979,6 +979,7 @@ my %formatMinMax = (
979
979
  # 0x0800 - unknown (29 bytes) (contains already-extracted EmbeddedAudioFileName)
980
980
  # 0x0830-name - seen '1165724808.pre'
981
981
  # 0x0830 - unknown (164004 bytes)
982
+ # 0x08c0-name - seen 'Auto_Enhance_Info' #forum16086
982
983
  # 0x08d0-name - seen 'Interactive_Panorama_Info'
983
984
  # 0x08d0 - unknown (7984 bytes)
984
985
  # 0x08e0-name - seen 'Panorama_Shot_Info'
@@ -988,6 +989,8 @@ my %formatMinMax = (
988
989
  # 0x0910 - string, seen 'Front_Cam_Selfie_Info'
989
990
  # 0x09e0-name - seen 'Burst_Shot_Info'
990
991
  # 0x09e0 - string, seen '489489125'
992
+ # 0x09e1-name - seen 'BurstShot_Best_Photo_Info' #forum16086
993
+ # 0x09f0-name - seen 'Pro_Mode_Info' #forum16086
991
994
  # 0x0a01-name - seen 'Image_UTC_Data'
992
995
  '0x0a01' => { #forum7161
993
996
  Name => 'TimeStamp',
@@ -999,6 +1002,7 @@ my %formatMinMax = (
999
1002
  '0x0a20' => { Name => 'DualCameraImage', Groups => { 2 => 'Preview' }, Binary => 1 },
1000
1003
  '0x0a30-name' => 'EmbeddedVideoType', # ("MotionPhoto_Data")
1001
1004
  '0x0a30' => { Name => 'EmbeddedVideoFile', Groups => { 2 => 'Video' }, Binary => 1 }, #forum7161
1005
+ # 0x0a41-name - seen 'BackupRestore_Data' #forum16086
1002
1006
  # 0x0aa1-name - seen 'MCC_Data'
1003
1007
  # 0x0aa1 - seen '204','222','234','302','429'
1004
1008
  '0x0aa1' => {
@@ -1254,15 +1258,39 @@ my %formatMinMax = (
1254
1258
  Name => 'DualShotExtra',
1255
1259
  SubDirectory => { TagTable => 'Image::ExifTool::Samsung::DualShotExtra' },
1256
1260
  },
1261
+ # 0x0ab4-name - seen 'DualShot_Core_Info' #forum16086
1257
1262
  # 0x0ac0-name - seen 'ZoomInOut_Info' (SM-N950U)
1258
1263
  # 0x0ac0 - 2048 bytes of interesting stuff including firmware version? (SM-N950U)
1264
+ # 0x0b30-name - seen 'Camera_Sticker_Info' #forum16086
1259
1265
  '0x0b40' => { # (SM-N975X front camera)
1260
1266
  Name => 'SingleShotMeta',
1261
1267
  SubDirectory => { TagTable => 'Image::ExifTool::Samsung::SingleShotMeta' },
1262
1268
  },
1263
1269
  # 0x0b41-name - seen 'SingeShot_DepthMap_1' (Yes, "Singe") (SM-N975X front camera)
1264
1270
  '0x0b41' => { Name => 'SingleShotDepthMap', Binary => 1 },
1265
- # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data'
1271
+ # 0x0b51-name - seen 'Intelligent_PhotoEditor_Data' #forum16086
1272
+ # 0x0b60-name - seen 'UltraWide_PhotoEditor_Data' #forum16086
1273
+ # 0x0b90-name - seen 'Document_Scan_Info' #forum16086
1274
+ # 0x0ba1-name - seen 'Original_Path_Hash_Key', 'PhotoEditor_Re_Edit_Data', 'deco_doodle_bitmap', 'deco_sticker_bitmap', 'deco_text_bitmap'
1275
+ # 0x0ba2-name - seen 'Copy_Available_Edit_Info' #forum16086
1276
+ # 0x0bc0-name - seen 'Single_Relighting_Bokeh_Info' #forum16086
1277
+ # 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
1278
+ # 0x0be0-name - seen 'Livefocus_JDM_Info' #forum16086
1279
+ # 0x0bf0-name - seen 'Remaster_Info' #forum16086
1280
+ # 0x0c21-name - seen 'Portrait_Effect_Info' #forum16086
1281
+ # 0x0c51-name - seen 'Samsung_Capture_Info' #forum16086
1282
+ # 0x0c61-name - seen 'Camera_Capture_Mode_Info' #forum16086
1283
+ # 0x0c71-name - seen 'Pro_White_Balance_Info' #forum16086
1284
+ # 0x0c81-name - seen 'Watermark_Info' #forum16086
1285
+ # 0x0cc1-name - seen 'Color_Display_P3' #forum16086
1286
+ # 0x0cd2-name - seen 'Photo_HDR_Info' #forum16086
1287
+ # 0x0ce1-name - seen 'Gallery_DC_Data' #forum16086
1288
+ # 0x0d01-name - seen 'Camera_Scene_Info', 'Camera_Scene_Info2', 'Camera_Scene_Info3' #forum16086
1289
+ # 0x0d11-name - seen 'Video_Snapshot_Info' #forum16086
1290
+ # 0x0d21-name - seen 'Camera_Scene_Info' #forum16086
1291
+ # 0x0d31-name - seen 'Food_Blur_Effect_Info' #forum16086
1292
+ # 0x0d91-name - seen 'PEg_Info' #forum16086
1293
+ # 0x0da1-name - seen 'Captured_App_Info' #forum16086
1266
1294
  # 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
1267
1295
  # 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360)
1268
1296
  # 0x0c81-name - seen 'Watermark_Info'
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.68';
37
+ $VERSION = '3.69';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -169,6 +169,7 @@ sub PrintInvLensSpec($;$$);
169
169
  32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
170
170
  32885 => 'Sony FE 16-35mm F2.8 GM II', #JR
171
171
  32886 => 'Sony FE 300mm F2.8 GM OSS', #JR
172
+ 32887 => 'Sony E PZ 16-50mm F3.5-5.6 OSS II', #JR
172
173
 
173
174
  # (comment this out so LensID will report the LensModel, which is more useful)
174
175
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -239,6 +240,7 @@ sub PrintInvLensSpec($;$$);
239
240
  49474.8 => 'Viltrox 50mm F1.8 FE', #JR
240
241
  49474.9 => 'Viltrox 75mm F1.2 E', #JR
241
242
  '49474.10' => 'Viltrox 20mm F2.8 FE', #JR
243
+ 49475 => 'Tamron 50-300mm F4.5-6.3 Di III VC VXD', #JR (Model A069)
242
244
 
243
245
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
244
246
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
@@ -292,15 +294,18 @@ sub PrintInvLensSpec($;$$);
292
294
  50540 => 'Sigma 14mm F1.4 DG DN | A', #JR (023)
293
295
  50543 => 'Sigma 70-200mm F2.8 DG DN OS | S', #JR (023)
294
296
  50544 => 'Sigma 23mm F1.4 DC DN | C', #JR (023)
297
+ 50545 => 'Sigma 24-70mm F2.8 DG DN II | A', #JR (024)
295
298
  50546 => 'Sigma 500mm F5.6 DG DN OS | S', #JR (024)
296
299
  50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023)
297
300
  50548 => 'Sigma 15mm F1.4 DG DN DIAGONAL FISHEYE | A', #JR (024)
301
+ 50549 => 'Sigma 50mm F1.2 DG DN | A', #JR (024)
302
+ 50551 => 'Sigma 28-45mm F1.8 DG DN | A', #JR (024)
298
303
 
299
304
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
300
305
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
301
306
  50994 => 'Voigtlander ULTRA WIDE-HELIAR 12mm F5.6 III', #IB
302
307
  50995 => 'Voigtlander MACRO APO-LANTHAR 65mm F2 Aspherical', #JR
303
- 50996 => 'Voigtlander NOKTON 40mm F1.2 Aspherical', #JR
308
+ 50996 => 'Voigtlander NOKTON 40mm F1.2 Aspherical', #JR (also SE version)
304
309
  50997 => 'Voigtlander NOKTON classic 35mm F1.4', #JR
305
310
  50998 => 'Voigtlander MACRO APO-LANTHAR 110mm F2.5', #JR
306
311
  50999 => 'Voigtlander COLOR-SKOPAR 21mm F3.5 Aspherical', #IB
@@ -309,6 +314,7 @@ sub PrintInvLensSpec($;$$);
309
314
  51002 => 'Voigtlander APO-LANTHAR 50mm F2 Aspherical', #JR
310
315
  51003 => 'Voigtlander NOKTON 35mm F1.2 Aspherical SE', #JR
311
316
  51006 => 'Voigtlander APO-LANTHAR 35mm F2 Aspherical', #JR
317
+ 51007 => 'Voigtlander NOKTON 50mm F1 Aspherical', #JR
312
318
 
313
319
  # lenses listed in the Sigma MC-11 list, but not yet seen:
314
320
  # 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014)
@@ -330,6 +336,8 @@ sub PrintInvLensSpec($;$$);
330
336
  51516 => 'Samyang AF 24-70mm F2.8', #JR
331
337
  51517 => 'Samyang AF 50mm F1.4 II', #JR
332
338
  51518 => 'Samyang AF 135mm F1.8', #JR
339
+
340
+ 61569 => 'LAOWA FFII 10mm F2.8 C&D Dreamer', #JR
333
341
  );
334
342
 
335
343
  # ExposureProgram values (ref PH, mainly decoded from A200)
@@ -1713,7 +1721,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1713
1721
  },
1714
1722
  },{
1715
1723
  Name => 'Tag9050d',
1716
- Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-E1)\b/',
1724
+ Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR)|ZV-(E1|E10M2))\b/',
1717
1725
  SubDirectory => {
1718
1726
  TagTable => 'Image::ExifTool::Sony::Tag9050d',
1719
1727
  ByteOrder => 'LittleEndian',
@@ -1975,7 +1983,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1975
1983
  },
1976
1984
  0x940c => [{
1977
1985
  Name => 'Tag940c',
1978
- Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar|ZV-E10|ZV-E1)\b/',
1986
+ Condition => '$$self{Model} =~ /^(NEX-|ILCE-|ILME-|Lunar|ZV-E10|ZV-E10M2|ZV-E1)\b/',
1979
1987
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag940c' },
1980
1988
  },{
1981
1989
  Name => 'Sony_0x940c',
@@ -2151,6 +2159,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2151
2159
  395 => 'ZV-1M2', #JR
2152
2160
  396 => 'ILCE-7CR', #JR
2153
2161
  397 => 'ILCE-7CM2', #JR
2162
+ 398 => 'ILX-LR1', #JR
2163
+ 399 => 'ZV-E10M2', #JR
2154
2164
  },
2155
2165
  },
2156
2166
  0xb020 => { #2
@@ -8201,7 +8211,7 @@ my %isoSetting2010 = (
8201
8211
  # number of mechanical shutter actuations, does not increase during electronic shutter / Silent Shooting
8202
8212
  Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR))/',
8203
8213
  Format => 'int32u',
8204
- Notes => 'total number of image exposures made by the camera',
8214
+ Notes => 'total number of mechanical shutter actuations',
8205
8215
  RawConv => '$val & 0x00ffffff',
8206
8216
  PrintConv => 'sprintf("%6d",$val)',
8207
8217
  PrintConvInv => '$val',
@@ -8228,6 +8238,7 @@ my %isoSetting2010 = (
8228
8238
  },
8229
8239
  0x0038 => {
8230
8240
  Name => 'InternalSerialNumber', #(NC)
8241
+ Condition => '$$self{Model} !~ /^(ZV-E10M2)/',
8231
8242
  Format => 'int8u[6]',
8232
8243
  PrintConv => 'unpack "H*", pack "C*", split " ", $val',
8233
8244
  },
@@ -8459,7 +8470,7 @@ my %isoSetting2010 = (
8459
8470
  },
8460
8471
  0x002a => [{
8461
8472
  Name => 'Quality2',
8462
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8473
+ Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
8463
8474
  PrintConv => {
8464
8475
  0 => 'JPEG',
8465
8476
  1 => 'RAW',
@@ -8484,7 +8495,7 @@ my %isoSetting2010 = (
8484
8495
  # },
8485
8496
  0x0053 => {
8486
8497
  Name => 'ModelReleaseYear',
8487
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8498
+ Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-(E1|E10M2))\b/',
8488
8499
  Format => 'int8u',
8489
8500
  PrintConv => 'sprintf("20%.2d", $val)',
8490
8501
  },
@@ -9530,7 +9541,6 @@ my %isoSetting2010 = (
9530
9541
  Name => 'FocusMode',
9531
9542
  Condition => '$$self{Model} =~ /^ILCA-/',
9532
9543
  Notes => 'ILCA models only',
9533
- Writable => 'int8u',
9534
9544
  Priority => 0,
9535
9545
  PrintConv => {
9536
9546
  0 => 'Manual',
@@ -9855,7 +9865,7 @@ my %isoSetting2010 = (
9855
9865
  WRITE_PROC => \&WriteEnciphered,
9856
9866
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9857
9867
  FORMAT => 'int8u',
9858
- NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1.',
9868
+ NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1/E10M2.',
9859
9869
  FIRST_ENTRY => 0,
9860
9870
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9861
9871
  0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
@@ -10018,7 +10028,7 @@ my %isoSetting2010 = (
10018
10028
  },
10019
10029
  0x089d => { # Note: 32 values for these newer models, and 32 non-zero values present for new lenses like SEL2470GM2 and SEL2070G
10020
10030
  Name => 'VignettingCorrParams',
10021
- Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-E1)\b/',
10031
+ Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
10022
10032
  Format => 'int16s[32]',
10023
10033
  },
10024
10034
  0x08b5 => {
@@ -10057,7 +10067,7 @@ my %isoSetting2010 = (
10057
10067
  },
10058
10068
  0x0945 => {
10059
10069
  Name => 'ChromaticAberrationCorrParams',
10060
- Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-E1)\b/',
10070
+ Condition => '$$self{Model} =~ /^(ILCE-(6700|7CM2|7CR|7RM5)|ILME-FX30|ZV-(E1|E10M2))\b/',
10061
10071
  Format => 'int16s[32]',
10062
10072
  },
10063
10073
  );