exiftool_vendored 13.03.0 → 13.04.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/Changes +17 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +25 -21
- data/bin/lib/Image/ExifTool/Canon.pm +7 -1
- data/bin/lib/Image/ExifTool/Exif.pm +8 -4
- data/bin/lib/Image/ExifTool/GPS.pm +33 -29
- data/bin/lib/Image/ExifTool/Geotag.pm +43 -9
- data/bin/lib/Image/ExifTool/GoPro.pm +118 -6
- data/bin/lib/Image/ExifTool/OOXML.pm +7 -7
- data/bin/lib/Image/ExifTool/Photoshop.pm +2 -2
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +27 -8
- data/bin/lib/Image/ExifTool/XMP2.pl +12 -8
- data/bin/lib/Image/ExifTool.pm +8 -6
- 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: 374e7e5a3d68eeca0ec6cb6a40919d056e0731958606daa8bed45a7c4c70daba
|
|
4
|
+
data.tar.gz: 1263e0b2b35852265b4d5352eae7f35d12cffe0277f916799a8498c75482a9be
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7b5d47b1383f939d76af17239fb4f1e1a486ae619b0d728a010bde7e8ed044de0bfc93d755f8c0a22dfa098ddf997d84f1d7a3f562f07153d1486eee68744929
|
|
7
|
+
data.tar.gz: b8ba0c1b6c02546df4e54c6d5c4fe072cbb98bc4b6c5b1d0f1ac323ded4ca43e06ff5bcaaaf879005d37533df86f53262cba0dd87d1a09684f360a50a6d4834c
|
data/bin/Changes
CHANGED
|
@@ -7,6 +7,23 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 13.00. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
Nov. 26, 2024 - Version 13.04
|
|
11
|
+
|
|
12
|
+
- Added the ability to write GPSDOP and GPSMeasureMode from the -geotag option
|
|
13
|
+
if hdop or pdop information exists in the input track file
|
|
14
|
+
- Added a few new Canon RFLensTypes (thanks Norbert Wasser)
|
|
15
|
+
- Decode timed GPS from GoPro Hero 13 videos
|
|
16
|
+
- Improved writing of GPSDestLatitudeRef and GPSDestLongitudeRef tags to allow
|
|
17
|
+
signed numbers to be written in the same way as GPSLatitudeRef and
|
|
18
|
+
GPSLongitudeRef
|
|
19
|
+
- Warn if using an Image::ExifTool library that doesn't match the application
|
|
20
|
+
version
|
|
21
|
+
- Renamed an Unknown Photoshop tag
|
|
22
|
+
- Convert GoPro GPSSpeed and GPSSpeed3D from m/s to km/h
|
|
23
|
+
- Patched to tolerate XML header in DOCX xml files
|
|
24
|
+
- Fixed -htmldump output to show the same names for unknown EXIF tags as with
|
|
25
|
+
the -u option
|
|
26
|
+
|
|
10
27
|
Nov. 12, 2024 - Version 13.03
|
|
11
28
|
|
|
12
29
|
- Added ability to include or exclude tags from CSV and JSON imports
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
|
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
|
109
109
|
terminal window to extract and run ExifTool:
|
|
110
110
|
|
|
111
111
|
cd ~/Desktop
|
|
112
|
-
gzip -dc Image-ExifTool-13.
|
|
113
|
-
cd Image-ExifTool-13.
|
|
112
|
+
gzip -dc Image-ExifTool-13.04.tar.gz | tar -xf -
|
|
113
|
+
cd Image-ExifTool-13.04
|
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
|
115
115
|
|
|
116
116
|
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 = '13.
|
|
14
|
+
my $version = '13.04';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -597,6 +597,10 @@ if (@Image::ExifTool::UserDefined::Arguments) {
|
|
|
597
597
|
unshift @ARGV, @Image::ExifTool::UserDefined::Arguments;
|
|
598
598
|
}
|
|
599
599
|
|
|
600
|
+
if ($version ne $Image::ExifTool::VERSION) {
|
|
601
|
+
Warn "Application version $version does not match Image::ExifTool library version $Image::ExifTool::VERSION\n";
|
|
602
|
+
}
|
|
603
|
+
|
|
600
604
|
# parse command-line options in 2 passes...
|
|
601
605
|
# pass 1: set all of our ExifTool options
|
|
602
606
|
# pass 2: print all of our help and informational output (-list, -ver, etc)
|
|
@@ -5903,7 +5907,7 @@ with this command:
|
|
|
5903
5907
|
|
|
5904
5908
|
produces output like this:
|
|
5905
5909
|
|
|
5906
|
-
-- Generated by ExifTool 13.
|
|
5910
|
+
-- Generated by ExifTool 13.04 --
|
|
5907
5911
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5908
5912
|
(f/5.6, 1/60s, ISO 100)
|
|
5909
5913
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -5919,8 +5923,9 @@ name, a value of 1 is returned if any tag exists in the specified group, or
|
|
|
5919
5923
|
0 otherwise (unless the C<All> group is also specified, in which case the
|
|
5920
5924
|
values of all matching tags are joined).
|
|
5921
5925
|
|
|
5922
|
-
|
|
5923
|
-
|
|
5926
|
+
The B<-p> output iterates through the family 3 group names, with each
|
|
5927
|
+
sub-document producing additional output. This feature is most useful when
|
|
5928
|
+
used in combination with the B<-ee> option to extract embedded documents.
|
|
5924
5929
|
|
|
5925
5930
|
If a specified tag does not exist, a minor warning is issued and the line
|
|
5926
5931
|
with the missing tag is not printed. However, the B<-f> option may be used
|
|
@@ -6770,23 +6775,22 @@ the following two commands are equivalent:
|
|
|
6770
6775
|
exiftool -geotag trk.log image.jpg
|
|
6771
6776
|
exiftool -geotag trk.log "-Geotime<DateTimeOriginal#" image.jpg
|
|
6772
6777
|
|
|
6773
|
-
|
|
6774
|
-
|
|
6775
|
-
|
|
6776
|
-
|
|
6777
|
-
|
|
6778
|
-
|
|
6779
|
-
|
|
6780
|
-
|
|
6781
|
-
|
|
6782
|
-
|
|
6783
|
-
|
|
6784
|
-
|
|
6785
|
-
|
|
6786
|
-
|
|
6787
|
-
|
|
6788
|
-
|
|
6789
|
-
order to be written.
|
|
6778
|
+
If the C<Geotime> value does not contain a time zone then the local system
|
|
6779
|
+
timezone is assumed. Writing C<Geotime> causes the following tags to be
|
|
6780
|
+
written (provided they can be calculated from the track log, and they are
|
|
6781
|
+
supported by the destination metadata format): GPSLatitude, GPSLatitudeRef,
|
|
6782
|
+
GPSLongitude, GPSLongitudeRef, GPSAltitude, GPSAltitudeRef, GPSDateStamp,
|
|
6783
|
+
GPSTimeStamp, GPSDateTime, GPSTrack, GPSTrackRef, GPSSpeed, GPSSpeedRef,
|
|
6784
|
+
GPSImgDirection, GPSImgDirectionRef, GPSPitch, GPSRoll, GPSCoordinates,
|
|
6785
|
+
AmbientTemperature and CameraElevationAngle. By default, in image files
|
|
6786
|
+
tags are created in EXIF, and updated in XMP only if they already exist. In
|
|
6787
|
+
QuickTime-format files GPSCoordinates is created in the preferred location
|
|
6788
|
+
(ItemList by default) as well as in XMP. However, C<EXIF:Geotime>,
|
|
6789
|
+
C<XMP:Geotime> or C<QuickTime:Geotime> may be specified to write to write
|
|
6790
|
+
only to one group. Also, C<ItemList:Geotime>, C<Keys:Geotime> or
|
|
6791
|
+
C<UserData:Geotime> may be used to write to a specific location in
|
|
6792
|
+
QuickTime-format files. Note that GPSPitch and GPSRoll are non-standard,
|
|
6793
|
+
and require user-defined tags in order to be written.
|
|
6790
6794
|
|
|
6791
6795
|
The C<Geosync> tag may be used to specify a time correction which is applied
|
|
6792
6796
|
to each C<Geotime> value for synchronization with GPS time. For example,
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.85';
|
|
92
92
|
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
|
@@ -631,6 +631,9 @@ $VERSION = '4.84';
|
|
|
631
631
|
'61182.54' => 'Canon RF 24-105mm F2.8 L IS USM Z', #42
|
|
632
632
|
'61182.55' => 'Canon RF-S 10-18mm F4.5-6.3 IS STM', #42
|
|
633
633
|
'61182.56' => 'Canon RF 35mm F1.4 L VCM', #42
|
|
634
|
+
'61182.57' => 'Canon RF 70-200mm F2.8 L IS USM Z', #42
|
|
635
|
+
'61182.58' => 'Canon RF 50mm F1.4 L VCM', #42
|
|
636
|
+
'61182.59' => 'Canon RF 24mm F1.4 L VCM', #42
|
|
634
637
|
65535 => 'n/a',
|
|
635
638
|
);
|
|
636
639
|
|
|
@@ -7001,6 +7004,9 @@ my %ciMaxFocal = (
|
|
|
7001
7004
|
316 => 'Canon RF 35mm F1.4 L VCM', #42
|
|
7002
7005
|
317 => 'Canon RF-S 3.9mm F3.5 STM DUAL FISHEYE', #42
|
|
7003
7006
|
318 => 'Canon RF 28-70mm F2.8 IS STM', #42
|
|
7007
|
+
319 => 'Canon RF 70-200mm F2.8 L IS USM Z', #42
|
|
7008
|
+
325 => 'Canon RF 50mm F1.4 L VCM', #42
|
|
7009
|
+
326 => 'Canon RF 24mm F1.4 L VCM', #42
|
|
7004
7010
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
7005
7011
|
},
|
|
7006
7012
|
},
|
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
58
58
|
use Image::ExifTool::MakerNotes;
|
|
59
59
|
|
|
60
|
-
$VERSION = '4.
|
|
60
|
+
$VERSION = '4.55';
|
|
61
61
|
|
|
62
62
|
sub ProcessExif($$$);
|
|
63
63
|
sub WriteExif($$$);
|
|
@@ -6697,8 +6697,9 @@ sub ProcessExif($$$)
|
|
|
6697
6697
|
"Format: $fstr\nSize: $size bytes\n";
|
|
6698
6698
|
if ($size > 4) {
|
|
6699
6699
|
my $offPt = Get32u($dataPt,$entry+8);
|
|
6700
|
-
# (test this with ../pics/{CanonEOS-1D_XMarkIII.hif,PanasonicDC-G9.rw2})
|
|
6701
|
-
my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0) +
|
|
6700
|
+
# (test this with ../pics/{CanonEOS-1D_XMarkIII.hif,PanasonicDC-G9.rw2,*.raf})
|
|
6701
|
+
my $actPt = $valuePtr + $valueDataPos + $base - ($$et{EXIF_POS} || 0) +
|
|
6702
|
+
($$et{BASE_FUDGE} || $$et{BASE} || 0);
|
|
6702
6703
|
$tip .= sprintf("Value offset: 0x%.4x\n", $offPt);
|
|
6703
6704
|
# highlight tag name (red for bad size)
|
|
6704
6705
|
my $style = ($bad or not defined $tval) ? 'V' : 'H';
|
|
@@ -6729,12 +6730,15 @@ sub ProcessExif($$$)
|
|
|
6729
6730
|
} elsif ($tagInfo and Image::ExifTool::IsInt($tval)) {
|
|
6730
6731
|
if ($$tagInfo{IsOffset} or $$tagInfo{SubIFD}) {
|
|
6731
6732
|
$tval = sprintf('0x%.4x', $tval);
|
|
6732
|
-
my $actPt = $val + $base - ($$et{EXIF_POS} || 0) + ($$et{BASE_FUDGE} || 0);
|
|
6733
|
+
my $actPt = $val + $base - ($$et{EXIF_POS} || 0) + ($$et{BASE_FUDGE} || $$et{BASE} || 0);
|
|
6733
6734
|
if ($actPt != $val) {
|
|
6734
6735
|
$tval .= sprintf("\nActual offset: 0x%.4x", $actPt);
|
|
6735
6736
|
my $sign = $actPt < $val ? '-' : '';
|
|
6736
6737
|
$tval .= sprintf("\nOffset base: ${sign}0x%.4x", abs($actPt - $val));
|
|
6737
6738
|
}
|
|
6739
|
+
if ($$et{EXIF_POS} and not $$et{BASE_FUDGE}) {
|
|
6740
|
+
$tip .= sprintf("File offset: 0x%.4x\n", $actPt + $$et{EXIF_POS})
|
|
6741
|
+
}
|
|
6738
6742
|
} elsif ($$tagInfo{PrintHex}) {
|
|
6739
6743
|
$tval = sprintf('0x%x', $tval);
|
|
6740
6744
|
}
|
|
@@ -12,7 +12,7 @@ use strict;
|
|
|
12
12
|
use vars qw($VERSION);
|
|
13
13
|
use Image::ExifTool::Exif;
|
|
14
14
|
|
|
15
|
-
$VERSION = '1.
|
|
15
|
+
$VERSION = '1.57';
|
|
16
16
|
|
|
17
17
|
my %coordConv = (
|
|
18
18
|
ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
|
|
@@ -20,6 +20,34 @@ my %coordConv = (
|
|
|
20
20
|
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1)',
|
|
21
21
|
);
|
|
22
22
|
|
|
23
|
+
my %printConvLatRef = (
|
|
24
|
+
# extract N/S if written from Composite:GPSLatitude
|
|
25
|
+
# (also allow writing from a signed number)
|
|
26
|
+
OTHER => sub {
|
|
27
|
+
my ($val, $inv) = @_;
|
|
28
|
+
return undef unless $inv;
|
|
29
|
+
return uc $2 if $val =~ /(^|[^A-Z])([NS])(orth|outh)?\b/i;
|
|
30
|
+
return $1 eq '-' ? 'S' : 'N' if $val =~ /([-+]?)\d+/;
|
|
31
|
+
return undef;
|
|
32
|
+
},
|
|
33
|
+
N => 'North',
|
|
34
|
+
S => 'South',
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
my %printConvLonRef = (
|
|
38
|
+
# extract E/W if written from Composite:GPSLongitude
|
|
39
|
+
# (also allow writing from a signed number)
|
|
40
|
+
OTHER => sub {
|
|
41
|
+
my ($val, $inv) = @_;
|
|
42
|
+
return undef unless $inv;
|
|
43
|
+
return uc $2 if $val =~ /(^|[^A-Z])([EW])(ast|est)?\b/i;
|
|
44
|
+
return $1 eq '-' ? 'W' : 'E' if $val =~ /([-+]?)\d+/;
|
|
45
|
+
return undef;
|
|
46
|
+
},
|
|
47
|
+
E => 'East',
|
|
48
|
+
W => 'West',
|
|
49
|
+
);
|
|
50
|
+
|
|
23
51
|
%Image::ExifTool::GPS::Main = (
|
|
24
52
|
GROUPS => { 0 => 'EXIF', 1 => 'GPS', 2 => 'Location' },
|
|
25
53
|
WRITE_PROC => \&Image::ExifTool::Exif::WriteExif,
|
|
@@ -43,19 +71,7 @@ my %coordConv = (
|
|
|
43
71
|
latitudes or negative for south, or a string containing N, North, S or South
|
|
44
72
|
},
|
|
45
73
|
Count => 2,
|
|
46
|
-
PrintConv =>
|
|
47
|
-
# extract N/S if written from Composite:GPSLatitude
|
|
48
|
-
# (also allow writing from a signed number)
|
|
49
|
-
OTHER => sub {
|
|
50
|
-
my ($val, $inv) = @_;
|
|
51
|
-
return undef unless $inv;
|
|
52
|
-
return uc $2 if $val =~ /(^|[^A-Z])([NS])(orth|outh)?\b/i;
|
|
53
|
-
return $1 eq '-' ? 'S' : 'N' if $val =~ /([-+]?)\d+/;
|
|
54
|
-
return undef;
|
|
55
|
-
},
|
|
56
|
-
N => 'North',
|
|
57
|
-
S => 'South',
|
|
58
|
-
},
|
|
74
|
+
PrintConv => \%printConvLatRef,
|
|
59
75
|
},
|
|
60
76
|
0x0002 => {
|
|
61
77
|
Name => 'GPSLatitude',
|
|
@@ -72,19 +88,7 @@ my %coordConv = (
|
|
|
72
88
|
ExifTool will also accept a number when writing this tag, positive for east
|
|
73
89
|
longitudes or negative for west, or a string containing E, East, W or West
|
|
74
90
|
},
|
|
75
|
-
PrintConv =>
|
|
76
|
-
# extract E/W if written from Composite:GPSLongitude
|
|
77
|
-
# (also allow writing from a signed number)
|
|
78
|
-
OTHER => sub {
|
|
79
|
-
my ($val, $inv) = @_;
|
|
80
|
-
return undef unless $inv;
|
|
81
|
-
return uc $2 if $val =~ /(^|[^A-Z])([EW])(ast|est)?\b/i;
|
|
82
|
-
return $1 eq '-' ? 'W' : 'E' if $val =~ /([-+]?)\d+/;
|
|
83
|
-
return undef;
|
|
84
|
-
},
|
|
85
|
-
E => 'East',
|
|
86
|
-
W => 'West',
|
|
87
|
-
},
|
|
91
|
+
PrintConv => \%printConvLonRef,
|
|
88
92
|
},
|
|
89
93
|
0x0004 => {
|
|
90
94
|
Name => 'GPSLongitude',
|
|
@@ -238,7 +242,7 @@ my %coordConv = (
|
|
|
238
242
|
Writable => 'string',
|
|
239
243
|
Notes => 'tags 0x0013-0x001a used for subject location according to MWG 2.0',
|
|
240
244
|
Count => 2,
|
|
241
|
-
PrintConv =>
|
|
245
|
+
PrintConv => \%printConvLatRef,
|
|
242
246
|
},
|
|
243
247
|
0x0014 => {
|
|
244
248
|
Name => 'GPSDestLatitude',
|
|
@@ -251,7 +255,7 @@ my %coordConv = (
|
|
|
251
255
|
Name => 'GPSDestLongitudeRef',
|
|
252
256
|
Writable => 'string',
|
|
253
257
|
Count => 2,
|
|
254
|
-
PrintConv =>
|
|
258
|
+
PrintConv => \%printConvLonRef,
|
|
255
259
|
},
|
|
256
260
|
0x0016 => {
|
|
257
261
|
Name => 'GPSDestLongitude',
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
# 2022/06/21 - PH Added ability to read Google Takeout JSON files
|
|
18
18
|
# 2024/04/23 - PH Added ability to read more OpenTracks GPS tags
|
|
19
19
|
# 2024/08/28 - PH Added support for new Google Takeout JSON format
|
|
20
|
+
# 2024/11/26 - PH Also write GPSMeasureMode and GPSDOP
|
|
20
21
|
#
|
|
21
22
|
# References: 1) http://www.topografix.com/GPX/1/1/
|
|
22
23
|
# 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
|
|
@@ -31,7 +32,7 @@ use vars qw($VERSION);
|
|
|
31
32
|
use Image::ExifTool qw(:Public);
|
|
32
33
|
use Image::ExifTool::GPS;
|
|
33
34
|
|
|
34
|
-
$VERSION = '1.
|
|
35
|
+
$VERSION = '1.81';
|
|
35
36
|
|
|
36
37
|
sub JITTER() { return 2 } # maximum time jitter
|
|
37
38
|
|
|
@@ -90,12 +91,25 @@ my %fixInfoKeys = (
|
|
|
90
91
|
orient => [ 'dir', 'pitch', 'roll' ],
|
|
91
92
|
atemp => [ 'atemp' ],
|
|
92
93
|
err => [ 'err' ],
|
|
94
|
+
dop => [ 'hdop', 'vdop', 'pdop' ],
|
|
93
95
|
);
|
|
94
96
|
|
|
95
|
-
|
|
97
|
+
# category for select keys
|
|
98
|
+
my %keyCategory = (
|
|
99
|
+
dir => 'orient',
|
|
100
|
+
pitch => 'orient',
|
|
101
|
+
roll => 'orient',
|
|
102
|
+
hdop => 'dop',
|
|
103
|
+
pdop => 'dop',
|
|
104
|
+
vdop => 'dop',
|
|
105
|
+
);
|
|
96
106
|
|
|
97
107
|
# tags which may exist separately in some formats (eg. CSV)
|
|
98
|
-
my %sepTags = (
|
|
108
|
+
my %sepTags = (
|
|
109
|
+
dir => 1, pitch => 1, roll => 1, track => 1, speed => 1,
|
|
110
|
+
# (plus other tags we don't want to scan outwards for)
|
|
111
|
+
hdop => 1, pdop => 1, vdop => 1,
|
|
112
|
+
);
|
|
99
113
|
|
|
100
114
|
# conversion factors for GPSSpeed (standard EXIF units only)
|
|
101
115
|
my %speedConv = (
|
|
@@ -348,8 +362,8 @@ sub LoadTrackLog($$;$)
|
|
|
348
362
|
my $tag = $xmlTag{lc $2};
|
|
349
363
|
if ($tag) {
|
|
350
364
|
$$fix{$tag} = $4;
|
|
351
|
-
if ($
|
|
352
|
-
$$has{
|
|
365
|
+
if ($keyCategory{$tag}) {
|
|
366
|
+
$$has{$keyCategory{$tag}} = 1;
|
|
353
367
|
} elsif ($tag eq 'alt') {
|
|
354
368
|
# validate altitude
|
|
355
369
|
undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/;
|
|
@@ -394,8 +408,8 @@ sub LoadTrackLog($$;$)
|
|
|
394
408
|
} else {
|
|
395
409
|
$$fix{$tag} = $1;
|
|
396
410
|
}
|
|
397
|
-
if ($
|
|
398
|
-
$$has{
|
|
411
|
+
if ($keyCategory{$tag}) {
|
|
412
|
+
$$has{$keyCategory{$tag}} = 1;
|
|
399
413
|
} elsif ($tag eq 'alt') {
|
|
400
414
|
# validate altitude
|
|
401
415
|
undef $$fix{alt} if defined $$fix{alt} and $$fix{alt} !~ /^[+-]?\d+\.?\d*/;
|
|
@@ -1145,7 +1159,7 @@ sub SetGeoValues($$;$)
|
|
|
1145
1159
|
# loop through available fix information categories
|
|
1146
1160
|
# (pos, track, alt, orient)
|
|
1147
1161
|
my ($category, $key);
|
|
1148
|
-
Category: foreach $category (qw{pos track alt orient atemp err}) {
|
|
1162
|
+
Category: foreach $category (qw{pos track alt orient atemp err dop}) {
|
|
1149
1163
|
next unless $$has{$category};
|
|
1150
1164
|
my ($f, $p0b, $p1b, $f0b);
|
|
1151
1165
|
# loop through specific fix information keys
|
|
@@ -1303,6 +1317,25 @@ Category: foreach $category (qw{pos track alt orient atemp err}) {
|
|
|
1303
1317
|
if ($$has{err}) {
|
|
1304
1318
|
@r = $et->SetNewValue(GPSHPositioningError => $$fix{err}, %opts);
|
|
1305
1319
|
}
|
|
1320
|
+
if ($$has{dop}) {
|
|
1321
|
+
my ($dop, $mm);
|
|
1322
|
+
if (defined $$fix{pdop}) {
|
|
1323
|
+
$dop = $$fix{pdop};
|
|
1324
|
+
$mm = 3;
|
|
1325
|
+
} elsif (defined $$fix{hdop}) {
|
|
1326
|
+
if (defined $$fix{vdop}) {
|
|
1327
|
+
$dop = sqrt($$fix{hdop} * $$fix{hdop} + $$fix{vdop} * $$fix{vdop});
|
|
1328
|
+
$mm = 3;
|
|
1329
|
+
} else {
|
|
1330
|
+
$dop = $$fix{hdop};
|
|
1331
|
+
$mm = 2;
|
|
1332
|
+
}
|
|
1333
|
+
}
|
|
1334
|
+
if (defined $dop) {
|
|
1335
|
+
$et->SetNewValue(GPSMeasureMode => $mm, %opts);
|
|
1336
|
+
$et->SetNewValue(GPSDOP => $dop, %opts);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1306
1339
|
unless ($xmp) {
|
|
1307
1340
|
my ($latRef, $lonRef);
|
|
1308
1341
|
$latRef = ($$fix{lat} > 0 ? 'N' : 'S') if defined $$fix{lat};
|
|
@@ -1328,7 +1361,8 @@ Category: foreach $category (qw{pos track alt orient atemp err}) {
|
|
|
1328
1361
|
GPSAltitude GPSAltitudeRef GPSDateStamp GPSTimeStamp GPSDateTime
|
|
1329
1362
|
GPSTrack GPSTrackRef GPSSpeed GPSSpeedRef GPSImgDirection
|
|
1330
1363
|
GPSImgDirectionRef GPSPitch GPSRoll CameraElevationAngle
|
|
1331
|
-
AmbientTemperature GPSHPositioningError GPSCoordinates
|
|
1364
|
+
AmbientTemperature GPSHPositioningError GPSCoordinates
|
|
1365
|
+
GPSMeasureMode GPSDOP))
|
|
1332
1366
|
{
|
|
1333
1367
|
my @r = $et->SetNewValue($_, undef, %opts);
|
|
1334
1368
|
}
|
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
17
17
|
use Image::ExifTool::QuickTime;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.10';
|
|
20
20
|
|
|
21
21
|
sub ProcessGoPro($$$);
|
|
22
22
|
sub ProcessString($$$);
|
|
@@ -72,6 +72,7 @@ my %addUnits = (
|
|
|
72
72
|
let me know if you discover the meaning of any of these unknown tags. See
|
|
73
73
|
L<https://github.com/gopro/gpmf-parser> for details about this format.
|
|
74
74
|
},
|
|
75
|
+
# ABSC (GPMF) - seen: 0 (fmt f)
|
|
75
76
|
ACCL => { #2 (gpmd)
|
|
76
77
|
Name => 'Accelerometer',
|
|
77
78
|
Notes => 'accelerator readings in m/s2',
|
|
@@ -81,7 +82,9 @@ my %addUnits = (
|
|
|
81
82
|
# ANGY (GPMF-GEOC) - seen 179.9 (fmt d, Max)
|
|
82
83
|
# ANGZ (GPMF-GEOC) - seen 0.152 (fmt d, Max)
|
|
83
84
|
ALLD => 'AutoLowLightDuration', #1 (gpmd) (untested)
|
|
84
|
-
# APTO (GPMF) - seen: 'RAW', 'DYNM' (fmt c)
|
|
85
|
+
# APTO (GPMF) - seen: 'OFF', 'RAW', 'DYNM' (fmt c)
|
|
86
|
+
# ARUW (GPMF) - seen: 1.14285719394684 (fmt f)
|
|
87
|
+
# ARWA (GPMF) - seen: 1.14285719394684 (fmt f)
|
|
85
88
|
ATTD => { #PH (Karma)
|
|
86
89
|
Name => 'Attitude',
|
|
87
90
|
# UNIT=s,rad,rad,rad,rad/s,rad/s,rad/s,
|
|
@@ -96,8 +99,10 @@ my %addUnits = (
|
|
|
96
99
|
# SCAL=1000 1 1 1 1
|
|
97
100
|
Binary => 1,
|
|
98
101
|
},
|
|
102
|
+
# AUBT (GPMF) - seen: ''N' (type c)
|
|
99
103
|
AUDO => 'AudioSetting', #PH (GPMF - seen: 'WIND', fmt c)
|
|
100
104
|
# AUPT (GPMF) - seen: 'N','Y' (fmt c)
|
|
105
|
+
# BITR (GPMF) - seen: 'STANDARD' (fmt c)
|
|
101
106
|
BPOS => { #PH (Karma)
|
|
102
107
|
Name => 'Controller',
|
|
103
108
|
Unknown => 1,
|
|
@@ -111,9 +116,16 @@ my %addUnits = (
|
|
|
111
116
|
# CALH (GPMF-GEOC) - seen 3040 (fmt L, Max)
|
|
112
117
|
# CALW (GPMF-GEOC) - seen 4056 (fmt L, Max)
|
|
113
118
|
CASN => 'CameraSerialNumber', #PH (GPMF - seen: 'C3221324545448', fmt c)
|
|
119
|
+
# CDAT (GPMF) - seen: 1732152823 (fmt J)
|
|
120
|
+
# CDTM (GPMF) - seen: 0 (fmt L)
|
|
114
121
|
# CINF (GPMF) - seen: 0x67376be7709bc8876a8baf3940908618, 0xe230988539b30cf5f016627ae8fc5395,
|
|
115
122
|
# 0x8bcbe424acc5b37d7d77001635198b3b (fmt B) (Camera INFormation?)
|
|
123
|
+
# CLDP (GPMF) - seen: 'Y' (fmt c)
|
|
124
|
+
# CLKC (GPMF) - seen: 0 (fmt L)
|
|
125
|
+
# CLKS (GPMF) - seen: 2 (fmt B)
|
|
116
126
|
# CMOD (GPMF) - seen: 12,13,17 [12 360 video, 13 time-laps video, 17 JPEG] (fmt B)
|
|
127
|
+
# CPID (GPMF) - seen: '1194885996 3387225026 733916448 2433577768' (fmt L)
|
|
128
|
+
# CPIN (GPMF) - seen: 1
|
|
117
129
|
# CRTX (GPMF-BACK/FRNT) - double[1]
|
|
118
130
|
# CRTY (GPMF-BACK/FRNT) - double[1]
|
|
119
131
|
CSEN => { #PH (Karma)
|
|
@@ -123,6 +135,7 @@ my %addUnits = (
|
|
|
123
135
|
# SCAL=1000 1 1 1 1 1 1 1 1 1 1
|
|
124
136
|
Binary => 1,
|
|
125
137
|
},
|
|
138
|
+
# CTRL (GPMF) - seen: 'Pro' (fmt c)
|
|
126
139
|
CYTS => { #PH (Karma)
|
|
127
140
|
Name => 'CoyoteStatus',
|
|
128
141
|
# UNIT=s,,,,,rad,rad,rad,,
|
|
@@ -141,6 +154,8 @@ my %addUnits = (
|
|
|
141
154
|
# (Max) DVID='FRNT',DVNM='Front Lens',KLNS,CTRX,CTRY,MFOV,SFTR
|
|
142
155
|
# (Max) DVID='HLMT',DVNM='Highlights'
|
|
143
156
|
},
|
|
157
|
+
# DNSC (GPMF) - seen: 'HIGH' (fmt c)
|
|
158
|
+
# DUST (GPMF) - seen: 'NO_LIMIT' (fmt c)
|
|
144
159
|
# DVID (GPMF) - DeviceID; seen: 1 (fmt L), HLMT (fmt F), GEOC (fmt F), 'BACK' (fmt F, Max)
|
|
145
160
|
DVID => { Name => 'DeviceID', Unknown => 1 }, #2 (gpmd)
|
|
146
161
|
# DVNM (GPMF) seen: 'Video Global Settings' (fmt c), 'Highlights' (fmt c), 'Geometry Calibrations' (Max)
|
|
@@ -150,6 +165,7 @@ my %addUnits = (
|
|
|
150
165
|
Name => 'DigitalZoom',
|
|
151
166
|
PrintConv => { N => 'No', Y => 'Yes' },
|
|
152
167
|
},
|
|
168
|
+
# DZMX (GPMF) - seen: 1.39999997615814 (fmt f)
|
|
153
169
|
# DZST (GPMF) - seen: 0 (fmt L) (something to do with digital zoom maybe?)
|
|
154
170
|
EISA => { #PH (GPMF) - seen: 'Y','N','HS EIS','N/A' (fmt c) [N was for a time-lapse video]
|
|
155
171
|
Name => 'ElectronicImageStabilization',
|
|
@@ -188,10 +204,20 @@ my %addUnits = (
|
|
|
188
204
|
},
|
|
189
205
|
GPS5 => { #2 (gpmd)
|
|
190
206
|
Name => 'GPSInfo',
|
|
207
|
+
# UNIT=deg,deg,m,m/s,m/s
|
|
208
|
+
# TYPE=l
|
|
191
209
|
# SCAL=10000000,10000000,1000,1000,100
|
|
192
210
|
RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data
|
|
193
211
|
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPS5' },
|
|
194
212
|
},
|
|
213
|
+
GPS9 => { #PH (gpmd, Hero 13)
|
|
214
|
+
Name => 'GPSInfo9',
|
|
215
|
+
# UNIT=deg,deg,m,m/s,m/s,,s,,
|
|
216
|
+
# TYPE=lllllllSS
|
|
217
|
+
# SCAL=10000000 10000000 1000 1000 100 1 1000 100 1
|
|
218
|
+
RawConv => '$val', # necessary to use scaled value instead of raw data as subdir data
|
|
219
|
+
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPS9' },
|
|
220
|
+
},
|
|
195
221
|
GPSF => { #2 (gpmd)
|
|
196
222
|
Name => 'GPSMeasureMode',
|
|
197
223
|
PrintConv => {
|
|
@@ -216,7 +242,10 @@ my %addUnits = (
|
|
|
216
242
|
Notes => 'gyroscope readings in rad/s',
|
|
217
243
|
Binary => 1,
|
|
218
244
|
},
|
|
245
|
+
# HCTL (GPMF) - seen: "Off" (fmt c)
|
|
246
|
+
# HDRV (GPMF) - seen: "N" (fmt c)
|
|
219
247
|
# HFLG (APP6) - seen: 0
|
|
248
|
+
# HSGT (GPMF) - seen: 'OFF' (fmt c)
|
|
220
249
|
ISOE => 'ISOSpeeds', #PH (gpmd)
|
|
221
250
|
ISOG => { #2 (gpmd)
|
|
222
251
|
Name => 'ImageSensorGain',
|
|
@@ -232,6 +261,7 @@ my %addUnits = (
|
|
|
232
261
|
},
|
|
233
262
|
# KLNS (GPMF-BACK/FRNT) - double[5] (fmt d, Max)
|
|
234
263
|
# LINF (GPMF) - seen: LAJ7061916601668,C3341326002180,C33632245450981 (fmt c) (Lens INFormation?)
|
|
264
|
+
# LMOD (GPMF) - seen: 'NONE' (fmt F)
|
|
235
265
|
LNED => { #PH (Karma)
|
|
236
266
|
Name => 'LocalPositionNED',
|
|
237
267
|
# UNIT=s,m,m,m,m/s,m/s,m/s
|
|
@@ -240,14 +270,20 @@ my %addUnits = (
|
|
|
240
270
|
Binary => 1,
|
|
241
271
|
},
|
|
242
272
|
MAGN => 'Magnetometer', #1 (gpmd) (units of uT)
|
|
273
|
+
# MAPX (GPMF) - seen: 1 (fmt f)
|
|
274
|
+
# MAPY (GPMF) - seen: 1 (fmt f)
|
|
243
275
|
# MFOV (GPMF-BACK/FRNT) - seen: 100 (fmt d, Max)
|
|
244
276
|
MINF => { #PH (GPMF - seen: HERO6 Black, fmt c)
|
|
245
277
|
Name => 'Model',
|
|
246
278
|
Groups => { 2 => 'Camera' },
|
|
247
279
|
Description => 'Camera Model Name',
|
|
248
280
|
},
|
|
281
|
+
# MMOD (GPMF) - seen: 'STEREO' (fmt c)
|
|
249
282
|
# MTYP (GPMF) - seen: 0,1,5,11 [1 for time-lapse video, 5 for 360 video, 11 for JPEG] (fmt B)
|
|
250
283
|
# MUID (GPMF) - seen: 3882563431 2278071152 967805802 411471936 0 0 0 0 (fmt L)
|
|
284
|
+
# MXCF (GPMF) - seen: 'x1' (fmt c)
|
|
285
|
+
# MYCF (GPMF) - seen: 'y1' (fmt c)
|
|
286
|
+
# ORDP (GPMF) - seen: 'Y' (fmt c)
|
|
251
287
|
OREN => { #PH (GPMF - seen: 'U', fmt c)
|
|
252
288
|
Name => 'AutoRotation',
|
|
253
289
|
PrintConv => {
|
|
@@ -258,11 +294,16 @@ my %addUnits = (
|
|
|
258
294
|
},
|
|
259
295
|
# (most of the "P" tags are ProTune settings - PH)
|
|
260
296
|
PHDR => 'HDRSetting', #PH (APP6 - seen: 0)
|
|
297
|
+
# PIMD (GPMF) - seen: 'AUTO' (fmt c)
|
|
261
298
|
PIMN => 'AutoISOMin', #PH (GPMF - seen: 100, fmt L)
|
|
262
299
|
PIMX => 'AutoISOMax', #PH (GPMF - seen: 1600, fmt L)
|
|
300
|
+
# POLY (GPMF) - seen: '0 2.11120247840881 0.14325800538063 -1.030...' (fmt f)
|
|
263
301
|
# PRAW (APP6) - seen: 0, 'N', 'Y' (fmt c)
|
|
302
|
+
# PRCN (GPMF) - seen: 65 zeros (fmt B)
|
|
264
303
|
PRES => 'PhotoResolution', #PH (APP6 - seen: '12MP_W')
|
|
265
304
|
# PRJT (APP6) - seen: 'GPRO','EACO' (fmt F, Hero8, Max)
|
|
305
|
+
# PRNA (GPMF) - seen 10 (fmt B)
|
|
306
|
+
# PRNU (GPMF) - seen 0 (fmt B)
|
|
266
307
|
PRTN => { #PH (GPMF - seen: 'N', fmt c)
|
|
267
308
|
Name => 'ProTune',
|
|
268
309
|
PrintConv => {
|
|
@@ -275,6 +316,9 @@ my %addUnits = (
|
|
|
275
316
|
PTSH => 'Sharpness', #PH (GPMF - seen: 'HIGH', fmt c)
|
|
276
317
|
PTWB => 'WhiteBalance', #PH (GPMF - seen: 'AUTO', fmt c)
|
|
277
318
|
# PVUL (APP6) - seen: 'F' (fmt c, Hero8, Max)
|
|
319
|
+
# PWPR (GPMF) - seen: 'PERFORMANCE' (fmt c)
|
|
320
|
+
# PYCF (GPMF) - seen: '[r0,r1,r2,r3,r4,r5,r6]' (fmt c)
|
|
321
|
+
# RAMP (GPMF) - seen: empty string (fmt c)
|
|
278
322
|
RATE => 'Rate', #PH (GPMF - seen: '0_5SEC', fmt c; APP6 - seen: '4_1SEC')
|
|
279
323
|
RMRK => { #2 (gpmd)
|
|
280
324
|
Name => 'Comments',
|
|
@@ -284,6 +328,7 @@ my %addUnits = (
|
|
|
284
328
|
Name => 'ScaleFactor',
|
|
285
329
|
Unknown => 1,
|
|
286
330
|
},
|
|
331
|
+
# SCAP (GPMF) - seen: 'N' (fmt c)
|
|
287
332
|
SCPR => { #PH (Karma) [stream was empty]
|
|
288
333
|
Name => 'ScaledPressure',
|
|
289
334
|
# UNIT=s,Pa,Pa,degC
|
|
@@ -291,6 +336,7 @@ my %addUnits = (
|
|
|
291
336
|
# SCAL=1000 0.00999999977648258 0.00999999977648258 100
|
|
292
337
|
%addUnits,
|
|
293
338
|
},
|
|
339
|
+
# SCTM (GPMF) - seen 0 (fmt L)
|
|
294
340
|
# SFTR (GPMF-BACK/FRNT) - seen 0.999,1.00004 (fmt d, Max)
|
|
295
341
|
# SHFX (GPMF-GEOC) - seen 22.92 (fmt d, Max)
|
|
296
342
|
# SHFY (GPMF-GEOC) - seen 0.123 (fmt d, Max)
|
|
@@ -355,6 +401,10 @@ my %addUnits = (
|
|
|
355
401
|
# TOCK => { Name => 'OutTime', Unknown => 1, ValueConv => '$val/1000' }, #1 (gpmd)
|
|
356
402
|
TSMP => { Name => 'TotalSamples', Unknown => 1 }, #2 (gpmd)
|
|
357
403
|
TYPE => { Name => 'StructureType', Unknown => 1 }, #2 (gpmd,GPMF - eg 'LLLllfFff', fmt c)
|
|
404
|
+
TZON => { # (GPMF) - seen: 60 (fmt s)
|
|
405
|
+
Name => 'TimeZone',
|
|
406
|
+
PrintConv => 'Image::ExifTool::TimeZoneString($val)',
|
|
407
|
+
},
|
|
358
408
|
UNIT => { #2 (gpmd) alternative units
|
|
359
409
|
Name => 'Units',
|
|
360
410
|
Unknown => 1,
|
|
@@ -373,6 +423,7 @@ my %addUnits = (
|
|
|
373
423
|
},
|
|
374
424
|
},
|
|
375
425
|
# VLTA (GPMF) - seen: 78 ('N') (fmt B -- wrong format?)
|
|
426
|
+
# VFPS (GPMF) - seen: '24000 1001' (fmt L)
|
|
376
427
|
VFRH => { #PH (Karma)
|
|
377
428
|
Name => 'VisualFlightRulesHUD',
|
|
378
429
|
BinaryData => 1,
|
|
@@ -380,13 +431,17 @@ my %addUnits = (
|
|
|
380
431
|
# TYPE=ffffsS
|
|
381
432
|
},
|
|
382
433
|
# VLTE (GPMF) - seen: 'Y','N' (fmt c)
|
|
434
|
+
# VRES (GPMF) - seen: '3840 3660' (fmt L)
|
|
383
435
|
WBAL => 'ColorTemperatures', #PH (gpmd)
|
|
384
436
|
WRGB => { #PH (gpmd)
|
|
385
437
|
Name => 'WhiteBalanceRGB',
|
|
386
438
|
Binary => 1,
|
|
387
439
|
},
|
|
388
440
|
# ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max)
|
|
389
|
-
#
|
|
441
|
+
# ZMPL (GPMF) - seen: 0.652929663658142 (fmt f)
|
|
442
|
+
#
|
|
443
|
+
# the following ref forum12825
|
|
444
|
+
#
|
|
390
445
|
MUID => {
|
|
391
446
|
Name => 'MediaUniqueID',
|
|
392
447
|
PrintConv => q{
|
|
@@ -418,7 +473,7 @@ my %addUnits = (
|
|
|
418
473
|
YAVG => 'LumaAverage',
|
|
419
474
|
);
|
|
420
475
|
|
|
421
|
-
# GoPro GPS5 tags (ref 2) (Hero5,Hero6)
|
|
476
|
+
# GoPro GPS5 tags (ref 2) (Hero5,Hero6,Hero9)
|
|
422
477
|
%Image::ExifTool::GoPro::GPS5 = (
|
|
423
478
|
PROCESS_PROC => \&ProcessString,
|
|
424
479
|
GROUPS => { 1 => 'GoPro', 2 => 'Location' },
|
|
@@ -435,8 +490,65 @@ my %addUnits = (
|
|
|
435
490
|
Name => 'GPSAltitude',
|
|
436
491
|
PrintConv => '"$val m"',
|
|
437
492
|
},
|
|
438
|
-
3 =>
|
|
439
|
-
|
|
493
|
+
3 => {
|
|
494
|
+
Name => 'GPSSpeed',
|
|
495
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
|
496
|
+
ValueConv => '$val * 3.6',
|
|
497
|
+
},
|
|
498
|
+
4 => {
|
|
499
|
+
Name => 'GPSSpeed3D',
|
|
500
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
|
501
|
+
ValueConv => '$val * 3.6',
|
|
502
|
+
},
|
|
503
|
+
);
|
|
504
|
+
|
|
505
|
+
# GoPro GPS9 tags (Hero13)
|
|
506
|
+
%Image::ExifTool::GoPro::GPS9 = (
|
|
507
|
+
PROCESS_PROC => \&ProcessString,
|
|
508
|
+
GROUPS => { 1 => 'GoPro', 2 => 'Location' },
|
|
509
|
+
VARS => { HEX_ID => 0, ID_LABEL => 'Index' },
|
|
510
|
+
0 => { # (unit='deg')
|
|
511
|
+
Name => 'GPSLatitude',
|
|
512
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
|
|
513
|
+
},
|
|
514
|
+
1 => { # (unit='deg')
|
|
515
|
+
Name => 'GPSLongitude',
|
|
516
|
+
PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
|
|
517
|
+
},
|
|
518
|
+
2 => { # (unit='m')
|
|
519
|
+
Name => 'GPSAltitude',
|
|
520
|
+
PrintConv => '"$val m"',
|
|
521
|
+
},
|
|
522
|
+
3 => {
|
|
523
|
+
Name => 'GPSSpeed',
|
|
524
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
|
525
|
+
ValueConv => '$val * 3.6',
|
|
526
|
+
},
|
|
527
|
+
4 => {
|
|
528
|
+
Name => 'GPSSpeed3D',
|
|
529
|
+
Notes => 'stored as m/s but converted to km/h when extracted',
|
|
530
|
+
ValueConv => '$val * 3.6',
|
|
531
|
+
},
|
|
532
|
+
5 => { # days since 2000
|
|
533
|
+
Name => 'GPSDays',
|
|
534
|
+
RawConv => '$$self{GPSDays} = $val; undef',
|
|
535
|
+
Hidden => 1,
|
|
536
|
+
},
|
|
537
|
+
6 => { # seconds of date/time
|
|
538
|
+
Name => 'GPSDateTime',
|
|
539
|
+
Groups => { 2 => 'Time' },
|
|
540
|
+
# (10957 days from Jan 1 1970 to Jan 1 2000)
|
|
541
|
+
RawConv => 'ConvertUnixTime(($$self{GPSDays} + 10957) * 24 * 3600 + $val, undef, 3)',
|
|
542
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
|
543
|
+
},
|
|
544
|
+
7 => 'GPSDOP',
|
|
545
|
+
8 => {
|
|
546
|
+
Name => 'GPSMeasureMode', #PH (NC)
|
|
547
|
+
PrintConv => {
|
|
548
|
+
2 => '2-Dimensional Measurement',
|
|
549
|
+
3 => '3-Dimensional Measurement',
|
|
550
|
+
},
|
|
551
|
+
},
|
|
440
552
|
);
|
|
441
553
|
|
|
442
554
|
# GoPro GPRI tags (ref PH) (Karma)
|
|
@@ -14,7 +14,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
14
14
|
use Image::ExifTool::XMP;
|
|
15
15
|
use Image::ExifTool::ZIP;
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.09';
|
|
18
18
|
|
|
19
19
|
# test for recognized OOXML document extensions
|
|
20
20
|
my %isOOXML = (
|
|
@@ -360,12 +360,12 @@ sub ProcessDOCX($$)
|
|
|
360
360
|
}
|
|
361
361
|
# process XML files (docProps/app.xml, docProps/core.xml, docProps/custom.xml)
|
|
362
362
|
my %dirInfo = (
|
|
363
|
-
DataPt
|
|
364
|
-
DirLen
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
},
|
|
363
|
+
DataPt => \$buff,
|
|
364
|
+
DirLen => length $buff,
|
|
365
|
+
# (skip over XML header if it exists)
|
|
366
|
+
DirStart => ($buff =~ /<\?xml\s+.*?\?>/g ? pos($buff) : 0),
|
|
367
|
+
DataLen => length $buff,
|
|
368
|
+
XMPParseOpts => { FoundProc => \&FoundTag },
|
|
369
369
|
);
|
|
370
370
|
$et->ProcessDirectory(\%dirInfo, $tagTablePtr);
|
|
371
371
|
undef $buff; # (free memory now)
|
|
@@ -28,7 +28,7 @@ use strict;
|
|
|
28
28
|
use vars qw($VERSION $AUTOLOAD $iptcDigestInfo %printFlags);
|
|
29
29
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
30
30
|
|
|
31
|
-
$VERSION = '1.
|
|
31
|
+
$VERSION = '1.71';
|
|
32
32
|
|
|
33
33
|
sub ProcessPhotoshop($$$);
|
|
34
34
|
sub WritePhotoshop($$$);
|
|
@@ -322,7 +322,7 @@ my %unicodeString = (
|
|
|
322
322
|
0x0432 => { Unknown => 1, Name => 'MeasurementScale' }, #7
|
|
323
323
|
0x0433 => { Unknown => 1, Name => 'TimelineInfo' }, #7
|
|
324
324
|
0x0434 => { Unknown => 1, Name => 'SheetDisclosure' }, #7
|
|
325
|
-
0x0435 => { Unknown => 1, Name => '
|
|
325
|
+
0x0435 => { Unknown => 1, Name => 'ChannelOptions' }, #7/forum16762
|
|
326
326
|
0x0436 => { Unknown => 1, Name => 'OnionSkins' }, #7
|
|
327
327
|
0x0438 => { Unknown => 1, Name => 'CountInfo' }, #7
|
|
328
328
|
0x043a => { Unknown => 1, Name => 'PrintInfo2' }, #7
|
|
@@ -109,7 +109,7 @@ my %insvLimit = (
|
|
|
109
109
|
The tags below are extracted from timed metadata in QuickTime and other
|
|
110
110
|
formats of video files when the ExtractEmbedded option is used. Although
|
|
111
111
|
most of these tags are combined into the single table below, ExifTool
|
|
112
|
-
currently reads
|
|
112
|
+
currently reads 82 different formats of timed GPS metadata from video files.
|
|
113
113
|
},
|
|
114
114
|
VARS => { NO_ID => 1 },
|
|
115
115
|
GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
|
|
@@ -8434,6 +8434,7 @@ my %tagExists = (
|
|
|
8434
8434
|
'channelcoarsegainadjust' => 1,
|
|
8435
8435
|
'channelmode' => 1,
|
|
8436
8436
|
'channelnumber' => 1,
|
|
8437
|
+
'channeloptions' => 1,
|
|
8437
8438
|
'channelusage' => 1,
|
|
8438
8439
|
'chapter' => 1,
|
|
8439
8440
|
'chaptercount' => 1,
|
|
@@ -9752,6 +9753,7 @@ my %tagExists = (
|
|
|
9752
9753
|
'gpshomelongitude' => 1,
|
|
9753
9754
|
'gpshorizontalaccuracy' => 1,
|
|
9754
9755
|
'gpsinfo' => 1,
|
|
9756
|
+
'gpsinfo9' => 1,
|
|
9755
9757
|
'gpslatitude2' => 1,
|
|
9756
9758
|
'gpslatituderaw' => 1,
|
|
9757
9759
|
'gpslog' => 1,
|
|
@@ -12212,6 +12214,7 @@ my %tagExists = (
|
|
|
12212
12214
|
'signature' => 1,
|
|
12213
12215
|
'signature_name' => 1,
|
|
12214
12216
|
'signatureformat' => 1,
|
|
12217
|
+
'signaturelength' => 1,
|
|
12215
12218
|
'signatureusagerights' => 1,
|
|
12216
12219
|
'signercontactinfo' => 1,
|
|
12217
12220
|
'significantbits' => 1,
|
|
@@ -12784,6 +12787,7 @@ my %tagExists = (
|
|
|
12784
12787
|
'uninitializeddatasize' => 1,
|
|
12785
12788
|
'uniquefileidentifier' => 1,
|
|
12786
12789
|
'uniqueid' => 1,
|
|
12790
|
+
'uniqueidentifier' => 1,
|
|
12787
12791
|
'unknown' => 1,
|
|
12788
12792
|
'unknown00' => 1,
|
|
12789
12793
|
'unknown01' => 1,
|
|
@@ -12,7 +12,7 @@ meta information extracted from or written to a file.
|
|
|
12
12
|
=head1 TAG TABLES
|
|
13
13
|
|
|
14
14
|
The tables listed below give the names of all tags recognized by ExifTool.
|
|
15
|
-
They contain a total of
|
|
15
|
+
They contain a total of 28187 tags, with 17502 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
|
|
@@ -6168,11 +6168,12 @@ These tags belong to the ExifTool XMP-seal family 1 group.
|
|
|
6168
6168
|
|
|
6169
6169
|
=head3 XMP SEAL Tags
|
|
6170
6170
|
|
|
6171
|
-
These tags are used in SEAL
|
|
6172
|
-
format, not XMP. ExifTool has
|
|
6173
|
-
JPG, TIFF, XMP, PNG, WEBP, HEIC,
|
|
6174
|
-
support in PDF, MKV and WAV. Use
|
|
6175
|
-
delete SEAL information in supported
|
|
6171
|
+
These tags are used in SEAL (Secure Evidence Attribution Label) content
|
|
6172
|
+
authentification, which is actually XML format, not XMP. ExifTool has
|
|
6173
|
+
read/delete support for SEAL information in JPG, TIFF, XMP, PNG, WEBP, HEIC,
|
|
6174
|
+
PPM, MOV and MP4 files, and read-only support in PDF, MKV and WAV. Use
|
|
6175
|
+
C<-seal:all=> on the command line to delete SEAL information in supported
|
|
6176
|
+
formats. See L<https://github.com/hackerfactor/SEAL> for the specification.
|
|
6176
6177
|
|
|
6177
6178
|
Tag ID Tag Name Writable
|
|
6178
6179
|
------ -------- --------
|
|
@@ -6180,12 +6181,15 @@ delete SEAL information in supported formats.
|
|
|
6180
6181
|
'copyright' Copyright no
|
|
6181
6182
|
'd' Domain no
|
|
6182
6183
|
'da' DigestAlgorithm no
|
|
6184
|
+
'id' Identifier no
|
|
6183
6185
|
'info' SEALComment no
|
|
6184
6186
|
'ka' KeyAlgorithm no
|
|
6185
6187
|
'kv' KeyVersion no
|
|
6186
6188
|
's' Signature no
|
|
6187
6189
|
'seal' SEALVersion no
|
|
6188
6190
|
'sf' SignatureFormat no
|
|
6191
|
+
'sl' SignatureLength no
|
|
6192
|
+
'uid' UniqueIdentifier no
|
|
6189
6193
|
|
|
6190
6194
|
=head3 XMP swf Tags
|
|
6191
6195
|
|
|
@@ -8873,7 +8877,7 @@ access to this information.
|
|
|
8873
8877
|
0x0432 MeasurementScale? no
|
|
8874
8878
|
0x0433 TimelineInfo? no
|
|
8875
8879
|
0x0434 SheetDisclosure? no
|
|
8876
|
-
0x0435
|
|
8880
|
+
0x0435 ChannelOptions? no
|
|
8877
8881
|
0x0436 OnionSkins? no
|
|
8878
8882
|
0x0438 CountInfo? no
|
|
8879
8883
|
0x043a PrintInfo2? no
|
|
@@ -24715,6 +24719,7 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
|
|
|
24715
24719
|
'GLPI' GPSPos GoPro GLPI
|
|
24716
24720
|
'GPRI' GPSRaw? GoPro GPRI
|
|
24717
24721
|
'GPS5' GPSInfo GoPro GPS5
|
|
24722
|
+
'GPS9' GPSInfo9 GoPro GPS9
|
|
24718
24723
|
'GPSA' GPSAltitudeSystem no
|
|
24719
24724
|
'GPSF' GPSMeasureMode no
|
|
24720
24725
|
'GPSP' GPSHPositioningError no
|
|
@@ -24760,6 +24765,7 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
|
|
|
24760
24765
|
'TMPC' CameraTemperature no
|
|
24761
24766
|
'TSMP' TotalSamples? no
|
|
24762
24767
|
'TYPE' StructureType? no
|
|
24768
|
+
'TZON' TimeZone no
|
|
24763
24769
|
'UNIF' InputUniformity no
|
|
24764
24770
|
'UNIT' Units? no
|
|
24765
24771
|
'VERS' MetadataVersion no
|
|
@@ -24804,6 +24810,19 @@ L<https://github.com/gopro/gpmf-parser> for details about this format.
|
|
|
24804
24810
|
3 GPSSpeed no
|
|
24805
24811
|
4 GPSSpeed3D no
|
|
24806
24812
|
|
|
24813
|
+
=head3 GoPro GPS9 Tags
|
|
24814
|
+
|
|
24815
|
+
Index Tag Name Writable
|
|
24816
|
+
----- -------- --------
|
|
24817
|
+
0 GPSLatitude no
|
|
24818
|
+
1 GPSLongitude no
|
|
24819
|
+
2 GPSAltitude no
|
|
24820
|
+
3 GPSSpeed no
|
|
24821
|
+
4 GPSSpeed3D no
|
|
24822
|
+
6 GPSDateTime no
|
|
24823
|
+
7 GPSDOP no
|
|
24824
|
+
8 GPSMeasureMode no
|
|
24825
|
+
|
|
24807
24826
|
=head3 GoPro KBAT Tags
|
|
24808
24827
|
|
|
24809
24828
|
Battery status information found in GoPro Karma videos.
|
|
@@ -29943,7 +29962,7 @@ for the official QuickTime specification.
|
|
|
29943
29962
|
The tags below are extracted from timed metadata in QuickTime and other
|
|
29944
29963
|
formats of video files when the ExtractEmbedded option is used. Although
|
|
29945
29964
|
most of these tags are combined into the single table below, ExifTool
|
|
29946
|
-
currently reads
|
|
29965
|
+
currently reads 82 different formats of timed GPS metadata from video files.
|
|
29947
29966
|
|
|
29948
29967
|
Tag Name Writable
|
|
29949
29968
|
-------- --------
|
|
@@ -2307,19 +2307,23 @@ my %sACDSeeRegionStruct = (
|
|
|
2307
2307
|
GROUPS => { 0 => 'XML', 1 => 'SEAL', 2 => 'Document' },
|
|
2308
2308
|
PROCESS_PROC => \&ProcessSEAL,
|
|
2309
2309
|
NOTES => q{
|
|
2310
|
-
These tags are used in SEAL
|
|
2311
|
-
format, not XMP. ExifTool has
|
|
2312
|
-
JPG, TIFF, XMP, PNG, WEBP, HEIC,
|
|
2313
|
-
support in PDF, MKV and WAV. Use
|
|
2314
|
-
delete SEAL information in supported
|
|
2310
|
+
These tags are used in SEAL (Secure Evidence Attribution Label) content
|
|
2311
|
+
authentification, which is actually XML format, not XMP. ExifTool has
|
|
2312
|
+
read/delete support for SEAL information in JPG, TIFF, XMP, PNG, WEBP, HEIC,
|
|
2313
|
+
PPM, MOV and MP4 files, and read-only support in PDF, MKV and WAV. Use
|
|
2314
|
+
C<-seal:all=> on the command line to delete SEAL information in supported
|
|
2315
|
+
formats. See L<https://github.com/hackerfactor/SEAL> for the specification.
|
|
2315
2316
|
},
|
|
2316
2317
|
seal=> 'SEALVersion',
|
|
2317
|
-
kv => 'KeyVersion',
|
|
2318
2318
|
ka => 'KeyAlgorithm',
|
|
2319
|
+
kv => 'KeyVersion',
|
|
2319
2320
|
da => 'DigestAlgorithm',
|
|
2320
|
-
sf => 'SignatureFormat',
|
|
2321
|
-
d => 'Domain',
|
|
2322
2321
|
b => 'ByteRange',
|
|
2322
|
+
d => 'Domain',
|
|
2323
|
+
uid => 'UniqueIdentifier',
|
|
2324
|
+
id => 'Identifier',
|
|
2325
|
+
sf => 'SignatureFormat',
|
|
2326
|
+
sl => 'SignatureLength',
|
|
2323
2327
|
's' => 'Signature',
|
|
2324
2328
|
info=> 'SEALComment',
|
|
2325
2329
|
copyright => { Name => 'Copyright', Groups => { 2 => 'Author' } },
|
data/bin/lib/Image/ExifTool.pm
CHANGED
|
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
|
30
30
|
%static_vars $advFmtSelf);
|
|
31
31
|
|
|
32
|
-
$VERSION = '13.
|
|
32
|
+
$VERSION = '13.04';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
|
@@ -2583,7 +2583,7 @@ sub Options($$;@)
|
|
|
2583
2583
|
warn("Can't set $param to undef\n");
|
|
2584
2584
|
}
|
|
2585
2585
|
} elsif (lc $param eq 'geodir') {
|
|
2586
|
-
$Image::ExifTool::Geolocation::geoDir = $newVal;
|
|
2586
|
+
$Image::ExifTool::Geolocation::geoDir = $newVal;
|
|
2587
2587
|
} else {
|
|
2588
2588
|
if ($param eq 'Escape') {
|
|
2589
2589
|
# set ESCAPE_PROC
|
|
@@ -4404,6 +4404,7 @@ sub DoneExtract($)
|
|
|
4404
4404
|
local $SIG{'__WARN__'} = \&SetWarning;
|
|
4405
4405
|
undef $evalWarning;
|
|
4406
4406
|
$$opts{GeolocMulti} = $$opts{Duplicates};
|
|
4407
|
+
$self->VPrint(0, "Geolocation arguments: '${arg}'\n");
|
|
4407
4408
|
my ($cities, $dist) = Image::ExifTool::Geolocation::Geolocate($arg, $opts);
|
|
4408
4409
|
delete $$opts{GeolocMulti};
|
|
4409
4410
|
if ($cities and (@$cities < 2 or $dist or not $self->Warn('Multiple Geolocation cities are possible',2))) {
|
|
@@ -8915,6 +8916,7 @@ sub GetTagInfo($$$;$$$)
|
|
|
8915
8916
|
my ($valPt, $format, $count);
|
|
8916
8917
|
|
|
8917
8918
|
my @infoArray = GetTagInfoList($tagTablePtr, $tagID);
|
|
8919
|
+
my $options = $$self{OPTIONS};
|
|
8918
8920
|
# evaluate condition
|
|
8919
8921
|
my $tagInfo;
|
|
8920
8922
|
foreach $tagInfo (@infoArray) {
|
|
@@ -8933,9 +8935,9 @@ sub GetTagInfo($$$;$$$)
|
|
|
8933
8935
|
}
|
|
8934
8936
|
}
|
|
8935
8937
|
# don't return Unknown tags unless that option is set (also see forum13716)
|
|
8936
|
-
if ($$tagInfo{Unknown} and not $$
|
|
8937
|
-
($$
|
|
8938
|
-
($$
|
|
8938
|
+
if ($$tagInfo{Unknown} and not $$options{Unknown} and not
|
|
8939
|
+
($$options{Verbose} or $$self{HTML_DUMP} or
|
|
8940
|
+
($$options{Validate} and not $$tagInfo{AddedUnknown})))
|
|
8939
8941
|
{
|
|
8940
8942
|
return undef;
|
|
8941
8943
|
}
|
|
@@ -8943,7 +8945,7 @@ sub GetTagInfo($$$;$$$)
|
|
|
8943
8945
|
return $tagInfo;
|
|
8944
8946
|
}
|
|
8945
8947
|
# generate information for unknown tags (numerical only) if required
|
|
8946
|
-
if (not $tagInfo and ($$
|
|
8948
|
+
if (not $tagInfo and ($$options{Unknown} or $$options{Verbose} or $$self{HTML_DUMP}) and
|
|
8947
8949
|
$tagID =~ /^\d+$/ and not $$self{NO_UNKNOWN})
|
|
8948
8950
|
{
|
|
8949
8951
|
my $printConv;
|
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: 13.
|
|
4
|
+
version: 13.04.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: 2024-11-
|
|
12
|
+
date: 2024-11-27 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: exiftool
|