exiftool_vendored 11.99.0 → 12.11.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +201 -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 +172 -99
  8. data/bin/lib/Image/ExifTool.pm +170 -117
  9. data/bin/lib/Image/ExifTool.pod +132 -97
  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 +21 -10
  13. data/bin/lib/Image/ExifTool/Canon.pm +202 -13
  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 +22 -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 +6 -1
  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 +48 -22
  24. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  25. data/bin/lib/Image/ExifTool/ID3.pm +86 -12
  26. data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
  27. data/bin/lib/Image/ExifTool/Import.pm +12 -9
  28. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  29. data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
  30. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  31. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  32. data/bin/lib/Image/ExifTool/MPF.pm +2 -2
  33. data/bin/lib/Image/ExifTool/MacOS.pm +154 -38
  34. data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
  35. data/bin/lib/Image/ExifTool/Minolta.pm +7 -2
  36. data/bin/lib/Image/ExifTool/Nikon.pm +143 -17
  37. data/bin/lib/Image/ExifTool/Olympus.pm +40 -17
  38. data/bin/lib/Image/ExifTool/PNG.pm +14 -3
  39. data/bin/lib/Image/ExifTool/PPM.pm +5 -5
  40. data/bin/lib/Image/ExifTool/Panasonic.pm +148 -14
  41. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +34 -0
  42. data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
  43. data/bin/lib/Image/ExifTool/Pentax.pm +11 -3
  44. data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
  45. data/bin/lib/Image/ExifTool/QuickTime.pm +240 -37
  46. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +419 -60
  47. data/bin/lib/Image/ExifTool/README +25 -21
  48. data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
  49. data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
  50. data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
  51. data/bin/lib/Image/ExifTool/Shift.pl +1 -0
  52. data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
  53. data/bin/lib/Image/ExifTool/Sony.pm +423 -39
  54. data/bin/lib/Image/ExifTool/Stim.pm +2 -2
  55. data/bin/lib/Image/ExifTool/TagLookup.pm +5798 -5675
  56. data/bin/lib/Image/ExifTool/TagNames.pod +575 -100
  57. data/bin/lib/Image/ExifTool/Validate.pm +4 -4
  58. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -0
  59. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +30 -21
  60. data/bin/lib/Image/ExifTool/Writer.pl +49 -24
  61. data/bin/lib/Image/ExifTool/XMP.pm +99 -17
  62. data/bin/lib/Image/ExifTool/XMP2.pl +1 -0
  63. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  64. data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
  65. data/bin/perl-Image-ExifTool.spec +42 -41
  66. data/lib/exiftool_vendored/version.rb +1 -1
  67. metadata +9 -8
@@ -387,8 +387,11 @@ numerical, and generated automatically otherwise.
387
387
  'Flattened' - [reserved] used internally to mark Struct tags
388
388
  which have been processed to generate flattened equivalents.
389
389
 
390
- 'GotGroups' - [reserved] flag used internally to indicate that
391
- the Groups hash has been initialized for this tag.
390
+ 'NotFlat' - [XMP tags only] Flag indicates that this tag ID
391
+ does not represent a flattened tag. Used to avoid a conflict
392
+ if the tag ID would be the same as a generated ID for a
393
+ flattened tag. The result is that the flattened tag will not
394
+ be accessible.
392
395
 
393
396
  'Hidden' - set to hide tag from the TagName documentation.
394
397
  Also suppresses verbose output of a BinaryData tag.
@@ -763,25 +766,26 @@ numerical, and generated automatically otherwise.
763
766
  conditionally deleted.
764
767
 
765
768
  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).
769
+ is set to zero), and for EXIF and QuickTime tables gives
770
+ format for writing. Writable may be set to 1 for MakerNotes
771
+ information because the existing format is always used,
772
+ however providing a format is desirable because it is used in
773
+ validating the value. Set to 2 for tag to show "yes" in the
774
+ Writable column of the tag name documentation even when there
775
+ is no WRITE_PROC defined (eg. if it is written via an Extra
776
+ tag). For EXIF and QuickTime tables, the Writable flag may be
777
+ different than the Format flag, in which case Format is used
778
+ for converting the binary value and Writable specifies the
779
+ format code written to the EXIF IFD. For SubDirectories in
780
+ EXIF information, this flag is only defined if the
781
+ SubDirectory is writable as a block, or if the SubDirectory
782
+ can not be edited (in which case Writable is set to 0). If
783
+ non-zero, the SubDirectory is also extracted as a block, so
784
+ the Binary and Protected flags should usually set as well.
785
+ There is currently no way to specify a write format for a
786
+ SubDirectory that is not writable as a block (the default is
787
+ 'int32u' for IFD-type SubDirectories, and 'undef' for all
788
+ others).
785
789
 
786
790
  WriteAlso : Used for writable tag to specify other tags to write when this
787
791
  tag is written. The value is a hash reference. The hash keys
@@ -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.01';
18
+ $VERSION = '1.02';
19
19
 
20
20
  # Radiance tags
21
21
  %Image::ExifTool::Radiance::Main = (
@@ -42,6 +42,7 @@ $VERSION = '1.01';
42
42
  },
43
43
  },
44
44
  _command => 'Command',
45
+ _comment => 'Comment',
45
46
  software => 'Software',
46
47
  view => 'View',
47
48
  'format' => 'Format', # <-- this is the one that caused the conflict when uppercase
@@ -74,8 +75,12 @@ sub ProcessHDR($$)
74
75
  while ($raf->ReadLine($buff)) {
75
76
  chomp $buff;
76
77
  last unless length($buff) > 0 and length($buff) < 4096;
78
+ if ($buff =~ s/^#\s*//) {
79
+ $et->HandleTag($tagTablePtr, '_comment', $buff) if length $buff;
80
+ next;
81
+ }
77
82
  unless ($buff =~ /^(.*)?\s*=\s*(.*)/) {
78
- $et->HandleTag($tagTablePtr, '_command', $buff);
83
+ $et->HandleTag($tagTablePtr, '_command', $buff) if length $buff;
79
84
  next;
80
85
  }
81
86
  # use lower-case tag names to avoid conflicts with reserved tag table entries
@@ -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.24';
37
+ $VERSION = '3.32';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -73,6 +73,7 @@ sub PrintInvLensSpec($;$$);
73
73
  2 => 'Sony LA-EA2 Adapter',
74
74
  3 => 'Sony LA-EA3 Adapter', #(NC) ILCE-7 image with A-mount lens, but also has 0x940e 2nd byte=2
75
75
  6 => 'Sony LA-EA4 Adapter', #(NC) ILCE-7R image with A-mount lens and having phase-detect info blocks in 0x940e AFInfo
76
+ 7 => 'Sony LA-EA5 Adapter', #JR
76
77
  # 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB)
77
78
  44 => 'Metabones Canon EF Smart Adapter', #JR
78
79
  78 => 'Metabones Canon EF Smart Adapter Mark III or Other Adapter', #PH/JR (also Mark IV, Fotodiox and Viltrox)
@@ -143,6 +144,8 @@ sub PrintInvLensSpec($;$$);
143
144
  32854 => 'Sony E 70-350mm F4.5-6.3 G OSS', #IB/JR
144
145
  32858 => 'Sony FE 35mm F1.8', #JR/IB
145
146
  32859 => 'Sony FE 20mm F1.8 G', #IB/JR
147
+ 32860 => 'Sony FE 12-24mm F2.8 GM', #JR/IB
148
+ 32864 => 'Sony FE 28-60mm F4-5.6', #JR
146
149
 
147
150
  # (comment this out so LensID will report the LensModel, which is more useful)
148
151
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -180,7 +183,9 @@ sub PrintInvLensSpec($;$$);
180
183
  49460 => 'Tamron 24mm F2.8 Di III OSD M1:2', #JR (Model F051)
181
184
  49461 => 'Tamron 20mm F2.8 Di III OSD M1:2', #JR (Model F050)
182
185
  49462 => 'Tamron 70-180mm F2.8 Di III VXD', #JR (Model A056)
183
-
186
+ 49463 => 'Tamron 28-200mm F2.8-5.6 Di III RXD', #JR (Model A071)
187
+ 49464 => 'Tamron 70-300mm F4.5-6.3 Di III RXD', #JR (Model A047)
188
+ 49473 => 'Tokina atx-m 85mm F1.8 FE', #JR
184
189
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
185
190
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
186
191
 
@@ -209,6 +214,9 @@ sub PrintInvLensSpec($;$$);
209
214
  50515 => 'Sigma 35mm F1.2 DG DN | A', #IB/JR (019)
210
215
  50516 => 'Sigma 14-24mm F2.8 DG DN | A', #IB/JR (019)
211
216
  50517 => 'Sigma 24-70mm F2.8 DG DN | A', #JR (019)
217
+ 50518 => 'Sigma 100-400mm F5-6.3 DG DN OS | C', #JR (020)
218
+ 50521 => 'Sigma 85mm F1.4 DG DN | A', #JR (020)
219
+ 50522 => 'Sigma 105mm F2.8 DG DN MACRO | A', #JR (020)
212
220
 
213
221
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
214
222
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
@@ -221,6 +229,7 @@ sub PrintInvLensSpec($;$$);
221
229
  51000 => 'Voigtlander NOKTON 50mm F1.2 Aspherical', #JR
222
230
  51001 => 'Voigtlander NOKTON 21mm F1.4 Aspherical', #JR
223
231
  51002 => 'Voigtlander APO-LANTHAR 50mm F2 Aspherical', #JR
232
+ 51003 => 'Voigtlander NOKTON 35mm F1.2 Aspherical SE', #JR
224
233
 
225
234
  # lenses listed in the Sigma MC-11 list, but not yet seen:
226
235
  # 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014)
@@ -233,7 +242,8 @@ sub PrintInvLensSpec($;$$);
233
242
  51505.1 => 'Samyang AF 35mm F2.8', #PH (also 32794)
234
243
  51507 => 'Samyang AF 35mm F1.4', #IB
235
244
  51508 => 'Samyang AF 45mm F1.8',
236
- 51510 => 'Samyang AF 18mm F2.8', #JR
245
+ 51510 => 'Samyang AF 18mm F2.8 or Samyang AF 35mm F1.8', #JR
246
+ 51510.1 => 'Samyang AF 35mm F1.8', #JR
237
247
  51512 => 'Samyang AF 75mm F1.8', #IB/JR
238
248
  );
239
249
 
@@ -954,7 +964,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
954
964
  # unknown offsets or values for DSC-HX60V/HX350/HX400V/QX10/QX30/QX100/RX10/RX100M2/RX100M3/WX220/WX350,
955
965
  # ILCA-68/77M2, ILCE-5000/5100/6000/7/7M2/7R/7S/QX1, Stellar2, Lusso
956
966
  # unknown offsets or values for DSC-HX80/HX90V/RX0/RX1RM2/RX10M2/RX10M3/RX100M4/RX100M5/WX500, ILCE-6300/6500/7RM2/7SM2, ILCA-99M2
957
- # unknown offsets or values for ILCE-6100/6400/6600/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99
967
+ # unknown offsets or values for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99
968
+ # July 2020: ILCE-7SM3 doesn't write this tag anymore
958
969
  {
959
970
  Name => 'Tag2010a', # ad
960
971
  Condition => '$$self{Model} =~ /^NEX-5N$/',
@@ -995,7 +1006,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
995
1006
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
996
1007
  },{
997
1008
  Name => 'Tag2010i', # ?
998
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2))\b/',
1009
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-1)\b/',
999
1010
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
1000
1011
  },{
1001
1012
  Name => 'Tag_0x2010',
@@ -1380,6 +1391,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1380
1391
  '1 0' => 'Off',
1381
1392
  '1 1' => 'Standard',
1382
1393
  '1 2' => 'High',
1394
+ '65535 65535' => 'n/a', # ILCE-7SM3
1383
1395
  },
1384
1396
  },
1385
1397
  0x2029 => { # uncompressed 14-bit RAW file type setting introduced 2015
@@ -1388,6 +1400,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1388
1400
  PrintConv => {
1389
1401
  0 => 'Compressed RAW',
1390
1402
  1 => 'Uncompressed RAW',
1403
+ 65535 => 'n/a', # seen for ILCE-7SM3 JPEG-only
1391
1404
  },
1392
1405
  },
1393
1406
  # 0x202a - first seen for ILCE-6300: 66 bytes
@@ -1423,7 +1436,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1423
1436
  },
1424
1437
  },
1425
1438
  0x202d => { #JR first seen for ILCA-99M2, ILCE-6500, DSC-RX100M5
1426
- Name => 'ExposureStandardAdjustment', # (NC)
1439
+ Name => 'ExposureStandardAdjustment',
1427
1440
  Writable => 'rational64s',
1428
1441
  PrintConv => '$val ? sprintf("%+.1f",$val) : 0',
1429
1442
  PrintConvInv => '$val',
@@ -1486,6 +1499,13 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1486
1499
  PrintConv => 'sprintf("%.8d",$val)',
1487
1500
  PrintConvInv => '$val',
1488
1501
  },
1502
+ # 0x2032 - first seen for ILCE-7SM3, July 2020
1503
+ # 0x2033 - first seen for ILCE-7SM3, July 2020
1504
+ # 0x2034 - first seen for ILCE-7SM3, July 2020
1505
+ # 0x2035 - first seen for ILCE-7SM3, July 2020
1506
+ # 0x2036 - first seen for ILCE-7SM3, July 2020
1507
+ # 0x2037 - first seen for ILCE-7SM3, July 2020
1508
+ # 0x2039 - first seen for ILCE-7SM3, July 2020
1489
1509
  0x3000 => {
1490
1510
  Name => 'ShotInfo',
1491
1511
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -1514,18 +1534,25 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1514
1534
  # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets
1515
1535
  {
1516
1536
  Name => 'Tag9050a',
1517
- Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|9|9M2)|ILCA-99M2)/',
1537
+ Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3|7RM4|7SM2|7SM3|9|9M2)|ILCA-99M2|ZV-)/',
1518
1538
  SubDirectory => {
1519
1539
  TagTable => 'Image::ExifTool::Sony::Tag9050a',
1520
1540
  ByteOrder => 'LittleEndian',
1521
1541
  },
1522
1542
  },{
1523
1543
  Name => 'Tag9050b',
1524
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|9|9M2)|ILCA-99M2)/',
1544
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7C|7M3|7RM2|7RM3|7RM4|7SM2|9|9M2)|ILCA-99M2)/',
1525
1545
  SubDirectory => {
1526
1546
  TagTable => 'Image::ExifTool::Sony::Tag9050b',
1527
1547
  ByteOrder => 'LittleEndian',
1528
1548
  },
1549
+ },{
1550
+ Name => 'Tag9050c',
1551
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
1552
+ SubDirectory => {
1553
+ TagTable => 'Image::ExifTool::Sony::Tag9050c',
1554
+ ByteOrder => 'LittleEndian',
1555
+ },
1529
1556
  },{
1530
1557
  Name => 'Sony_0x9050',
1531
1558
  %unknownCipherData,
@@ -1540,7 +1567,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1540
1567
  # 0x23 (e) for DSC-RX10/HX60V/HX350/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-68/77M2
1541
1568
  # 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
1542
1569
  # 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99
1543
- # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7
1570
+ # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1
1571
+ # 0x31 (e) for ILCE-7SM3
1544
1572
  # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28 respectively
1545
1573
  {
1546
1574
  Name => 'Tag9400a',
@@ -1555,7 +1583,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1555
1583
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400b' },
1556
1584
  },{
1557
1585
  Name => 'Tag9400c',
1558
- Condition => '$$valPt =~ /^[\x23\x24\x26\x28]/',
1586
+ Condition => '$$valPt =~ /^[\x23\x24\x26\x28\x31]/',
1559
1587
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9400c' },
1560
1588
  },{
1561
1589
  Name => 'Sony_0x9400',
@@ -1679,7 +1707,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1679
1707
  # 13 0 9 2 2 DSC-QX10/QX100/RX100M2
1680
1708
  # 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
1681
1709
  # 16 0 85 2 2 DSC-HX80/HX90V/WX500
1682
- # 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
1710
+ # 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
1711
+ # 18 0 20 0 164 ILCE-7SM3
1683
1712
  # other values for Panorama images and several other models
1684
1713
  0x9404 => [{
1685
1714
  Name => 'Tag9404a',
@@ -1713,7 +1742,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1713
1742
  # 142 var (0x25 = 37 var enc.) DSC-HX80/HX90V/RX1RM2/RX10M2/RX10M3/RX100M4/WX500, ILCE-6300/7RM2/7SM2
1714
1743
  # 144 var (0xe1 = 225 var enc.) DSC-RX100M5
1715
1744
  # 145 var (0x76 = 118 var enc.) ILCA-99M2, ILCE-6500, DSC-RX0
1716
- # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99
1745
+ # 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
1746
+ # July 2020: ILCE-7SM3 doesn't write this tag anymore, but writes 0x9416
1717
1747
  0x9405 => [{
1718
1748
  Name => 'Tag9405a',
1719
1749
  # first byte must be 0x1b or 0x40 or 0x7d
@@ -1800,6 +1830,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1800
1830
  %unknownCipherData,
1801
1831
  # 0x02 - int32u?: 1,3,5,7,9 (A77)
1802
1832
  },
1833
+ 0x9416 => { # replaces 0x9405 for the Sony ILCE-7SM3, from July 2020
1834
+ Name => 'Sony_0x9416',
1835
+ SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9416' },
1836
+ },
1803
1837
  0xb000 => { #8
1804
1838
  Name => 'FileFormat',
1805
1839
  Writable => 'int8u',
@@ -1822,6 +1856,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1822
1856
  '3 3 2 0' => 'ARW 2.3.2', #JR (DSC-RX1RM2,ILCE-7SM2 - support for uncompressed 14-bit RAW)
1823
1857
  '3 3 3 0' => 'ARW 2.3.3', #JR (ILCE-9)
1824
1858
  '3 3 5 0' => 'ARW 2.3.5', #JR (DSC-HX99)
1859
+ '4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
1825
1860
  # what about cRAW images?
1826
1861
  },
1827
1862
  },
@@ -1915,10 +1950,13 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1915
1950
  376 => 'ILCE-9M2', #JR
1916
1951
  378 => 'ILCE-6600', #IB/JR
1917
1952
  379 => 'ILCE-6100', #IB/JR
1953
+ 380 => 'ZV-1', #JR
1954
+ 381 => 'ILCE-7C', #JR
1955
+ 383 => 'ILCE-7SM3',
1918
1956
  },
1919
1957
  },
1920
1958
  0xb020 => { #2
1921
- Name => 'CreativeStyle',
1959
+ Name => 'CreativeStyle', # (called CreativeLook by the 7SM3, ref JR)
1922
1960
  Writable => 'string',
1923
1961
  # (all of these values have been observed, ref JR and PH)
1924
1962
  # - this PrintConv is included to make these strings consistent with
@@ -1942,6 +1980,12 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1942
1980
  Light => 'Light',
1943
1981
  Autumnleaves=> 'Autumn Leaves',
1944
1982
  Sepia => 'Sepia',
1983
+ # new for the ILCE-7SM3 (ref JR)
1984
+ VV2 => 'Vivid 2', # (NC)
1985
+ FL => 'FL', # "moody finish with sharp contrast and calm coloring as well as the impressive sky and colors of the greens"
1986
+ IN => 'IN', # "matte textures by suppressing the contrast and saturation"
1987
+ SH => 'SH', # "bright, transparent, soft, and vivid mood"
1988
+ # (...also Custom Look 1-6, but don't konw the values)
1945
1989
  },
1946
1990
  },
1947
1991
  0xb021 => { #2
@@ -6023,6 +6067,7 @@ my %pictureProfile2010 = (
6023
6067
  my %isoSetting2010 = (
6024
6068
  0 => 'Auto',
6025
6069
  5 => 25,
6070
+ 7 => 40,
6026
6071
  8 => 50,
6027
6072
  9 => 64,
6028
6073
  10 => 80,
@@ -6051,12 +6096,17 @@ my %isoSetting2010 = (
6051
6096
  33 => 16000,
6052
6097
  34 => 20000,
6053
6098
  35 => 25600,
6099
+ 36 => 32000,
6100
+ 37 => 40000,
6054
6101
  38 => 51200,
6055
6102
  39 => 64000,
6103
+ 40 => 80000,
6056
6104
  41 => 102400,
6057
6105
  42 => 128000,
6058
6106
  43 => 160000,
6059
6107
  44 => 204800,
6108
+ 45 => 256000,
6109
+ 46 => 320000,
6060
6110
  47 => 409600,
6061
6111
  );
6062
6112
 
@@ -6814,7 +6864,7 @@ my %isoSetting2010 = (
6814
6864
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
6815
6865
  FORMAT => 'int8u',
6816
6866
  NOTES => q{
6817
- Valid for ILCE-6100/6400/6600/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/
6867
+ Valid for ILCE-6100/6400/6600/7C/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M6/
6818
6868
  RX100M5A/RX100M7/HX99.
6819
6869
  },
6820
6870
  WRITABLE => 1,
@@ -7395,7 +7445,7 @@ my %isoSetting2010 = (
7395
7445
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7396
7446
  FORMAT => 'int8u',
7397
7447
  NOTES => q{
7398
- Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/
7448
+ Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/
7399
7449
  7SM2/9/9M2, ILCA-99M2.
7400
7450
  },
7401
7451
  WRITABLE => 1,
@@ -7484,7 +7534,7 @@ my %isoSetting2010 = (
7484
7534
  # March 2019: ILCE-9 with v5.0x firmware follows ILCE-6400 in many tags ...
7485
7535
  0x0050 => {
7486
7536
  Name => 'ShutterCount2',
7487
- Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/)',
7537
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/)',
7488
7538
  Format => 'int32u',
7489
7539
  RawConv => '$val & 0x00ffffff',
7490
7540
  },
@@ -7501,13 +7551,13 @@ my %isoSetting2010 = (
7501
7551
  # 0x0058, 0x0061: E-Mount: ShutterCount and dateTime
7502
7552
  0x0058 => { # appears not valid when flash is used ... not for ILCA-99M2
7503
7553
  Name => 'ShutterCount2',
7504
- 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)/',
7554
+ 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)/',
7505
7555
  Format => 'int32u',
7506
7556
  RawConv => '$val & 0x00ffffff',
7507
7557
  },
7508
7558
  0x0061 => { # only minutes-seconds, not for ILCA-99M2, ILCE-9
7509
7559
  Name => 'SonyTimeMinSec',
7510
- Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2))/',
7560
+ Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2))/',
7511
7561
  Format => 'undef[2]',
7512
7562
  ValueConv => q{
7513
7563
  my @v = unpack('C*', $val);
@@ -7516,7 +7566,7 @@ my %isoSetting2010 = (
7516
7566
  },
7517
7567
  0x006b => {
7518
7568
  Name => 'ReleaseMode2',
7519
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7569
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7RM4|9M2))/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7520
7570
  %releaseMode2,
7521
7571
  },
7522
7572
  0x006d => {
@@ -7526,7 +7576,7 @@ my %isoSetting2010 = (
7526
7576
  },
7527
7577
  0x0073 => {
7528
7578
  Name => 'ReleaseMode2',
7529
- Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9M2))/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
7579
+ Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9M2))/ and $$self{Software} !~ /^ILCE-9 (v5.0|v6.0)/',
7530
7580
  %releaseMode2,
7531
7581
  },
7532
7582
  0x0088 => {
@@ -7605,7 +7655,7 @@ my %isoSetting2010 = (
7605
7655
  #
7606
7656
  0x019f => {
7607
7657
  Name => 'ShutterCount3',
7608
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2))\b/',
7658
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2))\b/',
7609
7659
  Format => 'int32u',
7610
7660
  RawConv => '$val == 0 ? undef : $val',
7611
7661
  },
@@ -7623,7 +7673,7 @@ my %isoSetting2010 = (
7623
7673
  },
7624
7674
  0x01eb => {
7625
7675
  Name => 'APS-CSizeCapture',
7626
- Condition => '$$self{Model} =~ /^ILCE-(7RM4|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7676
+ Condition => '$$self{Model} =~ /^ILCE-(7RM4|7C|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7627
7677
  PrintConv => {
7628
7678
  0 => 'Off',
7629
7679
  1 => 'On',
@@ -7631,7 +7681,7 @@ my %isoSetting2010 = (
7631
7681
  },
7632
7682
  0x01ed => {
7633
7683
  Name => 'LensSpecFeatures',
7634
- Condition => '$$self{Model} =~ /^ILCE-(7RM4|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7684
+ Condition => '$$self{Model} =~ /^ILCE-(7RM4|7C|9M2)/ or $$self{Software} =~ /^ILCE-9 (v5.0|v6.0)/',
7635
7685
  Priority => 0,
7636
7686
  Format => 'undef[2]',
7637
7687
  ValueConv => 'join " ", unpack "H2H2", $val',
@@ -7727,6 +7777,107 @@ my %isoSetting2010 = (
7727
7777
  },
7728
7778
  );
7729
7779
 
7780
+ %Image::ExifTool::Sony::Tag9050c = ( #JR
7781
+ PROCESS_PROC => \&ProcessEnciphered,
7782
+ WRITE_PROC => \&WriteEnciphered,
7783
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7784
+ FORMAT => 'int8u',
7785
+ NOTES => q{
7786
+ Valid from July 2020 for ILCE-7SM3.
7787
+ },
7788
+ WRITABLE => 1,
7789
+ FIRST_ENTRY => 0,
7790
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7791
+ DATAMEMBER => [ 0x0039 ],
7792
+ 0x0026 => {
7793
+ Name => 'Shutter',
7794
+ Format => 'int16u[3]',
7795
+ PrintConv => {
7796
+ '0 0 0' => 'Silent / Electronic (0 0 0)',
7797
+ OTHER => sub {
7798
+ my ($val, $inv) = @_;
7799
+ return $inv ? ($val=~/\((.*?)\)/ ? $1 : undef) : "Mechanical ($val)";
7800
+ },
7801
+ },
7802
+ },
7803
+ 0x0039 => {
7804
+ Name => 'FlashStatus',
7805
+ RawConv => '$$self{FlashFired} = $val',
7806
+ PrintConv => {
7807
+ 0 => 'No Flash present',
7808
+ 2 => 'Flash Inhibited', # seen for ILCE-7/7R continuous, panorama, HDR mode
7809
+ 64 => 'Built-in Flash present',
7810
+ 65 => 'Built-in Flash Fired',
7811
+ 66 => 'Built-in Flash Inhibited', # seen for panorama, HDR, burst mode
7812
+ 128 => 'External Flash present', # seen for NEX-5N/5T
7813
+ 129 => 'External Flash Fired', # seen for SLT-A99V, ILCE-7R, NEX-5N/5R
7814
+ },
7815
+ },
7816
+ 0x003a => {
7817
+ Name => 'ShutterCount',
7818
+ # or "ShutterCount"? : number of shutter actuations, does not increase during Silent Shooting,
7819
+ # at least for ILCE-7RM2
7820
+ Format => 'int32u',
7821
+ Notes => 'total number of image exposures made by the camera',
7822
+ RawConv => '$val & 0x00ffffff',
7823
+ PrintConv => 'sprintf("%6d",$val)',
7824
+ },
7825
+ 0x0046 => { # appr. same value as Exif ExposureTime, but longer in HDR-modes
7826
+ Name => 'SonyExposureTime',
7827
+ Format => 'int16u',
7828
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
7829
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
7830
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
7831
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
7832
+ },
7833
+ 0x0048 => {
7834
+ Name => 'SonyFNumber',
7835
+ Format => 'int16u',
7836
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
7837
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
7838
+ PrintConv => 'sprintf("%.1f",$val)',
7839
+ PrintConvInv => '$val',
7840
+ },
7841
+ 0x004b => {
7842
+ Name => 'ReleaseMode2',
7843
+ %releaseMode2,
7844
+ },
7845
+ 0x0050 => {
7846
+ Name => 'ShutterCount2',
7847
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-7SM3)/)',
7848
+ Format => 'int32u',
7849
+ RawConv => '$val & 0x00ffffff',
7850
+ },
7851
+ 0x0066 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7852
+ Name => 'SonyExposureTime',
7853
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7854
+ Format => 'int16u',
7855
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
7856
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
7857
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
7858
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
7859
+ },
7860
+ 0x0068 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7861
+ Name => 'SonyFNumber',
7862
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7863
+ Format => 'int16u',
7864
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
7865
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
7866
+ PrintConv => 'sprintf("%.1f",$val)',
7867
+ PrintConvInv => '$val',
7868
+ },
7869
+ 0x006b => {
7870
+ Name => 'ReleaseMode2',
7871
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7872
+ %releaseMode2,
7873
+ },
7874
+ 0x0088 => {
7875
+ Name => 'InternalSerialNumber', #(NC)
7876
+ Format => 'int8u[6]',
7877
+ PrintConv => 'unpack "H*", pack "C*", split " ", $val',
7878
+ },
7879
+ );
7880
+
7730
7881
  %Image::ExifTool::Sony::Tag9400a = ( #JR
7731
7882
  PROCESS_PROC => \&ProcessEnciphered,
7732
7883
  WRITE_PROC => \&WriteEnciphered,
@@ -7896,20 +8047,18 @@ my %isoSetting2010 = (
7896
8047
  NOTES => q{
7897
8048
  Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/
7898
8049
  RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/
7899
- WX350/WX500, ILCE-7/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2/5000/5100/6000/
7900
- 6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2.
8050
+ WX350/WX500, ILCE-7/7C/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/7SM3/9/9M2/5000/
8051
+ 5100/6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2.
7901
8052
  },
7902
8053
  FIRST_ENTRY => 0,
7903
8054
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7904
8055
  0x0009 => { %releaseMode2 },
7905
- 0x000a => [{
7906
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))\b/',
7907
- Name => 'ShotNumberSincePowerUp',
7908
- Format => 'int8u',
7909
- },{
8056
+ 0x000a => {
7910
8057
  Name => 'ShotNumberSincePowerUp',
8058
+ Condition => '$$self{Model} =~ /^(ILCA-(68|77M2|99M2)|ILCE-(5000|5100|6000|6300|6500|7|7M2|7R|7RM2|7S|7SM2|QX1)|DSC-(HX350|HX400V|HX60V|HX80|HX90|HX90V|QX30|RX0|RX1RM2|RX10|RX10M2|RX10M3|RX100M3|RX100M4|RX100M5|WX220|WX350|WX500))\b/',
8059
+ Notes => 'valid only for some models',
7911
8060
  Format => 'int32u',
7912
- }],
8061
+ },
7913
8062
  0x0012 => { %sequenceImageNumber },
7914
8063
  0x0016 => {
7915
8064
  Name => 'SequenceLength',
@@ -7955,6 +8104,7 @@ my %isoSetting2010 = (
7955
8104
  },
7956
8105
  0x002a => {
7957
8106
  Name => 'Quality2',
8107
+ Condition => '$$self{Model} !~ /^(ILCE-7SM3)\b/',
7958
8108
  PrintConv => {
7959
8109
  0 => 'JPEG',
7960
8110
  1 => 'RAW',
@@ -7964,11 +8114,13 @@ my %isoSetting2010 = (
7964
8114
  },
7965
8115
  0x0047 => {
7966
8116
  Name => 'SonyImageHeight',
8117
+ Condition => '$$self{Model} !~ /^(ILCE-7SM3)\b/',
7967
8118
  Format => 'int16u',
7968
8119
  PrintConv => '$val > 0 ? 8*$val : "n.a."',
7969
8120
  },
7970
8121
  0x0053 => {
7971
8122
  Name => 'ModelReleaseYear',
8123
+ Condition => '$$self{Model} !~ /^(ILCE-7SM3)\b/',
7972
8124
  Format => 'int8u',
7973
8125
  PrintConv => 'sprintf("20%.2d", $val)',
7974
8126
  },
@@ -7983,11 +8135,12 @@ my %isoSetting2010 = (
7983
8135
  FIRST_ENTRY => 0,
7984
8136
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7985
8137
  DATAMEMBER => [ 0 ],
7986
- IS_SUBDIR => [ 0x0498, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8138
+ IS_SUBDIR => [ 0x0498, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
7987
8139
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
7988
8140
 
7989
8141
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7990
- 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8142
+ 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 160', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8143
+ 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7991
8144
  0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7992
8145
  0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7993
8146
  0x0636 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(73|74)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -8058,6 +8211,7 @@ my %isoSetting2010 = (
8058
8211
  14 => 'Tracking',
8059
8212
  15 => 'Face Tracking',
8060
8213
  20 => 'Animal Eye Tracking',
8214
+ # 21 => '???', # (ILCE-7SM3)
8061
8215
  255 => 'Manual',
8062
8216
  },
8063
8217
  },
@@ -8329,7 +8483,7 @@ my %isoSetting2010 = (
8329
8483
  # also often deviating results for Sony FE 90mm F2.8 Macro G OSS ...
8330
8484
  Name => 'SonyFNumber',
8331
8485
  Format => 'int16u',
8332
- Condition => '$$self{Model} !~ /^DSC-/',
8486
+ Condition => '$$self{Model} !~ /^(DSC-|ZV-)/',
8333
8487
  ValueConv => '2 ** (($val/256 - 16) / 2)',
8334
8488
  ValueConvInv => '(log($val)*2/log(2)+16)*256',
8335
8489
  PrintConv => 'sprintf("%.1f",$val)',
@@ -8445,7 +8599,7 @@ my %isoSetting2010 = (
8445
8599
  },
8446
8600
  0x0342 => {
8447
8601
  Name => 'LensZoomPosition',
8448
- 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))/',
8602
+ 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-)/',
8449
8603
  Format => 'int16u',
8450
8604
  PrintConv => 'sprintf("%.0f%%",$val/10.24)',
8451
8605
  PrintConvInv => '$val=~s/ ?%$//; $val * 10.24',
@@ -8457,7 +8611,7 @@ my %isoSetting2010 = (
8457
8611
  },
8458
8612
  0x034e => {
8459
8613
  Name => 'LensZoomPosition',
8460
- Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9M2))/',
8614
+ Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9M2))/',
8461
8615
  Format => 'int16u',
8462
8616
  PrintConv => 'sprintf("%.0f%%",$val/10.24)',
8463
8617
  PrintConvInv => '$val=~s/ ?%$//; $val * 10.24',
@@ -8469,7 +8623,7 @@ my %isoSetting2010 = (
8469
8623
  },
8470
8624
  0x035c => {
8471
8625
  Name => 'VignettingCorrParams',
8472
- Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7M3|7RM3|7RM4|9|9M2))/',
8626
+ Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7C|7M3|7RM3|7RM4|9|9M2))/',
8473
8627
  Format => 'int16s[16]',
8474
8628
  },
8475
8629
  0x035a => {
@@ -8506,7 +8660,7 @@ my %isoSetting2010 = (
8506
8660
  },
8507
8661
  0x03b8 => {
8508
8662
  Name => 'ChromaticAberrationCorrParams',
8509
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2))/',
8663
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7C|7M3|7RM3|7RM4|9|9M2))/',
8510
8664
  Format => 'int16s[32]',
8511
8665
  },
8512
8666
  );
@@ -8741,7 +8895,8 @@ my %isoSetting2010 = (
8741
8895
  # 1 1 3 0 for ILCA-68/77M2/99M2
8742
8896
  # 0 0 0 0 for NEX and ILCE-3000/3500, also seen for SLT/ILCA with non-AF lens
8743
8897
  # 1 0 0 0 for ILCE-5000/5100/6000/7/7M2/7R/7S/QX1
8744
- # 6 0 0 0 for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2
8898
+ # 6 0 0 0 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2
8899
+ # 9 . . . for ILCE-7SM3
8745
8900
  # 0 2 0 0 for NEX/ILCE with LA-EA2/EA4 Phase-AF adapter
8746
8901
  # 2 0 0 0 seen for a few NEX-5N images
8747
8902
  # 2 2 0 0 seen for a few NEX-5N/7 images with LA-EA2 adapter
@@ -9245,6 +9400,146 @@ my %isoSetting2010 = (
9245
9400
  0xbc => { Name => 'AFStatus_94_E6_Center_F2-8', %Image::ExifTool::Minolta::afStatusInfo },
9246
9401
  );
9247
9402
 
9403
+ # tag 0x9416 decoding (ref JR)
9404
+ %Image::ExifTool::Sony::Tag9416 = (
9405
+ PROCESS_PROC => \&ProcessEnciphered,
9406
+ WRITE_PROC => \&WriteEnciphered,
9407
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9408
+ FORMAT => 'int8u',
9409
+ NOTES => 'Valid for the ILCE-7SM3.',
9410
+ FIRST_ENTRY => 0,
9411
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9412
+ 0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
9413
+ 0x0004 => {
9414
+ Name => 'SonyISO',
9415
+ Format => 'int16u',
9416
+ ValueConv => '100 * 2**(16 - $val/256)',
9417
+ ValueConvInv => '256 * (16 - log($val/100)/log(2))',
9418
+ PrintConv => 'sprintf("%.0f",$val)',
9419
+ PrintConvInv => '$val',
9420
+ },
9421
+ 0x0006 => { %gain2010 },
9422
+ 0x000a => { # appr. same value as Exif ExposureTime, but shorter in HDR-modes
9423
+ Name => 'SonyExposureTime2',
9424
+ Format => 'int16u',
9425
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
9426
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
9427
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
9428
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
9429
+ },
9430
+ 0x000c => {
9431
+ Name => 'ExposureTime',
9432
+ Format => 'rational32u',
9433
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', # (Bulb NC)
9434
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : $val',
9435
+ },
9436
+ 0x0010 => { # but sometimes deviating results
9437
+ Name => 'SonyFNumber2',
9438
+ Format => 'int16u',
9439
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
9440
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
9441
+ PrintConv => 'sprintf("%.1f",$val)',
9442
+ PrintConvInv => '$val',
9443
+ },
9444
+ 0x0012 => {
9445
+ Name => 'SonyMaxApertureValue', # (at current focal length)
9446
+ Format => 'int16u',
9447
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
9448
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
9449
+ PrintConv => 'sprintf("%.1f",$val)',
9450
+ PrintConvInv => '$val',
9451
+ },
9452
+ 0x001d => { %sequenceImageNumber },
9453
+ 0x0035 => {
9454
+ Name => 'ExposureProgram',
9455
+ Priority => 0,
9456
+ SeparateTable => 'ExposureProgram3',
9457
+ PrintConv => \%sonyExposureProgram3,
9458
+ },
9459
+ 0x0048 => {
9460
+ Name => 'LensMount',
9461
+ Condition => '$$self{Model} !~ /^(DSC-)/',
9462
+ PrintConv => {
9463
+ 0 => 'Unknown',
9464
+ 1 => 'A-mount',
9465
+ 2 => 'E-mount',
9466
+ 3 => 'A-mount (3)',
9467
+ },
9468
+ },
9469
+ 0x0049 => {
9470
+ Name => 'LensFormat',
9471
+ Condition => '$$self{Model} !~ /^(DSC-)/',
9472
+ PrintConv => {
9473
+ 0 => 'Unknown',
9474
+ 1 => 'APS-C',
9475
+ 2 => 'Full-frame',
9476
+ },
9477
+ },
9478
+ 0x004a => {
9479
+ Name => 'LensMount',
9480
+ DataMember => 'LensMount',
9481
+ RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^(DSC-)/ ? undef : $val',
9482
+ PrintConv => {
9483
+ 0 => 'Unknown',
9484
+ 1 => 'A-mount',
9485
+ 2 => 'E-mount',
9486
+ },
9487
+ },
9488
+ 0x004b => {
9489
+ Name => 'LensType2',
9490
+ Condition => '$$self{LensMount} == 2',
9491
+ Format => 'int16u',
9492
+ SeparateTable => 'LensType2',
9493
+ PrintConv => \%sonyLensTypes2,
9494
+ },
9495
+ 0x004d => {
9496
+ Name => 'LensType',
9497
+ Condition => '$$self{LensMount} == 1',
9498
+ Priority => 0, #PH (just to be safe)
9499
+ Format => 'int16u', #PH
9500
+ SeparateTable => 1,
9501
+ ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)',
9502
+ PrintConv => \%sonyLensTypes,
9503
+ },
9504
+ 0x004f => {
9505
+ Name => 'DistortionCorrParams',
9506
+ Format => 'int16s[16]',
9507
+ },
9508
+ 0x0071 => {
9509
+ Name => 'FocalLength',
9510
+ Format => 'int16u',
9511
+ ValueConv => '$val / 10',
9512
+ ValueConvInv => '$val * 10',
9513
+ PrintConv => 'sprintf("%.1f mm",$val)',
9514
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9515
+ },
9516
+ 0x0073 => {
9517
+ Name => 'MinFocalLength',
9518
+ Format => 'int16u',
9519
+ ValueConv => '$val / 10',
9520
+ ValueConvInv => '$val * 10',
9521
+ PrintConv => 'sprintf("%.1f mm",$val)',
9522
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9523
+ },
9524
+ 0x0075 => { # may give 0 for fixed focal length lenses
9525
+ Name => 'MaxFocalLength',
9526
+ Format => 'int16u',
9527
+ RawConv => '$val || undef',
9528
+ ValueConv => '$val / 10',
9529
+ ValueConvInv => '$val * 10',
9530
+ PrintConv => 'sprintf("%.1f mm",$val)',
9531
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9532
+ },
9533
+ 0x088f => {
9534
+ Name => 'VignettingCorrParams',
9535
+ Format => 'int16s[16]',
9536
+ },
9537
+ 0x0914 => {
9538
+ Name => 'ChromaticAberrationCorrParams',
9539
+ Format => 'int16s[32]',
9540
+ },
9541
+ );
9542
+
9248
9543
  %Image::ExifTool::Sony::FaceInfo1 = (
9249
9544
  %binaryDataAttrs,
9250
9545
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
@@ -9742,12 +10037,88 @@ my %isoSetting2010 = (
9742
10037
  # 0x8100 - 16 bytes starting with 0x060e2b340401
9743
10038
  0x8100 => { Name => 'Sony_rtmd_0x8100', Format => 'int8u', %hidUnk },
9744
10039
  0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1
10040
+ 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1"
9745
10041
  0x8109 => { Name => 'Sony_rtmd_0x8109', Format => 'int32u', %hidUnk }, # seen: "1 50"
9746
10042
  0x810a => { Name => 'Sony_rtmd_0x810a', Format => 'int16u', %hidUnk }, # seen: 0
9747
10043
  0x810b => { Name => 'Sony_rtmd_0x810b', Format => 'int16u', %hidUnk }, # seen: 100
9748
10044
  0x810c => { Name => 'Sony_rtmd_0x810c', Format => 'int16u', %hidUnk }, # seen: 100
9749
10045
  0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 1
10046
+ 0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100
9750
10047
  # 0x8300 - container for other tags in this format
10048
+ 0x8500 => {
10049
+ Name => 'GPSVersionID',
10050
+ Groups => { 2 => 'Location' },
10051
+ Format => 'int8u',
10052
+ PrintConv => '$val =~ tr/ /./; $val',
10053
+ },
10054
+ 0x8501 => {
10055
+ Name => 'GPSLatitudeRef',
10056
+ Groups => { 2 => 'Location' },
10057
+ Format => 'string',
10058
+ PrintConv => {
10059
+ N => 'North',
10060
+ S => 'South',
10061
+ },
10062
+ },
10063
+ 0x8502 => {
10064
+ Name => 'GPSLatitude',
10065
+ Groups => { 2 => 'Location' },
10066
+ Format => 'rational64u',
10067
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)',
10068
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
10069
+ },
10070
+ 0x8503 => {
10071
+ Name => 'GPSLongitudeRef',
10072
+ Groups => { 2 => 'Location' },
10073
+ Format => 'string',
10074
+ PrintConv => {
10075
+ E => 'East',
10076
+ W => 'West',
10077
+ },
10078
+ },
10079
+ 0x8504 => {
10080
+ Name => 'GPSLongitude',
10081
+ Groups => { 2 => 'Location' },
10082
+ Format => 'rational64u',
10083
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)',
10084
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
10085
+ },
10086
+ 0x8507 => {
10087
+ Name => 'GPSTimeStamp',
10088
+ Groups => { 2 => 'Time' },
10089
+ Format => 'rational64u',
10090
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ConvertTimeStamp($val)',
10091
+ PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)',
10092
+ },
10093
+ 0x8509 => {
10094
+ Name => 'GPSStatus',
10095
+ Groups => { 2 => 'Location' },
10096
+ Format => 'string',
10097
+ PrintConv => {
10098
+ A => 'Measurement Active',
10099
+ V => 'Measurement Void',
10100
+ },
10101
+ },
10102
+ 0x850a => {
10103
+ Name => 'GPSMeasureMode',
10104
+ Groups => { 2 => 'Location' },
10105
+ Format => 'string',
10106
+ PrintConv => {
10107
+ 2 => '2-Dimensional Measurement',
10108
+ 3 => '3-Dimensional Measurement',
10109
+ },
10110
+ },
10111
+ 0x8512 => {
10112
+ Name => 'GPSMapDatum',
10113
+ Groups => { 2 => 'Location' },
10114
+ Format => 'string',
10115
+ },
10116
+ 0x851d => {
10117
+ Name => 'GPSDateStamp',
10118
+ Groups => { 2 => 'Time' },
10119
+ Format => 'string',
10120
+ ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
10121
+ },
9751
10122
  0xe000 => { Name => 'Sony_rtmd_0xe000', Format => 'int8u', %hidUnk }, # (16 bytes)
9752
10123
  0xe300 => { Name => 'Sony_rtmd_0xe300', Format => 'int8u', %hidUnk }, # seen: 0,1
9753
10124
  0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100
@@ -9760,6 +10131,8 @@ my %isoSetting2010 = (
9760
10131
  ValueConv => 'my @a=unpack("x1H4H2H2H2H2H2",$val); "$a[0]:$a[1]:$a[2] $a[3]:$a[4]:$a[5]"',
9761
10132
  PrintConv => '$self->ConvertDateTime($val)',
9762
10133
  },
10134
+ # f010 - 2048 bytes
10135
+ # f020 - 543 bytes
9763
10136
  );
9764
10137
 
9765
10138
  # Composite Sony tags
@@ -9794,6 +10167,17 @@ my %isoSetting2010 = (
9794
10167
  },
9795
10168
  PrintConv => '$val eq "inf" ? $val : sprintf("%.2f m",$val)',
9796
10169
  },
10170
+ GPSDateTime => {
10171
+ Description => 'GPS Date/Time',
10172
+ Groups => { 2 => 'Time' },
10173
+ SubDoc => 1, # generate for all sub-documents
10174
+ Require => {
10175
+ 0 => 'Sony:GPSDateStamp',
10176
+ 1 => 'Sony:GPSTimeStamp',
10177
+ },
10178
+ ValueConv => '"$val[0] $val[1]Z"',
10179
+ PrintConv => '$self->ConvertDateTime($val)',
10180
+ },
9797
10181
  );
9798
10182
 
9799
10183
  # add our composite tags