exiftool_vendored 12.68.0 → 12.70.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +63 -15
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/exiftool +13 -13
  7. data/bin/lib/Image/ExifTool/CBOR.pm +18 -2
  8. data/bin/lib/Image/ExifTool/Canon.pm +68 -16
  9. data/bin/lib/Image/ExifTool/DJI.pm +3 -2
  10. data/bin/lib/Image/ExifTool/DNG.pm +25 -2
  11. data/bin/lib/Image/ExifTool/EXE.pm +54 -6
  12. data/bin/lib/Image/ExifTool/Exif.pm +175 -14
  13. data/bin/lib/Image/ExifTool/FujiFilm.pm +142 -20
  14. data/bin/lib/Image/ExifTool/GIF.pm +5 -1
  15. data/bin/lib/Image/ExifTool/ID3.pm +70 -7
  16. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  17. data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  18. data/bin/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  19. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  20. data/bin/lib/Image/ExifTool/Nikon.pm +58 -18
  21. data/bin/lib/Image/ExifTool/Olympus.pm +7 -1
  22. data/bin/lib/Image/ExifTool/PNG.pm +8 -13
  23. data/bin/lib/Image/ExifTool/Panasonic.pm +15 -2
  24. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +2 -2
  25. data/bin/lib/Image/ExifTool/QuickTime.pm +32 -5
  26. data/bin/lib/Image/ExifTool/README +14 -5
  27. data/bin/lib/Image/ExifTool/RIFF.pm +60 -10
  28. data/bin/lib/Image/ExifTool/Sony.pm +95 -34
  29. data/bin/lib/Image/ExifTool/TagLookup.pm +6937 -6714
  30. data/bin/lib/Image/ExifTool/TagNames.pod +812 -332
  31. data/bin/lib/Image/ExifTool/Text.pm +4 -5
  32. data/bin/lib/Image/ExifTool/Validate.pm +23 -20
  33. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
  34. data/bin/lib/Image/ExifTool/WriteExif.pl +14 -4
  35. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
  36. data/bin/lib/Image/ExifTool/WriteRIFF.pl +31 -6
  37. data/bin/lib/Image/ExifTool/Writer.pl +40 -14
  38. data/bin/lib/Image/ExifTool/XMP.pm +67 -2
  39. data/bin/lib/Image/ExifTool/XMP2.pl +35 -0
  40. data/bin/lib/Image/ExifTool.pm +79 -40
  41. data/bin/lib/Image/ExifTool.pod +9 -3
  42. data/bin/perl-Image-ExifTool.spec +1 -1
  43. data/lib/exiftool_vendored/version.rb +1 -1
  44. metadata +2 -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.88';
51
+ $VERSION = '2.89';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -638,6 +638,33 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
638
638
  Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/ and $$self{OPTIONS}{ExtractEmbedded}',
639
639
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::Tags360Fly' },
640
640
  },
641
+ { #https://c2pa.org/specifications/
642
+ Name => 'JUMBF',
643
+ Condition => '$$valPt=~/^\xd8\xfe\xc3\xd6\x1b\x0e\x48\x3c\x92\x97\x58\x28\x87\x7e\xc4\x81.{4}manifest\0/s',
644
+ Deletable => 1,
645
+ SubDirectory => {
646
+ TagTable => 'Image::ExifTool::Jpeg2000::Main',
647
+ # 16 bytes uuid
648
+ # +4 bytes 0
649
+ # +9 bytes "manifest\0"
650
+ # +8 bytes absolute(!!!) offset to C2PA uuid "merkle\0" box
651
+ # =37 bytes total
652
+ Start => 37,
653
+ },
654
+ },
655
+ { #https://c2pa.org/specifications/ (NC)
656
+ Name => 'CBOR',
657
+ Condition => '$$valPt=~/^\xd8\xfe\xc3\xd6\x1b\x0e\x48\x3c\x92\x97\x58\x28\x87\x7e\xc4\x81.{4}merkle\0/s',
658
+ Deletable => 1, # (NC)
659
+ SubDirectory => {
660
+ TagTable => 'Image::ExifTool::CBOR::Main',
661
+ # 16 bytes uuid
662
+ # +4 bytes 0
663
+ # +7 bytes "merkle\0"
664
+ # =27 bytes total
665
+ Start => 27,
666
+ },
667
+ },
641
668
  {
642
669
  Name => 'SensorData',
643
670
  Condition => '$$valPt=~/^\xef\xe1\x58\x9a\xbb\x77\x49\xef\x80\x95\x27\x75\x9e\xb1\xdc\x6f/',
@@ -9502,9 +9529,9 @@ sub ProcessMOV($$;$)
9502
9529
  $et->HandleTag($tagTablePtr, "$tag-offset", $raf->Tell()) if $$tagTablePtr{"$tag-offset"};
9503
9530
  }
9504
9531
  # stop processing at mdat/idat if -fast2 is used
9505
- last if $fast > 1 and ($tag eq 'mdat' or $tag eq 'idat');
9532
+ last if $fast > 1 and ($tag eq 'mdat' or ($tag eq 'idat' and $$et{FileType} ne 'HEIC'));
9506
9533
  # load values only if associated with a tag (or verbose) and not too big
9507
- if ($size > 0x2000000) { # start to get worried above 32 MB
9534
+ if ($size > 0x2000000) { # start to get worried above 32 MiB
9508
9535
  # check for RIFF trailer (written by Auto-Vox dashcam)
9509
9536
  if ($buff =~ /^(gpsa|gps0|gsen|gsea)...\0/s) { # (yet seen only gpsa as first record)
9510
9537
  $et->VPrint(0, "Found RIFF trailer");
@@ -9521,9 +9548,9 @@ sub ProcessMOV($$;$)
9521
9548
  if ($tagInfo and not $$tagInfo{Unknown} and not $eeTag) {
9522
9549
  my $t = PrintableTagID($tag,2);
9523
9550
  if ($size > 0x8000000) {
9524
- $et->Warn("Skipping '${t}' atom > 128 MB", 1);
9551
+ $et->Warn("Skipping '${t}' atom > 128 MiB", 1);
9525
9552
  } else {
9526
- $et->Warn("Skipping '${t}' atom > 32 MB", 2) or $ignore = 0;
9553
+ $et->Warn("Skipping '${t}' atom > 32 MiB", 2) or $ignore = 0;
9527
9554
  }
9528
9555
  }
9529
9556
  }
@@ -343,9 +343,10 @@ numerical, and generated automatically otherwise.
343
343
  but applied automatically to individual tags. Value specifies
344
344
  pattern for split, or 1 for default pattern ',?\\s+'.
345
345
 
346
- 'Avoid' - avoid creating this tag if possible. This is only
347
- effective if another tag exists with the same name. Setting
348
- this flag also sets the default Priority to 0 for this tag.
346
+ 'Avoid' - avoid creating this tag when writing if possible.
347
+ This is only effective if another tag exists with the same
348
+ name. Setting this flag also sets the default Priority to 0
349
+ for this tag.
349
350
 
350
351
  'Binary' - set to 1 for binary data. This has the same effect
351
352
  as setting ValueConv to '\$val', but it it a bit cleaner and
@@ -615,9 +616,9 @@ numerical, and generated automatically otherwise.
615
616
  arguments: the value, a flag which is set for the inverse
616
617
  conversion, and a reference to the PrintConv hash, and returns
617
618
  the converted value or undef on error -- it may call warn() to
618
- return an error message. The lookup hash may also contain a
619
+ return an error message. The lookup hash may also contain a
619
620
  'Notes' entry which is used for documentation if the
620
- SeparateTable flag is set). In an expression, $self is a
621
+ SeparateTable flag is set). In an expression, $self is a
621
622
  reference to the current ExifTool object, $val is the Raw
622
623
  value, and $tag is the tag key. The subroutine takes 2
623
624
  arguments: the Raw value and a reference to the current
@@ -893,6 +894,11 @@ numerical, and generated automatically otherwise.
893
894
  writing this tag. Only needed if tag can be written to
894
895
  groups other than the normal groups for this tag (very rare).
895
896
 
897
+ Deletable : [Writable SubDirectory's only] Overrides internal test for
898
+ metadata types with permanent directories (currently QuickTime
899
+ and Jpeg2000), allowing the tag containing these directories
900
+ to be deleted
901
+
896
902
  OffsetPair : Used in EXIF table to specify the tagID for the corresponding
897
903
  offset or length tag.
898
904
 
@@ -917,6 +923,9 @@ numerical, and generated automatically otherwise.
917
923
  FixedSize : [EXIF only] Hack to ignore value size and use this instead.
918
924
  Only valid if Format is also defined.
919
925
 
926
+ TruncateOK : [EXIF only] Hack to demote a truncated value in an IFD to a
927
+ minor error.
928
+
920
929
  Struct : [XMP tags only] Reference to structure hash for structured XMP
921
930
  tags. See "STRUCTURES" section below for more details. (For
922
931
  backward compatibility, this may be a name to an entry in
@@ -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.65';
33
+ $VERSION = '1.67';
34
34
 
35
35
  sub ConvertTimecode($);
36
36
  sub ProcessSGLT($$$);
@@ -500,6 +500,11 @@ my %code2charset = (
500
500
  Name => 'OldXMP',
501
501
  Binary => 1,
502
502
  },
503
+ C2PA => { #https://c2pa.org/specifications/
504
+ Name => 'JUMBF',
505
+ Deletable => 1,
506
+ SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main' },
507
+ },
503
508
  olym => {
504
509
  Name => 'Olym',
505
510
  SubDirectory => { TagTable => 'Image::ExifTool::Olympus::WAV' },
@@ -555,7 +560,7 @@ my %code2charset = (
555
560
  },
556
561
  },{ # (WebP) - have also seen with "Exif\0\0" header - PH
557
562
  Name => 'EXIF',
558
- Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/ and $self->Warn("Improper EXIF header",1)',
563
+ Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/ and ($self->Warn("Improper EXIF header",1) or 1)',
559
564
  SubDirectory => {
560
565
  TagTable => 'Image::ExifTool::Exif::Main',
561
566
  ProcessProc => \&Image::ExifTool::ProcessTIFF,
@@ -570,6 +575,12 @@ my %code2charset = (
570
575
  Notes => 'WebP files',
571
576
  SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
572
577
  },
578
+ "XMP\0" => {
579
+ Name => 'XMP',
580
+ Notes => 'incorrectly written WebP files',
581
+ Condition => '$self->Warn("Incorrect XMP tag ID", 1) or 1',
582
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
583
+ },
573
584
  ICCP => { #14 (WebP)
574
585
  Name => 'ICC_Profile',
575
586
  Notes => 'WebP files',
@@ -1063,7 +1074,16 @@ my %code2charset = (
1063
1074
  },
1064
1075
  1 => {
1065
1076
  Name => 'MaxDataRate',
1066
- PrintConv => 'sprintf("%.4g kB/s",$val / 1024)',
1077
+ Notes => q{
1078
+ converted using SI byte prefixes unles the API ByteUnit option is set to
1079
+ "Binary"
1080
+ },
1081
+ PrintConv => q{
1082
+ my ($unit, $div) = $self->Options('ByteUnit') eq 'Binary' ? ('KiB/s',1024) : ('kB/s',1000);
1083
+ my $tmp = $val / $div;
1084
+ $tmp > 9999 and $tmp /= $div, $unit =~ s/^./M/;
1085
+ sprintf('%.4g %s', $tmp, $unit);
1086
+ },
1067
1087
  },
1068
1088
  # 2 => 'PaddingGranularity',
1069
1089
  # 3 => 'Flags',
@@ -1983,7 +2003,7 @@ sub ProcessRIFF($$)
1983
2003
  {
1984
2004
  my ($et, $dirInfo) = @_;
1985
2005
  my $raf = $$dirInfo{RAF};
1986
- my ($buff, $buf2, $type, $mime, $err, $rf64);
2006
+ my ($buff, $buf2, $type, $mime, $err, $rf64, $moviEnd);
1987
2007
  my $verbose = $et->Options('Verbose');
1988
2008
  my $unknown = $et->Options('Unknown');
1989
2009
  my $validate = $et->Options('Validate');
@@ -2017,8 +2037,34 @@ sub ProcessRIFF($$)
2017
2037
  # Read chunks in RIFF image
2018
2038
  #
2019
2039
  for (;;) {
2040
+ if ($err) {
2041
+ last unless $moviEnd;
2042
+ # we arrived here because there was a problem parsing the movie data
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;
2049
+ }
2050
+ if ($validate) {
2051
+ # (must actually try to read something after seeking to detect error)
2052
+ $raf->Seek($moviEnd-1, 0) and $raf->Read($buff, 1) == 1 or last;
2053
+ } else {
2054
+ $raf->Seek($moviEnd, 0) or last;
2055
+ }
2056
+ $pos = $moviEnd;
2057
+ $et->Warn('Possibly corrupt LIST_movi data');
2058
+ undef $err;
2059
+ undef $moviEnd;
2060
+ }
2061
+ if ($moviEnd) {
2062
+ $pos > $moviEnd and $err = 1, next; # error if we parsed past the end of the movie data
2063
+ undef $moviEnd if $pos == $moviEnd; # parsed all movie data?
2064
+ }
2020
2065
  my $num = $raf->Read($buff, 8);
2021
2066
  if ($num < 8) {
2067
+ $moviEnd and $err = 1, next;
2022
2068
  $err = 1 if $num;
2023
2069
  $et->Warn('Incorrect RIFF chunk size' . " $pos vs. $riffEnd") if $validate and $pos != $riffEnd;
2024
2070
  last;
@@ -2029,7 +2075,7 @@ sub ProcessRIFF($$)
2029
2075
  $et->OverrideFileType('Extended WEBP',undef,'webp') if $tag eq 'VP8X' and $type eq 'WEBP';
2030
2076
  # special case: construct new tag name from specific LIST type
2031
2077
  if ($tag eq 'LIST') {
2032
- $raf->Read($buff, 4) == 4 or $err=1, last;
2078
+ $raf->Read($buff, 4) == 4 or $err=1, next;
2033
2079
  $pos += 4;
2034
2080
  $tag .= "_$buff";
2035
2081
  $len -= 4; # already read 4 bytes (the LIST type)
@@ -2038,6 +2084,7 @@ sub ProcessRIFF($$)
2038
2084
  }
2039
2085
  $et->VPrint(0, "RIFF '${tag}' chunk ($len bytes of data):\n");
2040
2086
  if ($len <= 0) {
2087
+ $moviEnd and $err = 1, next;
2041
2088
  if ($len < 0) {
2042
2089
  $et->Warn('Invalid chunk length');
2043
2090
  } elsif ($tag eq "\0\0\0\0") {
@@ -2068,7 +2115,7 @@ sub ProcessRIFF($$)
2068
2115
  my $tagInfo = $$tagTbl{$tag};
2069
2116
  # (in LIST_movi chunk: ##db = uncompressed DIB, ##dc = compressed DIB, ##wb = audio data)
2070
2117
  if ($tagInfo or (($verbose or $unknown) and $tag !~ /^(data|idx1|LIST_movi|RIFF|\d{2}(db|dc|wb))$/)) {
2071
- $raf->Read($buff, $len2) == $len2 or $err=1, last;
2118
+ $raf->Read($buff, $len2) == $len2 or $err=1, next;
2072
2119
  if ($hash and $isImageData{$tag}) {
2073
2120
  $hash->add($buff);
2074
2121
  $et->VPrint(0, "$$et{INDENT}(ImageDataHash: '${tag}' chunk, $len2 bytes)\n");
@@ -2094,7 +2141,7 @@ sub ProcessRIFF($$)
2094
2141
  $et->Warn('Incorrect RIFF chunk size') if $validate and $pos - 8 != $riffEnd;
2095
2142
  $riffEnd += $len2 + 8;
2096
2143
  # don't read into RIFF chunk (eg. concatenated video file)
2097
- $raf->Read($buff, 4) == 4 or $err=1, last; # (skip RIFF type word)
2144
+ $raf->Read($buff, 4) == 4 or $err=1, next; # (skip RIFF type word)
2098
2145
  $pos += 4;
2099
2146
  # extract information from remaining file as an embedded file
2100
2147
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
@@ -2107,18 +2154,21 @@ sub ProcessRIFF($$)
2107
2154
  $et->ImageDataHash($raf, $len2, "'${tag}' chunk");
2108
2155
  }
2109
2156
  if ($tag eq 'LIST_movi' and $ee) {
2110
- $raf->Seek($rewind, 0) or $err = 1, last if $rewind;
2157
+ $raf->Seek($rewind, 0) or $err = 1, next if $rewind;
2158
+ # save end-of-movie offset so we can seek there if we get errors parsing the movie data
2159
+ $moviEnd = $raf->Tell() + $len2;
2111
2160
  next; # parse into movi chunk
2112
2161
  } elsif (not $rewind) {
2113
2162
  if ($len > 0x7fffffff and not $et->Options('LargeFileSupport')) {
2163
+ $tag =~ s/([\0-\x1f\x7f-\xff])/sprintf('\\x%.2x',ord $1)/eg;
2114
2164
  $et->Warn("Stopped parsing at large $tag chunk (LargeFileSupport not set)");
2115
2165
  last;
2116
2166
  }
2117
2167
  if ($validate and $len2) {
2118
2168
  # (must actually try to read something after seeking to detect error)
2119
- $raf->Seek($len2-1, 1) and $raf->Read($buff, 1) == 1 or $err = 1, last;
2169
+ $raf->Seek($len2-1, 1) and $raf->Read($buff, 1) == 1 or $err = 1, next;
2120
2170
  } else {
2121
- $raf->Seek($len2, 1) or $err=1, last;
2171
+ $raf->Seek($len2, 1) or $err=1, next;
2122
2172
  }
2123
2173
  }
2124
2174
  }
@@ -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.63';
37
+ $VERSION = '3.64';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -69,11 +69,13 @@ sub PrintInvLensSpec($;$$);
69
69
  '0.10' => 'Zeiss Touit 50mm F2.8 Macro', # (firmware Ver.00)
70
70
  '0.11' => 'Zeiss Loxia 50mm F2', # (firmware Ver.01)
71
71
  '0.12' => 'Zeiss Loxia 35mm F2', # (firmware Ver.01)
72
+ '0.13' => 'Viltrox 85mm F1.8', # original AF version; Mark II version is at 47473
72
73
  1 => 'Sony LA-EA1 or Sigma MC-11 Adapter', # MC-11 with not-supported lenses
73
74
  2 => 'Sony LA-EA2 Adapter',
74
75
  3 => 'Sony LA-EA3 Adapter',
75
76
  6 => 'Sony LA-EA4 Adapter',
76
77
  7 => 'Sony LA-EA5 Adapter', #JR
78
+ 13 => 'Samyang AF 35-150mm F2-2.8',
77
79
  # 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB)
78
80
  44 => 'Metabones Canon EF Smart Adapter', #JR
79
81
  78 => 'Metabones Canon EF Smart Adapter Mark III or Other Adapter', #PH/JR (also Mark IV, Fotodiox and Viltrox)
@@ -164,6 +166,7 @@ sub PrintInvLensSpec($;$$);
164
166
  32879 => 'Sony FE 50mm F1.4 GM', #JR
165
167
  32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
166
168
  32885 => 'Sony FE 16-35mm F2.8 GM II', #JR
169
+ 32886 => 'Sony FE 300mm F2.8 OSS', #JR
167
170
 
168
171
  # (comment this out so LensID will report the LensModel, which is more useful)
169
172
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -216,13 +219,22 @@ sub PrintInvLensSpec($;$$);
216
219
  49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
217
220
  49471 => 'Tamron 50-400mm F4.5-6.3 Di III VC VXD', #JR (Model A067)
218
221
  49472 => 'Tamron 20-40mm F2.8 Di III VXD', #JR (Model A062)
219
-
220
- 49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
221
- 49473.1 => 'Viltrox 23mm F1.4 E', #JR
222
- 49473.2 => 'Viltrox 56mm F1.4 E', #JR
222
+ 49473 => 'Tamron 17-50mm F4 Di III VXD or Tokina or Viltrox lens', #JR (Model A068)
223
+ 49473.1 => 'Tokina atx-m 85mm F1.8 FE', #JR
224
+ 49473.2 => 'Viltrox 23mm F1.4 E', #JR
225
+ 49473.3 => 'Viltrox 56mm F1.4 E', #JR
226
+ 49473.4 => 'Viltrox 85mm F1.8 II FE', #JR
223
227
  49474 => 'Tamron 70-180mm F2.8 Di III VXD G2 or Viltrox lens', #JR (Model A065)
224
- 49474.1 => 'Viltrox 23mm F1.4 E', #JR
228
+ 49474.1 => 'Viltrox 13mm F1.4 E',
225
229
  49474.2 => 'Viltrox 16mm F1.8 FE', #JR
230
+ 49474.3 => 'Viltrox 23mm F1.4 E', #JR
231
+ 49474.4 => 'Viltrox 24mm F1.8 FE', #JR
232
+ 49474.5 => 'Viltrox 28mm F1.8 FE', #JR
233
+ 49474.6 => 'Viltrox 33mm F1.4 E', #JR
234
+ 49474.7 => 'Viltrox 35mm F1.8 FE', #JR
235
+ 49474.8 => 'Viltrox 50mm F1.8 FE', #JR
236
+ 49474.9 => 'Viltrox 75mm F1.2 E', #JR
237
+
226
238
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
227
239
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
228
240
  49714 => 'Tokina atx-m 11-18mm F2.8 E', #JR
@@ -273,6 +285,7 @@ sub PrintInvLensSpec($;$$);
273
285
  50538 => 'Sigma 17mm F4 DG DN | C', #JR (023)
274
286
  50539 => 'Sigma 50mm F1.4 DG DN | A', #JR (023)
275
287
  50540 => 'Sigma 14mm F1.4 DG DN | A', #JR (023)
288
+ 50543 => 'Sigma 70-200mm F2.8 DG DN OS | S', #JR (023)
276
289
  50544 => 'Sigma 23mm F1.4 DC DN | C', #JR (023)
277
290
  50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023)
278
291
 
@@ -1633,6 +1646,15 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1633
1646
  # 0x2044 - int32u[2] in ILCE-6700/7CM2/7CR, ILCE-7M4 v1.10, ILCE-7RM5 JPG and ZV-E1:
1634
1647
  # ARW: seen 143360 53248 and 139264 53248
1635
1648
  # JPG: [~filesize] 53248
1649
+ # 0x2047 - first seen for ILCE-9M3, November 2023
1650
+ # 0x2048 - first seen for ILCE-9M3
1651
+ # 0x2049 - undef[2]
1652
+ 0x204a => { #JR
1653
+ Name => 'FocusLocation2',
1654
+ Writable => 'int16u',
1655
+ Count => 4,
1656
+ NOTES => 'same as FocusLocation within one pixel',
1657
+ },
1636
1658
  0x3000 => {
1637
1659
  Name => 'ShotInfo',
1638
1660
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -1704,7 +1726,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1704
1726
  # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/1F/1M2/E10
1705
1727
  # 0x31 (e) for ILCE-1/7M4/7SM3, ILME-FX3
1706
1728
  # 0x32 (e) for ILCE-7RM5, ILME-FX30
1707
- # 0x33 (e) for ILCE-6700, 7CM2, 7CR, ZV-E1
1729
+ # 0x33 (e) for ILCE-6700/7CM2/7CR/9M3, ZV-E1
1708
1730
  # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106, 89, 63 respectively
1709
1731
  {
1710
1732
  Name => 'Tag9400a',
@@ -1826,6 +1848,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1826
1848
  # 0x25 (37) ILCE-7M4
1827
1849
  # 0x26 (38) ILCE-7RM5, ILME-FX30
1828
1850
  # 0x27 (39) ILCE-6700/7CM2/7CR, ZV-E1
1851
+ # 0x28 (40) ILCE-9M3
1829
1852
  # var var SLT-A58/A99V, HV, ILCA-68/77M2/99M2
1830
1853
  # only valid when first byte 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x1c (enciphered 0x8a, 0x70, 0xb6, 0x69, 0x88, 0x20, 0x30, 0xd7, 0xbb, 0x92, 0x28)
1831
1854
  # Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46\x1d\x18\x3a\x95\x24\x26\xd6]\x01/ : $$valPt =~ /^[\x8a\x70\xb6\x69\x88\x20\x30\xd7\xbb\x92\x28]\x01/',
@@ -1904,11 +1927,15 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1904
1927
  Name => 'Tag9406',
1905
1928
  # - first byte must be 0x01 or 0x02 (enciphered 0x01 or 0x08),
1906
1929
  # or 0x03 (enc. 0x1b) for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2, and ILCA-99M2
1907
- # or 0x04 (enc. 0x40) for ILCE-6700, ZV-E1
1908
1930
  # third byte must be 0x02 or 0x03 (enciphered 0x08 or 0x1b) - ref JR
1909
1931
  # (applies to most SLT/ILCA and NEX/ILCE models, but no DSC models)
1910
- Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s or $$valPt =~ /^[\x40]/s',
1932
+ Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s',
1911
1933
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9406' },
1934
+ },{
1935
+ Name => 'Tag9406b',
1936
+ # - first byte 0x04 (enc. 0x40) for ILCE-6700/7CM2/7CR/9M3, ZV-E1
1937
+ Condition => '$$valPt =~ /^[\x40]/s',
1938
+ SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9406b' },
1912
1939
  },{
1913
1940
  Name => 'Sony_0x9406',
1914
1941
  %unknownCipherData,
@@ -2001,6 +2028,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2001
2028
  '3 3 5 0' => 'ARW 2.3.5', #JR (DSC-HX99)
2002
2029
  '4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
2003
2030
  '4 0 1 0' => 'ARW 4.0.1', #github#195 (ZV-E1)
2031
+ '5 0 0 0' => 'ARW 5.0', # (ILCE-9M3)
2004
2032
  # what about cRAW images?
2005
2033
  },
2006
2034
  },
@@ -2107,6 +2135,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2107
2135
  389 => 'ZV-1F', #IB
2108
2136
  390 => 'ILCE-7RM5', #IB
2109
2137
  391 => 'ILME-FX30', #JR
2138
+ 392 => 'ILCE-9M3', #JR
2110
2139
  393 => 'ZV-E1', #JR
2111
2140
  394 => 'ILCE-6700', #JR
2112
2141
  395 => 'ZV-1M2', #JR
@@ -8397,7 +8426,7 @@ my %isoSetting2010 = (
8397
8426
  },
8398
8427
  0x002a => [{
8399
8428
  Name => 'Quality2',
8400
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8429
+ Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8401
8430
  PrintConv => {
8402
8431
  0 => 'JPEG',
8403
8432
  1 => 'RAW',
@@ -8414,15 +8443,15 @@ my %isoSetting2010 = (
8414
8443
  6 => 'RAW + HEIF',
8415
8444
  },
8416
8445
  }],
8417
- 0x0047 => {
8418
- Name => 'SonyImageHeight',
8419
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8420
- Format => 'int16u',
8421
- PrintConv => '$val > 0 ? 8*$val : "n.a."',
8422
- },
8446
+ # 0x0047 => { # often incorrect, requires 16x for some models
8447
+ # Name => 'SonyImageHeight',
8448
+ # Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8449
+ # Format => 'int16u',
8450
+ # PrintConv => '$val > 0 ? 8*$val : "n.a."',
8451
+ # },
8423
8452
  0x0053 => {
8424
8453
  Name => 'ModelReleaseYear',
8425
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8454
+ Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8426
8455
  Format => 'int8u',
8427
8456
  PrintConv => 'sprintf("20%.2d", $val)',
8428
8457
  },
@@ -8461,10 +8490,11 @@ my %isoSetting2010 = (
8461
8490
  FIRST_ENTRY => 0,
8462
8491
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
8463
8492
  DATAMEMBER => [ 0 ],
8464
- IS_SUBDIR => [ 0x03e2, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8493
+ IS_SUBDIR => [ 0x03e2, 0x03f4, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8465
8494
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
8466
8495
 
8467
8496
  0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8497
+ 0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 185', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8468
8498
  0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8469
8499
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8470
8500
  0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -9013,30 +9043,19 @@ my %isoSetting2010 = (
9013
9043
  FORMAT => 'int8u',
9014
9044
  WRITABLE => 1,
9015
9045
  FIRST_ENTRY => 0,
9016
- DATAMEMBER => [ 0 ],
9017
9046
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9018
9047
  # 0x0000: 1 for SLT-A37/A57/A65/A77, NEX-5N/7/F3/VG20
9019
9048
  # 2 for SLT-A58/99V, NEX-3N/5R/5T/6/VG30/VG900, ILCA-68/77M2, ILCE-3000/3500/7/7M2/7R/7S/5000/6000
9020
9049
  # 3 for ILCA-99M2, ILCE-6100/6300/6400/6500/6600/7C/7M3/7M4/7RM2/7RM3/7RM4/7RM5/7SM2/7SM3/9/9M2/1
9021
- # 4 for ILCE-6700/7CM2/7CR, ZV-E1
9022
- 0x0000 => { Name => 'Ver9406', Hidden => 1, RawConv => '$$self{Ver9406} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
9023
9050
  # 0x0001+0x0002: Int16u, seen 580 - 770: similar to "BatteryUnknown" ??
9024
9051
  # 0x0005: int8u, seen 73 - 117: maybe Fahrenheit? Higher than "AmbientTemperature", but same trend.
9025
- # 0x0004: for Ver9406=4: seen 3, 5, 7: when 3 or 7 0x0005 appears valid; when 5, 0x0005 always 0
9026
- 0x0005 => [{
9052
+ 0x0005 => {
9027
9053
  Name => 'BatteryTemperature',
9028
- Condition => '$$self{Ver9406} != 4',
9029
9054
  ValueConv => '($val - 32) / 1.8', # convert to Celsius
9030
9055
  ValueConvInv => '$val * 1.8 + 32',
9031
9056
  PrintConv => 'sprintf("%.1f C",$val)',
9032
9057
  PrintConvInv => '$val=~s/\s*C//; $val',
9033
- },{
9034
- Name => 'BatteryLevel',
9035
- Condition => '$$self{Ver9406} == 4',
9036
- RawConv => '$val ? $val : undef', # only valid when not 0
9037
- PrintConv => '"$val%"',
9038
- PrintConvInv => '$val=~s/\s*\%//; $val',
9039
- }],
9058
+ },
9040
9059
  # 0x0006: usually 0, seen non-zero values only for SLT-A99V, ILCA-77M2/99M2 and ILCE-7/7R/7RM2/9: BatteryLevel Grip ?
9041
9060
  0x0006 => {
9042
9061
  Name => 'BatteryLevelGrip1',
@@ -9047,7 +9066,6 @@ my %isoSetting2010 = (
9047
9066
  # 0x0007: seen values from 8 - 105, decreasing in sequences of images: BatteryLevel
9048
9067
  0x0007 => {
9049
9068
  Name => 'BatteryLevel',
9050
- Condition => '$$self{Ver9406} != 4',
9051
9069
  PrintConv => '"$val%"',
9052
9070
  PrintConvInv => '$val=~s/\s*\%//; $val',
9053
9071
  },
@@ -9066,6 +9084,49 @@ my %isoSetting2010 = (
9066
9084
  # 0x0025: 0 or 1 for other SLT and NEX (0x0022, 0x0023, 0x0024 = 255)
9067
9085
  );
9068
9086
 
9087
+ # Tag9406b (ref JR)
9088
+ %Image::ExifTool::Sony::Tag9406b = (
9089
+ PROCESS_PROC => \&ProcessEnciphered,
9090
+ WRITE_PROC => \&WriteEnciphered,
9091
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9092
+ FORMAT => 'int8u',
9093
+ WRITABLE => 1,
9094
+ FIRST_ENTRY => 0,
9095
+ DATAMEMBER => [ 1, 4, 6 ],
9096
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9097
+ # 0x0000: 4 for ILCE-6700/7CM2/7CR/9M3, ZV-E1
9098
+ 0x0001 => {
9099
+ Name => 'Battery2',
9100
+ Hidden => 1,
9101
+ RawConv => '$$self{Battery2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
9102
+ # 0 for single battery, 1 for 2 batteries
9103
+ },
9104
+ 0x0004 => {
9105
+ Name => 'BatteryStatus1',
9106
+ Hidden => 1,
9107
+ # seen 3, 5, 7: when 3 or 7 0x0005 appears valid; when 5, 0x0005 always 0
9108
+ RawConv => '$$self{BatteryStatus1} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
9109
+ },
9110
+ 0x0005 => {
9111
+ Name => 'BatteryLevel',
9112
+ Condition => '$$self{BatteryStatus1} != 5',
9113
+ PrintConv => '"$val%"',
9114
+ PrintConvInv => '$val=~s/\s*\%//; $val',
9115
+ },
9116
+ 0x0006 => {
9117
+ Name => 'BatteryStatus2',
9118
+ Condition => '$$self{Battery2} == 1',
9119
+ Hidden => 1,
9120
+ RawConv => '$$self{BatteryStatus2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
9121
+ },
9122
+ 0x0007 => {
9123
+ Name => 'BatteryLevel2',
9124
+ Condition => '$$self{Battery2} == 1 and $$self{BatteryStatus2} != 5',
9125
+ PrintConv => '"$val%"',
9126
+ PrintConvInv => '$val=~s/\s*\%//; $val',
9127
+ },
9128
+ );
9129
+
9069
9130
  # Tag940a (ref PH, decoded mainly from A77)
9070
9131
  %Image::ExifTool::Sony::Tag940a = (
9071
9132
  PROCESS_PROC => \&ProcessEnciphered,
@@ -9760,7 +9821,7 @@ my %isoSetting2010 = (
9760
9821
  WRITE_PROC => \&WriteEnciphered,
9761
9822
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9762
9823
  FORMAT => 'int8u',
9763
- NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3, ILME-FX3/FX30, ZV-E1.',
9824
+ NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1.',
9764
9825
  FIRST_ENTRY => 0,
9765
9826
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9766
9827
  0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
@@ -9944,7 +10005,7 @@ my %isoSetting2010 = (
9944
10005
  },
9945
10006
  0x08e5 => {
9946
10007
  Name => 'APS-CSizeCapture',
9947
- Condition => '$$self{Model} =~ /^(ILCE-7RM5|ZV-E1)\b/',
10008
+ Condition => '$$self{Model} =~ /^(ILCE-(7CM2|7CR|7RM5)|ZV-E1)\b/',
9948
10009
  PrintConv => {
9949
10010
  0 => 'Off',
9950
10011
  1 => 'On',