exiftool_vendored 11.96.0 → 12.08.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +172 -2
  3. data/bin/MANIFEST +8 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +43 -42
  7. data/bin/exiftool +148 -69
  8. data/bin/lib/Image/ExifTool.pm +159 -110
  9. data/bin/lib/Image/ExifTool.pod +114 -87
  10. data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  11. data/bin/lib/Image/ExifTool/APE.pm +2 -2
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +13 -7
  13. data/bin/lib/Image/ExifTool/Canon.pm +37 -11
  14. data/bin/lib/Image/ExifTool/CanonCustom.pm +82 -16
  15. data/bin/lib/Image/ExifTool/DPX.pm +56 -2
  16. data/bin/lib/Image/ExifTool/DarwinCore.pm +20 -3
  17. data/bin/lib/Image/ExifTool/EXE.pm +8 -5
  18. data/bin/lib/Image/ExifTool/Exif.pm +15 -6
  19. data/bin/lib/Image/ExifTool/Font.pm +9 -2
  20. data/bin/lib/Image/ExifTool/GIF.pm +5 -0
  21. data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
  22. data/bin/lib/Image/ExifTool/Geotag.pm +2 -2
  23. data/bin/lib/Image/ExifTool/GoPro.pm +56 -22
  24. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  25. data/bin/lib/Image/ExifTool/HtmlDump.pm +2 -2
  26. data/bin/lib/Image/ExifTool/ID3.pm +91 -12
  27. data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
  28. data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
  29. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  30. data/bin/lib/Image/ExifTool/M2TS.pm +44 -24
  31. data/bin/lib/Image/ExifTool/MacOS.pm +152 -38
  32. data/bin/lib/Image/ExifTool/Minolta.pm +6 -2
  33. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +11 -10
  34. data/bin/lib/Image/ExifTool/Nikon.pm +162 -18
  35. data/bin/lib/Image/ExifTool/Olympus.pm +39 -17
  36. data/bin/lib/Image/ExifTool/PNG.pm +14 -3
  37. data/bin/lib/Image/ExifTool/PPM.pm +5 -5
  38. data/bin/lib/Image/ExifTool/Panasonic.pm +148 -14
  39. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +33 -0
  40. data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
  41. data/bin/lib/Image/ExifTool/Pentax.pm +3 -1
  42. data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
  43. data/bin/lib/Image/ExifTool/QuickTime.pm +269 -29
  44. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +463 -75
  45. data/bin/lib/Image/ExifTool/README +21 -20
  46. data/bin/lib/Image/ExifTool/RIFF.pm +15 -3
  47. data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
  48. data/bin/lib/Image/ExifTool/RTF.pm +12 -7
  49. data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
  50. data/bin/lib/Image/ExifTool/Shift.pl +1 -0
  51. data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
  52. data/bin/lib/Image/ExifTool/Sony.pm +425 -34
  53. data/bin/lib/Image/ExifTool/TagLookup.pm +1961 -1874
  54. data/bin/lib/Image/ExifTool/TagNames.pod +394 -86
  55. data/bin/lib/Image/ExifTool/Validate.pm +4 -4
  56. data/bin/lib/Image/ExifTool/WriteExif.pl +3 -2
  57. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +23 -15
  58. data/bin/lib/Image/ExifTool/Writer.pl +44 -21
  59. data/bin/lib/Image/ExifTool/XMP.pm +42 -5
  60. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  61. data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
  62. data/bin/perl-Image-ExifTool.spec +42 -41
  63. data/lib/exiftool_vendored/version.rb +1 -1
  64. metadata +8 -7
@@ -763,25 +763,26 @@ numerical, and generated automatically otherwise.
763
763
  conditionally deleted.
764
764
 
765
765
  Writable : Indicates this tag can be written (or not written if Writable
766
- is set to zero), and for EXIF-type tables gives format for
767
- writing. Writable may be set to 1 for MakerNotes information
768
- because the existing format is always used, however providing
769
- a format is desirable because it is used in validating the
770
- value. Set to 2 for tag to show "yes" in the Writable column
771
- of the tag name documentation even when there is no WRITE_PROC
772
- defined (eg. if it is written via an Extra tag). For EXIF
773
- tables, the Writable flag may be different than the Format
774
- flag, in which case Format is used for converting the binary
775
- value and Writable specifies the format code written to the
776
- EXIF IFD. For SubDirectories in EXIF information, this flag
777
- is only defined if the SubDirectory is writable as a block, or
778
- if the SubDirectory can not be edited (in which case Writable
779
- is set to 0). If non-zero, the SubDirectory is also extracted
780
- as a block, so the Binary and Protected flags should usually
781
- set as well. There is currently no way to specify a write
782
- format for a SubDirectory that is not writable as a block (the
783
- default is 'int32u' for IFD-type SubDirectories, and 'undef'
784
- for all others).
766
+ is set to zero), and for EXIF and QuickTime tables gives
767
+ format for writing. Writable may be set to 1 for MakerNotes
768
+ information because the existing format is always used,
769
+ however providing a format is desirable because it is used in
770
+ validating the value. Set to 2 for tag to show "yes" in the
771
+ Writable column of the tag name documentation even when there
772
+ is no WRITE_PROC defined (eg. if it is written via an Extra
773
+ tag). For EXIF and QuickTime tables, the Writable flag may be
774
+ different than the Format flag, in which case Format is used
775
+ for converting the binary value and Writable specifies the
776
+ format code written to the EXIF IFD. For SubDirectories in
777
+ EXIF information, this flag is only defined if the
778
+ SubDirectory is writable as a block, or if the SubDirectory
779
+ can not be edited (in which case Writable is set to 0). If
780
+ non-zero, the SubDirectory is also extracted as a block, so
781
+ the Binary and Protected flags should usually set as well.
782
+ There is currently no way to specify a write format for a
783
+ SubDirectory that is not writable as a block (the default is
784
+ 'int32u' for IFD-type SubDirectories, and 'undef' for all
785
+ others).
785
786
 
786
787
  WriteAlso : Used for writable tag to specify other tags to write when this
787
788
  tag is written. The value is a hash reference. The hash keys
@@ -1083,7 +1084,7 @@ The contained structure field information hashes are similar to tag information
1083
1084
  hashes, except that only the following elements are used:
1084
1085
 
1085
1086
  Raw/Value/PrintConv (and their inverses), TagID (optional), Groups, List,
1086
- Writable, Struct, Namespace, LangCode, PropertyPath, Notes.
1087
+ Writable, Struct, Namespace, FlatName, LangCode, PropertyPath, Notes.
1087
1088
 
1088
1089
  But note that for PropertyPath, only the element of the path corresponding to
1089
1090
  the specific field is stored (including any necessary list properties). The
@@ -29,7 +29,7 @@ use strict;
29
29
  use vars qw($VERSION);
30
30
  use Image::ExifTool qw(:DataAccess :Utils);
31
31
 
32
- $VERSION = '1.55';
32
+ $VERSION = '1.56';
33
33
 
34
34
  sub ConvertTimecode($);
35
35
  sub ProcessSGLT($$$);
@@ -485,14 +485,26 @@ my %code2charset = (
485
485
  #
486
486
  # WebP-specific tags
487
487
  #
488
- EXIF => { # (WebP)
488
+ EXIF => [{ # (WebP)
489
489
  Name => 'EXIF',
490
+ Condition => '$$valPt =~ /^(II\x2a\0|MM\0\x2a)/',
490
491
  Notes => 'WebP files',
491
492
  SubDirectory => {
492
493
  TagTable => 'Image::ExifTool::Exif::Main',
493
494
  ProcessProc => \&Image::ExifTool::ProcessTIFF,
494
495
  },
495
- },
496
+ },{ # (WebP) - have also seen with "Exif\0\0" header - PH
497
+ Name => 'EXIF',
498
+ Condition => '$$valPt =~ /^Exif\0\0(II\x2a\0|MM\0\x2a)/',
499
+ SubDirectory => {
500
+ TagTable => 'Image::ExifTool::Exif::Main',
501
+ ProcessProc => \&Image::ExifTool::ProcessTIFF,
502
+ Start => 6,
503
+ },
504
+ },{
505
+ Name => 'UnknownEXIF',
506
+ Binary => 1,
507
+ }],
496
508
  'XMP ' => { #14 (WebP)
497
509
  Name => 'XMP',
498
510
  Notes => 'WebP files',
@@ -14,19 +14,22 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.08';
17
+ $VERSION = '1.09';
18
+
19
+ sub ProcessRSRC($$);
18
20
 
19
21
  # Information decoded from Mac OS resources
20
22
  %Image::ExifTool::RSRC::Main = (
21
23
  GROUPS => { 2 => 'Document' },
24
+ PROCESS_PROC => \&ProcessRSRC,
22
25
  NOTES => q{
23
- Tags extracted from Mac OS resource files and DFONT files. These tags may
24
- also be extracted from the resource fork of any file in OS X, either by
25
- adding "/..namedfork/rsrc" to the filename to process the resource fork
26
- alone, or by using the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option to process the resource
27
- fork as a sub-document of the main file. When writing, ExifTool preserves
28
- the Mac OS resource fork by default, but it may deleted with C<-rsrc:all=>
29
- on the command line.
26
+ Tags extracted from Mac OS resource files, DFONT files and "._" sidecar
27
+ files. These tags may also be extracted from the resource fork of any file
28
+ in OS X, either by adding "/..namedfork/rsrc" to the filename to process the
29
+ resource fork alone, or by using the L<ExtractEmbedded|../ExifTool.html#ExtractEmbedded> (-ee) option to process
30
+ the resource fork as a sub-document of the main file. When writing,
31
+ ExifTool preserves the Mac OS resource fork by default, but it may deleted
32
+ with C<-rsrc:all=> on the command line.
30
33
  },
31
34
  '8BIM' => {
32
35
  Name => 'PhotoshopInfo',
@@ -66,6 +69,9 @@ sub ProcessRSRC($$)
66
69
  my $raf = $$dirInfo{RAF};
67
70
  my ($hdr, $map, $buff, $i, $j);
68
71
 
72
+ # allow access with data reference
73
+ $raf or $raf = new File::RandomAccess($$dirInfo{DataPt});
74
+
69
75
  # attempt to validate the format as thoroughly as practical
70
76
  return 0 unless $raf->Read($hdr, 30) == 30;
71
77
  my ($datOff, $mapOff, $datLen, $mapLen) = unpack('N*', $hdr);
@@ -81,7 +87,7 @@ sub ProcessRSRC($$)
81
87
  SetByteOrder('MM');
82
88
  my $typeOff = Get16u(\$map, 24);
83
89
  my $nameOff = Get16u(\$map, 26);
84
- my $numTypes = Get16u(\$map, 28);
90
+ my $numTypes = (Get16u(\$map, 28) + 1) & 0xffff;
85
91
 
86
92
  # validate offsets in the resource map
87
93
  return 0 if $typeOff < 28 or $nameOff < 30;
@@ -89,10 +95,10 @@ sub ProcessRSRC($$)
89
95
  $et->SetFileType('RSRC') unless $$et{IN_RESOURCE};
90
96
  my $verbose = $et->Options('Verbose');
91
97
  my $tagTablePtr = GetTagTable('Image::ExifTool::RSRC::Main');
92
- $et->VerboseDir('RSRC', $numTypes+1);
98
+ $et->VerboseDir('RSRC', $numTypes);
93
99
 
94
100
  # parse resource type list
95
- for ($i=0; $i<=$numTypes; ++$i) {
101
+ for ($i=0; $i<$numTypes; ++$i) {
96
102
  my $off = $typeOff + 2 + 8 * $i; # offset of entry in type list
97
103
  last if $off + 8 > $mapLen;
98
104
  my $resType = substr($map,$off,4); # resource type
@@ -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.03';
18
+ $VERSION = '1.04';
19
19
 
20
20
  sub ProcessUserProps($$$);
21
21
 
@@ -181,12 +181,17 @@ sub UnescapeRTF($$$)
181
181
  if ($1 eq 'uc') { # \ucN
182
182
  $skip = $2;
183
183
  } elsif ($1 eq 'u') { # \uN
184
- require Image::ExifTool::Charset;
185
- $rtnVal .= Image::ExifTool::Charset::Recompose($et, [$2]);
186
- if ($skip) {
187
- # must skip the specified number of characters
188
- # (not simple because RTF control words count as a single character)
189
- last unless $val =~ /\G([^\\]|\\([a-zA-Z]+)(-?\d+)? ?|\\'.{2}|\\.){$skip}/g;
184
+ if ($2 < 0) {
185
+ $et->WarnOnce('Invalid Unicode character(s) in text');
186
+ $rtnVal .= '?';
187
+ } else {
188
+ require Image::ExifTool::Charset;
189
+ $rtnVal .= Image::ExifTool::Charset::Recompose($et, [$2]);
190
+ if ($skip) {
191
+ # must skip the specified number of characters
192
+ # (not simple because RTF control words count as a single character)
193
+ last unless $val =~ /\G([^\\]|\\([a-zA-Z]+)(-?\d+)? ?|\\'.{2}|\\.){$skip}/g;
194
+ }
190
195
  }
191
196
  } elsif ($rtfEntity{$1}) {
192
197
  require Image::ExifTool::Charset;
@@ -19,7 +19,7 @@ use vars qw($VERSION);
19
19
  use Image::ExifTool qw(:DataAccess :Utils);
20
20
  use Image::ExifTool::Exif;
21
21
 
22
- $VERSION = '1.34';
22
+ $VERSION = '1.35';
23
23
 
24
24
  sub ProcessRicohText($$$);
25
25
  sub ProcessRicohRMETA($$$);
@@ -875,6 +875,7 @@ my %ricohLensIDs = (
875
875
  Name => 'SoundFile',
876
876
  Notes => 'audio data recorded in JPEG images by the G700SE',
877
877
  },
878
+ _barcode => { Name => 'Barcodes', List => 1 },
878
879
  );
879
880
 
880
881
  # information stored in Ricoh AVI images (ref PH)
@@ -1004,6 +1005,23 @@ sub ProcessRicohRMETA($$$)
1004
1005
  # (but it looks like the int16u at $dirStart+6 is the next block number
1005
1006
  # if the data is continued, or 0 for the last block)
1006
1007
  $dirLen < 14 and $et->Warn('Short Ricoh RMETA block', 1), return 0;
1008
+ if ($$dataPt =~ /^.{20}BARCODE/s) {
1009
+ my $val = substr($$dataPt, 20);
1010
+ $val =~ s/\0.*//s;
1011
+ $val =~ s/^BARCODE\w+,\d{2},//;
1012
+ my @codes;
1013
+ for (;;) {
1014
+ $val =~ s/(\d+),// and length $val >= $1 or last;
1015
+ push @codes, substr($val, 0, $1);
1016
+ last unless length $val > $1;
1017
+ $val = substr($val, $1+1);
1018
+ }
1019
+ $et->HandleTag($tagTablePtr, '_barcode', \@codes) if @codes;
1020
+ return 1;
1021
+ } elsif ($$dataPt =~ /^.{18}ASCII/s) {
1022
+ # (ignore barcode tag names for now)
1023
+ return 1;
1024
+ }
1007
1025
  my $audioLen = Get16u($dataPt, $dirStart+12);
1008
1026
  $audioLen + 14 > $dirLen and $et->Warn('Truncated Ricoh RMETA audio data', 1), return 0;
1009
1027
  my $buff = substr($$dataPt, $dirStart + 14, $audioLen);
@@ -300,6 +300,7 @@ sub ShiftTime($;$$$)
300
300
  #
301
301
  SplitTime($val, \@time) or return "Invalid time string ($val)";
302
302
  if (defined $time[0]) {
303
+ return "Can't shift from year 0000" if $time[0] eq '0000';
303
304
  $mode = defined $time[3] ? 'DateTime' : 'Date';
304
305
  } elsif (defined $time[3]) {
305
306
  $mode = 'Time';
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::Sigma;
18
18
 
19
- $VERSION = '1.26';
19
+ $VERSION = '1.27';
20
20
 
21
21
  sub ProcessX3FHeader($$$);
22
22
  sub ProcessX3FDirectory($$$);
@@ -427,36 +427,43 @@ sub WriteX3F($$)
427
427
  $len -= 28;
428
428
 
429
429
  # only rewrite full-sized JpgFromRaw (version 2.0, type 2, format 18)
430
- if ($buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/ and
431
- $$et{ImageWidth} == unpack('x16V', $buff))
432
- {
430
+ if ($buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/) {
433
431
  $raf->Read($buff, $len) == $len or return 'Error reading JpgFromRaw';
434
- # use same write directories as JPEG
435
- $et->InitWriteDirs('JPEG');
436
- # rewrite the embedded JPEG in memory
437
- my $newData;
438
- my %jpegInfo = (
439
- Parent => 'X3F',
440
- RAF => new File::RandomAccess(\$buff),
441
- OutFile => \$newData,
442
- );
443
- $$et{FILE_TYPE} = 'JPEG';
444
- my $success = $et->WriteJPEG(\%jpegInfo);
445
- $$et{FILE_TYPE} = 'X3F';
446
- SetByteOrder('II');
447
- return 'Error writing X3F JpgFromRaw' unless $success and $newData;
448
- return -1 if $success < 0;
449
- # write new data if anything changed, otherwise copy old image
450
- my $outPt = $$et{CHANGED} ? \$newData : \$buff;
451
- Write($outfile, $$outPt) or return -1;
452
- # set $len to the total subsection data length
453
- $len = length($$outPt) + 28;
454
- $didContain = 1;
432
+ if ($buff =~ /^\xff\xd8\xff\xe1/) { # does this preview contain EXIF?
433
+ # use same write directories as JPEG
434
+ $et->InitWriteDirs('JPEG');
435
+ # make sure we don't add APP0 JFIF because it would mess up our preview identification
436
+ delete $$et{ADD_DIRS}{APP0};
437
+ delete $$et{ADD_DIRS}{JFIF};
438
+ # rewrite the embedded JPEG in memory
439
+ my $newData;
440
+ my %jpegInfo = (
441
+ Parent => 'X3F',
442
+ RAF => new File::RandomAccess(\$buff),
443
+ OutFile => \$newData,
444
+ );
445
+ $$et{FILE_TYPE} = 'JPEG';
446
+ my $success = $et->WriteJPEG(\%jpegInfo);
447
+ $$et{FILE_TYPE} = 'X3F';
448
+ SetByteOrder('II');
449
+ return 'Error writing X3F JpgFromRaw' unless $success and $newData;
450
+ return -1 if $success < 0;
451
+ # (this shouldn't happen unless someone tries to delete the EXIF...)
452
+ return 'EXIF segment must come first in X3F JpgFromRaw' unless $newData =~ /^\xff\xd8\xff\xe1/;
453
+ # write new data if anything changed, otherwise copy old image
454
+ my $outPt = $$et{CHANGED} ? \$newData : \$buff;
455
+ Write($outfile, $$outPt) or return -1;
456
+ # set $len to the total subsection data length
457
+ $len = length($$outPt);
458
+ $didContain = 1;
459
+ } else {
460
+ Write($outfile, $buff) or return -1;
461
+ }
455
462
  } else {
456
463
  # copy original image data
457
464
  Image::ExifTool::CopyBlock($raf, $outfile, $len) or return 'Corrupted X3F image';
458
- $len += 28;
459
465
  }
466
+ $len += 28; # add back header length
460
467
  } else {
461
468
  # copy data for this subsection
462
469
  Image::ExifTool::CopyBlock($raf, $outfile, $len) or return 'Corrupted X3F directory';
@@ -516,16 +523,18 @@ sub ProcessX3FDirectory($$$)
516
523
  $raf->Read($buff, 28) == 28 or return 'Error reading PreviewImage header';
517
524
  # ignore all image data but JPEG compressed (version 2.0, type 2, format 18)
518
525
  next unless $buff =~ /^SECi\0\0\x02\0\x02\0\0\0\x12\0\0\0/;
519
- # check preview image size and extract full-sized preview as JpgFromRaw
520
- if ($$et{ImageWidth} == unpack('x16V', $buff)) {
526
+ $offset += 28;
527
+ $len -= 28;
528
+ $raf->Read($buff, $len) == $len or return "Error reading PreviewImage data";
529
+ # check fore EXIF segment, and extract this image as the JpgFromRaw
530
+ if ($buff =~ /^\xff\xd8\xff\xe1/) {
521
531
  $$et{IsJpgFromRaw} = 1;
522
532
  $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
523
533
  delete $$et{IsJpgFromRaw};
524
534
  }
525
- $offset += 28;
526
- $len -= 28;
535
+ } else {
536
+ $raf->Read($buff, $len) == $len or return "Error reading $$tagInfo{Name} data";
527
537
  }
528
- $raf->Read($buff, $len) == $len or return "Error reading $$tagInfo{Name} data";
529
538
  my $subdir = $$tagInfo{SubDirectory};
530
539
  if ($subdir) {
531
540
  my %dirInfo = ( DataPt => \$buff );
@@ -591,8 +600,6 @@ sub ProcessX3F($$)
591
600
  $buff .= $buf2;
592
601
  }
593
602
  my ($widPos, $hdrType) = $ver < 4 ? (28, 'Header') : (40, 'Header4');
594
- # extract ImageWidth for later
595
- $$et{ImageWidth} = Get32u(\$buff, $widPos);
596
603
  # process header information
597
604
  my $tagTablePtr = GetTagTable('Image::ExifTool::SigmaRaw::Main');
598
605
  unless ($outfile) {
@@ -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.23';
37
+ $VERSION = '3.30';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -143,6 +143,8 @@ sub PrintInvLensSpec($;$$);
143
143
  32854 => 'Sony E 70-350mm F4.5-6.3 G OSS', #IB/JR
144
144
  32858 => 'Sony FE 35mm F1.8', #JR/IB
145
145
  32859 => 'Sony FE 20mm F1.8 G', #IB/JR
146
+ 32860 => 'Sony FE 12-24mm F2.8 GM', #JR/IB
147
+ 32864 => 'Sony FE 28-60mm F4-5.6', #JR
146
148
 
147
149
  # (comment this out so LensID will report the LensModel, which is more useful)
148
150
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -180,7 +182,9 @@ sub PrintInvLensSpec($;$$);
180
182
  49460 => 'Tamron 24mm F2.8 Di III OSD M1:2', #JR (Model F051)
181
183
  49461 => 'Tamron 20mm F2.8 Di III OSD M1:2', #JR (Model F050)
182
184
  49462 => 'Tamron 70-180mm F2.8 Di III VXD', #JR (Model A056)
183
-
185
+ 49463 => 'Tamron 28-200mm F2.8-5.6 Di III RXD', #JR (Model A071)
186
+ 49464 => 'Tamron 70-300mm F4.5-6.3 Di III RXD', #JR (Model A047)
187
+ 49473 => 'Tokina atx-m 85mm F1.8 FE', #JR
184
188
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
185
189
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
186
190
 
@@ -209,6 +213,9 @@ sub PrintInvLensSpec($;$$);
209
213
  50515 => 'Sigma 35mm F1.2 DG DN | A', #IB/JR (019)
210
214
  50516 => 'Sigma 14-24mm F2.8 DG DN | A', #IB/JR (019)
211
215
  50517 => 'Sigma 24-70mm F2.8 DG DN | A', #JR (019)
216
+ 50518 => 'Sigma 100-400mm F5-6.3 DG DN OS | C', #JR (020)
217
+ 50521 => 'Sigma 85mm F1.4 DG DN | A', #JR (020)
218
+ 50522 => 'Sigma 105mm F2.8 DG DN MACRO | A', #JR (020)
212
219
 
213
220
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
214
221
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
@@ -221,18 +228,22 @@ sub PrintInvLensSpec($;$$);
221
228
  51000 => 'Voigtlander NOKTON 50mm F1.2 Aspherical', #JR
222
229
  51001 => 'Voigtlander NOKTON 21mm F1.4 Aspherical', #JR
223
230
  51002 => 'Voigtlander APO-LANTHAR 50mm F2 Aspherical', #JR
231
+ 51003 => 'Voigtlander NOKTON 35mm F1.2 Aspherical SE', #JR
224
232
 
225
233
  # lenses listed in the Sigma MC-11 list, but not yet seen:
226
234
  # 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014)
227
235
  # 504xx => 'Sigma 30mm F1.4 DC HSM | A + MC-11', # (013)
228
236
 
237
+ # Note: For Samyang lenses, the "FE" designation isn't written to
238
+ # EXIF:LensModel, so it isn't included in these strings either - JR/PH
229
239
  51504 => 'Samyang AF 50mm F1.4', #IB
230
240
  51505 => 'Samyang AF 14mm F2.8 or Samyang AF 35mm F2.8', #forum3833
231
241
  51505.1 => 'Samyang AF 35mm F2.8', #PH (also 32794)
232
242
  51507 => 'Samyang AF 35mm F1.4', #IB
233
243
  51508 => 'Samyang AF 45mm F1.8',
234
- 51510 => 'Samyang AF 18mm F2.8', #JR
235
-
244
+ 51510 => 'Samyang AF 18mm F2.8 or Samyang AF 35mm F1.8', #JR
245
+ 51510.1 => 'Samyang AF 35mm F1.8', #JR
246
+ 51512 => 'Samyang AF 75mm F1.8', #IB/JR
236
247
  );
237
248
 
238
249
  # ExposureProgram values (ref PH, mainly decoded from A200)
@@ -952,7 +963,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
952
963
  # unknown offsets or values for DSC-HX60V/HX350/HX400V/QX10/QX30/QX100/RX10/RX100M2/RX100M3/WX220/WX350,
953
964
  # ILCA-68/77M2, ILCE-5000/5100/6000/7/7M2/7R/7S/QX1, Stellar2, Lusso
954
965
  # unknown offsets or values for DSC-HX80/HX90V/RX0/RX1RM2/RX10M2/RX10M3/RX100M4/RX100M5/WX500, ILCE-6300/6500/7RM2/7SM2, ILCA-99M2
955
- # unknown offsets or values for ILCE-6100/6400/6600/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99
966
+ # unknown offsets or values for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99
967
+ # July 2020: ILCE-7SM3 doesn't write this tag anymore
956
968
  {
957
969
  Name => 'Tag2010a', # ad
958
970
  Condition => '$$self{Model} =~ /^NEX-5N$/',
@@ -993,7 +1005,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
993
1005
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
994
1006
  },{
995
1007
  Name => 'Tag2010i', # ?
996
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2))\b/',
1008
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-1)\b/',
997
1009
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
998
1010
  },{
999
1011
  Name => 'Tag_0x2010',
@@ -1378,6 +1390,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1378
1390
  '1 0' => 'Off',
1379
1391
  '1 1' => 'Standard',
1380
1392
  '1 2' => 'High',
1393
+ '65535 65535' => 'n/a', # ILCE-7SM3
1381
1394
  },
1382
1395
  },
1383
1396
  0x2029 => { # uncompressed 14-bit RAW file type setting introduced 2015
@@ -1386,6 +1399,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1386
1399
  PrintConv => {
1387
1400
  0 => 'Compressed RAW',
1388
1401
  1 => 'Uncompressed RAW',
1402
+ 65535 => 'n/a', # seen for ILCE-7SM3 JPEG-only
1389
1403
  },
1390
1404
  },
1391
1405
  # 0x202a - first seen for ILCE-6300: 66 bytes
@@ -1421,7 +1435,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1421
1435
  },
1422
1436
  },
1423
1437
  0x202d => { #JR first seen for ILCA-99M2, ILCE-6500, DSC-RX100M5
1424
- Name => 'ExposureStandardAdjustment', # (NC)
1438
+ Name => 'ExposureStandardAdjustment',
1425
1439
  Writable => 'rational64s',
1426
1440
  PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
1427
1441
  PrintConvInv => '$val',
@@ -1484,6 +1498,13 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1484
1498
  PrintConv => 'sprintf("%.8d",$val)',
1485
1499
  PrintConvInv => '$val',
1486
1500
  },
1501
+ # 0x2032 - first seen for ILCE-7SM3, July 2020
1502
+ # 0x2033 - first seen for ILCE-7SM3, July 2020
1503
+ # 0x2034 - first seen for ILCE-7SM3, July 2020
1504
+ # 0x2035 - first seen for ILCE-7SM3, July 2020
1505
+ # 0x2036 - first seen for ILCE-7SM3, July 2020
1506
+ # 0x2037 - first seen for ILCE-7SM3, July 2020
1507
+ # 0x2039 - first seen for ILCE-7SM3, July 2020
1487
1508
  0x3000 => {
1488
1509
  Name => 'ShotInfo',
1489
1510
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -1512,18 +1533,25 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1512
1533
  # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets
1513
1534
  {
1514
1535
  Name => 'Tag9050a',
1515
- Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|9|9M2)|ILCA-99M2)/',
1536
+ Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3|7RM4|7SM2|7SM3|9|9M2)|ILCA-99M2|ZV-)/',
1516
1537
  SubDirectory => {
1517
1538
  TagTable => 'Image::ExifTool::Sony::Tag9050a',
1518
1539
  ByteOrder => 'LittleEndian',
1519
1540
  },
1520
1541
  },{
1521
1542
  Name => 'Tag9050b',
1522
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|9|9M2)|ILCA-99M2)/',
1543
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3|7RM4|7SM2|9|9M2)|ILCA-99M2)/',
1523
1544
  SubDirectory => {
1524
1545
  TagTable => 'Image::ExifTool::Sony::Tag9050b',
1525
1546
  ByteOrder => 'LittleEndian',
1526
1547
  },
1548
+ },{
1549
+ Name => 'Tag9050c',
1550
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
1551
+ SubDirectory => {
1552
+ TagTable => 'Image::ExifTool::Sony::Tag9050c',
1553
+ ByteOrder => 'LittleEndian',
1554
+ },
1527
1555
  },{
1528
1556
  Name => 'Sony_0x9050',
1529
1557
  %unknownCipherData,
@@ -1538,7 +1566,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1538
1566
  # 0x23 (e) for DSC-RX10/HX60V/HX350/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-68/77M2
1539
1567
  # 0x24 (e) for ILCA-99M2,ILCE-5100/6300/6500/7M2/7RM2/7S/7SM2/QX1, DSC-HX80/HX90V/QX30/RX0/RX100M3/RX100M4/RX100M5/RX10M2/RX10M3/RX1RM2/WX500
1540
1568
  # 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99
1541
- # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7
1569
+ # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1
1570
+ # 0x31 (e) for ILCE-7SM3
1542
1571
  # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28 respectively
1543
1572
  {
1544
1573
  Name => 'Tag9400a',
@@ -1677,7 +1706,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1677
1706
  # 13 0 9 2 2 DSC-QX10/QX100/RX100M2
1678
1707
  # 15 0 35 2 2 ILCA-68/77M2, ILCE-5000/5100/6000/7/7R/7S/7M2/QX1, DSC-HX60V/HX350/HX400V/QX30/RX10/RX100M3/WX220/WX350
1679
1708
  # 16 0 85 2 2 DSC-HX80/HX90V/WX500
1680
- # 17 0 232 1 2 DSC-RX0/RX0M2/RX1RM2/RX10M2/RX10M3/RX10M4/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/HX99, ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2, ILCA-99M2
1709
+ # 17 0 232 1 2 DSC-RX0/RX0M2/RX1RM2/RX10M2/RX10M3/RX10M4/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/HX99, ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2, ILCA-99M2, ZV-1
1710
+ # 18 0 20 0 164 ILCE-7SM3
1681
1711
  # other values for Panorama images and several other models
1682
1712
  0x9404 => [{
1683
1713
  Name => 'Tag9404a',
@@ -1711,7 +1741,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1711
1741
  # 142 var (0x25 = 37 var enc.) DSC-HX80/HX90V/RX1RM2/RX10M2/RX10M3/RX100M4/WX500, ILCE-6300/7RM2/7SM2
1712
1742
  # 144 var (0xe1 = 225 var enc.) DSC-RX100M5
1713
1743
  # 145 var (0x76 = 118 var enc.) ILCA-99M2, ILCE-6500, DSC-RX0
1714
- # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99
1744
+ # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99, ZV-1
1745
+ # July 2020: ILCE-7SM3 doesn't write this tag anymore, but writes 0x9416
1715
1746
  0x9405 => [{
1716
1747
  Name => 'Tag9405a',
1717
1748
  # first byte must be 0x1b or 0x40 or 0x7d
@@ -1798,6 +1829,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1798
1829
  %unknownCipherData,
1799
1830
  # 0x02 - int32u?: 1,3,5,7,9 (A77)
1800
1831
  },
1832
+ 0x9416 => { # replaces 0x9405 for the Sony ILCE-7SM3, from July 2020
1833
+ Name => 'Sony_0x9416',
1834
+ SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9416' },
1835
+ },
1801
1836
  0xb000 => { #8
1802
1837
  Name => 'FileFormat',
1803
1838
  Writable => 'int8u',
@@ -1820,6 +1855,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1820
1855
  '3 3 2 0' => 'ARW 2.3.2', #JR (DSC-RX1RM2,ILCE-7SM2 - support for uncompressed 14-bit RAW)
1821
1856
  '3 3 3 0' => 'ARW 2.3.3', #JR (ILCE-9)
1822
1857
  '3 3 5 0' => 'ARW 2.3.5', #JR (DSC-HX99)
1858
+ '4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
1823
1859
  # what about cRAW images?
1824
1860
  },
1825
1861
  },
@@ -1913,10 +1949,13 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1913
1949
  376 => 'ILCE-9M2', #JR
1914
1950
  378 => 'ILCE-6600', #IB/JR
1915
1951
  379 => 'ILCE-6100', #IB/JR
1952
+ 380 => 'ZV-1', #JR
1953
+ 381 => 'ILCE-7C', #JR
1954
+ 383 => 'ILCE-7SM3',
1916
1955
  },
1917
1956
  },
1918
1957
  0xb020 => { #2
1919
- Name => 'CreativeStyle',
1958
+ Name => 'CreativeStyle', # (called CreativeLook by the 7SM3, ref JR)
1920
1959
  Writable => 'string',
1921
1960
  # (all of these values have been observed, ref JR and PH)
1922
1961
  # - this PrintConv is included to make these strings consistent with
@@ -1940,6 +1979,18 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1940
1979
  Light => 'Light',
1941
1980
  Autumnleaves=> 'Autumn Leaves',
1942
1981
  Sepia => 'Sepia',
1982
+ # new for the ILCE-7SM3 (ref JR)
1983
+ ST => 'Standard',
1984
+ PT => 'Portrait',
1985
+ NT => 'Neutral', # (NC)
1986
+ VV => 'Vivid', # (NC)
1987
+ VV2 => 'Vivid 2', # (NC)
1988
+ FL => 'FL', # "moody finish with sharp contrast and calm coloring as well as the impressive sky and colors of the greens"
1989
+ IN => 'IN', # "matte textures by suppressing the contrast and saturation"
1990
+ SH => 'SH', # "bright, transparent, soft, and vivid mood"
1991
+ BW => 'B&W',
1992
+ SE => 'Sepia',
1993
+ # (...also Custom Look 1-6, but don't konw the values)
1943
1994
  },
1944
1995
  },
1945
1996
  0xb021 => { #2
@@ -6021,6 +6072,7 @@ my %pictureProfile2010 = (
6021
6072
  my %isoSetting2010 = (
6022
6073
  0 => 'Auto',
6023
6074
  5 => 25,
6075
+ 7 => 40,
6024
6076
  8 => 50,
6025
6077
  9 => 64,
6026
6078
  10 => 80,
@@ -6049,12 +6101,17 @@ my %isoSetting2010 = (
6049
6101
  33 => 16000,
6050
6102
  34 => 20000,
6051
6103
  35 => 25600,
6104
+ 36 => 32000,
6105
+ 37 => 40000,
6052
6106
  38 => 51200,
6053
6107
  39 => 64000,
6108
+ 40 => 80000,
6054
6109
  41 => 102400,
6055
6110
  42 => 128000,
6056
6111
  43 => 160000,
6057
6112
  44 => 204800,
6113
+ 45 => 256000,
6114
+ 46 => 320000,
6058
6115
  47 => 409600,
6059
6116
  );
6060
6117
 
@@ -6812,7 +6869,7 @@ my %isoSetting2010 = (
6812
6869
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
6813
6870
  FORMAT => 'int8u',
6814
6871
  NOTES => q{
6815
- Valid for ILCE-6100/6400/6600/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/
6872
+ Valid for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/
6816
6873
  RX100M5A/RX100M7/HX99.
6817
6874
  },
6818
6875
  WRITABLE => 1,
@@ -7393,7 +7450,7 @@ my %isoSetting2010 = (
7393
7450
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7394
7451
  FORMAT => 'int8u',
7395
7452
  NOTES => q{
7396
- Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/
7453
+ Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/
7397
7454
  7SM2/9/9M2, ILCA-99M2.
7398
7455
  },
7399
7456
  WRITABLE => 1,
@@ -7482,7 +7539,7 @@ my %isoSetting2010 = (
7482
7539
  # March 2019: ILCE-9 with v5.0x firmware follows ILCE-6400 in many tags ...
7483
7540
  0x0050 => {
7484
7541
  Name => 'ShutterCount2',
7485
- Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/)',
7542
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/)',
7486
7543
  Format => 'int32u',
7487
7544
  RawConv => '$val & 0x00ffffff',
7488
7545
  },
@@ -7499,13 +7556,13 @@ my %isoSetting2010 = (
7499
7556
  # 0x0058, 0x0061: E-Mount: ShutterCount and dateTime
7500
7557
  0x0058 => { # appears not valid when flash is used ... not for ILCA-99M2
7501
7558
  Name => 'ShutterCount2',
7502
- Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9M2))/) and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
7559
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9M2))/) and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
7503
7560
  Format => 'int32u',
7504
7561
  RawConv => '$val & 0x00ffffff',
7505
7562
  },
7506
7563
  0x0061 => { # only minutes-seconds, not for ILCA-99M2, ILCE-9
7507
7564
  Name => 'SonyTimeMinSec',
7508
- Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2))/',
7565
+ Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2))/',
7509
7566
  Format => 'undef[2]',
7510
7567
  ValueConv => q{
7511
7568
  my @v = unpack('C*', $val);
@@ -7514,7 +7571,7 @@ my %isoSetting2010 = (
7514
7571
  },
7515
7572
  0x006b => {
7516
7573
  Name => 'ReleaseMode2',
7517
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7574
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7518
7575
  %releaseMode2,
7519
7576
  },
7520
7577
  0x006d => {
@@ -7524,7 +7581,7 @@ my %isoSetting2010 = (
7524
7581
  },
7525
7582
  0x0073 => {
7526
7583
  Name => 'ReleaseMode2',
7527
- Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9M2))/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
7584
+ Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9M2))/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
7528
7585
  %releaseMode2,
7529
7586
  },
7530
7587
  0x0088 => {
@@ -7603,7 +7660,7 @@ my %isoSetting2010 = (
7603
7660
  #
7604
7661
  0x019f => {
7605
7662
  Name => 'ShutterCount3',
7606
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2))\b/',
7663
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2))\b/',
7607
7664
  Format => 'int32u',
7608
7665
  RawConv => '$val == 0 ? undef : $val',
7609
7666
  },
@@ -7621,7 +7678,7 @@ my %isoSetting2010 = (
7621
7678
  },
7622
7679
  0x01eb => {
7623
7680
  Name => 'APS-CSizeCapture',
7624
- Condition => '$$self{Model} =~ /^ILCE-(7RM4|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7681
+ Condition => '$$self{Model} =~ /^ILCE-(7RM4|7C|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7625
7682
  PrintConv => {
7626
7683
  0 => 'Off',
7627
7684
  1 => 'On',
@@ -7629,7 +7686,7 @@ my %isoSetting2010 = (
7629
7686
  },
7630
7687
  0x01ed => {
7631
7688
  Name => 'LensSpecFeatures',
7632
- Condition => '$$self{Model} =~ /^ILCE-(7RM4|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7689
+ Condition => '$$self{Model} =~ /^ILCE-(7RM4|7C|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7633
7690
  Priority => 0,
7634
7691
  Format => 'undef[2]',
7635
7692
  ValueConv => 'join " ", unpack "H2H2", $val',
@@ -7725,6 +7782,107 @@ my %isoSetting2010 = (
7725
7782
  },
7726
7783
  );
7727
7784
 
7785
+ %Image::ExifTool::Sony::Tag9050c = ( #JR
7786
+ PROCESS_PROC => \&ProcessEnciphered,
7787
+ WRITE_PROC => \&WriteEnciphered,
7788
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7789
+ FORMAT => 'int8u',
7790
+ NOTES => q{
7791
+ Valid from July 2020 for ILCE-7SM3.
7792
+ },
7793
+ WRITABLE => 1,
7794
+ FIRST_ENTRY => 0,
7795
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7796
+ DATAMEMBER => [ 0x0039 ],
7797
+ 0x0026 => {
7798
+ Name => 'Shutter',
7799
+ Format => 'int16u[3]',
7800
+ PrintConv => {
7801
+ '0 0 0' => 'Silent / Electronic (0 0 0)',
7802
+ OTHER => sub {
7803
+ my ($val, $inv) = @_;
7804
+ return $inv ? ($val=~/\((.*?)\)/ ? $1 : undef) : "Mechanical ($val)";
7805
+ },
7806
+ },
7807
+ },
7808
+ 0x0039 => {
7809
+ Name => 'FlashStatus',
7810
+ RawConv => '$$self{FlashFired} = $val',
7811
+ PrintConv => {
7812
+ 0 => 'No Flash present',
7813
+ 2 => 'Flash Inhibited', # seen for ILCE-7/7R continuous, panorama, HDR mode
7814
+ 64 => 'Built-in Flash present',
7815
+ 65 => 'Built-in Flash Fired',
7816
+ 66 => 'Built-in Flash Inhibited', # seen for panorama, HDR, burst mode
7817
+ 128 => 'External Flash present', # seen for NEX-5N/5T
7818
+ 129 => 'External Flash Fired', # seen for SLT-A99V, ILCE-7R, NEX-5N/5R
7819
+ },
7820
+ },
7821
+ 0x003a => {
7822
+ Name => 'ShutterCount',
7823
+ # or "ShutterCount"? : number of shutter actuations, does not increase during Silent Shooting,
7824
+ # at least for ILCE-7RM2
7825
+ Format => 'int32u',
7826
+ Notes => 'total number of image exposures made by the camera',
7827
+ RawConv => '$val & 0x00ffffff',
7828
+ PrintConv => 'sprintf("%6d",$val)',
7829
+ },
7830
+ 0x0046 => { # appr. same value as Exif ExposureTime, but longer in HDR-modes
7831
+ Name => 'SonyExposureTime',
7832
+ Format => 'int16u',
7833
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
7834
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
7835
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
7836
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
7837
+ },
7838
+ 0x0048 => {
7839
+ Name => 'SonyFNumber',
7840
+ Format => 'int16u',
7841
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
7842
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
7843
+ PrintConv => 'sprintf("%.1f",$val)',
7844
+ PrintConvInv => '$val',
7845
+ },
7846
+ 0x004b => {
7847
+ Name => 'ReleaseMode2',
7848
+ %releaseMode2,
7849
+ },
7850
+ 0x0050 => {
7851
+ Name => 'ShutterCount2',
7852
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-7SM3)/)',
7853
+ Format => 'int32u',
7854
+ RawConv => '$val & 0x00ffffff',
7855
+ },
7856
+ 0x0066 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7857
+ Name => 'SonyExposureTime',
7858
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7859
+ Format => 'int16u',
7860
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
7861
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
7862
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
7863
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
7864
+ },
7865
+ 0x0068 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7866
+ Name => 'SonyFNumber',
7867
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7868
+ Format => 'int16u',
7869
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
7870
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
7871
+ PrintConv => 'sprintf("%.1f",$val)',
7872
+ PrintConvInv => '$val',
7873
+ },
7874
+ 0x006b => {
7875
+ Name => 'ReleaseMode2',
7876
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7877
+ %releaseMode2,
7878
+ },
7879
+ 0x0088 => {
7880
+ Name => 'InternalSerialNumber', #(NC)
7881
+ Format => 'int8u[6]',
7882
+ PrintConv => 'unpack "H*", pack "C*", split " ", $val',
7883
+ },
7884
+ );
7885
+
7728
7886
  %Image::ExifTool::Sony::Tag9400a = ( #JR
7729
7887
  PROCESS_PROC => \&ProcessEnciphered,
7730
7888
  WRITE_PROC => \&WriteEnciphered,
@@ -7894,17 +8052,18 @@ my %isoSetting2010 = (
7894
8052
  NOTES => q{
7895
8053
  Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/
7896
8054
  RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/
7897
- WX350/WX500, ILCE-7/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2/5000/5100/6000/
7898
- 6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2.
8055
+ WX350/WX500, ILCE-7/7C/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2/5000/5100/
8056
+ 6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2.
7899
8057
  },
7900
8058
  FIRST_ENTRY => 0,
7901
8059
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7902
8060
  0x0009 => { %releaseMode2 },
7903
8061
  0x000a => [{
7904
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))\b/',
8062
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)|ZV-1)\b/',
7905
8063
  Name => 'ShotNumberSincePowerUp',
7906
8064
  Format => 'int8u',
7907
8065
  },{
8066
+ Condition => '$$self{Model} !~ /^(ILCE-7C)\b/',
7908
8067
  Name => 'ShotNumberSincePowerUp',
7909
8068
  Format => 'int32u',
7910
8069
  }],
@@ -7981,11 +8140,12 @@ my %isoSetting2010 = (
7981
8140
  FIRST_ENTRY => 0,
7982
8141
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7983
8142
  DATAMEMBER => [ 0 ],
7984
- IS_SUBDIR => [ 0x0498, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8143
+ IS_SUBDIR => [ 0x0498, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
7985
8144
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
7986
8145
 
7987
8146
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7988
- 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8147
+ 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 160', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8148
+ 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7989
8149
  0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7990
8150
  0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7991
8151
  0x0636 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(73|74)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -8056,6 +8216,7 @@ my %isoSetting2010 = (
8056
8216
  14 => 'Tracking',
8057
8217
  15 => 'Face Tracking',
8058
8218
  20 => 'Animal Eye Tracking',
8219
+ # 21 => '???', # (ILCE-7SM3)
8059
8220
  255 => 'Manual',
8060
8221
  },
8061
8222
  },
@@ -8327,7 +8488,7 @@ my %isoSetting2010 = (
8327
8488
  # also often deviating results for Sony FE 90mm F2.8 Macro G OSS ...
8328
8489
  Name => 'SonyFNumber',
8329
8490
  Format => 'int16u',
8330
- Condition => '$$self{Model} !~ /^DSC-/',
8491
+ Condition => '$$self{Model} !~ /^(DSC-|ZV-)/',
8331
8492
  ValueConv => '2 ** (($val/256 - 16) / 2)',
8332
8493
  ValueConvInv => '(log($val)*2/log(2)+16)*256',
8333
8494
  PrintConv => 'sprintf("%.1f",$val)',
@@ -8443,7 +8604,7 @@ my %isoSetting2010 = (
8443
8604
  },
8444
8605
  0x0342 => {
8445
8606
  Name => 'LensZoomPosition',
8446
- Condition => '$$self{Model} !~ /^(ILCA-|ILCE-(7RM2|7M3|7RM3|7RM4|7SM2|6100|6300|6400|6500|6600|9|9M2)|DSC-(HX80|HX90V|HX99|RX0|RX10M2|RX10M3|RX10M4|RX100M4|RX100M5|RX100M5A|RX100M6|RX100M7|WX500))/',
8607
+ Condition => '$$self{Model} !~ /^(ILCA-|ILCE-(7RM2|7M3|7RM3|7RM4|7SM2|6100|6300|6400|6500|6600|7C|9|9M2)|DSC-(HX80|HX90V|HX99|RX0|RX10M2|RX10M3|RX10M4|RX100M4|RX100M5|RX100M5A|RX100M6|RX100M7|WX500)|ZV-)/',
8447
8608
  Format => 'int16u',
8448
8609
  PrintConv => 'sprintf("%.0f%%",$val/10.24)',
8449
8610
  PrintConvInv => '$val=~s/ ?%$//; $val * 10.24',
@@ -8455,7 +8616,7 @@ my %isoSetting2010 = (
8455
8616
  },
8456
8617
  0x034e => {
8457
8618
  Name => 'LensZoomPosition',
8458
- Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9M2))/',
8619
+ Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9M2))/',
8459
8620
  Format => 'int16u',
8460
8621
  PrintConv => 'sprintf("%.0f%%",$val/10.24)',
8461
8622
  PrintConvInv => '$val=~s/ ?%$//; $val * 10.24',
@@ -8467,7 +8628,7 @@ my %isoSetting2010 = (
8467
8628
  },
8468
8629
  0x035c => {
8469
8630
  Name => 'VignettingCorrParams',
8470
- Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7M3|7RM3|7RM4|9|9M2))/',
8631
+ Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7C|7M3|7RM3|7RM4|9|9M2))/',
8471
8632
  Format => 'int16s[16]',
8472
8633
  },
8473
8634
  0x035a => {
@@ -8504,7 +8665,7 @@ my %isoSetting2010 = (
8504
8665
  },
8505
8666
  0x03b8 => {
8506
8667
  Name => 'ChromaticAberrationCorrParams',
8507
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2))/',
8668
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2))/',
8508
8669
  Format => 'int16s[32]',
8509
8670
  },
8510
8671
  );
@@ -8739,7 +8900,8 @@ my %isoSetting2010 = (
8739
8900
  # 1 1 3 0 for ILCA-68/77M2/99M2
8740
8901
  # 0 0 0 0 for NEX and ILCE-3000/3500, also seen for SLT/ILCA with non-AF lens
8741
8902
  # 1 0 0 0 for ILCE-5000/5100/6000/7/7M2/7R/7S/QX1
8742
- # 6 0 0 0 for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2
8903
+ # 6 0 0 0 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2
8904
+ # 9 . . . for ILCE-7SM3
8743
8905
  # 0 2 0 0 for NEX/ILCE with LA-EA2/EA4 Phase-AF adapter
8744
8906
  # 2 0 0 0 seen for a few NEX-5N images
8745
8907
  # 2 2 0 0 seen for a few NEX-5N/7 images with LA-EA2 adapter
@@ -9243,6 +9405,146 @@ my %isoSetting2010 = (
9243
9405
  0xbc => { Name => 'AFStatus_94_E6_Center_F2-8', %Image::ExifTool::Minolta::afStatusInfo },
9244
9406
  );
9245
9407
 
9408
+ # tag 0x9416 decoding (ref JR)
9409
+ %Image::ExifTool::Sony::Tag9416 = (
9410
+ PROCESS_PROC => \&ProcessEnciphered,
9411
+ WRITE_PROC => \&WriteEnciphered,
9412
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9413
+ FORMAT => 'int8u',
9414
+ NOTES => 'Valid for the ILCE-7SM3.',
9415
+ FIRST_ENTRY => 0,
9416
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9417
+ 0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
9418
+ 0x0004 => {
9419
+ Name => 'SonyISO',
9420
+ Format => 'int16u',
9421
+ ValueConv => '100 * 2**(16 - $val/256)',
9422
+ ValueConvInv => '256 * (16 - log($val/100)/log(2))',
9423
+ PrintConv => 'sprintf("%.0f",$val)',
9424
+ PrintConvInv => '$val',
9425
+ },
9426
+ 0x0006 => { %gain2010 },
9427
+ 0x000a => { # appr. same value as Exif ExposureTime, but shorter in HDR-modes
9428
+ Name => 'SonyExposureTime2',
9429
+ Format => 'int16u',
9430
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
9431
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
9432
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
9433
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
9434
+ },
9435
+ 0x000c => {
9436
+ Name => 'ExposureTime',
9437
+ Format => 'rational32u',
9438
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', # (Bulb NC)
9439
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : $val',
9440
+ },
9441
+ 0x0010 => { # but sometimes deviating results
9442
+ Name => 'SonyFNumber2',
9443
+ Format => 'int16u',
9444
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
9445
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
9446
+ PrintConv => 'sprintf("%.1f",$val)',
9447
+ PrintConvInv => '$val',
9448
+ },
9449
+ 0x0012 => {
9450
+ Name => 'SonyMaxApertureValue', # (at current focal length)
9451
+ Format => 'int16u',
9452
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
9453
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
9454
+ PrintConv => 'sprintf("%.1f",$val)',
9455
+ PrintConvInv => '$val',
9456
+ },
9457
+ 0x001d => { %sequenceImageNumber },
9458
+ 0x0035 => {
9459
+ Name => 'ExposureProgram',
9460
+ Priority => 0,
9461
+ SeparateTable => 'ExposureProgram3',
9462
+ PrintConv => \%sonyExposureProgram3,
9463
+ },
9464
+ 0x0048 => {
9465
+ Name => 'LensMount',
9466
+ Condition => '$$self{Model} !~ /^(DSC-)/',
9467
+ PrintConv => {
9468
+ 0 => 'Unknown',
9469
+ 1 => 'A-mount',
9470
+ 2 => 'E-mount',
9471
+ 3 => 'A-mount (3)',
9472
+ },
9473
+ },
9474
+ 0x0049 => {
9475
+ Name => 'LensFormat',
9476
+ Condition => '$$self{Model} !~ /^(DSC-)/',
9477
+ PrintConv => {
9478
+ 0 => 'Unknown',
9479
+ 1 => 'APS-C',
9480
+ 2 => 'Full-frame',
9481
+ },
9482
+ },
9483
+ 0x004a => {
9484
+ Name => 'LensMount',
9485
+ DataMember => 'LensMount',
9486
+ RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^(DSC-)/ ? undef : $val',
9487
+ PrintConv => {
9488
+ 0 => 'Unknown',
9489
+ 1 => 'A-mount',
9490
+ 2 => 'E-mount',
9491
+ },
9492
+ },
9493
+ 0x004b => {
9494
+ Name => 'LensType2',
9495
+ Condition => '$$self{LensMount} == 2',
9496
+ Format => 'int16u',
9497
+ SeparateTable => 'LensType2',
9498
+ PrintConv => \%sonyLensTypes2,
9499
+ },
9500
+ 0x004d => {
9501
+ Name => 'LensType',
9502
+ Condition => '$$self{LensMount} == 1',
9503
+ Priority => 0, #PH (just to be safe)
9504
+ Format => 'int16u', #PH
9505
+ SeparateTable => 1,
9506
+ ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)',
9507
+ PrintConv => \%sonyLensTypes,
9508
+ },
9509
+ 0x004f => {
9510
+ Name => 'DistortionCorrParams',
9511
+ Format => 'int16s[16]',
9512
+ },
9513
+ 0x0071 => {
9514
+ Name => 'FocalLength',
9515
+ Format => 'int16u',
9516
+ ValueConv => '$val / 10',
9517
+ ValueConvInv => '$val * 10',
9518
+ PrintConv => 'sprintf("%.1f mm",$val)',
9519
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9520
+ },
9521
+ 0x0073 => {
9522
+ Name => 'MinFocalLength',
9523
+ Format => 'int16u',
9524
+ ValueConv => '$val / 10',
9525
+ ValueConvInv => '$val * 10',
9526
+ PrintConv => 'sprintf("%.1f mm",$val)',
9527
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9528
+ },
9529
+ 0x0075 => { # may give 0 for fixed focal length lenses
9530
+ Name => 'MaxFocalLength',
9531
+ Format => 'int16u',
9532
+ RawConv => '$val || undef',
9533
+ ValueConv => '$val / 10',
9534
+ ValueConvInv => '$val * 10',
9535
+ PrintConv => 'sprintf("%.1f mm",$val)',
9536
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9537
+ },
9538
+ 0x088f => {
9539
+ Name => 'VignettingCorrParams',
9540
+ Format => 'int16s[16]',
9541
+ },
9542
+ 0x0914 => {
9543
+ Name => 'ChromaticAberrationCorrParams',
9544
+ Format => 'int16s[32]',
9545
+ },
9546
+ );
9547
+
9246
9548
  %Image::ExifTool::Sony::FaceInfo1 = (
9247
9549
  %binaryDataAttrs,
9248
9550
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
@@ -9740,12 +10042,88 @@ my %isoSetting2010 = (
9740
10042
  # 0x8100 - 16 bytes starting with 0x060e2b340401
9741
10043
  0x8100 => { Name => 'Sony_rtmd_0x8100', Format => 'int8u', %hidUnk },
9742
10044
  0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1
10045
+ 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1"
9743
10046
  0x8109 => { Name => 'Sony_rtmd_0x8109', Format => 'int32u', %hidUnk }, # seen: "1 50"
9744
10047
  0x810a => { Name => 'Sony_rtmd_0x810a', Format => 'int16u', %hidUnk }, # seen: 0
9745
10048
  0x810b => { Name => 'Sony_rtmd_0x810b', Format => 'int16u', %hidUnk }, # seen: 100
9746
10049
  0x810c => { Name => 'Sony_rtmd_0x810c', Format => 'int16u', %hidUnk }, # seen: 100
9747
10050
  0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 1
10051
+ 0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100
9748
10052
  # 0x8300 - container for other tags in this format
10053
+ 0x8500 => {
10054
+ Name => 'GPSVersionID',
10055
+ Groups => { 2 => 'Location' },
10056
+ Format => 'int8u',
10057
+ PrintConv => '$val =~ tr/ /./; $val',
10058
+ },
10059
+ 0x8501 => {
10060
+ Name => 'GPSLatitudeRef',
10061
+ Groups => { 2 => 'Location' },
10062
+ Format => 'string',
10063
+ PrintConv => {
10064
+ N => 'North',
10065
+ S => 'South',
10066
+ },
10067
+ },
10068
+ 0x8502 => {
10069
+ Name => 'GPSLatitude',
10070
+ Groups => { 2 => 'Location' },
10071
+ Format => 'rational64u',
10072
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)',
10073
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
10074
+ },
10075
+ 0x8503 => {
10076
+ Name => 'GPSLongitudeRef',
10077
+ Groups => { 2 => 'Location' },
10078
+ Format => 'string',
10079
+ PrintConv => {
10080
+ E => 'East',
10081
+ W => 'West',
10082
+ },
10083
+ },
10084
+ 0x8504 => {
10085
+ Name => 'GPSLongitude',
10086
+ Groups => { 2 => 'Location' },
10087
+ Format => 'rational64u',
10088
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)',
10089
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
10090
+ },
10091
+ 0x8507 => {
10092
+ Name => 'GPSTimeStamp',
10093
+ Groups => { 2 => 'Time' },
10094
+ Format => 'rational64u',
10095
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ConvertTimeStamp($val)',
10096
+ PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)',
10097
+ },
10098
+ 0x8509 => {
10099
+ Name => 'GPSStatus',
10100
+ Groups => { 2 => 'Location' },
10101
+ Format => 'string',
10102
+ PrintConv => {
10103
+ A => 'Measurement Active',
10104
+ V => 'Measurement Void',
10105
+ },
10106
+ },
10107
+ 0x850a => {
10108
+ Name => 'GPSMeasureMode',
10109
+ Groups => { 2 => 'Location' },
10110
+ Format => 'string',
10111
+ PrintConv => {
10112
+ 2 => '2-Dimensional Measurement',
10113
+ 3 => '3-Dimensional Measurement',
10114
+ },
10115
+ },
10116
+ 0x8512 => {
10117
+ Name => 'GPSMapDatum',
10118
+ Groups => { 2 => 'Location' },
10119
+ Format => 'string',
10120
+ },
10121
+ 0x851d => {
10122
+ Name => 'GPSDateStamp',
10123
+ Groups => { 2 => 'Time' },
10124
+ Format => 'string',
10125
+ ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
10126
+ },
9749
10127
  0xe000 => { Name => 'Sony_rtmd_0xe000', Format => 'int8u', %hidUnk }, # (16 bytes)
9750
10128
  0xe300 => { Name => 'Sony_rtmd_0xe300', Format => 'int8u', %hidUnk }, # seen: 0,1
9751
10129
  0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100
@@ -9758,6 +10136,8 @@ my %isoSetting2010 = (
9758
10136
  ValueConv => 'my @a=unpack("x1H4H2H2H2H2H2",$val); "$a[0]:$a[1]:$a[2] $a[3]:$a[4]:$a[5]"',
9759
10137
  PrintConv => '$self->ConvertDateTime($val)',
9760
10138
  },
10139
+ # f010 - 2048 bytes
10140
+ # f020 - 543 bytes
9761
10141
  );
9762
10142
 
9763
10143
  # Composite Sony tags
@@ -9792,6 +10172,17 @@ my %isoSetting2010 = (
9792
10172
  },
9793
10173
  PrintConv => '$val eq "inf" ? $val : sprintf("%.2f m",$val)',
9794
10174
  },
10175
+ GPSDateTime => {
10176
+ Description => 'GPS Date/Time',
10177
+ Groups => { 2 => 'Time' },
10178
+ SubDoc => 1, # generate for all sub-documents
10179
+ Require => {
10180
+ 0 => 'Sony:GPSDateStamp',
10181
+ 1 => 'Sony:GPSTimeStamp',
10182
+ },
10183
+ ValueConv => '"$val[0] $val[1]Z"',
10184
+ PrintConv => '$self->ConvertDateTime($val)',
10185
+ },
9795
10186
  );
9796
10187
 
9797
10188
  # add our composite tags