exiftool_vendored 13.27.0 → 13.30.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 +52 -1
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/arg_files/exif2xmp.args +2 -1
- data/bin/arg_files/xmp2exif.args +2 -1
- data/bin/config_files/pix4d.config +9 -8
- data/bin/exiftool +16 -13
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +1 -1
- data/bin/lib/Image/ExifTool/Canon.pm +4 -2
- data/bin/lib/Image/ExifTool/Exif.pm +3 -1
- data/bin/lib/Image/ExifTool/FujiFilm.pm +2 -1
- data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- data/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- data/bin/lib/Image/ExifTool/JPEG.pm +20 -8
- data/bin/lib/Image/ExifTool/LigoGPS.pm +16 -2
- data/bin/lib/Image/ExifTool/MPF.pm +5 -1
- data/bin/lib/Image/ExifTool/MakerNotes.pm +3 -3
- data/bin/lib/Image/ExifTool/Olympus.pm +6 -2
- data/bin/lib/Image/ExifTool/Panasonic.pm +9 -1
- data/bin/lib/Image/ExifTool/Parrot.pm +54 -7
- data/bin/lib/Image/ExifTool/Pentax.pm +122 -31
- data/bin/lib/Image/ExifTool/Plot.pm +36 -15
- data/bin/lib/Image/ExifTool/QuickTime.pm +72 -5
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -6
- data/bin/lib/Image/ExifTool/README +5 -0
- data/bin/lib/Image/ExifTool/Sigma.pm +12 -4
- data/bin/lib/Image/ExifTool/Sony.pm +8 -3
- data/bin/lib/Image/ExifTool/TagLookup.pm +3743 -3730
- data/bin/lib/Image/ExifTool/TagNames.pod +51 -8
- data/bin/lib/Image/ExifTool/WriteExif.pl +2 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +2 -0
- data/bin/lib/Image/ExifTool/Writer.pl +18 -7
- data/bin/lib/Image/ExifTool/XMP.pm +2 -2
- data/bin/lib/Image/ExifTool.pm +6 -5
- data/bin/lib/Image/ExifTool.pod +11 -11
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
@@ -58,7 +58,7 @@ use Image::ExifTool::Exif;
|
|
58
58
|
use Image::ExifTool::GPS;
|
59
59
|
use Image::ExifTool::HP;
|
60
60
|
|
61
|
-
$VERSION = '3.
|
61
|
+
$VERSION = '3.51';
|
62
62
|
|
63
63
|
sub CryptShutterCount($$);
|
64
64
|
sub PrintFilter($$$);
|
@@ -737,18 +737,17 @@ my %filterSettings = (
|
|
737
737
|
52 => ['Toning2', '%+d'], #31 Extract Color (-3-+3)
|
738
738
|
);
|
739
739
|
|
740
|
-
# order of K-3iii AF points
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
#
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
}
|
740
|
+
# order of selectable K-3iii AF points. The array looks like this:
|
741
|
+
# B1 C1 E1 G1 I1 K1 L1
|
742
|
+
# A3 B3 C3 E3 G3 I3 K3 L3 M3
|
743
|
+
# A5 B5 C5 E5 G5 I5 K5 L5 M5
|
744
|
+
# A7 B7 C7 E7 G7 I7 K7 L7 M7
|
745
|
+
# B9 C9 E9 G9 I9 K9 L9
|
746
|
+
my @k3iiiAF = qw(
|
747
|
+
C1 E1 G1 I1 K1 C3 E3 G3 I3 K3 C5 E5 G5
|
748
|
+
I5 K5 C7 E7 G7 I7 K7 C9 E9 G9 I9 K9 A5 M5 B3
|
749
|
+
L3 B5 L5 B7 L7 B1 L1 B9 L9 A3 M3 A7 M7
|
750
|
+
);
|
752
751
|
|
753
752
|
# decoding for Pentax Firmware ID tags - PH
|
754
753
|
my %pentaxFirmwareID = (
|
@@ -1264,7 +1263,7 @@ my %binaryDataAttrs = (
|
|
1264
1263
|
}],
|
1265
1264
|
},{
|
1266
1265
|
Name => 'AFPointSelected',
|
1267
|
-
Condition => '$$self{Model} =~ /K-3\b/',
|
1266
|
+
Condition => '$$self{Model} =~ /(K-3|KP)\b/',
|
1268
1267
|
Writable => 'int16u',
|
1269
1268
|
Notes => 'K-3',
|
1270
1269
|
PrintConvColumns => 2,
|
@@ -1957,6 +1956,7 @@ my %binaryDataAttrs = (
|
|
1957
1956
|
'18 3' => 'Auto Program (MTF)', #PH (NC)
|
1958
1957
|
'18 22' => 'Auto Program (Shallow DOF)', #PH (NC)
|
1959
1958
|
'20 22' => 'Blur Control', #PH (Q)
|
1959
|
+
'26 0' => 'Shutter and Aperture Priority (TAv)', #PH (K-3III)
|
1960
1960
|
'249 0' => 'Movie (TAv)', #31
|
1961
1961
|
'250 0' => 'Movie (TAv, Auto Aperture)', #31
|
1962
1962
|
'251 0' => 'Movie (Manual)', #31
|
@@ -3038,6 +3038,10 @@ my %binaryDataAttrs = (
|
|
3038
3038
|
# 0x0236 - undef[52] (Q)
|
3039
3039
|
# 0x0237 - undef[11] possibly related to smart effect setting? (Q)
|
3040
3040
|
# 0x0238 - undef[9] (Q)
|
3041
|
+
0x0238 => { #KarstenGieselmann
|
3042
|
+
Name => 'CAFPointInfo',
|
3043
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Pentax::CAFPointInfo' },
|
3044
|
+
},
|
3041
3045
|
0x0239 => { #PH
|
3042
3046
|
Name => 'LensInfoQ',
|
3043
3047
|
SubDirectory => { TagTable => 'Image::ExifTool::Pentax::LensInfoQ' },
|
@@ -4931,6 +4935,7 @@ my %binaryDataAttrs = (
|
|
4931
4935
|
# CalFlag, ContrastFlag, PrecalFlag, SelectSensor
|
4932
4936
|
0x00 => { #PH
|
4933
4937
|
Name => 'AFPointsUnknown1',
|
4938
|
+
Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
|
4934
4939
|
Unknown => 1,
|
4935
4940
|
Format => 'int16u',
|
4936
4941
|
ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff',
|
@@ -4958,6 +4963,7 @@ my %binaryDataAttrs = (
|
|
4958
4963
|
},
|
4959
4964
|
0x02 => { #PH
|
4960
4965
|
Name => 'AFPointsUnknown2',
|
4966
|
+
Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
|
4961
4967
|
Unknown => 1,
|
4962
4968
|
Format => 'int16u',
|
4963
4969
|
ValueConv => '$self->Options("Unknown") ? $val : $val & 0x7ff',
|
@@ -4999,10 +5005,10 @@ my %binaryDataAttrs = (
|
|
4999
5005
|
# 0x0a - values: 00,05,0d,15,86,8e,a6,ae
|
5000
5006
|
0x0b => { #JD
|
5001
5007
|
Name => 'AFPointsInFocus',
|
5002
|
-
Condition => '$$self{Model} !~ /K-
|
5008
|
+
Condition => '$$self{Model} !~ /(K-(1|3|70)|KP)\b/',
|
5003
5009
|
Notes => q{
|
5004
|
-
models other than the K-1
|
5005
|
-
though a single AFPoint has been selected, in which case the selected
|
5010
|
+
models other than the K-1, K-3, K-70 and KP. May report two points in focus
|
5011
|
+
even though a single AFPoint has been selected, in which case the selected
|
5006
5012
|
AFPoint is the first reported
|
5007
5013
|
},
|
5008
5014
|
PrintConvColumns => 2,
|
@@ -5032,22 +5038,32 @@ my %binaryDataAttrs = (
|
|
5032
5038
|
},
|
5033
5039
|
0x14 => {
|
5034
5040
|
Name => 'AFPointValues',
|
5035
|
-
|
5041
|
+
Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
|
5042
|
+
Format => 'int16uRev[69]',
|
5036
5043
|
Unknown => 1,
|
5037
5044
|
Notes => 'some unknown values related to each AFPoint',
|
5038
|
-
# order is the same as AFPoints below, but there is an additional value for
|
5039
|
-
#
|
5040
|
-
#
|
5045
|
+
# order is the same as AFPoints below, but there is an additional value for
|
5046
|
+
# each AF point starting at offset 28 in the array (yes, the range overlaps
|
5047
|
+
# with the 1st values)
|
5041
5048
|
# (values are int16s stored in reversed byte order)
|
5042
5049
|
ValueConv => 'my @a=split " ",$val;$_>32767 and $_-=65536 foreach @a;join " ",@a',
|
5050
|
+
PrintConv => \&AFPointValues,
|
5043
5051
|
},
|
5044
5052
|
0x12a => { # byte has a value of 2 if corresponding AF point is selected
|
5045
|
-
Name => '
|
5053
|
+
Name => 'AFPointsSelected',
|
5046
5054
|
Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
|
5055
|
+
Notes => q{
|
5056
|
+
K-3III only. 41 selectable AF points from a total of 101 available in a 13x9
|
5057
|
+
grid. Columns are labelled A-M and rows are 1-9. The center point is G5
|
5058
|
+
},
|
5047
5059
|
Format => 'int8u[41]',
|
5048
|
-
PrintConv =>
|
5060
|
+
PrintConv => 'Image::ExifTool::Pentax::AFPointsK3iii($val,$self,2)',
|
5049
5061
|
},
|
5050
|
-
|
5062
|
+
#
|
5063
|
+
# (maybe not coincidentally, there are 60 unknown bytes
|
5064
|
+
# here, and there are also 60 non-selectable AF points)
|
5065
|
+
#
|
5066
|
+
0x18f => { # byte has a value of 1 if corresponding AF point is ... in focus maybe?
|
5051
5067
|
# usually the same points as AFPoints above, but not always
|
5052
5068
|
Name => 'AFPointsUnknown',
|
5053
5069
|
Condition => '$$self{Model} eq "PENTAX K-3 Mark III"', # any other models?
|
@@ -5069,6 +5085,37 @@ my %binaryDataAttrs = (
|
|
5069
5085
|
},
|
5070
5086
|
);
|
5071
5087
|
|
5088
|
+
# AF information for K-01 and later (ref Karsten Gieselmann private communication)
|
5089
|
+
%Image::ExifTool::Pentax::CAFPointInfo = (
|
5090
|
+
%binaryDataAttrs,
|
5091
|
+
FIRST_ENTRY => 0,
|
5092
|
+
DATAMEMBER => [ 1 ],
|
5093
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
5094
|
+
NOTES => 'Contrast-detect AF-point information for the K-01 and later models.',
|
5095
|
+
1 => {
|
5096
|
+
Name => 'NumCAFPoints',
|
5097
|
+
RawConv => '$$self{NumCAFPoints} = ($val & 0x0f) * ($val >> 4); $val',
|
5098
|
+
ValueConv => '($val >> 4) * ($val & 0x0f)',
|
5099
|
+
},
|
5100
|
+
1.1 => {
|
5101
|
+
Name => 'CAFGridSize',
|
5102
|
+
ValueConv => '($val >> 4) . " " . ($val & 0x0f)', # (width x height)
|
5103
|
+
PrintConv => '$val =~ tr/ /x/; $val',
|
5104
|
+
},
|
5105
|
+
2 => {
|
5106
|
+
Name => 'CAFPointsInFocus',
|
5107
|
+
Format => 'int8u[int(($val{1}+3)/4)]',
|
5108
|
+
Writable => 0,
|
5109
|
+
PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumCAFPoints},2,0x02)',
|
5110
|
+
},
|
5111
|
+
2.1 => {
|
5112
|
+
Name => 'CAFPointsSelected',
|
5113
|
+
Format => 'int8u[int(($val{1}+3)/4)]',
|
5114
|
+
Writable => 0,
|
5115
|
+
PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumCAFPoints},2,0x03)',
|
5116
|
+
},
|
5117
|
+
);
|
5118
|
+
|
5072
5119
|
# Kelvin white balance information (ref 28, topic 4834)
|
5073
5120
|
%Image::ExifTool::Pentax::KelvinWB = (
|
5074
5121
|
%binaryDataAttrs,
|
@@ -5735,29 +5782,34 @@ my %binaryDataAttrs = (
|
|
5735
5782
|
%Image::ExifTool::Pentax::AFPointInfo = (
|
5736
5783
|
%binaryDataAttrs,
|
5737
5784
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
5785
|
+
DATAMEMBER => [ 2 ],
|
5738
5786
|
NOTES => 'AF point information written by the K-1.',
|
5739
5787
|
# 0 - int16u: 1 (version?)
|
5740
5788
|
2 => {
|
5741
5789
|
Name => 'NumAFPoints',
|
5742
5790
|
Format => 'int16u',
|
5791
|
+
RawConv => '$$self{NumAFPoints} = $val',
|
5743
5792
|
},
|
5744
5793
|
4 => {
|
5745
5794
|
Name => 'AFPointsInFocus',
|
5746
5795
|
Condition => '$$self{Model} =~ /K-1\b/',
|
5747
|
-
Format => 'int8u[
|
5748
|
-
|
5796
|
+
Format => 'int8u[int(($val{2}+3)/4)]',
|
5797
|
+
Writable => 0,
|
5798
|
+
PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumAFPoints},2,0x02)',
|
5749
5799
|
},
|
5750
5800
|
4.1 => {
|
5751
5801
|
Name => 'AFPointsSelected',
|
5752
5802
|
Condition => '$$self{Model} =~ /K-1\b/',
|
5753
|
-
Format => 'int8u[
|
5754
|
-
|
5803
|
+
Format => 'int8u[int(($val{2}+3)/4)]',
|
5804
|
+
Writable => 0,
|
5805
|
+
PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumAFPoints},2,0x03)',
|
5755
5806
|
},
|
5756
5807
|
4.2 => {
|
5757
5808
|
Name => 'AFPointsSpecial',
|
5758
5809
|
Condition => '$$self{Model} =~ /K-1\b/',
|
5759
|
-
Format => 'int8u[
|
5760
|
-
|
5810
|
+
Format => 'int8u[int(($val{2}+3)/4)]',
|
5811
|
+
Writable => 0,
|
5812
|
+
PrintConv => 'Image::ExifTool::Pentax::DecodeAFPoints($val,$$self{NumAFPoints},2,0x03,0x03)',
|
5761
5813
|
},
|
5762
5814
|
);
|
5763
5815
|
|
@@ -5787,7 +5839,7 @@ my %binaryDataAttrs = (
|
|
5787
5839
|
},
|
5788
5840
|
0x0e => {
|
5789
5841
|
Name => 'SensorTemperature2', #forum6677 (was CameraTemperature3)
|
5790
|
-
Condition => '$$self{Model}
|
5842
|
+
Condition => '$$self{Model} !~ /K-3 Mark III/', # (and maybe others?)
|
5791
5843
|
Format => 'int16s',
|
5792
5844
|
ValueConv => '$val / 10',
|
5793
5845
|
ValueConvInv => '$val * 10',
|
@@ -6406,6 +6458,45 @@ sub DecodeAFPoints($$$$;$)
|
|
6406
6458
|
return join(',', @bitList);
|
6407
6459
|
}
|
6408
6460
|
|
6461
|
+
#------------------------------------------------------------------------------
|
6462
|
+
# Print AF Point names for K-3III (ref PH)
|
6463
|
+
# Inputs: 0) value, 1) ExifTool ref, 2) optional value to match
|
6464
|
+
sub AFPointsK3iii($$;$)
|
6465
|
+
{
|
6466
|
+
my @a = split ' ', $_[0];
|
6467
|
+
my $match = $_[2];
|
6468
|
+
my @pts;
|
6469
|
+
if ($match) {
|
6470
|
+
$a[$_] == $match and push @pts, $k3iiiAF[$_] || "Unknown($_)" foreach 0..$#a;
|
6471
|
+
} else {
|
6472
|
+
$a[$_] and push @pts, $k3iiiAF[$_] || "Unknown($_)" foreach 0..$#a;
|
6473
|
+
}
|
6474
|
+
return @pts ? join ',', sort @pts : '(none)';
|
6475
|
+
}
|
6476
|
+
|
6477
|
+
#------------------------------------------------------------------------------
|
6478
|
+
# Print AF point values for K-3III (ref PH)
|
6479
|
+
# Inputs: 0) value, 1) ExifTool ref
|
6480
|
+
# Notes: this is experimental and not well understood
|
6481
|
+
sub AFPointValues($$)
|
6482
|
+
{
|
6483
|
+
my @a = split ' ', shift;
|
6484
|
+
my @vals;
|
6485
|
+
# (I really don't understand why Pentax seemed to use 28 instead of 41 for
|
6486
|
+
# the first index of the 2nd value, because as it stands there is
|
6487
|
+
# overlap between the ranges of the 1st and 2nd values, and there is
|
6488
|
+
# no way to tell which is which for cases were multiple points have values)
|
6489
|
+
foreach (0 .. $#a) {
|
6490
|
+
next unless $a[$_];
|
6491
|
+
my $pt = $k3iiiAF[$_] ? $k3iiiAF[$_] . '=' : $k3iiiAF[$_-28] . '=/';
|
6492
|
+
push @vals, "$pt$a[$_]";
|
6493
|
+
next unless $a[$_ + 28];
|
6494
|
+
$vals[-1] .= '/' . $a[$_ + 28];
|
6495
|
+
$a[$_ + 28] = undef;
|
6496
|
+
}
|
6497
|
+
return @vals ? join ',', sort @vals : '(none)';
|
6498
|
+
}
|
6499
|
+
|
6409
6500
|
#------------------------------------------------------------------------------
|
6410
6501
|
# Convert Pentax hex-based EV (modulo 8) to real number
|
6411
6502
|
# Inputs: 0) value to convert
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Plot;
|
|
11
11
|
use strict;
|
12
12
|
use vars qw($VERSION);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.03';
|
15
15
|
|
16
16
|
# default plot settings (lower-case settings may be overridden by the user)
|
17
17
|
my %defaults = (
|
@@ -262,23 +262,35 @@ sub Draw($$)
|
|
262
262
|
{
|
263
263
|
my ($self, $fp) = @_;
|
264
264
|
my ($min, $max, $xmin, $xmax, $name, $style) = @$self{qw(Min Max XMin XMax Name style)};
|
265
|
+
my ($plotNum, $multiMulti);
|
265
266
|
|
266
267
|
if (not defined $min or not defined $xmin) {
|
267
268
|
$$self{Error} = 'Nothing to plot';
|
268
269
|
return;
|
269
270
|
}
|
270
|
-
my ($i, $n, %col, %class, $dx, $dy, $dx2, $xAxis, $x, $y, $px, $py, @og);
|
271
|
-
my ($noLegend, $xname, $xdat, $xdiff, $diff, %markID, $plotNum);
|
272
271
|
my $scat = $$self{type} =~ /^s/ ? 1 : 0;
|
273
272
|
my $hist = $$self{type} =~ /^h/ ? [ ] : 0;
|
274
|
-
my $multi =
|
273
|
+
my $multi = $$self{multi} || 0;
|
274
|
+
my @multi = $multi =~ /\d+/g;
|
275
|
+
my @names = @$name;
|
276
|
+
shift @names if $scat;
|
277
|
+
$multi = shift @multi;
|
275
278
|
$multi = 0 unless $multi > 0;
|
276
279
|
$style or $style = $hist ? 'line+fill' : 'line';
|
277
280
|
unless ($style =~ /\b[mpl]/ or ($hist and $style =~ /\bf/)) {
|
278
281
|
$$self{Error} = 'Invalid plot Style setting';
|
279
282
|
return;
|
280
283
|
}
|
281
|
-
my $numPlots =
|
284
|
+
my $numPlots = 0;
|
285
|
+
if ($multi) {
|
286
|
+
my $n;
|
287
|
+
for ($n=0; $n<scalar(@$name)-$scat; ++$numPlots) {
|
288
|
+
$n += ($multi[$numPlots] || 1);
|
289
|
+
$multiMulti = 1 if $multi[$numPlots] and $multi[$numPlots] > 1;
|
290
|
+
}
|
291
|
+
} else {
|
292
|
+
$numPlots = 1;
|
293
|
+
}
|
282
294
|
my @size = @{$$self{size}};
|
283
295
|
my $sy = $size[1];
|
284
296
|
if ($multi) {
|
@@ -293,6 +305,8 @@ sub Draw($$)
|
|
293
305
|
<title>$tmp</title>};
|
294
306
|
# loop through all plots
|
295
307
|
for ($plotNum=0; $plotNum<$numPlots; ++$plotNum) {
|
308
|
+
my ($i, $n, %col, %class, $dx, $dy, $dx2, $xAxis, $x, $y, $px, $py, @og);
|
309
|
+
my ($noLegend, $xname, $xdat, $xdiff, $diff, %markID);
|
296
310
|
if ($numPlots > 1) {
|
297
311
|
print $fp "\n<g transform='translate(", ($plotNum % $multi) * $size[0],
|
298
312
|
',', int($plotNum/$multi) * $size[1], ")'>";
|
@@ -304,14 +318,19 @@ sub Draw($$)
|
|
304
318
|
}
|
305
319
|
$name = $$self{Name} = [ ];
|
306
320
|
push @{$$self{Name}}, $$self{SaveName}[0] if $scat;
|
307
|
-
|
308
|
-
|
321
|
+
foreach (0 .. (($multi[$plotNum] || 1) - 1)) {
|
322
|
+
push @{$$self{Name}}, shift(@names);
|
323
|
+
}
|
324
|
+
warn "@{$$self{Name}}\n";
|
309
325
|
undef $min; undef $max;
|
310
|
-
foreach (
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
326
|
+
foreach ($scat .. (@{$$self{Name}} - 1)) {
|
327
|
+
my $dat = $$self{Data}{$$self{Name}[$_]};
|
328
|
+
foreach (@$dat) {
|
329
|
+
defined or next;
|
330
|
+
defined $min or $min = $max = $_, next;
|
331
|
+
$min > $_ and $min = $_;
|
332
|
+
$max < $_ and $max = $_;
|
333
|
+
}
|
315
334
|
}
|
316
335
|
}
|
317
336
|
my ($data, $title, $xlabel, $ylabel, $cols, $marks, $tpad, $wid) =
|
@@ -321,12 +340,12 @@ sub Draw($$)
|
|
321
340
|
|
322
341
|
# set reasonable default titles and labels
|
323
342
|
$xname = shift @name if $scat;
|
324
|
-
$title = "$name[0] vs $xname" if $scat and defined $title and not $title and @name == 1;
|
343
|
+
$title = "$name[0] vs $xname" if $scat and defined $title and not $title and @name == 1 and not $multi;
|
325
344
|
if ($scat || $hist and defined $xlabel and not $xlabel) {
|
326
345
|
$xlabel = $$name[0];
|
327
346
|
$noLegend = 1 if $hist;
|
328
347
|
}
|
329
|
-
if (defined $ylabel and not $ylabel and @name == 1) {
|
348
|
+
if (defined $ylabel and not $ylabel and @name == 1 and not $multiMulti) {
|
330
349
|
$ylabel = $hist ? 'Count' : $name[0];
|
331
350
|
$noLegend = 1 unless $hist;
|
332
351
|
}
|
@@ -645,7 +664,9 @@ Change plot settings.
|
|
645
664
|
Title, XLabel, YLabel - plot title and x/y axis labels (no default)
|
646
665
|
XMin, XMax - x axis minimum/maximum (autoscaling if not set)
|
647
666
|
YMin, YMax - y axis minimum/maximum
|
648
|
-
Multi -
|
667
|
+
Multi - number of columns when drawing multiple plots,
|
668
|
+
followed optional number of datasets for each
|
669
|
+
plot (1 by default) using any separator
|
649
670
|
Split - flag to split strings of numbers into lists
|
650
671
|
(> 1 to split into lists of N items)
|
651
672
|
"Grid=darkgray" - grid color
|
@@ -49,7 +49,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
49
49
|
use Image::ExifTool::Exif;
|
50
50
|
use Image::ExifTool::GPS;
|
51
51
|
|
52
|
-
$VERSION = '3.
|
52
|
+
$VERSION = '3.17';
|
53
53
|
|
54
54
|
sub ProcessMOV($$;$);
|
55
55
|
sub ProcessKeys($$$);
|
@@ -815,6 +815,13 @@ my %userDefined = (
|
|
815
815
|
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
816
816
|
ProcessProc => 'Image::ExifTool::LigoGPS::ProcessLigoJSON',
|
817
817
|
},
|
818
|
+
},{
|
819
|
+
Name => 'GKUData',
|
820
|
+
Condition => '$$valPt =~ /^.{8}__V35AX_QVDATA__/',
|
821
|
+
SubDirectory => {
|
822
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
823
|
+
ProcessProc => 'Image::ExifTool::LigoGPS::ProcessGKU',
|
824
|
+
},
|
818
825
|
},{
|
819
826
|
Name => 'FLIRData',
|
820
827
|
SubDirectory => { TagTable => 'Image::ExifTool::FLIR::UserData' },
|
@@ -953,6 +960,15 @@ my %userDefined = (
|
|
953
960
|
Name => 'SEAL',
|
954
961
|
SubDirectory => { TagTable => 'Image::ExifTool::XMP::SEAL' },
|
955
962
|
},
|
963
|
+
inst => {
|
964
|
+
Name => 'Insta360Info',
|
965
|
+
DontRead => 1, # don't read into memory when extracting
|
966
|
+
WriteLast => 1, # must go at end of file
|
967
|
+
SubDirectory => {
|
968
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
969
|
+
ProcessProc => \&ProcessInsta360,
|
970
|
+
},
|
971
|
+
},
|
956
972
|
);
|
957
973
|
|
958
974
|
# stuff seen in 'skip' atom (70mai Pro Plus+ MP4 videos)
|
@@ -2362,6 +2378,25 @@ my %userDefined = (
|
|
2362
2378
|
# @etc - 4 bytes all zero (Samsung WB30F)
|
2363
2379
|
# saut - 4 bytes all zero (Samsung SM-N900T)
|
2364
2380
|
# smrd - string "TRUEBLUE" (Samsung SM-C101, etc)
|
2381
|
+
# ---- Sigma ----
|
2382
|
+
SIGM => {
|
2383
|
+
Name => 'PreviewImage',
|
2384
|
+
# 32-byte header followed by preview image. Length at offset 6 in header
|
2385
|
+
Condition => 'length($$valPt) > 0x20 and length($$valPt) == unpack("x6V",$$valPt) + 0x20',
|
2386
|
+
Groups => { 2 => 'Preview' },
|
2387
|
+
SetBase => 1, # so $$self{BASE} will be set for correct offsets in verbose/html dumps
|
2388
|
+
RawConv => q{
|
2389
|
+
$val = substr($val, 0x20);
|
2390
|
+
my $pt = $self->ValidateImage(\$val, $tag);
|
2391
|
+
if ($pt) {
|
2392
|
+
$$self{BASE} += 0x20;
|
2393
|
+
$$self{DOC_NUM} = ++$$self{DOC_COUNT};
|
2394
|
+
$self->ExtractInfo($pt, { ReEntry => 1 });
|
2395
|
+
$$self{DOC_NUM} = 0;
|
2396
|
+
}
|
2397
|
+
return $pt;
|
2398
|
+
},
|
2399
|
+
},
|
2365
2400
|
# ---- TomTom Bandit Action Cam ----
|
2366
2401
|
TTMD => {
|
2367
2402
|
Name => 'TomTomMetaData',
|
@@ -2387,6 +2422,19 @@ my %userDefined = (
|
|
2387
2422
|
Groups => { 2 => 'Preview' },
|
2388
2423
|
Binary => 1,
|
2389
2424
|
},
|
2425
|
+
# ---- Insta360 ----
|
2426
|
+
nail => {
|
2427
|
+
Name => 'ThumbnailTIFF',
|
2428
|
+
Notes => 'image found in some Insta360 videos, converted to TIFF format',
|
2429
|
+
Groups => { 2 => 'Preview' },
|
2430
|
+
RawConv => q{
|
2431
|
+
return undef if length $val < 8;
|
2432
|
+
my ($w, $h) = unpack('NN', $val);
|
2433
|
+
return undef if length $val < $w * $h + 8;
|
2434
|
+
return MakeTiffHeader($w, $h, 1, 8) . substr($val, 8, $w * $h);
|
2435
|
+
},
|
2436
|
+
Binary => 1,
|
2437
|
+
},
|
2390
2438
|
# ---- Nextbase ----
|
2391
2439
|
info => 'FirmwareVersion',
|
2392
2440
|
'time' => {
|
@@ -9351,7 +9399,7 @@ sub HandleItemInfo($)
|
|
9351
9399
|
$et->ProcessDirectory(\%dirInfo, $subTable, $proc);
|
9352
9400
|
delete $$et{DOC_NUM};
|
9353
9401
|
}
|
9354
|
-
$raf->Seek($curPos, 0) or $et->Warn('Seek error')
|
9402
|
+
$raf->Seek($curPos, 0) or $et->Warn('Seek error'); # seek back to original position
|
9355
9403
|
pop @{$$et{PATH}};
|
9356
9404
|
}
|
9357
9405
|
# process the item properties now that we should know their associations and document numbers
|
@@ -9743,6 +9791,7 @@ sub IdentifyTrailers($)
|
|
9743
9791
|
} else {
|
9744
9792
|
last;
|
9745
9793
|
}
|
9794
|
+
# 0) trailer type, 1) trailer start, 2) trailer length, 3) pointer to next trailer
|
9746
9795
|
$trailer = [ $type , $raf->Tell() - $len, $len, $nextTrail ];
|
9747
9796
|
$nextTrail = $trailer;
|
9748
9797
|
$offset += $len;
|
@@ -10017,7 +10066,7 @@ sub ProcessMOV($$;$)
|
|
10017
10066
|
}
|
10018
10067
|
}
|
10019
10068
|
}
|
10020
|
-
if (defined $tagInfo and not $ignore) {
|
10069
|
+
if (defined $tagInfo and not $ignore and not ($tagInfo and $$tagInfo{DontRead})) {
|
10021
10070
|
# set document number for this item property if necessary
|
10022
10071
|
if ($$et{IsItemProperty}) {
|
10023
10072
|
my $items = $$et{ItemInfo};
|
@@ -10070,7 +10119,7 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10070
10119
|
# use value to get tag info if necessary
|
10071
10120
|
$tagInfo or $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val);
|
10072
10121
|
my $hasData = ($$dirInfo{HasData} and $val =~ /^....data\0/s);
|
10073
|
-
if ($verbose and not $hasData) {
|
10122
|
+
if ($verbose and defined $val and not $hasData) {
|
10074
10123
|
my $tval;
|
10075
10124
|
if ($tagInfo and $$tagInfo{Format}) {
|
10076
10125
|
$tval = ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val));
|
@@ -10389,7 +10438,25 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10389
10438
|
Size => $size,
|
10390
10439
|
Extra => sprintf(' at offset 0x%.4x', $raf->Tell()),
|
10391
10440
|
) if $verbose;
|
10392
|
-
|
10441
|
+
my $seekTo = $raf->Tell() + $size;
|
10442
|
+
if ($tagInfo and $$tagInfo{DontRead} and $$tagInfo{SubDirectory}) {
|
10443
|
+
# ignore first trailer if it is the payload of this box
|
10444
|
+
$trailer = $$trailer[3] if $trailer and $$trailer[1] == $raf->Tell();
|
10445
|
+
my $subdir = $$tagInfo{SubDirectory};
|
10446
|
+
my %dirInfo = (
|
10447
|
+
RAF => $raf,
|
10448
|
+
DirName => $$tagInfo{Name},
|
10449
|
+
DirID => $tag,
|
10450
|
+
DirEnd => $seekTo,
|
10451
|
+
);
|
10452
|
+
my $subTable = GetTagTable($$subdir{TagTable});
|
10453
|
+
my $proc = $$subdir{ProcessProc};
|
10454
|
+
# make ProcessMOV() the default processing procedure for subdirectories
|
10455
|
+
$proc = \&ProcessMOV unless $proc or $$subTable{PROCESS_PROC};
|
10456
|
+
$et->ProcessDirectory(\%dirInfo, $subTable, $proc);
|
10457
|
+
$raf->Seek($seekTo);
|
10458
|
+
}
|
10459
|
+
unless ($raf->Seek($seekTo-1) and $raf->Read($buff, 1) == 1) {
|
10393
10460
|
my $t = PrintableTagID($tag,2);
|
10394
10461
|
$warnStr = sprintf("Truncated '${t}' data at offset 0x%x", $lastPos);
|
10395
10462
|
last;
|
@@ -111,7 +111,7 @@ my %insvLimit = (
|
|
111
111
|
The tags below are extracted from timed metadata in QuickTime and other
|
112
112
|
formats of video files when the ExtractEmbedded option is used. Although
|
113
113
|
most of these tags are combined into the single table below, ExifTool
|
114
|
-
currently reads
|
114
|
+
currently reads 107 different types of timed GPS metadata from video files.
|
115
115
|
},
|
116
116
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
117
117
|
GPSLongitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")' },
|
@@ -317,7 +317,7 @@ my %insvLimit = (
|
|
317
317
|
ByteOrder => 'Little-Endian',
|
318
318
|
},
|
319
319
|
}],
|
320
|
-
mett => { # Parrot drones
|
320
|
+
mett => { # Parrot drones and iPhone/Android using ARCore
|
321
321
|
Name => 'mett',
|
322
322
|
SubDirectory => { TagTable => 'Image::ExifTool::Parrot::mett' },
|
323
323
|
},
|
@@ -2287,6 +2287,16 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
2287
2287
|
$lat = ($lat - 187.982162849635) / 3;
|
2288
2288
|
$lon = ($lon - 2199.19873715495) / 2;
|
2289
2289
|
$ddd = 1;
|
2290
|
+
} elsif (Get32u($dataPt,0) == 0x400000 and abs($lat) <= 90 and abs($lon) <= 180) {
|
2291
|
+
# Transcend Drive Body Camera 70
|
2292
|
+
# 0000: 00 00 40 00 66 72 65 65 47 50 53 20 4c 00 00 00 [..@.freeGPS L...]
|
2293
|
+
# 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
2294
|
+
# 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
2295
|
+
# 0030: 09 00 00 00 26 00 00 00 15 00 00 00 e9 07 00 00 [....&...........]
|
2296
|
+
# 0040: 05 00 00 00 10 00 00 00 41 53 45 00 6c 59 ee 41 [........ASE.lY.A]
|
2297
|
+
# 0050: 9f 1a f7 41 3c 6b 0f 41 9a 99 99 43 00 00 00 00 [...A<k.A...C....]
|
2298
|
+
$ddd = 1; # already in decimal degrees
|
2299
|
+
$spd /= $knotsToKph; # already in km/h
|
2290
2300
|
} else {
|
2291
2301
|
$debug and $et->FoundTag(GPSType => 17);
|
2292
2302
|
}
|
@@ -3200,8 +3210,9 @@ sub ProcessTTAD($$$)
|
|
3200
3210
|
}
|
3201
3211
|
|
3202
3212
|
#------------------------------------------------------------------------------
|
3203
|
-
# Extract information from Insta360 trailer (INSV and
|
3213
|
+
# Extract information from Insta360 trailer (INSV, INSP and MP4 files) or 'inst' box (ref PH)
|
3204
3214
|
# Inputs: 0) ExifTool ref, 1) Optional dirInfo ref for returning trailer info
|
3215
|
+
# (dirInfo has Offset from end of trailer to end of file or DirEnd absolute end of trailer)
|
3205
3216
|
# Returns: true on success
|
3206
3217
|
# Notes: There looks to be some useful information by telemetry-parser, but
|
3207
3218
|
# the code is cryptic: https://github.com/AdrianEddy/telemetry-parser
|
@@ -3213,13 +3224,16 @@ sub ProcessInsta360($;$)
|
|
3213
3224
|
my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0;
|
3214
3225
|
my ($buff, $dirTable, $dirTablePos);
|
3215
3226
|
|
3227
|
+
if ($dirInfo and $$dirInfo{DirEnd}) {
|
3228
|
+
$raf->Seek(0, 2);
|
3229
|
+
$offset = $raf->Tell() - $$dirInfo{DirEnd};
|
3230
|
+
}
|
3216
3231
|
return 0 unless $raf->Seek(-78-$offset, 2) and $raf->Read($buff, 78) == 78 and
|
3217
3232
|
substr($buff,-32) eq "8db42d694ccc418790edff439fe026bf"; # check magic number
|
3218
3233
|
|
3219
3234
|
my $verbose = $et->Options('Verbose');
|
3220
3235
|
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
3221
|
-
my $
|
3222
|
-
my $trailEnd = $fileEnd - $offset;
|
3236
|
+
my $trailEnd = $raf->Tell();
|
3223
3237
|
my $trailerLen = unpack('x38V', $buff);
|
3224
3238
|
$trailerLen > $trailEnd and $et->Warn('Bad Insta360 trailer size'), return 0;
|
3225
3239
|
if ($dirInfo) {
|
@@ -3259,7 +3273,7 @@ sub ProcessInsta360($;$)
|
|
3259
3273
|
($epos -= $len) + $trailerLen < 0 and last;
|
3260
3274
|
$raf->Seek($epos-$offset, 2) or last;
|
3261
3275
|
if ($verbose) {
|
3262
|
-
$et->VPrint(0, sprintf("Insta360 Record 0x%x (offset 0x%x, %d bytes):\n", $id, $
|
3276
|
+
$et->VPrint(0, sprintf("Insta360 Record 0x%x (offset 0x%x, %d bytes):\n", $id, $trailEnd + $epos, $len));
|
3263
3277
|
}
|
3264
3278
|
# there are 2 types of record 0x300:
|
3265
3279
|
# 1. 56 byte records
|
@@ -987,6 +987,11 @@ numerical, and generated automatically otherwise.
|
|
987
987
|
stored with a constant byte order that is different from that
|
988
988
|
of the parent directory.
|
989
989
|
|
990
|
+
DontRead : [QuickTime tags with compatible SubDirectory entries only]
|
991
|
+
Avoid reading subdirectory data from file. Instead, pass RAF
|
992
|
+
reference (with current position at start of directory) and
|
993
|
+
DirEnd.
|
994
|
+
|
990
995
|
TagID : [reserved] Used internally to save the table key for this tag.
|
991
996
|
Note: For XMP tables this corresponds to the XMP property
|
992
997
|
name, but the table key may have a full XMP namespace prefix
|
@@ -19,7 +19,7 @@ use strict;
|
|
19
19
|
use vars qw($VERSION %sigmaLensTypes);
|
20
20
|
use Image::ExifTool::Exif;
|
21
21
|
|
22
|
-
$VERSION = '1.
|
22
|
+
$VERSION = '1.35';
|
23
23
|
|
24
24
|
# sigma LensType lookup (ref IB)
|
25
25
|
%sigmaLensTypes = (
|
@@ -412,7 +412,12 @@ $VERSION = '1.34';
|
|
412
412
|
Name => 'Software',
|
413
413
|
Priority => 0,
|
414
414
|
},
|
415
|
-
0x0019 =>
|
415
|
+
0x0019 => {
|
416
|
+
Name => 'AutoBracket',
|
417
|
+
# (some models don't have spaces around "of")
|
418
|
+
PrintConv => '$val =~ s/(\d)of(\d)/$1 of $2/; $val',
|
419
|
+
PrintConvInv => '$val',
|
420
|
+
},
|
416
421
|
0x001a => [ #PH
|
417
422
|
{
|
418
423
|
Name => 'PreviewImageStart',
|
@@ -641,8 +646,11 @@ $VERSION = '1.34';
|
|
641
646
|
},
|
642
647
|
0x0033 => { #PH
|
643
648
|
Name => 'ExposureTime2',
|
644
|
-
Condition =>
|
645
|
-
|
649
|
+
Condition => q{
|
650
|
+
$$self{Model} !~ / (SD1|SD9|SD15|Merrill|Quattro|fp)$/ and
|
651
|
+
$$self{MakerNoteSigmaVer} < 4
|
652
|
+
},
|
653
|
+
Notes => 'only valid for some models',
|
646
654
|
ValueConv => '$val * 1e-6',
|
647
655
|
ValueConvInv => 'int($val * 1e6 + 0.5)',
|
648
656
|
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|