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.
@@ -11,7 +11,7 @@ package Image::ExifTool::Plot;
11
11
  use strict;
12
12
  use vars qw($VERSION);
13
13
 
14
- $VERSION = '1.02';
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 = int($$self{multi} || 0);
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 = $multi ? scalar(@$name) - $scat : 1;
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
- push @{$$self{Name}}, $$self{SaveName}[$scat + $plotNum];
308
- my $dat = $$self{Data}{$$self{Name}[$scat]};
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 (@$dat) {
311
- defined or next;
312
- defined $min or $min = $max = $_, next;
313
- $min > $_ and $min = $_;
314
- $max < $_ and $max = $_;
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 - flag to draw multiple plots, one for each dataset
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.15';
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
- if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) {
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 104 different types of timed GPS metadata from video files.
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 INSP files) (ref PH)
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 $fileEnd = $raf->Tell();
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, $fileEnd + $epos, $len));
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, 369 => 0x12a },
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 28440 tags, with 17667 unique tag names.
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
- HDRGainCurve no
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 AFPoints int8u[41]~
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 104 different types of timed GPS metadata from video files.
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 accelerometer data.
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
- MIE MPF Nextbase NikonApp NikonCapture PDF PDF-update PhotoMechanic
145
- Photoshop PNG PNG-pHYs PrintIM QuickTime RMETA RSRC SEAL SubIFD Trailer
146
- UserData VideoKeys Vivo XML XML-* XMP XMP-*
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 == 0xeb) { # APP10 (JUMBF)
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.73';
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+)\s*=\s*(['"])/g;
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
@@ -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.27';
32
+ $VERSION = '13.29';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -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, APP2,
2551
- APP3, APP4, APP5, APP6, APP7, APP8, APP9, ASF, Audible, Canon, CanonVRD,
2552
- Composite, DICOM, DjVu, DNG, Ducky, DV, EXE, EXIF, ExifTool, File, FITS,
2553
- FLAC, Flash, FlashPix, FLIR, Font, FotoStation, GeoTiff, GIF, GIMP, GM,
2554
- GoPro, H264, HTML, ICC_Profile, ID3, IPTC, ISO, ITC, JFIF, JPEG, Jpeg2000,
2555
- JSON, JUMBF, Leaf, LNK, Lytro, M2TS, MakerNotes, Matroska, Meta, MIE, MIFF,
2556
- MISB, MNG, MOI, MPC, MPEG, MPF, MXF, Ogg, OpenEXR, Opus, Palm, PanasonicRaw,
2557
- Parrot, PDF, PhotoCD, PhotoMechanic, Photoshop, PICT, PLIST, PNG,
2558
- PostScript, PrintIM, Protobuf, PSP, QuickTime, Radiance, RAF, Rawzor, Real,
2559
- Red, RIFF, RSRC, RTF, SigmaRaw, Sony, Stim, SVG, Theora, Torrent, Trailer,
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
 
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 13.27
3
+ Version: 13.29
4
4
  Release: 1
5
5
  License: Artistic/GPL
6
6
  Group: Development/Libraries/Perl
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExiftoolVendored
4
- VERSION = Gem::Version.new('13.27.0')
4
+ VERSION = Gem::Version.new('13.29.0')
5
5
  end