exiftool_vendored 13.38.0 → 13.40.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.
@@ -4,6 +4,7 @@
4
4
  # Description: Read meta information from MS Shell Link files
5
5
  #
6
6
  # Revisions: 2009/09/19 - P. Harvey Created
7
+ # 2025/10/20 - PH Added .URL file support
7
8
  #
8
9
  # References: 1) http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx
9
10
  # 2) http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf
@@ -17,7 +18,7 @@ use vars qw($VERSION);
17
18
  use Image::ExifTool qw(:DataAccess :Utils);
18
19
  use Image::ExifTool::Microsoft;
19
20
 
20
- $VERSION = '1.11';
21
+ $VERSION = '1.12';
21
22
 
22
23
  sub ProcessItemID($$$);
23
24
  sub ProcessLinkInfo($$$);
@@ -447,6 +448,39 @@ sub ProcessLinkInfo($$$);
447
448
  },
448
449
  );
449
450
 
451
+ %Image::ExifTool::LNK::INI = (
452
+ GROUPS => { 2 => 'Document' },
453
+ VARS => { ID_FMT => 'none' },
454
+ NOTES => 'Tags found in INI-format Windows .URL files.',
455
+ URL => { },
456
+ IconFile => { },
457
+ IconIndex => { },
458
+ WorkingDirectory => { },
459
+ HotKey => { },
460
+ ShowCommand => { PrintConv => { 1 => 'Normal', 2 => 'Minimized', 3 => 'Maximized' } },
461
+ Modified => {
462
+ Groups => { 2 => 'Time' },
463
+ Format => 'int64u',
464
+ Groups => { 2 => 'Time' },
465
+ # convert time from 100-ns intervals since Jan 1, 1601 (NC)
466
+ RawConv => q{
467
+ my $dat = pack('H*', $val);
468
+ return undef if length $dat < 8;
469
+ my ($lo, $hi) = unpack('V2', $dat);
470
+ return undef unless $lo or $hi;
471
+ return $hi * 4294967296 + $lo;
472
+ },
473
+ ValueConv => '$val=$val/1e7-11644473600; ConvertUnixTime($val,1)',
474
+ PrintConv => '$self->ConvertDateTime($val)',
475
+ },
476
+ Author => { Groups => { 2 => 'Author' } },
477
+ WhatsNew => { },
478
+ Comment => { },
479
+ Desc => { },
480
+ Roamed => { Notes => '1 if synced across multiple devices' },
481
+ IDList => { },
482
+ );
483
+
450
484
  #------------------------------------------------------------------------------
451
485
  # Extract null-terminated ASCII or Unicode string from buffer
452
486
  # Inputs: 0) buffer ref, 1) start position, 2) flag for unicode string
@@ -588,6 +622,27 @@ sub ProcessLinkInfo($$$)
588
622
  return 1;
589
623
  }
590
624
 
625
+ #------------------------------------------------------------------------------
626
+ # Extract information from a INI-format file
627
+ # Inputs: 0) ExifTool object reference, 1) dirInfo reference
628
+ # Returns: 1 on success, 0 if this wasn't a valid INI file
629
+ sub ProcessINI($$)
630
+ {
631
+ my ($et, $dirInfo) = @_;
632
+ my $raf = $$dirInfo{RAF};
633
+ my $buff;
634
+ local $/ = "\x0d\x0a";
635
+ my $tagTablePtr = GetTagTable('Image::ExifTool::LNK::INI');
636
+ while ($raf->ReadLine($buff)) {
637
+ if ($buff =~ /^\[(.*?)\]/) {
638
+ $et->VPrint(0, "$1 section:\n");
639
+ } elsif ($buff =~ /^\s*(\w+)=(.*)\x0d\x0a$/) {
640
+ $et->HandleTag($tagTablePtr, $1, $2, MakeTagInfo => 1);
641
+ }
642
+ }
643
+ return 1;
644
+ }
645
+
591
646
  #------------------------------------------------------------------------------
592
647
  # Extract information from a MS Shell Link (Windows shortcut) file
593
648
  # Inputs: 0) ExifTool object reference, 1) dirInfo reference
@@ -600,7 +655,13 @@ sub ProcessLNK($$)
600
655
 
601
656
  # read LNK file header
602
657
  $raf->Read($buff, 0x4c) == 0x4c or return 0;
603
- $buff =~ /^.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46/s or return 0;
658
+ unless ($buff =~ /^.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46/s) {
659
+ # check for INI-format LNK file (eg. .URL file)
660
+ return undef unless $buff =~ /^\[[InternetShortcut\][\x0d\x0a]/;
661
+ $raf->Seek(0,0) or return 0;
662
+ $et->SetFileType('URL', 'application/x-mswinurl');
663
+ return ProcessINI($et, $dirInfo);
664
+ };
604
665
  $len = unpack('V', $buff);
605
666
  $len >= 0x4c or return 0;
606
667
  if ($len > 0x4c) {
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
14
14
  use Image::ExifTool::XMP;
15
15
  use Image::ExifTool::ZIP;
16
16
 
17
- $VERSION = '1.09';
17
+ $VERSION = '1.10';
18
18
 
19
19
  # test for recognized OOXML document extensions
20
20
  my %isOOXML = (
@@ -27,6 +27,7 @@ my %isOOXML = (
27
27
  XLAM => 1,
28
28
  XLSX => 1, XLSM => 1, XLSB => 1,
29
29
  XLTX => 1, XLTM => 1,
30
+ VSDX => 1,
30
31
  );
31
32
 
32
33
  # generate reverse lookup for file type based on MIME
@@ -57,7 +58,7 @@ my @vectorVals;
57
58
  VARS => { ID_FMT => 'none' },
58
59
  NOTES => q{
59
60
  The Office Open XML (OOXML) format was introduced with Microsoft Office 2007
60
- and is used by file types such as DOCX, PPTX and XLSX. These are
61
+ and is used by file types such as DOCX, PPTX, XLSX and VSDX. These are
61
62
  essentially ZIP archives containing XML files. The table below lists some
62
63
  tags which have been observed in OOXML documents, but ExifTool will extract
63
64
  any tags found from XML files of the OOXML document properties ("docProps")
@@ -31,6 +31,7 @@
31
31
  # 25) Karsten Gieselmann private communication (OM series)
32
32
  # IB) Iliah Borg private communication (LibRaw)
33
33
  # NJ) Niels Kristian Bech Jensen private communication
34
+ # KG) Karsten Gieselmann private communication
34
35
  #------------------------------------------------------------------------------
35
36
 
36
37
  package Image::ExifTool::Olympus;
@@ -41,7 +42,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
41
42
  use Image::ExifTool::Exif;
42
43
  use Image::ExifTool::APP12;
43
44
 
44
- $VERSION = '2.91';
45
+ $VERSION = '2.92';
45
46
 
46
47
  sub PrintLensInfo($$$);
47
48
 
@@ -201,6 +202,7 @@ my %olympusLensTypes = (
201
202
  # Other makes
202
203
  '24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka
203
204
  'f7 03 10' => 'LAOWA C&D-Dreamer MFT 7.5mm F2.0', #forum3833
205
+ 'f7 10 10' => 'LAOWA C&D-Dreamer MFT 6.0mm F2.0', #KG
204
206
  );
205
207
 
206
208
  # lookup for Olympus camera types (ref PH)
@@ -59,7 +59,7 @@ use Image::ExifTool::Exif;
59
59
  use Image::ExifTool::GPS;
60
60
  use Image::ExifTool::HP;
61
61
 
62
- $VERSION = '3.58';
62
+ $VERSION = '3.59';
63
63
 
64
64
  sub CryptShutterCount($$);
65
65
  sub PrintFilter($$$);
@@ -1947,7 +1947,8 @@ my %binaryDataAttrs = (
1947
1947
  '0 28' => 'Quick Macro', # (Q)
1948
1948
  '0 29' => 'Forest', # (Q)
1949
1949
  '0 30' => 'Backlight Silhouette', # (Q)
1950
- '0 32' => 'DOF', #PH (GR III)
1950
+ '0 31' => 'Max. Aperture Priority', #KG (Ricoh GR III)
1951
+ '0 32' => 'DOF', #PH (GR III) #KG ???? GR III 'DOF Priority (Deep)' is mapped to '0 2' ???
1951
1952
  # AUTO PICT modes (auto-selected)
1952
1953
  '1 4' => 'Auto PICT (Standard)', #13
1953
1954
  '1 5' => 'Auto PICT (Portrait)', #7 (K100D)
@@ -1962,7 +1963,11 @@ my %binaryDataAttrs = (
1962
1963
  '2 22' => 'Shallow DOF (HyP)', #PH (K-5)
1963
1964
  '3 0' => 'Green Mode', #16
1964
1965
  '4 0' => 'Shutter Speed Priority',
1966
+ '4 2' => 'Shutter Speed Priority 2', #KG Coding error? 'DOF Priority' in Tv makes no sense
1967
+ '4 31' => 'Shutter Speed Priority 31',#KG Coding error? 'Max Aperture' in Tv makes no sense
1965
1968
  '5 0' => 'Aperture Priority',
1969
+ '5 2' => 'Aperture Priority 2', #KG Coding error? 'DOF Priority' in Av makes no sense
1970
+ '5 31' => 'Aperture Priority 31', #KG Coding error? 'DOF Priority' in Av makes no sense
1966
1971
  '6 0' => 'Program Tv Shift',
1967
1972
  '7 0' => 'Program Av Shift', #19
1968
1973
  '8 0' => 'Manual',
@@ -49,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
49
49
  use Image::ExifTool::Exif;
50
50
  use Image::ExifTool::GPS;
51
51
 
52
- $VERSION = '3.21';
52
+ $VERSION = '3.22';
53
53
 
54
54
  sub ProcessMOV($$;$);
55
55
  sub ProcessKeys($$$);
@@ -10515,9 +10515,9 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
10515
10515
  $et->Warn($warnStr);
10516
10516
  }
10517
10517
  }
10518
- # tweak file type based on track content ("iso*" and "dash" ftyp only)
10518
+ # tweak file type based on track content ("iso*" and "dash" ftyp only ["mp42" added in 13.39])
10519
10519
  if ($topLevel and $$et{FileType} and $$et{FileType} eq 'MP4' and
10520
- $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
10520
+ $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash|mp42)/ and
10521
10521
  $$et{HasHandler}{soun} and not $$et{HasHandler}{vide})
10522
10522
  {
10523
10523
  $et->OverrideFileType('M4A', 'audio/mp4');
@@ -111,7 +111,7 @@ my %insvLimit = (
111
111
  The tags below are extracted from timed metadata in QuickTime and other
112
112
  formats of video files when the ExtractEmbedded option is used. Although
113
113
  most of these tags are combined into the single table below, ExifTool
114
- currently reads 111 different types of timed GPS metadata from video files.
114
+ currently reads 116 different types of timed GPS metadata from video files.
115
115
  },
116
116
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
117
117
  GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
@@ -1006,6 +1006,28 @@ sub HandleTextTags($$$)
1006
1006
  undef %$tags; # clear the hash
1007
1007
  }
1008
1008
 
1009
+ #------------------------------------------------------------------------------
1010
+ # Handle new time in NMEA stream and store queued tags if necessary
1011
+ # Inputs: 0) ExifTool ref, 1) time string, 2) tag table ref, 3) tags hash
1012
+ sub HandleNewTime($$$$)
1013
+ {
1014
+ my ($et, $time, $tagTbl, $tags) = @_;
1015
+ if ($$et{LastTime}) {
1016
+ if ($$et{LastTime} eq $time) {
1017
+ # combine with the previous NMEA sentence
1018
+ $$et{DOC_NUM} = $$et{LastDoc};
1019
+ } elsif (%$tags) {
1020
+ # handle existing tags and start a new document
1021
+ # (see https://exiftool.org/forum/index.php?msg=75422)
1022
+ HandleTextTags($et, $tagTbl, $tags);
1023
+ # increment document number and update document count if necessary
1024
+ $$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
1025
+ }
1026
+ }
1027
+ $$et{LastTime} = $time;
1028
+ $$et{LastDoc} = $$et{DOC_NUM};
1029
+ }
1030
+
1009
1031
  #------------------------------------------------------------------------------
1010
1032
  # Process subtitle 'text'
1011
1033
  # Inputs: 0) ExifTool ref, 1) data ref or dirInfo ref, 2) tag table ref
@@ -1032,41 +1054,18 @@ sub Process_text($$$;$)
1032
1054
  next;
1033
1055
  }
1034
1056
  my $time = "$1:$2:$3";
1035
- if ($$et{LastTime}) {
1036
- if ($$et{LastTime} eq $time) {
1037
- # combine with the previous NMEA sentence
1038
- $$et{DOC_NUM} = $$et{LastDoc};
1039
- } elsif (%tags) {
1040
- # handle existing tags and start a new document
1041
- # (see https://exiftool.org/forum/index.php?msg=75422)
1042
- HandleTextTags($et, $tagTbl, \%tags);
1043
- undef %tags;
1044
- # increment document number and update document count if necessary
1045
- $$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
1046
- }
1047
- }
1048
- $$et{LastTime} = $time;
1049
- $$et{LastDoc} = $$et{DOC_NUM};
1057
+ HandleNewTime($et, $time, $tagTbl, \%tags);
1050
1058
  my $year = $14 + ($14 >= 70 ? 1900 : 2000);
1051
- my $dateTime = sprintf('%.4d:%.2d:%.2d %sZ', $year, $13, $12, $time);
1052
- $tags{GPSDateTime} = $dateTime;
1059
+ my $date = sprintf('%.4d:%.2d:%.2d', $year, $13, $12);
1060
+ $$et{LastDate} = $date;
1061
+ $tags{GPSDateTime} = "$date ${time}Z";
1053
1062
  $tags{GPSLatitude} = (($4 || 0) + $5/60) * ($6 eq 'N' ? 1 : -1);
1054
1063
  $tags{GPSLongitude} = (($7 || 0) + $8/60) * ($9 eq 'E' ? 1 : -1);
1055
1064
  $tags{GPSSpeed} = $10 * $knotsToKph if length $10;
1056
1065
  $tags{GPSTrack} = $11 if length $11;
1057
1066
  } elsif ($tag =~ /^[A-Z]{2}GGA$/ and $dat =~ /^,(\d{2})(\d{2})(\d+(?:\.\d*)?),(\d*?)(\d{1,2}\.\d+),([NS]),(\d*?)(\d{1,2}\.\d+),([EW]),[1-6]?,(\d+)?,(\.\d+|\d+\.?\d*)?,(-?\d+\.?\d*)?,M?/s) {
1058
1067
  my $time = "$1:$2:$3";
1059
- if ($$et{LastTime}) {
1060
- if ($$et{LastTime} eq $time) {
1061
- $$et{DOC_NUM} = $$et{LastDoc};
1062
- } elsif (%tags) {
1063
- HandleTextTags($et, $tagTbl, \%tags);
1064
- undef %tags;
1065
- $$et{DOC_COUNT} < ++$$et{DOC_NUM} and $$et{DOC_COUNT} = $$et{DOC_NUM};
1066
- }
1067
- }
1068
- $$et{LastTime} = $time;
1069
- $$et{LastDoc} = $$et{DOC_NUM};
1068
+ HandleNewTime($et, $time, $tagTbl, \%tags);
1070
1069
  $tags{GPSTimeStamp} = $time;
1071
1070
  $tags{GPSLatitude} = (($4 || 0) + $5/60) * ($6 eq 'N' ? 1 : -1);
1072
1071
  $tags{GPSLongitude} = (($7 || 0) + $8/60) * ($9 eq 'E' ? 1 : -1);
@@ -1114,6 +1113,11 @@ sub Process_text($$$;$)
1114
1113
  }
1115
1114
  }
1116
1115
  }
1116
+ if ($tags{GPSTimeStamp} and not $tags{GPSDateTime} and $$et{LastDate}) {
1117
+ # hack to fill in missing date for NextBase 662GW
1118
+ # (note: this doesn't necessarily handle day rollover properly)
1119
+ $tags{GPSDateTime} = "$$et{LastDate} $tags{GPSTimeStamp}Z";
1120
+ }
1117
1121
  HandleTextTags($et, $tagTbl, \%tags);
1118
1122
  return;
1119
1123
  }
@@ -3490,14 +3494,17 @@ sub ProcessGarminGPS($$$)
3490
3494
  while ($pos + 20 <= $dataLen) {
3491
3495
  $$et{DOC_NUM} = ++$$et{DOC_COUNT};
3492
3496
  my $time = Image::ExifTool::ConvertUnixTime(Get32u($dataPt, $pos) - $epoch) . 'Z';
3493
- my $lat = Get32s($dataPt, $pos + 12) * $scl;
3494
- my $lon = Get32s($dataPt, $pos + 16) * $scl;
3497
+ my $lat = Get32s($dataPt, $pos + 12);
3498
+ my $lon = Get32s($dataPt, $pos + 16);
3495
3499
  my $spd = Get16u($dataPt, $pos + 4); # (in mph)
3496
3500
  $et->HandleTag($tagTbl, 'GPSDateTime', $time);
3497
- $et->HandleTag($tagTbl, 'GPSLatitude', $lat);
3498
- $et->HandleTag($tagTbl, 'GPSLongitude', $lon);
3499
- $et->HandleTag($tagTbl, 'GPSSpeed', $spd);
3500
- $et->HandleTag($tagTbl, 'GPSSpeedRef', 'M');
3501
+ # skip bad GPS fixes
3502
+ if ($lat != -2147483648 or $lon != -2147483648) {
3503
+ $et->HandleTag($tagTbl, 'GPSLatitude', $lat * $scl);
3504
+ $et->HandleTag($tagTbl, 'GPSLongitude', $lon * $scl);
3505
+ $et->HandleTag($tagTbl, 'GPSSpeed', $spd);
3506
+ $et->HandleTag($tagTbl, 'GPSSpeedRef', 'M');
3507
+ }
3501
3508
  $pos += 20;
3502
3509
  }
3503
3510
  delete $$et{DOC_NUM};
@@ -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.78';
37
+ $VERSION = '3.79';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -180,6 +180,9 @@ sub PrintInvLensSpec($;$$);
180
180
  32889 => 'Sony FE 28-70mm F2 GM',
181
181
  32890 => 'Sony FE 400-800mm F6.3-8 G OSS', #JR
182
182
  32891 => 'Sony FE 50-150mm F2 GM', #github335
183
+ 32893 => 'Sony FE 100mm F2.8 Macro GM OSS', #JR
184
+ 33093 => 'Sony FE 100mm F2.8 Macro GM OSS + 1.4X Teleconverter', #JR (NC)
185
+ 33094 => 'Sony FE 100mm F2.8 Macro GM OSS + 2X Teleconverter', #JR
183
186
 
184
187
  # (comment this out so LensID will report the LensModel, which is more useful)
185
188
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -1135,7 +1138,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
1135
1138
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' },
1136
1139
  },{
1137
1140
  Name => 'Tag2010i', # ?
1138
- Condition => '$$self{Model} =~ /^(ILCE-(6100A?|6400A?|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX95|HX99|RX0M2)|ZV-(1F?|1M2|E10))\b/',
1141
+ Condition => '$$self{Model} =~ /^(ILCE-(6100A?|6400A?|6600|7C|7M3|7RM3A?|7RM4A?|9|9M2)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7A?|HX95|HX99|RX0M2)|ZV-(1[AF]?|1M2|E10))\b/',
1139
1142
  SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' },
1140
1143
  },{
1141
1144
  Name => 'Tag_0x2010',
@@ -2209,8 +2212,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2209
2212
  400 => 'ILCE-1M2', #PH
2210
2213
  401 => 'DSC-RX1RM3', #JR
2211
2214
  402 => 'ILCE-6400A', #github347
2215
+ 403 => 'ILCE-6100A', #JR
2212
2216
  404 => 'DSC-RX100M7A', #github347
2213
2217
  406 => 'ILME-FX2', #JR
2218
+ 408 => 'ZV-1A', #JR
2214
2219
  },
2215
2220
  },
2216
2221
  0xb020 => { #2
@@ -8525,7 +8530,7 @@ my %isoSetting2010 = (
8525
8530
  },
8526
8531
  0x002a => [{
8527
8532
  Name => 'Quality2',
8528
- Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|1M2|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|FX3|FX30)|ZV-(E1|E10M2))\b/',
8533
+ Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|1M2|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|FX3A?|FX30)|ZV-(E1|E10M2))\b/',
8529
8534
  PrintConv => {
8530
8535
  0 => 'JPEG',
8531
8536
  1 => 'RAW',
@@ -8544,13 +8549,13 @@ my %isoSetting2010 = (
8544
8549
  }],
8545
8550
  # 0x0047 => { # often incorrect, requires 16x for some models
8546
8551
  # Name => 'SonyImageHeight',
8547
- # Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3|FX30)|ZV-E1)\b/',
8552
+ # Condition => '$$self{Model} !~ /^(ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX3A?|FX30)|ZV-E1)\b/',
8548
8553
  # Format => 'int16u',
8549
8554
  # PrintConv => '$val > 0 ? 8*$val : "n.a."',
8550
8555
  # },
8551
8556
  0x0053 => {
8552
8557
  Name => 'ModelReleaseYear',
8553
- Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|FX3|FX30)|ZV-(E1|E10M2))\b/',
8558
+ Condition => '$$self{Model} !~ /^(DSC-RX1RM3|ILCE-(1|6700|7CM2|7CR|7M4|7RM5|7SM3|9M3)|ILME-(FX2|FX3A?|FX30)|ZV-(E1|E10M2))\b/',
8554
8559
  Format => 'int8u',
8555
8560
  PrintConv => 'sprintf("20%.2d", $val)',
8556
8561
  },
@@ -8572,7 +8577,7 @@ my %isoSetting2010 = (
8572
8577
  },
8573
8578
  0x013f => {
8574
8579
  Name => 'ShutterType',
8575
- Condition => '$$self{Model} =~ /^(DSC-RX100M7|ZV-(1|1F|1M2))\b/',
8580
+ Condition => '$$self{Model} =~ /^(DSC-RX100M7A?|ZV-(1A?|1F|1M2))\b/',
8576
8581
  PrintConv => {
8577
8582
  7 => 'Electronic',
8578
8583
  23 => 'Mechanical',
@@ -10087,7 +10092,7 @@ my %isoSetting2010 = (
10087
10092
  },
10088
10093
  0x088f => {
10089
10094
  Name => 'VignettingCorrParams',
10090
- Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
10095
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3A?)\b/',
10091
10096
  Format => 'int16s[16]',
10092
10097
  },
10093
10098
  0x0891 => {
@@ -10102,7 +10107,7 @@ my %isoSetting2010 = (
10102
10107
  },
10103
10108
  0x08b5 => {
10104
10109
  Name => 'APS-CSizeCapture',
10105
- Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
10110
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3A?)\b/',
10106
10111
  PrintConv => {
10107
10112
  0 => 'Off',
10108
10113
  1 => 'On',
@@ -10126,7 +10131,7 @@ my %isoSetting2010 = (
10126
10131
  },
10127
10132
  0x0914 => {
10128
10133
  Name => 'ChromaticAberrationCorrParams',
10129
- Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
10134
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3A?)\b/',
10130
10135
  Format => 'int16s[32]',
10131
10136
  },
10132
10137
  0x0916 => {
@@ -992,6 +992,8 @@ my %tagLookup = (
992
992
  'aggregationtype' => { 554 => 'aggregationType' },
993
993
  'agreement' => { 557 => 'agreement' },
994
994
  'ah2greeninterpolationthreshold' => { 155 => 0xe4e },
995
+ 'aipromptinformation' => { 548 => 'AIPromptInformation' },
996
+ 'aipromptwritername' => { 548 => 'AIPromptWriterName' },
995
997
  'airplanemode' => { 260 => 0x9c0, 263 => 0x722, 264 => 0x782, 265 => 0x624, 266 => 0x654, 267 => 0x6bc },
996
998
  'aiservocontinuousshooting' => { 89 => 0x15 },
997
999
  'aiservofirstimage' => { 2 => 0x5 },
@@ -1002,6 +1004,8 @@ my %tagLookup = (
1002
1004
  'aiservotrackingmethod' => { 90 => 0x504 },
1003
1005
  'aiservotrackingsensitivity' => { 89 => 0x14, 90 => 0x502 },
1004
1006
  'aisubjecttrackingmode' => { 345 => 0x309 },
1007
+ 'aisystemused' => { 548 => 'AISystemUsed' },
1008
+ 'aisystemversionused' => { 548 => 'AISystemVersionUsed' },
1005
1009
  'album' => { 427 => ['albm',"\xa9alb"], 429 => 'album', 435 => ['albm',"\xa9alb"], 564 => 'album' },
1006
1010
  'albumartist' => { 196 => 'WM/AlbumArtist', 427 => 'aART', 435 => 'albr' },
1007
1011
  'albumcoverurl' => { 196 => 'WM/AlbumCoverURL' },
@@ -8981,6 +8985,11 @@ my %tagExists = (
8981
8985
  'creatoros' => 1,
8982
8986
  'creatorsoftware' => 1,
8983
8987
  'creatorversion' => 1,
8988
+ 'creditclass' => 1,
8989
+ 'creditdir' => 1,
8990
+ 'creditname' => 1,
8991
+ 'creditrole' => 1,
8992
+ 'crediturl' => 1,
8984
8993
  'crgbtoerimm0spline' => 1,
8985
8994
  'crgbtoerimm1spline' => 1,
8986
8995
  'crgbtoerimm2spline' => 1,
@@ -9201,7 +9210,9 @@ my %tagExists = (
9201
9210
  'depthswheight' => 1,
9202
9211
  'depthswwidth' => 1,
9203
9212
  'derivedimageref' => 1,
9213
+ 'desc' => 1,
9204
9214
  'descender' => 1,
9215
+ 'descriptionurl' => 1,
9205
9216
  'designer' => 1,
9206
9217
  'designerurl' => 1,
9207
9218
  'desiredreproductions' => 1,
@@ -9555,6 +9566,10 @@ my %tagExists = (
9555
9566
  'extensionclassid' => 1,
9556
9567
  'extensioncreatedate' => 1,
9557
9568
  'extensiondescription' => 1,
9569
+ 'extensionid' => 1,
9570
+ 'extensionitemid' => 1,
9571
+ 'extensionitemname' => 1,
9572
+ 'extensionitemvalue' => 1,
9558
9573
  'extensionmodifydate' => 1,
9559
9574
  'extensionname' => 1,
9560
9575
  'extensionpersistence' => 1,
@@ -10187,6 +10202,7 @@ my %tagExists = (
10187
10202
  'icingdetected' => 1,
10188
10203
  'icondir' => 1,
10189
10204
  'iconenvdata' => 1,
10205
+ 'iconfile' => 1,
10190
10206
  'iconfilename' => 1,
10191
10207
  'iconindex' => 1,
10192
10208
  'ics' => 1,
@@ -10205,6 +10221,7 @@ my %tagExists = (
10205
10221
  'idependentanddisposablesamples' => 1,
10206
10222
  'idlesequence' => 1,
10207
10223
  'idletiming' => 1,
10224
+ 'idlist' => 1,
10208
10225
  'idsbasevalue' => 1,
10209
10226
  'idstring' => 1,
10210
10227
  'ifd0' => 1,
@@ -10692,7 +10709,10 @@ my %tagExists = (
10692
10709
  'levelinfok3iii' => 1,
10693
10710
  'libraryid' => 1,
10694
10711
  'libraryname' => 1,
10712
+ 'licenseeclass' => 1,
10713
+ 'licenseedir' => 1,
10695
10714
  'licenseinfourl' => 1,
10715
+ 'licenseurl' => 1,
10696
10716
  'lightingopt' => 1,
10697
10717
  'lightness' => 1,
10698
10718
  'lightroomworkflow' => 1,
@@ -11156,6 +11176,7 @@ my %tagExists = (
11156
11176
  'modenumber' => 1,
11157
11177
  'modificationnumber' => 1,
11158
11178
  'modificationpermissions' => 1,
11179
+ 'modified' => 1,
11159
11180
  'modifiedby' => 1,
11160
11181
  'modifiedinfo' => 1,
11161
11182
  'moiversion' => 1,
@@ -12211,6 +12232,7 @@ my %tagExists = (
12211
12232
  'rjmd' => 1,
12212
12233
  'rmeta' => 1,
12213
12234
  'rnoiselines' => 1,
12235
+ 'roamed' => 1,
12214
12236
  'robots' => 1,
12215
12237
  'rocinfo' => 1,
12216
12238
  'roidescription' => 1,
@@ -12505,6 +12527,7 @@ my %tagExists = (
12505
12527
  'shotinfoz9' => 1,
12506
12528
  'shotlogdatatext' => 1,
12507
12529
  'shotparamstext' => 1,
12530
+ 'showcommand' => 1,
12508
12531
  'showmode' => 1,
12509
12532
  'showobjects' => 1,
12510
12533
  'shutterangle' => 1,
@@ -13229,6 +13252,8 @@ my %tagExists = (
13229
13252
  'vddimdacnominalvalues' => 1,
13230
13253
  'vegasversionmajor' => 1,
13231
13254
  'vegasversionminor' => 1,
13255
+ 'vendorclass' => 1,
13256
+ 'vendordir' => 1,
13232
13257
  'vendorid' => 1,
13233
13258
  'vendorname' => 1,
13234
13259
  'vendorurl' => 1,
@@ -13410,6 +13435,7 @@ my %tagExists = (
13410
13435
  'webpage' => 1,
13411
13436
  'weight' => 1,
13412
13437
  'what3words' => 1,
13438
+ 'whatsnew' => 1,
13413
13439
  'whitebalancematching' => 1,
13414
13440
  'whitebalancergb' => 1,
13415
13441
  'whitebalancetable' => 1,
@@ -13454,6 +13480,7 @@ my %tagExists = (
13454
13480
  'wmcontentid' => 1,
13455
13481
  'wmshadowfilesourcedrmtype' => 1,
13456
13482
  'wmshadowfilesourcefiletype' => 1,
13483
+ 'woffversion' => 1,
13457
13484
  'word97' => 1,
13458
13485
  'worddocument' => 1,
13459
13486
  'words' => 1,