summaryrefslogtreecommitdiff
path: root/lib/Image
diff options
context:
space:
mode:
authorexiftool <exiftool@users.sourceforge.net>2021-06-22 16:00:25 -0400
committerexiftool <exiftool@users.sourceforge.net>2021-06-22 16:00:25 -0400
commit11f9b77c6de851baea89fb24e56acadca64c0112 (patch)
tree056d0c666639714e26668325c231625ed0104344 /lib/Image
parent3793c3b76cfeb9f3845c3d8ab96bba6f03828b1f (diff)
Update to 12.28
Diffstat (limited to 'lib/Image')
-rw-r--r--lib/Image/ExifTool.pm11
-rw-r--r--lib/Image/ExifTool.pod83
-rw-r--r--lib/Image/ExifTool/LIF.pm153
-rw-r--r--lib/Image/ExifTool/Olympus.pm4
-rw-r--r--lib/Image/ExifTool/Panasonic.pm15
-rw-r--r--lib/Image/ExifTool/QuickTime.pm36
-rw-r--r--lib/Image/ExifTool/Sony.pm19
-rw-r--r--lib/Image/ExifTool/TagLookup.pm4
-rw-r--r--lib/Image/ExifTool/TagNames.pod15
-rw-r--r--lib/Image/ExifTool/Torrent.pm29
-rw-r--r--lib/Image/ExifTool/WriteQuickTime.pl2
-rw-r--r--lib/Image/ExifTool/XMP.pm13
-rw-r--r--lib/Image/ExifTool/ZISRAW.pm123
13 files changed, 423 insertions, 84 deletions
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm
index 10bf3068..94a73505 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.27';
+$VERSION = '12.28';
$RELEASE = '';
@ISA = qw(Exporter);
%EXPORT_TAGS = (
@@ -138,8 +138,8 @@ sub ReadValue($$$;$$$);
@loadAllTables = qw(
PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw Lytro MinoltaRaw PanasonicRaw
SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BMP::Extra BPG BPG::Extensions
- PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC MRC::FEI12 MIFF PCX PGF PSP
- PhotoCD Radiance PDF PostScript Photoshop::Header Photoshop::Layers
+ PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC LIF MRC::FEI12 MIFF PCX PGF
+ PSP PhotoCD Radiance PDF PostScript Photoshop::Header Photoshop::Layers
Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD Samsung::Trailer Sony::SRF2
Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3 FLAC Ogg Vorbis APE
APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing
@@ -190,7 +190,7 @@ $defaultLang = 'en'; # default language
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 DXF WTV Torrent VCard LRI R3D AA PDB
- MRC JXL MOI ISO ALIAS JSON MP3 DICOM PCD TXT);
+ MRC LIF 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
@@ -366,6 +366,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
LA => ['RIFF', 'Lossless Audio'],
LFP => ['LFP', 'Lytro Light Field Picture'],
LFR => 'LFP', # (Light Field RAW)
+ LIF => ['LIF', 'Leica Image File'],
LNK => ['LNK', 'Windows shortcut'],
LRI => ['LRI', 'Light RAW'],
LRV => ['MOV', 'Low-Resolution Video'],
@@ -664,6 +665,7 @@ my %fileDescription = (
KDC => 'image/x-kodak-kdc',
KEY => 'application/x-iwork-keynote-sffkey',
LFP => 'image/x-lytro-lfp', #PH (NC)
+ LIF => 'image/x-lif',
LNK => 'application/octet-stream',
LRI => 'image/x-light-lri',
M2T => 'video/mpeg',
@@ -913,6 +915,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
JSON => '(\xef\xbb\xbf)?\s*(\[\s*)?\{\s*"[^"]*"\s*:',
JXL => '\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl ',
LFP => '\x89LFP\x0d\x0a\x1a\x0a',
+ LIF => '\x70\0{3}.{4}\x2a.{4}<\0',
LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
LRI => 'LELR \0',
M2TS => '(....)?\x47',
diff --git a/lib/Image/ExifTool.pod b/lib/Image/ExifTool.pod
index 28601596..9c08d3cd 100644
--- a/lib/Image/ExifTool.pod
+++ b/lib/Image/ExifTool.pod
@@ -65,47 +65,48 @@ supported by ExifTool (r = read, w = write, c = create):
File Types
------------+-------------+-------------+-------------+------------
- 360 r/w | DPX r | ITC r | NUMBERS r | RAM r
- 3FR r | DR4 r/w/c | J2C r | O r | RAR r
- 3G2 r/w | DSS r | JNG r/w | ODP r | RAW r/w
- 3GP r/w | DV r | JP2 r/w | ODS r | RIFF r
- A r | DVB r/w | JPEG r/w | ODT r | RSRC r
- AA r | DVR-MS r | JSON r | OFR r | RTF r
- AAE r | DYLIB r | JXL r | OGG r | RW2 r/w
- AAX r/w | EIP r | K25 r | OGV r | RWL r/w
- ACR r | EPS r/w | KDC r | ONP r | RWZ r
- AFM r | EPUB r | KEY r | OPUS r | RM r
- AI r/w | ERF r/w | LA r | ORF r/w | SEQ r
- AIFF r | EXE r | LFP r | ORI r/w | SKETCH r
- APE r | EXIF r/w/c | LNK r | OTF r | SO r
- ARQ r/w | EXR r | LRV r/w | PAC r | SR2 r/w
- ARW r/w | EXV r/w/c | M2TS r | PAGES r | SRF r
- ASF r | F4A/V r/w | M4A/V r/w | PBM r/w | SRW r/w
- AVI r | FFF r/w | MACOS r | PCD r | SVG r
- AVIF r/w | FITS r | MAX r | PCX r | SWF r
- AZW r | FLA r | MEF r/w | PDB r | THM r/w
- BMP r | FLAC r | MIE r/w/c | PDF r/w | TIFF r/w
- BPG r | FLIF r/w | MIFF r | PEF r/w | TORRENT r
- BTF r | FLV r | MKA r | PFA r | TTC r
- CHM r | FPF r | MKS r | PFB r | TTF r
- COS r | FPX r | MKV r | PFM r | TXT r
- CR2 r/w | GIF r/w | MNG r/w | PGF r | VCF r
- CR3 r/w | GPR r/w | MOBI r | PGM r/w | VRD r/w/c
- CRM r/w | GZ r | MODD r | PLIST r | VSD r
- CRW r/w | HDP r/w | MOI r | PICT r | WAV r
- CS1 r/w | HDR r | MOS r/w | PMP r | WDP r/w
- CSV r | HEIC r/w | MOV r/w | PNG r/w | WEBP r
- CZI r | HEIF r/w | MP3 r | PPM r/w | WEBM r
- DCM r | HTML r | MP4 r/w | PPT r | WMA r
- DCP r/w | ICC r/w/c | MPC r | PPTX r | WMV r
- DCR r | ICS r | MPG r | PS r/w | WTV r
- DFONT r | IDML r | MPO r/w | PSB r/w | WV r
- DIVX r | IIQ r/w | MQV r/w | PSD r/w | X3F r/w
- DJVU r | IND r/w | MRC r | PSP r | XCF r
- DLL r | INSP r/w | MRW r/w | QTIF r/w | XLS r
- DNG r/w | INSV r | MXF r | R3D r | XLSX r
- DOC r | INX r | NEF r/w | RA r | XMP r/w/c
- DOCX r | ISO r | NRW r/w | RAF r/w | ZIP r
+ 360 r/w | DR4 r/w/c | JNG r/w | ODP r | RIFF r
+ 3FR r | DSS r | JP2 r/w | ODS r | RSRC r
+ 3G2 r/w | DV r | JPEG r/w | ODT r | RTF r
+ 3GP r/w | DVB r/w | JSON r | OFR r | RW2 r/w
+ A r | DVR-MS r | JXL r | OGG r | RWL r/w
+ AA r | DYLIB r | K25 r | OGV r | RWZ r
+ AAE r | EIP r | KDC r | ONP r | RM r
+ AAX r/w | EPS r/w | KEY r | OPUS r | SEQ r
+ ACR r | EPUB r | LA r | ORF r/w | SKETCH r
+ AFM r | ERF r/w | LFP r | ORI r/w | SO r
+ AI r/w | EXE r | LIF r | OTF r | SR2 r/w
+ AIFF r | EXIF r/w/c | LNK r | PAC r | SRF r
+ APE r | EXR r | LRV r/w | PAGES r | SRW r/w
+ ARQ r/w | EXV r/w/c | M2TS r | PBM r/w | SVG r
+ ARW r/w | F4A/V r/w | M4A/V r/w | PCD r | SWF r
+ ASF r | FFF r/w | MACOS r | PCX r | THM r/w
+ AVI r | FITS r | MAX r | PDB r | TIFF r/w
+ AVIF r/w | FLA r | MEF r/w | PDF r/w | TORRENT r
+ AZW r | FLAC r | MIE r/w/ | PEF r/w | TTC r
+ BMP r | FLIF r/w | MIFF r c | PFA r | TTF r
+ BPG r | FLV r | MKA r | PFB r | TXT r
+ BTF r | FPF r | MKS r | PFM r | VCF r
+ CHM r | FPX r | MKV r | PGF r | VRD r/w/c
+ COS r | GIF r/w | MNG r/w | PGM r/w | VSD r
+ CR2 r/w | GPR r/w | MOBI r | PLIST r | WAV r
+ CR3 r/w | GZ r | MODD r | PICT r | WDP r/w
+ CRM r/w | HDP r/w | MOI r | PMP r | WEBP r
+ CRW r/w | HDR r | MOS r/w | PNG r/w | WEBM r
+ CS1 r/w | HEIC r/w | MOV r/w | PPM r/w | WMA r
+ CSV r | HEIF r/w | MP3 r | PPT r | WMV r
+ CZI r | HTML r | MP4 r/w | PPTX r | WTV r
+ DCM r | ICC r/w/c | MPC r | PS r/w | WV r
+ DCP r/w | ICS r | MPG r | PSB r/w | X3F r/w
+ DCR r | IDML r | MPO r/w | PSD r/w | XCF r
+ DFONT r | IIQ r/w | MQV r/w | PSP r | XLS r
+ DIVX r | IND r/w | MRC r | QTIF r/w | XLSX r
+ DJVU r | INSP r/w | MRW r/w | R3D r | XMP r/w/c
+ DLL r | INSV r | MXF r | RA r | ZIP r
+ DNG r/w | INX r | NEF r/w | RAF r/w |
+ DOC r | ISO r | NRW r/w | RAM r |
+ DOCX r | ITC r | NUMBERS r | RAR r |
+ DPX r | J2C r | O r | RAW r/w |
Meta Information
----------------------+----------------------+---------------------
diff --git a/lib/Image/ExifTool/LIF.pm b/lib/Image/ExifTool/LIF.pm
new file mode 100644
index 00000000..6fcf7ba2
--- /dev/null
+++ b/lib/Image/ExifTool/LIF.pm
@@ -0,0 +1,153 @@
+#------------------------------------------------------------------------------
+# File: LIF.pm
+#
+# Description: Read LIF (Leica Image File) files
+#
+# Revisions: 2021-06-21 - P. Harvey Created
+#------------------------------------------------------------------------------
+
+package Image::ExifTool::LIF;
+
+use strict;
+use vars qw($VERSION);
+use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::XMP;
+
+$VERSION = '1.00';
+
+%Image::ExifTool::LIF::Main = (
+ GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
+ PROCESS_PROC => \&Image::ExifTool::XMP::ProcessXMP,
+ VARS => { NO_ID => 1 },
+ NOTES => q{
+ Tags extracted from Leica Image Format (LIF) imaging files. As well as the
+ tags listed below, all available information is extracted from the
+ XML-format metadata in the LIF header.
+ },
+ TimeStampList => {
+ Groups => { 2 => 'Time' },
+ ValueConv => q{
+ my $unixTimeZero = 134774 * 24 * 3600;
+ my @vals = split ' ', $val;
+ foreach (@vals) {
+ $_ = 1e-7 * hex($_);
+ # shift from Jan 1, 1601 to Jan 1, 1970
+ $_ = Image::ExifTool::ConvertUnixTime($_ - $unixTimeZero);
+ }
+ return \@vals;
+ },
+ },
+);
+
+#------------------------------------------------------------------------------
+# Shorten obscenely long LIF tag names
+# Inputs: Tag name
+# Returns: Shortened tag name
+sub ShortenTagNames($)
+{
+ local $_;
+ $_ = shift;
+ s/DescriptionDimensionsDimensionDescription/Dimensions/;
+ s/DescriptionChannelsChannelDescription/Channel/;
+ s/ShutterListShutter/Shutter/;
+ s/SettingDefinition/Setting/;
+ s/AdditionalZPositionListAdditionalZPosition/AdditionalZPosition/;
+ s/LMSDataContainerHeader//g;
+ s/FilterWheelWheel/FilterWheel/;
+ s/FilterWheelFilter/FilterWheel/;
+ s/DetectorListDetector/Detector/;
+ s/OnlineDyeSeparationOnlineDyeSeparation/OnlineDyeSeparation/;
+ s/AotfListAotf/Aotf/;
+ s/SettingAotfLaserLineSetting/SettingAotfLaser/;
+ s/DataROISetROISet/DataROISet/;
+ s/AdditionalZPosition/AddZPos/;
+ s/FRAPplusBlock_FRAPBlock_FRAP_PrePost_Info/FRAP_/;
+ s/FRAPplusBlock_FRAPBlock_FRAP_(Master)?/FRAP_/;
+ s/LDM_Block_SequentialLDM_Block_Sequential_/LDM_/;
+ s/ATLConfocalSetting/ATLConfocal/;
+ s/LaserArrayLaser/Laser/;
+ s/LDM_Master/LDM_/;
+ s/(List)?ATLConfocal/ATL_/;
+ s/Separation/Sep/;
+ s/BleachPointsElement/BleachPoint/;
+ s/BeamPositionBeamPosition/BeamPosition/;
+ s/DataROISetPossible(ROI)?/DataROISet/;
+ s/RoiElementChildrenElementDataROISingle(Roi)?/Roi/;
+ s/InfoLaserLineSettingArrayLaserLineSetting/LastLineSetting/;
+ s/FilterWheelWheelNameFilterName/FilterWheelFilterName/;
+ s/LUT_ListLut/Lut/;
+ s/ROI_ListRoiRoidata/ROI_/;
+ s/LaserLineSettingArrayLaserLineSetting/LaserLineSetting/;
+ return $_;
+}
+
+#------------------------------------------------------------------------------
+# Extract metadata from a LIF image
+# Inputs: 0) ExifTool object reference, 1) dirInfo reference
+# Returns: 1 on success, 0 if this wasn't a valid LIF file
+sub ProcessLIF($$)
+{
+ my ($et, $dirInfo) = @_;
+ my $raf = $$dirInfo{RAF};
+ my $buff;
+
+ # verify this is a valid LIF file
+ return 0 unless $raf->Read($buff, 15) == 15 and $buff =~ /^\x70\0{3}.{4}\x2a.{4}<\0/s;
+
+ $et->SetFileType();
+ SetByteOrder('II');
+
+ my $size = Get32u(\$buff, 4); # XML chunk size
+ my $len = Get32u(\$buff, 9) * 2; # XML data length
+
+ $size < $len and $et->Error('Corrupted LIF XML block'), return 1;
+ $size > 100000000 and $et->Error('LIF XML block too large'), return 1;
+
+ $raf->Seek(-2, 1) and $raf->Read($buff, $len) == $len or $et->Error('Truncated LIF XML block'), return 1;
+
+ my $tagTablePtr = GetTagTable('Image::ExifTool::LIF::Main');
+
+ # convert from UCS2 to UTF8
+ my $xml = Image::ExifTool::Decode($et, $buff, 'UCS2', 'II', 'UTF8');
+
+ my %dirInfo = ( DataPt => \$xml );
+
+ $$et{XmpIgnoreProps} = [ 'LMSDataContainerHeader', 'Element', 'Children', 'Data', 'Image', 'Attachment' ];
+ $$et{ShortenXmpTags} = \&ShortenTagNames;
+
+ $et->ProcessDirectory(\%dirInfo, $tagTablePtr);
+
+ return 1;
+}
+
+1; # end
+
+__END__
+
+=head1 NAME
+
+Image::ExifTool::LIF - Read LIF meta information
+
+=head1 SYNOPSIS
+
+This module is used by Image::ExifTool
+
+=head1 DESCRIPTION
+
+This module contains definitions required by Image::ExifTool to read
+metadata from Leica Image File (LIF) images.
+
+=head1 AUTHOR
+
+Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<Image::ExifTool::TagNames/LIF Tags>,
+L<Image::ExifTool(3pm)|Image::ExifTool>
+
+=cut
+
diff --git a/lib/Image/ExifTool/Olympus.pm b/lib/Image/ExifTool/Olympus.pm
index d57130e7..e2ee5eb1 100644
--- a/lib/Image/ExifTool/Olympus.pm
+++ b/lib/Image/ExifTool/Olympus.pm
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::APP12;
-$VERSION = '2.71';
+$VERSION = '2.72';
sub PrintLensInfo($$$);
@@ -113,6 +113,7 @@ my %olympusLensTypes = (
'0 34 00' => 'Olympus Zuiko Digital ED 9-18mm F4.0-5.6', #7
'0 34 10' => 'Olympus M.Zuiko Digital ED 12-45mm F4.0 Pro', #IB
'0 35 00' => 'Olympus Zuiko Digital 14-54mm F2.8-3.5 II', #PH
+ '0 36 10' => 'Olympus M.Zuiko Digital ED 8-25mm F4 Pro', #IB
# Sigma lenses
'1 01 00' => 'Sigma 18-50mm F3.5-5.6 DC', #8
'1 01 10' => 'Sigma 30mm F2.8 EX DN', #NJ
@@ -138,7 +139,6 @@ my %olympusLensTypes = (
'1 15 00' => 'Sigma 10-20mm F4.0-5.6 EX DC HSM', #11
'1 16 00' => 'Sigma APO 70-200mm F2.8 II EX DG Macro HSM', #11
'1 17 00' => 'Sigma 50mm F1.4 EX DG HSM', #11
- '1 18 60' => 'Test',
# Panasonic/Leica lenses
'2 01 00' => 'Leica D Vario Elmarit 14-50mm F2.8-3.5 Asph.', #11
'2 01 10' => 'Lumix G Vario 14-45mm F3.5-5.6 Asph. Mega OIS', #16
diff --git a/lib/Image/ExifTool/Panasonic.pm b/lib/Image/ExifTool/Panasonic.pm
index 4b44ffdd..35397dac 100644
--- a/lib/Image/ExifTool/Panasonic.pm
+++ b/lib/Image/ExifTool/Panasonic.pm
@@ -37,7 +37,7 @@ use vars qw($VERSION %leicaLensTypes);
use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
-$VERSION = '2.14';
+$VERSION = '2.15';
sub ProcessLeicaLEIC($$$);
sub WhiteBalanceConv($;$$);
@@ -1423,7 +1423,18 @@ my %shootingMode = (
Name => 'NoiseReductionStrength',
Writable => 'rational64s',
},
- # 0xe4 - LensID (ref IB)
+ 0xe4 => { #IB
+ Name => 'LensTypeModel',
+ Condition => '$format eq "int16u"',
+ Writable => 'int16u',
+ RawConv => q{
+ return undef unless $val;
+ require Image::ExifTool::Olympus; # (to load Composite LensID)
+ return $val;
+ },
+ ValueConv => '$_=sprintf("%.4x",$val); s/(..)(..)/$2 $1/; $_',
+ ValueConvInv => '$val =~ s/(..) (..)/$2$1/; hex($val)',
+ },
0x0e00 => {
Name => 'PrintIM',
Description => 'Print Image Matching',
diff --git a/lib/Image/ExifTool/QuickTime.pm b/lib/Image/ExifTool/QuickTime.pm
index 2eab2f73..03ba0244 100644
--- a/lib/Image/ExifTool/QuickTime.pm
+++ b/lib/Image/ExifTool/QuickTime.pm
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
-$VERSION = '2.66';
+$VERSION = '2.67';
sub ProcessMOV($$;$);
sub ProcessKeys($$$);
@@ -8874,20 +8874,28 @@ sub ProcessKeys($$$)
my $ns = substr($$dataPt, $pos + 4, 4);
my $tag = substr($$dataPt, $pos + 8, $len - 8);
$tag =~ s/\0.*//s; # truncate at null
+ my $full = $tag;
$tag =~ s/^com\.(apple\.quicktime\.)?// if $ns eq 'mdta'; # remove apple quicktime domain
$tag = "Tag_$ns" unless $tag;
- # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
- my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
- unless ($tagInfo) {
- $tagInfo = $et->GetTagInfo($itemList, $tag);
- unless ($tagInfo) {
+ my $short = $tag;
+ my $tagInfo;
+ for (;;) {
+ $tagInfo = $et->GetTagInfo($tagTablePtr, $tag) and last;
+ # also try ItemList and UserData tables
+ $tagInfo = $et->GetTagInfo($itemList, $tag) and last;
+ $tagInfo = $et->GetTagInfo($userData, $tag) and last;
+ # (I have some samples where the tag is a reversed ItemList or UserData tag ID)
+ if ($tag =~ /^\w{3}\xa9$/) {
+ $tag = pack('N', unpack('V', $tag));
+ $tagInfo = $et->GetTagInfo($itemList, $tag) and last;
$tagInfo = $et->GetTagInfo($userData, $tag);
- if (not $tagInfo and $tag =~ /^\w{3}\xa9$/) {
- $tag = pack('N', unpack('V', $tag));
- $tagInfo = $et->GetTagInfo($itemList, $tag);
- $tagInfo or $tagInfo = $et->GetTagInfo($userData, $tag);
- }
+ last;
+ }
+ if ($tag eq $full) {
+ $tag = $short;
+ last;
}
+ $tag = $full;
}
my ($newInfo, $msg);
if ($tagInfo) {
@@ -9541,9 +9549,9 @@ ItemID: foreach $id (keys %$items) {
($size, $tag) = unpack('Na4', $buff);
++$index if defined $index;
}
- # tweak file type based on track content ("iso*" ftyp only)
- if ($$et{VALUE}{FileType} and $$et{VALUE}{FileType} eq 'MP4' and
- $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^iso/ and
+ # tweak file type based on track content ("iso*" and "dash" ftyp only)
+ if ($topLevel and $$et{VALUE}{FileType} and $$et{VALUE}{FileType} eq 'MP4' and
+ $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
$$et{HasHandler}{soun} and not $$et{HasHandler}{vide})
{
$et->OverrideFileType('M4A', 'audio/mp4');
diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm
index 053cb237..a63d603c 100644
--- a/lib/Image/ExifTool/Sony.pm
+++ b/lib/Image/ExifTool/Sony.pm
@@ -10134,7 +10134,9 @@ my %isoSetting2010 = (
# 0x8100 - 16 bytes starting with 0x060e2b340401
0x8100 => { Name => 'Sony_rtmd_0x8100', Format => 'int8u', %hidUnk },
0x8101 => { Name => 'Sony_rtmd_0x8101', Format => 'int8u', %hidUnk }, # seen: 0,1
- 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1"
+ 0x8104 => { Name => 'Sony_rtmd_0x8104', Format => 'int16u', %hidUnk }, # seen: 35616
+ 0x8105 => { Name => 'Sony_rtmd_0x8105', Format => 'int16u', %hidUnk }, # seen: 20092
+ 0x8106 => { Name => 'Sony_rtmd_0x8106', Format => 'int32u', %hidUnk }, # seen: "25 1","24000 1001" frame rate?
0x8109 => { #forum12218
Name => 'ExposureTime',
Format => 'rational64u',
@@ -10230,7 +10232,7 @@ my %isoSetting2010 = (
},
0xe000 => { Name => 'Sony_rtmd_0xe000', Format => 'int8u', %hidUnk }, # (16 bytes)
0xe300 => { Name => 'Sony_rtmd_0xe300', Format => 'int8u', %hidUnk }, # seen: 0,1
- 0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100,1600
+ 0xe301 => { Name => 'Sony_rtmd_0xe301', Format => 'int32u', %hidUnk }, # seen: 100,1600,12800
0xe302 => { Name => 'Sony_rtmd_0xe302', Format => 'int8u', %hidUnk }, # seen: 1
0xe303 => { #forum12218
Name => 'WhiteBalance',
@@ -10251,6 +10253,19 @@ my %isoSetting2010 = (
ValueConv => 'my @a=unpack("x1H4H2H2H2H2H2",$val); "$a[0]:$a[1]:$a[2] $a[3]:$a[4]:$a[5]"',
PrintConv => '$self->ConvertDateTime($val)',
},
+ 0xe435 => { Name => 'Sony_rtmd_0xe435', Format => 'int32u', %hidUnk }, # seen: 2000
+ 0xe437 => { Name => 'Sony_rtmd_0xe437', Format => 'int32s', %hidUnk }, # seen: -3800 to -3400
+ 0xe43b => {
+ Name => 'PitchRollYaw',
+ Format => 'int16s',
+ RawConv => 'substr($val, 8)',
+ },
+ 0xe445 => { Name => 'Sony_rtmd_0xe445', Format => 'int32u', %hidUnk }, # seen: 2000
+ 0xe44b => {
+ Name => 'Accelerometer', # (NC)
+ Format => 'int16s',
+ RawConv => 'substr($val, 8)',
+ },
# f010 - 2048 bytes
# f020 - 543 bytes
);
diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm
index 819bd996..ddad0c1c 100644
--- a/lib/Image/ExifTool/TagLookup.pm
+++ b/lib/Image/ExifTool/TagLookup.pm
@@ -3546,7 +3546,7 @@ my %tagLookup = (
'lenstype2' => { 400 => 0x3f7, 423 => 0x1893, 425 => 0x18bf, 426 => 0x18ef, 427 => 0x17f3, 429 => 0x107, 430 => 0x107, 440 => 0x605, 441 => 0x60 },
'lenstype3' => { 444 => 0x9 },
'lenstypemake' => { 311 => 0xc4 },
- 'lenstypemodel' => { 311 => 0xc5 },
+ 'lenstypemodel' => { 311 => [0xc5,0xe4] },
'lenszoomposition' => { 437 => 0x19, 438 => 0x1e, 441 => [0x342,0x34e,0x35a] },
'levelindicator' => { 319 => 0x15 },
'levelmeter' => { 371 => ['Lvlm','lvlm'] },
@@ -9805,6 +9805,7 @@ my %tagExists = (
'pipy1' => 1,
'pipy2' => 1,
'pitchandfamily' => 1,
+ 'pitchrollyaw' => 1,
'pittasoft' => 1,
'pixelaspectratiox' => 1,
'pixelaspectratioy' => 1,
@@ -10866,6 +10867,7 @@ my %tagExists = (
'timeoffset' => 1,
'timereference' => 1,
'timescale' => 1,
+ 'timestamplist' => 1,
'timestamprandomoffset' => 1,
'timetosampletable' => 1,
'title2' => 1,
diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod
index 8be47474..9908949b 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 24282 tags, with 15745 unique tag names.
+They contain a total of 24286 tags, with 15747 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
@@ -15619,6 +15619,7 @@ These tags are used in Panasonic/Leica cameras.
0x00d1 ISO int32u
0x00d2 MonochromeGrainEffect int16u
0x00d6 NoiseReductionStrength rational64s
+ 0x00e4 LensTypeModel int16u
0x0e00 PrintIM PrintIM
0x2003 TimeInfo Panasonic TimeInfo
0x8000 MakerNoteVersion undef
@@ -19250,6 +19251,8 @@ some models when the ExtractEmbedded option is used.
0x851d GPSDateStamp no
0xe303 WhiteBalance no
0xe304 DateTime no
+ 0xe43b PitchRollYaw no
+ 0xe44b Accelerometer no
=head2 SonyIDC Tags
@@ -24593,6 +24596,16 @@ Tags extracted from FEI1 and FEI2 extended headers.
868 PhasePlatePosition no
872 ObjectiveAperture no
+=head2 LIF Tags
+
+Tags extracted from Leica Image Format (LIF) imaging files. As well as the
+tags listed below, all available information is extracted from the
+XML-format metadata in the LIF header.
+
+ Tag Name Writable
+ -------- --------
+ TimeStampList no
+
=head2 MIFF Tags
The MIFF (Magick Image File Format) format allows aribrary tag names to be
diff --git a/lib/Image/ExifTool/Torrent.pm b/lib/Image/ExifTool/Torrent.pm
index 70d5003a..33700877 100644
--- a/lib/Image/ExifTool/Torrent.pm
+++ b/lib/Image/ExifTool/Torrent.pm
@@ -13,10 +13,11 @@ package Image::ExifTool::Torrent;
use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
+use Image::ExifTool::XMP;
-$VERSION = '1.04';
+$VERSION = '1.05';
-sub ReadBencode($$);
+sub ReadBencode($$$);
sub ExtractTags($$$;$$@);
# tags extracted from BitTorrent files
@@ -99,12 +100,12 @@ sub ReadMore($$)
#------------------------------------------------------------------------------
# Read bencoded value
-# Inputs: 0) input file, 1) buffer (pos must be set to current position)
+# Inputs: 0) ExifTool ref, 1) input file, 2) buffer (pos must be set to current position)
# Returns: HASH ref, ARRAY ref, SCALAR ref, SCALAR, or undef on error or end of data
# Notes: Sets BencodeError element of RAF on any error
-sub ReadBencode($$)
+sub ReadBencode($$$)
{
- my ($raf, $dataPt) = @_;
+ my ($et, $raf, $dataPt) = @_;
# read more if necessary (keep a minimum of 64 bytes in the buffer)
my $pos = pos($$dataPt);
@@ -123,21 +124,21 @@ sub ReadBencode($$)
} elsif ($tok eq 'd') { # dictionary
$val = { };
for (;;) {
- my $k = ReadBencode($raf, $dataPt);
+ my $k = ReadBencode($et, $raf, $dataPt);
last unless defined $k;
# the key must be a byte string
if (ref $k) {
ref $k ne 'SCALAR' and $$raf{BencodeError} = 'Bad dictionary key', last;
$k = $$k;
}
- my $v = ReadBencode($raf, $dataPt);
+ my $v = ReadBencode($et, $raf, $dataPt);
last unless defined $v;
$$val{$k} = $v;
}
} elsif ($tok eq 'l') { # list
$val = [ ];
for (;;) {
- my $v = ReadBencode($raf, $dataPt);
+ my $v = ReadBencode($et, $raf, $dataPt);
last unless defined $v;
push @$val, $v;
}
@@ -165,8 +166,14 @@ sub ReadBencode($$)
}
if (defined $value) {
# return as binary data unless it is a reasonable-length ASCII string
- if (length($value) > 256 or $value =~ /[^\t\x20-\x7e]/) {
+ if (length($value) > 256) {
$val = \$value;
+ } elsif ($value =~ /[^\t\x20-\x7e]/) {
+ if (Image::ExifTool::XMP::IsUTF8(\$value) >= 0) {
+ $val = $et->Decode($value, 'UTF8');
+ } else {
+ $val = \$value;
+ }
} else {
$val = $value;
}
@@ -206,7 +213,7 @@ sub ExtractTags($$$;$$@)
my $tagInfo = $et->GetTagInfo($tagTablePtr, $id) or next;
if (ref $val eq 'ARRAY') {
if ($$tagInfo{JoinPath}) {
- $val = join '/', @$val;
+ $val = join '/', map { ref $_ ? '(Binary data)' : $_ } @$val;
} else {
push @more, @$val;
next if ref $more[0] eq 'ARRAY'; # continue expanding nested lists
@@ -273,7 +280,7 @@ sub ProcessTorrent($$)
my $raf = $$dirInfo{RAF};
my $buff = '';
pos($buff) = 0;
- my $dict = ReadBencode($raf, \$buff);
+ my $dict = ReadBencode($et, $raf, \$buff);
my $err = $$raf{BencodeError};
$et->Warn("Bencode error: $err") if $err;
if (ref $dict eq 'HASH' and ($$dict{announce} or $$dict{'created by'})) {
diff --git a/lib/Image/ExifTool/WriteQuickTime.pl b/lib/Image/ExifTool/WriteQuickTime.pl
index fca98add..f31dabe8 100644
--- a/lib/Image/ExifTool/WriteQuickTime.pl
+++ b/lib/Image/ExifTool/WriteQuickTime.pl
@@ -317,7 +317,7 @@ sub FormatQTValue($$;$$)
if ($writable and $qtFormat{$writable}) {
$flags = $qtFormat{$writable};
} else {
- $flags = $qtFormat{$format} || 0;
+ $flags = $qtFormat{$format || 0} || 0;
}
} elsif ($$valPt =~ /^\xff\xd8\xff/) {
$flags = 0x0d; # JPG
diff --git a/lib/Image/ExifTool/XMP.pm b/lib/Image/ExifTool/XMP.pm
index d62dcae3..f608609c 100644
--- a/lib/Image/ExifTool/XMP.pm
+++ b/lib/Image/ExifTool/XMP.pm
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
use Image::ExifTool::GPS;
require Exporter;
-$VERSION = '3.42';
+$VERSION = '3.43';
@ISA = qw(Exporter);
@EXPORT_OK = qw(EscapeXML UnescapeXML);
@@ -3258,8 +3258,14 @@ NoLoop:
}
}
# generate a default tagInfo hash if necessary
- $tagInfo or $tagInfo = { Name => $name, IsDefault => 1, Priority => 0 };
-
+ unless ($tagInfo) {
+ # shorten tag name if necessary
+ if ($$et{ShortenXmpTags}) {
+ my $shorten = $$et{ShortenXmpTags};
+ $name = &$shorten($name);
+ }
+ $tagInfo = { Name => $name, IsDefault => 1, Priority => 0 };
+ }
# add tag Namespace entry for tags in variable-namespace tables
$$tagInfo{Namespace} = $xns if $xns;
if ($$et{curURI}{$ns} and $$et{curURI}{$ns} =~ m{^http://ns.exiftool.(?:ca|org)/(.*?)/(.*?)/}) {
@@ -3778,6 +3784,7 @@ sub ParseXMPElement($$$;$$$$)
# (unless we already extracted shorthand values from this element)
if (length $val or not $shorthand) {
my $lastProp = $$propList[-1];
+ $lastProp = '' unless defined $lastProp;
if (defined $nodeID) {
SaveBlankInfo($blankInfo, $propList, $val);
} elsif ($lastProp eq 'rdf:type' and $wasEmpty) {
diff --git a/lib/Image/ExifTool/ZISRAW.pm b/lib/Image/ExifTool/ZISRAW.pm
index 23804eb9..1b88287c 100644
--- a/lib/Image/ExifTool/ZISRAW.pm
+++ b/lib/Image/ExifTool/ZISRAW.pm
@@ -14,7 +14,7 @@ use strict;
use vars qw($VERSION);
use Image::ExifTool qw(:DataAccess :Utils);
-$VERSION = '1.00';
+$VERSION = '1.01';
%Image::ExifTool::ZISRAW::Main = (
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -42,6 +42,123 @@ $VERSION = '1.00';
);
#------------------------------------------------------------------------------
+# Shorten obscenely long CZI tag names
+# Inputs: Tag name
+# Returns: Shortened tag name
+sub ShortenTagNames($)
+{
+ local $_;
+ $_ = shift;
+ s/^HardwareSetting//;
+ s/^DevicesDevice/Device/;
+ s/LightPathNode//g;
+ s/Successors//g;
+ s/ExperimentExperiment/Experiment/g;
+ s/ObjectivesObjective/Objective/;
+ s/ChannelsChannel/Channel/;
+ s/TubeLensesTubeLens/TubeLens/;
+ s/^ExperimentHardwareSettingsPoolHardwareSetting/HardwareSetting/;
+ s/SharpnessMeasureSetSharpnessMeasure/Sharpness/;
+ s/FocusSetupAutofocusSetup/Autofocus/;
+ s/TracksTrack/Track/;
+ s/ChannelRefsChannelRef/ChannelRef/;
+ s/ChangerChanger/Changer/;
+ s/ElementsChangerElement/Changer/;
+ s/ChangerElements/Changer/;
+ s/ContrastChangerContrast/Contrast/;
+ s/KeyFunctionsKeyFunction/KeyFunction/;
+ s/ManagerContrastManager(Contrast)?/ManagerContrast/;
+ s/ObjectiveChangerObjective/ObjectiveChanger/;
+ s/ManagerLightManager/ManagerLight/;
+ s/WavelengthAreasWavelengthArea/WavelengthArea/;
+ s/ReflectorChangerReflector/ReflectorChanger/;
+ s/^StageStageAxesStageAxis/StageAxis/;
+ s/ShutterChangerShutter/ShutterChanger/;
+ s/OnOffChangerOnOff/OnOffChanger/;
+ s/UnsharpMaskStateUnsharpMask/UnsharpMask/;
+ s/Acquisition/Acq/;
+ s/Continuous/Cont/;
+ s/Resolution/Res/;
+ s/Experiment/Expt/g;
+ s/Threshold/Thresh/;
+ s/Reference/Ref/;
+ s/Magnification/Mag/;
+ s/Original/Orig/;
+ s/FocusSetupFocusStrategySetup/Focus/;
+ s/ParametersParameter/Parameter/;
+ s/IntervalInfo/Interval/;
+ s/ExptBlocksAcqBlock/AcqBlock/;
+ s/MicroscopesMicroscope/Microscope/;
+ s/TimeSeriesInterval/TimeSeries/;
+ s/Interval(.*Interval)/$1/;
+ s/SingleTileRegionsSingleTileRegion/SingleTileRegion/;
+ s/AcquisitionMode//;
+ s/DetectorsDetector/Detector/;
+ s/Setup//;
+ s/Setting//;
+ s/TrackTrack/Track/;
+ s/AnalogOutMaximumsAnalogOutMaximum/AnalogOutMaximum/;
+ s/AnalogOutMinimumsAnalogOutMinimum/AnalogOutMinimum/;
+ s/DigitalOutLabelsDigitalOutLabelLabel/DigitalOutLabelLabel/;
+ s/(VivaTomeOpticalSectionInformation)+VivaTomeOpticalSectionInformation/VivaTomeOpticalSectionInformation/;
+ s/FocusDefiniteFocus/FocusDefinite/;
+ s/ChangerChanger/Changer/;
+ s/Calibration/Cal/;
+ s/LightSwitchChangerRLTLSwitch/LightSwitchChangerRLTL/;
+ s/Parameters//;
+ s/Fluorescence/Fluor/;
+ s/CameraGeometryCameraGeometry/CameraGeometry/;
+ s/CameraCamera/Camera/;
+ s/DetectorsCamera/Camera/;
+ s/FilterChangerLeftChangerEmissionFilter/LeftChangerEmissionFilter/;
+ s/SwitchingStatesSwitchingState/SwitchingState/;
+ s/Information/Info/;
+ s/SubDimensions?//g;
+ s/Setups?//;
+ s/Parameters?//;
+ s/Calculate/Calc/;
+ s/Visibility/Vis/;
+ s/Orientation/Orient/;
+ s/ListItems/Items/;
+ s/Increment/Incr/;
+ s/Parameter/Param/;
+ s/(ParfocalParcentralValues)+ParfocalParcentralValue/Parcentral/;
+ s/ParcentralParcentral/Parcentral/;
+ s/CorrFocusCorrection/FocusCorr/;
+ s/(ApoTomeDepthInfo)+Element/ApoTomeDepth/;
+ s/(ApoTomeClickStopInfo)+Element/ApoTomeClickStop/;
+ s/DepthDepth/Depth/;
+ s/(Devices?)+Device/Device/;
+ s/(BeamPathNode)+/BeamPathNode/;
+ s/BeamPathsBeamPath/BeamPath/g;
+ s/BeamPathBeamPath/BeamPath/g;
+ s/Configuration/Config/;
+ s/StageAxesStageAxis/StageAxis/;
+ s/RangesRange/Range/;
+ s/DataGridDatasGridData(Grid)?/DataGrid/;
+ s/DataMicroscopeDatasMicroscopeData(Microscope)?/DataMicroscope/;
+ s/DataWegaDatasWegaData/DataWega/;
+ s/ClickStopPositionsClickStopPosition/ClickStopPosition/;
+ s/LightSourcess?LightSource(Settings)?(LightSource)?/LightSource/;
+ s/FilterSetsFilterSet/FilterSet/;
+ s/EmissionFiltersEmissionFilter/EmissionFilter/;
+ s/ExcitationFiltersExcitationFilter/ExcitationFilter/;
+ s/FiltersFilter/Filter/;
+ s/DichroicsDichroic/Dichronic/;
+ s/WavelengthsWavelength/Wavelength/;
+ s/MultiTrackSetup/MultiTrack/;
+ s/TrackTrack/Track/;
+ s/DataGrabberSetup/DataGrabber/;
+ s/CameraFrameSetup/CameraFrame/;
+ s/TimeSeries(TimeSeries|Setups)/TimeSeries/;
+ s/FocusFocus/Focus/;
+ s/FocusAutofocus/Autofocus/;
+ s/Focus(Hardware|Software)(Autofocus)+/Autofocus$1/;
+ s/AutofocusAutofocus/Autofocus/;
+ return $_;
+}
+
+#------------------------------------------------------------------------------
# Extract metadata from a ZISRAW (CZI) image
# Inputs: 0) ExifTool object reference, 1) dirInfo reference
# Returns: 1 on success, 0 if this wasn't a valid CZI file
@@ -76,7 +193,9 @@ sub ProcessCZI($$)
$tagTablePtr = GetTagTable('Image::ExifTool::XMP::XML');
$dirInfo{DirLen} = length $buff;
# shorten tag names somewhat by removing 'ImageDocumentMetadata' prefix from all
- $$et{XmpIgnoreProps} = [ 'ImageDocument', 'Metadata' ];
+ $$et{XmpIgnoreProps} = [ 'ImageDocument', 'Metadata', 'Information' ];
+ $$et{ShortenXmpTags} = \&ShortenTagNames;
+
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
return 1;