diff options
author | exiftool <phil@u88.n24.queensu.ca> | 2014-12-13 07:44:59 -0500 |
---|---|---|
committer | exiftool <phil@u88.n24.queensu.ca> | 2014-12-13 07:44:59 -0500 |
commit | aabef0bfcd73ed78e4fa690f5905c9b712cdd429 (patch) | |
tree | da5821f1ec7b36c9eb75ab52d379efd6c48ed9f9 /lib | |
parent | 28da2693263b0168ef22a6cc3d95d7f14621e1e6 (diff) |
Update to 9.78
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Image/ExifTool.pm | 4 | ||||
-rw-r--r-- | lib/Image/ExifTool/Canon.pm | 10 | ||||
-rw-r--r-- | lib/Image/ExifTool/Nikon.pm | 3 | ||||
-rw-r--r-- | lib/Image/ExifTool/QuickTime.pm | 8 | ||||
-rw-r--r-- | lib/Image/ExifTool/Samsung.pm | 209 | ||||
-rw-r--r-- | lib/Image/ExifTool/Sony.pm | 357 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagLookup.pm | 52 | ||||
-rw-r--r-- | lib/Image/ExifTool/TagNames.pod | 84 | ||||
-rw-r--r-- | lib/Image/ExifTool/WriteExif.pl | 14 | ||||
-rw-r--r-- | lib/Image/ExifTool/WriteQuickTime.pl | 20 | ||||
-rw-r--r-- | lib/Image/ExifTool/XMPStruct.pl | 8 | ||||
-rw-r--r-- | lib/Image/ExifTool/ZIP.pm | 12 |
12 files changed, 603 insertions, 178 deletions
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm index 019787ba..9ad582b5 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); -$VERSION = '9.77'; +$VERSION = '9.78'; $RELEASE = ''; @ISA = qw(Exporter); %EXPORT_TAGS = ( @@ -1769,7 +1769,7 @@ sub ExtractInfo($;@) ($$self{TAGS_FROM_FILE} and not $$self{EXCL_TAG_LOOKUP}{filepath})) { local $SIG{'__WARN__'} = \&SetWarning; - if (eval {require Cwd}) { + if (eval { require Cwd }) { my $path = eval { Cwd::abs_path($filename) }; $self->FoundTag('FilePath', $path) if defined $path; } elsif ($$self{REQ_TAG_LOOKUP}{filepath}) { diff --git a/lib/Image/ExifTool/Canon.pm b/lib/Image/ExifTool/Canon.pm index 91a17308..01aef2bd 100644 --- a/lib/Image/ExifTool/Canon.pm +++ b/lib/Image/ExifTool/Canon.pm @@ -83,7 +83,7 @@ sub ProcessSerialData($$$); sub ProcessFilters($$$); sub SwapWords($); -$VERSION = '3.38'; +$VERSION = '3.39'; # Note: Removed 'USM' from 'L' lenses since it is redundant - PH # (or is it? Ref 32 shows 5 non-USM L-type lenses) @@ -307,6 +307,7 @@ $VERSION = '3.38'; 183 => 'Canon EF 100-400mm f/4.5-5.6L IS or Sigma Lens', 183.1 => 'Sigma 150mm f/2.8 EX DG OS HSM APO Macro', #50 183.2 => 'Sigma 105mm f/2.8 EX DG OS HSM Macro', #50 + 183.3 => 'Sigma 180mm f/2.8 EX DG OS HSM APO Macro', #52 184 => 'Canon EF 400mm f/2.8L + 2x', #15 185 => 'Canon EF 600mm f/4L IS', #32 186 => 'Canon EF 70-200mm f/4L', #9 @@ -695,6 +696,7 @@ my %canonQuality = ( 4 => 'RAW', 5 => 'Superfine', 130 => 'Normal Movie', #22 + 131 => 'Movie (2)', #PH (7DmkII 1920x1080) ); my %canonImageSize = ( -1 => 'n/a', @@ -7327,6 +7329,12 @@ my %filterConv = ( }, ); +# Canon CNOP atoms (ref PH) +%Image::ExifTool::Canon::CNOP = ( + GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, + # CNFB - 52 bytes (7DmkII) +); + # 'skip' atom of Canon MOV videos (ref PH) %Image::ExifTool::Canon::Skip = ( GROUPS => { 0 => 'MakerNotes', 1 => 'Canon', 2 => 'Video' }, diff --git a/lib/Image/ExifTool/Nikon.pm b/lib/Image/ExifTool/Nikon.pm index 8d5d4b9b..824a6c3c 100644 --- a/lib/Image/ExifTool/Nikon.pm +++ b/lib/Image/ExifTool/Nikon.pm @@ -58,7 +58,7 @@ use vars qw($VERSION %nikonLensIDs %nikonTextEncoding); use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; -$VERSION = '2.95'; +$VERSION = '2.96'; sub LensIDConv($$$); sub ProcessNikonAVI($$$); @@ -565,6 +565,7 @@ sub GetAFPointGrid($$;$); '00 54 50 50 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/50 ZF.2', '00 54 62 62 0C 0C 00 00' => 'Carl Zeiss Planar T* 1.4/85 ZF.2', '00 54 68 68 18 18 00 00' => 'Carl Zeiss Makro-Planar T* 2/100 ZF.2', + '00 54 53 53 0C 0C 00 00' => 'Zeiss 55mm f/1.4 Otus Distagon T*', #33 # '00 54 56 56 30 30 00 00' => 'Coastal Optical Systems 60mm 1:4 UV-VIS-IR Macro Apo', # diff --git a/lib/Image/ExifTool/QuickTime.pm b/lib/Image/ExifTool/QuickTime.pm index 50d721ab..9c021980 100644 --- a/lib/Image/ExifTool/QuickTime.pm +++ b/lib/Image/ExifTool/QuickTime.pm @@ -40,7 +40,7 @@ use vars qw($VERSION $AUTOLOAD); use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; -$VERSION = '1.86'; +$VERSION = '1.87'; sub FixWrongFormat($); sub ProcessMOV($$;$); @@ -1339,6 +1339,10 @@ my %graphicsMode = ( Name => 'CanonCNTH', SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNTH' }, }, + CNOP => { #PH (7DmkII) + Name => 'CanonCNOP', + SubDirectory => { TagTable => 'Image::ExifTool::Canon::CNOP' }, + }, # CNDB - 2112 bytes (550D) # CNDM - 4 bytes - 0xff,0xd8,0xff,0xd9 (S95) # CNDG - 10232 bytes, mostly zeros (N100) @@ -4236,7 +4240,7 @@ my %graphicsMode = ( 21 => 'Podcast', #15 }, }, - rate => 'Rating', #PH + rate => 'RatingPercent', #PH titl => 'Title', tven => 'TVEpisodeID', #7 tves => { #7/10 diff --git a/lib/Image/ExifTool/Samsung.pm b/lib/Image/ExifTool/Samsung.pm index 0f43d5ea..217adaf7 100644 --- a/lib/Image/ExifTool/Samsung.pm +++ b/lib/Image/ExifTool/Samsung.pm @@ -20,7 +20,7 @@ use vars qw($VERSION %samsungLensTypes); use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; -$VERSION = '1.27'; +$VERSION = '1.28'; sub WriteSTMN($$$); sub ProcessINFO($$$); @@ -129,12 +129,111 @@ my %formatMinMax = ( Writable => 'undef', Count => 4, }, + 0x0002 => { + Name => 'DeviceType', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x1000 => 'Compact Digital Camera', + 0x2000 => 'High-end NX Camera', + 0x3000 => 'HXM Video Camera', + 0x12000 => 'Cell Phone', + 0x300000 => 'SMX Video Camera', + }, + }, + 0x0003 => { + Name => 'SamsungModelID', + Writable => 'int32u', + PrintHex => 1, + PrintConv => { + 0x100101c => 'NX10', + 0x1001226 => 'HMX-S10BP', + 0x1001226 => 'HMX-S15BP', + 0x1001233 => 'HMX-Q10', + 0x1001234 => 'HMX-H300', + 0x1001234 => 'HMX-H304', + 0x100130c => 'NX100', + 0x1001327 => 'NX11', + 0x170104e => 'ES70, ES71 / VLUU ES70, ES71 / SL600', + 0x1701052 => 'ES73 / VLUU ES73 / SL605', + 0x1701300 => 'ES28 / VLUU ES28', + 0x1701303 => 'ES74,ES75,ES78 / VLUU ES75,ES78', + 0x2001046 => 'PL150 / VLUU PL150 / TL210 / PL151', + 0x2001311 => 'PL120,PL121 / VLUU PL120,PL121', + 0x2001315 => 'PL170,PL171 / VLUUPL170,PL171', + 0x200131e => 'PL210, PL211 / VLUU PL210, PL211', + 0x2701317 => 'PL20,PL21 / VLUU PL20,PL21', + 0x2a0001b => 'WP10 / VLUU WP10 / AQ100', + 0x3000000 => 'DV150F / DV151F / DV155F', + 0x3000000 => 'NX mini', + 0x3000000 => 'NX3000', + 0x3000000 => 'ST150F / ST151F / ST152F', + 0x3000000 => 'WB250F / WB251F / WB252F', + 0x3000000 => 'WB30F / WB31F / WB32F', + 0x3000000 => 'WB350F / WB351F / WB352F', + 0x3000000 => 'WB800F', + 0x3a00018 => 'ES30 / VLUU ES30', + 0x3a00018 => 'ES80 / ES81', + 0x3a00018 => 'PL200 / VLUU PL200', + 0x3a00018 => 'PL80 / VLUU PL80 / SL630 / PL81', + 0x3a00018 => 'PL90 / VLUU PL90', + 0x3a00018 => 'WB1100F / WB1101F / WB1102F', + 0x3a00018 => 'WB2200F', + 0x400101f => 'ST1000 / ST1100 / VLUU ST1000 / CL65', + 0x4001022 => 'ST550 / VLUU ST550 / TL225', + 0x4001025 => 'DV300 / DV300F / DV305F', + 0x4001025 => 'ST500 / VLUU ST500 / TL220', + 0x4001025 => 'ST200 / ST200F / ST201 / ST201F / ST205F', + 0x400103e => 'VLUU ST5500, ST5500, CL80', + 0x4001041 => 'VLUU ST5000, ST5000, TL240', + 0x4001043 => 'ST70 / VLUU ST70 / ST71', + 0x400130a => 'VLUU ST100, ST100', + 0x400130a => 'VLUU ST600, ST600', + 0x400130a => 'VLUU ST80, ST80', + 0x400130e => 'ST90,ST91 / VLUU ST90,ST91', + 0x4001313 => 'VLUU ST95, ST95', + 0x4a00015 => 'VLUU ST60', + 0x4a0135b => 'ST30', + 0x4a0135b => 'ST65 / VLUU ST65 / ST67', + 0x5000000 => 'EX2F', + 0x5000000 => 'NX1000', + 0x5000000 => 'NX20', + 0x5000000 => 'NX200', + 0x5000000 => 'NX210', + 0x5000000 => 'ST96', + 0x5000000 => 'WB750', + 0x5000000 => 'ST700', + 0x5001038 => 'EK-GN120', + 0x5001038 => 'HMX-E10', + 0x5001038 => 'NX1', + 0x5001038 => 'NX2000', + 0x5001038 => 'NX30', + 0x5001038 => 'NX300', + 0x5001038 => 'WB2000', + 0x500103a => 'WB650 / VLUU WB650 / WB660', + 0x500103c => 'WB600 / VLUU WB600 / WB610', + 0x500133e => 'WB150 / WB150F / WB152 / WB152F / WB151', + 0x5a0000f => 'WB5000 / HZ25W', + 0x6001036 => 'EX1', + 0x700131c => 'VLUU SH100, SH100', + 0x27127002 => 'SMX-C20N', + }, + }, + # 0x0004 - undef[x] (SamsungContentsID?) + # 0x000a - int32u (ContinuousShotMode?) + # 0x000b - int16u (BestPhotoMode?) + # 0x000e - int32u[2] (SoundMultiPicture?) + # 0x0020 - int16u[2] (ColorInfoDCM?) 0x0021 => { #1 Name => 'PictureWizard', Writable => 'int16u', SubDirectory => { TagTable => 'Image::ExifTool::Samsung::PictureWizard' }, }, - # 0x0023 - string: "0123456789" (PH) + # 0x0022 - int32u (CaptureMode?) + # 0x0023 - string: "0123456789" (PH) (placeholder for SerialNumber?) + # 0x0025 - int32u (ImageCount?) + # 0x002a - undef[4] (SNSDirectShare?) + # 0x002f - string (GPSInfo01?) 0x0030 => { #1 (NX100 with GPS) Name => 'LocalLocationName', Writable => 'string', @@ -148,6 +247,9 @@ my %formatMinMax = ( Name => 'LocationName', Writable => 'string', }, + # 0x0032 - string (GPSInfo03) + # 0x0033 - string (GPSInfo04) + # 0x0034 - string (GPSInfo05) 0x0035 => { Name => 'PreviewIFD', Condition => '$$self{TIFF_TYPE} eq "SRW"', # (not an IFD in JPEG images) @@ -159,6 +261,13 @@ my %formatMinMax = ( Start => '$val', }, }, + # 0x003a - int16u[2] (SmartLensInfo?) + # 0x003b - int16u[2] (PhotoStyleSelectInfo?) + # 0x003c - int16u (SmartRange?) + # 0x003d - int16u[5] (SmartCropInfo?) + # 0x003e - int32u (DualCapture?) + # 0x003f - int16u[2] (SGIFInfo?) + # 0x0040 - int32u (FavoriteTagging?) 0x0043 => { #1 (NC) Name => 'CameraTemperature', Groups => { 2 => 'Camera' }, @@ -167,19 +276,46 @@ my %formatMinMax = ( PrintConv => '"$val C"', PrintConvInv => '$val=~s/ ?C//; $val', }, - # 0x00a0 - undef[8192]: white balance information (ref 1): + 0x0045 => { Name => 'RawCompressionMode', Writable => 'int32u' }, + # 0x004a - int32u[7] (ImageVerification?) + # 0x004b - int32u[2] (RewindInfo?) + # 0x0050 - int32u (ColorSpace? - inconsistent) + # 0x0054 - int16u[2] (WeatherInfo?) + # 0x0060 - undef (AEInfo?) + # 0x0080 - undef (AFInfo?) + # 0x00a0 - undef[8192] (AWBInfo1): white balance information (ref 1): # At byte 5788, the WBAdjust: "Adjust\0\X\0\Y\0\Z\xee\xea\xce\xab", where # Y = BA adjust (0=Blue7, 7=0, 14=Amber7), Z = MG (0=Magenta7, 7=0, 14=Green7) + # 0x00a1 - undef (AWBInfo2?) + # 0x00c0 - undef (IPCInfo?) + # 0x00c7 - undef (SmartFunctionInfo?) + # 0x00e0 - int16u (SceneResult?) + # 0x00e1 - int16u[8] (SADebugInfo01?) + # 0x00e1 - int16u[x] (SADebugInfo02?) + 0x0100 => { + Name => 'FaceDetect', + Writable => 'int16u', + PrintConv => { 0 => 'Off', 1 => 'On' }, # (NC) + }, + # 0x0101 - int16u[6] (FaceDetectInfo?) + # 0x0102 - int16u[x] (FaceDetectInfo?) + 0x0120 => { + Name => 'FaceRecognition', + Writable => 'int32u', + PrintConv => { 0 => 'Off', 1 => 'On' }, # (NC) + }, + 0x0123 => { Name => 'FaceName', Writable => 'string' }, + # 0x140 - undef (LensInfo?) # # the following tags found only in SRW images # - # 0xa000 - rational64u: 1 or 1.1 (ref PH) + # 0xa000 - rational64u: 1 or 1.1 (ref PH) (MakerNoteVersion?) 0xa001 => { #1 Name => 'FirmwareName', Groups => { 2 => 'Camera' }, Writable => 'string', }, - # 0xa002 - string[30]: '0' or 'DY049P000000' (ref PH) + # 0xa002 - string[30]: '0' or 'DY049P000000' (ref PH) (BodySerialNumber?) 0xa003 => { #1 (SRW images only) Name => 'LensType', Groups => { 2 => 'Camera' }, @@ -192,7 +328,10 @@ my %formatMinMax = ( Groups => { 2 => 'Camera' }, Writable => 'string', }, - # 0xa005 - string[30]: constant for a given lens? Not the printed serial number (ref 1) + 0xa005 => { + Name => 'InternalLensSerialNumber', # Not the printed serial number (ref 1) + Writable => 'string', + }, 0xa010 => { #1 Name => 'SensorAreas', Groups => { 2 => 'Camera' }, @@ -244,6 +383,8 @@ my %formatMinMax = ( PrintConv => '"$val mm"', PrintConvInv => '$val=~s/\s*mm$//;$val', }, + # 0xa01b - int32u (ImageCount?) + # 0xa01b - int16u (LDCLens?) 0xa020 => { #1 Name => 'EncryptionKey', Writable => 'int32u', @@ -284,7 +425,7 @@ my %formatMinMax = ( RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,1)', }, #this doesn't seem correct - #0xa025 => { #PH/1 + #0xa025 => { #PH/1 (PostAEGain?) # Name => 'ColorTemperatureAuto', # Writable => 'int32u', # RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,6)', @@ -319,43 +460,35 @@ my %formatMinMax = ( RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', }, 0xa033 => { #1 - Name => 'Samsung_Type2_0xa033', - Unknown => 1, - Hidden => 1, + Name => 'CbCrMatrixDefault', Writable => 'int32s', Count => 4, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', }, 0xa034 => { #1 - Name => 'Samsung_Type2_0xa034', - Unknown => 1, - Hidden => 1, + Name => 'CbCrMatrix', Writable => 'int32s', Count => 4, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,4)', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-4)', }, 0xa035 => { #1 - Name => 'Samsung_Type2_0xa035', - Unknown => 1, - Hidden => 1, + Name => 'CbCrGainDefault', Writable => 'int32u', Count => 2, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', }, 0xa036 => { #1 - Name => 'Samsung_Type2_0xa036', - Unknown => 1, - Hidden => 1, + Name => 'CbCrGain', Writable => 'int32u', Count => 2, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-2)', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,2)', }, 0xa040 => { #1 - Name => 'ToneCurve1', + Name => 'ToneCurveSRGBDefault', Writable => 'int32u', Count => 23, Notes => q{ @@ -366,82 +499,76 @@ my %formatMinMax = ( RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', }, 0xa041 => { #1 - Name => 'ToneCurve2', + Name => 'ToneCurveAdobeRGBDefault', Writable => 'int32u', Count => 23, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', }, 0xa042 => { #1 - Name => 'ToneCurve3', + Name => 'ToneCurveSRGB', Writable => 'int32u', Count => 23, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', }, 0xa043 => { #1 - Name => 'ToneCurve4', + Name => 'ToneCurveAdobeRGB', Writable => 'int32u', Count => 23, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', }, 0xa048 => { #1 - Name => 'Samsung_Type2_0xa048', + Name => 'RawData', Unknown => 1, - Hidden => 1, Writable => 'int32s', Count => 12, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', }, - 0xa050 => { #1 (vignette curve?) - Name => 'Samsung_Type2_0xa050', + 0xa050 => { #1 + Name => 'Distortion', Unknown => 1, - Hidden => 1, Writable => 'int32s', Count => 8, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0)', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0")', }, 0xa051 => { #1 - Name => 'Samsung_Type2_0xa051', + Name => 'Chromatic Aberration', Unknown => 1, - Hidden => 1, Writable => 'int16u', Count => 22, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",-7,-3)', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,7,3)', }, - 0xa052 => { #1 (vignette curve?) - Name => 'Samsung_Type2_0xa052', + 0xa052 => { #1 + Name => 'Vignetting', Unknown => 1, - Hidden => 1, Writable => 'int16u', Count => 15, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', }, 0xa053 => { #1 - Name => 'Samsung_Type2_0xa053', + Name => 'VignettingCorrection', Unknown => 1, - Hidden => 1, Writable => 'int16u', Count => 15, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', }, 0xa054 => { #1 - Name => 'Samsung_Type2_0xa054', + Name => 'VignettingSetting', Unknown => 1, - Hidden => 1, Writable => 'int16u', Count => 15, RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,0,"-0")', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,"-0",0)', }, 0xa055 => { #1 - Name => 'Samsung_Type2_0xa055', + Name => 'Samsung_Type2_0xa055', # (DistortionCamera1st?) Unknown => 1, Hidden => 1, Writable => 'int32s', @@ -450,7 +577,7 @@ my %formatMinMax = ( RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-8)', }, 0xa056 => { #1 - Name => 'Samsung_Type2_0xa056', + Name => 'Samsung_Type2_0xa056', # (DistortionCamera2nd?) Unknown => 1, Hidden => 1, Writable => 'int32s', @@ -459,7 +586,7 @@ my %formatMinMax = ( RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-5)', }, 0xa057 => { #1 - Name => 'Samsung_Type2_0xa057', + Name => 'Samsung_Type2_0xa057', # (DistortionCameraSetting?) Unknown => 1, Hidden => 1, Writable => 'int32s', @@ -467,6 +594,8 @@ my %formatMinMax = ( RawConv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,2)', RawConvInv => 'Image::ExifTool::Samsung::Crypt($self,$val,$tagInfo,-2)', }, + # 0xa060 - rational64u (CISTemperature?) + # 0xa061 - int16u (Compression?) ); # Picture Wizard information (ref 1) diff --git a/lib/Image/ExifTool/Sony.pm b/lib/Image/ExifTool/Sony.pm index 4122f66d..6facac1f 100644 --- a/lib/Image/ExifTool/Sony.pm +++ b/lib/Image/ExifTool/Sony.pm @@ -31,7 +31,7 @@ use Image::ExifTool qw(:DataAccess :Utils); use Image::ExifTool::Exif; use Image::ExifTool::Minolta; -$VERSION = '2.15'; +$VERSION = '2.16'; sub ProcessSRF($$$); sub ProcessSR2($$$); @@ -714,7 +714,7 @@ my %meterInfo2 = ( # a3 c3 - NEX-6, DSC-HX300, HX50V # a4 c3 - NEX-3N/5R/5T, ILCE-3000/3500 # unknown offsets or values for DSC-TX20/TX55/RX100M2/RX100M3/QX10/QX30/QX100/RX10/HX60V/HX400V/WX220/WX350, - # ILCE-7/7R/7S/5000/5100/6000/QX1, ILCA-77M2 + # ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-77M2 { Name => 'Tag2010a', # ad Condition => '$$self{Model} =~ /^NEX-5N$/', @@ -747,7 +747,7 @@ my %meterInfo2 = ( SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010f' }, },{ Name => 'Tag2010g', # ? - Condition => '$$self{Model} =~ /^(DSC-(QX30|RX10|RX100M3|HX60V|HX400V|WX220|WX350)|ILCE-(7[RS]?|[56]000|5100|QX1)|ILCA-77M2)\b/', + Condition => '$$self{Model} =~ /^(DSC-(QX30|RX10|RX100M3|HX60V|HX400V|WX220|WX350)|ILCE-(7(R|S|M2)?|[56]000|5100|QX1)|ILCA-77M2)\b/', SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag2010g' }, },{ Name => 'Tag_0x2010', @@ -946,8 +946,8 @@ my %meterInfo2 = ( # 0x0a (e) for SLT-A37/A57/A65V/A77V/A99V, NEX-F3/5N/5R/5T/6/7/VG20E, DSC-RX100/RX1/RX1R/HX10V/HX20V/HX30V/HX200V/TX200V/TX300V/TX66/WX50/WX100/WX150, Lunar/Stellar/HV # 0x0c (e) for ILCE-3000/3500, NEX-3N, SLT-A58, DSC-HX50V/HX300/RX100M2/TX30/WX60/WX80/WX200/WX300, DSC-QX10/QX100 # 0xd0 (e) H90, W650, W690: tag9400 decoding appears not valid/different - # 0x23 (e) for DSC-QX30/RX10/HX60V/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-77M2 - # 0x24 (e) for ILCE-7S/5100/QX1, DSC-RX100M3 + # 0x23 (e) for DSC-RX10/HX60V/HX400V/WX220/WX350, ILCE-7/7R/5000/6000, ILCA-77M2 + # 0x24 (e) for ILCE-7S/7M2/5100/QX1, DSC-QX30/RX100M3 # first byte decoded: 40, 204, 202, 27, 58, 62, 48 respectively { Name => 'Tag9400a', @@ -996,9 +996,10 @@ my %meterInfo2 = ( # 3a 20 47 0e 0x0a01 (m) DSC-RX100M2 # 43 00 66 0e 0x0a1b (n) ILCE-7/7R/5000, DSC-RX10 # 43 10 66 0e 0x0a1b (n) ILCE-7/7R - # 44 00 9c 0e 0x0a39 (o) ILCE-6000, DSC-HX60V/HX400V/QX30/WX220/WX350 - # 49 00 b0 0e 0x0a3b (p) ILCA-77M2, DSC-RX100M3 samples from sony.net - # 4a 00 b3 0e 0x0a3d (q) ILCE-7S/5100/QX1, DSC-RX100M3 + # 44 00 9c 0e 0x0a39 (o) ILCE-6000, DSC-HX60V/HX400V/WX220/WX350 (also DSC-QX30 samples from sony.net) + # 49 00 b0 0e 0x0a3b (p) ILCA-77M2 (also DSC-RX100M3 samples from sony.net) + # 4a 00 b3 0e 0x0a3d (q) ILCE-7S/5100/QX1, DSC-QX30/RX100M3 + # 4e 01 d0 0e 0x0a5a (r) ILCE-7M2 # # 0x0004 - (RX100: 0 or 1. subsequent data valid only if 1 - PH) # 0x0007 => { @@ -1029,8 +1030,8 @@ my %meterInfo2 = ( # 0x13 0x01 ILCE-5000/7/7R, DSC-RX10, but also seen: # 0x12 0x01 for ILCE-7/7R and DSC-RX10 samples from Sony.net ... # 0x15 0x01 for a few ILCE-7/7R ... - # 0x14 0x01 ILCE-6000, DSC-HX60V/HX400V/QX30/WX220/WX350 - # 0x17 0x01 ILCE-7S/5100/QX1, DSC-RX100M3 + # 0x14 0x01 ILCE-6000, DSC-HX60V/HX400V/WX220/WX350 + # 0x17 0x01 ILCE-7S/7M2/5100/QX1, DSC-QX30/RX100M3 # var var SLT-A58/A99V, HV, ILCA-77M2 # only valid when first byte 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x17 (enciphered 0x8a, 0x70, 0xb6, 0x69, 0x88, 0x20, 0x30, 0xd7) Condition => '$$self{DoubleCipher} ? $$valPt =~ /^[\x7e\x46\x1d\x18\x3a\x95\x24\x26]\x01/ : $$valPt =~ /^[\x8a\x70\xb6\x69\x88\x20\x30\xd7]\x01/', @@ -1054,7 +1055,7 @@ my %meterInfo2 = ( # 9 0 38 2 2 SLT-A37/A57/A99V, NEX-5R/5T/6/F3/VG30E/VG900, DSC-RX1/RX1R/RX100, Stellar # 12 0 8 2 2 SLT-A58, NEX-3N, ILCE-3000/3500, DSC-HX300/HX50V/WX60/WX80/WX300/TX30... # 13 0 9 2 2 DSC-QX10/QX100/RX100M2 - # 15 0 35 2 2 ILCA-77M2, ILCE-5000/5100/6000/7/7R/7S/QX1, DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350 + # 15 0 35 2 2 ILCA-77M2, ILCE-5000/5100/6000/7/7R/7S/7M2/QX1, DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350 # other values for Panorama images and several other models 0x9404 => [{ Name => 'Tag9404a', @@ -1076,9 +1077,10 @@ my %meterInfo2 = ( # 3 0 (0x1b = 27 0 enc.) SLT, NEX, ILCE-3000/3500, DSC-RX100/RX1 + other DSC of same generation, also QX10 and QX100 # 4 0 (0x40 = 64 0 enc.) DSC-RX1R # 5 0 (0x7d = 125 0 enc.) DSC-RX100M2 - # 136 var (0x3a = 58 var enc.) ILCE-7/7R/5000/6000, DSC-HX400V/HX60V/QX30/RX10/WX220/WX350 - # 137 255 (0xb3 = 179 255 enc.) ILCA-77M2, DSC-RX100M3 - appears to go with 136 - # 138 255 (0x7e = 126 255 enc.) ILCE-7S/5100/QX1 - appears to go with 136 + # 136 var (0x3a = 58 var enc.) ILCE-7/7R/5000/6000, DSC-HX400V/HX60V/RX10/WX220/WX350 + # 137 var (0xb3 = 179 var enc.) ILCA-77M2, DSC-RX100M3 - appears to go with 136 + # 138 var (0x7e = 126 var enc.) ILCE-7S/5100/QX1, DSC-QX30 - appears to go with 136 + # 139 var (0x9a = 154 var enc.) ILCE-7M2 0x9405 => [{ Name => 'Tag9405a', # first byte must be 0x1b or 0x40 or 0x7d @@ -1086,8 +1088,8 @@ my %meterInfo2 = ( SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9405a' }, },{ Name => 'Tag9405b', - # first byte must be 0x3a or 0xb3 or 0x7e - Condition => '$$valPt =~ /^[\x3a\xb3\x7e]/', + # first byte must be 0x3a, 0xb3, 0x7e or 0x9a + Condition => '$$valPt =~ /^[\x3a\xb3\x7e\x9a]/', SubDirectory => { TagTable => 'Image::ExifTool::Sony::Tag9405b' }, },{ Name => 'Sony_0x9405', @@ -1243,6 +1245,7 @@ my %meterInfo2 = ( 318 => 'ILCE-7S', #12 319 => 'ILCA-77M2', #14 339 => 'ILCE-5100', #12 + 340 => 'ILCE-7M2', #12 346 => 'ILCE-QX1', #14 }, }, @@ -2650,33 +2653,53 @@ my %meterInfo2 = ( # matches "0x7313 WB_RGGBLevels" when WB set to "Custom", except factor of 4 Format => 'int16uRev[2]', }, - 0x1e => { + # From here different and overlapping offsets for 3 groups of cameras: + # 1) DSLR-A450/A500/A550 + # 2) NEX-3/5/5C + # 3) DSLR-A560/A580, NEX-C3/VG10/VG10E, SLT-A33/A35/A55V + 0x1e => [{ + Name => 'BrightnessValue', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '($val-106)/8', + ValueConvInv => '$val * 8 + 106', + },{ Name => 'ExposureCompensationSet', - Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', + Notes => 'other models', ValueConv => '($val - 128) / 24', #PH ValueConvInv => 'int($val * 24 + 128.5)', PrintConv => '$val ? sprintf("%+.1f",$val) : $val', PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', - }, + }], 0x1f => [{ + Name => 'ISO', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', + ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', + PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', + PrintConvInv => '$val =~ /auto/i ? 0 : $val', + },{ Name => 'FlashExposureCompSet', + Notes => 'other models', Description => 'Flash Exposure Comp. Setting', - Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)$/', ValueConv => '($val - 128) / 24', #PH ValueConvInv => 'int($val * 24 + 128.5)', PrintConv => '$val ? sprintf("%+.1f",$val) : $val', PrintConvInv => 'Image::ExifTool::Exif::ConvertFraction($val)', - },{ - Name => 'ISO', - Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', - ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', - ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', - PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', - PrintConvInv => '$val =~ /auto/i ? 0 : $val', }], - 0x20 => { + 0x20 => [{ + Name => 'FNumber', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', + },{ Name => 'LiveViewAFMethod', - Condition => '$$self{Model} !~ /^(NEX-|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)/', + Notes => 'other models except the NEX-3/5/5C', PrintConv => { 0 => 'n/a', 1 => 'Phase-detect AF', @@ -2685,96 +2708,221 @@ my %meterInfo2 = ( # NOT in Quick AF LV, and is automatically set when mounting SSM/SAM lens # - changes into Phase-AF when switching to Quick AF LV. }, - }, - 0x21 => { + }], + 0x21 => [{ + Name => 'ExposureTime', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + },{ Name => 'ISO', - Condition => '$$self{Model} =~ /^NEX-(3|5|5C)$/', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', PrintConvInv => '$val =~ /auto/i ? 0 : $val', + }], + 0x22 => { + Name => 'FNumber', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C only', + ValueConv => '2 ** (($val/8 - 1) / 2)', + ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', + PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', + PrintConvInv => '$val', }, - 0x25 => { + 0x23 => [{ + Name => 'FocalLength2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + ValueConv => '10 * 2 ** (($val-28)/16)', + ValueConvInv => '$val>0 ? log($val/10)/log(2) * 16 + 28 : 0', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + },{ + Name => 'ExposureTime', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + ValueConv => '$val ? 2 ** (6 - $val/8) : 0', + ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', + PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', + PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', + }], + 0x24 => { + Name => 'ExposureCompensation2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : $val', + PrintConvInv => '$val', + }, + 0x25 => [{ + Name => 'FocalLength2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + ValueConv => '10 * 2 ** (($val-28)/16)', + ValueConvInv => '$val>0 ? log($val/10)/log(2) * 16 + 28 : 0', + PrintConv => 'sprintf("%.1f mm",$val)', + PrintConvInv => '$val=~s/\s*mm$//; $val', + },{ Name => 'ISO', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)/', + Notes => 'other models except the A450, A500 and A550', ValueConv => '$val ? exp(($val/8-6)*log(2))*100 : $val', ValueConvInv => '$val ? 8*(log($val/100)/log(2)+6) : $val', PrintConv => '$val ? sprintf("%.0f",$val) : "Auto"', PrintConvInv => '$val =~ /auto/i ? 0 : $val', - }, - 0x26 => { # (this is not in CameraSettings3) + }], + 0x26 => [{ + Name => 'FlashExposureCompSet2', + Description => 'Flash Exposure Comp. Setting 2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : $val', + PrintConvInv => '$val', + },{ + Name => 'ExposureCompensation2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + Format => 'int16s', + ValueConv => '$val / 8', + ValueConvInv => '$val * 8', + PrintConv => '$val ? sprintf("%+.1f",$val) : $val', + PrintConvInv => '$val', + },{ Name => 'FNumber', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Notes => 'other models', ValueConv => '2 ** (($val/8 - 1) / 2)', ValueConvInv => 'int((log($val) * 2 / log(2) + 1) * 8 + 0.5)', PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)', PrintConvInv => '$val', - }, - 0x27 => { # (this is not in CameraSettings3) + }], + 0x27 => { Name => 'ExposureTime', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', ValueConv => '$val ? 2 ** (6 - $val/8) : 0', ValueConvInv => '$val ? int((6 - log($val) / log(2)) * 8 + 0.5) : 0', PrintConv => '$val ? Image::ExifTool::Exif::PrintExposureTime($val) : "Bulb"', PrintConvInv => 'lc($val) eq "bulb" ? 0 : Image::ExifTool::Exif::ConvertFraction($val)', }, - 0x29 => [{ # value increase of 16 corresponds to doubling of FocalLength + 0x28 => { + Name => 'Orientation2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + PrintConv => { + 1 => 'Horizontal (normal)', + 2 => 'Rotate 180', + 6 => 'Rotate 90 CW', + 8 => 'Rotate 270 CW', + }, + }, + 0x29 => [{ + # FocusPosition for A450/A500/A550 + # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below + Name => 'FocusPosition2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + },{ + # value increase of 16 corresponds to doubling of FocalLength Name => 'FocalLength2', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)/', + Notes => 'other models except the NEX-3/5/5C', ValueConv => '10 * 2 ** (($val-28)/16)', ValueConvInv => '$val>0 ? log($val/10)/log(2) * 16 + 28 : 0', PrintConv => 'sprintf("%.1f mm",$val)', PrintConvInv => '$val=~s/\s*mm$//; $val', - },{ - # FocusPosition for A450/A500/A550 - # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below - Name => 'FocusPosition2', - Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)$/', }], - 0x2a => { + 0x2a => [{ + Name => 'FlashAction2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + }, + },{ Name => 'ExposureCompensation2', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)/', + Notes => 'other models except the NEX-3/5/5C', Format => 'int16s', ValueConv => '$val / 8', ValueConvInv => '$val * 8', PrintConv => '$val ? sprintf("%+.1f",$val) : $val', PrintConvInv => '$val', - }, + }], 0x2b => { # FocusPosition for NEX-3/5/5C # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below Name => 'FocusPosition2', - Condition => '$$self{Model} =~ /^NEX-(3|5|5C)$/', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C only', }, - 0x2c => { + 0x2c => [{ + Name => 'FocusMode2', + Condition => '$$self{Model} =~ /^DSLR-(A450|A500|A550)/', + Notes => 'A450, A500 and A550', + PrintConv => { + 0 => 'AF', + 1 => 'MF', + }, + },{ + Name => 'FlashAction2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C FlashAction2', + PrintConv => { + 0 => 'Did not fire', + 1 => 'Fired', + }, + },{ Name => 'FlashExposureCompSet2', Description => 'Flash Exposure Comp. Setting 2', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Notes => 'other models FlashExposureCompSet2', Format => 'int16s', ValueConv => '$val / 8', ValueConvInv => '$val * 8', PrintConv => '$val ? sprintf("%+.1f",$val) : $val', PrintConvInv => '$val', - }, - 0x2e => { # seen some A55 images where this does not match the other Orientation tags - Name => 'Orientation2', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + }], + 0x2e => [{ + Name => 'FocusMode2', + Condition => '$$self{Model} =~ /^NEX-(3|5|5C)/', + Notes => 'NEX-3/5/5C', + PrintConv => { + 0 => 'AF', + 1 => 'MF', + }, + },{ + Name => 'Orientation2', # seen some A55 images where this does not match the other Orientation tags + Condition => '$$self{Model} !~ /^DSLR-(A450|A500|A550)/', + Notes => 'other models except the A450, A500 and A550', PrintConv => { 1 => 'Horizontal (normal)', 2 => 'Rotate 180', 6 => 'Rotate 90 CW', 8 => 'Rotate 270 CW', }, - }, + }], 0x2f => { - # FocusPosition for A560/A580/A33/A35/A55V and NEX-C3/VG10E + # FocusPosition for A560/A580/A33/A35/A55V and NEX-C3/VG10/VG10E # seen values from 80 - 255 (= infinity) -- see Composite:FocusDistance2 below Name => 'FocusPosition2', - Condition => '$$self{Model} !~ /^(NEX-(3|5|5C)|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', }, 0x30 => { Name => 'FlashAction2', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', PrintConv => { 0 => 'Did not fire', 1 => 'Fired', @@ -2782,7 +2930,8 @@ my %meterInfo2 = ( }, 0x32 => { Name => 'FocusMode2', - Condition => '$$self{Model} !~ /^(NEX-(3|5)|DSLR-(A450|A500|A550)$)/', + Condition => '$$self{Model} !~ /^NEX-(3|5|5C)|DSLR-(A450|A500|A550)/', + Notes => 'models other than the A450, A500, A550 and NEX-3/5/5C', PrintConv => { 0 => 'AF', 1 => 'MF', @@ -4239,6 +4388,21 @@ my %faceInfo = ( PrintConv => 'sprintf("%.3d",$val)', PrintConvInv => '$val', }, + 0x03f0 => { + Name => 'E-mountVersionLens', + Format => 'int16u', + Condition => '($$self{Model} =~ /^NEX-/)', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + PrintConvInv => 'my @a=split(/\./,$val);(hex($a[0])<<8)|hex($a[1])', + }, + 0x03f3 => { + Name => 'E-mountVersionCamera', + Format => 'int16u', + Condition => '($$self{Model} =~ /^NEX-/)', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + PrintConvInv => 'my @a=split(/\./,$val);(hex($a[0])<<8)|hex($a[1])', + # seen values 1.00, 1.01, 1.02, 1.03 and 1.04 for NEX-3/5/5C/C3/VG10/VG10E with various Firmware versions. + }, 0x3f7 => { #12 Name => 'LensType2', Condition => '($$self{Model} =~ /^NEX-/) and ($$self{LensMount} != 1)', @@ -5279,7 +5443,7 @@ my %exposureProgram2010 = ( FORMAT => 'int8u', NOTES => q{ Valid for DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350, - ILCE-7/7R/7S/5000/5100/6000/QX1, ILCA-77M2. + ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-77M2. }, WRITABLE => 1, FIRST_ENTRY => 0, @@ -5555,16 +5719,21 @@ my %exposureProgram2010 = ( PrintConv => 'sprintf("%.1f",$val)', PrintConvInv => '$val', }, - 0x004c => { # only ILCE-7/7R/7S/5000/5100/6000/QX1 - but appears not valid when flash is used ... + 0x003f => { + Name => 'ReleaseMode2', + Condition => '$$self{Model} !~ /^(DSC-|Stellar)/', + %releaseMode2, + }, + 0x004c => { # only ILCE-7/7R/7S/7M2/5000/5100/6000/QX1 - but appears not valid when flash is used ... Name => 'ImageCount2', - Condition => '($$self{Model} =~ /^(ILCE-(7[RS]?|[56]000|5100|QX1))\b/) and (($$self{FlashFired} & 0x01) != 1)', + Condition => '($$self{Model} =~ /^(ILCE-(7(R|S|M2)?|[56]000|5100|QX1))\b/) and (($$self{FlashFired} & 0x01) != 1)', Format => 'int32u', RawConv => '$val & 0x00ffffff', }, - 0x0051 => { # only ILCE-7/7R/7S/5000/5100/6000/QX1, but hours usually different from SonyDateTime - UTC? + 0x0051 => { # only ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, but hours usually different from SonyDateTime - UTC? # appears not valid (all '0') when flash is used, panorama, hdr modes ... Name => 'SonyDateTime2', - Condition => '$$self{Model} =~ /^(ILCE-(7[RS]?|[56]000|5100|QX1))\b/', + Condition => '$$self{Model} =~ /^(ILCE-(7(R|S|M2)?|[56]000|5100|QX1))\b/', Groups => { 2 => 'Time' }, Shift => 'Time', Format => 'undef[6]', @@ -5674,7 +5843,7 @@ my %exposureProgram2010 = ( Name => 'ImageCount3', Format => 'int32u', RawConv => '$val == 0 ? undef : $val', - Condition => '$$self{Model} =~ /^(ILCE-(7S|5100|QX1)|ILCA-77M2)/', + Condition => '$$self{Model} =~ /^(ILCE-(7S|7M2|5100|QX1)|ILCA-77M2)/', }, 0x01aa => { Name => 'ImageCount3', @@ -5873,7 +6042,7 @@ my %exposureProgram2010 = ( WRITABLE => 1, NOTES => q{ Valid for DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350, - ILCE-7/7R/7S/5000/5100/6000/QX1, ILCA-77M2. + ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-77M2. }, FIRST_ENTRY => 0, GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, @@ -6183,7 +6352,7 @@ my %exposureProgram2010 = ( GROUPS => { 0 => 'MakerNotes', 2 => 'Image' }, NOTES => q{ Valid for DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350, - ILCE-7/7R/7S/5000/5100/6000/QX1, ILCA-77M2. + ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-77M2. }, 0x0004 => { Name => 'SonyISO', @@ -6445,6 +6614,7 @@ my %exposureProgram2010 = ( DATAMEMBER => [ 0x0008 ], NOTES => 'NEX and ILCE models only.', + # 0x0001 - 0 for all NEX and ILCE-3000/3500, 20 for all other ILCE (17 for ILCE samples from Sony.net) # 0x0008 - LensMount, but different values from Tag9405-0x0105 and Tag9050-0x0604. # don't know what difference is between values '1' and '5' ... 0x0008 => { @@ -6458,21 +6628,48 @@ my %exposureProgram2010 = ( }, }, # 0x0009 - LensType2: - # This LensType2 tag gives values '1' and '2' for LA-EA1 and LA-EA2 respectively. - # Presumably similar to CameraSettings3-0x03f7, where value '1' for A-mount lenses was observed. - # Tag9405-0x0605 and Tag9050-0x0107 always give value '0' for A-mount lenses. - # When LA-EA2 is used, Tag940e AFInfo gives sequential info blocks NEX (Phase-detect AF). - # Also seen values '3' and '6' for A-lens on ILCE-7/7R, probably relating to LA-EA3 and LA-EA4 (NC). - # - this is the only tag that appears to indicate adapter info - # - when normal E-mount lenses are used, there are at least 2 other LensType2's with the correct lens - # - so limit outputting this tag ONLY for adapter info (with the RawConv below) - 0x0009 => { #12 + # This tag appears to also indicate adapter info, similar to CameraSettings3-0x03f7 for the original NEX-3/5. + # (Tag9405-0x0605 and Tag9050-0x0107 LensType2 always give '0' for adapters/A-mount lenses.) + # - seen a few instances of 0x0009 indicating an E-mount lens, but 0xb027 LensType indicating an A-mount lens: + # possibly due to adapter info not being read/reset correctly ? + 0x0009 => { Name => 'LensType2', - RawConv => '($val > 0 and $val < 32784) ? $val : undef', + RawConv => '(($$self{LensMount} != 0) or ($val > 0 and $val < 32784)) ? $val : undef', Format => 'int16u', SeparateTable => 1, PrintConv => \%sonyLensTypes2, }, + 0x000b => { + Name => 'E-mountVersionCamera', + Format => 'int16u', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + PrintConvInv => 'my @a=split(/\./,$val);(hex($a[0])<<8)|hex($a[1])', + # camera Firmware versions: + # 1.14: NEX-5N/5R/6/7/F3 v1.00 + # 1.20: NEX-3N v1.00, NEX-6 v1.01, NEX-7 v1.02, ILCE-3000 v1.00, ILCE-3500 v1.01 + # 1.30: NEX-5T v1.00, NEX-6 v1.02, NEX-7 v1.03 + # 1.31: ILCE-5000 v1.00, ILCE-7/7R v1.00 and v1.01 + # 1.40: ILCE-5100/6000/7S/QX1 v1.00, ILCE-7/7R v1.02 + # 1.50: ILCE-7M2 v1.00 + }, + 0x000d => { + Name => 'E-mountVersionLens', + Format => 'int16u', + PrintConv => 'sprintf("%x.%.2x",$val>>8,$val&0xff)', + PrintConvInv => 'my @a=split(/\./,$val);(hex($a[0])<<8)|hex($a[1])', + # lens models: + # 0.00: Unknown lenses/adapters + # 1.00: Sigma DN, Tamron DiIII, Zeiss Touit, SEL18200LE + # 1.07 (Ver.01): Original E-lenses + # 1.08: LA-EA1, Metabones Smart + # 1.14: LA-EA2 + # 1.20 (Ver.02): Newer or firmware-updated E-lenses, LA-EA3 + # 1.30: LA-EA4 + # 1.31: Original FE-lenses, SEL1850 + # 1.35: SEL70200G + # 1.40: SEL1635Z, SELP28135G, Zeiss Loxia + }, + # 0x0016 - 0x003f: non-0 data present when: 0x0001>0 AND 0x0008=4(E-mount) AND 0x000f<255 ); diff --git a/lib/Image/ExifTool/TagLookup.pm b/lib/Image/ExifTool/TagLookup.pm index e8a17328..b6288810 100644 --- a/lib/Image/ExifTool/TagLookup.pm +++ b/lib/Image/ExifTool/TagLookup.pm @@ -830,7 +830,7 @@ my %tagLookup = ( 'bracketvalue' => { 46 => 0x4 }, 'brightness' => { 95 => 0xfe53, 125 => 'Brightness', 147 => 0x2c, 184 => 0x34, 306 => 0x25, 327 => 0x22, 339 => 0x2007, 380 => 'Brightness' }, 'brightnessadj' => { 86 => 0x114, 209 => 0x0, 219 => 0x2d, 366 => 0x8018 }, - 'brightnessvalue' => { 95 => 0x9203, 153 => [0x691,0x49c3], 240 => 0x1003, 346 => 0x1140, 347 => 0x1140, 348 => 0x111c, 349 => 0x1198, 350 => 0x1174, 351 => 0x102c, 352 => 0x224, 384 => 'BrightnessValue' }, + 'brightnessvalue' => { 95 => 0x9203, 153 => [0x691,0x49c3], 240 => 0x1003, 343 => 0x1e, 346 => 0x1140, 347 => 0x1140, 348 => 0x111c, 349 => 0x1198, 350 => 0x1174, 351 => 0x102c, 352 => 0x224, 384 => 'BrightnessValue' }, 'bulbduration' => { 62 => 0x18 }, 'burstmode' => { 111 => 0xa, 255 => 0x2a }, 'burstmode2' => { 111 => 0x18 }, @@ -907,6 +907,10 @@ my %tagLookup = ( 'catalogsets' => { 103 => 0xff, 369 => 'CatalogSets', 373 => 'CatalogSets' }, 'categories' => { 51 => 0x23, 375 => 'categories' }, 'category' => { 103 => 0xf, 234 => 0x30, 392 => 'Category' }, + 'cbcrgain' => { 316 => 0xa036 }, + 'cbcrgaindefault' => { 316 => 0xa035 }, + 'cbcrmatrix' => { 316 => 0xa034 }, + 'cbcrmatrixdefault' => { 316 => 0xa033 }, 'ccdboardversion' => { 251 => 0x331 }, 'ccdscanmode' => { 240 => 0x1039 }, 'ccdsensitivity' => { 206 => 0x6 }, @@ -933,6 +937,7 @@ my %tagLookup = ( 'childfontfiles' => { 408 => [\'Fonts','FontsChildFontFiles'] }, 'chmodeshootingspeed' => { 223 => '10.3', 224 => '11.2' }, 'chromablurradius' => { 95 => 0xc631 }, + 'chromatic aberration' => { 316 => 0xa051 }, 'chromaticaberration' => { 87 => 0x66 }, 'chromaticaberrationb' => { 380 => 'ChromaticAberrationB' }, 'chromaticaberrationblue' => { 87 => 0x6b }, @@ -1483,6 +1488,7 @@ my %tagLookup = ( 'devicesettingdescriptioncolumns' => { 384 => [\'DeviceSettingDescription','DeviceSettingDescriptionColumns'] }, 'devicesettingdescriptionrows' => { 384 => [\'DeviceSettingDescription','DeviceSettingDescriptionRows'] }, 'devicesettingdescriptionsettings' => { 384 => [\'DeviceSettingDescription','DeviceSettingDescriptionSettings'] }, + 'devicetype' => { 316 => 0x2 }, 'dialdirectiontvav' => { 68 => 0x706 }, 'digitalcreationdate' => { 103 => 0x3e }, 'digitalcreationtime' => { 103 => 0x3f }, @@ -1536,6 +1542,7 @@ my %tagLookup = ( 'distance2' => { 111 => 0x2c }, 'distance3' => { 111 => 0x30 }, 'distance4' => { 111 => 0x34 }, + 'distortion' => { 316 => 0xa050 }, 'distortioncontrol' => { 188 => 0x10 }, 'distortioncorrection' => { 87 => 0x67, 235 => 0x50b, 258 => '7.1', 278 => 0x0, 361 => 0x601, 362 => 0x5b }, 'distortioncorrection2' => { 239 => 0x1011 }, @@ -1591,6 +1598,8 @@ my %tagLookup = ( 'dynamicrangeoptimizersetting' => { 150 => 0x27, 329 => 0xc, 343 => 0x4 }, 'dynamicrangesetting' => { 100 => 0x1402 }, 'e-dialinprogram' => { 269 => '1.3' }, + 'e-mountversioncamera' => { 329 => 0x3f3, 365 => 0xb }, + 'e-mountversionlens' => { 329 => 0x3f0, 365 => 0xd }, 'earliestageorloweststage' => { 94 => [\'GeologicalContext','GeologicalContextEarliestAgeOrLowestStage'] }, 'earliesteonorlowesteonothem' => { 94 => [\'GeologicalContext','GeologicalContextEarliestEonOrLowestEonothem'] }, 'earliestepochorlowestseries' => { 94 => [\'GeologicalContext','GeologicalContextEarliestEpochOrLowestSeries'] }, @@ -1674,7 +1683,7 @@ my %tagLookup = ( 'exposurebracketstepsize' => { 269 => 0x8 }, 'exposurebracketvalue' => { 182 => 0x19 }, 'exposurecompensation' => { 62 => 0x6, 77 => 0x0, 95 => 0x9204, 111 => 0x24, 125 => 'ExposureComp', 147 => 0xd, 148 => 0x53, 149 => 0x1e, 153 => 0x49c0, 240 => 0x1006, 288 => 0x16, 316 => 0xa013, 319 => [0xc,0x35,0x4d], 346 => 0x114c, 347 => 0x114c, 348 => 0x1128, 350 => 0x1180, 351 => 0x1038, 352 => 0x230, 384 => 'ExposureBiasValue' }, - 'exposurecompensation2' => { 343 => 0x2a }, + 'exposurecompensation2' => { 343 => [0x24,0x26,0x2a] }, 'exposurecompensationmode' => { 150 => 0x47, 153 => 0x2a }, 'exposurecompensationset' => { 329 => 0x3, 343 => 0x1e }, 'exposurecompensationsetting' => { 150 => 0x1 }, @@ -1692,7 +1701,7 @@ my %tagLookup = ( 'exposuremodeinmanual' => { 68 => 0x10b }, 'exposureprogram' => { 95 => 0x8822, 310 => 0x1001, 320 => 0x17e, 327 => 0x3c, 328 => 0x3c, 329 => 0x5, 333 => 0x14, 338 => 0x3f, 343 => 0x2, 346 => 0x1175, 347 => 0x1179, 348 => 0x1155, 349 => 0x11d1, 350 => 0x11ad, 351 => 0x1065, 352 => 0x25d, 362 => 0x48, 384 => 'ExposureProgram' }, 'exposureshift' => { 235 => 0x203 }, - 'exposuretime' => { 5 => 0x4, 6 => 0x4, 7 => 0x4, 8 => 0x4, 9 => 0x4, 10 => 0x4, 11 => 0x4, 12 => 0x4, 13 => 0x4, 14 => 0x4, 15 => 0x4, 16 => 0x4, 17 => 0x4, 18 => 0x4, 19 => 0x4, 20 => 0x4, 21 => 0x4, 22 => 0x4, 23 => 0x4, 24 => 0x4, 25 => 0x4, 26 => 0x6, 27 => 0x7, 62 => 0x16, 95 => 0x829a, 108 => 0xfd05, 111 => 0x20, 113 => 0xfa24, 115 => 0xf104, 118 => 0x12, 120 => 0x38, 123 => 0x10, 125 => 'ExposureTime', 147 => 0x9, 148 => 0x35, 149 => 0x48, 150 => 0x8, 153 => 0x49b8, 288 => 0x12, 316 => 0xa018, 319 => [0x32,0x4a], 327 => 0x0, 328 => 0x0, 343 => 0x27, 362 => 0x10, 384 => 'ExposureTime' }, + 'exposuretime' => { 5 => 0x4, 6 => 0x4, 7 => 0x4, 8 => 0x4, 9 => 0x4, 10 => 0x4, 11 => 0x4, 12 => 0x4, 13 => 0x4, 14 => 0x4, 15 => 0x4, 16 => 0x4, 17 => 0x4, 18 => 0x4, 19 => 0x4, 20 => 0x4, 21 => 0x4, 22 => 0x4, 23 => 0x4, 24 => 0x4, 25 => 0x4, 26 => 0x6, 27 => 0x7, 62 => 0x16, 95 => 0x829a, 108 => 0xfd05, 111 => 0x20, 113 => 0xfa24, 115 => 0xf104, 118 => 0x12, 120 => 0x38, 123 => 0x10, 125 => 'ExposureTime', 147 => 0x9, 148 => 0x35, 149 => 0x48, 150 => 0x8, 153 => 0x49b8, 288 => 0x12, 316 => 0xa018, 319 => [0x32,0x4a], 327 => 0x0, 328 => 0x0, 343 => [0x21,0x23,0x27], 362 => 0x10, 384 => 'ExposureTime' }, 'exposuretime2' => { 319 => [0x33,0x4b] }, 'exposuretuning' => { 182 => 0x1c }, 'exposurevalue' => { 109 => 0x3 }, @@ -1787,16 +1796,18 @@ my %tagLookup = ( 'face8size' => { 274 => 0xe }, 'face9position' => { 43 => 0x18, 88 => 0x385, 89 => 0x1b8, 169 => 0x24, 273 => 0x10 }, 'face9size' => { 274 => 0x10 }, - 'facedetect' => { 288 => 0x76 }, + 'facedetect' => { 288 => 0x76, 316 => 0x100 }, 'facedetectarea' => { 239 => 0x1201 }, 'facedetectframecrop' => { 239 => 0x1207 }, 'facedetectframesize' => { 43 => 0x3, 88 => 0x1, 89 => 0x4, 169 => 0x1, 239 => 0x1203, 288 => 0x77, 307 => 0xb6 }, 'facedetection' => { 329 => 0x30, 343 => 0x19 }, 'faceid' => { 376 => 'FaceID' }, 'faceinfounknown' => { 91 => 0x2089 }, + 'facename' => { 316 => 0x123 }, 'faceorientation' => { 89 => 0x8 }, 'faceposition' => { 272 => 0x2, 317 => 0x4 }, 'facepositions' => { 100 => 0x4103 }, + 'facerecognition' => { 316 => 0x120 }, 'facesdetected' => { 43 => 0x2, 44 => 0x2, 45 => 0x3, 88 => 0x0, 89 => 0x2, 91 => 0x211c, 100 => 0x4100, 169 => 0x3, 239 => 0x1200, 255 => 0x3f, 272 => 0x0, 307 => 0xb5, 317 => 0x0, 334 => 0x0, 337 => 0x3, 345 => 0x30 }, 'facesrecognized' => { 250 => 0x0 }, 'facewidth' => { 44 => 0x1 }, @@ -1863,7 +1874,7 @@ my %tagLookup = ( 'fixtureidentifier' => { 103 => 0x16 }, 'flash' => { 92 => 'Flash', 95 => 0x9209, 148 => 0x1f, 149 => 0x15, 384 => 'Flash' }, 'flashaction' => { 329 => [0x87,0x287] }, - 'flashaction2' => { 343 => 0x30 }, + 'flashaction2' => { 343 => [0x2a,0x2c,0x30] }, 'flashactivity' => { 29 => 0x1c }, 'flashbatterylevel' => { 35 => 0x249 }, 'flashbias' => { 255 => 0x24 }, @@ -1888,7 +1899,7 @@ my %tagLookup = ( 'flashexposurecomp4' => { 173 => 0x27 }, 'flashexposurecomparea' => { 224 => '38.4' }, 'flashexposurecompset' => { 150 => 0x10, 262 => 0xe, 329 => 0x23, 343 => 0x1f }, - 'flashexposurecompset2' => { 343 => 0x2c }, + 'flashexposurecompset2' => { 343 => [0x26,0x2c] }, 'flashexposureindicator' => { 150 => 0x54 }, 'flashexposureindicatorlast' => { 150 => 0x56 }, 'flashexposureindicatornext' => { 150 => 0x55 }, @@ -1938,9 +1949,9 @@ my %tagLookup = ( 'flexiblespotposition' => { 339 => 0x201d }, 'flickerreduce' => { 318 => 0x218 }, 'fliphorizontal' => { 216 => 0x76a43206 }, - 'fnumber' => { 5 => 0x3, 7 => 0x3, 9 => 0x3, 11 => 0x3, 12 => 0x3, 13 => 0x3, 14 => 0x3, 15 => 0x3, 16 => 0x3, 17 => 0x3, 18 => 0x3, 19 => 0x3, 20 => 0x3, 21 => 0x3, 22 => 0x3, 23 => 0x3, 24 => 0x3, 25 => 0x3, 26 => 0x5, 27 => 0x6, 62 => 0x15, 95 => 0x829d, 108 => 0xfd04, 111 => 0x1e, 113 => 0xfa23, 115 => 0xf103, 118 => 0x13, 120 => 0x3c, 123 => 0xc, 132 => 'FNumber', 147 => 0xa, 148 => 0x36, 149 => 0x47, 150 => 0x9, 153 => 0x49c7, 288 => 0x13, 316 => 0xa019, 319 => [0x31,0x49], 327 => 0x1, 328 => 0x1, 343 => 0x26, 384 => 'FNumber' }, + 'fnumber' => { 5 => 0x3, 7 => 0x3, 9 => 0x3, 11 => 0x3, 12 => 0x3, 13 => 0x3, 14 => 0x3, 15 => 0x3, 16 => 0x3, 17 => 0x3, 18 => 0x3, 19 => 0x3, 20 => 0x3, 21 => 0x3, 22 => 0x3, 23 => 0x3, 24 => 0x3, 25 => 0x3, 26 => 0x5, 27 => 0x6, 62 => 0x15, 95 => 0x829d, 108 => 0xfd04, 111 => 0x1e, 113 => 0xfa23, 115 => 0xf103, 118 => 0x13, 120 => 0x3c, 123 => 0xc, 132 => 'FNumber', 147 => 0xa, 148 => 0x36, 149 => 0x47, 150 => 0x9, 153 => 0x49c7, 288 => 0x13, 316 => 0xa019, 319 => [0x31,0x49], 327 => 0x1, 328 => 0x1, 343 => [0x20,0x22,0x26], 384 => 'FNumber' }, 'focallength' => { 5 => 0x1d, 6 => 0xa, 7 => 0x23, 8 => 0x9, 9 => 0x1d, 10 => 0x9, 11 => 0x1e, 12 => 0x1d, 13 => 0x1d, 14 => 0x1e, 15 => 0x1e, 16 => 0x1e, 17 => 0x28, 18 => 0x1e, 19 => 0x23, 20 => 0x1e, 21 => 0x1e, 22 => 0x23, 23 => 0x23, 24 => 0x23, 25 => 0x1e, 48 => 0x1, 91 => 0x1d, 95 => 0x920a, 118 => 0x1d, 132 => 'FocalLength', 147 => 0x12, 178 => 0xa, 179 => 0xb, 279 => 0x9, 288 => 0x1d, 310 => 0x1500, 326 => 0xe, 350 => 0x1278, 351 => 0x1134, 352 => 0x32c, 384 => 'FocalLength' }, - 'focallength2' => { 343 => 0x29 }, + 'focallength2' => { 343 => [0x23,0x25,0x29] }, 'focallengthin35mmformat' => { 95 => 0xa405, 316 => 0xa01a, 384 => 'FocalLengthIn35mmFilm' }, 'focallengthtelezoom' => { 326 => 0x10 }, 'focalplanediagonal' => { 236 => 0x103, 240 => 0x205 }, @@ -1966,7 +1977,7 @@ my %tagLookup = ( 'focusingscreen' => { 67 => 0x0, 68 => 0x80b, 73 => 0x0 }, 'focuslocked' => { 146 => 0x14 }, 'focusmode' => { 29 => 0x7, 90 => 0x3, 91 => [0x3003,0xd], 100 => 0x1021, 111 => 0x38, 125 => 'FocusMode', 147 => 0x30, 149 => 0xe, 150 => 0xc, 182 => 0x7, 235 => 0x301, 240 => 0x100b, 255 => 0x7, 288 => 0xd, 294 => 0x3, 310 => 0x1006, 320 => [0xb,0x5], 326 => [0x15,0x1d], 327 => 0x4d, 328 => 0x4d, 339 => [0xb042,0xb04e,0x201b], 343 => 0x13, 357 => 0x16 }, - 'focusmode2' => { 269 => '3.1', 343 => 0x32 }, + 'focusmode2' => { 269 => '3.1', 343 => [0x2c,0x2e,0x32] }, 'focusmodesetting' => { 225 => '10.1', 324 => 0x14, 325 => 0x15, 327 => 0x10, 328 => 0xf, 329 => 0x6 }, 'focusmodeswitch' => { 150 => 0x58, 327 => 0x2e }, 'focuspixel' => { 100 => 0x1023 }, @@ -2344,6 +2355,7 @@ my %tagLookup = ( 'internalflashmode' => { 276 => 0x1 }, 'internalflashstrength' => { 276 => 0x3 }, 'internalflashtable' => { 240 => 0x1024 }, + 'internallensserialnumber' => { 316 => 0xa005 }, 'internalndfilter' => { 255 => 0x9d }, 'internalserialnumber' => { 51 => 0x96, 61 => 0x9, 100 => 0x10, 153 => 0x49dc, 234 => 0x18, 236 => 0x102, 255 => 0x25, 268 => 0x4, 310 => 0x5, 353 => [0x7c,0xf0] }, 'interopindex' => { 95 => 0x1, 385 => 'InteroperabilityIndex' }, @@ -3071,7 +3083,7 @@ my %tagLookup = ( 'organisationinimagename' => { 390 => 'OrganisationInImageName' }, 'organization' => { 394 => 'organization' }, 'orientation' => { 95 => 0x112, 259 => 0x112, 399 => 'Orientation' }, - 'orientation2' => { 343 => 0x2e }, + 'orientation2' => { 343 => [0x28,0x2e] }, 'orientationlinkedafpoint' => { 68 => 0x516 }, 'originalbestqualitysize' => { 95 => 0xc792 }, 'originaldecisiondata' => { 92 => 'OriginalDecisionData' }, @@ -3477,12 +3489,14 @@ my %tagLookup = ( 'rawandjpgrecording' => { 66 => 0x8, 152 => 0x109, 269 => 0xd }, 'rawbrightnessadj' => { 86 => 0x38 }, 'rawcoloradj' => { 86 => 0x2e }, + 'rawcompressionmode' => { 316 => 0x45 }, 'rawcropbottom' => { 296 => 0xd4 }, 'rawcropleft' => { 296 => 0xd1 }, 'rawcropright' => { 296 => 0xd3 }, 'rawcroptop' => { 296 => 0xd2 }, 'rawcustomsaturation' => { 86 => 0x30 }, 'rawcustomtone' => { 86 => 0x34 }, + 'rawdata' => { 316 => 0xa048 }, 'rawdatauniqueid' => { 95 => 0xc65d }, 'rawdepth' => { 154 => 0x10 }, 'rawdevartfilter' => { 242 => 0x121 }, @@ -3632,7 +3646,7 @@ my %tagLookup = ( 'releasebuttontousedial' => { 223 => '17.8', 224 => '18.5', 229 => '33.8', 230 => '17.6' }, 'releasedate' => { 103 => 0x1e, 403 => 'releaseDate' }, 'releasemode' => { 91 => 0x3001, 339 => 0xb049 }, - 'releasemode2' => { 346 => 0x112c, 347 => [0x112c,0x8], 348 => [0x1108,0x8], 349 => [0x1184,0x8], 350 => [0x1160,0x8], 351 => [0x4,0x1018], 352 => [0x4,0x210], 354 => 0x10, 355 => 0x10, 356 => 0x9, 362 => 0x34 }, + 'releasemode2' => { 346 => 0x112c, 347 => [0x112c,0x8], 348 => [0x1108,0x8], 349 => [0x1184,0x8], 350 => [0x1160,0x8], 351 => [0x4,0x1018], 352 => [0x4,0x210], 353 => 0x3f, 354 => 0x10, 355 => 0x10, 356 => 0x9, 362 => 0x34 }, 'releasemode3' => { 346 => 0x1128, 347 => 0x1128, 348 => 0x1104, 349 => 0x1180, 350 => 0x115c, 351 => 0x1014, 352 => 0x20c }, 'releasesetting' => { 81 => 0x1016 }, 'releasetime' => { 103 => 0x23 }, @@ -3747,6 +3761,7 @@ my %tagLookup = ( 'samplerate' => { 124 => 'SampleRate' }, 'samplesperpixel' => { 95 => 0x115, 399 => 'SamplesPerPixel' }, 'samplestructure' => { 105 => 0x5a }, + 'samsungmodelid' => { 316 => 0x3 }, 'sanyoquality' => { 318 => 0x201 }, 'sanyothumbnail' => { 318 => 0x100 }, 'saturation' => { 8 => 0x6e, 10 => 0x76, 29 => 0xe, 40 => 0x1, 90 => 0xd, 91 => [0x3013,0x1f], 95 => [0xa409,0xfe55], 100 => 0x1003, 125 => 'Saturation', 147 => 0x1f, 148 => 0x32, 149 => 0x28, 150 => 0x1a, 155 => 0x1, 182 => [0x94,0xaa], 184 => 0x35, 255 => 0x40, 257 => 0x300d, 288 => 0x1f, 294 => 0xd, 306 => 0x27, 309 => 0x28, 310 => 0x1013, 319 => 0x10, 327 => 0x1e, 328 => 0x1b, 339 => 0x2005, 380 => 'Saturation', 384 => 'Saturation' }, @@ -4126,11 +4141,9 @@ my %tagLookup = ( 'title' => { 126 => 'Title', 244 => 'Title', 247 => 'Title', 255 => 0x65, 301 => 'Title', 381 => 'title', 391 => 'Title', 401 => 'Title' }, 'tonecomp' => { 182 => 0x81 }, 'tonecurve' => { 60 => 0x1, 288 => 0x402, 380 => 'ToneCurve' }, - 'tonecurve1' => { 316 => 0xa040 }, - 'tonecurve2' => { 316 => 0xa041 }, - 'tonecurve3' => { 316 => 0xa042 }, - 'tonecurve4' => { 316 => 0xa043 }, 'tonecurveactive' => { 86 => 0x110 }, + 'tonecurveadobergb' => { 316 => 0xa043 }, + 'tonecurveadobergbdefault' => { 316 => 0xa041 }, 'tonecurveblue' => { 380 => 'ToneCurveBlue' }, 'tonecurvebluex' => { 366 => 0x9003 }, 'tonecurvebluey' => { 366 => 0x9007 }, @@ -4153,6 +4166,8 @@ my %tagLookup = ( 'tonecurveredx' => { 366 => 0x9001 }, 'tonecurveredy' => { 366 => 0x9005 }, 'tonecurves' => { 288 => 0x403 }, + 'tonecurvesrgb' => { 316 => 0xa042 }, + 'tonecurvesrgbdefault' => { 316 => 0xa040 }, 'tonelevel' => { 235 => 0x52e }, 'toningeffect' => { 46 => 0xf, 182 => 0xb3, 184 => 0x38, 310 => 0x1015 }, 'toningeffectauto' => { 57 => 0xa4 }, @@ -4349,8 +4364,9 @@ my %tagLookup = ( 'vignettecontrol' => { 182 => 0x2a, 216 => 0x76a43205 }, 'vignettecontrolintensity' => { 216 => 0xac6bd5c0 }, 'vignettemidpoint' => { 380 => 'VignetteMidpoint' }, - 'vignetting' => { 310 => 0x1011 }, - 'vignettingcorrection' => { 278 => 0x2, 339 => 0x2011 }, + 'vignetting' => { 310 => 0x1011, 316 => 0xa052 }, + 'vignettingcorrection' => { 278 => 0x2, 316 => 0xa053, 339 => 0x2011 }, + 'vignettingsetting' => { 316 => 0xa054 }, 'voicememo' => { 318 => 0x216 }, 'volume' => { 394 => 'volume' }, 'vr_0x66' => { 188 => 0x66 }, @@ -5048,6 +5064,7 @@ my %tagExists = ( 'canoncamerainfounknown16' => 1, 'canoncamerainfounknown32' => 1, 'canoncamerasettings' => 1, + 'canoncnop' => 1, 'canoncnth' => 1, 'canoncolorinfo1' => 1, 'canoncolorinfo2' => 1, @@ -7312,7 +7329,6 @@ my %tagExists = ( 'ratingorg' => 1, 'ratioimage' => 1, 'rawcodecversion' => 1, - 'rawdata' => 1, 'rawdatalength' => 1, 'rawdataoffset' => 1, 'rawdatarotation' => 1, diff --git a/lib/Image/ExifTool/TagNames.pod b/lib/Image/ExifTool/TagNames.pod index da4f977d..4c0d3b5a 100644 --- a/lib/Image/ExifTool/TagNames.pod +++ b/lib/Image/ExifTool/TagNames.pod @@ -832,7 +832,7 @@ EXIF 2.3 specification. 0xc7a1 CameraLabel IFD0 string 0xc7a3 ProfileHueSatMapEncoding IFD0 int32u! 0xc7a4 ProfileLookTableEncoding IFD0 int32u! - 0xc7a5 BaselineExposureOffset IFD0 rational64u! + 0xc7a5 BaselineExposureOffset IFD0 rational64s! 0xc7a6 DefaultBlackRender IFD0 int32u! 0xc7a7 NewRawImageDigest IFD0 int8u[16]! 0xc7a8 RawToPreviewGain IFD0 double! @@ -5527,6 +5527,12 @@ Information about creative filter settings. 0x0601 PaintingFilter N 0x0701 WatercolorFilter N +=head3 Canon CNOP Tags + + Tag ID Tag Name Writable + ------ -------- -------- + [no tags known] + =head3 Canon CNTH Tags Canon-specific QuickTime tags found in the CNTH atom of MOV videos from some @@ -11883,14 +11889,21 @@ Tags found in the EXIF-format maker notes of newer Samsung models. Tag ID Tag Name Writable ------ -------- -------- 0x0001 MakerNoteVersion undef[4] + 0x0002 DeviceType int32u + 0x0003 SamsungModelID int32u 0x0021 PictureWizard Samsung PictureWizard 0x0030 LocalLocationName string 0x0031 LocationName string 0x0035 PreviewIFD Nikon PreviewIFD 0x0043 CameraTemperature rational64s + 0x0045 RawCompressionMode int32u + 0x0100 FaceDetect int16u + 0x0120 FaceRecognition int32u + 0x0123 FaceName string 0xa001 FirmwareName string 0xa003 LensType int16u[n] 0xa004 LensFirmware string + 0xa005 InternalLensSerialNumber string 0xa010 SensorAreas int32u[8] 0xa011 ColorSpace int16u 0xa012 SmartRange int16u @@ -11908,10 +11921,20 @@ Tags found in the EXIF-format maker notes of newer Samsung models. 0xa030 ColorMatrix int32s[9] 0xa031 ColorMatrixSRGB int32s[9] 0xa032 ColorMatrixAdobeRGB int32s[9] - 0xa040 ToneCurve1 int32u[23] - 0xa041 ToneCurve2 int32u[23] - 0xa042 ToneCurve3 int32u[23] - 0xa043 ToneCurve4 int32u[23] + 0xa033 CbCrMatrixDefault int32s[4] + 0xa034 CbCrMatrix int32s[4] + 0xa035 CbCrGainDefault int32u[2] + 0xa036 CbCrGain int32u[2] + 0xa040 ToneCurveSRGBDefault int32u[23] + 0xa041 ToneCurveAdobeRGBDefault int32u[23] + 0xa042 ToneCurveSRGB int32u[23] + 0xa043 ToneCurveAdobeRGB int32u[23] + 0xa048 RawData? int32s[12] + 0xa050 Distortion? int32s[8] + 0xa051 Chromatic Aberration? int16u[22] + 0xa052 Vignetting? int16u[15] + 0xa053 VignettingCorrection? int16u[15] + 0xa054 VignettingSetting? int16u[15] =head3 Samsung PictureWizard Tags @@ -12552,20 +12575,35 @@ A580, A33, A35, A55, NEX-3/5/C3 and VG10E. 24 ViewingMode int8u 25 FaceDetection int8u 26 CustomWB_RBLevels int16uRev[2] - 30 ExposureCompensationSet int8u - 31 FlashExposureCompSet int8u + 30 BrightnessValue int8u + ExposureCompensationSet int8u + 31 ISO int8u + FlashExposureCompSet int8u + 32 FNumber int8u + LiveViewAFMethod int8u + 33 ExposureTime int8u + ISO int8u + 34 FNumber int8u + 35 FocalLength2 int8u + ExposureTime int8u + 36 ExposureCompensation2 int16s + 37 FocalLength2 int8u ISO int8u - 32 LiveViewAFMethod int8u - 33 ISO int8u - 37 ISO int8u - 38 FNumber int8u + 38 FlashExposureCompSet2 int16s + ExposureCompensation2 int16s + FNumber int8u 39 ExposureTime int8u - 41 FocalLength2 int8u - FocusPosition2 int8u - 42 ExposureCompensation2 int16s + 40 Orientation2 int8u + 41 FocusPosition2 int8u + FocalLength2 int8u + 42 FlashAction2 int8u + ExposureCompensation2 int16s 43 FocusPosition2 int8u - 44 FlashExposureCompSet2 int16s - 46 Orientation2 int8u + 44 FocusMode2 int8u + FlashAction2 int8u + FlashExposureCompSet2 int16s + 46 FocusMode2 int8u + Orientation2 int8u 47 FocusPosition2 int8u 48 FlashAction2 int8u 50 FocusMode2 int8u @@ -12773,6 +12811,8 @@ A560, A580, NEX-3, NEX-5, NEX-C3 and NEX-VG10E. 780 SequenceNumber int8u 788 ImageNumber int16u & 0x3fff 790 FolderNumber int16u & 0x3ff + 1008 E-mountVersionLens int16u + 1011 E-mountVersionCamera int16u 1015 LensType2 int16u 1024 ImageNumber int16u & 0x3fff 1026 FolderNumber int16u & 0x3ff @@ -13036,7 +13076,7 @@ Valid for DSC-RX100M2, DSC-QX10/QX100. =head3 Sony Tag2010g Tags Valid for DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350, -ILCE-7/7R/7S/5000/5100/6000/QX1, ILCA-77M2. +ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-77M2. Tag ID Tag Name Writable ------ -------- -------- @@ -13132,6 +13172,7 @@ substitution cipher, but the deciphered values are listed below. 0x0032 ImageCount int32u 0x003a SonyExposureTime int16u 0x003c SonyFNumber int16u + 0x003f ReleaseMode2 int8u 0x004c ImageCount2 int32u 0x0051 SonyDateTime2 undef[6] 0x007c InternalSerialNumber int8u[4]~ @@ -13184,7 +13225,7 @@ DSC-HX50V, DSC-QX10/QX100. =head3 Sony Tag9400c Tags Valid for DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350, -ILCE-7/7R/7S/5000/5100/6000/QX1, ILCA-77M2. +ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-77M2. Tag ID Tag Name Writable ------ -------- -------- @@ -13242,7 +13283,7 @@ Valid for SLT, NEX, ILCE-3000/3500 and several DSC models. =head3 Sony Tag9405b Tags Valid for DSC-HX400V/HX60V/QX30/RX10/RX100M3/WX220/WX350, -ILCE-7/7R/7S/5000/5100/6000/QX1, ILCA-77M2. +ILCE-7/7R/7S/7M2/5000/5100/6000/QX1, ILCA-77M2. Tag ID Tag Name Writable ------ -------- -------- @@ -13294,6 +13335,8 @@ NEX and ILCE models only. ------ -------- -------- 0x0008 LensMount int8u 0x0009 LensType2 int16u + 0x000b E-mountVersionCamera int16u + 0x000d E-mountVersionLens int16u =head3 Sony AFInfo Tags @@ -19421,7 +19464,7 @@ added dynamically to this table after processing the Meta Keys information. 'plID' PlayListID N 'purd' PurchaseDate N 'purl' PodcastURL N - 'rate' Rating N + 'rate' RatingPercent N 'rtng' Rating N 'sfID' AppleStoreCountry N 'soaa' SortAlbumArtist N @@ -19906,6 +19949,7 @@ multi-language user data tags found, even if they don't exist in this table. 'CNCV' CompressorVersion N 'CNFV' FirmwareVersion N 'CNMN' Model N + 'CNOP' CanonCNOP Canon CNOP 'CNTH' CanonCNTH Canon CNTH 'DcMD' KodakDcMD Kodak DcMD 'FFMV' FujiFilmFFMV FujiFilm FFMV diff --git a/lib/Image/ExifTool/WriteExif.pl b/lib/Image/ExifTool/WriteExif.pl index b689cf4e..450760bd 100644 --- a/lib/Image/ExifTool/WriteExif.pl +++ b/lib/Image/ExifTool/WriteExif.pl @@ -1148,7 +1148,7 @@ my %writeTable = ( Protected => 1, }, 0xc7a5 => { # BaselineExposureOffset - Writable => 'rational64u', + Writable => 'rational64s', # (incorrectly "RATIONAL" in DNG 1.4 spec) WriteGroup => 'IFD0', Protected => 1, }, @@ -3180,9 +3180,15 @@ NoOverwrite: next if $isNew > 0; $entryBasedFixup->ApplyFixup(\$dirBuff); undef $entryBasedFixup; } + # initialize next IFD pointer to zero + my $nextIFD = Set32u(0); + # some cameras use a different amount of padding after the makernote IFD + if ($dirName eq 'MakerNotes' and $$dirInfo{Parent} =~ /^(ExifIFD|IFD0)$/) { + my ($rel, $pad) = Image::ExifTool::MakerNotes::GetMakerNoteOffset($et); + $nextIFD = "\0" x $pad if defined $pad and ($pad==0 or ($pad>4 and $pad<=32)); + } # add directory entry count to start of IFD and next IFD pointer to end - # (temporarily set next IFD pointer to zero) - $newData .= Set16u($newEntries) . $dirBuff . Set32u(0); + $newData .= Set16u($newEntries) . $dirBuff . $nextIFD; # get position of value data in newData my $valPos = length($newData); # go back now and set next IFD pointer if this isn't the first IFD @@ -3192,7 +3198,7 @@ NoOverwrite: next if $isNew > 0; $fixup->AddFixup($nextIfdPos,'NextIFD'); # add fixup for this offset in newData } # remember position of 'next IFD' pointer so we can set it next time around - $nextIfdPos = $valPos - 4; + $nextIfdPos = length($nextIFD) ? $valPos - length($nextIFD) : undef; # add value data after IFD $newData .= $valBuff; # diff --git a/lib/Image/ExifTool/WriteQuickTime.pl b/lib/Image/ExifTool/WriteQuickTime.pl index e502622b..22582859 100644 --- a/lib/Image/ExifTool/WriteQuickTime.pl +++ b/lib/Image/ExifTool/WriteQuickTime.pl @@ -145,9 +145,13 @@ sub WriteQuickTime($$$) my $start = $$subdir{Start} || 0; my $base = ($$dirInfo{Base} || 0) + $raf->Tell() - $size; my $dPos = 0; + my $hdrLen = $start; if ($$subdir{Base}) { - $dPos -= eval $$subdir{Base}; + my $localBase = eval $$subdir{Base}; + $dPos -= $localBase; $base -= $dPos; + # get length of header before base offset + $hdrLen -= $localBase if $localBase <= $hdrLen; } my %subdirInfo = ( Parent => $dirName, @@ -162,6 +166,12 @@ sub WriteQuickTime($$$) Multi => $$subdir{Multi}, # necessary? OutFile => $outfile, ); + # pass the header pointer if necessary (for EXIF IFD's + # where the Base offset is at the end of the header) + if ($hdrLen and $hdrLen < $size) { + my $header = substr($buff,0,$hdrLen); + $subdirInfo{HeaderPtr} = \$header; + } SetByteOrder('II') if $$subdir{ByteOrder} and $$subdir{ByteOrder} =~ /^Little/; my $oldWriteGroup = $$et{CUR_WRITE_GROUP}; if ($subName eq 'Track') { @@ -171,17 +181,19 @@ sub WriteQuickTime($$$) my $subTable = GetTagTable($$subdir{TagTable}); # demote non-QuickTime errors to warnings $$et{DemoteErrors} = 1 unless $$subTable{GROUPS}{0} eq 'QuickTime'; + my $oldChanged = $$et{CHANGED}; $newData = $et->WriteDirectory(\%subdirInfo, $subTable); if ($$et{DemoteErrors}) { # just copy existing subdirectory a non-quicktime error occurred - undef $newData if $$et{DemoteErrors} > 1; + $$et{CHANGED} = $oldChanged if $$et{DemoteErrors} > 1; delete $$et{DemoteErrors}; } + undef $newData if $$et{CHANGED} == $oldChanged; # don't change unless necessary $$et{CUR_WRITE_GROUP} = $oldWriteGroup; SetByteOrder('MM'); # add back header if necessary - if ($$subdir{Start} and defined $newData and length $newData) { - $newData = substr($buff,0,$$subdir{Start}) . $newData; + if ($start and defined $newData and length $newData) { + $newData = substr($buff,0,$start) . $newData; } # the directory exists, so we don't need to add it delete $$addDirs{$subName} if IsCurPath($et, $subName); diff --git a/lib/Image/ExifTool/XMPStruct.pl b/lib/Image/ExifTool/XMPStruct.pl index 4320f53e..5297fe67 100644 --- a/lib/Image/ExifTool/XMPStruct.pl +++ b/lib/Image/ExifTool/XMPStruct.pl @@ -623,7 +623,7 @@ sub RestoreStruct($;$) # this could happen for invalid XMP containing mixed lists # (or for something like this -- what should we do here?: # <meta:user-defined meta:name="License">test</meta:user-defined>) - $et->Warn("$$strInfo{Name} is not a structure!"); + $et->Warn("$$strInfo{Name} is not a structure!") unless $$et{NO_STRUCT_WARN}; next; } } else { @@ -734,8 +734,10 @@ sub RestoreStruct($;$) if ($err) { # this may happen if we have a structural error in the XMP # (like an improperly contained list for example) - my $ns = $$tagInfo{Namespace} || $$tagInfo{Table}{NAMESPACE} || ''; - $et->Warn("Error $err placing $ns:$$tagInfo{TagID} in structure or list", 1); + unless ($$et{NO_STRUCT_WARN}) { + my $ns = $$tagInfo{Namespace} || $$tagInfo{Table}{NAMESPACE} || ''; + $et->Warn("Error $err placing $ns:$$tagInfo{TagID} in structure or list", 1); + } delete $structs{$strInfo} unless $oldStruct; } elsif ($tagInfo eq $strInfo) { # just a regular list tag diff --git a/lib/Image/ExifTool/ZIP.pm b/lib/Image/ExifTool/ZIP.pm index a0fb6407..ac34ec1f 100644 --- a/lib/Image/ExifTool/ZIP.pm +++ b/lib/Image/ExifTool/ZIP.pm @@ -19,7 +19,7 @@ use strict; use vars qw($VERSION $warnString); use Image::ExifTool qw(:DataAccess :Utils); -$VERSION = '1.17'; +$VERSION = '1.18'; sub WarnProc($) { $warnString = $_[0]; } @@ -488,9 +488,12 @@ sub ProcessZIP($$) DataPt => \$buff, DirLen => length $buff, DataLen => length $buff, - NoStruct => 1, # (avoid structure warnings when copying) ); + # (avoid structure warnings when copying from XML) + my $oldWarn = $$et{NO_STRUCT_WARN}; + $$et{NO_STRUCT_WARN} = 1; $et->ProcessDirectory(\%dirInfo, GetTagTable('Image::ExifTool::XMP::Main')); + $$et{NO_STRUCT_WARN} = $oldWarn; } } # process rootfile of EPUB container if applicable @@ -520,10 +523,13 @@ sub ProcessZIP($$) DataPt => \$buff, DirLen => length $buff, DataLen => length $buff, - NoStruct => 1, IgnoreProp => { 'package' => 1, metadata => 1 }, ); + # (avoid structure warnings when copying from XML) + my $oldWarn = $$et{NO_STRUCT_WARN}; + $$et{NO_STRUCT_WARN} = 1; $et->ProcessDirectory(\%dirInfo, GetTagTable('Image::ExifTool::XMP::XML')); + $$et{NO_STRUCT_WARN} = $oldWarn; last; } if ($openDocType{$mime} or $meta) { |