exiftool-vendored.pl 12.69.0 → 12.72.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 (48) hide show
  1. package/bin/Changes +78 -12
  2. package/bin/MANIFEST +5 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +10 -10
  6. package/bin/exiftool +32 -25
  7. package/bin/lib/Image/ExifTool/AAC.pm +175 -0
  8. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +2 -1
  9. package/bin/lib/Image/ExifTool/CBOR.pm +18 -2
  10. package/bin/lib/Image/ExifTool/Canon.pm +82 -20
  11. package/bin/lib/Image/ExifTool/DJI.pm +3 -2
  12. package/bin/lib/Image/ExifTool/EXE.pm +54 -6
  13. package/bin/lib/Image/ExifTool/Exif.pm +111 -11
  14. package/bin/lib/Image/ExifTool/FujiFilm.pm +145 -20
  15. package/bin/lib/Image/ExifTool/GIF.pm +5 -1
  16. package/bin/lib/Image/ExifTool/GoPro.pm +16 -1
  17. package/bin/lib/Image/ExifTool/ID3.pm +76 -10
  18. package/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  19. package/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  20. package/bin/lib/Image/ExifTool/JSON.pm +4 -1
  21. package/bin/lib/Image/ExifTool/Jpeg2000.pm +30 -15
  22. package/bin/lib/Image/ExifTool/M2TS.pm +21 -16
  23. package/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  24. package/bin/lib/Image/ExifTool/Nikon.pm +203 -102
  25. package/bin/lib/Image/ExifTool/Olympus.pm +7 -1
  26. package/bin/lib/Image/ExifTool/PNG.pm +8 -13
  27. package/bin/lib/Image/ExifTool/Panasonic.pm +10 -1
  28. package/bin/lib/Image/ExifTool/Pentax.pm +15 -6
  29. package/bin/lib/Image/ExifTool/QuickTime.pm +59 -13
  30. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +59 -11
  31. package/bin/lib/Image/ExifTool/README +7 -2
  32. package/bin/lib/Image/ExifTool/RIFF.pm +53 -9
  33. package/bin/lib/Image/ExifTool/Ricoh.pm +109 -1
  34. package/bin/lib/Image/ExifTool/Samsung.pm +3 -2
  35. package/bin/lib/Image/ExifTool/Sony.pm +177 -37
  36. package/bin/lib/Image/ExifTool/TagLookup.pm +6961 -6856
  37. package/bin/lib/Image/ExifTool/TagNames.pod +580 -344
  38. package/bin/lib/Image/ExifTool/Text.pm +4 -5
  39. package/bin/lib/Image/ExifTool/Validate.pm +6 -5
  40. package/bin/lib/Image/ExifTool/WriteExif.pl +19 -4
  41. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -0
  42. package/bin/lib/Image/ExifTool/WriteRIFF.pl +9 -3
  43. package/bin/lib/Image/ExifTool/Writer.pl +102 -50
  44. package/bin/lib/Image/ExifTool.pm +74 -36
  45. package/bin/lib/Image/ExifTool.pod +28 -17
  46. package/bin/perl-Image-ExifTool.spec +9 -9
  47. package/bin/pp_build_exe.args +5 -4
  48. package/package.json +4 -5
@@ -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