exiftool_vendored 12.68.0 → 12.72.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +98 -15
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +10 -10
  7. data/bin/exiftool +32 -25
  8. data/bin/lib/Image/ExifTool/AAC.pm +175 -0
  9. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +2 -1
  10. data/bin/lib/Image/ExifTool/CBOR.pm +18 -2
  11. data/bin/lib/Image/ExifTool/Canon.pm +87 -20
  12. data/bin/lib/Image/ExifTool/DJI.pm +3 -2
  13. data/bin/lib/Image/ExifTool/DNG.pm +25 -2
  14. data/bin/lib/Image/ExifTool/EXE.pm +54 -6
  15. data/bin/lib/Image/ExifTool/Exif.pm +204 -22
  16. data/bin/lib/Image/ExifTool/FujiFilm.pm +145 -20
  17. data/bin/lib/Image/ExifTool/GIF.pm +5 -1
  18. data/bin/lib/Image/ExifTool/GoPro.pm +16 -1
  19. data/bin/lib/Image/ExifTool/ID3.pm +76 -10
  20. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  21. data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  22. data/bin/lib/Image/ExifTool/JSON.pm +4 -1
  23. data/bin/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  24. data/bin/lib/Image/ExifTool/M2TS.pm +21 -16
  25. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  26. data/bin/lib/Image/ExifTool/Nikon.pm +213 -105
  27. data/bin/lib/Image/ExifTool/Olympus.pm +7 -1
  28. data/bin/lib/Image/ExifTool/PNG.pm +8 -13
  29. data/bin/lib/Image/ExifTool/Panasonic.pm +15 -2
  30. data/bin/lib/Image/ExifTool/Pentax.pm +15 -6
  31. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +2 -2
  32. data/bin/lib/Image/ExifTool/QuickTime.pm +60 -14
  33. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +59 -11
  34. data/bin/lib/Image/ExifTool/README +14 -5
  35. data/bin/lib/Image/ExifTool/RIFF.pm +60 -10
  36. data/bin/lib/Image/ExifTool/Ricoh.pm +109 -1
  37. data/bin/lib/Image/ExifTool/Samsung.pm +3 -2
  38. data/bin/lib/Image/ExifTool/Sony.pm +177 -37
  39. data/bin/lib/Image/ExifTool/TagLookup.pm +6971 -6714
  40. data/bin/lib/Image/ExifTool/TagNames.pod +957 -372
  41. data/bin/lib/Image/ExifTool/Text.pm +4 -5
  42. data/bin/lib/Image/ExifTool/Validate.pm +23 -20
  43. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +2 -2
  44. data/bin/lib/Image/ExifTool/WriteExif.pl +33 -8
  45. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
  46. data/bin/lib/Image/ExifTool/WriteRIFF.pl +31 -6
  47. data/bin/lib/Image/ExifTool/Writer.pl +121 -28
  48. data/bin/lib/Image/ExifTool/XMP.pm +67 -2
  49. data/bin/lib/Image/ExifTool/XMP2.pl +35 -0
  50. data/bin/lib/Image/ExifTool.pm +94 -43
  51. data/bin/lib/Image/ExifTool.pod +28 -17
  52. data/bin/perl-Image-ExifTool.spec +9 -9
  53. data/lib/exiftool_vendored/version.rb +1 -1
  54. metadata +3 -2
@@ -9,6 +9,7 @@
9
9
  # 2) http://homepage3.nifty.com/kamisaka/makernote/makernote_ricoh.htm
10
10
  # 3) Tim Gray private communication (GR)
11
11
  # 4) https://github.com/atotto/ricoh-theta-tools/
12
+ # 5) https://github.com/ricohapi/theta-api-specs/blob/main/theta-metadata/README.md
12
13
  # IB) Iliah Borg private communication (LibRaw)
13
14
  #------------------------------------------------------------------------------
14
15
 
@@ -18,11 +19,13 @@ use strict;
18
19
  use vars qw($VERSION);
19
20
  use Image::ExifTool qw(:DataAccess :Utils);
20
21
  use Image::ExifTool::Exif;
22
+ use Image::ExifTool::GPS;
21
23
 
22
- $VERSION = '1.36';
24
+ $VERSION = '1.37';
23
25
 
24
26
  sub ProcessRicohText($$$);
25
27
  sub ProcessRicohRMETA($$$);
28
+ sub ProcessRicohRDT($$$);
26
29
 
27
30
  # lens types for Ricoh GXR
28
31
  my %ricohLensIDs = (
@@ -908,6 +911,65 @@ my %ricohLensIDs = (
908
911
  },
909
912
  );
910
913
 
914
+ # real-time metadata in RDTA atom (ref 5)
915
+ %Image::ExifTool::Ricoh::RDTA = (
916
+ PROCESS_PROC => \&ProcessRicohRDT,
917
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
918
+ 0 => { Name => 'Accelerometer', Format => 'float[3]' },
919
+ 16 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
920
+ );
921
+
922
+ # real-time metadata in RDTB atom (ref 5)
923
+ %Image::ExifTool::Ricoh::RDTB = (
924
+ PROCESS_PROC => \&ProcessRicohRDT,
925
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
926
+ 0 => { Name => 'Gyroscope', Format => 'float[3]', Notes => 'rad/s' },
927
+ 16 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
928
+ );
929
+
930
+ # real-time metadata in RDTC atom (ref 5)
931
+ %Image::ExifTool::Ricoh::RDTC = (
932
+ PROCESS_PROC => \&ProcessRicohRDT,
933
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
934
+ 0 => { Name => 'MagneticField', Format => 'float[3]' },
935
+ 16 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
936
+ );
937
+
938
+ # real-time metadata in RDTG atom (ref 5)
939
+ %Image::ExifTool::Ricoh::RDTG = (
940
+ PROCESS_PROC => \&ProcessRicohRDT,
941
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Video' },
942
+ 0 => { Name => 'TimeStamp', Format => 'int64u', ValueConv => '$val * 1e-9' },
943
+ 100 => { Name => 'FrameNumber', Notes => 'generated internally' },
944
+ );
945
+
946
+ # real-time metadata in RDTL atom (ref 5)
947
+ %Image::ExifTool::Ricoh::RDTL = (
948
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Location' },
949
+ 0 => {
950
+ Name => 'GPSDateTime',
951
+ Groups => { 2 => 'Time' },
952
+ Format => 'double',
953
+ ValueConv => 'ConvertUnixTime($val*1e-9, 1, 9)', # (NC -- what is the epoch?)
954
+ PrintConv => '$self->ConvertDateTime($val)',
955
+ },
956
+ 8 => {
957
+ Name => 'GPSLatitude',
958
+ Format => 'double',
959
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
960
+ },
961
+ 16 => {
962
+ Name => 'GPSLongitude',
963
+ Format => 'double',
964
+ PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
965
+ },
966
+ 24 => {
967
+ Name => 'GPSAltitude',
968
+ Format => 'double',
969
+ PrintConv => '($val =~ s/^-// ? "$val m Below" : "$val m Above") . " Sea Level"',
970
+ },
971
+ );
972
+
911
973
  # Ricoh composite tags
912
974
  %Image::ExifTool::Ricoh::Composite = (
913
975
  GROUPS => { 2 => 'Camera' },
@@ -932,6 +994,52 @@ my %ricohLensIDs = (
932
994
  Image::ExifTool::AddCompositeTags('Image::ExifTool::Ricoh');
933
995
 
934
996
 
997
+ #------------------------------------------------------------------------------
998
+ # Process Ricoh RDT* real-time metadata
999
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
1000
+ # Returns: 1 on success, otherwise returns 0 and sets a Warning
1001
+ sub ProcessRicohRDT($$$)
1002
+ {
1003
+ my ($et, $dirInfo, $tagTablePtr) = @_;
1004
+ my $dataPt = $$dirInfo{DataPt};
1005
+ my $dirLen = $$dirInfo{DirLen};
1006
+ my $dirName = $$dirInfo{DirName};
1007
+ my ($i, $rdtg);
1008
+ return 0 if $dirLen < 16;
1009
+ my $ee = $et->Options('ExtractEmbedded');
1010
+ unless ($ee) {
1011
+ $et->WarnOnce('Use ExtractEmbedded option to read Ricoh real-time metadata',3);
1012
+ return 1;
1013
+ }
1014
+ my $endian = substr($$dataPt, 8, 2);
1015
+ SetByteOrder($endian eq "\x23\x01" ? 'II' : 'MM');
1016
+ my $count = Get32u($dataPt, 0);
1017
+ my $len = Get16u($dataPt, 6);
1018
+ if ($dirName eq 'RicohRDTG') {
1019
+ if ($ee < 2) {
1020
+ $et->WarnOnce('Set ExtractEmbedded option to 2 or higher to extract frame timestamps',3);
1021
+ return 1;
1022
+ }
1023
+ $rdtg = 0;
1024
+ $et->WarnOnce('Unexpected RDTG record length') if $len > 8;
1025
+ }
1026
+ if ($count * $len + 16 > $dirLen) {
1027
+ $et->Warn("Truncated $dirName data");
1028
+ $count = int(($dirLen - 16) / $len);
1029
+ }
1030
+ $et->VerboseDir($dirName);
1031
+ $$dirInfo{DirStart} = 16;
1032
+ $$dirInfo{DirLen} = $len;
1033
+ for ($i=0; $i<$count; ++$i) {;
1034
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
1035
+ $et->HandleTag($tagTablePtr, 100, $rdtg++) if defined $rdtg;
1036
+ $et->ProcessBinaryData($dirInfo, $tagTablePtr);
1037
+ $$dirInfo{DirStart} += $len;
1038
+ }
1039
+ delete $$et{DOC_NUM};
1040
+ return 1;
1041
+ }
1042
+
935
1043
  #------------------------------------------------------------------------------
936
1044
  # Process Ricoh text-based maker notes
937
1045
  # Inputs: 0) ExifTool object reference
@@ -22,7 +22,7 @@ use vars qw($VERSION %samsungLensTypes);
22
22
  use Image::ExifTool qw(:DataAccess :Utils);
23
23
  use Image::ExifTool::Exif;
24
24
 
25
- $VERSION = '1.54';
25
+ $VERSION = '1.55';
26
26
 
27
27
  sub WriteSTMN($$$);
28
28
  sub ProcessINFO($$$);
@@ -904,9 +904,10 @@ my %formatMinMax = (
904
904
  Name => 'SamsungSvss',
905
905
  SubDirectory => { TagTable => 'Image::ExifTool::Samsung::svss' },
906
906
  },
907
+ mdln => 'SamsungModel', #PH (Samsung SM-A136U, etc)
907
908
  # swtr - 4 bytes, all zero
908
909
  # scid - 8 bytes, all zero
909
- # saut - 4 bytes, all zero
910
+ # saut - 4 or 6 bytes, all zero
910
911
  );
911
912
 
912
913
  # Samsung MP4 svss information (PH - from SM-C101 sample)
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.63';
37
+ $VERSION = '3.65';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -69,11 +69,13 @@ sub PrintInvLensSpec($;$$);
69
69
  '0.10' => 'Zeiss Touit 50mm F2.8 Macro', # (firmware Ver.00)
70
70
  '0.11' => 'Zeiss Loxia 50mm F2', # (firmware Ver.01)
71
71
  '0.12' => 'Zeiss Loxia 35mm F2', # (firmware Ver.01)
72
+ '0.13' => 'Viltrox 85mm F1.8', # original AF version; Mark II version is at 47473
72
73
  1 => 'Sony LA-EA1 or Sigma MC-11 Adapter', # MC-11 with not-supported lenses
73
74
  2 => 'Sony LA-EA2 Adapter',
74
75
  3 => 'Sony LA-EA3 Adapter',
75
76
  6 => 'Sony LA-EA4 Adapter',
76
77
  7 => 'Sony LA-EA5 Adapter', #JR
78
+ 13 => 'Samyang AF 35-150mm F2-2.8',
77
79
  # 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB)
78
80
  44 => 'Metabones Canon EF Smart Adapter', #JR
79
81
  78 => 'Metabones Canon EF Smart Adapter Mark III or Other Adapter', #PH/JR (also Mark IV, Fotodiox and Viltrox)
@@ -164,6 +166,7 @@ sub PrintInvLensSpec($;$$);
164
166
  32879 => 'Sony FE 50mm F1.4 GM', #JR
165
167
  32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
166
168
  32885 => 'Sony FE 16-35mm F2.8 GM II', #JR
169
+ 32886 => 'Sony FE 300mm F2.8 OSS', #JR
167
170
 
168
171
  # (comment this out so LensID will report the LensModel, which is more useful)
169
172
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -216,13 +219,22 @@ sub PrintInvLensSpec($;$$);
216
219
  49470 => 'Tamron 28-75mm F2.8 Di III VXD G2', #JR (Model A063)
217
220
  49471 => 'Tamron 50-400mm F4.5-6.3 Di III VC VXD', #JR (Model A067)
218
221
  49472 => 'Tamron 20-40mm F2.8 Di III VXD', #JR (Model A062)
219
-
220
- 49473 => 'Tokina atx-m 85mm F1.8 FE or Viltrox lens', #JR
221
- 49473.1 => 'Viltrox 23mm F1.4 E', #JR
222
- 49473.2 => 'Viltrox 56mm F1.4 E', #JR
222
+ 49473 => 'Tamron 17-50mm F4 Di III VXD or Tokina or Viltrox lens', #JR (Model A068)
223
+ 49473.1 => 'Tokina atx-m 85mm F1.8 FE', #JR
224
+ 49473.2 => 'Viltrox 23mm F1.4 E', #JR
225
+ 49473.3 => 'Viltrox 56mm F1.4 E', #JR
226
+ 49473.4 => 'Viltrox 85mm F1.8 II FE', #JR
223
227
  49474 => 'Tamron 70-180mm F2.8 Di III VXD G2 or Viltrox lens', #JR (Model A065)
224
- 49474.1 => 'Viltrox 23mm F1.4 E', #JR
228
+ 49474.1 => 'Viltrox 13mm F1.4 E',
225
229
  49474.2 => 'Viltrox 16mm F1.8 FE', #JR
230
+ 49474.3 => 'Viltrox 23mm F1.4 E', #JR
231
+ 49474.4 => 'Viltrox 24mm F1.8 FE', #JR
232
+ 49474.5 => 'Viltrox 28mm F1.8 FE', #JR
233
+ 49474.6 => 'Viltrox 33mm F1.4 E', #JR
234
+ 49474.7 => 'Viltrox 35mm F1.8 FE', #JR
235
+ 49474.8 => 'Viltrox 50mm F1.8 FE', #JR
236
+ 49474.9 => 'Viltrox 75mm F1.2 E', #JR
237
+
226
238
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
227
239
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
228
240
  49714 => 'Tokina atx-m 11-18mm F2.8 E', #JR
@@ -273,6 +285,7 @@ sub PrintInvLensSpec($;$$);
273
285
  50538 => 'Sigma 17mm F4 DG DN | C', #JR (023)
274
286
  50539 => 'Sigma 50mm F1.4 DG DN | A', #JR (023)
275
287
  50540 => 'Sigma 14mm F1.4 DG DN | A', #JR (023)
288
+ 50543 => 'Sigma 70-200mm F2.8 DG DN OS | S', #JR (023)
276
289
  50544 => 'Sigma 23mm F1.4 DC DN | C', #JR (023)
277
290
  50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023)
278
291
 
@@ -1630,9 +1643,20 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1630
1643
  # 0x203e - int8u: seen 0, 1, 2, 3, 4 and 255: possibly nr. of detected/tracked faces?
1631
1644
  # 0x203f - int16u
1632
1645
  # 0x2041 - int8u
1633
- # 0x2044 - int32u[2] in ILCE-6700/7CM2/7CR, ILCE-7M4 v1.10, ILCE-7RM5 JPG and ZV-E1:
1634
- # ARW: seen 143360 53248 and 139264 53248
1635
- # JPG: [~filesize] 53248
1646
+ # 0x2044 - int32u[2] offset and size of some unknown data, relative to TIFF header in JPG and ARW - PH
1647
+ 0x2044 => {
1648
+ Name => 'HiddenInfo',
1649
+ SubDirectory => { TagTable => 'Image::ExifTool::Sony::HiddenInfo' },
1650
+ },
1651
+ # 0x2047 - first seen for ILCE-9M3, November 2023
1652
+ # 0x2048 - first seen for ILCE-9M3
1653
+ # 0x2049 - undef[2]
1654
+ 0x204a => { #JR
1655
+ Name => 'FocusLocation2',
1656
+ Writable => 'int16u',
1657
+ Count => 4,
1658
+ NOTES => 'same as FocusLocation within one pixel',
1659
+ },
1636
1660
  0x3000 => {
1637
1661
  Name => 'ShotInfo',
1638
1662
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -1704,7 +1728,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1704
1728
  # 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1/1F/1M2/E10
1705
1729
  # 0x31 (e) for ILCE-1/7M4/7SM3, ILME-FX3
1706
1730
  # 0x32 (e) for ILCE-7RM5, ILME-FX30
1707
- # 0x33 (e) for ILCE-6700, 7CM2, 7CR, ZV-E1
1731
+ # 0x33 (e) for ILCE-6700/7CM2/7CR/9M3, ZV-E1
1708
1732
  # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106, 89, 63 respectively
1709
1733
  {
1710
1734
  Name => 'Tag9400a',
@@ -1826,6 +1850,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1826
1850
  # 0x25 (37) ILCE-7M4
1827
1851
  # 0x26 (38) ILCE-7RM5, ILME-FX30
1828
1852
  # 0x27 (39) ILCE-6700/7CM2/7CR, ZV-E1
1853
+ # 0x28 (40) ILCE-9M3
1829
1854
  # var var SLT-A58/A99V, HV, ILCA-68/77M2/99M2
1830
1855
  # only valid when first byte 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x1c (enciphered 0x8a, 0x70, 0xb6, 0x69, 0x88, 0x20, 0x30, 0xd7, 0xbb, 0x92, 0x28)
1831
1856
  # Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46\x1d\x18\x3a\x95\x24\x26\xd6]\x01/ : $$valPt =~ /^[\x8a\x70\xb6\x69\x88\x20\x30\xd7\xbb\x92\x28]\x01/',
@@ -1904,11 +1929,15 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1904
1929
  Name => 'Tag9406',
1905
1930
  # - first byte must be 0x01 or 0x02 (enciphered 0x01 or 0x08),
1906
1931
  # or 0x03 (enc. 0x1b) for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9/9M2, and ILCA-99M2
1907
- # or 0x04 (enc. 0x40) for ILCE-6700, ZV-E1
1908
1932
  # third byte must be 0x02 or 0x03 (enciphered 0x08 or 0x1b) - ref JR
1909
1933
  # (applies to most SLT/ILCA and NEX/ILCE models, but no DSC models)
1910
- Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s or $$valPt =~ /^[\x40]/s',
1934
+ Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s',
1911
1935
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9406' },
1936
+ },{
1937
+ Name => 'Tag9406b',
1938
+ # - first byte 0x04 (enc. 0x40) for ILCE-6700/7CM2/7CR/9M3, ZV-E1
1939
+ Condition => '$$valPt =~ /^[\x40]/s',
1940
+ SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9406b' },
1912
1941
  },{
1913
1942
  Name => 'Sony_0x9406',
1914
1943
  %unknownCipherData,
@@ -2001,6 +2030,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2001
2030
  '3 3 5 0' => 'ARW 2.3.5', #JR (DSC-HX99)
2002
2031
  '4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
2003
2032
  '4 0 1 0' => 'ARW 4.0.1', #github#195 (ZV-E1)
2033
+ '5 0 0 0' => 'ARW 5.0', # (ILCE-9M3)
2004
2034
  # what about cRAW images?
2005
2035
  },
2006
2036
  },
@@ -2107,6 +2137,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2107
2137
  389 => 'ZV-1F', #IB
2108
2138
  390 => 'ILCE-7RM5', #IB
2109
2139
  391 => 'ILME-FX30', #JR
2140
+ 392 => 'ILCE-9M3', #JR
2110
2141
  393 => 'ZV-E1', #JR
2111
2142
  394 => 'ILCE-6700', #JR
2112
2143
  395 => 'ZV-1M2', #JR
@@ -5929,6 +5960,29 @@ my %faceInfo = (
5929
5960
  # 0x001a, 0x001c appear to be 2 int16u values, meaning unknown
5930
5961
  );
5931
5962
 
5963
+ # hidden information (ref PH)
5964
+ %Image::ExifTool::Sony::HiddenInfo = (
5965
+ %binaryDataAttrs,
5966
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
5967
+ FORMAT => 'int32u',
5968
+ IS_OFFSET => [ 0 ], # tag 0 is 'IsOffset'
5969
+ 0 => {
5970
+ Name => 'HiddenDataOffset',
5971
+ IsOffset => 1,
5972
+ OffsetPair => 1,
5973
+ DataTag => 'HiddenData',
5974
+ WriteGroup => 'MakerNotes',
5975
+ Protectd => 2,
5976
+ },
5977
+ 1 => {
5978
+ Name => 'HiddenDataLength',
5979
+ OffsetPair => 0,
5980
+ DataTag => 'HiddenData',
5981
+ WriteGroup => 'MakerNotes',
5982
+ Protectd => 2,
5983
+ },
5984
+ );
5985
+
5932
5986
  # shot information (ref PH)
5933
5987
  %Image::ExifTool::Sony::ShotInfo = (
5934
5988
  %binaryDataAttrs,
@@ -8397,7 +8451,7 @@ my %isoSetting2010 = (
8397
8451
  },
8398
8452
  0x002a => [{
8399
8453
  Name => 'Quality2',
8400
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8454
+ Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8401
8455
  PrintConv => {
8402
8456
  0 => 'JPEG',
8403
8457
  1 => 'RAW',
@@ -8414,15 +8468,15 @@ my %isoSetting2010 = (
8414
8468
  6 => 'RAW + HEIF',
8415
8469
  },
8416
8470
  }],
8417
- 0x0047 => {
8418
- Name => 'SonyImageHeight',
8419
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8420
- Format => 'int16u',
8421
- PrintConv => '$val > 0 ? 8*$val : "n.a."',
8422
- },
8471
+ # 0x0047 => { # often incorrect, requires 16x for some models
8472
+ # Name => 'SonyImageHeight',
8473
+ # Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8474
+ # Format => 'int16u',
8475
+ # PrintConv => '$val > 0 ? 8*$val : "n.a."',
8476
+ # },
8423
8477
  0x0053 => {
8424
8478
  Name => 'ModelReleaseYear',
8425
- Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8479
+ Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8426
8480
  Format => 'int8u',
8427
8481
  PrintConv => 'sprintf("20%.2d", $val)',
8428
8482
  },
@@ -8461,10 +8515,11 @@ my %isoSetting2010 = (
8461
8515
  FIRST_ENTRY => 0,
8462
8516
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
8463
8517
  DATAMEMBER => [ 0 ],
8464
- IS_SUBDIR => [ 0x03e2, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8518
+ IS_SUBDIR => [ 0x03e2, 0x03f4, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8465
8519
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
8466
8520
 
8467
8521
  0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8522
+ 0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 185', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8468
8523
  0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8469
8524
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8470
8525
  0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -9013,30 +9068,19 @@ my %isoSetting2010 = (
9013
9068
  FORMAT => 'int8u',
9014
9069
  WRITABLE => 1,
9015
9070
  FIRST_ENTRY => 0,
9016
- DATAMEMBER => [ 0 ],
9017
9071
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9018
9072
  # 0x0000: 1 for SLT-A37/A57/A65/A77, NEX-5N/7/F3/VG20
9019
9073
  # 2 for SLT-A58/99V, NEX-3N/5R/5T/6/VG30/VG900, ILCA-68/77M2, ILCE-3000/3500/7/7M2/7R/7S/5000/6000
9020
9074
  # 3 for ILCA-99M2, ILCE-6100/6300/6400/6500/6600/7C/7M3/7M4/7RM2/7RM3/7RM4/7RM5/7SM2/7SM3/9/9M2/1
9021
- # 4 for ILCE-6700/7CM2/7CR, ZV-E1
9022
- 0x0000 => { Name => 'Ver9406', Hidden => 1, RawConv => '$$self{Ver9406} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
9023
9075
  # 0x0001+0x0002: Int16u, seen 580 - 770: similar to "BatteryUnknown" ??
9024
9076
  # 0x0005: int8u, seen 73 - 117: maybe Fahrenheit? Higher than "AmbientTemperature", but same trend.
9025
- # 0x0004: for Ver9406=4: seen 3, 5, 7: when 3 or 7 0x0005 appears valid; when 5, 0x0005 always 0
9026
- 0x0005 => [{
9077
+ 0x0005 => {
9027
9078
  Name => 'BatteryTemperature',
9028
- Condition => '$$self{Ver9406} != 4',
9029
9079
  ValueConv => '($val - 32) / 1.8', # convert to Celsius
9030
9080
  ValueConvInv => '$val * 1.8 + 32',
9031
9081
  PrintConv => 'sprintf("%.1f C",$val)',
9032
9082
  PrintConvInv => '$val=~s/\s*C//; $val',
9033
- },{
9034
- Name => 'BatteryLevel',
9035
- Condition => '$$self{Ver9406} == 4',
9036
- RawConv => '$val ? $val : undef', # only valid when not 0
9037
- PrintConv => '"$val%"',
9038
- PrintConvInv => '$val=~s/\s*\%//; $val',
9039
- }],
9083
+ },
9040
9084
  # 0x0006: usually 0, seen non-zero values only for SLT-A99V, ILCA-77M2/99M2 and ILCE-7/7R/7RM2/9: BatteryLevel Grip ?
9041
9085
  0x0006 => {
9042
9086
  Name => 'BatteryLevelGrip1',
@@ -9047,7 +9091,6 @@ my %isoSetting2010 = (
9047
9091
  # 0x0007: seen values from 8 - 105, decreasing in sequences of images: BatteryLevel
9048
9092
  0x0007 => {
9049
9093
  Name => 'BatteryLevel',
9050
- Condition => '$$self{Ver9406} != 4',
9051
9094
  PrintConv => '"$val%"',
9052
9095
  PrintConvInv => '$val=~s/\s*\%//; $val',
9053
9096
  },
@@ -9066,6 +9109,49 @@ my %isoSetting2010 = (
9066
9109
  # 0x0025: 0 or 1 for other SLT and NEX (0x0022, 0x0023, 0x0024 = 255)
9067
9110
  );
9068
9111
 
9112
+ # Tag9406b (ref JR)
9113
+ %Image::ExifTool::Sony::Tag9406b = (
9114
+ PROCESS_PROC => \&ProcessEnciphered,
9115
+ WRITE_PROC => \&WriteEnciphered,
9116
+ CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9117
+ FORMAT => 'int8u',
9118
+ WRITABLE => 1,
9119
+ FIRST_ENTRY => 0,
9120
+ DATAMEMBER => [ 1, 4, 6 ],
9121
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9122
+ # 0x0000: 4 for ILCE-6700/7CM2/7CR/9M3, ZV-E1
9123
+ 0x0001 => {
9124
+ Name => 'Battery2',
9125
+ Hidden => 1,
9126
+ RawConv => '$$self{Battery2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
9127
+ # 0 for single battery, 1 for 2 batteries
9128
+ },
9129
+ 0x0004 => {
9130
+ Name => 'BatteryStatus1',
9131
+ Hidden => 1,
9132
+ # seen 3, 5, 7: when 3 or 7 0x0005 appears valid; when 5, 0x0005 always 0
9133
+ RawConv => '$$self{BatteryStatus1} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
9134
+ },
9135
+ 0x0005 => {
9136
+ Name => 'BatteryLevel',
9137
+ Condition => '$$self{BatteryStatus1} != 5',
9138
+ PrintConv => '"$val%"',
9139
+ PrintConvInv => '$val=~s/\s*\%//; $val',
9140
+ },
9141
+ 0x0006 => {
9142
+ Name => 'BatteryStatus2',
9143
+ Condition => '$$self{Battery2} == 1',
9144
+ Hidden => 1,
9145
+ RawConv => '$$self{BatteryStatus2} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val',
9146
+ },
9147
+ 0x0007 => {
9148
+ Name => 'BatteryLevel2',
9149
+ Condition => '$$self{Battery2} == 1 and $$self{BatteryStatus2} != 5',
9150
+ PrintConv => '"$val%"',
9151
+ PrintConvInv => '$val=~s/\s*\%//; $val',
9152
+ },
9153
+ );
9154
+
9069
9155
  # Tag940a (ref PH, decoded mainly from A77)
9070
9156
  %Image::ExifTool::Sony::Tag940a = (
9071
9157
  PROCESS_PROC => \&ProcessEnciphered,
@@ -9760,7 +9846,7 @@ my %isoSetting2010 = (
9760
9846
  WRITE_PROC => \&WriteEnciphered,
9761
9847
  CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
9762
9848
  FORMAT => 'int8u',
9763
- NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3, ILME-FX3/FX30, ZV-E1.',
9849
+ NOTES => 'Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1.',
9764
9850
  FIRST_ENTRY => 0,
9765
9851
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
9766
9852
  0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
@@ -9944,7 +10030,7 @@ my %isoSetting2010 = (
9944
10030
  },
9945
10031
  0x08e5 => {
9946
10032
  Name => 'APS-CSizeCapture',
9947
- Condition => '$$self{Model} =~ /^(ILCE-7RM5|ZV-E1)\b/',
10033
+ Condition => '$$self{Model} =~ /^(ILCE-(7CM2|7CR|7RM5)|ZV-E1)\b/',
9948
10034
  PrintConv => {
9949
10035
  0 => 'Off',
9950
10036
  1 => 'On',
@@ -10674,6 +10760,32 @@ my %isoSetting2010 = (
10674
10760
  ValueConv => '$val[1] =~ /^W/i ? -$val[0] : $val[0]',
10675
10761
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
10676
10762
  },
10763
+ HiddenData => {
10764
+ Require => {
10765
+ # (Note: This pointer is fragile in JPEG images, and won't be updated
10766
+ # when the file is written unless the EXIF information is also written, but
10767
+ # an incorrect offset is fixed by subsequently writing EXIF with ExifTool)
10768
+ 0 => 'Sony:HiddenDataOffset',
10769
+ 1 => 'Sony:HiddenDataLength',
10770
+ },
10771
+ Notes => q{
10772
+ hidden data in some Sony JPG and ARW images, extracted only if specifically
10773
+ requested
10774
+ },
10775
+ RawConv => q{
10776
+ my $hdOff = $val[0];
10777
+ my $reqTag = $$self{REQ_TAG_LOOKUP}{hiddendata};
10778
+ my $hDump = $self->Options('HtmlDump');
10779
+ return undef unless $reqTag or $self->Options('Validate') or $hDump;
10780
+ my $dataPt = Image::ExifTool::Sony::ReadHiddenData($self, $hdOff, $val[1]);
10781
+ if ($dataPt and $hDump) {
10782
+ my $msg = '(Sony HiddenData)';
10783
+ $msg .= ' <span class=V>(fixed)</span>' if $hdOff != $val[0];
10784
+ $self->HDump($hdOff, $val[1], $msg, undef, 0x08);
10785
+ }
10786
+ return $reqTag ? $dataPt : undef;
10787
+ },
10788
+ },
10677
10789
  );
10678
10790
 
10679
10791
  # add our composite tags
@@ -10722,6 +10834,34 @@ sub SortLensTypes
10722
10834
  $$minoltaTypes{OTHER} = $other;
10723
10835
  }
10724
10836
 
10837
+ #------------------------------------------------------------------------------
10838
+ # Read HiddenData from JPEG trailer
10839
+ # Inputs: 0) ExifTool ref, 1) HiddenDataOffset (abs), 2) HiddenDataLength
10840
+ # Returns: HiddenData reference, or undef on error
10841
+ # --> updates $hdOff upon return if it was incorrect
10842
+ sub ReadHiddenData($$$)
10843
+ {
10844
+ my ($et, $hdOff, $hdLen) = @_;
10845
+ my $raf = $$et{RAF};
10846
+ my ($buff, $pos);
10847
+ unless ($raf->Seek($hdOff,0) and $raf->Read($buff,$hdLen) == $hdLen and
10848
+ $buff=~/^\x55\x26\x11\x05\0/)
10849
+ {
10850
+ # search the first 4096 bytes of the trailer to find the HiddenData
10851
+ unless ($$et{TrailerStart} and $raf->Seek($$et{TrailerStart},0) and
10852
+ $raf->Read($buff,4096) and $buff=~/\x55\x26\x11\x05\0/g and
10853
+ $pos = $$et{TrailerStart}+pos($buff)-5 and $raf->Seek($pos,0) and
10854
+ $raf->Read($buff,$hdLen) == $hdLen)
10855
+ {
10856
+ $et->Warn('Error reading HiddenData',1);
10857
+ return undef;
10858
+ }
10859
+ $_[1] = $pos; # return fixed offset
10860
+ $et->Warn('Fixed incorrect HiddenDataOffset',1) if $et->Options('Validate') or $$et{IsWriting};
10861
+ }
10862
+ return \$buff;
10863
+ }
10864
+
10725
10865
  #------------------------------------------------------------------------------
10726
10866
  # Process "SONY PIC\0" maker notes (DSC-H200/J10/W370/W510, MHS-TS20, ref PH)
10727
10867
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref