exiftool_vendored 12.54.0 → 12.55.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 556931dee6ac163b8e4b8249baaba174050a2069510b368c6d8669f6f60dd60e
4
- data.tar.gz: e057290ad28b94817a7cef2f6379a9a8cf23fddcbc60b04129dc02858983cc82
3
+ metadata.gz: '08dd80f8e21b9b1cdb9c94d397452030151b485db6f08e25fdb408a4eade1052'
4
+ data.tar.gz: 6db554ec80bedd0d2022bd019cba25f5f7e61862bec88b00659790edbe123952
5
5
  SHA512:
6
- metadata.gz: e6d7aae1216168a7f041da0e14b274808ba4866dcfee8f36106428b994d8fb87bdd4d6025da7f0c692704d8a097a2287368cd7ff0be4078d43f0e6614605af0a
7
- data.tar.gz: 402e27906748e39a5246a1edf5dba1b42584bdd80519ea3db1aa69eb73b77980d9ab2d8fb8efd400eb13736c1c60d9213d2fe5a736da48e54ff26609ba5ee8df
6
+ metadata.gz: 64da9fcb6865573609dfb79388711aa9d74bd24718a9d076846158d74ffd962bb956a722671dca51b406de6581b9b2220528b09971c2ebe8f3afc0b1a2b3f281
7
+ data.tar.gz: 9601c888737e9e4c31f5edaa1b2fba847bbdb8cf2b4dc20013522ee0045c58736491a0d9e0b715f09a1113e23fd8a4672278292f45a6ed07f45507fa50a84bb6
data/bin/Changes CHANGED
@@ -7,13 +7,25 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.50. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Jan. 17, 2023 - Version 12.55
11
+
12
+ - Added support for geotagging from FlightAware KML files
13
+ - Decode two more types of timed GPS from MOV/MP4 videos (66 types now)
14
+ - Decode a few new Nikon tags (thanks Warren Hatch)
15
+ - Decode a new Samsung HEIC tag
16
+ - Decode FujiFilm RollAngle
17
+ - Fixed bug where FlatName property wasn't working properly for some
18
+ user-defined structure tags
19
+
10
20
  Jan. 6, 2023 - Version 12.54
11
21
 
12
- - Increased precision of Sony FocusDistance2 conversion
13
22
  - Decode a number of new Apple tags (thanks Frank Rupprecht)
14
- - Fixed bug writing QuickTime-format files which have a zero-sized mdat (ie.
15
- media data extends to end of file) which would cause an incorrect mdat size
16
- to be written
23
+ - Increased precision of Sony FocusDistance2 conversion
24
+ - Fixed problem where GPSAltitude wasn't being set when geotagging from KML
25
+ files
26
+ - Fixed bug writing HEIC/AVIF files which have a zero-sized mdat (ie. media
27
+ data extends to end of file) which could cause an incorrect mdat size to be
28
+ written
17
29
 
18
30
  Jan. 4, 2023 - Version 12.53
19
31
 
data/bin/META.json CHANGED
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.54"
50
+ "version" : "12.55"
51
51
  }
data/bin/META.yml CHANGED
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.54
31
+ version: 12.55
data/bin/README CHANGED
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
107
107
  terminal window to extract and run ExifTool:
108
108
 
109
109
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.54.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.54
110
+ gzip -dc Image-ExifTool-12.55.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.55
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.54';
14
+ my $version = '12.55';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -5477,7 +5477,7 @@ with this command:
5477
5477
 
5478
5478
  produces output like this:
5479
5479
 
5480
- -- Generated by ExifTool 12.54 --
5480
+ -- Generated by ExifTool 12.55 --
5481
5481
  File: a.jpg - 2003:10:31 15:44:19
5482
5482
  (f/5.6, 1/60s, ISO 100)
5483
5483
  File: b.jpg - 2006:05:23 11:57:38
@@ -6326,9 +6326,9 @@ seconds behind GPS:
6326
6326
 
6327
6327
  exiftool -geosync=+1:20 -geotag a.log DIR
6328
6328
 
6329
- Advanced C<Geosync> features allow a linear time drift correction and
6330
- synchronization from previously geotagged images. See "geotag.html" in the
6331
- full ExifTool distribution for more information.
6329
+ Advanced C<Geosync> features allow a piecewise linear time drift correction
6330
+ and synchronization from previously geotagged images. See "geotag.html" in
6331
+ the full ExifTool distribution for more information.
6332
6332
 
6333
6333
  Multiple B<-geotag> options may be used to concatenate GPS track log data.
6334
6334
  Also, a single B<-geotag> option may be used to load multiple track log
@@ -1,5 +1,5 @@
1
1
  #------------------------------------------------------------------------------
2
- # File: kml.fmt
2
+ # File: kml_track.fmt
3
3
  #
4
4
  # Description: Example ExifTool print format file for generating a
5
5
  # track in Google Earth KML format from a collection of
@@ -7,11 +7,11 @@
7
7
  #
8
8
  # Usage: From a collection of images:
9
9
  #
10
- # exiftool -p kml.fmt -r DIR [...] > out.kml
10
+ # exiftool -p kml_track.fmt -r DIR [...] > out.kml
11
11
  #
12
12
  # From video files:
13
13
  #
14
- # exiftool -p kml.fmt -ee3 FILEorDIR [...] > out.kml
14
+ # exiftool -p kml_track.fmt -ee3 FILEorDIR [...] > out.kml
15
15
  #
16
16
  # Requires: ExifTool version 10.41 or later
17
17
  #
@@ -238,7 +238,7 @@ types of meta information. To determine a tag name, either consult this
238
238
  documentation or run C<exiftool -s> on a file containing the information in
239
239
  question.
240
240
 
241
- I<(This documentation is the result of years of research, testing and
241
+ I<(This documentation is the result of decades of research, testing and
242
242
  reverse engineering, and is the most complete metadata tag list available
243
243
  anywhere on the internet. It is provided not only for ExifTool users, but
244
244
  more importantly as a public service to help augment the collective
@@ -31,7 +31,7 @@ use vars qw($VERSION);
31
31
  use Image::ExifTool qw(:DataAccess :Utils);
32
32
  use Image::ExifTool::Exif;
33
33
 
34
- $VERSION = '1.85';
34
+ $VERSION = '1.86';
35
35
 
36
36
  sub ProcessFujiDir($$$);
37
37
  sub ProcessFaceRec($$$);
@@ -798,6 +798,7 @@ my %faceCategories = (
798
798
  },
799
799
  0x1447 => { Name => 'FujiModel', Writable => 'string' },
800
800
  0x1448 => { Name => 'FujiModel2', Writable => 'string' },
801
+ 0x144d => { Name => 'RollAngle', Writable => 'rational64s' }, #forum14319
801
802
  0x3803 => { #forum10037
802
803
  Name => 'VideoRecordingMode',
803
804
  Groups => { 2 => 'Video' },
@@ -29,7 +29,7 @@ use vars qw($VERSION);
29
29
  use Image::ExifTool qw(:Public);
30
30
  use Image::ExifTool::GPS;
31
31
 
32
- $VERSION = '1.69';
32
+ $VERSION = '1.70';
33
33
 
34
34
  sub JITTER() { return 2 } # maximum time jitter
35
35
 
@@ -210,7 +210,7 @@ sub LoadTrackLog($$;$)
210
210
  my $fix = { };
211
211
  my $csvDelim = $et->Options('CSVDelim');
212
212
  $csvDelim = ',' unless defined $csvDelim;
213
- my (@saveFix, $timeSpan);
213
+ my (@saveFix, @saveTime, $timeSpan);
214
214
  for (;;) {
215
215
  $raf->ReadLine($_) or last;
216
216
  # determine file format
@@ -357,8 +357,13 @@ sub LoadTrackLog($$;$)
357
357
  }
358
358
  # read KML "Point" coordinates
359
359
  @$fix{'lon','lat','alt'} = split ',', $1;
360
+ $$has{alt} = 1 if $$fix{alt};
360
361
  } else {
361
- $$fix{$tag} = $1;
362
+ if ($tok eq 'when' and $$fix{'time'}) {
363
+ push @saveTime, $1; # flightaware KML stores times in array
364
+ } else {
365
+ $$fix{$tag} = $1;
366
+ }
362
367
  if ($isOrient{$tag}) {
363
368
  $$has{orient} = 1;
364
369
  } elsif ($tag eq 'alt') {
@@ -375,7 +380,11 @@ sub LoadTrackLog($$;$)
375
380
  $td = 1;
376
381
  }
377
382
  # validate and store GPS fix
378
- next unless defined $$fix{lat} and defined $$fix{lon} and $$fix{'time'};
383
+ next unless defined $$fix{lat} and defined $$fix{lon};
384
+ unless (defined $$fix{'time'}) {
385
+ next unless @saveTime;
386
+ $$fix{'time'} = shift @saveTime; # get next time in flightaware KML list
387
+ }
379
388
  unless ($$fix{lat} =~ /^[+-]?\d+\.?\d*/ and $$fix{lon} =~ /^[+-]?\d+\.?\d*/) {
380
389
  $e0 or $et->VPrint(0, "Coordinate format error in $from\n"), $e0 = 1;
381
390
  next;
@@ -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.13';
18
+ $VERSION = '1.14';
19
19
 
20
20
  sub HandleStruct($$;$$$$);
21
21
 
@@ -708,11 +708,11 @@ my %uidInfo = (
708
708
  );
709
709
 
710
710
  # standardized tag names (ref 2)
711
- %Image::ExifTool::Matroska::Tags = (
711
+ %Image::ExifTool::Matroska::StdTag = (
712
712
  GROUPS => { 2 => 'Video' },
713
713
  VARS => { LONG_TAGS => 1 },
714
714
  NOTES => q{
715
- Standardized Matroska tags (see
715
+ Standardized Matroska tags, stored in a SimpleTag structure (see
716
716
  L<https://www.matroska.org/technical/tagging.html>).
717
717
  },
718
718
  ORIGINAL => 'Original', # struct
@@ -826,7 +826,7 @@ sub HandleStruct($$;$$$$)
826
826
  {
827
827
  local $_;
828
828
  my ($et, $struct, $pid, $pname, $lang, $ctry) = @_;
829
- my $tagTbl = GetTagTable('Image::ExifTool::Matroska::Tags');
829
+ my $tagTbl = GetTagTable('Image::ExifTool::Matroska::StdTag');
830
830
  my $tag = $$struct{TagName};
831
831
  my $tagInfo = $$tagTbl{$tag};
832
832
  # create tag if necessary
@@ -64,7 +64,7 @@ use Image::ExifTool::Exif;
64
64
  use Image::ExifTool::GPS;
65
65
  use Image::ExifTool::XMP;
66
66
 
67
- $VERSION = '4.16';
67
+ $VERSION = '4.17';
68
68
 
69
69
  sub LensIDConv($$$);
70
70
  sub ProcessNikonAVI($$$);
@@ -4292,10 +4292,10 @@ my %base64coord = (
4292
4292
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4293
4293
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
4294
4294
  },
4295
- Format => 'int16u',
4295
+ Format => 'int16u', # (decodes same byte as 0x2f)
4296
4296
  },
4297
4297
  0x2f => { #28 (Z7) Still photography range 1-17 for the 493 point Z7 (arranged in a 29x17 grid. Center at x=16, y=10).
4298
- Name => 'AFFocusPointXPosition',
4298
+ Name => 'FocusPositionHorizontal',
4299
4299
  Condition => q{
4300
4300
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4301
4301
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
@@ -4309,7 +4309,7 @@ my %base64coord = (
4309
4309
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4310
4310
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
4311
4311
  },
4312
- Format => 'int16u',
4312
+ Format => 'int16u', # (decodes same byte as 0x31)
4313
4313
  },{ #PH (D500, see forum11190)
4314
4314
  Name => 'AFPointsInFocus',
4315
4315
  Condition => '$$self{AFInfo2Version} eq "0101" and $$self{PhaseDetectAF} == 7',
@@ -4322,7 +4322,7 @@ my %base64coord = (
4322
4322
  },
4323
4323
  ],
4324
4324
  0x31 => { #28 (Z7)
4325
- Name => 'AFFocusPointYPosition',
4325
+ Name => 'FocusPositionVertical',
4326
4326
  Condition => q{
4327
4327
  $$self{ContrastDetectAF} == 2 and $$self{AFInfo2Version} =~ /^03/ or
4328
4328
  $$self{ContrastDetectAF} == 1 and $$self{AFInfo2Version} =~ /^0301/
@@ -4452,6 +4452,21 @@ my %base64coord = (
4452
4452
  Writable => 0,
4453
4453
  RawConv => '$$self{AFInfo2Version} = $val',
4454
4454
  },
4455
+ 5 => { #28
4456
+ Name => 'AFAreaMode', #reflects the mode active when the shutter is tripped, not the position of the Focus Mode button (which is recorded in MenuSettingsZ9 tag also named AfAreaMode)
4457
+ PrintConv => {
4458
+ 192 => 'Pinpoint',
4459
+ 193 => 'Single',
4460
+ 195 => 'Wide (S)',
4461
+ 196 => 'Wide (L)',
4462
+ 197 => 'Auto',
4463
+ 204 => 'Dynamic Area (S)',
4464
+ 205 => 'Dynamic Area (M)',
4465
+ 206 => 'Dynamic Area (L)',
4466
+ 207 => '3D-tracking',
4467
+ 208 => 'Wide (C1/C2)',
4468
+ },
4469
+ },
4455
4470
  0x3e => {
4456
4471
  Name => 'AFImageWidth',
4457
4472
  Format => 'int16u',
@@ -4460,6 +4475,11 @@ my %base64coord = (
4460
4475
  Name => 'AFImageHeight',
4461
4476
  Format => 'int16u',
4462
4477
  },
4478
+ 0x42 => { #28
4479
+ Name => 'AFAreaXPosition', #top left image corner is the origin
4480
+ Format => 'int16u', # (decodes same byte as 0x43)
4481
+ RawConv => '$val ? $val : undef',
4482
+ },
4463
4483
  0x43 => {
4464
4484
  Name => 'FocusPositionHorizontal',
4465
4485
  Notes => q{
@@ -4471,6 +4491,11 @@ my %base64coord = (
4471
4491
  # (the 11R (5) position is not used, for a total of 29 columns, ref AlbertShan email)
4472
4492
  PrintConv => sub { my ($val) = @_; PrintAFPointsLeftRight($val, 29); },
4473
4493
  },
4494
+ 0x44 => { #28
4495
+ Name => 'AFAreaYPosition',
4496
+ Format => 'int16u', # (decodes same byte as 0x45)
4497
+ RawConv => '$val ? $val : undef',
4498
+ },
4474
4499
  0x45 => {
4475
4500
  Name => 'FocusPositionVertical',
4476
4501
  # (the 6U (4) and 2D (12) are not used, for a total of 17 rows, ref AlbertShan email)
@@ -47,7 +47,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
47
47
  use Image::ExifTool::Exif;
48
48
  use Image::ExifTool::GPS;
49
49
 
50
- $VERSION = '2.82';
50
+ $VERSION = '2.83';
51
51
 
52
52
  sub ProcessMOV($$;$);
53
53
  sub ProcessKeys($$$);
@@ -62,6 +62,7 @@ sub Process_mebx($$$);
62
62
  sub Process_3gf($$$);
63
63
  sub Process_gps0($$$);
64
64
  sub Process_gsen($$$);
65
+ sub ProcessKenwood($$$);
65
66
  sub ProcessRIFFTrailer($$$);
66
67
  sub ProcessTTAD($$$);
67
68
  sub ProcessNMEA($$$);
@@ -652,10 +653,17 @@ my %eeBox2 = (
652
653
  Name => 'HTCInfo',
653
654
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::HTCInfo' },
654
655
  },
655
- udta => {
656
- Name => 'UserData',
656
+ udta => [{
657
+ Name => 'KenwoodData',
658
+ Condition => '$$valPt =~ /^VIDEOUUUUUUUUUUUUUUUUUUUUUU/',
659
+ SubDirectory => {
660
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
661
+ ProcessProc => \&ProcessKenwood,
662
+ },
663
+ },{
664
+ Name => 'FLIRData',
657
665
  SubDirectory => { TagTable => 'Image::ExifTool::FLIR::UserData' },
658
- },
666
+ }],
659
667
  thum => { #PH
660
668
  Name => 'ThumbnailImage',
661
669
  Groups => { 2 => 'Preview' },
@@ -763,6 +771,13 @@ my %eeBox2 = (
763
771
  SubDirectory => { TagTable => 'Image::ExifTool::Samsung::Trailer' },
764
772
  },
765
773
  # 'samn'? - seen in Vantrue N2S sample video
774
+ mpvd => {
775
+ Name => 'MotionPhotoVideo',
776
+ Notes => 'MP4-format video saved in Samsung motion-photo HEIC images.',
777
+ Binary => 1,
778
+ # note that this may be written and/or deleted, but can't currently be added back again
779
+ Writable => 1,
780
+ },
766
781
  );
767
782
 
768
783
  # stuff seen in 'skip' atom (70mai Pro Plus+ MP4 videos)
@@ -102,7 +102,7 @@ my %insvLimit = (
102
102
  The tags below are extracted from timed metadata in QuickTime and other
103
103
  formats of video files when the ExtractEmbedded option is used. Although
104
104
  most of these tags are combined into the single table below, ExifTool
105
- currently reads 63 different formats of timed GPS metadata from video files.
105
+ currently reads 66 different formats of timed GPS metadata from video files.
106
106
  },
107
107
  VARS => { NO_ID => 1 },
108
108
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -880,9 +880,10 @@ sub HandleTextTags($$$)
880
880
  #------------------------------------------------------------------------------
881
881
  # Process subtitle 'text'
882
882
  # Inputs: 0) ExifTool ref, 1) data ref or dirInfo ref, 2) tag table ref
883
- sub Process_text($$$)
883
+ # 3) flag set if text was already stored
884
+ sub Process_text($$$;$)
884
885
  {
885
- my ($et, $dataPt, $tagTbl) = @_;
886
+ my ($et, $dataPt, $tagTbl, $handled) = @_;
886
887
  my %tags;
887
888
 
888
889
  return if $$et{NoMoreTextDecoding};
@@ -938,6 +939,16 @@ sub Process_text($$$)
938
939
  $tags{GPSSatellites} = $10 if defined $10;
939
940
  $tags{GPSDOP} = $11 if defined $11;
940
941
  $tags{GPSAltitude} = $12 if defined $12;
942
+ # ($G and $GS are ref https://exiftool.org/forum/index.php?topic=13115.msg71743#msg71743)
943
+ } elsif ($tag eq 'G' and $dat =~ /:(\d{4})-(\d{2})-(\d{2}) (\d{2}:\d{2}:\d{2})-([NS])(\d+\.\d+)-([EW])(\d+\.\d+)-S(\d+)/) {
944
+ $tags{GPSDateTime} = "$1:$2:$3 $4";
945
+ $tags{GPSLatitude} = $6 * ($5 eq 'S' ? -1 : 1);
946
+ $tags{GPSLongitude} = $8 * ($7 eq 'W' ? -1 : 1);
947
+ $tags{GPSSpeed} = $9;
948
+ } elsif ($tag eq 'GS' and $dat =~ /:([-+]?\d+),([-+]?\d+),([-+]?\d+)/) {
949
+ # scale and re-arrange to match gsensor output from Win app (forum11665)
950
+ my @acc = ( ($2+2432)/1000, ($3 + 361)/1000, ($1-3708)/1000 );
951
+ $tags{Accelerometer} = "@acc";
941
952
  } elsif ($tag eq 'BEGINGSENSOR' and $dat =~ /^:([-+]\d+\.\d+):([-+]\d+\.\d+):([-+]\d+\.\d+)/) {
942
953
  $tags{Accelerometer} = "$1 $2 $3";
943
954
  } elsif ($tag eq 'TIME' and $dat =~ /^:(\d+)/) {
@@ -946,7 +957,7 @@ sub Process_text($$$)
946
957
  $tags{Text} = $dat if length $dat;
947
958
  $tags{done} = 1;
948
959
  } elsif ($tag ne 'END') {
949
- $tags{Text} = "\$$tag$dat";
960
+ $tags{Text} = "\$$tag$dat" unless $handled;
950
961
  }
951
962
  }
952
963
  %tags and HandleTextTags($et, $tagTbl, \%tags), return;
@@ -1234,6 +1245,7 @@ Sample: for ($i=0; ; ) {
1234
1245
  ($type eq 'sbtl' and $metaFormat eq 'tx3g' and $buff =~ /^..PNDM/s))
1235
1246
  {
1236
1247
 
1248
+ my $handled;
1237
1249
  FoundSomething($et, $tagTbl, $time[$i], $dur[$i]);
1238
1250
  unless ($buff =~ /^\$BEGIN/) {
1239
1251
  # remove ending "encd" box if it exists
@@ -1273,9 +1285,10 @@ Sample: for ($i=0; ; ) {
1273
1285
  }
1274
1286
  unless (defined $val) {
1275
1287
  $et->HandleTag($tagTbl, Text => $buff); # just store any other text
1288
+ $handled = 1;
1276
1289
  }
1277
1290
  }
1278
- Process_text($et, \$buff, $tagTbl);
1291
+ Process_text($et, \$buff, $tagTbl, $handled);
1279
1292
 
1280
1293
  } elsif ($processByMetaFormat{$type}) {
1281
1294
 
@@ -1371,6 +1384,7 @@ sub ProcessFreeGPS($$$)
1371
1384
 
1372
1385
  if (substr($$dataPt,18,8) eq "\xaa\xaa\xf2\xe1\xf0\xee\x54\x54") {
1373
1386
 
1387
+ $debug and $et->FoundTag(GPSType => '1A');
1374
1388
  # (this is very similar to the encrypted text format)
1375
1389
  # decode encrypted ASCII-based GPS (DashCam Azdome GS63H, ref 5)
1376
1390
  # header looks like this in my sample:
@@ -1425,10 +1439,10 @@ sub ProcessFreeGPS($$$)
1425
1439
  } elsif ($buf2 =~ /^.{173}([-+]\d{3})([-+]\d{3})([-+]\d{3})/s) { # (Azdome)
1426
1440
  @acc = ($1/100, $2/100, $3/100);
1427
1441
  }
1428
- $debug and $et->FoundTag(GPSType => '1A');
1429
1442
 
1430
1443
  } elsif ($$dataPt =~ /^.{52}(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/s) {
1431
1444
 
1445
+ $debug and $et->FoundTag(GPSType => '1B');
1432
1446
  # decode NMEA-format GPS data (NextBase 512GW dashcam, ref PH)
1433
1447
  # header looks like this in my sample:
1434
1448
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 40 01 00 00 [....freeGPS @...]
@@ -1454,10 +1468,10 @@ sub ProcessFreeGPS($$$)
1454
1468
  # change to signed integer and divide by 256
1455
1469
  map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1456
1470
  }
1457
- $debug and $et->FoundTag(GPSType => '1B');
1458
1471
 
1459
1472
  } elsif ($$dataPt =~ /^.{37}\0\0\0A([NS])([EW])/s) {
1460
1473
 
1474
+ $debug and $et->FoundTag(GPSType => '1C');
1461
1475
  # decode freeGPS from ViofoA119v3 dashcam (similar to Novatek GPS format)
1462
1476
  # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1463
1477
  # 0010: 05 00 00 00 2f 00 00 00 03 00 00 00 13 00 00 00 [..../...........]
@@ -1489,10 +1503,10 @@ sub ProcessFreeGPS($$$)
1489
1503
  map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 256 } @acc;
1490
1504
  }
1491
1505
  SetByteOrder('MM');
1492
- $debug and $et->FoundTag(GPSType => '1C');
1493
1506
 
1494
1507
  } elsif ($$dataPt =~ /^.{21}\0\0\0A([NS])([EW])/s) {
1495
1508
 
1509
+ $debug and $et->FoundTag(GPSType => '1D');
1496
1510
  # also decode 'gpmd' chunk from Kingslim D4 dashcam videos
1497
1511
  # 0000: 0a 00 00 00 0b 00 00 00 07 00 00 00 e5 07 00 00 [................]
1498
1512
  # 0010: 06 00 00 00 03 00 00 00 41 4e 57 31 91 52 83 45 [........ANW1.R.E]
@@ -1518,10 +1532,10 @@ sub ProcessFreeGPS($$$)
1518
1532
  $acc[1] = GetFloat($dataPt, 0x30);
1519
1533
  $acc[2] = GetFloat($dataPt, 0x34);
1520
1534
  SetByteOrder('MM');
1521
- $debug and $et->FoundTag(GPSType => '1D');
1522
1535
 
1523
1536
  } elsif ($$dataPt =~ /^.{60}A\0{3}.{4}([NS])\0{3}.{4}([EW])\0{3}/s) {
1524
1537
 
1538
+ $debug and $et->FoundTag(GPSType => '1E');
1525
1539
  # decode freeGPS from Akaso dashcam
1526
1540
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 60 00 00 00 [....freeGPS `...]
1527
1541
  # 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
@@ -1539,10 +1553,10 @@ sub ProcessFreeGPS($$$)
1539
1553
  $trk = GetFloat($dataPt, 0x54) + 180; # (why is this off by 180?)
1540
1554
  $trk -= 360 if $trk >= 360;
1541
1555
  SetByteOrder('MM');
1542
- $debug and $et->FoundTag(GPSType => '1E');
1543
1556
 
1544
1557
  } elsif ($$dataPt =~ /^.{60}4W`b]S</s and length($$dataPt) >= 140) {
1545
1558
 
1559
+ $debug and $et->FoundTag(GPSType => '1F');
1546
1560
  # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 01 00 00 [..@.freeGPS ....]
1547
1561
  # 0010: 5a 58 53 42 4e 58 59 53 00 00 00 00 00 00 00 00 [ZXSBNXYS........]
1548
1562
  # 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
@@ -1557,10 +1571,10 @@ sub ProcessFreeGPS($$$)
1557
1571
  $yr += ($yr >= 70 ? 1900 : 2000);
1558
1572
  $spd = $9 * $knotsToKph if length $9;
1559
1573
  $trk = $10 if length $10;
1560
- $debug and $et->FoundTag(GPSType => '1F');
1561
1574
 
1562
1575
  } elsif ($$dataPt =~ /^.{64}[\x01-\x0c]\0{3}[\x01-\x1f]\0{3}A[NS][EW]\0{5}/s) {
1563
1576
 
1577
+ $debug and $et->FoundTag(GPSType => '1G');
1564
1578
  # Akaso V1 dascham
1565
1579
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
1566
1580
  # 0010: 59 6e 64 41 6b 61 73 6f 43 61 72 00 00 00 00 00 [YndAkasoCar.....]
@@ -1601,10 +1615,10 @@ sub ProcessFreeGPS($$$)
1601
1615
 
1602
1616
  SetByteOrder('MM');
1603
1617
  #my $serialNum = substr($$dataPt, 0x68, 20);
1604
- $debug and $et->FoundTag(GPSType => '1G');
1605
1618
 
1606
1619
  } elsif ($$dataPt =~ /^.{12}\xac\0\0\0.{44}(.{72})/s) {
1607
1620
 
1621
+ $debug and $et->FoundTag(GPSType => '1H');
1608
1622
  # EACHPAI dash cam
1609
1623
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 ac 00 00 00 [....freeGPS ....]
1610
1624
  # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
@@ -1624,10 +1638,10 @@ sub ProcessFreeGPS($$$)
1624
1638
  # bytes 7-12 are the timestamp in ASCII HHMMSS after xor-ing with 0x70
1625
1639
  substr($time,7,6) = pack 'C*', map { $_ ^= 0x70 } unpack 'C*', substr($time,7,6);
1626
1640
  # (other values are currently unknown)
1627
- $debug and $et->FoundTag(GPSType => '1H');
1628
1641
 
1629
1642
  } elsif ($$dataPt =~ /^.{64}A([NS])([EW])\0/s) {
1630
1643
 
1644
+ $debug and $et->FoundTag(GPSType => '1I');
1631
1645
  # Vantrue S1 dashcam
1632
1646
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 00 00 00 [....freeGPS x...]
1633
1647
  # 0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
@@ -1650,10 +1664,10 @@ sub ProcessFreeGPS($$$)
1650
1664
  $trk = GetFloat($dataPt, 0x68);
1651
1665
  $alt = GetFloat($dataPt, 0x6c);
1652
1666
  SetByteOrder('MM');
1653
- $debug and $et->FoundTag(GPSType => '1I');
1654
1667
 
1655
1668
  } else {
1656
1669
 
1670
+ $debug and $et->FoundTag(GPSType => '1J');
1657
1671
  # decode binary GPS format (Viofo A119S, ref 2)
1658
1672
  # header looks like this in my sample:
1659
1673
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
@@ -1687,7 +1701,6 @@ sub ProcessFreeGPS($$$)
1687
1701
  $yr += 2000 if $yr < 2000;
1688
1702
  $spd *= $knotsToKph; # convert speed to km/h
1689
1703
  # ($trk is not confirmed; may be GPSImageDirection, ref PH)
1690
- $debug and $et->FoundTag(GPSType => '1J');
1691
1704
  }
1692
1705
  #
1693
1706
  # save tag values extracted by above code
@@ -1734,6 +1747,7 @@ sub ProcessFreeGPS2($$$)
1734
1747
 
1735
1748
  if (substr($$dataPt,0x45,3) eq 'ATC') {
1736
1749
 
1750
+ $debug and $et->FoundTag(GPSType => '2A');
1737
1751
  # header looks like this: (sample 1)
1738
1752
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 38 06 00 00 [....freeGPS 8...]
1739
1753
  # 0010: 49 51 53 32 30 31 33 30 33 30 36 42 00 00 00 00 [IQS20130306B....]
@@ -1841,11 +1855,11 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1841
1855
  }
1842
1856
  # save position of most recent record (needed when parsing the next freeGPS block)
1843
1857
  $$et{FreeGPS2}{RecentRecPos} = $lastRecPos;
1844
- $debug and $et->FoundTag(GPSType => '2A');
1845
1858
  return 1;
1846
1859
 
1847
1860
  } elsif ($$dataPt =~ /^.{60}A\0.{10}([NS])\0.{14}([EW])\0/s) {
1848
1861
 
1862
+ $debug and $et->FoundTag(GPSType => '2B');
1849
1863
  # header looks like this in my sample:
1850
1864
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 08 01 00 00 [....freeGPS ....]
1851
1865
  # 0010: 32 30 31 33 30 38 31 35 2e 30 31 00 00 00 00 00 [20130815.01.....]
@@ -1873,7 +1887,6 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1873
1887
  $lon = GetDouble($dataPt, 0x50);
1874
1888
  $spd = GetDouble($dataPt, 0x60) * $knotsToKph;
1875
1889
  $trk = GetDouble($dataPt, 0x68);
1876
- $debug and $et->FoundTag(GPSType => '2B');
1877
1890
 
1878
1891
  } elsif ($$dataPt =~ /^.{72}A([NS])([EW])/s) {
1879
1892
 
@@ -1900,6 +1913,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1900
1913
  ($latRef, $lonRef) = ($1, $2);
1901
1914
  ($hr,$min,$sec,$yr,$mon,$day) = unpack('x48V6', $$dataPt);
1902
1915
  if (substr($$dataPt, 16, 3) eq 'IQS') {
1916
+ $debug and $et->FoundTag(GPSType => '2C');
1903
1917
  # Type 3b (ref PH)
1904
1918
  # header looks like this in my sample:
1905
1919
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 4c 00 00 00 [....freeGPS L...]
@@ -1910,20 +1924,20 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1910
1924
  $lon = abs Get32s($dataPt, 0x50) / 1e7;
1911
1925
  $spd = Get32s($dataPt, 0x54) / 100 * $mpsToKph;
1912
1926
  $alt = GetFloat($dataPt, 0x58) / 1000; # (NC)
1913
- $debug and $et->FoundTag(GPSType => '2C');
1914
1927
 
1915
1928
  } else {
1929
+ $debug and $et->FoundTag(GPSType => '2D');
1916
1930
  # Type 3 (ref 2)
1917
1931
  # (no sample with this format)
1918
1932
  $lat = GetFloat($dataPt, 0x4c);
1919
1933
  $lon = GetFloat($dataPt, 0x50);
1920
1934
  $spd = GetFloat($dataPt, 0x54) * $knotsToKph;
1921
1935
  $trk = GetFloat($dataPt, 0x58);
1922
- $debug and $et->FoundTag(GPSType => '2D');
1923
1936
  }
1924
1937
 
1925
1938
  } elsif ($$dataPt =~ /^.{60}A\0.{6}([NS])\0.{6}([EW])\0/s and $dirLen >= 112) {
1926
1939
 
1940
+ $debug and $et->FoundTag(GPSType => '2E');
1927
1941
  # header looks like this in my sample (unknown dashcam, "Anticlock 2 2020_1125_1455_007.MOV"):
1928
1942
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 68 00 00 00 [....freeGPS h...]
1929
1943
  # 0010: 32 30 31 33 30 33 32 35 41 00 00 00 00 00 00 00 [20130325A.......]
@@ -1940,10 +1954,10 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1940
1954
  $lon = GetFloat($dataPt, 0x48);
1941
1955
  $spd = GetFloat($dataPt, 0x50);
1942
1956
  $trk = GetFloat($dataPt, 0x54);
1943
- $debug and $et->FoundTag(GPSType => '2E');
1944
1957
 
1945
1958
  } elsif ($$dataPt =~ /^.{16}A([NS])([EW])\0/s) {
1946
1959
 
1960
+ $debug and $et->FoundTag(GPSType => '2F');
1947
1961
  # INNOVV MP4 video (same format as INNOVV TS)
1948
1962
  while ($$dataPt =~ /(A[NS][EW]\0.{28})/g) {
1949
1963
  my $dat = $1;
@@ -1961,11 +1975,36 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
1961
1975
  $et->HandleTag($tagTbl, GPSTrack => $trk);
1962
1976
  $et->HandleTag($tagTbl, Accelerometer => "@acc");
1963
1977
  }
1964
- $debug and $et->FoundTag(GPSType => '2F');
1965
1978
  return 1;
1966
1979
 
1980
+ } elsif ($$dataPt =~ /^.{28}A.{11}([NS]).{15}([EW])/s) {
1981
+
1982
+ $debug and $et->FoundTag(GPSType => '2G');
1983
+ # Vantrue N4 dashcam
1984
+ # 0000: 00 00 40 00 66 72 65 65 47 50 53 20 f0 03 00 00 [..@.freeGPS ....]
1985
+ # 0010: 0d 00 00 00 16 00 00 00 1e 00 00 00 41 00 00 00 [............A...]
1986
+ # 0020: 2c b7 b4 1a 5a 71 b2 40 4e 00 00 00 00 00 00 00 [,...Zq.@N.......]
1987
+ # 0030: fb ae 08 fe 77 f6 89 40 45 00 00 00 00 00 00 00 [....w..@E.......]
1988
+ # 0040: be 9f 1a 2f dd 84 36 40 5c 8f c2 f5 28 fc 68 40 [.../..6@\...(.h@]
1989
+ # 0050: 16 00 00 00 0c 00 00 00 0e 00 00 00 f2 fb ff ff [................]
1990
+ # 0060: 42 00 00 00 02 00 00 00 20 24 47 4e 52 4d 43 2c [B....... $GNRMC,]
1991
+ # 0070: 31 33 32 32 33 30 2e 30 30 30 2c 41 2c 34 37 32 [132230.000,A,472]
1992
+ # 0080: 31 2e 33 35 31 39 37 2c 4e 2c 30 30 38 33 30 2e [1.35197,N,00830.]
1993
+ # 0090: 38 30 38 35 39 2c 45 2c 32 32 2e 35 31 39 2c 31 [80859,E,22.519,1]
1994
+ # 00a0: 39 39 2e 38 38 2c 31 34 31 32 32 32 2c 2c 2c 41 [99.88,141222,,,A]
1995
+ # 00b0: 2a 37 35 0d 0a 00 00 00 00 00 00 00 00 00 00 00 [*75.............]
1996
+ ($latRef, $lonRef) = ($1, $2);
1997
+ ($hr,$min,$sec,$yr,$mon,$day,@acc) = unpack('x16V3x52V3V3',$$dataPt);
1998
+ $lat = abs(GetDouble($dataPt, 32)); # (abs just to be safe)
1999
+ $lon = abs(GetDouble($dataPt, 48)); # (abs just to be safe)
2000
+ $spd = GetDouble($dataPt, 64) * $knotsToKph;
2001
+ $trk = GetDouble($dataPt, 72);
2002
+ map { $_ = $_ - 4294967296 if $_ >= 0x80000000; $_ /= 1000 } @acc; # (NC)
2003
+ # (not necessary to read RMC sentence because we already have it all)
2004
+
1967
2005
  } else {
1968
2006
 
2007
+ $debug and $et->FoundTag(GPSType => '2H');
1969
2008
  # (look for binary GPS as stored by NextBase 512G, ref PH)
1970
2009
  # header looks like this in my sample:
1971
2010
  # 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...]
@@ -2008,7 +2047,6 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2008
2047
  $et->HandleTag($tagTbl, GPSTrack => $trk);
2009
2048
  last if $pos += 0x20 > length($$dataPt) - 0x1e;
2010
2049
  }
2011
- $debug and $et->FoundTag(GPSType => '2G');
2012
2050
  return $$et{DOC_NUM} ? 1 : 0; # return 0 if nothing extracted
2013
2051
  }
2014
2052
  #
@@ -2025,9 +2063,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
2025
2063
  $et->HandleTag($tagTbl, GPSLongitude => $lon * ($lonRef eq 'W' ? -1 : 1));
2026
2064
  $et->HandleTag($tagTbl, GPSSpeed => $spd) if defined $spd; # (now in km/h)
2027
2065
  $et->HandleTag($tagTbl, GPSTrack => $trk) if defined $trk;
2028
- if (defined $alt) {
2029
- $et->HandleTag($tagTbl, GPSAltitude => $alt);
2030
- }
2066
+ $et->HandleTag($tagTbl, GPSAltitude => $alt) if defined $alt;
2031
2067
  $et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc;
2032
2068
  return 1;
2033
2069
  }
@@ -2322,6 +2358,49 @@ sub Process_gsen($$$)
2322
2358
  return 1;
2323
2359
  }
2324
2360
 
2361
+ #------------------------------------------------------------------------------
2362
+ # Process Kenwood drv-a301w dashcam 'udta' atom (ref PH)
2363
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
2364
+ # Returns: 1 on success
2365
+ # Sample data:
2366
+ # 0000: 56 49 44 45 4f 55 55 55 55 55 55 55 55 55 55 55 [VIDEOUUUUUUUUUUU]
2367
+ # 0010: 55 55 55 55 55 55 55 55 55 55 55 fe fe 32 30 32 [UUUUUUUUUUU..202]
2368
+ # 0020: 33 30 31 30 37 31 31 31 39 31 34 2e 32 30 32 33 [30107111914.2023]
2369
+ # 0030: 30 31 30 37 31 31 31 39 31 35 03 4e 34 37 33 37 [0107111915.N4737]
2370
+ # 0040: 37 30 35 33 57 31 32 32 30 39 39 30 31 34 2b 30 [7053W122099014+0]
2371
+ # 0050: 30 35 38 30 30 30 2b 30 30 36 2b 30 30 39 2b 30 [058000+006+009+0]
2372
+ # 0060: 30 34 2b 30 30 32 2b 30 30 39 2b 30 30 35 2b 30 [04+002+009+005+0]
2373
+ sub ProcessKenwood($$$)
2374
+ {
2375
+ my ($et, $dirInfo, $tagTbl) = @_;
2376
+ my $dataPt = $$dirInfo{DataPt};
2377
+ my $dirLen = $$dirInfo{DirLen};
2378
+ while ($$dataPt =~ /\xfe\xfe([^\xfe]+)/g) {
2379
+ my $dat = $1;
2380
+ next unless $dat =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})./gs;
2381
+ my $time = "$1:$2:$3 $4:$5:$6"; # (likely local time zone, but not confirmed)
2382
+ # ignore second date (what is this for?)
2383
+ next unless $dat =~ /\G(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})./gs;
2384
+ next unless $dat =~ /\G([NS])(\d+)([EW])(\d+)/g;
2385
+ my ($lat, $lon) = ($2/1e4, $4/1e4);
2386
+ ConvertLatLon($lat, $lon);
2387
+ $$et{DOC_NUM} = ++$$et{DOC_COUNT};
2388
+ $et->HandleTag($tagTbl, GPSDateTime => $time);
2389
+ $et->HandleTag($tagTbl, GPSLatitude => $lat * ($1 eq 'S' ? -1 : 1));
2390
+ $et->HandleTag($tagTbl, GPSLongitude => $lon * ($3 eq 'W' ? -1 : 1));
2391
+ next unless $dat =~ /\G([-+]\d{4})(\d+)/g;
2392
+ $et->HandleTag($tagTbl, GPSAltitude => $1 + 0); # (NC, educated guess)
2393
+ $et->HandleTag($tagTbl, GPSSpeed => $2); # (km/h)
2394
+ my @acc;
2395
+ while ($dat =~ /\G([-+]\d+)([-+]\d+)([-+]\d+)/g) {
2396
+ push @acc, $1/1000, $2/1000, $3/1000;
2397
+ }
2398
+ $et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc;
2399
+ }
2400
+ delete $$et{DOC_NUM};
2401
+ return 1;
2402
+ }
2403
+
2325
2404
  #------------------------------------------------------------------------------
2326
2405
  # Process RIFF-format trailer written by Auto-Vox dashcam (ref PH)
2327
2406
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -3,6 +3,9 @@ File: Image/ExifTool/README
3
3
 
4
4
  Description: ExifTool support modules documentation
5
5
 
6
+ Note: This documentation is a reference to be used by developers when
7
+ adding new tags to ExifTool.
8
+
6
9
  The ExifTool support modules are loaded by ExifTool to allow processing of
7
10
  various meta information formats.
8
11
 
@@ -17,7 +17,7 @@ require Exporter;
17
17
  use vars qw($VERSION @ISA @EXPORT_OK);
18
18
  use Image::ExifTool qw(:Utils);
19
19
 
20
- $VERSION = '1.18';
20
+ $VERSION = '1.19';
21
21
  @ISA = qw(Exporter);
22
22
  @EXPORT_OK = qw(FindTagInfo TagExists);
23
23
 
@@ -652,16 +652,16 @@ my %tagLookup = (
652
652
  'afaperture' => { 220 => 0x5, 221 => 0x5, 225 => 0x5 },
653
653
  'afareaheight' => { 193 => [0x1a,0x34,0x50], 194 => 0x48 },
654
654
  'afareaillumination' => { 184 => 0x4b, 293 => '15.3' },
655
- 'afareamode' => { 126 => '0.3', 180 => 0x33, 184 => 0xe, 192 => 0x0, 193 => 0x5, 230 => 0x210, 231 => 0x224, 323 => 0xf, 390 => 0x1205, 403 => [0xa,0x3a], 410 => 0x11, 411 => 0x10, 412 => 0x24, 423 => 0xb043, 448 => 0x17 },
655
+ 'afareamode' => { 126 => '0.3', 180 => 0x33, 184 => 0xe, 192 => 0x0, 193 => 0x5, 194 => 0x5, 230 => 0x210, 231 => 0x224, 323 => 0xf, 390 => 0x1205, 403 => [0xa,0x3a], 410 => 0x11, 411 => 0x10, 412 => 0x24, 423 => 0xb043, 448 => 0x17 },
656
656
  'afareamodesetting' => { 284 => '11.1', 287 => '0.1', 293 => '16.1', 297 => '2.1', 423 => 0x201c },
657
657
  'afareapointsize' => { 126 => '0.4' },
658
658
  'afareas' => { 300 => 0x304 },
659
659
  'afareaselectionmethod' => { 2 => 0xd },
660
660
  'afareaselectmethod' => { 84 => 0x51b },
661
661
  'afareawidth' => { 193 => [0x18,0x32,0x4e], 194 => 0x46 },
662
- 'afareaxposition' => { 193 => [0x14,0x2e,0x4a], 390 => 0x1203 },
662
+ 'afareaxposition' => { 193 => [0x14,0x2e,0x4a], 194 => 0x42, 390 => 0x1203 },
663
663
  'afareaxposition1' => { 390 => 0x1201 },
664
- 'afareayposition' => { 193 => [0x16,0x30,0x4c], 390 => 0x1204 },
664
+ 'afareayposition' => { 193 => [0x16,0x30,0x4c], 194 => 0x44, 390 => 0x1204 },
665
665
  'afareayposition1' => { 390 => 0x1202 },
666
666
  'afareazonesize' => { 126 => '0.5' },
667
667
  'afassist' => { 82 => 0x5, 90 => 0x5, 184 => 0x48, 282 => '2.5', 284 => '0.2', 287 => '0.2', 288 => '1.1', 289 => '1.1', 290 => '1.3', 291 => '2.4', 292 => '1.3', 293 => '0.2', 295 => '2.4', 297 => '2.3' },
@@ -682,8 +682,6 @@ my %tagLookup = (
682
682
  'affinetuneindex' => { 195 => 0x1 },
683
683
  'affinex' => { 475 => 'AffineX' },
684
684
  'affiney' => { 475 => 'AffineY' },
685
- 'affocuspointxposition' => { 193 => 0x2f },
686
- 'affocuspointyposition' => { 193 => 0x31 },
687
685
  'afhold' => { 334 => 0x1fd },
688
686
  'afilluminator' => { 410 => 0x29, 423 => 0xb044 },
689
687
  'afimageheight' => { 193 => [0x12,0x2c,0x48], 194 => 0x40 },
@@ -2957,8 +2955,8 @@ my %tagLookup = (
2957
2955
  'focuspointwrap' => { 282 => '2.2', 283 => '2.2', 285 => '2.1', 286 => '2.1', 290 => '1.1', 291 => '2.2', 292 => '1.1', 295 => '2.2', 296 => '2.1', 297 => '2.5', 298 => 0x16 },
2958
2956
  'focusposition' => { 1 => 0x2f, 220 => 0x8, 221 => 0x8, 358 => 0x10, 421 => 0x9bb },
2959
2957
  'focusposition2' => { 428 => [0x29,0x2b,0x2f], 448 => 0x2d, 451 => 0x20 },
2960
- 'focuspositionhorizontal' => { 194 => 0x43 },
2961
- 'focuspositionvertical' => { 194 => 0x45 },
2958
+ 'focuspositionhorizontal' => { 193 => 0x2f, 194 => 0x43 },
2959
+ 'focuspositionvertical' => { 193 => 0x31, 194 => 0x45 },
2962
2960
  'focusprocess' => { 300 => 0x302 },
2963
2961
  'focusrange' => { 34 => 0x12, 305 => 0x100a },
2964
2962
  'focusrangeindex' => { 349 => '3.1' },
@@ -4617,6 +4615,7 @@ my %tagLookup = (
4617
4615
  'mood' => { 179 => 'WM/Mood' },
4618
4616
  'moonphase' => { 384 => 0x12, 385 => 0x43, 386 => 0x4c },
4619
4617
  'morepermissions' => { 479 => 'morePermissions' },
4618
+ 'motionphotovideo' => { 378 => 'mpvd' },
4620
4619
  'motionsensitivity' => { 384 => 0x29, 386 => 0x60 },
4621
4620
  'movementcount' => { 375 => "\xa9mvc" },
4622
4621
  'movementname' => { 375 => "\xa9mvn" },
@@ -5939,7 +5938,7 @@ my %tagLookup = (
5939
5938
  'rightsagent' => { 501 => 'rightsAgent' },
5940
5939
  'rightsowner' => { 501 => 'rightsOwner' },
5941
5940
  'roll' => { 115 => 0x8, 383 => ['roll',"\xa9frl"] },
5942
- 'rollangle' => { 250 => 0x350b, 251 => 0x2c24, 255 => 0xc21a, 260 => 0x36f4, 261 => 0x2efb, 263 => 0xce32, 264 => 0xeaeb, 300 => 0x903, 323 => 0x90, 357 => 0x1, 395 => 0x2 },
5941
+ 'rollangle' => { 127 => 0x144d, 250 => 0x350b, 251 => 0x2c24, 255 => 0xc21a, 260 => 0x36f4, 261 => 0x2efb, 263 => 0xce32, 264 => 0xeaeb, 300 => 0x903, 323 => 0x90, 357 => 0x1, 395 => 0x2 },
5943
5942
  'romoperationmode' => { 97 => 0x80d },
5944
5943
  'rotation' => { 30 => 0x17, 31 => 0x18, 96 => 0x3, 103 => 0x10002, 108 => 0x26e, 114 => 'QuickTime-Rotation', 123 => 0x4, 165 => 'Rotation', 182 => [0x65,0x50], 183 => 0x46, 184 => 0x5a, 187 => 0x10, 250 => 0x3693, 251 => 0xca, 258 => '590.1', 275 => 0x76a43207, 323 => 0x30, 339 => '17.2', 369 => 0xd8, 376 => 'irot', 410 => 0x3f, 411 => 0x3f, 421 => 0x10 },
5945
5944
  'routedto' => { 489 => 'RoutedTo' },
@@ -9034,6 +9033,7 @@ my %tagExists = (
9034
9033
  'flir_serial' => 1,
9035
9034
  'flir_unknown' => 1,
9036
9035
  'flir_unknownuuid' => 1,
9036
+ 'flirdata' => 1,
9037
9037
  'fluormat0' => 1,
9038
9038
  'fluormat1' => 1,
9039
9039
  'fluormat2' => 1,
@@ -9702,6 +9702,7 @@ my %tagExists = (
9702
9702
  'keepexposurewithteleconverter' => 1,
9703
9703
  'keepuntil' => 1,
9704
9704
  'kelvinwb' => 1,
9705
+ 'kenwooddata' => 1,
9705
9706
  'keycode' => 1,
9706
9707
  'keyframepositions' => 1,
9707
9708
  'keyframestimes' => 1,
@@ -12513,7 +12514,7 @@ if (@Image::ExifTool::pluginTags) {
12513
12514
 
12514
12515
 
12515
12516
  #------------------------------------------------------------------------------
12516
- # Add tag names corresponding to flattened XMP tags for all structure fields
12517
+ # Add tag names to lookup corresponding to flattened XMP tags for all structure fields
12517
12518
  # Inputs: 0) tag table ref for flattened tags, 1) tagID, 2) lowercase tag name,
12518
12519
  # 3) tag ID list ref, 4) reference to list of lowercase tag names
12519
12520
  # 5) table number in lookup, 6) tagInfo hash for parent structure
@@ -12596,7 +12597,8 @@ sub AddTags($$)
12596
12597
  my (@lcTags, @tagIDs, $existed, $isFlat);
12597
12598
  # if this is a structure, add all flattened tag names to lookup
12598
12599
  if ($$newInfo{Struct}) {
12599
- AddFields($tagTablePtr, $tagID, $lcTag, \@tagIDs, \@lcTags, $tnum);
12600
+ my $lcFlat = $$newInfo{FlatName} ? lc($$newInfo{FlatName}) : $lcTag;
12601
+ AddFields($tagTablePtr, $tagID, $lcFlat, \@tagIDs, \@lcTags, $tnum);
12600
12602
  }
12601
12603
  # add tags to lookup even though we don't know if they are writable
12602
12604
  # (to save speed by not having to load the module)
@@ -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 26269 tags, with 16758 unique tag names.
15
+ They contain a total of 26274 tags, with 16757 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
@@ -82,7 +82,7 @@ types of meta information. To determine a tag name, either consult this
82
82
  documentation or run C<exiftool -s> on a file containing the information in
83
83
  question.
84
84
 
85
- I<(This documentation is the result of years of research, testing and
85
+ I<(This documentation is the result of decades of research, testing and
86
86
  reverse engineering, and is the most complete metadata tag list available
87
87
  anywhere on the internet. It is provided not only for ExifTool users, but
88
88
  more importantly as a public service to help augment the collective
@@ -11362,6 +11362,7 @@ Tags extracted from FLIR Public image Format (FPF) files.
11362
11362
  0x1446 FlickerReduction int32u
11363
11363
  0x1447 FujiModel string
11364
11364
  0x1448 FujiModel2 string
11365
+ 0x144d RollAngle rational64s
11365
11366
  0x3803 VideoRecordingMode int32u
11366
11367
  0x3804 PeripheralLighting int16u
11367
11368
  0x3806 VideoCompression int16u
@@ -15030,9 +15031,12 @@ These tags are used by the D4S, D750, D810, D5500, D7200 (FlashInfoVersion
15030
15031
  Index1 Tag Name Writable
15031
15032
  ------ -------- --------
15032
15033
  0 AFInfo2Version no
15034
+ 5 AFAreaMode int8u
15033
15035
  62 AFImageWidth int16u
15034
15036
  64 AFImageHeight int16u
15037
+ 66 AFAreaXPosition int16u
15035
15038
  67 FocusPositionHorizontal int8u~
15039
+ 68 AFAreaYPosition int16u
15036
15040
  69 FocusPositionVertical int8u~
15037
15041
  70 AFAreaWidth int16u
15038
15042
  72 AFAreaHeight int16u
@@ -15072,10 +15076,10 @@ These tags are written by Nikon DSLR's which have the live view feature.
15072
15076
  42 AFImageWidth int16u
15073
15077
  44 AFImageHeight int16u
15074
15078
  46 AFAreaXPosition int16u
15075
- 47 AFFocusPointXPosition int8u~
15079
+ 47 FocusPositionHorizontal int8u~
15076
15080
  48 AFAreaYPosition int16u
15077
15081
  AFPointsInFocus undef[20]
15078
- 49 AFFocusPointYPosition int8u~
15082
+ 49 FocusPositionVertical int8u~
15079
15083
  50 AFAreaWidth int16u
15080
15084
  52 AFAreaHeight int16u
15081
15085
  56 PrimaryAFPoint int8u
@@ -27570,6 +27574,7 @@ for the official specification.
27570
27574
  'meta' Meta QuickTime Meta
27571
27575
  'moof' MovieFragment QuickTime MovieFragment
27572
27576
  'moov' Movie QuickTime Movie
27577
+ 'mpvd' MotionPhotoVideo yes
27573
27578
  'pict' PreviewPICT no
27574
27579
  'pnot' Preview QuickTime Preview
27575
27580
  'prrt' ARDroneTelemetry no
@@ -27581,7 +27586,8 @@ for the official specification.
27581
27586
  'thm ' ThumbnailImage no
27582
27587
  'thum' ThumbnailImage no
27583
27588
  'udat' GPSLog no
27584
- 'udta' UserData FLIR UserData
27589
+ 'udta' KenwoodData QuickTime Stream
27590
+ FLIRData FLIR UserData
27585
27591
  'uuid' XMP XMP
27586
27592
  UUID-PROF QuickTime Profile
27587
27593
  UUID-Flip QuickTime Flip
@@ -27597,7 +27603,7 @@ for the official specification.
27597
27603
  The tags below are extracted from timed metadata in QuickTime and other
27598
27604
  formats of video files when the ExtractEmbedded option is used. Although
27599
27605
  most of these tags are combined into the single table below, ExifTool
27600
- currently reads 63 different formats of timed GPS metadata from video files.
27606
+ currently reads 66 different formats of timed GPS metadata from video files.
27601
27607
 
27602
27608
  Tag Name Writable
27603
27609
  -------- --------
@@ -30631,9 +30637,9 @@ for the specification.
30631
30637
  0x7674 ProjectionPosePitch no
30632
30638
  0x7675 ProjectionPoseRoll no
30633
30639
 
30634
- =head3 Matroska Tags
30640
+ =head3 Matroska StdTag Tags
30635
30641
 
30636
- Standardized Matroska tags (see
30642
+ Standardized Matroska tags, stored in a SimpleTag structure (see
30637
30643
  L<https://www.matroska.org/technical/tagging.html>).
30638
30644
 
30639
30645
  Tag ID Tag Name Writable
@@ -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);
31
31
 
32
- $VERSION = '12.54';
32
+ $VERSION = '12.55';
33
33
  $RELEASE = '';
34
34
  @ISA = qw(Exporter);
35
35
  %EXPORT_TAGS = (
@@ -146,7 +146,7 @@ sub ReadValue($$$;$$$);
146
146
  Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3
147
147
  FLAC Ogg Vorbis APE APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio
148
148
  MPEG::Video MPEG::Xing M2TS QuickTime QuickTime::ImageFile QuickTime::Stream
149
- QuickTime::Tags360Fly Matroska Matroska::Tags MOI MXF DV Flash Flash::FLV
149
+ QuickTime::Tags360Fly Matroska Matroska::StdTag MOI MXF DV Flash Flash::FLV
150
150
  Real::Media Real::Audio Real::Metafile Red RIFF AIFF ASF WTV DICOM FITS MIE
151
151
  JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent EXE EXE::PEVersion
152
152
  EXE::PEString EXE::MachO EXE::PEF EXE::ELF EXE::AR EXE::CHM LNK Font VCard
@@ -1,6 +1,6 @@
1
1
  Summary: perl module for image data extraction
2
2
  Name: perl-Image-ExifTool
3
- Version: 12.54
3
+ Version: 12.55
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('12.54.0')
4
+ VERSION = Gem::Version.new('12.55.0')
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exiftool_vendored
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.54.0
4
+ version: 12.55.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew McEachen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-01-10 00:00:00.000000000 Z
12
+ date: 2023-01-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: exiftool