exiftool_vendored 12.57.0 → 12.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Changes +39 -0
- data/bin/MANIFEST +3 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/config_files/example.config +1 -0
- data/bin/config_files/rotate_regions.config +1 -1
- data/bin/exiftool +76 -57
- 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 +28 -10
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
- data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
- data/bin/lib/Image/ExifTool/LIF.pm +10 -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/MinoltaRaw.pm +9 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +390 -114
- data/bin/lib/Image/ExifTool/Olympus.pm +87 -7
- data/bin/lib/Image/ExifTool/PNG.pm +15 -2
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
- data/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +16 -11
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +38 -6
- data/bin/lib/Image/ExifTool/README +8 -0
- data/bin/lib/Image/ExifTool/RIFF.pm +41 -13
- 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 +4464 -4441
- data/bin/lib/Image/ExifTool/TagNames.pod +117 -36
- data/bin/lib/Image/ExifTool/Validate.pm +5 -5
- data/bin/lib/Image/ExifTool/WriteExif.pl +49 -0
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +74 -14
- data/bin/lib/Image/ExifTool/XMP.pm +19 -4
- data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- data/bin/lib/Image/ExifTool.pm +131 -17
- data/bin/lib/Image/ExifTool.pod +40 -5
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
|
@@ -88,18 +88,13 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.66';
|
|
92
92
|
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
|
95
95
|
# --> have relaxed this for new lenses because Canon has been
|
|
96
96
|
# consistent about keeping "USM" in the model name
|
|
97
97
|
%canonLensTypes = ( #4
|
|
98
|
-
Notes => q{
|
|
99
|
-
Decimal values have been added to differentiate lenses which would otherwise
|
|
100
|
-
have the same LensType, and are used by the Composite LensID tag when
|
|
101
|
-
attempting to identify the specific lens model.
|
|
102
|
-
},
|
|
103
98
|
-1 => 'n/a',
|
|
104
99
|
1 => 'Canon EF 50mm f/1.8',
|
|
105
100
|
2 => 'Canon EF 28mm f/2.8 or Sigma Lens',
|
|
@@ -2402,6 +2397,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
2402
2397
|
DataMember => 'LensType',
|
|
2403
2398
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
2404
2399
|
PrintConv => \%canonLensTypes,
|
|
2400
|
+
PrintInt => 1,
|
|
2405
2401
|
},
|
|
2406
2402
|
23 => {
|
|
2407
2403
|
Name => 'MaxFocalLength',
|
|
@@ -3060,6 +3056,7 @@ my %ciMaxFocal = (
|
|
|
3060
3056
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3061
3057
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3062
3058
|
PrintConv => \%canonLensTypes,
|
|
3059
|
+
PrintInt => 1,
|
|
3063
3060
|
},
|
|
3064
3061
|
0x0e => {
|
|
3065
3062
|
Name => 'MinFocalLength',
|
|
@@ -3175,6 +3172,7 @@ my %ciMaxFocal = (
|
|
|
3175
3172
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3176
3173
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3177
3174
|
PrintConv => \%canonLensTypes,
|
|
3175
|
+
PrintInt => 1,
|
|
3178
3176
|
},
|
|
3179
3177
|
0x11 => { %ciMinFocal }, #9
|
|
3180
3178
|
0x13 => { %ciMaxFocal }, #9
|
|
@@ -3252,6 +3250,7 @@ my %ciMaxFocal = (
|
|
|
3252
3250
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3253
3251
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3254
3252
|
PrintConv => \%canonLensTypes,
|
|
3253
|
+
PrintInt => 1,
|
|
3255
3254
|
},
|
|
3256
3255
|
0x11 => { %ciMinFocal },
|
|
3257
3256
|
0x13 => { %ciMaxFocal },
|
|
@@ -3347,6 +3346,7 @@ my %ciMaxFocal = (
|
|
|
3347
3346
|
SeparateTable => 1,
|
|
3348
3347
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3349
3348
|
PrintConv => \%canonLensTypes,
|
|
3349
|
+
PrintInt => 1,
|
|
3350
3350
|
},
|
|
3351
3351
|
0x113 => { %ciMinFocal },
|
|
3352
3352
|
0x115 => { %ciMaxFocal },
|
|
@@ -3502,6 +3502,7 @@ my %ciMaxFocal = (
|
|
|
3502
3502
|
SeparateTable => 1,
|
|
3503
3503
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3504
3504
|
PrintConv => \%canonLensTypes,
|
|
3505
|
+
PrintInt => 1,
|
|
3505
3506
|
},
|
|
3506
3507
|
0x151 => { %ciMinFocal },
|
|
3507
3508
|
0x153 => { %ciMaxFocal,
|
|
@@ -3610,6 +3611,7 @@ my %ciMaxFocal = (
|
|
|
3610
3611
|
SeparateTable => 1,
|
|
3611
3612
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3612
3613
|
PrintConv => \%canonLensTypes,
|
|
3614
|
+
PrintInt => 1,
|
|
3613
3615
|
},
|
|
3614
3616
|
0x1a9 => { %ciMinFocal },
|
|
3615
3617
|
0x1ab => { %ciMaxFocal,
|
|
@@ -3661,6 +3663,7 @@ my %ciMaxFocal = (
|
|
|
3661
3663
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3662
3664
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3663
3665
|
PrintConv => \%canonLensTypes,
|
|
3666
|
+
PrintInt => 1,
|
|
3664
3667
|
},
|
|
3665
3668
|
0x17 => { %ciCameraTemperature }, #PH
|
|
3666
3669
|
0x1b => { %ciMacroMagnification }, #PH
|
|
@@ -3721,6 +3724,7 @@ my %ciMaxFocal = (
|
|
|
3721
3724
|
SeparateTable => 1,
|
|
3722
3725
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3723
3726
|
PrintConv => \%canonLensTypes,
|
|
3727
|
+
PrintInt => 1,
|
|
3724
3728
|
},
|
|
3725
3729
|
0xa4 => { #PH
|
|
3726
3730
|
Name => 'FirmwareRevision',
|
|
@@ -3936,6 +3940,7 @@ my %ciMaxFocal = (
|
|
|
3936
3940
|
SeparateTable => 1,
|
|
3937
3941
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3938
3942
|
PrintConv => \%canonLensTypes,
|
|
3943
|
+
PrintInt => 1,
|
|
3939
3944
|
},
|
|
3940
3945
|
0xe8 => { %ciMinFocal },
|
|
3941
3946
|
0xea => { %ciMaxFocal,
|
|
@@ -4060,6 +4065,7 @@ my %ciMaxFocal = (
|
|
|
4060
4065
|
SeparateTable => 1,
|
|
4061
4066
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4062
4067
|
PrintConv => \%canonLensTypes,
|
|
4068
|
+
PrintInt => 1,
|
|
4063
4069
|
},
|
|
4064
4070
|
0x155 => { %ciMinFocal },
|
|
4065
4071
|
0x157 => { %ciMaxFocal,
|
|
@@ -4169,6 +4175,7 @@ my %ciMaxFocal = (
|
|
|
4169
4175
|
SeparateTable => 1,
|
|
4170
4176
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4171
4177
|
PrintConv => \%canonLensTypes,
|
|
4178
|
+
PrintInt => 1,
|
|
4172
4179
|
},
|
|
4173
4180
|
0x163 => { %ciMinFocal }, # (5DmkIII + 0x0e)
|
|
4174
4181
|
0x165 => { %ciMaxFocal }, # (5DmkIII + 0x0e)
|
|
@@ -4316,6 +4323,7 @@ my %ciMaxFocal = (
|
|
|
4316
4323
|
SeparateTable => 1,
|
|
4317
4324
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4318
4325
|
PrintConv => \%canonLensTypes,
|
|
4326
|
+
PrintInt => 1,
|
|
4319
4327
|
},
|
|
4320
4328
|
0x114 => { %ciMinFocal },
|
|
4321
4329
|
0x116 => { %ciMaxFocal },
|
|
@@ -4405,6 +4413,7 @@ my %ciMaxFocal = (
|
|
|
4405
4413
|
SeparateTable => 1,
|
|
4406
4414
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4407
4415
|
PrintConv => \%canonLensTypes,
|
|
4416
|
+
PrintInt => 1,
|
|
4408
4417
|
},
|
|
4409
4418
|
0xd8 => { %ciMinFocal }, #15
|
|
4410
4419
|
0xda => { %ciMaxFocal }, #15
|
|
@@ -4540,6 +4549,7 @@ my %ciMaxFocal = (
|
|
|
4540
4549
|
SeparateTable => 1,
|
|
4541
4550
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4542
4551
|
PrintConv => \%canonLensTypes,
|
|
4552
|
+
PrintInt => 1,
|
|
4543
4553
|
},
|
|
4544
4554
|
0xec => { %ciMinFocal },
|
|
4545
4555
|
0xee => { %ciMaxFocal,
|
|
@@ -4629,6 +4639,7 @@ my %ciMaxFocal = (
|
|
|
4629
4639
|
SeparateTable => 1,
|
|
4630
4640
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4631
4641
|
PrintConv => \%canonLensTypes,
|
|
4642
|
+
PrintInt => 1,
|
|
4632
4643
|
},
|
|
4633
4644
|
0xea => { %ciMinFocal },
|
|
4634
4645
|
0xec => { %ciMaxFocal },
|
|
@@ -4710,6 +4721,7 @@ my %ciMaxFocal = (
|
|
|
4710
4721
|
SeparateTable => 1,
|
|
4711
4722
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4712
4723
|
PrintConv => \%canonLensTypes,
|
|
4724
|
+
PrintInt => 1,
|
|
4713
4725
|
},
|
|
4714
4726
|
0x168 => { %ciMinFocal },
|
|
4715
4727
|
0x16a => { %ciMaxFocal },
|
|
@@ -4777,6 +4789,7 @@ my %ciMaxFocal = (
|
|
|
4777
4789
|
SeparateTable => 1,
|
|
4778
4790
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4779
4791
|
PrintConv => \%canonLensTypes,
|
|
4792
|
+
PrintInt => 1,
|
|
4780
4793
|
},
|
|
4781
4794
|
0x18b => { %ciMinFocal },
|
|
4782
4795
|
0x18d => { %ciMaxFocal },
|
|
@@ -4860,6 +4873,7 @@ my %ciMaxFocal = (
|
|
|
4860
4873
|
SeparateTable => 1,
|
|
4861
4874
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4862
4875
|
PrintConv => \%canonLensTypes,
|
|
4876
|
+
PrintInt => 1,
|
|
4863
4877
|
},
|
|
4864
4878
|
0x107 => { #PH
|
|
4865
4879
|
Name => 'FirmwareVersion',
|
|
@@ -4975,6 +4989,7 @@ my %ciMaxFocal = (
|
|
|
4975
4989
|
SeparateTable => 1,
|
|
4976
4990
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4977
4991
|
PrintConv => \%canonLensTypes,
|
|
4992
|
+
PrintInt => 1,
|
|
4978
4993
|
},
|
|
4979
4994
|
0xf8 => { %ciMinFocal },
|
|
4980
4995
|
0xfa => { %ciMaxFocal },
|
|
@@ -5070,6 +5085,7 @@ my %ciMaxFocal = (
|
|
|
5070
5085
|
SeparateTable => 1,
|
|
5071
5086
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5072
5087
|
PrintConv => \%canonLensTypes,
|
|
5088
|
+
PrintInt => 1,
|
|
5073
5089
|
},
|
|
5074
5090
|
0x101 => { %ciMinFocal }, # (500D + 9)
|
|
5075
5091
|
0x103 => { %ciMaxFocal }, # (500D + 9)
|
|
@@ -5165,6 +5181,7 @@ my %ciMaxFocal = (
|
|
|
5165
5181
|
SeparateTable => 1,
|
|
5166
5182
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5167
5183
|
PrintConv => \%canonLensTypes,
|
|
5184
|
+
PrintInt => 1,
|
|
5168
5185
|
},
|
|
5169
5186
|
0xec => { %ciMinFocal }, # (60D + 2)
|
|
5170
5187
|
0xee => { %ciMaxFocal }, # (60D + 2)
|
|
@@ -5247,6 +5264,7 @@ my %ciMaxFocal = (
|
|
|
5247
5264
|
SeparateTable => 1,
|
|
5248
5265
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5249
5266
|
PrintConv => \%canonLensTypes,
|
|
5267
|
+
PrintInt => 1,
|
|
5250
5268
|
},
|
|
5251
5269
|
0x129 => { %ciMinFocal },
|
|
5252
5270
|
0x12b => { %ciMaxFocal },
|
|
@@ -5359,6 +5377,7 @@ my %ciMaxFocal = (
|
|
|
5359
5377
|
SeparateTable => 1,
|
|
5360
5378
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5361
5379
|
PrintConv => \%canonLensTypes,
|
|
5380
|
+
PrintInt => 1,
|
|
5362
5381
|
},
|
|
5363
5382
|
0x186 => { %ciMinFocal },
|
|
5364
5383
|
0x188 => { %ciMaxFocal },
|
|
@@ -5433,6 +5452,7 @@ my %ciMaxFocal = (
|
|
|
5433
5452
|
SeparateTable => 1,
|
|
5434
5453
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5435
5454
|
PrintConv => \%canonLensTypes,
|
|
5455
|
+
PrintInt => 1,
|
|
5436
5456
|
},
|
|
5437
5457
|
0xe4 => { %ciMinFocal }, #PH
|
|
5438
5458
|
0xe6 => { %ciMaxFocal }, #PH
|
|
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
|
|
|
16
16
|
use Image::ExifTool::XMP;
|
|
17
17
|
use Image::ExifTool::GPS;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.08';
|
|
20
20
|
|
|
21
21
|
sub ProcessDJIInfo($$$);
|
|
22
22
|
|
|
@@ -96,6 +96,31 @@ my %convFloat2 = (
|
|
|
96
96
|
# (nothing yet decoded from device header)
|
|
97
97
|
);
|
|
98
98
|
|
|
99
|
+
# thermal parameters in APP4 of DJI M3T, H20N, M2EA and some M30T images (ref PH/forum11401)
|
|
100
|
+
%Image::ExifTool::DJI::ThermalParams2 = (
|
|
101
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
102
|
+
GROUPS => { 0 => 'APP4', 2 => 'Image' },
|
|
103
|
+
NOTES => 'Thermal parameters extracted from APP4 of DJI M3T RJPEG files.',
|
|
104
|
+
0x00 => { Name => 'AmbientTemperature', Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' }, # (NC)
|
|
105
|
+
0x04 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' },
|
|
106
|
+
0x08 => { Name => 'Emissivity', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
|
|
107
|
+
0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %%",$val*100)' },
|
|
108
|
+
0x10 => { Name => 'ReflectedTemperature',Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' },
|
|
109
|
+
0x65 => { Name => 'IDString', Format => 'string[16]' }, # (NC)
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
# thermal parameters in APP4 of some DJI M30T images (ref PH)
|
|
113
|
+
%Image::ExifTool::DJI::ThermalParams3 = (
|
|
114
|
+
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
115
|
+
GROUPS => { 0 => 'APP4', 2 => 'Image' },
|
|
116
|
+
NOTES => 'Thermal parameters extracted from APP4 of some DJI RJPEG files.',
|
|
117
|
+
# 0x00 - 0xaa553800 - params3 magic number
|
|
118
|
+
0x04 => { Name => 'RelativeHumidity', Format => 'int16u' },
|
|
119
|
+
0x06 => { Name => 'ObjectDistance', Format => 'int16u', ValueConv => '$val / 10' },
|
|
120
|
+
0x08 => { Name => 'Emissivity', Format => 'int16u', ValueConv => '$val / 100' },
|
|
121
|
+
0x0a => { Name => 'ReflectedTemperature',Format => 'int16u', ValueConv => '$val / 10' },
|
|
122
|
+
);
|
|
123
|
+
|
|
99
124
|
%Image::ExifTool::DJI::XMP = (
|
|
100
125
|
%Image::ExifTool::XMP::xmpTableDefaults,
|
|
101
126
|
GROUPS => { 0 => 'XMP', 1 => 'XMP-drone-dji', 2 => 'Location' },
|
|
@@ -161,7 +186,7 @@ my %convFloat2 = (
|
|
|
161
186
|
);
|
|
162
187
|
|
|
163
188
|
#------------------------------------------------------------------------------
|
|
164
|
-
# Process DJI
|
|
189
|
+
# Process DJI info (ref PH)
|
|
165
190
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
166
191
|
# Returns: 1 on success
|
|
167
192
|
sub ProcessDJIInfo($$$)
|
|
@@ -174,6 +199,7 @@ sub ProcessDJIInfo($$$)
|
|
|
174
199
|
my $buff = substr($$dataPt, $dirStart, $dirLen);
|
|
175
200
|
$dataPt = \$buff;
|
|
176
201
|
}
|
|
202
|
+
$et->VerboseDir('DJIInfo', undef, length $$dataPt);
|
|
177
203
|
while ($$dataPt =~ /\G\[(.*?)\](?=(\[|$))/sg) {
|
|
178
204
|
my ($tag, $val) = split /:/, $1, 2;
|
|
179
205
|
next unless defined $tag and defined $val;
|
|
@@ -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.44';
|
|
25
25
|
|
|
26
26
|
sub ProcessFPX($$);
|
|
27
27
|
sub ProcessFPXR($$$);
|
|
@@ -488,16 +488,27 @@ my %fpxFileType = (
|
|
|
488
488
|
IeImg => {
|
|
489
489
|
Name => 'EmbeddedImage',
|
|
490
490
|
Notes => q{
|
|
491
|
-
embedded images in Scene7 vignette VNT files.
|
|
492
|
-
|
|
493
|
-
corresponding EmbeddedImage via the family 3 group name
|
|
491
|
+
embedded images in Scene7 vignette VNT files. The EmbeddedImage Class and
|
|
492
|
+
Rectangle are also extracted for applicable images, and may be associated
|
|
493
|
+
with the corresponding EmbeddedImage via the family 3 group name
|
|
494
494
|
},
|
|
495
495
|
Groups => { 2 => 'Preview' },
|
|
496
496
|
Binary => 1,
|
|
497
497
|
},
|
|
498
|
-
|
|
498
|
+
IeImg_class => {
|
|
499
|
+
Name => 'EmbeddedImageClass',
|
|
500
|
+
Notes => q{
|
|
501
|
+
not a real tag. This information is extracted if available for the
|
|
502
|
+
corresponding EmbeddedImage from the Contents of a VNT file
|
|
503
|
+
},
|
|
504
|
+
# eg. "Cache", "Mask"
|
|
505
|
+
},
|
|
506
|
+
IeImg_rect => { #
|
|
499
507
|
Name => 'EmbeddedImageRectangle',
|
|
500
|
-
|
|
508
|
+
Notes => q{
|
|
509
|
+
not a real tag. This information is extracted if available for the
|
|
510
|
+
corresponding EmbeddedImage from the Contents of a VNT file
|
|
511
|
+
},
|
|
501
512
|
},
|
|
502
513
|
);
|
|
503
514
|
|
|
@@ -1577,13 +1588,16 @@ sub ProcessContents($$$)
|
|
|
1577
1588
|
pos($$dataPt) += $size;
|
|
1578
1589
|
}
|
|
1579
1590
|
$$et{IeImg_lkup} = { };
|
|
1580
|
-
|
|
1591
|
+
$$et{IeImg_class} = { };
|
|
1592
|
+
# - the byte before \x80 is 0x0d, 0x11 or 0x1f for separate images in my samples,
|
|
1581
1593
|
# and 0x1c or 0x23 for inline masks
|
|
1582
|
-
|
|
1583
|
-
|
|
1594
|
+
# - the byte after \xff\xff is 0x3b in my samples for $1 containing 'VnMask' or 'VnCache'
|
|
1595
|
+
while ($$dataPt =~ /\x0bTargetRole1(?:.\x80|\xff\xff.\0.\0Vn(\w+))\0\0\x01.{4}(.{24})/sg) {
|
|
1596
|
+
my ($index, @coords) = unpack('Vx4V4', $2);
|
|
1584
1597
|
next if $index == 0xffffffff;
|
|
1585
1598
|
$$et{IeImg_lkup}{$index} and $et->WarnOnce('Duplicate image index');
|
|
1586
1599
|
$$et{IeImg_lkup}{$index} = "@coords";
|
|
1600
|
+
$$et{IeImg_class}{$index} = $1 if $1;
|
|
1587
1601
|
}
|
|
1588
1602
|
}
|
|
1589
1603
|
}
|
|
@@ -2395,6 +2409,10 @@ sub ProcessFPX($$)
|
|
|
2395
2409
|
# save position of this image
|
|
2396
2410
|
$et->HandleTag($tagTablePtr, IeImg_rect => $$et{IeImg_lkup}{$num});
|
|
2397
2411
|
delete $$et{IeImg_lkup}{$num};
|
|
2412
|
+
if ($$et{IeImg_class} and $$et{IeImg_class}{$num}) {
|
|
2413
|
+
$et->HandleTag($tagTablePtr, IeImg_class => $$et{IeImg_class}{$num});
|
|
2414
|
+
delete $$et{IeImg_class}{$num};
|
|
2415
|
+
}
|
|
2398
2416
|
}
|
|
2399
2417
|
delete $$et{DOC_NUM};
|
|
2400
2418
|
} else {
|
|
@@ -2441,7 +2459,7 @@ sub ProcessFPX($$)
|
|
|
2441
2459
|
}
|
|
2442
2460
|
$$et{INDENT} = $oldIndent if $verbose;
|
|
2443
2461
|
# try to better identify the file type
|
|
2444
|
-
if ($$et{
|
|
2462
|
+
if ($$et{FileType} eq 'FPX') {
|
|
2445
2463
|
my $val = $$et{CompObjUserType} || $$et{Software};
|
|
2446
2464
|
if ($val) {
|
|
2447
2465
|
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',
|
|
@@ -13,7 +13,7 @@ use vars qw($VERSION);
|
|
|
13
13
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
14
14
|
use Image::ExifTool::XMP;
|
|
15
15
|
|
|
16
|
-
$VERSION = '1.
|
|
16
|
+
$VERSION = '1.01';
|
|
17
17
|
|
|
18
18
|
%Image::ExifTool::LIF::Main = (
|
|
19
19
|
GROUPS => { 0 => 'XML', 1 => 'XML', 2 => 'Image' },
|
|
@@ -30,7 +30,15 @@ $VERSION = '1.00';
|
|
|
30
30
|
my $unixTimeZero = 134774 * 24 * 3600;
|
|
31
31
|
my @vals = split ' ', $val;
|
|
32
32
|
foreach (@vals) {
|
|
33
|
-
|
|
33
|
+
if (/[^0-9a-f]/i) {
|
|
34
|
+
$_ = '0000:00:00 00:00:00';
|
|
35
|
+
} elsif (length $_ > 8) {
|
|
36
|
+
my $lo = hex substr($_, -8);
|
|
37
|
+
my $hi = hex substr($_, 0, -8);
|
|
38
|
+
$_ = 1e-7 * ($hi * 4294967296 + $lo);
|
|
39
|
+
} else {
|
|
40
|
+
$_ = 1e-7 * hex($_);
|
|
41
|
+
}
|
|
34
42
|
# shift from Jan 1, 1601 to Jan 1, 1970
|
|
35
43
|
$_ = Image::ExifTool::ConvertUnixTime($_ - $unixTimeZero);
|
|
36
44
|
}
|
|
@@ -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',
|