exiftool-vendored.pl 12.55.0 → 12.60.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.
- package/bin/Changes +97 -4
- package/bin/MANIFEST +9 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +19 -19
- package/bin/arg_files/xmp2exif.args +4 -1
- package/bin/config_files/example.config +1 -0
- package/bin/config_files/rotate_regions.config +1 -1
- package/bin/exiftool +197 -122
- package/bin/fmt_files/kml.fmt +3 -0
- package/bin/fmt_files/kml_track.fmt +3 -0
- package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- package/bin/lib/Image/ExifTool/APE.pm +2 -2
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +25 -19
- package/bin/lib/Image/ExifTool/Canon.pm +33 -7
- package/bin/lib/Image/ExifTool/CanonRaw.pm +5 -1
- package/bin/lib/Image/ExifTool/DJI.pm +28 -2
- package/bin/lib/Image/ExifTool/Exif.pm +107 -20
- package/bin/lib/Image/ExifTool/FlashPix.pm +92 -9
- package/bin/lib/Image/ExifTool/FujiFilm.pm +9 -4
- package/bin/lib/Image/ExifTool/GPS.pm +7 -2
- package/bin/lib/Image/ExifTool/Geotag.pm +30 -7
- package/bin/lib/Image/ExifTool/InfiRay.pm +227 -0
- package/bin/lib/Image/ExifTool/JPEG.pm +53 -7
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
- package/bin/lib/Image/ExifTool/LIF.pm +10 -2
- package/bin/lib/Image/ExifTool/LNK.pm +5 -4
- package/bin/lib/Image/ExifTool/MIE.pm +3 -3
- package/bin/lib/Image/ExifTool/MPEG.pm +2 -2
- package/bin/lib/Image/ExifTool/MakerNotes.pm +3 -2
- package/bin/lib/Image/ExifTool/Minolta.pm +6 -7
- package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
- package/bin/lib/Image/ExifTool/Nikon.pm +1199 -1325
- package/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
- package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- package/bin/lib/Image/ExifTool/Olympus.pm +88 -6
- package/bin/lib/Image/ExifTool/OpenEXR.pm +32 -15
- package/bin/lib/Image/ExifTool/PNG.pm +89 -3
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +8 -5
- package/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
- package/bin/lib/Image/ExifTool/Photoshop.pm +38 -7
- package/bin/lib/Image/ExifTool/QuickTime.pm +44 -13
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +63 -20
- package/bin/lib/Image/ExifTool/README +19 -2
- package/bin/lib/Image/ExifTool/RIFF.pm +34 -13
- package/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
- package/bin/lib/Image/ExifTool/Real.pm +2 -2
- package/bin/lib/Image/ExifTool/Ricoh.pm +2 -1
- package/bin/lib/Image/ExifTool/Sigma.pm +5 -4
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +9 -3
- package/bin/lib/Image/ExifTool/Sony.pm +28 -1
- package/bin/lib/Image/ExifTool/TagLookup.pm +4691 -4624
- package/bin/lib/Image/ExifTool/TagNames.pod +511 -117
- package/bin/lib/Image/ExifTool/VCard.pm +19 -5
- package/bin/lib/Image/ExifTool/Validate.pm +5 -5
- package/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
- package/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- package/bin/lib/Image/ExifTool/Writer.pl +150 -36
- package/bin/lib/Image/ExifTool/XMP.pm +19 -4
- package/bin/lib/Image/ExifTool/XMP2.pl +2 -1
- package/bin/lib/Image/ExifTool.pm +248 -54
- package/bin/lib/Image/ExifTool.pod +94 -58
- package/bin/perl-Image-ExifTool.spec +18 -18
- package/bin/pp_build_exe.args +7 -6
- package/package.json +3 -3
package/bin/fmt_files/kml.fmt
CHANGED
|
@@ -24,6 +24,9 @@
|
|
|
24
24
|
# extension is used.
|
|
25
25
|
# 5) The -fileOrder option may be used to control the order of the
|
|
26
26
|
# generated placemarks when processing multiple files.
|
|
27
|
+
# 6) The "0" in the coordinates line may be changed to "$gpsaltitude#"
|
|
28
|
+
# and the altitudeMode may be changed to "absolute" to store
|
|
29
|
+
# altitude information if it exists in the track log.
|
|
27
30
|
#------------------------------------------------------------------------------
|
|
28
31
|
#[HEAD]<?xml version="1.0" encoding="UTF-8"?>
|
|
29
32
|
#[HEAD]<kml xmlns="http://earth.google.com/kml/2.0">
|
|
@@ -21,6 +21,9 @@
|
|
|
21
21
|
# 2) The -fileOrder option may be used to control the order of the
|
|
22
22
|
# waypoints when processing multiple still-image files, or the
|
|
23
23
|
# order of the tracks when processing multiple video files.
|
|
24
|
+
# 3) The "0" in the BODY line below may be changed to "$gpsaltitude#"
|
|
25
|
+
# and the altitudeMode may be changed to "absolute" to store
|
|
26
|
+
# altitude information if it exists in the track log.
|
|
24
27
|
#------------------------------------------------------------------------------
|
|
25
28
|
#[HEAD]<?xml version="1.0" encoding="UTF-8"?>
|
|
26
29
|
#[HEAD]<kml xmlns="http://earth.google.com/kml/2.0">
|
|
@@ -18,7 +18,7 @@ use vars qw($VERSION);
|
|
|
18
18
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
19
19
|
use Image::ExifTool::ID3;
|
|
20
20
|
|
|
21
|
-
$VERSION = '1.
|
|
21
|
+
$VERSION = '1.12';
|
|
22
22
|
|
|
23
23
|
# information for time/date-based tags (time zero is Jan 1, 1904)
|
|
24
24
|
my %timeInfo = (
|
|
@@ -203,7 +203,7 @@ sub ProcessAIFF($$)
|
|
|
203
203
|
return 1 if $fast3;
|
|
204
204
|
$tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main');
|
|
205
205
|
# modify FileType to indicate a multi-page document
|
|
206
|
-
$$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM';
|
|
206
|
+
$$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM' and $$et{VALUE}{FileType};
|
|
207
207
|
$type = 'DjVu';
|
|
208
208
|
} else {
|
|
209
209
|
return 0 unless $buff =~ /^FORM....(AIF(F|C))/s;
|
|
@@ -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.07';
|
|
19
19
|
|
|
20
20
|
# APE metadata blocks
|
|
21
21
|
%Image::ExifTool::APE::Main = (
|
|
@@ -133,7 +133,7 @@ sub ProcessAPE($$)
|
|
|
133
133
|
|
|
134
134
|
# check APE signature and process audio information
|
|
135
135
|
# unless this is some other type of file
|
|
136
|
-
unless ($$et{
|
|
136
|
+
unless ($$et{FileType}) {
|
|
137
137
|
$raf->Read($buff, 32) == 32 or return 0;
|
|
138
138
|
$buff =~ /^(MAC |APETAGEX)/ or return 0;
|
|
139
139
|
$et->SetFileType();
|
|
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
|
|
|
35
35
|
use Image::ExifTool::Validate;
|
|
36
36
|
use Image::ExifTool::MacOS;
|
|
37
37
|
|
|
38
|
-
$VERSION = '3.
|
|
38
|
+
$VERSION = '3.52';
|
|
39
39
|
@ISA = qw(Exporter);
|
|
40
40
|
|
|
41
41
|
sub NumbersFirst($$);
|
|
@@ -184,7 +184,8 @@ gives the order of values for a serial data stream.
|
|
|
184
184
|
A B<Tag Name> is the handle by which the information is accessed in
|
|
185
185
|
ExifTool. In some instances, more than one name may correspond to a single
|
|
186
186
|
tag ID. In these cases, the actual name used depends on the context in
|
|
187
|
-
which the information is found.
|
|
187
|
+
which the information is found. Valid characters in a tag name are A-Z,
|
|
188
|
+
a-z, 0-9, hyphen (-) and underline (_). Case is not significant. A
|
|
188
189
|
question mark (C<?>) after a tag name indicates that the information is
|
|
189
190
|
either not understood, not verified, or not very useful -- these tags are
|
|
190
191
|
not extracted by ExifTool unless the L<Unknown|../ExifTool.html#Unknown> (-u) option is enabled. Be
|
|
@@ -314,10 +315,12 @@ C<integer> is a string of digits (possibly beginning with a '+' or '-'),
|
|
|
314
315
|
C<real> is a floating point number, C<rational> is entered as a floating
|
|
315
316
|
point number but stored as two C<integer> strings separated by a '/'
|
|
316
317
|
character, C<date> is a date/time string entered in the format "YYYY:mm:dd
|
|
317
|
-
HH:MM:SS[.ss][+/-HH:MM]"
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
318
|
+
HH:MM:SS[.ss][+/-HH:MM]" but some partial date/time formats are also
|
|
319
|
+
accepted (see L<https://exiftool.org/faq.html#Q5>), C<boolean> is either
|
|
320
|
+
"True" or "False" (but "true" and "false" may be written as a ValueConv
|
|
321
|
+
value for compatibility with non-conforming applications), C<struct>
|
|
322
|
+
indicates a structured tag, and C<lang-alt> is a tag that supports alternate
|
|
323
|
+
languages.
|
|
321
324
|
|
|
322
325
|
When reading, C<struct> tags are extracted only if the L<Struct|../ExifTool.html#Struct> (-struct)
|
|
323
326
|
option is used. Otherwise the corresponding I<Flattened> tags, indicated by
|
|
@@ -443,6 +446,11 @@ QuickTime-based files; it extracts other track-specific and timed metadata,
|
|
|
443
446
|
but can not yet edit tags in these locations (with the exception of
|
|
444
447
|
track-level date/time tags).
|
|
445
448
|
|
|
449
|
+
Beware that the Keys tags are actually stored inside the ItemList in the
|
|
450
|
+
file, so deleting the ItemList group as a block (ie. C<-ItemList:all=>) also
|
|
451
|
+
deletes Keys tags. Instead, to preserve Keys tags the ItemList tags may be
|
|
452
|
+
deleted individually with C<-QuickTime:ItemList:all=>.
|
|
453
|
+
|
|
446
454
|
Alternate language tags may be accessed for
|
|
447
455
|
L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and
|
|
448
456
|
L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags> tags by adding
|
|
@@ -1049,7 +1057,7 @@ TagID: foreach $tagID (@keys) {
|
|
|
1049
1057
|
if ($$tagInfo{SubIFD}) {
|
|
1050
1058
|
warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub;
|
|
1051
1059
|
} else {
|
|
1052
|
-
warn "Warning: SubIFD flag not set for $short $name\n" if $isSub;
|
|
1060
|
+
warn "Warning: SubIFD flag not set for $short $name\n" if $isSub and not $processBinaryData;
|
|
1053
1061
|
}
|
|
1054
1062
|
if ($$tagInfo{Notes}) {
|
|
1055
1063
|
my $note = $$tagInfo{Notes};
|
|
@@ -1199,6 +1207,7 @@ TagID: foreach $tagID (@keys) {
|
|
|
1199
1207
|
$sepTable{$s} = $printConv;
|
|
1200
1208
|
# add PrintHex flag to PrintConv so we can check it later
|
|
1201
1209
|
$$printConv{PrintHex} = 1 if $$tagInfo{PrintHex};
|
|
1210
|
+
$$printConv{PrintInt} = 1 if $$tagInfo{PrintInt};
|
|
1202
1211
|
$$printConv{PrintString} = 1 if $$tagInfo{PrintString};
|
|
1203
1212
|
} else {
|
|
1204
1213
|
$caseInsensitive = 0;
|
|
@@ -1214,22 +1223,18 @@ TagID: foreach $tagID (@keys) {
|
|
|
1214
1223
|
next if $_ eq '' and $$printConv{$_} eq '';
|
|
1215
1224
|
$_ eq 'BITMASK' and $bits = $$printConv{$_}, next;
|
|
1216
1225
|
$_ eq 'OTHER' and next;
|
|
1217
|
-
my $index;
|
|
1218
|
-
if
|
|
1226
|
+
my $index = $_;
|
|
1227
|
+
$index =~ s/\.\d+$// if $$tagInfo{PrintInt};
|
|
1228
|
+
if (($$tagInfo{PrintHex} or $$printConv{BITMASK}) and $index =~ /^-?\d+$/) {
|
|
1219
1229
|
my $dig = $$tagInfo{PrintHex} || 1;
|
|
1220
|
-
if ($
|
|
1221
|
-
$index = sprintf('0x%.*x', $dig, $
|
|
1230
|
+
if ($index >= 0) {
|
|
1231
|
+
$index = sprintf('0x%.*x', $dig, $index);
|
|
1222
1232
|
} elsif ($format and $format =~ /int(16|32)/) {
|
|
1223
1233
|
# mask off unused bits of signed integer hex value
|
|
1224
1234
|
my $mask = { 16 => 0xffff, 32 => 0xffffffff }->{$1};
|
|
1225
|
-
$index = sprintf('0x%.*x', $dig, $
|
|
1226
|
-
} else {
|
|
1227
|
-
$index = $_;
|
|
1235
|
+
$index = sprintf('0x%.*x', $dig, $index & $mask);
|
|
1228
1236
|
}
|
|
1229
|
-
} elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/
|
|
1230
|
-
$index = $_;
|
|
1231
|
-
} else {
|
|
1232
|
-
$index = $_;
|
|
1237
|
+
} elsif ($$tagInfo{PrintString} or not /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/) {
|
|
1233
1238
|
# translate unprintable values
|
|
1234
1239
|
if ($index =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg) {
|
|
1235
1240
|
$index = qq{"$index"};
|
|
@@ -2203,7 +2208,7 @@ sub WriteTagNames($$)
|
|
|
2203
2208
|
my $wid = 0;
|
|
2204
2209
|
my @keys;
|
|
2205
2210
|
foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
|
|
2206
|
-
next if /^(Notes|PrintHex|PrintString|OTHER)$/;
|
|
2211
|
+
next if /^(Notes|PrintHex|PrintInt|PrintString|OTHER)$/;
|
|
2207
2212
|
$align = '' if $align and /[^\d]/;
|
|
2208
2213
|
my $w = length($_) + length($$printConv{$_});
|
|
2209
2214
|
$wid = $w if $wid < $w;
|
|
@@ -2231,6 +2236,7 @@ sub WriteTagNames($$)
|
|
|
2231
2236
|
if (defined $key) {
|
|
2232
2237
|
$index = $key;
|
|
2233
2238
|
$prt = '= ' . EscapeHTML($$printConv{$key});
|
|
2239
|
+
$index =~ s/\.\d+$// if $$printConv{PrintInt};
|
|
2234
2240
|
if ($$printConv{PrintHex}) {
|
|
2235
2241
|
$index =~ s/(\.\d+)$//; # remove decimal
|
|
2236
2242
|
$index = sprintf('0x%x',$index);
|
|
@@ -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',
|
|
@@ -621,8 +616,10 @@ $VERSION = '4.64';
|
|
|
621
616
|
'61182.41' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
|
|
622
617
|
'61182.42' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
|
|
623
618
|
'61182.43' => 'Canon RF 135mm F1.8 L IS USM', #42
|
|
619
|
+
'61182.44' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
|
|
620
|
+
'61182.45' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
|
|
624
621
|
# we need the RFLensType values for the following...
|
|
625
|
-
'61182.
|
|
622
|
+
'61182.46' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
|
|
626
623
|
65535 => 'n/a',
|
|
627
624
|
);
|
|
628
625
|
|
|
@@ -983,7 +980,9 @@ $VERSION = '4.64';
|
|
|
983
980
|
0x80000465 => 'EOS R10', #42
|
|
984
981
|
0x80000467 => 'PowerShot ZOOM',
|
|
985
982
|
0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
|
|
983
|
+
0x80000480 => 'EOS R50', #42
|
|
986
984
|
0x80000481 => 'EOS R6 Mark II', #42
|
|
985
|
+
0x80000487 => 'EOS R8', #42
|
|
987
986
|
0x80000520 => 'EOS D2000C', #IB
|
|
988
987
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
989
988
|
);
|
|
@@ -2398,6 +2397,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
2398
2397
|
DataMember => 'LensType',
|
|
2399
2398
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
2400
2399
|
PrintConv => \%canonLensTypes,
|
|
2400
|
+
PrintInt => 1,
|
|
2401
2401
|
},
|
|
2402
2402
|
23 => {
|
|
2403
2403
|
Name => 'MaxFocalLength',
|
|
@@ -3056,6 +3056,7 @@ my %ciMaxFocal = (
|
|
|
3056
3056
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3057
3057
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3058
3058
|
PrintConv => \%canonLensTypes,
|
|
3059
|
+
PrintInt => 1,
|
|
3059
3060
|
},
|
|
3060
3061
|
0x0e => {
|
|
3061
3062
|
Name => 'MinFocalLength',
|
|
@@ -3171,6 +3172,7 @@ my %ciMaxFocal = (
|
|
|
3171
3172
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3172
3173
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3173
3174
|
PrintConv => \%canonLensTypes,
|
|
3175
|
+
PrintInt => 1,
|
|
3174
3176
|
},
|
|
3175
3177
|
0x11 => { %ciMinFocal }, #9
|
|
3176
3178
|
0x13 => { %ciMaxFocal }, #9
|
|
@@ -3248,6 +3250,7 @@ my %ciMaxFocal = (
|
|
|
3248
3250
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3249
3251
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3250
3252
|
PrintConv => \%canonLensTypes,
|
|
3253
|
+
PrintInt => 1,
|
|
3251
3254
|
},
|
|
3252
3255
|
0x11 => { %ciMinFocal },
|
|
3253
3256
|
0x13 => { %ciMaxFocal },
|
|
@@ -3343,6 +3346,7 @@ my %ciMaxFocal = (
|
|
|
3343
3346
|
SeparateTable => 1,
|
|
3344
3347
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3345
3348
|
PrintConv => \%canonLensTypes,
|
|
3349
|
+
PrintInt => 1,
|
|
3346
3350
|
},
|
|
3347
3351
|
0x113 => { %ciMinFocal },
|
|
3348
3352
|
0x115 => { %ciMaxFocal },
|
|
@@ -3498,6 +3502,7 @@ my %ciMaxFocal = (
|
|
|
3498
3502
|
SeparateTable => 1,
|
|
3499
3503
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3500
3504
|
PrintConv => \%canonLensTypes,
|
|
3505
|
+
PrintInt => 1,
|
|
3501
3506
|
},
|
|
3502
3507
|
0x151 => { %ciMinFocal },
|
|
3503
3508
|
0x153 => { %ciMaxFocal,
|
|
@@ -3606,6 +3611,7 @@ my %ciMaxFocal = (
|
|
|
3606
3611
|
SeparateTable => 1,
|
|
3607
3612
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3608
3613
|
PrintConv => \%canonLensTypes,
|
|
3614
|
+
PrintInt => 1,
|
|
3609
3615
|
},
|
|
3610
3616
|
0x1a9 => { %ciMinFocal },
|
|
3611
3617
|
0x1ab => { %ciMaxFocal,
|
|
@@ -3657,6 +3663,7 @@ my %ciMaxFocal = (
|
|
|
3657
3663
|
RawConv => '$val ? $val : undef', # don't use if value is zero
|
|
3658
3664
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3659
3665
|
PrintConv => \%canonLensTypes,
|
|
3666
|
+
PrintInt => 1,
|
|
3660
3667
|
},
|
|
3661
3668
|
0x17 => { %ciCameraTemperature }, #PH
|
|
3662
3669
|
0x1b => { %ciMacroMagnification }, #PH
|
|
@@ -3717,6 +3724,7 @@ my %ciMaxFocal = (
|
|
|
3717
3724
|
SeparateTable => 1,
|
|
3718
3725
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3719
3726
|
PrintConv => \%canonLensTypes,
|
|
3727
|
+
PrintInt => 1,
|
|
3720
3728
|
},
|
|
3721
3729
|
0xa4 => { #PH
|
|
3722
3730
|
Name => 'FirmwareRevision',
|
|
@@ -3932,6 +3940,7 @@ my %ciMaxFocal = (
|
|
|
3932
3940
|
SeparateTable => 1,
|
|
3933
3941
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
3934
3942
|
PrintConv => \%canonLensTypes,
|
|
3943
|
+
PrintInt => 1,
|
|
3935
3944
|
},
|
|
3936
3945
|
0xe8 => { %ciMinFocal },
|
|
3937
3946
|
0xea => { %ciMaxFocal,
|
|
@@ -4056,6 +4065,7 @@ my %ciMaxFocal = (
|
|
|
4056
4065
|
SeparateTable => 1,
|
|
4057
4066
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4058
4067
|
PrintConv => \%canonLensTypes,
|
|
4068
|
+
PrintInt => 1,
|
|
4059
4069
|
},
|
|
4060
4070
|
0x155 => { %ciMinFocal },
|
|
4061
4071
|
0x157 => { %ciMaxFocal,
|
|
@@ -4165,6 +4175,7 @@ my %ciMaxFocal = (
|
|
|
4165
4175
|
SeparateTable => 1,
|
|
4166
4176
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4167
4177
|
PrintConv => \%canonLensTypes,
|
|
4178
|
+
PrintInt => 1,
|
|
4168
4179
|
},
|
|
4169
4180
|
0x163 => { %ciMinFocal }, # (5DmkIII + 0x0e)
|
|
4170
4181
|
0x165 => { %ciMaxFocal }, # (5DmkIII + 0x0e)
|
|
@@ -4312,6 +4323,7 @@ my %ciMaxFocal = (
|
|
|
4312
4323
|
SeparateTable => 1,
|
|
4313
4324
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4314
4325
|
PrintConv => \%canonLensTypes,
|
|
4326
|
+
PrintInt => 1,
|
|
4315
4327
|
},
|
|
4316
4328
|
0x114 => { %ciMinFocal },
|
|
4317
4329
|
0x116 => { %ciMaxFocal },
|
|
@@ -4401,6 +4413,7 @@ my %ciMaxFocal = (
|
|
|
4401
4413
|
SeparateTable => 1,
|
|
4402
4414
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4403
4415
|
PrintConv => \%canonLensTypes,
|
|
4416
|
+
PrintInt => 1,
|
|
4404
4417
|
},
|
|
4405
4418
|
0xd8 => { %ciMinFocal }, #15
|
|
4406
4419
|
0xda => { %ciMaxFocal }, #15
|
|
@@ -4536,6 +4549,7 @@ my %ciMaxFocal = (
|
|
|
4536
4549
|
SeparateTable => 1,
|
|
4537
4550
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4538
4551
|
PrintConv => \%canonLensTypes,
|
|
4552
|
+
PrintInt => 1,
|
|
4539
4553
|
},
|
|
4540
4554
|
0xec => { %ciMinFocal },
|
|
4541
4555
|
0xee => { %ciMaxFocal,
|
|
@@ -4625,6 +4639,7 @@ my %ciMaxFocal = (
|
|
|
4625
4639
|
SeparateTable => 1,
|
|
4626
4640
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4627
4641
|
PrintConv => \%canonLensTypes,
|
|
4642
|
+
PrintInt => 1,
|
|
4628
4643
|
},
|
|
4629
4644
|
0xea => { %ciMinFocal },
|
|
4630
4645
|
0xec => { %ciMaxFocal },
|
|
@@ -4706,6 +4721,7 @@ my %ciMaxFocal = (
|
|
|
4706
4721
|
SeparateTable => 1,
|
|
4707
4722
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4708
4723
|
PrintConv => \%canonLensTypes,
|
|
4724
|
+
PrintInt => 1,
|
|
4709
4725
|
},
|
|
4710
4726
|
0x168 => { %ciMinFocal },
|
|
4711
4727
|
0x16a => { %ciMaxFocal },
|
|
@@ -4773,6 +4789,7 @@ my %ciMaxFocal = (
|
|
|
4773
4789
|
SeparateTable => 1,
|
|
4774
4790
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4775
4791
|
PrintConv => \%canonLensTypes,
|
|
4792
|
+
PrintInt => 1,
|
|
4776
4793
|
},
|
|
4777
4794
|
0x18b => { %ciMinFocal },
|
|
4778
4795
|
0x18d => { %ciMaxFocal },
|
|
@@ -4856,6 +4873,7 @@ my %ciMaxFocal = (
|
|
|
4856
4873
|
SeparateTable => 1,
|
|
4857
4874
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4858
4875
|
PrintConv => \%canonLensTypes,
|
|
4876
|
+
PrintInt => 1,
|
|
4859
4877
|
},
|
|
4860
4878
|
0x107 => { #PH
|
|
4861
4879
|
Name => 'FirmwareVersion',
|
|
@@ -4971,6 +4989,7 @@ my %ciMaxFocal = (
|
|
|
4971
4989
|
SeparateTable => 1,
|
|
4972
4990
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
4973
4991
|
PrintConv => \%canonLensTypes,
|
|
4992
|
+
PrintInt => 1,
|
|
4974
4993
|
},
|
|
4975
4994
|
0xf8 => { %ciMinFocal },
|
|
4976
4995
|
0xfa => { %ciMaxFocal },
|
|
@@ -5066,6 +5085,7 @@ my %ciMaxFocal = (
|
|
|
5066
5085
|
SeparateTable => 1,
|
|
5067
5086
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5068
5087
|
PrintConv => \%canonLensTypes,
|
|
5088
|
+
PrintInt => 1,
|
|
5069
5089
|
},
|
|
5070
5090
|
0x101 => { %ciMinFocal }, # (500D + 9)
|
|
5071
5091
|
0x103 => { %ciMaxFocal }, # (500D + 9)
|
|
@@ -5161,6 +5181,7 @@ my %ciMaxFocal = (
|
|
|
5161
5181
|
SeparateTable => 1,
|
|
5162
5182
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5163
5183
|
PrintConv => \%canonLensTypes,
|
|
5184
|
+
PrintInt => 1,
|
|
5164
5185
|
},
|
|
5165
5186
|
0xec => { %ciMinFocal }, # (60D + 2)
|
|
5166
5187
|
0xee => { %ciMaxFocal }, # (60D + 2)
|
|
@@ -5243,6 +5264,7 @@ my %ciMaxFocal = (
|
|
|
5243
5264
|
SeparateTable => 1,
|
|
5244
5265
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5245
5266
|
PrintConv => \%canonLensTypes,
|
|
5267
|
+
PrintInt => 1,
|
|
5246
5268
|
},
|
|
5247
5269
|
0x129 => { %ciMinFocal },
|
|
5248
5270
|
0x12b => { %ciMaxFocal },
|
|
@@ -5355,6 +5377,7 @@ my %ciMaxFocal = (
|
|
|
5355
5377
|
SeparateTable => 1,
|
|
5356
5378
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5357
5379
|
PrintConv => \%canonLensTypes,
|
|
5380
|
+
PrintInt => 1,
|
|
5358
5381
|
},
|
|
5359
5382
|
0x186 => { %ciMinFocal },
|
|
5360
5383
|
0x188 => { %ciMaxFocal },
|
|
@@ -5429,6 +5452,7 @@ my %ciMaxFocal = (
|
|
|
5429
5452
|
SeparateTable => 1,
|
|
5430
5453
|
ValueConvInv => 'int($val)', # (must truncate decimal part)
|
|
5431
5454
|
PrintConv => \%canonLensTypes,
|
|
5455
|
+
PrintInt => 1,
|
|
5432
5456
|
},
|
|
5433
5457
|
0xe4 => { %ciMinFocal }, #PH
|
|
5434
5458
|
0xe6 => { %ciMaxFocal }, #PH
|
|
@@ -6840,6 +6864,8 @@ my %ciMaxFocal = (
|
|
|
6840
6864
|
300 => 'Canon RF 1200mm F8L IS USM + RF2x', #42
|
|
6841
6865
|
302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
|
|
6842
6866
|
303 => 'Canon RF 135mm F1.8 L IS USM', #42
|
|
6867
|
+
304 => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
|
|
6868
|
+
305 => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
|
|
6843
6869
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6844
6870
|
},
|
|
6845
6871
|
},
|
|
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
21
21
|
use Image::ExifTool::Exif;
|
|
22
22
|
use Image::ExifTool::Canon;
|
|
23
23
|
|
|
24
|
-
$VERSION = '1.
|
|
24
|
+
$VERSION = '1.60';
|
|
25
25
|
|
|
26
26
|
sub WriteCRW($$);
|
|
27
27
|
sub ProcessCanonRaw($$$);
|
|
@@ -698,6 +698,10 @@ sub ProcessCanonRaw($$$)
|
|
|
698
698
|
$format ne 'string' and not $subdir;
|
|
699
699
|
} else {
|
|
700
700
|
$valueDataPos = $ptr;
|
|
701
|
+
# do MD5 of image data if requested
|
|
702
|
+
if ($$et{ImageDataMD5} and $tagID == 0x2005) {
|
|
703
|
+
$raf->Seek($ptr, 0) and $et->ImageDataMD5($raf, $size, 'raw');
|
|
704
|
+
}
|
|
701
705
|
if ($size <= 512 or ($verbose > 2 and $size <= 65536)
|
|
702
706
|
or ($tagInfo and ($$tagInfo{SubDirectory}
|
|
703
707
|
or grep(/^$$tagInfo{Name}$/i, $et->GetRequestedTags()) )))
|
|
@@ -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;
|