exiftool_vendored 12.57.0 → 12.58.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +14 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/rotate_regions.config +1 -1
- data/bin/exiftool +25 -21
- data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- data/bin/lib/Image/ExifTool/APE.pm +2 -2
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +13 -14
- data/bin/lib/Image/ExifTool/Canon.pm +26 -6
- data/bin/lib/Image/ExifTool/DJI.pm +28 -2
- data/bin/lib/Image/ExifTool/Exif.pm +24 -5
- data/bin/lib/Image/ExifTool/FlashPix.pm +2 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
- data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
- data/bin/lib/Image/ExifTool/LNK.pm +5 -4
- data/bin/lib/Image/ExifTool/MPEG.pm +2 -2
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Minolta.pm +6 -7
- data/bin/lib/Image/ExifTool/Nikon.pm +385 -110
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
- data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +5 -5
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/README +8 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
- data/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
- data/bin/lib/Image/ExifTool/Sigma.pm +4 -4
- data/bin/lib/Image/ExifTool/Sony.pm +23 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4457 -4441
- data/bin/lib/Image/ExifTool/TagNames.pod +76 -12
- data/bin/lib/Image/ExifTool/Validate.pm +5 -5
- data/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
- data/bin/lib/Image/ExifTool/Writer.pl +3 -1
- data/bin/lib/Image/ExifTool/XMP.pm +2 -2
- data/bin/lib/Image/ExifTool.pm +57 -12
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -65,6 +65,7 @@ sub RebuildMakerNotes($$$);
|
|
65
65
|
sub EncodeExifText($$);
|
66
66
|
sub ValidateIFD($;$);
|
67
67
|
sub ValidateImageData($$$;$);
|
68
|
+
sub AddImageDataMD5($$$);
|
68
69
|
sub ProcessTiffIFD($$$);
|
69
70
|
sub PrintParameter($$$);
|
70
71
|
sub GetOffList($$$$$);
|
@@ -573,6 +574,7 @@ my %opcodeInfo = (
|
|
573
574
|
],
|
574
575
|
Name => 'StripOffsets',
|
575
576
|
IsOffset => 1,
|
577
|
+
IsImageData => 1,
|
576
578
|
OffsetPair => 0x117, # point to associated byte counts
|
577
579
|
# A200 stores this information in the wrong byte order!!
|
578
580
|
ValueConv => '$val=join(" ",unpack("N*",pack("V*",split(" ",$val))));\$val',
|
@@ -582,6 +584,7 @@ my %opcodeInfo = (
|
|
582
584
|
Condition => '$$self{Compression} and $$self{Compression} eq "34892"', # DNG Lossy JPEG
|
583
585
|
Name => 'OtherImageStart',
|
584
586
|
IsOffset => 1,
|
587
|
+
IsImageData => 1,
|
585
588
|
OffsetPair => 0x117, # point to associated byte counts
|
586
589
|
DataTag => 'OtherImage',
|
587
590
|
},
|
@@ -594,6 +597,7 @@ my %opcodeInfo = (
|
|
594
597
|
],
|
595
598
|
Name => 'StripOffsets',
|
596
599
|
IsOffset => 1,
|
600
|
+
IsImageData => 1,
|
597
601
|
OffsetPair => 0x117, # point to associated byte counts
|
598
602
|
ValueConv => 'length($val) > 32 ? \$val : $val',
|
599
603
|
},
|
@@ -630,6 +634,7 @@ my %opcodeInfo = (
|
|
630
634
|
# JpgFromRawStart in various IFD's of DNG images except SubIFD2
|
631
635
|
Name => 'JpgFromRawStart',
|
632
636
|
IsOffset => 1,
|
637
|
+
IsImageData => 1,
|
633
638
|
OffsetPair => 0x117,
|
634
639
|
DataTag => 'JpgFromRaw',
|
635
640
|
Writable => 'int32u',
|
@@ -933,6 +938,7 @@ my %opcodeInfo = (
|
|
933
938
|
0x144 => {
|
934
939
|
Name => 'TileOffsets',
|
935
940
|
IsOffset => 1,
|
941
|
+
IsImageData => 1,
|
936
942
|
OffsetPair => 0x145,
|
937
943
|
ValueConv => 'length($val) > 32 ? \$val : $val',
|
938
944
|
},
|
@@ -1187,6 +1193,7 @@ my %opcodeInfo = (
|
|
1187
1193
|
Name => 'JpgFromRawStart',
|
1188
1194
|
Condition => '$$self{DIR_NAME} eq "SubIFD"',
|
1189
1195
|
IsOffset => 1,
|
1196
|
+
IsImageData => 1,
|
1190
1197
|
OffsetPair => 0x202,
|
1191
1198
|
DataTag => 'JpgFromRaw',
|
1192
1199
|
Writable => 'int32u',
|
@@ -1199,6 +1206,7 @@ my %opcodeInfo = (
|
|
1199
1206
|
Name => 'JpgFromRawStart',
|
1200
1207
|
Condition => '$$self{DIR_NAME} eq "IFD2"',
|
1201
1208
|
IsOffset => 1,
|
1209
|
+
IsImageData => 1,
|
1202
1210
|
OffsetPair => 0x202,
|
1203
1211
|
DataTag => 'JpgFromRaw',
|
1204
1212
|
Writable => 'int32u',
|
@@ -1210,6 +1218,7 @@ my %opcodeInfo = (
|
|
1210
1218
|
{
|
1211
1219
|
Name => 'OtherImageStart',
|
1212
1220
|
Condition => '$$self{DIR_NAME} eq "SubIFD1"',
|
1221
|
+
IsImageData => 1,
|
1213
1222
|
IsOffset => 1,
|
1214
1223
|
OffsetPair => 0x202,
|
1215
1224
|
DataTag => 'OtherImage',
|
@@ -1222,6 +1231,7 @@ my %opcodeInfo = (
|
|
1222
1231
|
Name => 'OtherImageStart',
|
1223
1232
|
Condition => '$$self{DIR_NAME} eq "SubIFD2"',
|
1224
1233
|
IsOffset => 1,
|
1234
|
+
IsImageData => 1,
|
1225
1235
|
OffsetPair => 0x202,
|
1226
1236
|
DataTag => 'OtherImage',
|
1227
1237
|
Writable => 'int32u',
|
@@ -1232,6 +1242,7 @@ my %opcodeInfo = (
|
|
1232
1242
|
{
|
1233
1243
|
Name => 'OtherImageStart',
|
1234
1244
|
IsOffset => 1,
|
1245
|
+
IsImageData => 1,
|
1235
1246
|
OffsetPair => 0x202,
|
1236
1247
|
},
|
1237
1248
|
],
|
@@ -2968,6 +2979,7 @@ my %opcodeInfo = (
|
|
2968
2979
|
0xbcc0 => { #13
|
2969
2980
|
Name => 'ImageOffset',
|
2970
2981
|
IsOffset => 1,
|
2982
|
+
IsImageData => 1,
|
2971
2983
|
OffsetPair => 0xbcc1, # point to associated byte count
|
2972
2984
|
},
|
2973
2985
|
0xbcc1 => { #13
|
@@ -2977,6 +2989,7 @@ my %opcodeInfo = (
|
|
2977
2989
|
0xbcc2 => { #13
|
2978
2990
|
Name => 'AlphaOffset',
|
2979
2991
|
IsOffset => 1,
|
2992
|
+
IsImageData => 1,
|
2980
2993
|
OffsetPair => 0xbcc3, # point to associated byte count
|
2981
2994
|
},
|
2982
2995
|
0xbcc3 => { #13
|
@@ -5885,10 +5898,14 @@ sub ProcessExif($$$)
|
|
5885
5898
|
my $saveFormat = $et->Options('SaveFormat');
|
5886
5899
|
my $htmlDump = $$et{HTML_DUMP};
|
5887
5900
|
my $success = 1;
|
5888
|
-
my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName);
|
5901
|
+
my ($tagKey, $dirSize, $makerAddr, $strEnc, %offsetInfo, $offName, $nextOffName, $doMD5);
|
5889
5902
|
my $inMakerNotes = $$tagTablePtr{GROUPS}{0} eq 'MakerNotes';
|
5890
5903
|
my $isExif = ($tagTablePtr eq \%Image::ExifTool::Exif::Main);
|
5891
5904
|
|
5905
|
+
# set flag to calculate image data MD5 if requested
|
5906
|
+
$doMD5 = 1 if $$et{ImageDataMD5} and (($$et{FILE_TYPE} eq 'TIFF' and not $base and not $inMakerNotes) or
|
5907
|
+
($$et{FILE_TYPE} eq 'RAF' and $dirName eq 'FujiIFD'));
|
5908
|
+
|
5892
5909
|
# set encoding to assume for strings
|
5893
5910
|
$strEnc = $et->Options('CharsetEXIF') if $$tagTablePtr{GROUPS}{0} eq 'EXIF';
|
5894
5911
|
|
@@ -6725,7 +6742,7 @@ sub ProcessExif($$$)
|
|
6725
6742
|
}
|
6726
6743
|
$val = join(' ', @vals);
|
6727
6744
|
}
|
6728
|
-
if ($validate) {
|
6745
|
+
if ($validate or $doMD5) {
|
6729
6746
|
if ($$tagInfo{OffsetPair}) {
|
6730
6747
|
$offsetInfo{$tagID} = [ $tagInfo, $val ];
|
6731
6748
|
} elsif ($saveForValidate{$tagID} and $isExif) {
|
@@ -6743,9 +6760,11 @@ sub ProcessExif($$$)
|
|
6743
6760
|
}
|
6744
6761
|
}
|
6745
6762
|
|
6746
|
-
|
6747
|
-
|
6748
|
-
|
6763
|
+
if (%offsetInfo) {
|
6764
|
+
# calculate image data MD5 if requested
|
6765
|
+
AddImageDataMD5($et, $dirInfo, \%offsetInfo) if $doMD5;
|
6766
|
+
# validate image data offsets for this IFD (note: modifies %offsetInfo)
|
6767
|
+
Image::ExifTool::Validate::ValidateOffsetInfo($et, \%offsetInfo, $dirName, $inMakerNotes) if $validate;
|
6749
6768
|
}
|
6750
6769
|
|
6751
6770
|
# scan for subsequent IFD's if specified
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
use Image::ExifTool::Exif;
|
22
22
|
use Image::ExifTool::ASF; # for GetGUID()
|
23
23
|
|
24
|
-
$VERSION = '1.
|
24
|
+
$VERSION = '1.43';
|
25
25
|
|
26
26
|
sub ProcessFPX($$);
|
27
27
|
sub ProcessFPXR($$$);
|
@@ -2441,7 +2441,7 @@ sub ProcessFPX($$)
|
|
2441
2441
|
}
|
2442
2442
|
$$et{INDENT} = $oldIndent if $verbose;
|
2443
2443
|
# try to better identify the file type
|
2444
|
-
if ($$et{
|
2444
|
+
if ($$et{FileType} eq 'FPX') {
|
2445
2445
|
my $val = $$et{CompObjUserType} || $$et{Software};
|
2446
2446
|
if ($val) {
|
2447
2447
|
my %type = ( '^3ds Max' => 'MAX', Word => 'DOC', PowerPoint => 'PPT', Excel => 'XLS' );
|
@@ -11,7 +11,7 @@ use strict;
|
|
11
11
|
use vars qw($VERSION);
|
12
12
|
use Image::ExifTool qw(:DataAccess :Utils);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.35';
|
15
15
|
|
16
16
|
sub ProcessOcad($$$);
|
17
17
|
sub ProcessJPEG_HDR($$$);
|
@@ -134,9 +134,17 @@ sub ProcessJPEG_HDR($$$);
|
|
134
134
|
Condition => '$$self{HasIJPEG}"',
|
135
135
|
SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::Factory' },
|
136
136
|
}, {
|
137
|
-
Name => 'ThermalParams', # (written by DJI FLIR models)
|
137
|
+
Name => 'ThermalParams', # (written by some DJI FLIR models)
|
138
138
|
Condition => '$$self{Make} eq "DJI" and $$valPt =~ /^\xaa\x55\x12\x06/',
|
139
139
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::ThermalParams' },
|
140
|
+
}, {
|
141
|
+
Name => 'ThermalParams2', # (written by M3T)
|
142
|
+
Condition => '$$self{Make} eq "DJI" and $$valPt =~ /^(.{32})?.{32}\x2c\x01\x20\0/s',
|
143
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::ThermalParams2' },
|
144
|
+
}, {
|
145
|
+
Name => 'ThermalParams3', # (written by M30T)
|
146
|
+
Condition => '$$self{Make} eq "DJI" and $$valPt =~ /^.{32}\xaa\x55\x38\0/s',
|
147
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::ThermalParams3' },
|
140
148
|
}, {
|
141
149
|
Name => 'PreviewImage', # (eg. Samsung S1060)
|
142
150
|
Notes => 'continued from APP3',
|
@@ -207,6 +215,10 @@ sub ProcessJPEG_HDR($$$);
|
|
207
215
|
Name => 'InfiRayOpMode',
|
208
216
|
Condition => '$$self{HasIJPEG}',
|
209
217
|
SubDirectory => { TagTable => 'Image::ExifTool::InfiRay::OpMode' },
|
218
|
+
}, {
|
219
|
+
Name => 'DJI-DBG',
|
220
|
+
Condition => '$$valPt =~ /^DJI-DBG\0/',
|
221
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::Info' },
|
210
222
|
}],
|
211
223
|
APP8 => [{
|
212
224
|
Name => 'SPIFF',
|
@@ -15,7 +15,7 @@ use strict;
|
|
15
15
|
use vars qw($VERSION);
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.09';
|
19
19
|
|
20
20
|
sub ProcessItemID($$$);
|
21
21
|
sub ProcessLinkInfo($$$);
|
@@ -507,7 +507,7 @@ sub ProcessLinkInfo($$$)
|
|
507
507
|
if ($lif & 0x01) {
|
508
508
|
# read Volume ID
|
509
509
|
$off = Get32u($dataPt, 0x0c);
|
510
|
-
if ($off + 0x20 <= $dataLen) {
|
510
|
+
if ($off and $off + 0x20 <= $dataLen) {
|
511
511
|
# my $len = Get32u($dataPt, $off);
|
512
512
|
$et->HandleTag($tagTablePtr, 'DriveType', undef, %opts, Start=>$off+4);
|
513
513
|
$et->HandleTag($tagTablePtr, 'DriveSerialNumber', undef, %opts, Start=>$off+8);
|
@@ -545,6 +545,7 @@ sub ProcessLinkInfo($$$)
|
|
545
545
|
$off = Get32u($dataPt, 0x14);
|
546
546
|
if ($off and $off + 0x14 <= $dataLen) {
|
547
547
|
my $siz = Get32u($dataPt, $off);
|
548
|
+
return 0 if $off + $siz > $dataLen;
|
548
549
|
$pos = Get32u($dataPt, $off + 0x08);
|
549
550
|
if ($pos > 0x14 and $siz >= 0x18) {
|
550
551
|
$pos = Get32u($dataPt, $off + 0x14);
|
@@ -552,7 +553,7 @@ sub ProcessLinkInfo($$$)
|
|
552
553
|
} else {
|
553
554
|
undef $unicode;
|
554
555
|
}
|
555
|
-
$val = GetString($dataPt, $pos, $unicode);
|
556
|
+
$val = GetString($dataPt, $off + $pos, $unicode);
|
556
557
|
if (defined $val) {
|
557
558
|
$size = length $val;
|
558
559
|
$val = $et->Decode($val, 'UCS2') if $unicode;
|
@@ -567,7 +568,7 @@ sub ProcessLinkInfo($$$)
|
|
567
568
|
} else {
|
568
569
|
undef $unicode;
|
569
570
|
}
|
570
|
-
$val = GetString($dataPt, $pos, $unicode);
|
571
|
+
$val = GetString($dataPt, $off + $pos, $unicode);
|
571
572
|
if (defined $val) {
|
572
573
|
$size = length $val;
|
573
574
|
$val = $et->Decode($val, 'UCS2') if $unicode;
|
@@ -18,7 +18,7 @@ use strict;
|
|
18
18
|
use vars qw($VERSION);
|
19
19
|
use Image::ExifTool qw(:DataAccess :Utils);
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.17';
|
22
22
|
|
23
23
|
%Image::ExifTool::MPEG::Audio = (
|
24
24
|
GROUPS => { 2 => 'Audio' },
|
@@ -599,7 +599,7 @@ sub ProcessMPEGVideo($$)
|
|
599
599
|
return 0;
|
600
600
|
}
|
601
601
|
# set file type if not done already
|
602
|
-
$et->SetFileType('MPEG') unless $$et{
|
602
|
+
$et->SetFileType('MPEG') unless $$et{FileType};
|
603
603
|
|
604
604
|
my $tagTablePtr = GetTagTable('Image::ExifTool::MPEG::Video');
|
605
605
|
ProcessFrameHeader($et, $tagTablePtr, $w1, $w2);
|
@@ -21,7 +21,7 @@ sub ProcessKodakPatch($$$);
|
|
21
21
|
sub WriteUnknownOrPreview($$$);
|
22
22
|
sub FixLeicaBase($$;$);
|
23
23
|
|
24
|
-
$VERSION = '2.
|
24
|
+
$VERSION = '2.13';
|
25
25
|
|
26
26
|
my $debug; # set to 1 to enable debugging code
|
27
27
|
|
@@ -96,7 +96,7 @@ my $debug; # set to 1 to enable debugging code
|
|
96
96
|
},
|
97
97
|
{
|
98
98
|
Name => 'MakerNoteDJI',
|
99
|
-
Condition => '$$self{Make} eq "DJI" and $$valPt !~
|
99
|
+
Condition => '$$self{Make} eq "DJI" and $$valPt !~ /^(...\@AMBA|DJI)/s',
|
100
100
|
SubDirectory => {
|
101
101
|
TagTable => 'Image::ExifTool::DJI::Main',
|
102
102
|
Start => '$valuePtr',
|
@@ -49,7 +49,7 @@ use vars qw($VERSION %minoltaLensTypes %minoltaTeleconverters %minoltaColorMode
|
|
49
49
|
use Image::ExifTool qw(:DataAccess :Utils);
|
50
50
|
use Image::ExifTool::Exif;
|
51
51
|
|
52
|
-
$VERSION = '2.
|
52
|
+
$VERSION = '2.88';
|
53
53
|
|
54
54
|
# Full list of product codes for Sony-compatible Minolta lenses
|
55
55
|
# (ref http://www.kb.sony.com/selfservice/documentLink.do?externalId=C1000570)
|
@@ -179,12 +179,9 @@ $VERSION = '2.87';
|
|
179
179
|
# ("New" and "II" appear in brackets if original version also has this LensType)
|
180
180
|
%minoltaLensTypes = (
|
181
181
|
Notes => q{
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
brackets if the original version of the lens has the same LensType. Special
|
186
|
-
logic is employed to identify the attached lens when a Metabones Canon EF
|
187
|
-
adapter is used.
|
182
|
+
"New" or "II" appear in brackets if the original version of the lens has the
|
183
|
+
same LensType. Special logic is employed to identify the attached lens when
|
184
|
+
a Metabones Canon EF adapter is used.
|
188
185
|
},
|
189
186
|
OTHER => sub {
|
190
187
|
my ($val, $inv) = @_;
|
@@ -898,6 +895,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
898
895
|
SeparateTable => 1,
|
899
896
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
900
897
|
PrintConv => \%minoltaLensTypes,
|
898
|
+
PrintInt => 1,
|
901
899
|
},
|
902
900
|
# 0x010e - WhiteBalance according to ref #10
|
903
901
|
0x0111 => { #20
|
@@ -2708,6 +2706,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
2708
2706
|
SeparateTable => 1,
|
2709
2707
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
2710
2708
|
PrintConv => \%minoltaLensTypes,
|
2709
|
+
PrintInt => 1,
|
2711
2710
|
},
|
2712
2711
|
0x49c0 => {
|
2713
2712
|
Name => 'ExposureCompensation', # (in exposure bracketing, this is the actual value used)
|