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 +4 -4
- data/bin/Changes +16 -4
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +5 -5
- data/bin/fmt_files/kml_track.fmt +3 -3
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +1 -1
- data/bin/lib/Image/ExifTool/FujiFilm.pm +2 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +13 -4
- data/bin/lib/Image/ExifTool/Matroska.pm +4 -4
- data/bin/lib/Image/ExifTool/Nikon.pm +30 -5
- data/bin/lib/Image/ExifTool/QuickTime.pm +19 -4
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +104 -25
- data/bin/lib/Image/ExifTool/README +3 -0
- data/bin/lib/Image/ExifTool/TagLookup.pm +13 -11
- data/bin/lib/Image/ExifTool/TagNames.pod +14 -8
- data/bin/lib/Image/ExifTool.pm +2 -2
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08dd80f8e21b9b1cdb9c94d397452030151b485db6f08e25fdb408a4eade1052'
|
4
|
+
data.tar.gz: 6db554ec80bedd0d2022bd019cba25f5f7e61862bec88b00659790edbe123952
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
-
|
15
|
-
|
16
|
-
|
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
data/bin/META.yml
CHANGED
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.
|
111
|
-
cd Image-ExifTool-12.
|
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.
|
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.
|
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
|
6330
|
-
synchronization from previously geotagged images. See "geotag.html" in
|
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
|
data/bin/fmt_files/kml_track.fmt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#------------------------------------------------------------------------------
|
2
|
-
# File:
|
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
|
10
|
+
# exiftool -p kml_track.fmt -r DIR [...] > out.kml
|
11
11
|
#
|
12
12
|
# From video files:
|
13
13
|
#
|
14
|
-
# exiftool -p
|
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
|
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.
|
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.
|
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{
|
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}
|
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.
|
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::
|
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::
|
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.
|
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 => '
|
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 => '
|
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.
|
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 => '
|
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
|
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
|
-
|
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
|
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.
|
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
|
-
|
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
|
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
|
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
|
15079
|
+
47 FocusPositionHorizontal int8u~
|
15076
15080
|
48 AFAreaYPosition int16u
|
15077
15081
|
AFPointsInFocus undef[20]
|
15078
|
-
49
|
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'
|
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
|
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
|
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
|
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);
|
31
31
|
|
32
|
-
$VERSION = '12.
|
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::
|
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
|
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.
|
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-
|
12
|
+
date: 2023-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|