exiftool_vendored 13.27.0 → 13.29.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 +28 -0
- 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/exiftool +11 -11
- data/bin/lib/Image/ExifTool/Canon.pm +2 -2
- data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- 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/Olympus.pm +1 -1
- 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 +72 -21
- data/bin/lib/Image/ExifTool/Plot.pm +36 -15
- data/bin/lib/Image/ExifTool/QuickTime.pm +52 -4
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +10 -6
- data/bin/lib/Image/ExifTool/README +5 -0
- data/bin/lib/Image/ExifTool/Sony.pm +5 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +9 -2
- data/bin/lib/Image/ExifTool/TagNames.pod +35 -5
- 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 +17 -6
- data/bin/lib/Image/ExifTool/XMP.pm +2 -2
- data/bin/lib/Image/ExifTool.pm +1 -1
- 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
@@ -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.16';
|
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)
|
@@ -2387,6 +2403,19 @@ my %userDefined = (
|
|
2387
2403
|
Groups => { 2 => 'Preview' },
|
2388
2404
|
Binary => 1,
|
2389
2405
|
},
|
2406
|
+
# ---- Insta360 ----
|
2407
|
+
nail => {
|
2408
|
+
Name => 'ThumbnailTIFF',
|
2409
|
+
Notes => 'image found in some Insta360 videos, converted to TIFF format',
|
2410
|
+
Groups => { 2 => 'Preview' },
|
2411
|
+
RawConv => q{
|
2412
|
+
return undef if length $val < 8;
|
2413
|
+
my ($w, $h) = unpack('NN', $val);
|
2414
|
+
return undef if length $val < $w * $h + 8;
|
2415
|
+
return MakeTiffHeader($w, $h, 1, 8) . substr($val, 8, $w * $h);
|
2416
|
+
},
|
2417
|
+
Binary => 1,
|
2418
|
+
},
|
2390
2419
|
# ---- Nextbase ----
|
2391
2420
|
info => 'FirmwareVersion',
|
2392
2421
|
'time' => {
|
@@ -9743,6 +9772,7 @@ sub IdentifyTrailers($)
|
|
9743
9772
|
} else {
|
9744
9773
|
last;
|
9745
9774
|
}
|
9775
|
+
# 0) trailer type, 1) trailer start, 2) trailer length, 3) pointer to next trailer
|
9746
9776
|
$trailer = [ $type , $raf->Tell() - $len, $len, $nextTrail ];
|
9747
9777
|
$nextTrail = $trailer;
|
9748
9778
|
$offset += $len;
|
@@ -10017,7 +10047,7 @@ sub ProcessMOV($$;$)
|
|
10017
10047
|
}
|
10018
10048
|
}
|
10019
10049
|
}
|
10020
|
-
if (defined $tagInfo and not $ignore) {
|
10050
|
+
if (defined $tagInfo and not $ignore and not ($tagInfo and $$tagInfo{DontRead})) {
|
10021
10051
|
# set document number for this item property if necessary
|
10022
10052
|
if ($$et{IsItemProperty}) {
|
10023
10053
|
my $items = $$et{ItemInfo};
|
@@ -10070,7 +10100,7 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10070
10100
|
# use value to get tag info if necessary
|
10071
10101
|
$tagInfo or $tagInfo = $et->GetTagInfo($tagTablePtr, $tag, \$val);
|
10072
10102
|
my $hasData = ($$dirInfo{HasData} and $val =~ /^....data\0/s);
|
10073
|
-
if ($verbose and not $hasData) {
|
10103
|
+
if ($verbose and defined $val and not $hasData) {
|
10074
10104
|
my $tval;
|
10075
10105
|
if ($tagInfo and $$tagInfo{Format}) {
|
10076
10106
|
$tval = ReadValue(\$val, 0, $$tagInfo{Format}, $$tagInfo{Count}, length($val));
|
@@ -10389,7 +10419,25 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10389
10419
|
Size => $size,
|
10390
10420
|
Extra => sprintf(' at offset 0x%.4x', $raf->Tell()),
|
10391
10421
|
) if $verbose;
|
10392
|
-
|
10422
|
+
my $seekTo = $raf->Tell() + $size;
|
10423
|
+
if ($tagInfo and $$tagInfo{DontRead} and $$tagInfo{SubDirectory}) {
|
10424
|
+
# ignore first trailer if it is the payload of this box
|
10425
|
+
$trailer = $$trailer[3] if $trailer and $$trailer[1] == $raf->Tell();
|
10426
|
+
my $subdir = $$tagInfo{SubDirectory};
|
10427
|
+
my %dirInfo = (
|
10428
|
+
RAF => $raf,
|
10429
|
+
DirName => $$tagInfo{Name},
|
10430
|
+
DirID => $tag,
|
10431
|
+
DirEnd => $seekTo,
|
10432
|
+
);
|
10433
|
+
my $subTable = GetTagTable($$subdir{TagTable});
|
10434
|
+
my $proc = $$subdir{ProcessProc};
|
10435
|
+
# make ProcessMOV() the default processing procedure for subdirectories
|
10436
|
+
$proc = \&ProcessMOV unless $proc or $$subTable{PROCESS_PROC};
|
10437
|
+
$et->ProcessDirectory(\%dirInfo, $subTable, $proc);
|
10438
|
+
$raf->Seek($seekTo);
|
10439
|
+
}
|
10440
|
+
unless ($raf->Seek($seekTo-1) and $raf->Read($buff, 1) == 1) {
|
10393
10441
|
my $t = PrintableTagID($tag,2);
|
10394
10442
|
$warnStr = sprintf("Truncated '${t}' data at offset 0x%x", $lastPos);
|
10395
10443
|
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
|
},
|
@@ -3200,8 +3200,9 @@ sub ProcessTTAD($$$)
|
|
3200
3200
|
}
|
3201
3201
|
|
3202
3202
|
#------------------------------------------------------------------------------
|
3203
|
-
# Extract information from Insta360 trailer (INSV and
|
3203
|
+
# Extract information from Insta360 trailer (INSV, INSP and MP4 files) or 'inst' box (ref PH)
|
3204
3204
|
# Inputs: 0) ExifTool ref, 1) Optional dirInfo ref for returning trailer info
|
3205
|
+
# (dirInfo has Offset from end of trailer to end of file or DirEnd absolute end of trailer)
|
3205
3206
|
# Returns: true on success
|
3206
3207
|
# Notes: There looks to be some useful information by telemetry-parser, but
|
3207
3208
|
# the code is cryptic: https://github.com/AdrianEddy/telemetry-parser
|
@@ -3213,13 +3214,16 @@ sub ProcessInsta360($;$)
|
|
3213
3214
|
my $offset = $dirInfo ? $$dirInfo{Offset} || 0 : 0;
|
3214
3215
|
my ($buff, $dirTable, $dirTablePos);
|
3215
3216
|
|
3217
|
+
if ($dirInfo and $$dirInfo{DirEnd}) {
|
3218
|
+
$raf->Seek(0, 2);
|
3219
|
+
$offset = $raf->Tell() - $$dirInfo{DirEnd};
|
3220
|
+
}
|
3216
3221
|
return 0 unless $raf->Seek(-78-$offset, 2) and $raf->Read($buff, 78) == 78 and
|
3217
3222
|
substr($buff,-32) eq "8db42d694ccc418790edff439fe026bf"; # check magic number
|
3218
3223
|
|
3219
3224
|
my $verbose = $et->Options('Verbose');
|
3220
3225
|
my $tagTbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
3221
|
-
my $
|
3222
|
-
my $trailEnd = $fileEnd - $offset;
|
3226
|
+
my $trailEnd = $raf->Tell();
|
3223
3227
|
my $trailerLen = unpack('x38V', $buff);
|
3224
3228
|
$trailerLen > $trailEnd and $et->Warn('Bad Insta360 trailer size'), return 0;
|
3225
3229
|
if ($dirInfo) {
|
@@ -3259,7 +3263,7 @@ sub ProcessInsta360($;$)
|
|
3259
3263
|
($epos -= $len) + $trailerLen < 0 and last;
|
3260
3264
|
$raf->Seek($epos-$offset, 2) or last;
|
3261
3265
|
if ($verbose) {
|
3262
|
-
$et->VPrint(0, sprintf("Insta360 Record 0x%x (offset 0x%x, %d bytes):\n", $id, $
|
3266
|
+
$et->VPrint(0, sprintf("Insta360 Record 0x%x (offset 0x%x, %d bytes):\n", $id, $trailEnd + $epos, $len));
|
3263
3267
|
}
|
3264
3268
|
# there are 2 types of record 0x300:
|
3265
3269
|
# 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
|
@@ -10766,6 +10766,11 @@ my %isoSetting2010 = (
|
|
10766
10766
|
0 => 'Sony:FocusPosition2',
|
10767
10767
|
1 => 'FocalLengthIn35mmFormat',
|
10768
10768
|
},
|
10769
|
+
# (NOTE: This calculation may be wrong. "Focus Distance 2 is the result of an erroneous
|
10770
|
+
# user supplied formula to exiftool. It does use data embedded in the raw file,
|
10771
|
+
# but it is not the data. The actual embedded data seems to be proportional to
|
10772
|
+
# magnification not a focus distance. The camera needs to calculate magnification
|
10773
|
+
# for translation stabilization.", ref https://www.fredmiranda.com/forum/topic/1858744/0)
|
10769
10774
|
ValueConv => q{
|
10770
10775
|
return undef unless $val;
|
10771
10776
|
return 'inf' if $val >= 255;
|
@@ -730,6 +730,7 @@ my %tagLookup = (
|
|
730
730
|
'afareas' => { 334 => 0x304 },
|
731
731
|
'afareaselectionmethod' => { 2 => 0xd },
|
732
732
|
'afareaselectmethod' => { 90 => 0x51b },
|
733
|
+
'afareasize' => { 358 => 0xde },
|
733
734
|
'afareawidth' => { 200 => 0x18, 201 => 0x4e, 203 => 0x32, 204 => 0x46 },
|
734
735
|
'afareaxposition' => { 200 => 0x14, 201 => 0x4a, 203 => 0x2e, 204 => 0x42, 428 => 0x1203 },
|
735
736
|
'afareaxposition1' => { 428 => 0x1201 },
|
@@ -785,7 +786,7 @@ my %tagLookup = (
|
|
785
786
|
'afpointmode' => { 374 => 0x3 },
|
786
787
|
'afpointposition' => { 119 => 0x2021, 358 => 0x4d },
|
787
788
|
'afpointregistration' => { 88 => 0x7 },
|
788
|
-
'afpoints' => { 190 => 0x10
|
789
|
+
'afpoints' => { 190 => 0x10 },
|
789
790
|
'afpointsel' => { 329 => 0xb, 330 => 0xb, 331 => 0xb, 332 => 0xb },
|
790
791
|
'afpointselected' => { 191 => 0xd, 334 => 0x305, 394 => 0xe, 445 => 0x15, 446 => 0x14, 447 => [0x14,0x1c], 462 => 0x201e },
|
791
792
|
'afpointselected2' => { 374 => 0x4 },
|
@@ -795,7 +796,7 @@ my %tagLookup = (
|
|
795
796
|
'afpointsinfocus' => { 82 => 0xe, 199 => 0x2, 201 => 0x30, 369 => 0xb, 370 => 0x4, 394 => [0xf,0x3c] },
|
796
797
|
'afpointsinfocus5d' => { 19 => 0x38 },
|
797
798
|
'afpointspotmetering' => { 89 => 0xd },
|
798
|
-
'afpointsselected' => { 200 => 0x1c, 201 => 0x1c, 370 => '4.1', 497 => 0x4 },
|
799
|
+
'afpointsselected' => { 200 => 0x1c, 201 => 0x1c, 369 => 0x12a, 370 => '4.1', 497 => 0x4 },
|
799
800
|
'afpointsspecial' => { 370 => '4.2' },
|
800
801
|
'afpointsunknown' => { 369 => 0x18f },
|
801
802
|
'afpointsunknown1' => { 369 => 0x0 },
|
@@ -7884,8 +7885,10 @@ my %tagExists = (
|
|
7884
7885
|
'archivallocation' => 1,
|
7885
7886
|
'archivedfilename' => 1,
|
7886
7887
|
'arcoreaccel' => 1,
|
7888
|
+
'arcoreaccel0' => 1,
|
7887
7889
|
'arcorecustom' => 1,
|
7888
7890
|
'arcoregyro' => 1,
|
7891
|
+
'arcoregyro0' => 1,
|
7889
7892
|
'arcorevideo' => 1,
|
7890
7893
|
'ardronefile' => 1,
|
7891
7894
|
'ardronetelemetry' => 1,
|
@@ -9806,6 +9809,7 @@ my %tagExists = (
|
|
9806
9809
|
'gipcver' => 1,
|
9807
9810
|
'givenname' => 1,
|
9808
9811
|
'gixiver' => 1,
|
9812
|
+
'gkudata' => 1,
|
9809
9813
|
'glamoursettings' => 1,
|
9810
9814
|
'globalinfo' => 1,
|
9811
9815
|
'globalpalette' => 1,
|
@@ -9938,6 +9942,8 @@ my %tagExists = (
|
|
9938
9942
|
'hdmioutputhdr' => 1,
|
9939
9943
|
'hdmioutputrange' => 1,
|
9940
9944
|
'hdrgaincurve' => 1,
|
9945
|
+
'hdrgaincurvesize' => 1,
|
9946
|
+
'hdrgaininfo' => 1,
|
9941
9947
|
'hdrgainmap' => 1,
|
9942
9948
|
'hdrgm' => 1,
|
9943
9949
|
'hdrimage' => 1,
|
@@ -10194,6 +10200,7 @@ my %tagExists = (
|
|
10194
10200
|
'insetnwpixelx' => 1,
|
10195
10201
|
'insetnwpixely' => 1,
|
10196
10202
|
'insta360' => 1,
|
10203
|
+
'insta360info' => 1,
|
10197
10204
|
'institution' => 1,
|
10198
10205
|
'instructionset' => 1,
|
10199
10206
|
'instruments' => 1,
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
12
12
|
=head1 TAG TABLES
|
13
13
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
15
|
-
They contain a total of
|
15
|
+
They contain a total of 28445 tags, with 17669 unique tag names.
|
16
16
|
|
17
17
|
B<Tag ID>, B<Index#> or B<Sequence> is given in the first column of each
|
18
18
|
table. A B<Tag ID> is the computer-readable equivalent of a tag name, and
|
@@ -154,7 +154,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
154
154
|
InfiRaySensor InfiRay Sensor
|
155
155
|
SEAL XMP SEAL
|
156
156
|
'APP10' Comment no
|
157
|
-
|
157
|
+
HDRGainInfo -
|
158
158
|
'APP11' JPEG-HDR JPEG HDR
|
159
159
|
JUMBF Jpeg2000
|
160
160
|
'APP12' PictureInfo APP12 PictureInfo
|
@@ -171,6 +171,7 @@ L<https://www.w3.org/Graphics/JPEG/jfif3.pdf> for the JPEG specification.
|
|
171
171
|
FotoStation FotoStation
|
172
172
|
PhotoMechanic PhotoMechanic
|
173
173
|
MIE MIE
|
174
|
+
MPF MPF
|
174
175
|
Samsung Samsung Trailer
|
175
176
|
Vivo Trailer Vivo
|
176
177
|
OnePlus Trailer OnePlus
|
@@ -277,6 +278,13 @@ Tags found in the XML metadata of the APP9 "Media Jukebox" segment.
|
|
277
278
|
Tool_Name no
|
278
279
|
Tool_Version no
|
279
280
|
|
281
|
+
=head3 JPEG HDRGainInfo Tags
|
282
|
+
|
283
|
+
Index1 Tag Name Writable
|
284
|
+
------ -------- --------
|
285
|
+
6 HDRGainCurveSize no
|
286
|
+
10 HDRGainCurve no
|
287
|
+
|
280
288
|
=head3 JPEG HDR Tags
|
281
289
|
|
282
290
|
Information extracted from APP11 of a JPEG-HDR image.
|
@@ -19903,6 +19911,7 @@ These tags are used in Panasonic/Leica cameras.
|
|
19903
19911
|
0x00d1 ISO int32u
|
19904
19912
|
0x00d2 MonochromeGrainEffect int16u
|
19905
19913
|
0x00d6 NoiseReductionStrength rational64s
|
19914
|
+
0x00de AFAreaSize rational64u[2]
|
19906
19915
|
0x00e4 LensTypeModel int16u
|
19907
19916
|
0x00e8 MinimumISO int32u
|
19908
19917
|
0x00e9 AFSubjectDetection int16u
|
@@ -20667,7 +20676,7 @@ Flash information tags for the K10D, K20D and K200D.
|
|
20667
20676
|
7 AFIntegrationTime int8u
|
20668
20677
|
11 AFPointsInFocus int8u
|
20669
20678
|
20 AFPointValues? no
|
20670
|
-
298
|
20679
|
+
298 AFPointsSelected int8u[41]~
|
20671
20680
|
399 AFPointsUnknown? int8u[41]~
|
20672
20681
|
506 LiveView int8u
|
20673
20682
|
509 AFHold int8u
|
@@ -30314,6 +30323,7 @@ for the official QuickTime specification.
|
|
30314
30323
|
'gdat' GPSData QuickTime Stream
|
30315
30324
|
'gps0' GPSTrack QuickTime Stream
|
30316
30325
|
'gsen' GSensor QuickTime Stream
|
30326
|
+
'inst' Insta360Info QuickTime Stream
|
30317
30327
|
'junk' Junk? no
|
30318
30328
|
'mdat' MediaData? no
|
30319
30329
|
'mdat-offset' MediaDataOffset no
|
@@ -30338,6 +30348,7 @@ for the official QuickTime specification.
|
|
30338
30348
|
'udat' GPSLog no
|
30339
30349
|
'udta' KenwoodData QuickTime Stream
|
30340
30350
|
LigoJSON QuickTime Stream
|
30351
|
+
GKUData QuickTime Stream
|
30341
30352
|
FLIRData FLIR UserData
|
30342
30353
|
'uuid' XMP XMP
|
30343
30354
|
UUID-PROF QuickTime Profile
|
@@ -30357,7 +30368,7 @@ for the official QuickTime specification.
|
|
30357
30368
|
The tags below are extracted from timed metadata in QuickTime and other
|
30358
30369
|
formats of video files when the ExtractEmbedded option is used. Although
|
30359
30370
|
most of these tags are combined into the single table below, ExifTool
|
30360
|
-
currently reads
|
30371
|
+
currently reads 107 different types of timed GPS metadata from video files.
|
30361
30372
|
|
30362
30373
|
Tag ID Tag Name Writable
|
30363
30374
|
------ -------- --------
|
@@ -31707,6 +31718,7 @@ the config file.
|
|
31707
31718
|
'mcvr' PreviewImage string
|
31708
31719
|
'meta' Meta QuickTime Meta
|
31709
31720
|
'modl' Model no
|
31721
|
+
'nail' ThumbnailTIFF no
|
31710
31722
|
'name' Name string
|
31711
31723
|
'perf' Performer string/
|
31712
31724
|
'pmcc' GarminSettings string
|
@@ -32775,9 +32787,11 @@ specification.
|
|
32775
32787
|
'E2' ParrotFollowMe Parrot FollowMe
|
32776
32788
|
'E3' ParrotAutomation Parrot Automation
|
32777
32789
|
'application/arcore-accel' ARCoreAccel Parrot ARCoreAccel
|
32790
|
+
'application/arcore-accel-0' ARCoreAccel0 Parrot ARCoreAccel0
|
32778
32791
|
'application/arcore-custom-event'
|
32779
32792
|
ARCoreCustom Parrot ARCoreCustom
|
32780
32793
|
'application/arcore-gyro' ARCoreGyro Parrot ARCoreGyro
|
32794
|
+
'application/arcore-gyro-0' ARCoreGyro0 Parrot ARCoreGyro0
|
32781
32795
|
'application/arcore-video-0' ARCoreVideo Parrot ARCoreVideo
|
32782
32796
|
|
32783
32797
|
=head3 Parrot V1 Tags
|
@@ -32915,6 +32929,14 @@ ARCore accelerometer data.
|
|
32915
32929
|
4 AccelerometerUnknown? no
|
32916
32930
|
5 Accelerometer no
|
32917
32931
|
|
32932
|
+
=head3 Parrot ARCoreAccel0 Tags
|
32933
|
+
|
32934
|
+
ARCore accelerometer data.
|
32935
|
+
|
32936
|
+
Index1 Tag Name Writable
|
32937
|
+
------ -------- --------
|
32938
|
+
9 Accelerometer no
|
32939
|
+
|
32918
32940
|
=head3 Parrot ARCoreCustom Tags
|
32919
32941
|
|
32920
32942
|
Index1 Tag Name Writable
|
@@ -32923,13 +32945,21 @@ ARCore accelerometer data.
|
|
32923
32945
|
|
32924
32946
|
=head3 Parrot ARCoreGyro Tags
|
32925
32947
|
|
32926
|
-
ARCore
|
32948
|
+
ARCore gyro data.
|
32927
32949
|
|
32928
32950
|
Index1 Tag Name Writable
|
32929
32951
|
------ -------- --------
|
32930
32952
|
4 GyroscopeUnknown? no
|
32931
32953
|
5 Gyroscope no
|
32932
32954
|
|
32955
|
+
=head3 Parrot ARCoreGyro0 Tags
|
32956
|
+
|
32957
|
+
ARCore gyro data.
|
32958
|
+
|
32959
|
+
Index1 Tag Name Writable
|
32960
|
+
------ -------- --------
|
32961
|
+
9 Gyroscope no
|
32962
|
+
|
32933
32963
|
=head3 Parrot ARCoreVideo Tags
|
32934
32964
|
|
32935
32965
|
Index1 Tag Name Writable
|
@@ -2434,6 +2434,8 @@ NoOverwrite: next if $isNew > 0;
|
|
2434
2434
|
} else {
|
2435
2435
|
my $fixedOffset = Get32u(\$newData, $offsets);
|
2436
2436
|
my $padToFixedOffset = $fixedOffset - ($newOffset + $dpos);
|
2437
|
+
# account for blocks that come before this (Pansonic DC-S1RM2, forum17319)
|
2438
|
+
$padToFixedOffset -= $$_[1] + $$_[2] foreach @imageData;
|
2437
2439
|
if ($padToFixedOffset < 0) {
|
2438
2440
|
$et->Error('Metadata too large to fit before fixed-offset image data');
|
2439
2441
|
} else {
|
@@ -1248,6 +1248,8 @@ ItemID2: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
1248
1248
|
my $base = ($$dirInfo{Base} || 0) + $raf->Tell() - $size;
|
1249
1249
|
my $dPos = 0;
|
1250
1250
|
my $hdrLen = $start;
|
1251
|
+
# handle case where known trailer is the payload of a "DontRead" box (eg. 'inst')
|
1252
|
+
$trailer = $$trailer[3] if $$tagInfo{DontRead} and $trailer and $base == $$trailer[1];
|
1251
1253
|
if ($$subdir{Base}) {
|
1252
1254
|
my $localBase = eval $$subdir{Base};
|
1253
1255
|
$dPos -= $localBase;
|
@@ -76,6 +76,8 @@ my %jpegMap = (
|
|
76
76
|
MetaIFD => 'Meta',
|
77
77
|
RMETA => 'APP5',
|
78
78
|
SEAL => ['APP8','APP9'], # (note: add 'IFD0' if this is a possibility)
|
79
|
+
AROT => 'APP10',
|
80
|
+
JUMBF => 'APP11',
|
79
81
|
Ducky => 'APP12',
|
80
82
|
Photoshop => 'APP13',
|
81
83
|
Adobe => 'APP14',
|
@@ -138,12 +140,12 @@ my %rawType = (
|
|
138
140
|
# 2) any dependencies must be added to %excludeGroups
|
139
141
|
my @delGroups = qw(
|
140
142
|
Adobe AFCP APP0 APP1 APP2 APP3 APP4 APP5 APP6 APP7 APP8 APP9 APP10 APP11 APP12
|
141
|
-
APP13 APP14 APP15 AudioKeys CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix
|
143
|
+
APP13 APP14 APP15 AROT AudioKeys CanonVRD CIFF Ducky EXIF ExifIFD File FlashPix
|
142
144
|
FotoStation GlobParamIFD GPS ICC_Profile IFD0 IFD1 Insta360 InteropIFD IPTC
|
143
|
-
ItemList iTunes JFIF Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft
|
144
|
-
|
145
|
-
|
146
|
-
|
145
|
+
ItemList iTunes JFIF Jpeg2000 JUMBF Keys MakerNotes Meta MetaIFD Microsoft MIE
|
146
|
+
MPF Nextbase NikonApp NikonCapture PDF PDF-update PhotoMechanic Photoshop PNG
|
147
|
+
PNG-pHYs PrintIM QuickTime RMETA RSRC SEAL SubIFD Trailer UserData VideoKeys
|
148
|
+
Vivo XML XML-* XMP XMP-*
|
147
149
|
);
|
148
150
|
# family 2 group names that we can delete
|
149
151
|
my @delGroup2 = qw(
|
@@ -1604,6 +1606,8 @@ SET: foreach $set (@setList) {
|
|
1604
1606
|
$$opts{Group} = $dstGrp if $dstGrp;
|
1605
1607
|
my @rtnVals = $self->SetNewValue($dstTag, $val, %$opts);
|
1606
1608
|
$rtnInfo{$dstTag} = $val if $rtnVals[0]; # tag was set successfully
|
1609
|
+
# return warning if any
|
1610
|
+
$rtnInfo{NextFreeTagKey(\%rtnInfo, 'Warning')} = $rtnVals[1] if $rtnVals[1];
|
1607
1611
|
next;
|
1608
1612
|
}
|
1609
1613
|
foreach $tag (@{$setMatches{$set}}) {
|
@@ -5736,6 +5740,8 @@ sub WriteJPEG($$)
|
|
5736
5740
|
$s =~ /^(Meta|META|Exif)\0\0/ and $dirName = 'Meta';
|
5737
5741
|
} elsif ($marker == 0xe5) {
|
5738
5742
|
$s =~ /^RMETA\0/ and $dirName = 'RMETA';
|
5743
|
+
} elsif ($marker == 0xea) {
|
5744
|
+
$s =~ /^AROT\0\0/ and $dirName = 'AROT';
|
5739
5745
|
} elsif ($marker == 0xeb) {
|
5740
5746
|
$s =~ /^JP/ and $dirName = 'JUMBF';
|
5741
5747
|
} elsif ($marker == 0xec) {
|
@@ -6644,7 +6650,12 @@ sub WriteJPEG($$)
|
|
6644
6650
|
$segType = 'SEAL';
|
6645
6651
|
$$delGroup{SEAL} and $del = 1;
|
6646
6652
|
}
|
6647
|
-
} elsif ($marker ==
|
6653
|
+
} elsif ($marker == 0xea) { # APP10 (AROT)
|
6654
|
+
if ($$segDataPt =~ /^AROT\0\0/) {
|
6655
|
+
$segType = 'AROT';
|
6656
|
+
$$delGroup{AROT} and $del = 1;
|
6657
|
+
}
|
6658
|
+
} elsif ($marker == 0xeb) { # APP11 (JUMBF)
|
6648
6659
|
if ($$segDataPt =~ /^JP/) {
|
6649
6660
|
$segType = 'JUMBF';
|
6650
6661
|
$$delGroup{JUMBF} and $del = 1;
|
@@ -50,7 +50,7 @@ use Image::ExifTool::Exif;
|
|
50
50
|
use Image::ExifTool::GPS;
|
51
51
|
require Exporter;
|
52
52
|
|
53
|
-
$VERSION = '3.
|
53
|
+
$VERSION = '3.74';
|
54
54
|
@ISA = qw(Exporter);
|
55
55
|
@EXPORT_OK = qw(EscapeXML UnescapeXML);
|
56
56
|
|
@@ -3830,7 +3830,7 @@ sub ParseXMPElement($$$;$$$$)
|
|
3830
3830
|
for (;;) {
|
3831
3831
|
my ($attr, $quote);
|
3832
3832
|
if (length($attrs) < 2000) { # (do it the easy way if attributes aren't stupid long)
|
3833
|
-
last unless $attrs =~ /(\S
|
3833
|
+
last unless $attrs =~ /(\S+?)\s*=\s*(['"])/g;
|
3834
3834
|
($attr, $quote) = ($1, $2);
|
3835
3835
|
} else {
|
3836
3836
|
# 13.23 patch to avoid capturing tons of garbage if XMP is corrupted
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
30
30
|
%static_vars $advFmtSelf);
|
31
31
|
|
32
|
-
$VERSION = '13.
|
32
|
+
$VERSION = '13.29';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
data/bin/lib/Image/ExifTool.pod
CHANGED
@@ -2547,17 +2547,17 @@ Here is a complete list of groups for each of these families:
|
|
2547
2547
|
|
2548
2548
|
=item Family 0 (Information Type):
|
2549
2549
|
|
2550
|
-
AAC, AFCP, AIFF, APE, APP0, APP1, APP11, APP12, APP13, APP14, APP15,
|
2551
|
-
APP3, APP4, APP5, APP6, APP7, APP8, APP9, ASF, Audible, Canon,
|
2552
|
-
Composite, DICOM, DjVu, DNG, Ducky, DV, EXE, EXIF, ExifTool, File,
|
2553
|
-
FLAC, Flash, FlashPix, FLIR, Font, FotoStation, GeoTiff, GIF, GIMP,
|
2554
|
-
GoPro, H264, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG,
|
2555
|
-
JSON, JUMBF, Leaf, LNK, Lytro, M2TS, MakerNotes, Matroska, Meta,
|
2556
|
-
MISB, MNG, MOI, MPC, MPEG, MPF, MXF, Ogg, OpenEXR, Opus, Palm,
|
2557
|
-
Parrot, PDF, PhotoCD, PhotoMechanic, Photoshop, PICT, PLIST,
|
2558
|
-
PostScript, PrintIM, Protobuf, PSP, QuickTime, Radiance, RAF, Rawzor,
|
2559
|
-
Red, RIFF, RSRC, RTF, SigmaRaw, Sony, Stim, SVG, Theora, Torrent,
|
2560
|
-
VCard, Vorbis, WTV, XML, XMP, ZIP
|
2550
|
+
AAC, AFCP, AIFF, APE, APP0, APP1, APP10, APP11, APP12, APP13, APP14, APP15,
|
2551
|
+
APP2, APP3, APP4, APP5, APP6, APP7, APP8, APP9, ASF, Audible, Canon,
|
2552
|
+
CanonVRD, Composite, DICOM, DjVu, DNG, Ducky, DV, EXE, EXIF, ExifTool, File,
|
2553
|
+
FITS, FLAC, Flash, FlashPix, FLIR, Font, FotoStation, GeoTiff, GIF, GIMP,
|
2554
|
+
GM, GoPro, H264, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG,
|
2555
|
+
Jpeg2000, JSON, JUMBF, Leaf, LNK, Lytro, M2TS, MakerNotes, Matroska, Meta,
|
2556
|
+
MIE, MIFF, MISB, MNG, MOI, MPC, MPEG, MPF, MXF, Ogg, OpenEXR, Opus, Palm,
|
2557
|
+
PanasonicRaw, Parrot, PDF, PhotoCD, PhotoMechanic, Photoshop, PICT, PLIST,
|
2558
|
+
PNG, PostScript, PrintIM, Protobuf, PSP, QuickTime, Radiance, RAF, Rawzor,
|
2559
|
+
Real, Red, RIFF, RSRC, RTF, SigmaRaw, Sony, Stim, SVG, Theora, Torrent,
|
2560
|
+
Trailer, VCard, Vorbis, WTV, XML, XMP, ZIP
|
2561
2561
|
|
2562
2562
|
=item Family 1 (Specific Location):
|
2563
2563
|
|