summaryrefslogtreecommitdiff
path: root/lib/Image
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Image')
-rw-r--r--lib/Image/ExifTool.pm21
-rw-r--r--lib/Image/ExifTool.pod7
-rw-r--r--lib/Image/ExifTool/DjVu.pm11
-rw-r--r--lib/Image/ExifTool/FujiFilm.pm26
-rw-r--r--lib/Image/ExifTool/Jpeg2000.pm90
-rw-r--r--lib/Image/ExifTool/MacOS.pm2
-rw-r--r--lib/Image/ExifTool/Microsoft.pm4
-rw-r--r--lib/Image/ExifTool/Panasonic.pm15
-rw-r--r--lib/Image/ExifTool/PhaseOne.pm7
-rw-r--r--lib/Image/ExifTool/Sony.pm110
-rw-r--r--lib/Image/ExifTool/TagLookup.pm34
-rw-r--r--lib/Image/ExifTool/TagNames.pod41
-rw-r--r--lib/Image/ExifTool/Writer.pl1
13 files changed, 270 insertions, 99 deletions
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm
index 5325f10e..9f3aedfa 100644
--- a/lib/Image/ExifTool.pm
+++ b/lib/Image/ExifTool.pm
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
%mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
%jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
-$VERSION = '12.23';
+$VERSION = '12.24';
$RELEASE = '';
@ISA = qw(Exporter);
%EXPORT_TAGS = (
@@ -189,19 +189,19 @@ $defaultLang = 'en'; # default language
FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF LFP
HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2
CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS
- MacOS PHP PCX DCX DWF DWG WTV Torrent VCard LRI R3D AA PDB MOI
- ISO ALIAS JSON MP3 DICOM PCD TXT);
+ MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA PDB
+ JXL MOI ISO ALIAS JSON MP3 DICOM PCD TXT);
# file types that we can write (edit)
my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
- X3F PS PDF ICC VRD DR4 JP2 EXIF AI AIT IND MOV EXV FLIF);
+ X3F PS PDF ICC VRD DR4 JP2 JXL EXIF AI AIT IND MOV EXV FLIF);
my %writeTypes; # lookup for writable file types (hash filled if required)
# file extensions that we can't write for various base types
%noWriteFile = (
TIFF => [ qw(3FR DCR K25 KDC SRF) ],
XMP => [ qw(SVG INX) ],
- JP2 => [ qw(J2C JPC JXC) ],
+ JP2 => [ qw(J2C JPC) ],
MOV => [ qw(INSV) ],
);
@@ -292,6 +292,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
DWF => ['DWF', 'Autodesk drawing (Design Web Format)'],
DWG => ['DWG', 'AutoCAD Drawing'],
DYLIB=> ['EXE', 'Mach-O Dynamic Link Library'],
+ DXF => ['DXF', 'AutoCAD Drawing Exchange Format'],
EIP => ['ZIP', 'Capture One Enhanced Image Package'],
EPS => ['EPS', 'Encapsulated PostScript Format'],
EPS2 => 'EPS',
@@ -355,8 +356,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
JPM => ['JP2', 'JPEG 2000 compound image'],
JPX => ['JP2', 'JPEG 2000 with extensions'],
JSON => ['JSON', 'JavaScript Object Notation'],
- JXC => ['JP2', 'JPEG XL Codestream'], # (JXC = PH invention, not a real extension)
- JXL => ['JP2', 'JPEG XL'],
+ JXL => ['JXL', 'JPEG XL'],
JXR => ['TIFF', 'JPEG XR'],
K25 => ['TIFF', 'Kodak DC25 RAW'],
KDC => ['TIFF', 'Kodak Digital Camera RAW'],
@@ -617,6 +617,7 @@ my %fileDescription = (
'DVR-MS' => 'video/x-ms-dvr',
DWF => 'model/vnd.dwf',
DWG => 'image/vnd.dwg',
+ DXF => 'application/dxf',
EIP => 'application/x-captureone', #(NC)
EPS => 'application/postscript',
ERF => 'image/x-epson-erf',
@@ -654,7 +655,6 @@ my %fileDescription = (
JPM => 'image/jpm',
JPX => 'image/jpx',
JSON => 'application/json',
- JXC => 'image/x-jxc', #PH (invented)
JXL => 'image/jxl', #PH (NC)
JXR => 'image/jxr',
K25 => 'image/x-kodak-k25',
@@ -805,6 +805,7 @@ my %moduleName = (
DSS => 'Olympus',
DWF => 0,
DWG => 0,
+ DXF => 0,
EPS => 'PostScript',
EXIF => '',
EXR => 'OpenEXR',
@@ -880,6 +881,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
DV => '\x1f\x07\0[\x3f\xbf]', # (not tested if extension recognized)
DWF => '\(DWF V\d',
DWG => 'AC10\d{2}\0',
+ DXF => '\s*0\s+\0?\s*SECTION\s+2\s+HEADER',
EPS => '(%!PS|%!Ad|\xc5\xd0\xd3\xc6)',
EXE => '(MZ|\xca\xfe\xba\xbe|\xfe\xed\xfa[\xce\xcf]|[\xce\xcf]\xfa\xed\xfe|Joy!peff|\x7fELF|#!\s*/\S*bin/|!<arch>\x0a)',
EXIF => '(II\x2a\0|MM\0\x2a)',
@@ -902,9 +904,10 @@ $testLen = 1024; # number of bytes to read when testing for magic number
IND => '\x06\x06\xed\xf5\xd8\x1d\x46\xe5\xbd\x31\xef\xe7\xfe\x74\xb7\x1d',
# ISO => signature is at byte 32768
ITC => '.{4}itch',
- JP2 => '(\0\0\0\x0cjP( |\x1a\x1a)\x0d\x0a\x87\x0a|\xff\x4f\xff\x51\0|\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl )',
+ JP2 => '(\0\0\0\x0cjP( |\x1a\x1a)\x0d\x0a\x87\x0a|\xff\x4f\xff\x51\0)',
JPEG => '\xff\xd8\xff',
JSON => '(\xef\xbb\xbf)?\s*(\[\s*)?\{\s*"[^"]*"\s*:',
+ JXL => '\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl ',
LFP => '\x89LFP\x0d\x0a\x1a\x0a',
LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
LRI => 'LELR \0',
diff --git a/lib/Image/ExifTool.pod b/lib/Image/ExifTool.pod
index 25e27205..ebf3d071 100644
--- a/lib/Image/ExifTool.pod
+++ b/lib/Image/ExifTool.pod
@@ -441,9 +441,10 @@ Default is undef.
=item BlockExtract
-Flag to extract some directories (mentioned in the Tag Name documentation)
-as a block. Setting this to a value of 2 also prevents parsing the block to
-extract tags contained within.
+Flag to extract some directories (mentioned in the
+L<ExifTool tag name documentation|Image::ExifTool::TagNames>) as a block.
+Setting this to a value of 2 also prevents parsing the block to extract tags
+contained within.
=item ByteOrder
diff --git a/lib/Image/ExifTool/DjVu.pm b/lib/Image/ExifTool/DjVu.pm
index c284d104..03b3f9f0 100644
--- a/lib/Image/ExifTool/DjVu.pm
+++ b/lib/Image/ExifTool/DjVu.pm
@@ -18,7 +18,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.06';
+$VERSION = '1.07';
sub ParseAnt($);
sub ProcessAnt($$$);
@@ -227,10 +227,11 @@ Tok: for (;;) {
last unless $tok =~ /(\\+)$/ and length($1) & 0x01;
$tok .= '"'; # quote is part of the string
}
- # must protect unescaped "$" and "@" symbols, and "\" at end of string
- $tok =~ s{\\(.)|([\$\@]|\\$)}{'\\'.($2 || $1)}sge;
- # convert C escape sequences (allowed in quoted text)
- $tok = eval qq{"$tok"};
+ # convert C escape sequences, allowed in quoted text
+ # (note: this only converts a few of them!)
+ my %esc = ( a => "\a", b => "\b", f => "\f", n => "\n",
+ r => "\r", t => "\t", '"' => '"', '\\' => '\\' );
+ $tok =~ s/\\(.)/$esc{$1}||'\\'.$1/egs;
} else { # key name
pos($$dataPt) = pos($$dataPt) - 1;
# allow anything in key but whitespace, braces and double quotes
diff --git a/lib/Image/ExifTool/FujiFilm.pm b/lib/Image/ExifTool/FujiFilm.pm
index baf488bd..d21b2108 100644
--- a/lib/Image/ExifTool/FujiFilm.pm
+++ b/lib/Image/ExifTool/FujiFilm.pm
@@ -31,7 +31,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.79';
+$VERSION = '1.80';
sub ProcessFujiDir($$$);
sub ProcessFaceRec($$$);
@@ -507,6 +507,7 @@ my %faceCategories = (
0 => 'Off',
1 => 'On',
2 => 'No flash & flash', #3
+ 6 => 'Pixel Shift', #IB (GFX100S)
},
}],
0x1101 => {
@@ -517,6 +518,8 @@ my %faceCategories = (
Name => 'DriveSettings',
SubDirectory => { TagTable => 'Image::ExifTool::FujiFilm::DriveSettings' },
},
+ 0x1105 => { Name => 'PixelShiftShots', Writable => 'int16u' }, #IB
+ 0x1106 => { Name => 'PixelShiftOffset', Writable => 'rational64s', Count => 2 }, #IB
# (0x1150-0x1152 exist only for Pro Low-light and Pro Focus PictureModes)
# 0x1150 - Pro Low-light - val=1; Pro Focus - val=2 (ref 7); HDR - val=128 (forum10799)
# 0x1151 - Pro Low-light - val=4 (number of pictures taken?); Pro Focus - val=2,3 (ref 7); HDR - val=3 (forum10799)
@@ -915,15 +918,22 @@ my %faceCategories = (
WRITABLE => 1,
0.1 => {
Name => 'FocusMode2',
- Mask => 0x000000ff,
+ Mask => 0x0000000f,
PrintConv => {
- 0x00 => 'AF-M',
- 0x01 => 'AF-S',
- 0x02 => 'AF-C',
- 0x11 => 'AF-S (Auto)',
+ 0x0 => 'AF-M',
+ 0x1 => 'AF-S',
+ 0x2 => 'AF-C',
},
},
0.2 => {
+ Name => 'PreAF',
+ Mask => 0x00f0,
+ PrintConv => {
+ 0 => 'Off',
+ 1 => 'On',
+ },
+ },
+ 0.3 => {
Name => 'AFAreaMode',
Mask => 0x0f00,
PrintConv => {
@@ -932,7 +942,7 @@ my %faceCategories = (
2 => 'Wide/Tracking',
},
},
- 0.3 => {
+ 0.4 => {
Name => 'AFAreaPointSize',
Mask => 0xf000,
PrintConv => {
@@ -940,7 +950,7 @@ my %faceCategories = (
OTHER => sub { return $_[0] },
},
},
- 0.4 => {
+ 0.5 => {
Name => 'AFAreaZoneSize',
Mask => 0xf0000,
PrintConv => {
diff --git a/lib/Image/ExifTool/Jpeg2000.pm b/lib/Image/ExifTool/Jpeg2000.pm
index fc38cab0..ba141244 100644
--- a/lib/Image/ExifTool/Jpeg2000.pm
+++ b/lib/Image/ExifTool/Jpeg2000.pm
@@ -607,8 +607,8 @@ my %jumbfTypes = (
PROCESS_PROC => \&ProcessJUMD,
GROUPS => { 0 => 'JUMBF', 1 => 'JUMBF', 2 => 'Image' },
NOTES => 'Information extracted from the JUMBF description box.',
- type => {
- Name => 'JUMBFType',
+ 'jumd-type' => {
+ Name => 'JUMDType',
ValueConv => 'unpack "H*", $val',
PrintConv => q{
my @a = $val =~ /^(\w{8})(\w{4})(\w{4})(\w{16})$/;
@@ -621,9 +621,18 @@ my %jumbfTypes = (
# cacb/cast/caas/cacl/casg/json-00110010800000aa00389b71
# 6579d6fbdba2446bb2ac1b82feeb89d1 - JPEG image
},
- label => { Name => 'JUMBFLabel' },
- id => { Name => 'JUMBFID', Description => 'JUMBF ID' },
- signature => { Name => 'JUMBFSignature', PrintConv => 'unpack "H*", $val' },
+ 'jumd-label' => { Name => 'JUMDLabel' },
+ 'jumd-flags' => {
+ Name => 'JUMDFlags',
+ PrintConv => { BITMASK => {
+ 0 => 'Requestable',
+ 1 => 'Label',
+ 2 => 'ID',
+ 3 => 'Signature',
+ }},
+ },
+ 'jumd-id' => { Name => 'JUMDID', Description => 'JUMD ID' },
+ 'jumd-sig' => { Name => 'JUMDSignature', PrintConv => 'unpack "H*", $val' },
);
#------------------------------------------------------------------------------
@@ -666,15 +675,16 @@ sub ProcessJUMD($$$)
delete $$et{JUMBFLabel};
$$dirInfo{DirLen} < 17 and $et->Warn('Truncated JUMD directory'), return 0;
my $type = substr($$dataPt, $pos, 4);
- $et->HandleTag($tagTablePtr, 'type', substr($$dataPt, $pos, 16));
+ $et->HandleTag($tagTablePtr, 'jumd-type', substr($$dataPt, $pos, 16));
$pos += 16;
my $flags = Get8u($dataPt, $pos++);
+ $et->HandleTag($tagTablePtr, 'jumd-flags', $flags);
if ($flags & 0x02) { # label exists?
pos($$dataPt) = $pos;
$$dataPt =~ /\0/g or $et->Warn('Missing JUMD label terminator'), return 0;
my $len = pos($$dataPt) - $pos;
my $name = substr($$dataPt, $pos, $len);
- $et->HandleTag($tagTablePtr, 'label', $name);
+ $et->HandleTag($tagTablePtr, 'jumd-label', $name);
$pos += $len;
if ($len) {
$name =~ s/[^-_a-zA-Z0-9]([a-z])/\U$1/g; # capitalize characters after illegal characters
@@ -686,12 +696,12 @@ sub ProcessJUMD($$$)
}
if ($flags & 0x04) { # ID exists?
$pos + 4 > $end and $et->Warn('Missing JUMD ID'), return 0;
- $et->HandleTag($tagTablePtr, 'id', Get32u($dataPt, $pos));
+ $et->HandleTag($tagTablePtr, 'jumd-id', Get32u($dataPt, $pos));
$pos += 4;
}
if ($flags & 0x08) { # signature exists?
$pos + 32 > $end and $et->Warn('Missing JUMD signature'), return 0;
- $et->HandleTag($tagTablePtr, 'signature', substr($$dataPt, $pos, 32));
+ $et->HandleTag($tagTablePtr, 'jumd-sig', substr($$dataPt, $pos, 32));
$pos += 32;
}
$pos == $end or $et->Warn('Extra data in JUMD box'." $pos $end", 1);
@@ -1043,6 +1053,7 @@ sub GetBits($$)
#------------------------------------------------------------------------------
# Extract parameters from JPEG XL codestream [unverified!]
# Inputs: 0) ExifTool ref, 1) codestream ref
+# Returns: 1
sub ProcessJXLCodestream($$)
{
my ($et, $dataPt) = @_;
@@ -1076,6 +1087,7 @@ sub ProcessJXLCodestream($$)
}
$et->FoundTag(ImageWidth => $x);
$et->FoundTag(ImageHeight => $y);
+ return 1;
}
#------------------------------------------------------------------------------
@@ -1094,16 +1106,8 @@ sub ProcessJP2($$)
return 0 unless $raf->Read($hdr,12) == 12;
unless ($hdr eq "\0\0\0\x0cjP \x0d\x0a\x87\x0a" or # (ref 1)
$hdr eq "\0\0\0\x0cjP\x1a\x1a\x0d\x0a\x87\x0a" or # (ref 2)
- ($hdr eq "\0\0\0\x0cJXL \x0d\x0a\x87\x0a" and $$et{IsJXL} = 1)) # (JPEG XL)
+ $$et{IsJXL})
{
- if ($hdr =~ /^\xff\x0a/) {
- $outfile and $et->Error('Writing of JPEG XL codestream files is not yet supported'), return 0;
- # JPEG XL codestream
- $et->SetFileType('JXC',undef,'JXL'); # (PH invention)
- $et->Warn('JPEG XL codestream support is currently experimental',1);
- ProcessJXLCodestream($et, \$hdr);
- return 1;
- }
return 0 unless $hdr =~ /^\xff\x4f\xff\x51\0/; # check for JP2 codestream format
if ($outfile) {
$et->Error('Writing of J2C files is not yet supported');
@@ -1117,7 +1121,6 @@ sub ProcessJP2($$)
$raf->Seek(0,0);
return $et->ProcessJPEG($dirInfo); # decode with JPEG processor
}
- $et->Warn('JPEG XL support is currently experimental',1) if $$et{IsJXL};
if ($outfile) {
Write($outfile, $hdr) or return -1;
if ($$et{IsJXL}) {
@@ -1154,11 +1157,56 @@ sub ProcessJP2($$)
#------------------------------------------------------------------------------
# Read meta information from a JPEG XL image
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
-# Returns: 1 on success, 0 if this wasn't a valid JPEG XL file
+# Returns: 1 on success, 0 if this wasn't a valid JPEG XL file, -1 on write error
sub ProcessJXL($$)
{
my ($et, $dirInfo) = @_;
- return ProcessJP2($et, $dirInfo);
+ my $raf = $$dirInfo{RAF};
+ my $outfile = $$dirInfo{OutFile};
+ my ($hdr, $buff);
+
+ return 0 unless $raf->Read($hdr,12) == 12;
+ if ($hdr eq "\0\0\0\x0cJXL \x0d\x0a\x87\x0a") {
+ # JPEG XL in ISO BMFF container
+ $$et{IsJXL} = 1;
+ } elsif ($hdr =~ /^\xff\x0a/) {
+ # JPEG XL codestream
+ if ($outfile) {
+ if ($$et{OPTIONS}{IgnoreMinorErrors}) {
+ $et->Warn('Wrapped JXL codestream in ISO BMFF container');
+ } else {
+ $et->Error('Will wrap JXL codestream in ISO BMFF container for writing',1);
+ return 0;
+ }
+ $$et{IsJXL} = 2;
+ my $buff = "\0\0\0\x0cJXL \x0d\x0a\x87\x0a\0\0\0\x14ftypjxl \0\0\0\0jxl ";
+ # add metadata to empty ISO BMFF container
+ $$dirInfo{RAF} = new File::RandomAccess(\$buff);
+ } else {
+ $et->Warn('JPEG XL codestream support is currently experimental',1);
+ $et->SetFileType('JXL Codestream','image/jxl', 'jxl');
+ return ProcessJXLCodestream($et, \$hdr);
+ }
+ } else {
+ return 0;
+ }
+ $raf->Seek(0,0) or $et->Error('Seek error'), return 0;
+ $et->Warn('JPEG XL support is currently experimental',1);
+
+ my $success = ProcessJP2($et, $dirInfo);
+
+ if ($outfile and $success > 0 and $$et{IsJXL} == 2) {
+ # attach the JXL codestream box to the ISO BMFF file
+ $raf->Seek(0,2) or return -1;
+ my $size = $raf->Tell();
+ $raf->Seek(0,0) or return -1;
+ SetByteOrder('MM');
+ Write($outfile, Set32u($size + 8), 'jxlc') or return -1;
+ while ($raf->Read($buff, 65536)) {
+ Write($outfile, $buff) or return -1;
+ }
+ }
+ return $success;
}
1; # end
diff --git a/lib/Image/ExifTool/MacOS.pm b/lib/Image/ExifTool/MacOS.pm
index dc2f2e3c..c28584b8 100644
--- a/lib/Image/ExifTool/MacOS.pm
+++ b/lib/Image/ExifTool/MacOS.pm
@@ -245,7 +245,7 @@ my %mdDateInfo = (
XAttr tags are extracted using the "xattr" utility. They are extracted if
any "XAttr*" tag or the MacOS group is specifically requested, or by setting
the L<XAttrTags|../ExifTool.html#XAttrTags> API option to 1 or the L<RequestAll|../ExifTool.html#RequestAll> API option to 2 or higher.
- And they extracted by default from MacOS "._" files when reading
+ And they are extracted by default from MacOS "._" files when reading
these files directly.
},
'com.apple.FinderInfo' => {
diff --git a/lib/Image/ExifTool/Microsoft.pm b/lib/Image/ExifTool/Microsoft.pm
index cb1fba06..5de05129 100644
--- a/lib/Image/ExifTool/Microsoft.pm
+++ b/lib/Image/ExifTool/Microsoft.pm
@@ -889,12 +889,14 @@ sub WriteXtraValue($$$)
} elsif ($format eq 'date') {
$dat = Image::ExifTool::GetUnixTime($val, 1); # (convert to UTC, NC)
if ($dat) {
+ # 100ns intervals since Jan 1, 1601
$dat = Set64u(($dat + 11644473600) * 1e7);
$type = 21;
}
- } elsif ($format eq 'vt_filetime') {
+ } elsif ($format eq 'vt_filetime') { # 'date' value inside a VT_VARIANT
$dat = Image::ExifTool::GetUnixTime($val); # (leave as local time, NC)
if ($dat) {
+ # 100ns intervals since Jan 1, 1601
$dat = Set32u(64) . Set64u(($dat + 11644473600) * 1e7);
$type = 65;
}
diff --git a/lib/Image/ExifTool/Panasonic.pm b/lib/Image/ExifTool/Panasonic.pm
index 54554a40..6ad8619b 100644
--- a/lib/Image/ExifTool/Panasonic.pm
+++ b/lib/Image/ExifTool/Panasonic.pm
@@ -2118,6 +2118,7 @@ my %shootingMode = (
Name => 'UserProfile',
Writable => 'string',
},
+ # 0x357 int32u - 0=DNG, 3162=JPG (ref 23)
0x359 => { #23
Name => 'ISOSelected',
Writable => 'int32s',
@@ -2134,7 +2135,19 @@ my %shootingMode = (
PrintConv => 'sprintf("%.1f", $val)',
PrintConvInv => '$val',
},
- # 0x357 int32u - 0=DNG, 3162=JPG (ref 23)
+ 0x035b => { #IB
+ Name => 'CorrelatedColorTemp', # (in Kelvin)
+ Writable => 'int16u',
+ },
+ 0x035c => { #IB
+ Name => 'ColorTint', # (same units as Adobe is using)
+ Writable => 'int16s',
+ },
+ 0x035d => { #IB
+ Name => 'WhitePoint', # (x/y)
+ Writable => 'rational64u',
+ Count => 2,
+ },
);
# Type 2 tags (ref PH)
diff --git a/lib/Image/ExifTool/PhaseOne.pm b/lib/Image/ExifTool/PhaseOne.pm
index c95831ac..29a07869 100644
--- a/lib/Image/ExifTool/PhaseOne.pm
+++ b/lib/Image/ExifTool/PhaseOne.pm
@@ -15,7 +15,7 @@ use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '1.06';
+$VERSION = '1.07';
sub WritePhaseOne($$$);
sub ProcessPhaseOne($$$);
@@ -73,10 +73,11 @@ my @formatName = ( undef, 'string', 'int16s', undef, 'int32s' );
PrintConv => { #PH
1 => 'RAW 1', #? (encrypted)
2 => 'RAW 2', #? (encrypted)
- 3 => 'IIQ L',
+ 3 => 'IIQ L', # (now "L14", ref IB)
# 4?
5 => 'IIQ S',
- 6 => 'IIQ Sv2',
+ 6 => 'IIQ Sv2', # (now "S14" for "IIQ 14 Smart" and "IIQ 14 Sensor+", ref IB)
+ 8 => 'IIQ L16', #IB ("IIQ 16 Extended" and "IIQ 16 Large")
},
},
0x010f => {
diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm
index 28a7f25a..0962b88c 100644
--- a/lib/Image/ExifTool/Sony.pm
+++ b/lib/Image/ExifTool/Sony.pm
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::Minolta;
-$VERSION = '3.39';
+$VERSION = '3.40';
sub ProcessSRF($$$);
sub ProcessSR2($$$);
@@ -633,9 +633,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
3 => 'Standard',
4 => 'Economy',
5 => 'Extra Fine',
- 6 => 'RAW + JPEG',
+ 6 => 'RAW + JPEG/HEIF',
7 => 'Compressed RAW',
8 => 'Compressed RAW + JPEG',
+ 9 => 'Light', #JR
0xffffffff => 'n/a', #PH (SLT-A57 panorama)
},
},
@@ -1179,7 +1180,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
# doesn't seem to apply to DSC models (always 0)
Name => 'AFPointSelected',
Condition => q{
- ($$self{Model} =~ /^(SLT-|HV)/) or ($$self{Model} =~ /^ILCE-/ and
+ ($$self{Model} =~ /^(SLT-|HV)/) or ($$self{Model} =~ /^(ILCE-|ILME-)/ and
defined $$self{AFAreaILCE} and $$self{AFAreaILCE} == 4)
},
Notes => 'SLT models or ILCE with LA-EA2/EA4',
@@ -1462,13 +1463,15 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
Count => 2,
PrintConv => {
'0 0' => 'n/a',
- '0 1' => 'Standard JPEG',
- '0 2' => 'Fine JPEG',
- '0 3' => 'Extra Fine JPEG',
+ '0 1' => 'Standard',
+ '0 2' => 'Fine',
+ '0 3' => 'Extra Fine',
+ '0 4' => 'Light', #JR
'1 0' => 'RAW',
- '1 1' => 'RAW + Standard JPEG',
- '1 2' => 'RAW + Fine JPEG',
- '1 3' => 'RAW + Extra Fine JPEG',
+ '1 1' => 'RAW + Standard',
+ '1 2' => 'RAW + Fine',
+ '1 3' => 'RAW + Extra Fine',
+ '1 4' => 'RAW + Light', #JR
},
},
0x202f => { #JR (ILCE-7RM3)
@@ -1514,13 +1517,56 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
PrintConv => 'sprintf("%.8d",$val)',
PrintConvInv => '$val',
},
-# 0x2032 - first seen for ILCE-7SM3, July 2020
-# 0x2033 - first seen for ILCE-7SM3, July 2020
-# 0x2034 - first seen for ILCE-7SM3, July 2020
-# 0x2035 - first seen for ILCE-7SM3, July 2020
-# 0x2036 - first seen for ILCE-7SM3, July 2020
-# 0x2037 - first seen for ILCE-7SM3, July 2020
-# 0x2039 - first seen for ILCE-7SM3, July 2020
+# 0x2032 - 0x2039: from July 2020 for ILCE-7SM3, ILCE-1, ILME-FX3 and newer
+ 0x2032 => {
+ Name => 'Shadows',
+ Writable => 'int32s',
+ PrintConv => '$val > 0 ? "+$val" : $val',
+ PrintConvInv => '$val',
+ },
+ 0x2033 => {
+ Name => 'Highlights',
+ Writable => 'int32s',
+ PrintConv => '$val > 0 ? "+$val" : $val',
+ PrintConvInv => '$val',
+ },
+ 0x2034 => {
+ Name => 'Fade',
+ Writable => 'int32s',
+ PrintConv => '$val > 0 ? "+$val" : $val',
+ PrintConvInv => '$val',
+ },
+ 0x2035 => {
+ Name => 'SharpnessRange',
+ Writable => 'int32s',
+ PrintConv => '$val > 0 ? "+$val" : $val',
+ PrintConvInv => '$val',
+ },
+ 0x2036 => {
+ Name => 'Clarity',
+ Writable => 'int32s',
+ PrintConv => '$val > 0 ? "+$val" : $val',
+ PrintConvInv => '$val',
+ },
+ 0x2037 => {
+ Name => 'FocusFrameSize',
+ Format => 'int16u',
+ Count => '3',
+ PrintConv => q{
+ my @a = split ' ', $val;
+ return $a[2] ? sprintf('%3dx%3d', $a[0], $a[1]) : 'n/a';
+ },
+ PrintConvInv => '$val =~ /(\d+)x(\d+)/ ? "$1 $2 257" : "0 0 0"',
+ },
+ 0x2039 => { #JR
+ Name => 'JPEG-HEIFSwitch', # (name used in camera menus)
+ Writable => 'int16u',
+ PrintConv => {
+ 0 => 'JPEG',
+ 1 => 'HEIF',
+ 65535 => 'n/a',
+ },
+ },
0x3000 => {
Name => 'ShotInfo',
SubDirectory => { TagTable => 'Image::ExifTool::Sony::ShotInfo' },
@@ -1583,7 +1629,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
# 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
# 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99
# 0x28 (e) for ILCE-7RM4/9M2, DSC-RX100M7, ZV-1
- # 0x31 (e) for ILCE-1, 7SM3
+ # 0x31 (e) for ILCE-1/7SM3, ILME-FX3
# first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28, 106 respectively
{
Name => 'Tag9400a',
@@ -6080,6 +6126,9 @@ my %pictureProfile2010 = (
31 => 'Gamma S-Log3 (PP8 or PP9)', #14
33 => 'Gamma HLG2 (PP10)', #14
34 => 'Gamma HLG3', #IB
+ 37 => 'FL',
+ 39 => 'IN',
+ 40 => 'SH',
},
);
my %isoSetting2010 = (
@@ -7801,7 +7850,7 @@ my %isoSetting2010 = (
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
FORMAT => 'int8u',
NOTES => q{
- Valid from July 2020 for ILCE-1/7SM3.
+ Valid from July 2020 for ILCE-1/7SM3, ILME-FX3.
},
WRITABLE => 1,
FIRST_ENTRY => 0,
@@ -7888,6 +7937,13 @@ my %isoSetting2010 = (
},
0x0088 => {
Name => 'InternalSerialNumber', #(NC)
+ Condition => '$$self{Model} =~ /^(ILCE-7SM3|ILME-FX3)/',
+ Format => 'int8u[6]',
+ PrintConv => 'unpack "H*", pack "C*", split " ", $val',
+ },
+ 0x008a => {
+ Name => 'InternalSerialNumber', #(NC)
+ Condition => '$$self{Model} =~ /^(ILCE-1)/',
Format => 'int8u[6]',
PrintConv => 'unpack "H*", pack "C*", split " ", $val',
},
@@ -8117,7 +8173,7 @@ my %isoSetting2010 = (
8 => 'Rotate 270 CW',
},
},
- 0x002a => {
+ 0x002a => [{
Name => 'Quality2',
Condition => '$$self{Model} !~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
PrintConv => {
@@ -8126,7 +8182,17 @@ my %isoSetting2010 = (
2 => 'RAW + JPEG',
3 => 'JPEG + MPO', # 3D images
},
- },
+ },{
+ Name => 'Quality2',
+ Condition => '$$self{Model} =~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
+ PrintConv => {
+ 1 => 'JPEG',
+ 2 => 'RAW',
+ 3 => 'RAW + JPEG',
+ 4 => 'HEIF',
+ 6 => 'RAW + HEIF',
+ },
+ }],
0x0047 => {
Name => 'SonyImageHeight',
Condition => '$$self{Model} !~ /^(ILCE-(1|7SM3)|ILME-FX3)\b/',
@@ -8795,7 +8861,7 @@ my %isoSetting2010 = (
FIRST_ENTRY => 0,
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
DATAMEMBER => [ 0x0008 ],
- NOTES => 'NEX and ILCE models only.',
+ NOTES => 'E-mount cameras only.',
# 0x0001 - 0 for all NEX and ILCE-3000/3500, 20 for all other ILCE (17 for ILCE samples from Sony.net)
# 0x0008 - LensMount, but different values from Tag9405-0x0105 and Tag9050-0x0604.
@@ -9422,7 +9488,7 @@ my %isoSetting2010 = (
WRITE_PROC => \&WriteEnciphered,
CHECK_PROC => \&Image::ExifTool::CheckBinaryData,
FORMAT => 'int8u',
- NOTES => 'Valid for the ILCE-1/7SM3.',
+ NOTES => 'Valid for the ILCE-1/7SM3, ILME-FX3.',
FIRST_ENTRY => 0,
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
0x0000 => { Name => 'Tag9416_0000', PrintConv => 'sprintf("%3d",$val)', RawConv => '$$self{TagVersion} = $val' },
diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm
index fa7f2be5..767d349d 100644
--- a/lib/Image/ExifTool/TagLookup.pm
+++ b/lib/Image/ExifTool/TagLookup.pm
@@ -631,9 +631,9 @@ my %tagLookup = (
'afaperture' => { 215 => 0x5, 216 => 0x5, 220 => 0x5 },
'afareaheight' => { 190 => [0x1a,0x34,0x50] },
'afareaillumination' => { 181 => 0x4b, 282 => '15.3' },
- 'afareamode' => { 124 => '0.2', 177 => 0x33, 181 => 0xe, 189 => 0x0, 190 => 0x5, 311 => 0xf, 378 => 0x1205, 391 => [0xa,0x3a], 398 => 0x11, 399 => 0x10, 400 => 0x24, 411 => 0xb043, 435 => 0x17 },
+ 'afareamode' => { 124 => '0.3', 177 => 0x33, 181 => 0xe, 189 => 0x0, 190 => 0x5, 311 => 0xf, 378 => 0x1205, 391 => [0xa,0x3a], 398 => 0x11, 399 => 0x10, 400 => 0x24, 411 => 0xb043, 435 => 0x17 },
'afareamodesetting' => { 273 => '11.1', 276 => '0.1', 282 => '16.1', 286 => '2.1', 411 => 0x201c },
- 'afareapointsize' => { 124 => '0.3' },
+ 'afareapointsize' => { 124 => '0.4' },
'afareas' => { 288 => 0x304 },
'afareaselectionmethod' => { 2 => 0xd },
'afareaselectmethod' => { 82 => 0x51b },
@@ -642,7 +642,7 @@ my %tagLookup = (
'afareaxposition1' => { 378 => 0x1201 },
'afareayposition' => { 190 => [0x16,0x30,0x4c], 378 => 0x1204 },
'afareayposition1' => { 378 => 0x1202 },
- 'afareazonesize' => { 124 => '0.4' },
+ 'afareazonesize' => { 124 => '0.5' },
'afassist' => { 80 => 0x5, 88 => 0x5, 181 => 0x48, 271 => '2.5', 273 => '0.2', 276 => '0.2', 277 => '1.1', 278 => '1.1', 279 => '1.3', 280 => '2.4', 281 => '1.3', 282 => '0.2', 284 => '2.4', 286 => '2.3' },
'afassistbeam' => { 2 => 0x8, 82 => 0x50e, 83 => 0x4, 84 => 0x5, 85 => 0x4, 86 => 0x4, 87 => 0x5 },
'afassistlamp' => { 311 => 0x31 },
@@ -1453,7 +1453,7 @@ my %tagLookup = (
'circulargradientbasedcorrections' => { 468 => 'CircularGradientBasedCorrections', 470 => 'CircularGradientBasedCorrections' },
'city' => { 129 => 0x5a, 158 => 'City', 311 => 0x6d, 482 => 'City' },
'city2' => { 311 => 0x80 },
- 'clarity' => { 225 => 0x35, 226 => 0x3d, 468 => 'Clarity', 470 => 'Clarity' },
+ 'clarity' => { 225 => 0x35, 226 => 0x3d, 411 => 0x2036, 468 => 'Clarity', 470 => 'Clarity' },
'clarity2012' => { 468 => 'Clarity2012', 470 => 'Clarity2012' },
'claritycontrol' => { 346 => 0x96 },
'classifystate' => { 129 => 0xe1 },
@@ -1620,6 +1620,7 @@ my %tagLookup = (
'colortempunknown7' => { 38 => 0x54, 39 => 0x87, 41 => 0x86, 42 => 0x67, 46 => 0x93, 47 => 0x70, 48 => 0x70, 49 => 0x78 },
'colortempunknown8' => { 38 => 0x59, 39 => 0x8f, 41 => 0x8b, 42 => 0x6c, 46 => 0x98, 47 => 0x75, 48 => 0x75, 49 => 0x7d },
'colortempunknown9' => { 38 => 0x5e, 39 => 0x97, 41 => 0x90, 42 => 0x71, 46 => 0x9d, 47 => 0x7a, 48 => 0x7a, 49 => 0x82 },
+ 'colortint' => { 310 => 0x35c },
'colortone' => { 10 => 0x6f, 12 => 0x77, 34 => 0x2a, 50 => 0x2 },
'colortoneadj' => { 101 => 0x20304, 106 => 0x11e },
'colortoneauto' => { 69 => 0x9c },
@@ -1786,6 +1787,7 @@ my %tagLookup = (
'coringfilter' => { 292 => 0x310, 293 => 0x102d, 296 => 0x310 },
'coringvalues' => { 292 => 0x311, 296 => 0x311 },
'corporateentity' => { 484 => 'corporateEntity' },
+ 'correlatedcolortemp' => { 310 => 0x35b },
'country' => { 158 => 'Country', 311 => 0x69, 482 => 'Country' },
'country-primarylocationcode' => { 129 => 0x64 },
'country-primarylocationname' => { 129 => 0x65 },
@@ -2529,6 +2531,7 @@ my %tagLookup = (
'facesdetected' => { 53 => 0x2, 54 => 0x2, 55 => 0x3, 108 => 0x0, 109 => 0x2, 111 => 0x211c, 125 => 0x4100, 203 => 0x3, 292 => 0x1200, 311 => 0x3f, 330 => 0x0, 375 => 0xb5, 386 => 0x0, 405 => 0x0, 408 => 0x3, 418 => 0x30 },
'facesrecognized' => { 304 => 0x0 },
'facewidth' => { 54 => 0x1 },
+ 'fade' => { 411 => 0x2034 },
'faithfuloutputhighlightpoint' => { 107 => 0x38 },
'faithfuloutputshadowpoint' => { 107 => 0x39 },
'faithfulrawcolortone' => { 107 => 0x31 },
@@ -3059,7 +3062,7 @@ my %tagLookup = (
'highlightlinearitylimit' => { 385 => 0xa025 },
'highlightprotection' => { 263 => 0x6 },
'highlightrecovery' => { 468 => 'HighlightRecovery', 470 => 'HighlightRecovery' },
- 'highlights' => { 462 => 'Highlights' },
+ 'highlights' => { 411 => 0x2033, 462 => 'Highlights' },
'highlights2012' => { 468 => 'Highlights2012', 470 => 'Highlights2012' },
'highlightsadj' => { 445 => 0x9019 },
'highlightshadow' => { 311 => 0xad },
@@ -3304,7 +3307,7 @@ my %tagLookup = (
'internalflashtable' => { 293 => 0x1024 },
'internallensserialnumber' => { 385 => 0xa005 },
'internalndfilter' => { 311 => 0x9d },
- 'internalserialnumber' => { 62 => 0x96, 74 => 0x9, 125 => 0x10, 184 => 0x49dc, 287 => 0x18, 289 => 0x102, 308 => 0x500, 311 => 0x25, 326 => 0x4, 378 => 0x5, 429 => [0x7c,0xf0], 430 => 0x88, 431 => 0x88 },
+ 'internalserialnumber' => { 62 => 0x96, 74 => 0x9, 125 => 0x10, 184 => 0x49dc, 287 => 0x18, 289 => 0x102, 308 => 0x500, 311 => 0x25, 326 => 0x4, 378 => 0x5, 429 => [0x7c,0xf0], 430 => 0x88, 431 => [0x88,0x8a] },
'interopindex' => { 117 => 0x1, 475 => 'InteroperabilityIndex' },
'interopversion' => { 117 => 0x2 },
'intervallength' => { 178 => 0x10 },
@@ -3374,6 +3377,7 @@ my %tagLookup = (
'jobrefname' => { 493 => [\'JobRef','JobRefName'] },
'jobrefurl' => { 493 => [\'JobRef','JobRefUrl'] },
'jobstatus' => { 476 => 'JobStatus' },
+ 'jpeg-heifswitch' => { 411 => 0x2039 },
'jpeghandling' => { 468 => 'JPEGHandling', 470 => 'JPEGHandling' },
'jpegquality' => { 10 => 0x66, 311 => 0x43, 313 => 0x3034, 411 => 0xb047 },
'jpegsize' => { 313 => 0x303a },
@@ -4655,7 +4659,9 @@ my %tagLookup = (
'pixelcorrectionscale' => { 135 => 0x971 },
'pixelscale' => { 117 => 0x830e },
'pixelshiftinfo' => { 411 => 0x202f },
+ 'pixelshiftoffset' => { 125 => 0x1106 },
'pixelshiftresolution' => { 347 => 0x0 },
+ 'pixelshiftshots' => { 125 => 0x1105 },
'pixelsperunitx' => { 300 => 0x0 },
'pixelsperunity' => { 300 => 0x4 },
'pixelunits' => { 300 => 0x8 },
@@ -4746,6 +4752,7 @@ my %tagLookup = (
'potentialface8position' => { 408 => 0x51 },
'powersource' => { 325 => '0.1' },
'poweruptime' => { 222 => 0xb6 },
+ 'preaf' => { 124 => '0.2' },
'precaptureframes' => { 293 => 0x300 },
'predictor' => { 117 => 0x13d },
'preflashreturnstrength' => { 238 => 0x28a },
@@ -5351,7 +5358,7 @@ my %tagLookup = (
'shadowadj' => { 101 => 0x2030b },
'shadowcorrection' => { 346 => 0x79 },
'shadowprotection' => { 263 => 0x0 },
- 'shadows' => { 117 => 0xfe52, 462 => 'Shadows', 468 => 'Shadows', 470 => 'Shadows' },
+ 'shadows' => { 117 => 0xfe52, 411 => 0x2032, 462 => 'Shadows', 468 => 'Shadows', 470 => 'Shadows' },
'shadows2012' => { 468 => 'Shadows2012', 470 => 'Shadows2012' },
'shadowsadj' => { 445 => 0x901a },
'shadowscale' => { 117 => 0xc633 },
@@ -5377,6 +5384,7 @@ my %tagLookup = (
'sharpnessneutral' => { 19 => 0xf4, 68 => 0x4c, 69 => 0x4c },
'sharpnessovershoot' => { 445 => 0x801b },
'sharpnessportrait' => { 19 => 0xf2, 68 => 0x1c, 69 => 0x1c },
+ 'sharpnessrange' => { 411 => 0x2035 },
'sharpnesssetting' => { 288 => 0x506, 296 => 0x1013, 400 => 0x12, 416 => 0xa },
'sharpnessstandard' => { 19 => 0xf1, 68 => 0x4, 69 => 0x4 },
'sharpnessstrength' => { 101 => 0x20311 },
@@ -6354,7 +6362,7 @@ my %tagLookup = (
'whitebalancetemperature' => { 288 => 0x501 },
'whiteboard' => { 293 => 0x301 },
'whitelevel' => { 117 => 0xc61d, 346 => 0x7e },
- 'whitepoint' => { 117 => 0x13e, 346 => 0x201, 490 => 'WhitePoint' },
+ 'whitepoint' => { 117 => 0x13e, 310 => 0x35d, 346 => 0x201, 490 => 'WhitePoint' },
'whites2012' => { 468 => 'Whites2012', 470 => 'Whites2012' },
'whitesadj' => { 445 => 0x9017 },
'wideadapter' => { 378 => 0x1017 },
@@ -8117,6 +8125,7 @@ my %tagExists = (
'focalrange' => 1,
'focusdistance2' => 1,
'focusedgemap' => 1,
+ 'focusframesize' => 1,
'focusinfo' => 1,
'focusinfoifd' => 1,
'focuspeakinghighlightcolor' => 1,
@@ -8703,10 +8712,11 @@ my %tagExists = (
'jumbf' => 1,
'jumbfbox' => 1,
'jumbfdescr' => 1,
- 'jumbfid' => 1,
- 'jumbflabel' => 1,
- 'jumbfsignature' => 1,
- 'jumbftype' => 1,
+ 'jumdflags' => 1,
+ 'jumdid' => 1,
+ 'jumdlabel' => 1,
+ 'jumdsignature' => 1,
+ 'jumdtype' => 1,
'jumptoxpep' => 1,
'junk' => 1,
'jxlcodestream' => 1,
diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod
index d1e8a1e5..f1e52e1c 100644
--- a/lib/Image/ExifTool/TagNames.pod
+++ b/lib/Image/ExifTool/TagNames.pod
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
=head1 TAG TABLES
The tables listed below give the names of all tags recognized by ExifTool.
-They contain a total of 24102 tags, with 15604 unique tag names.
+They contain a total of 24118 tags, with 15614 unique tag names.
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
@@ -9933,6 +9933,8 @@ Tags extracted from FLIR Public image Format (FPF) files.
0x1100 AutoBracketing int16u
0x1101 SequenceNumber int16u
0x1103 DriveSettings FujiFilm DriveSettings
+ 0x1105 PixelShiftShots int16u
+ 0x1106 PixelShiftOffset rational64s[2]
0x1153 PanoramaAngle int16u
0x1154 PanoramaDirection int16u
0x1201 AdvancedFilter int32u
@@ -9989,10 +9991,11 @@ Tags extracted from FLIR Public image Format (FPF) files.
Index4 Tag Name Writable
------ -------- --------
- 0.1 FocusMode2 int32u & 0xff
- 0.2 AFAreaMode int32u & 0xf00
- 0.3 AFAreaPointSize int32u & 0xf000
- 0.4 AFAreaZoneSize int32u & 0xf0000
+ 0.1 FocusMode2 int32u & 0x0f
+ 0.2 PreAF int32u & 0xf0
+ 0.3 AFAreaMode int32u & 0xf00
+ 0.4 AFAreaPointSize int32u & 0xf000
+ 0.5 AFAreaZoneSize int32u & 0xf0000
=head3 FujiFilm AFCSettings Tags
@@ -15802,6 +15805,9 @@ This information is written by the Leica S (Typ 007) and M10 models.
0x034c UserProfile string
0x0359 ISOSelected int32s
0x035a FNumber int32s
+ 0x035b CorrelatedColorTemp int16u
+ 0x035c ColorTint int16s
+ 0x035d WhitePoint rational64u[2]
=head3 Panasonic Type2 Tags
@@ -17514,6 +17520,13 @@ MakerNotes.
0x202e Quality int16u[2]
0x202f PixelShiftInfo undef
0x2031 SerialNumber string
+ 0x2032 Shadows int32s
+ 0x2033 Highlights int32s
+ 0x2034 Fade int32s
+ 0x2035 SharpnessRange int32s
+ 0x2036 Clarity int32s
+ 0x2037 FocusFrameSize no
+ 0x2039 JPEG-HEIFSwitch int16u
0x3000 ShotInfo Sony ShotInfo
0x900b Tag900b Sony Tag900b
0x9050 Tag9050a Sony Tag9050a
@@ -18600,7 +18613,7 @@ Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7C/7M3/7RM2/7RM3/7RM4/
=head3 Sony Tag9050c Tags
-Valid from July 2020 for ILCE-1/7SM3.
+Valid from July 2020 for ILCE-1/7SM3, ILME-FX3.
Index1 Tag Name Writable
------ -------- --------
@@ -18615,6 +18628,7 @@ Valid from July 2020 for ILCE-1/7SM3.
104 SonyFNumber int16u
107 ReleaseMode2 int8u
136 InternalSerialNumber int8u[6]~
+ 138 InternalSerialNumber int8u[6]~
=head3 Sony Tag9400a Tags
@@ -18816,7 +18830,7 @@ These tags are currently extracted for SLT models only.
=head3 Sony Tag940c Tags
-NEX and ILCE models only.
+E-mount cameras only.
Index1 Tag Name Writable
------ -------- --------
@@ -19006,7 +19020,7 @@ E-mount models.
=head3 Sony Tag9416 Tags
-Valid for the ILCE-1/7SM3.
+Valid for the ILCE-1/7SM3, ILME-FX3.
Index1 Tag Name Writable
------ -------- --------
@@ -21877,10 +21891,11 @@ Information extracted from the JUMBF description box.
Tag ID Tag Name Writable
------ -------- --------
- 'id' JUMBFID no
- 'label' JUMBFLabel no
- 'signature' JUMBFSignature no
- 'type' JUMBFType no
+ 'jumd-flags' JUMDFlags no
+ 'jumd-id' JUMDID no
+ 'jumd-label' JUMDLabel no
+ 'jumd-sig' JUMDSignature no
+ 'jumd-type' JUMDType no
=head3 Jpeg2000 CaptureResolution Tags
@@ -34897,7 +34912,7 @@ options, but these files are not writable directly.
XAttr tags are extracted using the "xattr" utility. They are extracted if
any "XAttr*" tag or the MacOS group is specifically requested, or by setting
the XAttrTags API option to 1 or the RequestAll API option to 2 or higher.
-And they extracted by default from MacOS "._" files when reading
+And they are extracted by default from MacOS "._" files when reading
these files directly.
Tag Name Writable
diff --git a/lib/Image/ExifTool/Writer.pl b/lib/Image/ExifTool/Writer.pl
index fa85bc55..6bc7055d 100644
--- a/lib/Image/ExifTool/Writer.pl
+++ b/lib/Image/ExifTool/Writer.pl
@@ -105,6 +105,7 @@ my %writableType = (
ICC => [ 'ICC_Profile', 'WriteICC' ],
IND => 'InDesign',
JP2 => 'Jpeg2000',
+ JXL => 'Jpeg2000',
MIE => undef,
MOV => [ 'QuickTime', 'WriteMOV' ],
MRW => 'MinoltaRaw',