diff options
author | exiftool <exiftool@users.sourceforge.net> | 2021-06-22 16:00:25 -0400 |
---|---|---|
committer | exiftool <exiftool@users.sourceforge.net> | 2021-06-22 16:00:25 -0400 |
commit | 11f9b77c6de851baea89fb24e56acadca64c0112 (patch) | |
tree | 056d0c666639714e26668325c231625ed0104344 /lib/Image | |
parent | 3793c3b76cfeb9f3845c3d8ab96bba6f03828b1f (diff) |
Update to 12.28
Diffstat (limited to 'lib/Image')
-rw-r--r-- | lib/Image/ExifTool.pm | 11 | ||||
-rw-r--r-- | lib/Image/ExifTool.pod | 83 | ||||
-rw-r--r-- | lib/Image/ExifTool/LIF.pm | 153 | ||||
-rw-r--r-- | lib/Image/ExifTool/Olympus.pm | 4 | ||||
-rw-r--r-- | lib/Image/ExifTool/Panasonic.pm | 15 | ||||
-rw-r--r-- | lib/Image/ExifTool/QuickTime.pm | 36 | ||||
-rw-r--r-- | lib/Image/ExifTool/Sony.pm | 19 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagLookup.pm | 4 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagNames.pod | 15 | ||||
-rw-r--r-- | lib/Image/ExifTool/Torrent.pm | 29 | ||||
-rw-r--r-- | lib/Image/ExifTool/WriteQuickTime.pl | 2 | ||||
-rw-r--r-- | lib/Image/ExifTool/XMP.pm | 13 | ||||
-rw-r--r-- | lib/Image/ExifTool/ZISRAW.pm | 123 |
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; |