exiftool_vendored 11.99.0 → 12.06.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.

Potentially problematic release.


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

Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +119 -2
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +32 -32
  7. data/bin/exiftool +55 -50
  8. data/bin/lib/Image/ExifTool.pm +155 -109
  9. data/bin/lib/Image/ExifTool.pod +103 -77
  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 +11 -6
  13. data/bin/lib/Image/ExifTool/Canon.pm +2 -1
  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 +16 -3
  17. data/bin/lib/Image/ExifTool/Exif.pm +15 -6
  18. data/bin/lib/Image/ExifTool/Font.pm +9 -2
  19. data/bin/lib/Image/ExifTool/GIF.pm +5 -0
  20. data/bin/lib/Image/ExifTool/GeoTiff.pm +2 -0
  21. data/bin/lib/Image/ExifTool/GoPro.pm +10 -1
  22. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  23. data/bin/lib/Image/ExifTool/ID3.pm +86 -12
  24. data/bin/lib/Image/ExifTool/Lang/de.pm +3 -1
  25. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  26. data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
  27. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  28. data/bin/lib/Image/ExifTool/Minolta.pm +3 -2
  29. data/bin/lib/Image/ExifTool/Nikon.pm +134 -15
  30. data/bin/lib/Image/ExifTool/Olympus.pm +34 -17
  31. data/bin/lib/Image/ExifTool/PNG.pm +14 -3
  32. data/bin/lib/Image/ExifTool/PPM.pm +5 -5
  33. data/bin/lib/Image/ExifTool/Panasonic.pm +147 -13
  34. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +33 -0
  35. data/bin/lib/Image/ExifTool/Parrot.pm +2 -1
  36. data/bin/lib/Image/ExifTool/Pentax.pm +2 -1
  37. data/bin/lib/Image/ExifTool/Photoshop.pm +2 -1
  38. data/bin/lib/Image/ExifTool/QuickTime.pm +204 -27
  39. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +355 -19
  40. data/bin/lib/Image/ExifTool/README +20 -19
  41. data/bin/lib/Image/ExifTool/Ricoh.pm +19 -1
  42. data/bin/lib/Image/ExifTool/Shift.pl +1 -0
  43. data/bin/lib/Image/ExifTool/SigmaRaw.pm +40 -33
  44. data/bin/lib/Image/ExifTool/Sony.pm +376 -11
  45. data/bin/lib/Image/ExifTool/TagLookup.pm +1949 -1872
  46. data/bin/lib/Image/ExifTool/TagNames.pod +329 -53
  47. data/bin/lib/Image/ExifTool/Validate.pm +4 -4
  48. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -0
  49. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +23 -15
  50. data/bin/lib/Image/ExifTool/Writer.pl +44 -21
  51. data/bin/lib/Image/ExifTool/XMP.pm +41 -4
  52. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  53. data/bin/lib/Image/ExifTool/ZISRAW.pm +123 -0
  54. data/bin/perl-Image-ExifTool.spec +31 -31
  55. data/lib/exiftool_vendored/version.rb +1 -1
  56. metadata +4 -3
@@ -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
@@ -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.28';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -143,6 +143,7 @@ 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
146
147
 
147
148
  # (comment this out so LensID will report the LensModel, which is more useful)
148
149
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -180,6 +181,7 @@ sub PrintInvLensSpec($;$$);
180
181
  49460 => 'Tamron 24mm F2.8 Di III OSD M1:2', #JR (Model F051)
181
182
  49461 => 'Tamron 20mm F2.8 Di III OSD M1:2', #JR (Model F050)
182
183
  49462 => 'Tamron 70-180mm F2.8 Di III VXD', #JR (Model A056)
184
+ 49463 => 'Tamron 28-200mm F2.8-5.6 Di III RXD', #JR (Model A071)
183
185
 
184
186
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
185
187
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
@@ -209,6 +211,8 @@ sub PrintInvLensSpec($;$$);
209
211
  50515 => 'Sigma 35mm F1.2 DG DN | A', #IB/JR (019)
210
212
  50516 => 'Sigma 14-24mm F2.8 DG DN | A', #IB/JR (019)
211
213
  50517 => 'Sigma 24-70mm F2.8 DG DN | A', #JR (019)
214
+ 50518 => 'Sigma 100-400mm F5-6.3 DG DN OS | C', #JR (020)
215
+ 50521 => 'Sigma 85mm F1.4 DG DN | A', #JR (020)
212
216
 
213
217
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
214
218
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
@@ -221,6 +225,7 @@ sub PrintInvLensSpec($;$$);
221
225
  51000 => 'Voigtlander NOKTON 50mm F1.2 Aspherical', #JR
222
226
  51001 => 'Voigtlander NOKTON 21mm F1.4 Aspherical', #JR
223
227
  51002 => 'Voigtlander APO-LANTHAR 50mm F2 Aspherical', #JR
228
+ 51003 => 'Voigtlander NOKTON 35mm F1.2 Aspherical SE', #JR
224
229
 
225
230
  # lenses listed in the Sigma MC-11 list, but not yet seen:
226
231
  # 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014)
@@ -995,7 +1000,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
995
1000
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
996
1001
  },{
997
1002
  Name => 'Tag2010i', # ?
998
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2))\b/',
1003
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2)|ZV-1)\b/',
999
1004
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
1000
1005
  },{
1001
1006
  Name => 'Tag_0x2010',
@@ -1380,6 +1385,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1380
1385
  '1 0' => 'Off',
1381
1386
  '1 1' => 'Standard',
1382
1387
  '1 2' => 'High',
1388
+ '65535 65535' => 'n/a', # ILCE-7SM3
1383
1389
  },
1384
1390
  },
1385
1391
  0x2029 => { # uncompressed 14-bit RAW file type setting introduced 2015
@@ -1388,6 +1394,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1388
1394
  PrintConv => {
1389
1395
  0 => 'Compressed RAW',
1390
1396
  1 => 'Uncompressed RAW',
1397
+ 65535 => 'n/a', # seen for ILCE-7SM3 JPEG-only
1391
1398
  },
1392
1399
  },
1393
1400
  # 0x202a - first seen for ILCE-6300: 66 bytes
@@ -1486,6 +1493,13 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1486
1493
  PrintConv => 'sprintf("%.8d",$val)',
1487
1494
  PrintConvInv => '$val',
1488
1495
  },
1496
+ # 0x2032 - first seen for ILCE-7SM3, July 2020
1497
+ # 0x2033 - first seen for ILCE-7SM3, July 2020
1498
+ # 0x2034 - first seen for ILCE-7SM3, July 2020
1499
+ # 0x2035 - first seen for ILCE-7SM3, July 2020
1500
+ # 0x2036 - first seen for ILCE-7SM3, July 2020
1501
+ # 0x2037 - first seen for ILCE-7SM3, July 2020
1502
+ # 0x2039 - first seen for ILCE-7SM3, July 2020
1489
1503
  0x3000 => {
1490
1504
  Name => 'ShotInfo',
1491
1505
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -1514,7 +1528,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1514
1528
  # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets
1515
1529
  {
1516
1530
  Name => 'Tag9050a',
1517
- Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|9|9M2)|ILCA-99M2)/',
1531
+ Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|7SM3|9|9M2)|ILCA-99M2|ZV-)/',
1518
1532
  SubDirectory => {
1519
1533
  TagTable => 'Image::ExifTool::Sony::Tag9050a',
1520
1534
  ByteOrder => 'LittleEndian',
@@ -1526,6 +1540,13 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1526
1540
  TagTable => 'Image::ExifTool::Sony::Tag9050b',
1527
1541
  ByteOrder => 'LittleEndian',
1528
1542
  },
1543
+ },{
1544
+ Name => 'Tag9050c',
1545
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
1546
+ SubDirectory => {
1547
+ TagTable => 'Image::ExifTool::Sony::Tag9050c',
1548
+ ByteOrder => 'LittleEndian',
1549
+ },
1529
1550
  },{
1530
1551
  Name => 'Sony_0x9050',
1531
1552
  %unknownCipherData,
@@ -1540,7 +1561,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1540
1561
  # 0x23 (e) for DSC-RX10/HX60V/HX350/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-68/77M2
1541
1562
  # 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
1563
  # 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
1564
+ # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1
1565
+ # 0x31 (e) for ILCE-7SM3
1544
1566
  # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28 respectively
1545
1567
  {
1546
1568
  Name => 'Tag9400a',
@@ -1679,7 +1701,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1679
1701
  # 13 0 9 2 2 DSC-QX10/QX100/RX100M2
1680
1702
  # 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
1703
  # 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
1704
+ # 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, ZV-1
1705
+ # 18 0 20 0 164 ILCE-7SM3
1683
1706
  # other values for Panorama images and several other models
1684
1707
  0x9404 => [{
1685
1708
  Name => 'Tag9404a',
@@ -1713,7 +1736,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1713
1736
  # 142 var (0x25 = 37 var enc.) DSC-HX80/HX90V/RX1RM2/RX10M2/RX10M3/RX100M4/WX500, ILCE-6300/7RM2/7SM2
1714
1737
  # 144 var (0xe1 = 225 var enc.) DSC-RX100M5
1715
1738
  # 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
1739
+ # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7M3/7RM3/7RM4/9/9M2, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99, ZV-1
1740
+ # July 2020: ILCE-7SM3 doesn't write this tag anymore, but writes 0x9416
1717
1741
  0x9405 => [{
1718
1742
  Name => 'Tag9405a',
1719
1743
  # first byte must be 0x1b or 0x40 or 0x7d
@@ -1800,6 +1824,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1800
1824
  %unknownCipherData,
1801
1825
  # 0x02 - int32u?: 1,3,5,7,9 (A77)
1802
1826
  },
1827
+ 0x9416 => { # replaces 0x9405 for the Sony ILCE-7SM3, from July 2020
1828
+ Name => 'Sony_0x9416',
1829
+ SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9416' },
1830
+ },
1803
1831
  0xb000 => { #8
1804
1832
  Name => 'FileFormat',
1805
1833
  Writable => 'int8u',
@@ -1822,6 +1850,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1822
1850
  '3 3 2 0' => 'ARW 2.3.2', #JR (DSC-RX1RM2,ILCE-7SM2 - support for uncompressed 14-bit RAW)
1823
1851
  '3 3 3 0' => 'ARW 2.3.3', #JR (ILCE-9)
1824
1852
  '3 3 5 0' => 'ARW 2.3.5', #JR (DSC-HX99)
1853
+ '4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
1825
1854
  # what about cRAW images?
1826
1855
  },
1827
1856
  },
@@ -1915,6 +1944,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1915
1944
  376 => 'ILCE-9M2', #JR
1916
1945
  378 => 'ILCE-6600', #IB/JR
1917
1946
  379 => 'ILCE-6100', #IB/JR
1947
+ 380 => 'ZV-1', #JR
1948
+ 383 => 'ILCE-7SM3',
1918
1949
  },
1919
1950
  },
1920
1951
  0xb020 => { #2
@@ -6051,8 +6082,11 @@ my %isoSetting2010 = (
6051
6082
  33 => 16000,
6052
6083
  34 => 20000,
6053
6084
  35 => 25600,
6085
+ 36 => 32000,
6086
+ 37 => 40000,
6054
6087
  38 => 51200,
6055
6088
  39 => 64000,
6089
+ 40 => 80000,
6056
6090
  41 => 102400,
6057
6091
  42 => 128000,
6058
6092
  43 => 160000,
@@ -7727,6 +7761,107 @@ my %isoSetting2010 = (
7727
7761
  },
7728
7762
  );
7729
7763
 
7764
+ %Image::ExifTool::Sony::Tag9050c = ( #JR
7765
+ PROCESS_PROC => \&ProcessEnciphered,
7766
+ WRITE_PROC => \&WriteEnciphered,
7767
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
7768
+ FORMAT => 'int8u',
7769
+ NOTES => q{
7770
+ Valid from July 2020 for ILCE-7SM3.
7771
+ },
7772
+ WRITABLE => 1,
7773
+ FIRST_ENTRY => 0,
7774
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7775
+ DATAMEMBER => [ 0x0039 ],
7776
+ 0x0026 => {
7777
+ Name => 'Shutter',
7778
+ Format => 'int16u[3]',
7779
+ PrintConv => {
7780
+ '0 0 0' => 'Silent / Electronic (0 0 0)',
7781
+ OTHER => sub {
7782
+ my ($val, $inv) = @_;
7783
+ return $inv ? ($val=~/\((.*?)\)/ ? $1 : undef) : "Mechanical ($val)";
7784
+ },
7785
+ },
7786
+ },
7787
+ 0x0039 => {
7788
+ Name => 'FlashStatus',
7789
+ RawConv => '$$self{FlashFired} = $val',
7790
+ PrintConv => {
7791
+ 0 => 'No Flash present',
7792
+ 2 => 'Flash Inhibited', # seen for ILCE-7/7R continuous, panorama, HDR mode
7793
+ 64 => 'Built-in Flash present',
7794
+ 65 => 'Built-in Flash Fired',
7795
+ 66 => 'Built-in Flash Inhibited', # seen for panorama, HDR, burst mode
7796
+ 128 => 'External Flash present', # seen for NEX-5N/5T
7797
+ 129 => 'External Flash Fired', # seen for SLT-A99V, ILCE-7R, NEX-5N/5R
7798
+ },
7799
+ },
7800
+ 0x003a => {
7801
+ Name => 'ShutterCount',
7802
+ # or "ShutterCount"? : number of shutter actuations, does not increase during Silent Shooting,
7803
+ # at least for ILCE-7RM2
7804
+ Format => 'int32u',
7805
+ Notes => 'total number of image exposures made by the camera',
7806
+ RawConv => '$val & 0x00ffffff',
7807
+ PrintConv => 'sprintf("%6d",$val)',
7808
+ },
7809
+ 0x0046 => { # appr. same value as Exif ExposureTime, but longer in HDR-modes
7810
+ Name => 'SonyExposureTime',
7811
+ Format => 'int16u',
7812
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
7813
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
7814
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
7815
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
7816
+ },
7817
+ 0x0048 => {
7818
+ Name => 'SonyFNumber',
7819
+ Format => 'int16u',
7820
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
7821
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
7822
+ PrintConv => 'sprintf("%.1f",$val)',
7823
+ PrintConvInv => '$val',
7824
+ },
7825
+ 0x004b => {
7826
+ Name => 'ReleaseMode2',
7827
+ %releaseMode2,
7828
+ },
7829
+ 0x0050 => {
7830
+ Name => 'ShutterCount2',
7831
+ Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-7SM3)/)',
7832
+ Format => 'int32u',
7833
+ RawConv => '$val & 0x00ffffff',
7834
+ },
7835
+ 0x0066 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7836
+ Name => 'SonyExposureTime',
7837
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7838
+ Format => 'int16u',
7839
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
7840
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
7841
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
7842
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
7843
+ },
7844
+ 0x0068 => { # appr. same value as Exif ExposureTime, but not valid in HDR-modes
7845
+ Name => 'SonyFNumber',
7846
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7847
+ Format => 'int16u',
7848
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
7849
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
7850
+ PrintConv => 'sprintf("%.1f",$val)',
7851
+ PrintConvInv => '$val',
7852
+ },
7853
+ 0x006b => {
7854
+ Name => 'ReleaseMode2',
7855
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3)/',
7856
+ %releaseMode2,
7857
+ },
7858
+ 0x0088 => {
7859
+ Name => 'InternalSerialNumber', #(NC)
7860
+ Format => 'int8u[6]',
7861
+ PrintConv => 'unpack "H*", pack "C*", split " ", $val',
7862
+ },
7863
+ );
7864
+
7730
7865
  %Image::ExifTool::Sony::Tag9400a = ( #JR
7731
7866
  PROCESS_PROC => \&ProcessEnciphered,
7732
7867
  WRITE_PROC => \&WriteEnciphered,
@@ -7903,7 +8038,7 @@ my %isoSetting2010 = (
7903
8038
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7904
8039
  0x0009 => { %releaseMode2 },
7905
8040
  0x000a => [{
7906
- Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))\b/',
8041
+ Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9|9M2)|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2)|ZV-1)\b/',
7907
8042
  Name => 'ShotNumberSincePowerUp',
7908
8043
  Format => 'int8u',
7909
8044
  },{
@@ -7983,11 +8118,12 @@ my %isoSetting2010 = (
7983
8118
  FIRST_ENTRY => 0,
7984
8119
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
7985
8120
  DATAMEMBER => [ 0 ],
7986
- IS_SUBDIR => [ 0x0498, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8121
+ IS_SUBDIR => [ 0x0498, 0x04a1, 0x04a2, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
7987
8122
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
7988
8123
 
7989
8124
  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' } },
8125
+ 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 160', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8126
+ 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7991
8127
  0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7992
8128
  0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
7993
8129
  0x0636 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(73|74)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -8058,6 +8194,7 @@ my %isoSetting2010 = (
8058
8194
  14 => 'Tracking',
8059
8195
  15 => 'Face Tracking',
8060
8196
  20 => 'Animal Eye Tracking',
8197
+ # 21 => '???', # (ILCE-7SM3)
8061
8198
  255 => 'Manual',
8062
8199
  },
8063
8200
  },
@@ -8329,7 +8466,7 @@ my %isoSetting2010 = (
8329
8466
  # also often deviating results for Sony FE 90mm F2.8 Macro G OSS ...
8330
8467
  Name => 'SonyFNumber',
8331
8468
  Format => 'int16u',
8332
- Condition => '$$self{Model} !~ /^DSC-/',
8469
+ Condition => '$$self{Model} !~ /^(DSC-|ZV-)/',
8333
8470
  ValueConv => '2 ** (($val/256 - 16) / 2)',
8334
8471
  ValueConvInv => '(log($val)*2/log(2)+16)*256',
8335
8472
  PrintConv => 'sprintf("%.1f",$val)',
@@ -8445,7 +8582,7 @@ my %isoSetting2010 = (
8445
8582
  },
8446
8583
  0x0342 => {
8447
8584
  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))/',
8585
+ 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)|ZV-)/',
8449
8586
  Format => 'int16u',
8450
8587
  PrintConv => 'sprintf("%.0f%%",$val/10.24)',
8451
8588
  PrintConvInv => '$val=~s/ ?%$//; $val * 10.24',
@@ -9245,6 +9382,145 @@ my %isoSetting2010 = (
9245
9382
  0xbc => { Name => 'AFStatus_94_E6_Center_F2-8', %Image::ExifTool::Minolta::afStatusInfo },
9246
9383
  );
9247
9384
 
9385
+ # tag 0x9416 decoding (ref JR)
9386
+ %Image::ExifTool::Sony::Tag9416 = (
9387
+ PROCESS_PROC => \&ProcessEnciphered,
9388
+ WRITE_PROC => \&WriteEnciphered,
9389
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9390
+ FORMAT => 'int8u',
9391
+ FIRST_ENTRY => 0,
9392
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9393
+ 0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
9394
+ 0x0004 => {
9395
+ Name => 'SonyISO',
9396
+ Format => 'int16u',
9397
+ ValueConv => '100 * 2**(16 - $val/256)',
9398
+ ValueConvInv => '256 * (16 - log($val/100)/log(2))',
9399
+ PrintConv => 'sprintf("%.0f",$val)',
9400
+ PrintConvInv => '$val',
9401
+ },
9402
+ 0x0006 => { %gain2010 },
9403
+ 0x000a => { # appr. same value as Exif ExposureTime, but shorter in HDR-modes
9404
+ Name => 'SonyExposureTime2',
9405
+ Format => 'int16u',
9406
+ ValueConv => '$val ? 2 ** (16 - $val/256) : 0',
9407
+ ValueConvInv => '$val ? int((16 - log($val) / log(2)) * 256 + 0.5) : 0',
9408
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"',
9409
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)',
9410
+ },
9411
+ 0x000c => {
9412
+ Name => 'ExposureTime',
9413
+ Format => 'rational32u',
9414
+ PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', # (Bulb NC)
9415
+ PrintConvInv => 'lc($val) eq "bulb" ? 0 : $val',
9416
+ },
9417
+ 0x0010 => { # but sometimes deviating results
9418
+ Name => 'SonyFNumber2',
9419
+ Format => 'int16u',
9420
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
9421
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
9422
+ PrintConv => 'sprintf("%.1f",$val)',
9423
+ PrintConvInv => '$val',
9424
+ },
9425
+ 0x0012 => {
9426
+ Name => 'SonyMaxApertureValue', # (at current focal length)
9427
+ Format => 'int16u',
9428
+ ValueConv => '2 ** (($val/256 - 16) / 2)',
9429
+ ValueConvInv => '(log($val)*2/log(2)+16)*256',
9430
+ PrintConv => 'sprintf("%.1f",$val)',
9431
+ PrintConvInv => '$val',
9432
+ },
9433
+ 0x001d => { %sequenceImageNumber },
9434
+ 0x0035 => {
9435
+ Name => 'ExposureProgram',
9436
+ Priority => 0,
9437
+ SeparateTable => 'ExposureProgram3',
9438
+ PrintConv => \%sonyExposureProgram3,
9439
+ },
9440
+ 0x0048 => {
9441
+ Name => 'LensMount',
9442
+ Condition => '$$self{Model} !~ /^(DSC-)/',
9443
+ PrintConv => {
9444
+ 0 => 'Unknown',
9445
+ 1 => 'A-mount',
9446
+ 2 => 'E-mount',
9447
+ 3 => 'A-mount (3)',
9448
+ },
9449
+ },
9450
+ 0x0049 => {
9451
+ Name => 'LensFormat',
9452
+ Condition => '$$self{Model} !~ /^(DSC-)/',
9453
+ PrintConv => {
9454
+ 0 => 'Unknown',
9455
+ 1 => 'APS-C',
9456
+ 2 => 'Full-frame',
9457
+ },
9458
+ },
9459
+ 0x004a => {
9460
+ Name => 'LensMount',
9461
+ DataMember => 'LensMount',
9462
+ RawConv => '$$self{LensMount} = $val; $$self{Model} =~ /^(DSC-)/ ? undef : $val',
9463
+ PrintConv => {
9464
+ 0 => 'Unknown',
9465
+ 1 => 'A-mount',
9466
+ 2 => 'E-mount',
9467
+ },
9468
+ },
9469
+ 0x004b => {
9470
+ Name => 'LensType2',
9471
+ Condition => '$$self{LensMount} == 2',
9472
+ Format => 'int16u',
9473
+ SeparateTable => 'LensType2',
9474
+ PrintConv => \%sonyLensTypes2,
9475
+ },
9476
+ 0x004d => {
9477
+ Name => 'LensType',
9478
+ Condition => '$$self{LensMount} == 1',
9479
+ Priority => 0, #PH (just to be safe)
9480
+ Format => 'int16u', #PH
9481
+ SeparateTable => 1,
9482
+ ValueConvInv => '($val & 0xff00) == 0x8000 ? 0 : int($val)',
9483
+ PrintConv => \%sonyLensTypes,
9484
+ },
9485
+ 0x004f => {
9486
+ Name => 'DistortionCorrParams',
9487
+ Format => 'int16s[16]',
9488
+ },
9489
+ 0x0071 => {
9490
+ Name => 'FocalLength',
9491
+ Format => 'int16u',
9492
+ ValueConv => '$val / 10',
9493
+ ValueConvInv => '$val * 10',
9494
+ PrintConv => 'sprintf("%.1f mm",$val)',
9495
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9496
+ },
9497
+ 0x0073 => {
9498
+ Name => 'MinFocalLength',
9499
+ Format => 'int16u',
9500
+ ValueConv => '$val / 10',
9501
+ ValueConvInv => '$val * 10',
9502
+ PrintConv => 'sprintf("%.1f mm",$val)',
9503
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9504
+ },
9505
+ 0x0075 => { # may give 0 for fixed focal length lenses
9506
+ Name => 'MaxFocalLength',
9507
+ Format => 'int16u',
9508
+ RawConv => '$val || undef',
9509
+ ValueConv => '$val / 10',
9510
+ ValueConvInv => '$val * 10',
9511
+ PrintConv => 'sprintf("%.1f mm",$val)',
9512
+ PrintConvInv => '$val =~ s/ ?mm//; $val',
9513
+ },
9514
+ 0x088f => {
9515
+ Name => 'VignettingCorrParams',
9516
+ Format => 'int16s[16]',
9517
+ },
9518
+ 0x0914 => {
9519
+ Name => 'ChromaticAberrationCorrParams',
9520
+ Format => 'int16s[32]',
9521
+ },
9522
+ );
9523
+
9248
9524
  %Image::ExifTool::Sony::FaceInfo1 = (
9249
9525
  %binaryDataAttrs,
9250
9526
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
@@ -9742,12 +10018,88 @@ my %isoSetting2010 = (
9742
10018
  # 0x8100 - 16 bytes starting with 0x060e2b340401
9743
10019
  0x8100 => { Name => 'Sony_rtmd_0x8100', Format => 'int8u', %hidUnk },
9744
10020
  0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1
10021
+ 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1"
9745
10022
  0x8109 => { Name => 'Sony_rtmd_0x8109', Format => 'int32u', %hidUnk }, # seen: "1 50"
9746
10023
  0x810a => { Name => 'Sony_rtmd_0x810a', Format => 'int16u', %hidUnk }, # seen: 0
9747
10024
  0x810b => { Name => 'Sony_rtmd_0x810b', Format => 'int16u', %hidUnk }, # seen: 100
9748
10025
  0x810c => { Name => 'Sony_rtmd_0x810c', Format => 'int16u', %hidUnk }, # seen: 100
9749
10026
  0x810d => { Name => 'Sony_rtmd_0x810d', Format => 'int8u', %hidUnk }, # seen: 1
10027
+ 0x8115 => { Name => 'Sony_rtmd_0x8115', Format => 'int16u', %hidUnk }, # seen: 100
9750
10028
  # 0x8300 - container for other tags in this format
10029
+ 0x8500 => {
10030
+ Name => 'GPSVersionID',
10031
+ Groups => { 2 => 'Location' },
10032
+ Format => 'int8u',
10033
+ PrintConv => '$val =~ tr/ /./; $val',
10034
+ },
10035
+ 0x8501 => {
10036
+ Name => 'GPSLatitudeRef',
10037
+ Groups => { 2 => 'Location' },
10038
+ Format => 'string',
10039
+ PrintConv => {
10040
+ N => 'North',
10041
+ S => 'South',
10042
+ },
10043
+ },
10044
+ 0x8502 => {
10045
+ Name => 'GPSLatitude',
10046
+ Groups => { 2 => 'Location' },
10047
+ Format => 'rational64u',
10048
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)',
10049
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
10050
+ },
10051
+ 0x8503 => {
10052
+ Name => 'GPSLongitudeRef',
10053
+ Groups => { 2 => 'Location' },
10054
+ Format => 'string',
10055
+ PrintConv => {
10056
+ E => 'East',
10057
+ W => 'West',
10058
+ },
10059
+ },
10060
+ 0x8504 => {
10061
+ Name => 'GPSLongitude',
10062
+ Groups => { 2 => 'Location' },
10063
+ Format => 'rational64u',
10064
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ToDegrees($val)',
10065
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
10066
+ },
10067
+ 0x8507 => {
10068
+ Name => 'GPSTimeStamp',
10069
+ Groups => { 2 => 'Time' },
10070
+ Format => 'rational64u',
10071
+ ValueConv => 'require Image::ExifTool::GPS;Image::ExifTool::GPS::ConvertTimeStamp($val)',
10072
+ PrintConv => 'Image::ExifTool::GPS::PrintTimeStamp($val)',
10073
+ },
10074
+ 0x8509 => {
10075
+ Name => 'GPSStatus',
10076
+ Groups => { 2 => 'Location' },
10077
+ Format => 'string',
10078
+ PrintConv => {
10079
+ A => 'Measurement Active',
10080
+ V => 'Measurement Void',
10081
+ },
10082
+ },
10083
+ 0x850a => {
10084
+ Name => 'GPSMeasureMode',
10085
+ Groups => { 2 => 'Location' },
10086
+ Format => 'string',
10087
+ PrintConv => {
10088
+ 2 => '2-Dimensional Measurement',
10089
+ 3 => '3-Dimensional Measurement',
10090
+ },
10091
+ },
10092
+ 0x8512 => {
10093
+ Name => 'GPSMapDatum',
10094
+ Groups => { 2 => 'Location' },
10095
+ Format => 'string',
10096
+ },
10097
+ 0x851d => {
10098
+ Name => 'GPSDateStamp',
10099
+ Groups => { 2 => 'Time' },
10100
+ Format => 'string',
10101
+ ValueConv => 'Image::ExifTool::Exif::ExifDate($val)',
10102
+ },
9751
10103
  0xe000 => { Name => 'Sony_rtmd_0xe000', Format => 'int8u', %hidUnk }, # (16 bytes)
9752
10104
  0xe300 => { Name => 'Sony_rtmd_0xe300', Format => 'int8u', %hidUnk }, # seen: 0,1
9753
10105
  0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100
@@ -9760,6 +10112,8 @@ my %isoSetting2010 = (
9760
10112
  ValueConv => 'my @a=unpack("x1H4H2H2H2H2H2",$val); "$a[0]:$a[1]:$a[2] $a[3]:$a[4]:$a[5]"',
9761
10113
  PrintConv => '$self->ConvertDateTime($val)',
9762
10114
  },
10115
+ # f010 - 2048 bytes
10116
+ # f020 - 543 bytes
9763
10117
  );
9764
10118
 
9765
10119
  # Composite Sony tags
@@ -9794,6 +10148,17 @@ my %isoSetting2010 = (
9794
10148
  },
9795
10149
  PrintConv => '$val eq "inf" ? $val : sprintf("%.2f m",$val)',
9796
10150
  },
10151
+ GPSDateTime => {
10152
+ Description => 'GPS Date/Time',
10153
+ Groups => { 2 => 'Time' },
10154
+ SubDoc => 1, # generate for all sub-documents
10155
+ Require => {
10156
+ 0 => 'Sony:GPSDateStamp',
10157
+ 1 => 'Sony:GPSTimeStamp',
10158
+ },
10159
+ ValueConv => '"$val[0] $val[1]Z"',
10160
+ PrintConv => '$self->ConvertDateTime($val)',
10161
+ },
9797
10162
  );
9798
10163
 
9799
10164
  # add our composite tags