diff options
author | exiftool <exiftool@users.sourceforge.net> | 2019-08-29 12:36:51 -0400 |
---|---|---|
committer | exiftool <exiftool@users.sourceforge.net> | 2019-08-29 12:36:51 -0400 |
commit | 52774744d6de887a774d7a823b7cbe1366750aa9 (patch) | |
tree | a9a6394188b5246ca43aac0c7c5531ea916bc627 /lib | |
parent | 1cde0fb7a47bb8577dd02f357a5d2fa1415c3b87 (diff) |
Update to 11.65
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Image/ExifTool.pm | 2 | ||||
-rw-r--r-- | lib/Image/ExifTool.pod | 36 | ||||
-rw-r--r-- | lib/Image/ExifTool/BuildTagLookup.pm | 6 | ||||
-rw-r--r-- | lib/Image/ExifTool/Canon.pm | 5 | ||||
-rw-r--r-- | lib/Image/ExifTool/PNG.pm | 15 | ||||
-rw-r--r-- | lib/Image/ExifTool/Sony.pm | 95 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagNames.pod | 20 | ||||
-rw-r--r-- | lib/Image/ExifTool/XMPStruct.pl | 17 |
8 files changed, 114 insertions, 82 deletions
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm index 45269505..e59d0c86 100644 --- a/lib/Image/ExifTool.pm +++ b/lib/Image/ExifTool.pm @@ -27,7 +27,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd %jpegMarker %specialTags %fileTypeLookup); -$VERSION = '11.64'; +$VERSION = '11.65'; $RELEASE = ''; @ISA = qw(Exporter); %EXPORT_TAGS = ( diff --git a/lib/Image/ExifTool.pod b/lib/Image/ExifTool.pod index 604f501c..c10cc477 100644 --- a/lib/Image/ExifTool.pod +++ b/lib/Image/ExifTool.pod @@ -627,20 +627,23 @@ fork of Mac OS files. Default is undef. =item FastScan -Flag to increase speed of extracting information from JPEG images. With -this option set to 1, ExifTool will not scan to the end of a JPEG image to -check for an AFCP, CanonVRD, FotoStation, PhotoMechanic, MIE or PreviewImage -trailer. This also stops the parsing after the first comment in GIF images, -and at the audio/video data with RIFF-format files (AVI, WAV, etc), so any -trailing metadata (eg. XMP written by some utilities) may be missed. Also -disables input buffering for some types of files to reduce memory usage when -reading from a non-seekable stream. When combined with the ScanForXMP -option, prevents scanning for XMP in recognized file types. With a value of -2, ExifTool will also avoid extracting any EXIF MakerNote information. When -set to 3 or 4, only pseudo system tags and FileType are generated. For 3, -the file header is read to provide an educated guess at FileType. For 4, -the file is not read at all and FileType is determined based on the file's -extension. Default is undef. +Flag to increase speed when reading files by avoiding extraction of some +types of metadata. With this option set to 1, ExifTool will not scan to the +end of a JPEG image to check for an AFCP, CanonVRD, FotoStation, +PhotoMechanic, MIE or PreviewImage trailer. This also stops the parsing +after the first comment in GIF images, and at the audio/video data of +RIFF-format files (AVI, WAV, etc), so any trailing metadata (eg. XMP written +by some utilities) may be missed. Also disables input buffering for some +types of files to reduce memory usage when reading from a non-seekable +stream. When combined with the ScanForXMP option, prevents scanning for XMP +in recognized file types. With a value of 2, ExifTool will also avoid +extracting any EXIF MakerNote information, and will stop parsing at the IDAT +chunk of PNG images. (By the PNG specification, metadata is allowed after +IDAT, but ExifTool always writes it before because some utilities will +ignore it otherwise.) When set to 3 or 4, only pseudo system tags and +FileType are generated. For 3, the file header is read to provide an +educated guess at FileType. For 4, the file is not read at all and FileType +is determined based on the file's extension. Default is undef. =item Filter @@ -681,8 +684,9 @@ it is within GeoMaxExtSecs, otherwise geotagging fails). Default is 1800. Maximum extrapolation time in seconds for geotagging. Geotagging fails if the Geotime value lies outside a GPS track by a number of seconds greater -than this. Otherwise, the coordinates of the nearest fix are taken. -Default is 1800. +than this. Otherwise, for an extrapolation the coordinates of the nearest +fix are taken (ie. it is assumed that you weren't moving during this +period). Default is 1800. =item GeoMaxHDOP diff --git a/lib/Image/ExifTool/BuildTagLookup.pm b/lib/Image/ExifTool/BuildTagLookup.pm index e88977f7..53053bc1 100644 --- a/lib/Image/ExifTool/BuildTagLookup.pm +++ b/lib/Image/ExifTool/BuildTagLookup.pm @@ -35,7 +35,7 @@ use Image::ExifTool::Sony; use Image::ExifTool::Validate; use Image::ExifTool::MacOS; -$VERSION = '3.26'; +$VERSION = '3.27'; @ISA = qw(Exporter); sub NumbersFirst($$); @@ -171,7 +171,9 @@ is the identifier that is actually stored in the file. B<Index#> refers to the offset of a value when found at a fixed position within a data block (B<#> is the multiplier for calculating a byte offset: B<1>, B<2>, B<4> or B<8>). These offsets may have a decimal part which is used only to -differentiate tags with values stored at the same position. B<Sequence> +differentiate tags with values stored at the same position. (Note that +writable tags within binary data blocks are not individually deletable, +and the usual alternative is to set them to a value of zero.) B<Sequence> gives the order of values for a serial data stream. A B<Tag Name> is the handle by which the information is accessed in diff --git a/lib/Image/ExifTool/Canon.pm b/lib/Image/ExifTool/Canon.pm index 5ac3bd4f..87ba1d3c 100644 --- a/lib/Image/ExifTool/Canon.pm +++ b/lib/Image/ExifTool/Canon.pm @@ -88,7 +88,7 @@ sub ProcessCTMD($$$); sub ProcessExifInfo($$$); sub SwapWords($); -$VERSION = '4.23'; +$VERSION = '4.24'; # Note: Removed 'USM' from 'L' lenses since it is redundant - PH # (or is it? Ref 32 shows 5 non-USM L-type lenses) @@ -810,6 +810,7 @@ $VERSION = '4.23'; 0x804 => 'PowerShot G5 X Mark II', 0x805 => 'PowerShot SX70 HS', 0x808 => 'PowerShot G7 X Mark III', + 0x811 => 'EOS M6 Mark II', #IB # (see http://cweb.canon.jp/e-support/faq/answer/digitalcamera/10447-1.html for PowerShot/IXUS/IXY names) @@ -911,6 +912,7 @@ $VERSION = '4.23'; 0x80000432 => 'EOS Rebel T7 / 2000D / 1500D / Kiss X90', #IB 0x80000433 => 'EOS RP', 0x80000436 => 'EOS SL3 / 250D / Kiss X10', #25 + 0x80000437 => 'EOS 90D', #IB ); my %canonQuality = ( @@ -7878,6 +7880,7 @@ my %ciMaxFocal = ( 16 => '16 (M50)', 17 => '17 (EOS R)', # (and PowerShot SX740HS) 18 => '18 (EOS RP)', # (and PowerShot SX70HS) + 19 => '19 (90D/M6mkII)',# (and PowerShot G7XmkIII) }, }, 0x47 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, diff --git a/lib/Image/ExifTool/PNG.pm b/lib/Image/ExifTool/PNG.pm index 3e0480f3..d716696b 100644 --- a/lib/Image/ExifTool/PNG.pm +++ b/lib/Image/ExifTool/PNG.pm @@ -36,7 +36,7 @@ use strict; use vars qw($VERSION $AUTOLOAD %stdCase); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.52'; +$VERSION = '1.53'; sub ProcessPNG_tEXt($$$); sub ProcessPNG_iTXt($$$); @@ -1248,15 +1248,12 @@ sub ProcessPNG($$) my $datChunk = ''; my $datCount = 0; my $datBytes = 0; - my ($n, $sig, $err, $hbuf, $dbuf, $cbuf); + my ($n, $sig, $err, $hbuf, $dbuf, $cbuf, $fastScan); my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset); # check to be sure this is a valid PNG/MNG/JNG image return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig}; - # disable buffering in FastScan mode - $$raf{NoBuffer} = 1 if $et->Options('FastScan') and not $outfile; - if ($outfile) { delete $$et{TextChunkType}; Write($outfile, $sig) or $err = 1 if $outfile; @@ -1266,6 +1263,10 @@ sub ProcessPNG($$) \%Image::ExifTool::PNG::TextualData); # initialize with same directories, with PNG tags taking priority $et->InitWriteDirs(\%pngMap,'PNG'); + } else { + $fastScan = $et->Options('FastScan'); + # disable buffering in FastScan mode + $$raf{NoBuffer} = 1 if $fastScan; } my ($fileType, $hdrChunk, $endChunk) = @{$pngLookup{$sig}}; $et->SetFileType($fileType); # set the FileType tag @@ -1347,6 +1348,10 @@ sub ProcessPNG($$) next; } if ($isDatChunk{$chunk}) { + if ($fastScan and $fastScan >= 2) { + $et->VPrint(0,"End processing at $chunk chunk due to FastScan=$fastScan setting"); + last; + } $datChunk = $chunk; $datCount++; $datBytes += $len; diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm index 7d75f268..243621a6 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.15'; +$VERSION = '3.16'; sub ProcessSRF($$$); sub ProcessSR2($$$); @@ -139,6 +139,8 @@ sub PrintInvLensSpec($;$$); 32850 => 'Sony FE 135mm F1.8 GM', #IB 32851 => 'Sony FE 200-600mm F5.6-6.3 G OSS', #IB 32852 => 'Sony FE 600mm F4 GM OSS', #IB + 32853 => 'Sony E 16-55mm F2.8 G', #IB/JR + 32854 => 'Sony E 70-350mm F4.5-6.3 G OSS', #IB/JR 32858 => 'Sony FE 35mm F1.8', #JR/IB # (comment this out so LensID will report the LensModel, which is more useful) @@ -940,7 +942,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # unknown offsets or values for DSC-HX60V/HX350/HX400V/QX10/QX30/QX100/RX10/RX100M2/RX100M3/WX220/WX350, # ILCA-68/77M2, ILCE-5000/5100/6000/7/7M2/7R/7S/QX1, Stellar2, Lusso # unknown offsets or values for DSC-HX80/HX90V/RX0/RX1RM2/RX10M2/RX10M3/RX100M4/RX100M5/WX500, ILCE-6300/6500/7RM2/7SM2, ILCA-99M2 - # unknown offsets or values for ILCE-6400/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/HX99 + # unknown offsets or values for ILCE-6100/6400/6600/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99 { Name => 'Tag2010a', # ad Condition => '$$self{Model} =~ /^NEX-5N$/', @@ -981,7 +983,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010h' }, },{ Name => 'Tag2010i', # ? - Condition => '$$self{Model} =~ /^(ILCE-(6400|7M3|7RM3|7RM4|9)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2))\b/', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9)|DSC-(RX10M4|RX100M6|RX100M5A|RX100M7|HX99|RX0M2))\b/', SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010i' }, },{ Name => 'Tag_0x2010', @@ -1436,8 +1438,9 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # first 4 bytes: GroupID, read as int32u # the ID displayed by Sony ImageDataConverter appears to be based on the lower 22 bits: # 5 bits, 5 bits, 6 bits, 6 bits - # last 2 bytes: ShotNumber: (1 4) to (4 4) are the 4 source images, - # (0 4) is combined "PixelShifted" image + # last 2 bytes: ShotNumber: (1 4) to (4 4) and (1 16) to (16 16) are the 4 or 16 source images, + # (0 4) is the combined image for 4-shot PixelShift mode + # (0 16) is the combined image for 16-shot PixelShift mode (ILCE-7RM4) RawConv => q{ my ($a,$b,$c) = (Get32u(\$val,0), Get8u(\$val,4), Get8u(\$val,5)); sprintf("%.2d%.2d%.2d%.2d %d %d 0x%x",($a>>17)&0x1f,($a>>12)&0x1f,($a>>6)&0x3f,$a&0x3f,$b,$c,$a>>22); @@ -1453,11 +1456,11 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); OTHER => sub { my ($val, $inv) = @_; if ($inv) { - $val =~ s{Composed}{Shot 0/4}i; + $val =~ s{Composed (\d+)-shot}{Shot 0/$1}i; $val =~ s{^(?:Group)?\s*(\d+)[, ]+(?:Shot\s*)?(\d+)[/ ](\d+)\s*\(?(\w+)\)?}{$1 $2 $3 $4}i or return undef; } else { $val =~ s{(\d+) (\d+) (\d+) (\w+)}{Group $1, Shot $2/$3 ($4)} or return undef; - $val =~ s{Shot\s*0+/0*4\b}{Composed}i; + $val =~ s{Shot 0+/0*(\d+)\b}{Composed $1-shot}i; } return $val; }, @@ -1499,14 +1502,14 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # from mid-2015: ILCE-7RM2/7SM2/6300 and newer models use different offsets { Name => 'Tag9050a', - Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6300|6400|6500|7M3|7RM2|7RM3|7RM4|7SM2|9)|ILCA-99M2)/', + Condition => '$$self{Model} !~ /^(DSC-|Stellar|ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|9)|ILCA-99M2)/', SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9050a', ByteOrder => 'LittleEndian', }, },{ Name => 'Tag9050b', - Condition => '$$self{Model} =~ /^(ILCE-(6300|6400|6500|7M3|7RM2|7RM3|7RM4|7SM2|9)|ILCA-99M2)/', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6300|6400|6500|6600|7M3|7RM2|7RM3|7RM4|7SM2|9)|ILCA-99M2)/', SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9050b', ByteOrder => 'LittleEndian', @@ -1524,9 +1527,9 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # 0xd0 (e) H90, W650, W690: tag9400 decoding appears not valid/different # 0x23 (e) for DSC-RX10/HX60V/HX350/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-68/77M2 # 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-6400/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99 - # 0x28 (e) for ILCE-7RM4 - # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215 respectively + # 0x26 (e) for ILCE-6100/6400/6600/7M3/7RM3/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99 + # 0x28 (e) for ILCE-7RM4, DSC-RX100M7 + # first byte decoded: 40, 204, 202, 27, 58, 62, 48, 215, 28 respectively { Name => 'Tag9400a', Condition => q{ @@ -1598,9 +1601,10 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # 80 00 fa 0f 0x0add (x) ILCE-7M3/7RM3 v1.00-v3.01 # 82 00 fc 0f 0x0ad9 (y) DSC-RX100M5A v1.00, DSC-RX100M6 v1.00 # 90 00 fe 0f 0x098f? (z) DSC-HX99 v1.00 - # 92 10 ff 0f 0x0990 (za) ILCE-6400 v1.00 + # 92 10 ff 0f 0x0990 (za) ILCE-6100/6400/6600 v1.00 # 94 00 ce 0b 0x0879 (zb) ILCE-9 v5.0x, DSC-RX0M2 # 98 00 db 0c 0x088a (zc) ILCE-7RM4 v1.00 + # 9a 00 e3 0c 0x088a (zc) DSC-RX100M7 v1.00 # # 0x0004 - (RX100: 0 or 1. subsequent data valid only if 1 - PH) # 0x0007 => { @@ -1639,7 +1643,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # 0x1d 0x01 DSC-RX10M4 # 0x1e 0x01 ILCE-7M3/7RM3, DSC-RX100M5A/RX100M6 # 0x1f 0x01 DSC-HX99 - # 0x20 0x01 ILCE-6400/7RM4, ILCE-9 v5.0x, DSC-RX0M2 + # 0x20 0x01 ILCE-6100/6400/6600/7RM4, ILCE-9 v5.0x, DSC-RX0M2/RX100M7 # var var SLT-A58/A99V, HV, ILCA-68/77M2/99M2 # only valid when first byte 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x1c (enciphered 0x8a, 0x70, 0xb6, 0x69, 0x88, 0x20, 0x30, 0xd7, 0xbb, 0x92, 0x28) # Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46\x1d\x18\x3a\x95\x24\x26\xd6]\x01/ : $$valPt =~ /^[\x8a\x70\xb6\x69\x88\x20\x30\xd7\xbb\x92\x28]\x01/', @@ -1663,7 +1667,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # 13 0 9 2 2 DSC-QX10/QX100/RX100M2 # 15 0 35 2 2 ILCA-68/77M2, ILCE-5000/5100/6000/7/7R/7S/7M2/QX1, DSC-HX60V/HX350/HX400V/QX30/RX10/RX100M3/WX220/WX350 # 16 0 85 2 2 DSC-HX80/HX90V/WX500 - # 17 0 232 1 2 DSC-RX0/RX0M2/RX1RM2/RX10M2/RX10M3/RX10M4/RX100M4/RX100M5/RX100M5A/RX100M6/HX99, ILCE-6300/6400/6500/7M3/7RM2/7RM3/7RM4/7SM2/9, ILCA-99M2 + # 17 0 232 1 2 DSC-RX0/RX0M2/RX1RM2/RX10M2/RX10M3/RX10M4/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/HX99, ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9, ILCA-99M2 # other values for Panorama images and several other models 0x9404 => [{ Name => 'Tag9404a', @@ -1697,7 +1701,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); # 142 var (0x25 = 37 var enc.) DSC-HX80/HX90V/RX1RM2/RX10M2/RX10M3/RX100M4/WX500, ILCE-6300/7RM2/7SM2 # 144 var (0xe1 = 225 var enc.) DSC-RX100M5 # 145 var (0x76 = 118 var enc.) ILCA-99M2, ILCE-6500, DSC-RX0 - # 163 var (0x8b = 139 var enc.) ILCE-6400/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/HX99 + # 163 var (0x8b = 139 var enc.) ILCE-6100/6400/6600/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M5A/RX100M6/RX100M7/HX99 0x9405 => [{ Name => 'Tag9405a', # first byte must be 0x1b or 0x40 or 0x7d @@ -1715,7 +1719,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); 0x9406 => [{ Name => 'Tag9406', # - first byte must be 0x01 or 0x02 (enciphered 0x01 or 0x08), - # or 0x03 (enc. 0x1b) for ILCE-6300/6400/6500/7M3/7RM2/7RM3/7RM4/7SM2/9, and ILCA-99M2 + # or 0x03 (enc. 0x1b) for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9, and ILCA-99M2 # third byte must be 0x02 or 0x03 (enciphered 0x08 or 0x1b) - ref JR # (applies to most SLT/ILCA and NEX/ILCE models, but no DSC models) Condition => '$$valPt =~ /^[\x01\x08\x1b].[\x08\x1b]/s', @@ -1896,6 +1900,8 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); 372 => 'DSC-RX0M2', #JR 374 => 'DSC-RX100M7', #IB 375 => 'ILCE-7RM4', #IB + 378 => 'ILCE-6600', #IB/JR + 379 => 'ILCE-6100', #IB/JR }, }, 0xb020 => { #2 @@ -2193,6 +2199,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 ); 4 => '+4/3', #JR (NC) 5 => '+5/3', #JR (NC) 6 => '+6/3', #JR + 9 => '+9/3', #JR 128 => 'n/a', #JR (HX9V) 32767 => 'High', }, @@ -6794,7 +6801,7 @@ my %isoSetting2010 = ( CHECK_PROC => \&Image::ExifTool::CheckBinaryData, FORMAT => 'int8u', NOTES => q{ - Valid for ILCE-6400/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/HX99. + Valid for ILCE-6100/6400/6600/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99. }, WRITABLE => 1, FIRST_ENTRY => 0, @@ -7366,7 +7373,7 @@ my %isoSetting2010 = ( CHECK_PROC => \&Image::ExifTool::CheckBinaryData, FORMAT => 'int8u', NOTES => q{ - Valid from July 2015 for ILCE-6300/6400/6500/7M3/7RM2/7RM3/7RM4/7SM2/9, + Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9, ILCA-99M2. }, WRITABLE => 1, @@ -7455,7 +7462,7 @@ my %isoSetting2010 = ( # March 2019: ILCE-9 with v5.0x firmware follows ILCE-6400 in many tags ... 0x0050 => { Name => 'ShutterCount2', - Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6400|7RM4))/ or $$self{Software} =~ /^ILCE-9 v5.0/)', + Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} =~ /^(ILCE-(6100|6400|6600|7RM4))/ or $$self{Software} =~ /^ILCE-9 v5.0/)', Format => 'int32u', RawConv => '$val & 0x00ffffff', }, @@ -7472,13 +7479,13 @@ my %isoSetting2010 = ( # 0x0058, 0x0061: E-Mount: ShutterCount and dateTime 0x0058 => { # appears not valid when flash is used ... not for ILCA-99M2 Name => 'ShutterCount2', - Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} !~ /^(ILCA-99M2|ILCE-(6400|7M3|7RM3|7RM4))/) and $$self{Software} !~ /^ILCE-9 v5.0/', + Condition => '(($$self{FlashFired} & 0x01) != 1) and ($$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7M3|7RM3|7RM4))/) and $$self{Software} !~ /^ILCE-9 v5.0/', Format => 'int32u', RawConv => '$val & 0x00ffffff', }, 0x0061 => { # only minutes-seconds, not for ILCA-99M2, ILCE-9 Name => 'SonyTimeMinSec', - Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6400|7M3|7RM3|7RM4|9))/', + Condition => '$$self{Model} !~ /^(ILCA-99M2|ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9))/', Format => 'undef[2]', ValueConv => q{ my @v = unpack('C*', $val); @@ -7487,7 +7494,7 @@ my %isoSetting2010 = ( }, 0x006b => { Name => 'ReleaseMode2', - Condition => '$$self{Model} =~ /^(ILCE-(6400|7RM4))/ or $$self{Software} =~ /^ILCE-9 v5.0/', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7RM4))/ or $$self{Software} =~ /^ILCE-9 v5.0/', %releaseMode2, }, 0x006d => { @@ -7497,7 +7504,7 @@ my %isoSetting2010 = ( }, 0x0073 => { Name => 'ReleaseMode2', - Condition => '$$self{Model} !~ /^(ILCE-(6400|7M3|7RM3|7RM4))/ and $$self{Software} !~ /^ILCE-9 v5.0/', + Condition => '$$self{Model} !~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4))/ and $$self{Software} !~ /^ILCE-9 v5.0/', %releaseMode2, }, 0x0088 => { @@ -7568,7 +7575,7 @@ my %isoSetting2010 = ( # 0x019f => { Name => 'ShutterCount3', - Condition => '$$self{Model} =~ /^(ILCE-(6400|7M3|7RM3|7RM4|9))/', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9))/', Format => 'int32u', RawConv => '$val == 0 ? undef : $val', }, @@ -7620,7 +7627,7 @@ my %isoSetting2010 = ( }, 0x01f0 => { Name => 'LensSpecFeatures', - Condition => '$$self{Model} =~ /^(ILCE-(6400|7M3|7RM3|9))/ and $$self{Software} !~ /^ILCE-9 v5.0/', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|9))/ and $$self{Software} !~ /^ILCE-9 v5.0/', Priority => 0, Format => 'undef[2]', ValueConv => 'join " ", unpack "H2H2", $val', @@ -7827,15 +7834,15 @@ my %isoSetting2010 = ( WRITABLE => 1, NOTES => q{ Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/ - RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/WX220/WX350/ - WX500, ILCE-7/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/9/5000/5100/6000/6300/6400/ - 6500/QX1, ILCA-68/77M2/99M2. + RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/ + WX220/WX350/WX500, ILCE-7/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/9/5000/5100/ + 6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2. }, FIRST_ENTRY => 0, GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, 0x0009 => { %releaseMode2 }, 0x000a => [{ - Condition => '$$self{Model} =~ /^(ILCE-(6400|7M3|7RM3|7RM4|9)|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))\b/', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9)|DSC-(RX10M4|RX100M6|RX100M7|RX100M5A|HX99|RX0M2))\b/', Name => 'ShotNumberSincePowerUp', Format => 'int8u', },{ @@ -7857,6 +7864,7 @@ my %isoSetting2010 = ( 9 => '9 shots', # ILCE-7RM2 9-shot bracketing 10 => '10 shots', 12 => '12 shots', # ILCA-77M2 12-shot MFNR-mode + 16 => '16 shots', # ILCE-7RM4 16-shot PixelShift 100 => 'Continuous - iSweep Panorama', 200 => 'Continuous - Sweep Panorama', }, @@ -8221,9 +8229,9 @@ my %isoSetting2010 = ( DATAMEMBER => [ 0x005e ], NOTES => q{ Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX10/RX10M2/ - RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/WX220/WX350, ILCE-7/ - 7M2/7M3/7R/7RM2/7RM3/7RM4/7S/7SM2/9/5000/5100/6000/6300/6500/QX1, ILCA-68/ - 77M2/99M2. + RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/WX350, + ILCE-7/7M2/7M3/7R/7RM2/7RM3/7RM4/7S/7SM2/9/5000/5100/6000/6100/6300/6400/ + 6500/6600/QX1, ILCA-68/77M2/99M2. }, 0x0004 => { Name => 'SonyISO', @@ -8376,7 +8384,7 @@ my %isoSetting2010 = ( }, 0x0342 => { Name => 'LensZoomPosition', - Condition => '$$self{Model} !~ /^(ILCA-|ILCE-(7RM2|7M3|7RM3|7RM4|7SM2|6300|6400|6500|9)|DSC-(HX80|HX90V|HX99|RX0|RX10M2|RX10M3|RX10M4|RX100M4|RX100M5|RX100M5A|RX100M6|RX100M7|WX500))/', + Condition => '$$self{Model} !~ /^(ILCA-|ILCE-(7RM2|7M3|7RM3|7RM4|7SM2|6100|6300|6400|6500|6600|9)|DSC-(HX80|HX90V|HX99|RX0|RX10M2|RX10M3|RX10M4|RX100M4|RX100M5|RX100M5A|RX100M6|RX100M7|WX500))/', Format => 'int16u', PrintConv => 'sprintf("%.0f%%",$val/10.24)', PrintConvInv => '$val=~s/ ?%$//; $val * 10.24', @@ -8388,7 +8396,7 @@ my %isoSetting2010 = ( }, 0x034e => { Name => 'LensZoomPosition', - Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6400|7M3|7RM3|7RM4))/', + Condition => '$$self{Model} =~ /^(DSC-(RX100M5|RX100M5A|RX100M6|RX100M7|RX10M4|HX99)|ILCE-(6100|6400|6600|7M3|7RM3|7RM4))/', Format => 'int16u', PrintConv => 'sprintf("%.0f%%",$val/10.24)', PrintConvInv => '$val=~s/ ?%$//; $val * 10.24', @@ -8400,7 +8408,7 @@ my %isoSetting2010 = ( }, 0x035c => { Name => 'VignettingCorrParams', - Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6400|6500|7M3|7RM3|7RM4|9))/', + Condition => '$$self{Model} =~ /^(ILCA-99M2|ILCE-(6100|6400|6500|6600|7M3|7RM3|7RM4|9))/', Format => 'int16s[16]', }, 0x035a => { @@ -8437,7 +8445,7 @@ my %isoSetting2010 = ( }, 0x03b8 => { Name => 'ChromaticAberrationCorrParams', - Condition => '$$self{Model} =~ /^(ILCE-(6400|7M3|7RM3|7RM4|9))/', + Condition => '$$self{Model} =~ /^(ILCE-(6100|6400|6600|7M3|7RM3|7RM4|9))/', Format => 'int16s[32]', }, ); @@ -8453,7 +8461,7 @@ my %isoSetting2010 = ( GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, # 0x0000: 1 for SLT-A37/A57/A65/A77, NEX-5N/7/F3/VG20 # 2 for SLT-A58/99V, NEX-3N/5R/5T/6/VG30/VG900, ILCA-68/77M2, ILCE-3000/3500/7/7M2/7R/7S/5000/6000 -# 3 for ILCA-99M2, ILCE-6300/6400/6500/7M3/7RM2/7RM3/7RM4/7SM2/9 +# 3 for ILCA-99M2, ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9 # 0x0001+0x0002: Int16u, seen 580 - 770: similar to "BatteryUnknown" ?? # 0x0005: int8u, seen 73 - 117: maybe Fahrenheit? Higher than "AmbientTemperature", but same trend. 0x0005 => { @@ -8601,7 +8609,7 @@ my %isoSetting2010 = ( # ILCE-6000 v1.20-v3.20 # 1.60: ILCE-6300/6500, ILCE-7RM2 v3.05-v4.00 # 1.70: ILCE-7M3/7RM3, ILCE-9 v1.00-v4.10 - # 1.80: ILCE-6400/7RM4, ILCE-9 v5.0x + # 1.80: ILCE-6100/6400/6600/7RM4, ILCE-9 v5.0x }, 0x000d => { Name => 'LensE-mountVersion', @@ -8624,9 +8632,10 @@ my %isoSetting2010 = ( # 1.41: SELP18105G Ver.02 # 1.50: SEL28F20, SEL90M28G, Zeiss Batis 18mm/25mm/85mm/135mm, Zeiss Loxia 21mm, Zeiss Loxia 35mm/50mm Ver.02, # Tokina FiRIN 20mm - # 1.60: SEL1224G, SEL1635GM, SELP18110G, SEL18135, SEL2470GM, SEL24105G, SEL35F18F, SEL50F14Z, SEL50F18F, SEL50M28, - # SEL70200GM, SEL70300G, SEL85F14GM, SEL85F18, SEL100F28GM, SEL100400GM, SEL135F18GM, SEL200600G, SEL600F40GM, - # Sigma 16F14DCDN/30F14DCDN/35F12DGDN/45F28DGDN, Sigma MC-11, Samyang AF 14mm/50mm, Voigtlander 15mm, Viltrox 85mm MF + # 1.60: SEL1224G, SEL1635GM, SEL1655G, SELP18110G, SEL18135, SEL2470GM, SEL24105G, SEL35F18F, SEL50F14Z, SEL50F18F, + # SEL50M28, SEL70200GM, SEL70300G, SEL70350G, SEL85F14GM, SEL85F18, SEL100F28GM, SEL100400GM, SEL135F18GM, + # SEL200600G, SEL600F40GM, Sigma 16F14DCDN/30F14DCDN/35F12DGDN/45F28DGDN, Sigma MC-11, Samyang AF 14mm/50mm, + # Voigtlander 15mm, Viltrox 85mm MF # 1.70: LA-EA3 Ver.02, Samyang AF 24mm/35mm/85mm, Tamron 17-28mm, 28-75mm, Tokina FiRIN 20mm AF Ver.01, Tokina FiRIN 100mm Macro, # Voigtlander 10mm/12mm/40mm/65mm, Zeiss Loxia 25mm/85mm, Sigma 14-24mm # 1.80: Voigtlander 21mm @@ -8671,7 +8680,7 @@ my %isoSetting2010 = ( # 1 1 3 0 for ILCA-68/77M2/99M2 # 0 0 0 0 for NEX and ILCE-3000/3500, also seen for SLT/ILCA with non-AF lens # 1 0 0 0 for ILCE-5000/5100/6000/7/7M2/7R/7S/QX1 - # 6 0 0 0 for ILCE-6300/6400/6500/7M3/7RM2/7RM3/7RM4/7SM2/9 + # 6 0 0 0 for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9 # 0 2 0 0 for NEX/ILCE with LA-EA2/EA4 Phase-AF adapter # 2 0 0 0 seen for a few NEX-5N images # 2 2 0 0 seen for a few NEX-5N/7 images with LA-EA2 adapter diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod index 7900a555..b9d8ad05 100644 --- a/lib/Image/ExifTool/TagNames.pod +++ b/lib/Image/ExifTool/TagNames.pod @@ -20,7 +20,9 @@ is the identifier that is actually stored in the file. B<Index#> refers to the offset of a value when found at a fixed position within a data block (B<#> is the multiplier for calculating a byte offset: B<1>, B<2>, B<4> or B<8>). These offsets may have a decimal part which is used only to -differentiate tags with values stored at the same position. B<Sequence> +differentiate tags with values stored at the same position. (Note that +writable tags within binary data blocks are not individually deletable, +and the usual alternative is to set them to a value of zero.) B<Sequence> gives the order of values for a serial data stream. A B<Tag Name> is the handle by which the information is accessed in @@ -17264,7 +17266,7 @@ ILCE-6300/6500/7RM2/7SM2, ILCA-99M2. =head3 Sony Tag2010i Tags -Valid for ILCE-6400/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/HX99. +Valid for ILCE-6100/6400/6600/7M3/7RM3/7RM4/9, DSC-RX0M2/RX10M4/RX100M6/RX100M5A/RX100M7/HX99. Index1 Tag Name Writable ------ -------- -------- @@ -17425,7 +17427,7 @@ substitution cipher, but the deciphered values are listed below. =head3 Sony Tag9050b Tags -Valid from July 2015 for ILCE-6300/6400/6500/7M3/7RM2/7RM3/7RM4/7SM2/9, +Valid from July 2015 for ILCE-6100/6300/6400/6500/6600/7M3/7RM2/7RM3/7RM4/7SM2/9, ILCA-99M2. Index1 Tag Name Writable @@ -17498,9 +17500,9 @@ DSC-HX50V, DSC-QX10/QX100. =head3 Sony Tag9400c Tags Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX1RM2/RX10/ -RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/WX220/WX350/ -WX500, ILCE-7/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/9/5000/5100/6000/6300/6400/ -6500/QX1, ILCA-68/77M2/99M2. +RX10M2/RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/ +WX220/WX350/WX500, ILCE-7/7R/7S/7M2/7M3/7RM2/7RM3/7RM4/7SM2/9/5000/5100/ +6000/6100/6300/6400/6500/6600/QX1, ILCA-68/77M2/99M2. Index1 Tag Name Writable ------ -------- -------- @@ -17598,9 +17600,9 @@ Valid for SLT, NEX, ILCE-3000/3500 and several DSC models. =head3 Sony Tag9405b Tags Valid for DSC-HX60V/HX80/HX90V/HX99/HX350/HX400V/QX30/RX0/RX10/RX10M2/ -RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/WX220/WX350, ILCE-7/ -7M2/7M3/7R/7RM2/7RM3/7RM4/7S/7SM2/9/5000/5100/6000/6300/6500/QX1, ILCA-68/ -77M2/99M2. +RX10M3/RX10M4/RX100M3/RX100M4/RX100M5/RX100M5A/RX100M6/RX100M7/WX220/WX350, +ILCE-7/7M2/7M3/7R/7RM2/7RM3/7RM4/7S/7SM2/9/5000/5100/6000/6100/6300/6400/ +6500/6600/QX1, ILCA-68/77M2/99M2. Index1 Tag Name Writable ------ -------- -------- diff --git a/lib/Image/ExifTool/XMPStruct.pl b/lib/Image/ExifTool/XMPStruct.pl index 30983fc2..f64795d4 100644 --- a/lib/Image/ExifTool/XMPStruct.pl +++ b/lib/Image/ExifTool/XMPStruct.pl @@ -622,6 +622,7 @@ sub RestoreStruct($;$) my ($key, %structs, %var, %lists, $si, %listKeys, @siList); my $ex = $$et{TAG_EXTRA}; my $valueHash = $$et{VALUE}; + my $fileOrder = $$et{FILE_ORDER}; my $tagExtra = $$et{TAG_EXTRA}; foreach $key (keys %{$$et{TAG_INFO}}) { $$ex{$key} or next; @@ -765,7 +766,13 @@ sub RestoreStruct($;$) # everything else, and this is really what we care about) my $k = $listKeys{$oldStruct}; if ($k) { # ($k will be undef for an empty structure) - $k lt $key and $et->DeleteTag($key), next; + if ($k lt $key) { + # keep lowest file order + $$fileOrder{$k} = $$fileOrder{$key} if $$fileOrder{$k} > $$fileOrder{$key}; + $et->DeleteTag($key); + next; + } + $$fileOrder{$key} = $$fileOrder{$k} if $$fileOrder{$key} > $$fileOrder{$k}; $et->DeleteTag($k); # remove tag with greater copy number } } @@ -776,11 +783,11 @@ sub RestoreStruct($;$) # save strInfo ref and file order if ($var{$strInfo}) { # set file order to just before the first associated flattened tag - if ($var{$strInfo}[1] > $$et{FILE_ORDER}{$key}) { - $var{$strInfo}[1] = $$et{FILE_ORDER}{$key} - 0.5; + if ($var{$strInfo}[1] > $$fileOrder{$key}) { + $var{$strInfo}[1] = $$fileOrder{$key} - 0.5; } } else { - $var{$strInfo} = [ $strInfo, $$et{FILE_ORDER}{$key} - 0.5 ]; + $var{$strInfo} = [ $strInfo, $$fileOrder{$key} - 0.5 ]; } # preserve original flattened tags if requested if ($keepFlat) { @@ -810,7 +817,7 @@ sub RestoreStruct($;$) foreach $si (sort { $var{$a}[1] <=> $var{$b}[1] } @siList) { $key = $et->FoundTag($var{$si}[0], ''); $$valueHash{$key} = $structs{$si}; - $$et{FILE_ORDER}{$key} = $var{$si}[1]; + $$fileOrder{$key} = $var{$si}[1]; } } |