exiftool-vendored.pl 12.89.0 → 12.96.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.
- package/bin/Changes +63 -3
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +2 -2
- package/bin/build_geolocation +1 -1
- package/bin/build_tag_lookup +29 -11
- package/bin/exiftool +18 -47
- package/bin/lib/Image/ExifTool/Canon.pm +147 -9
- package/bin/lib/Image/ExifTool/Font.pm +15 -4
- package/bin/lib/Image/ExifTool/Geotag.pm +19 -5
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +2 -2
- package/bin/lib/Image/ExifTool/Nikon.pm +35 -1
- package/bin/lib/Image/ExifTool/NikonSettings.pm +56 -1
- package/bin/lib/Image/ExifTool/OpenEXR.pm +3 -1
- package/bin/lib/Image/ExifTool/PNG.pm +10 -2
- package/bin/lib/Image/ExifTool/PostScript.pm +3 -12
- package/bin/lib/Image/ExifTool/QuickTime.pm +40 -15
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +203 -42
- package/bin/lib/Image/ExifTool/Samsung.pm +31 -20
- package/bin/lib/Image/ExifTool/TagLookup.pm +6923 -6903
- package/bin/lib/Image/ExifTool/TagNames.pod +112 -9
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +49 -17
- package/bin/lib/Image/ExifTool/Writer.pl +8 -54
- package/bin/lib/Image/ExifTool.pm +66 -4
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/package.json +3 -3
package/bin/Changes
CHANGED
|
@@ -7,6 +7,66 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 12.76. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
Sept. 1, 2024 - Version 12.96
|
|
11
|
+
|
|
12
|
+
- More improvements to handling of trailers on video files (and add ability to
|
|
13
|
+
write videos which have an unknown trailer)
|
|
14
|
+
- Fixed problem geotagging from some newer Google Takeout files
|
|
15
|
+
|
|
16
|
+
Aug. 30, 2024 - Version 12.95
|
|
17
|
+
|
|
18
|
+
- Added a couple of new CanonModelID values
|
|
19
|
+
- Decode ColorData for a couple of new Canon models
|
|
20
|
+
- Fixed problem writing video files which have some known trailer types
|
|
21
|
+
|
|
22
|
+
Aug. 29, 2024 - Version 12.94
|
|
23
|
+
|
|
24
|
+
- Added ability to geotag from new-format Google Takeout JSON files
|
|
25
|
+
- Added a few new Android and Xiaomi QuickTime Keys tags
|
|
26
|
+
- Added ability to read C2PA JUMBF metadata from TTF/OTF files
|
|
27
|
+
- Internal changes to code for creating new directories
|
|
28
|
+
- Changed Windows packages to have the application help text file in the
|
|
29
|
+
exiftool_files folder instead of writing it to a temporary directory
|
|
30
|
+
- Removed new QuickTime Keys tags added in 12.93 because these aren't used in
|
|
31
|
+
top-level metadata (written to the video track by Apple devices)
|
|
32
|
+
- Fixed the group names for synthesized default-language QuickTime tags and
|
|
33
|
+
added a verbose message when generating these tags
|
|
34
|
+
- Fixed warning in Geolocation.t self test
|
|
35
|
+
|
|
36
|
+
Aug. 20, 2024 - Version 12.93
|
|
37
|
+
|
|
38
|
+
- Added a new Nikon LensID
|
|
39
|
+
- Added a couple of new OpenEXR Compression types
|
|
40
|
+
- Added a couple of new QuickTime Keys tags
|
|
41
|
+
- Decode timed metadata from E-ACE B44 dashcam videos
|
|
42
|
+
- Made "Unrecognized" Samsung Meta warnings minor
|
|
43
|
+
- Fixed bug in -listg6 option which resulted in "uninitialized value" warnings
|
|
44
|
+
- Fixed decoding of Func1Button and Func2Button for the Nikon Z6/Z7
|
|
45
|
+
- Fixed bug reading JUMB metadata from JXL images
|
|
46
|
+
|
|
47
|
+
July 24, 2024 - Version 12.92
|
|
48
|
+
|
|
49
|
+
- Removed -w from exiftool shebang due to compatibility issues on some systems
|
|
50
|
+
|
|
51
|
+
July 24, 2024 - Version 12.91
|
|
52
|
+
|
|
53
|
+
- Added a couple of new OpenEXR Compression values (github#276)
|
|
54
|
+
- Updated 2 test files that were causing failed tests (ExifTool itself is
|
|
55
|
+
unchanged)
|
|
56
|
+
|
|
57
|
+
July 24, 2024 - Version 12.90
|
|
58
|
+
|
|
59
|
+
- Added support for reading Samsung trailer from PNG images
|
|
60
|
+
- Decode two more formats of timed GPS from MP4 videos
|
|
61
|
+
- Decode a few more Samung trailer tags (thanks Neal Krawetz)
|
|
62
|
+
- Decode Canon AntiFlicker tag
|
|
63
|
+
- Drop Nikon ShotInfo record when copying MakerNotes from NEF to JPG if it is
|
|
64
|
+
larger than 50000 bytes (then MakerNotes would be too large for a single
|
|
65
|
+
JPEG segment)
|
|
66
|
+
- Changed exiftool shebang to use env: "#!/usr/bin/env perl -w"
|
|
67
|
+
- Revert change of 12.84 to iterate through sub-documents with the -p option
|
|
68
|
+
only if -ee is used
|
|
69
|
+
|
|
10
70
|
July 12, 2024 - Version 12.89
|
|
11
71
|
|
|
12
72
|
- Added new Sony lenses and updated decoding of some tags (thanks Jos Roost)
|
|
@@ -15,9 +75,7 @@ July 12, 2024 - Version 12.89
|
|
|
15
75
|
|
|
16
76
|
July 11, 2024 - Version 12.88 - "New Windows/MacOS packages"
|
|
17
77
|
|
|
18
|
-
-
|
|
19
|
-
|
|
20
|
-
NOTE: The install procedure for the Windows executable has changed!
|
|
78
|
+
- NOTE: The install procedure for the Windows executable has changed!
|
|
21
79
|
- Windows EXE version now uses Oliver Betz's bundle with Strawberry Perl and
|
|
22
80
|
comes in 32- and 64-bit versions
|
|
23
81
|
- MacOS distribution now uses a flattened package
|
|
@@ -105,6 +163,8 @@ Apr. 23, 2024 - Version 12.84
|
|
|
105
163
|
cities
|
|
106
164
|
- Allow coordinates to be entered without comma separator for the Geolocation
|
|
107
165
|
feature as long as both coordinates have a decimal point
|
|
166
|
+
- Changed -p option to iterate through sub-documents if they exist even if -ee
|
|
167
|
+
isn't used
|
|
108
168
|
- Fixed long-standing bug in Windows version that didn't properly handle dates
|
|
109
169
|
older than 50 years when writing FileModifyDate or FileCreateDate
|
|
110
170
|
- Fixed API TimeZone option to work in Windows
|
package/bin/META.json
CHANGED
package/bin/META.yml
CHANGED
package/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-12.
|
|
113
|
-
cd Image-ExifTool-12.
|
|
112
|
+
gzip -dc Image-ExifTool-12.96.tar.gz | tar -xf -
|
|
113
|
+
cd Image-ExifTool-12.96
|
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
|
115
115
|
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
package/bin/build_geolocation
CHANGED
package/bin/build_tag_lookup
CHANGED
|
@@ -4,19 +4,18 @@
|
|
|
4
4
|
#
|
|
5
5
|
# Syntax: build_tag_lookup [-p] [-v]
|
|
6
6
|
#
|
|
7
|
-
# Options: -
|
|
7
|
+
# Options: -c - check dates and only build if necessary
|
|
8
|
+
# -p - preserve existing revision date in html files
|
|
8
9
|
# -v - verbose mode
|
|
9
10
|
#
|
|
10
11
|
# Created: 12/31/04 - P. Harvey
|
|
11
12
|
#
|
|
12
13
|
use strict;
|
|
13
14
|
|
|
14
|
-
print "Building tag lookup...\n";
|
|
15
|
-
|
|
16
15
|
my $file = 'lib/Image/ExifTool/TagLookup.pm';
|
|
17
16
|
my $podFile = 'lib/Image/ExifTool/TagNames.pod';
|
|
18
17
|
my $htmldir = 'html';
|
|
19
|
-
my $verbose;
|
|
18
|
+
my ($verbose, $check, $preserve);
|
|
20
19
|
|
|
21
20
|
BEGIN {
|
|
22
21
|
# get exe directory (and change to forward slashes)
|
|
@@ -25,22 +24,39 @@ BEGIN {
|
|
|
25
24
|
unshift @INC, "$exeDir/lib";
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
require Image::ExifTool::BuildTagLookup;
|
|
29
|
-
|
|
30
|
-
my $builder = new Image::ExifTool::BuildTagLookup;
|
|
31
|
-
|
|
32
27
|
foreach (@ARGV) {
|
|
33
28
|
if ($_ eq '-p') {
|
|
34
|
-
|
|
35
|
-
print("(preserving revision dates)\n");
|
|
36
|
-
next;
|
|
29
|
+
$preserve = 1;
|
|
37
30
|
} elsif ($_ eq '-v') {
|
|
38
31
|
$verbose = 1;
|
|
32
|
+
} elsif ($_ eq '-c') {
|
|
33
|
+
$check = 1;
|
|
39
34
|
} else {
|
|
40
35
|
die "Unknown option '$_'\n";
|
|
41
36
|
}
|
|
42
37
|
}
|
|
43
38
|
|
|
39
|
+
if ($check and -e '.built_tag_lookup') {
|
|
40
|
+
# find most recent .p? file
|
|
41
|
+
my $latest = 1e6;
|
|
42
|
+
$latest > -M and $latest = -M foreach <lib/Image/ExifTool/*.p?>;
|
|
43
|
+
if ($latest > -M '.built_tag_lookup') {
|
|
44
|
+
print "Tag Lookup is up-to-date\n";
|
|
45
|
+
exit 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
print "Building tag lookup...\n";
|
|
50
|
+
|
|
51
|
+
require Image::ExifTool::BuildTagLookup;
|
|
52
|
+
|
|
53
|
+
my $builder = new Image::ExifTool::BuildTagLookup;
|
|
54
|
+
|
|
55
|
+
if ($preserve) {
|
|
56
|
+
$$builder{PRESERVE_DATE} = 1;
|
|
57
|
+
print("(preserving revision dates)\n");
|
|
58
|
+
}
|
|
59
|
+
|
|
44
60
|
my $count = $builder->{COUNT};
|
|
45
61
|
foreach (sort keys %$count) {
|
|
46
62
|
printf "%5d %s\n", $$count{$_}, $_;
|
|
@@ -78,6 +94,8 @@ if ($diff > $same) {
|
|
|
78
94
|
printf "%5d HTML files changed\n", $diff;
|
|
79
95
|
}
|
|
80
96
|
|
|
97
|
+
system 'echo `date` > .built_tag_lookup';
|
|
98
|
+
|
|
81
99
|
exit(0);
|
|
82
100
|
|
|
83
101
|
# end
|
package/bin/exiftool
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/perl
|
|
1
|
+
#!/usr/bin/env perl
|
|
2
2
|
#------------------------------------------------------------------------------
|
|
3
3
|
# File: exiftool
|
|
4
4
|
#
|
|
@@ -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.96';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -232,10 +232,6 @@ my $stayOpen = 0;
|
|
|
232
232
|
my $rtnValApp = 0; # app return value (0=success)
|
|
233
233
|
my $curTitle = ''; # current window title
|
|
234
234
|
|
|
235
|
-
# lookup for O/S names which may use a backslash as a directory separator
|
|
236
|
-
# (ref File::Spec of PathTools-3.2701)
|
|
237
|
-
my %hasBackslash = ( MSWin32 => 1, os2 => 1, dos => 1, NetWare => 1, symbian => 1, cygwin => 1 );
|
|
238
|
-
|
|
239
235
|
# lookup for O/S names which use CR/LF newlines
|
|
240
236
|
my $isCRLF = { MSWin32 => 1, os2 => 1, dos => 1 }->{$^O};
|
|
241
237
|
|
|
@@ -1615,7 +1611,7 @@ if ($argFormat) {
|
|
|
1615
1611
|
}
|
|
1616
1612
|
|
|
1617
1613
|
# change to forward slashes if necessary in all filenames (like CleanFilename)
|
|
1618
|
-
if (
|
|
1614
|
+
if (Image::ExifTool::IsPC()) {
|
|
1619
1615
|
tr/\\/\// foreach @files;
|
|
1620
1616
|
}
|
|
1621
1617
|
|
|
@@ -2310,8 +2306,8 @@ sub GetImageInfo($$)
|
|
|
2310
2306
|
# output using print format file (-p) option
|
|
2311
2307
|
my ($type, $doc, $grp, $lastDoc, $cache);
|
|
2312
2308
|
$fileTrailer = '';
|
|
2313
|
-
# repeat for each
|
|
2314
|
-
if (
|
|
2309
|
+
# repeat for each embedded document if necessary (only if -ee used)
|
|
2310
|
+
if ($et->Options('ExtractEmbedded')) {
|
|
2315
2311
|
# (cache tag keys if there are sub-documents)
|
|
2316
2312
|
$lastDoc = $$et{DOC_COUNT} and $cache = { };
|
|
2317
2313
|
} else {
|
|
@@ -3774,7 +3770,7 @@ sub DoSetFromFile($$$)
|
|
|
3774
3770
|
# Returns: nothing, but changes filename if necessary
|
|
3775
3771
|
sub CleanFilename($)
|
|
3776
3772
|
{
|
|
3777
|
-
$_[0] =~ tr/\\/\// if
|
|
3773
|
+
$_[0] =~ tr/\\/\// if Image::ExifTool::IsPC();
|
|
3778
3774
|
}
|
|
3779
3775
|
|
|
3780
3776
|
#------------------------------------------------------------------------------
|
|
@@ -4097,7 +4093,7 @@ sub AbsPath($)
|
|
|
4097
4093
|
$path = eval { Cwd::abs_path($file) };
|
|
4098
4094
|
# make the delimiters and case consistent
|
|
4099
4095
|
# (abs_path is very inconsistent about what it returns in Windows)
|
|
4100
|
-
if (defined $path and
|
|
4096
|
+
if (defined $path and Image::ExifTool::IsPC()) {
|
|
4101
4097
|
$path =~ tr/\\/\//;
|
|
4102
4098
|
$path = lc $path;
|
|
4103
4099
|
}
|
|
@@ -4353,46 +4349,21 @@ sub NextUnusedFilename($;$)
|
|
|
4353
4349
|
# Create directory for specified file
|
|
4354
4350
|
# Inputs: 0) complete file name including path
|
|
4355
4351
|
# Returns: true if a directory was created
|
|
4356
|
-
my $k32CreateDir;
|
|
4357
4352
|
sub CreateDirectory($)
|
|
4358
4353
|
{
|
|
4359
4354
|
my $file = shift;
|
|
4360
|
-
my
|
|
4361
|
-
(
|
|
4362
|
-
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
$
|
|
4367
|
-
if (length $dir and not $mt->IsDirectory($dir) and
|
|
4368
|
-
# don't try to create a network drive root directory
|
|
4369
|
-
not ($hasBackslash{$^O} and $dir =~ m{^//[^/]*$}))
|
|
4370
|
-
{
|
|
4371
|
-
my $success;
|
|
4372
|
-
# create directory since it doesn't exist
|
|
4373
|
-
my $d2 = $dir; # (must make a copy in case EncodeFileName recodes it)
|
|
4374
|
-
if ($mt->EncodeFileName($d2)) {
|
|
4375
|
-
# handle Windows Unicode directory names
|
|
4376
|
-
unless (eval { require Win32::API }) {
|
|
4377
|
-
Error('Install Win32::API to create directories with Unicode names');
|
|
4378
|
-
return 0;
|
|
4379
|
-
}
|
|
4380
|
-
unless ($k32CreateDir) {
|
|
4381
|
-
$k32CreateDir = Win32::API->new('KERNEL32', 'CreateDirectoryW', 'PP', 'I');
|
|
4382
|
-
}
|
|
4383
|
-
$success = $k32CreateDir->Call($d2, 0) if $k32CreateDir;
|
|
4384
|
-
} else {
|
|
4385
|
-
$success = mkdir($d2, 0777);
|
|
4386
|
-
}
|
|
4387
|
-
$success or Error("Error creating directory $dir\n"), return 0;
|
|
4388
|
-
$verbose and print $vout "Created directory $dir\n";
|
|
4389
|
-
$created = 1;
|
|
4390
|
-
}
|
|
4391
|
-
$dir .= '/';
|
|
4355
|
+
my $err = $mt->CreateDirectory($file);
|
|
4356
|
+
if (defined $err) {
|
|
4357
|
+
$err and Error("$err\n"), return 0;
|
|
4358
|
+
if ($verbose) {
|
|
4359
|
+
my $dir;
|
|
4360
|
+
($dir = $file) =~ s(/[^/]*$)();
|
|
4361
|
+
print $vout "Created directory $dir\n";
|
|
4392
4362
|
}
|
|
4393
|
-
++$countNewDir
|
|
4363
|
+
++$countNewDir;
|
|
4364
|
+
return 1;
|
|
4394
4365
|
}
|
|
4395
|
-
return
|
|
4366
|
+
return 0;
|
|
4396
4367
|
}
|
|
4397
4368
|
|
|
4398
4369
|
#------------------------------------------------------------------------------
|
|
@@ -5684,7 +5655,7 @@ with this command:
|
|
|
5684
5655
|
|
|
5685
5656
|
produces output like this:
|
|
5686
5657
|
|
|
5687
|
-
-- Generated by ExifTool 12.
|
|
5658
|
+
-- Generated by ExifTool 12.96 --
|
|
5688
5659
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5689
5660
|
(f/5.6, 1/60s, ISO 100)
|
|
5690
5661
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.81';
|
|
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)
|
|
@@ -995,6 +995,8 @@ $VERSION = '4.78';
|
|
|
995
995
|
0x80000481 => 'EOS R6 Mark II', #42
|
|
996
996
|
0x80000487 => 'EOS R8', #42
|
|
997
997
|
0x80000491 => 'PowerShot V10', #25
|
|
998
|
+
0x80000495 => 'EOS R1', #PH
|
|
999
|
+
0x80000496 => 'R5 Mark II', #forum16406
|
|
998
1000
|
0x80000498 => 'EOS R100', #25
|
|
999
1001
|
0x80000520 => 'EOS D2000C', #IB
|
|
1000
1002
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
@@ -1978,6 +1980,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
1978
1980
|
Name => 'ColorData11',
|
|
1979
1981
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' },
|
|
1980
1982
|
},
|
|
1983
|
+
{ # (int16u[4528]) - R1/R5mkII ref forum16406
|
|
1984
|
+
Condition => '$count == 4528',
|
|
1985
|
+
Name => 'ColorData12',
|
|
1986
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData12' },
|
|
1987
|
+
},
|
|
1981
1988
|
{
|
|
1982
1989
|
Name => 'ColorDataUnknown',
|
|
1983
1990
|
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorDataUnknown' },
|
|
@@ -6403,6 +6410,8 @@ my %ciMaxFocal = (
|
|
|
6403
6410
|
12 => 'Flexizone Multi (9 point)', #PH (750D, 9 points)
|
|
6404
6411
|
13 => 'Flexizone Single', #PH (EOS M default, live view) (R7 calls this '1-point AF', ref github268)
|
|
6405
6412
|
14 => 'Large Zone AF', #PH/forum6237 (7DmkII)
|
|
6413
|
+
16 => 'Large Zone AF (vertical)', #forum16223
|
|
6414
|
+
17 => 'Large Zone AF (horizontal)', #forum16223
|
|
6406
6415
|
19 => 'Flexible Zone AF 1', #github268 (R7)
|
|
6407
6416
|
20 => 'Flexible Zone AF 2', #github268 (R7)
|
|
6408
6417
|
21 => 'Flexible Zone AF 3', #github268 (R7)
|
|
@@ -6921,6 +6930,10 @@ my %ciMaxFocal = (
|
|
|
6921
6930
|
Name => 'FlashExposureLock',
|
|
6922
6931
|
PrintConv => \%offOn,
|
|
6923
6932
|
},
|
|
6933
|
+
32 => { #forum16257
|
|
6934
|
+
Name => 'AntiFlicker',
|
|
6935
|
+
PrintConv => \%offOn,
|
|
6936
|
+
},
|
|
6924
6937
|
0x3d => { #IB
|
|
6925
6938
|
Name => 'RFLensType',
|
|
6926
6939
|
Format => 'int16u',
|
|
@@ -8607,6 +8620,126 @@ my %ciMaxFocal = (
|
|
|
8607
8620
|
},
|
|
8608
8621
|
);
|
|
8609
8622
|
|
|
8623
|
+
# Color data (MakerNotes tag 0x4001, count=4528, ref PH)
|
|
8624
|
+
%Image::ExifTool::Canon::ColorData12 = (
|
|
8625
|
+
%binaryDataAttrs,
|
|
8626
|
+
NOTES => 'These tags are used by the EOS R1 and R5mkII',
|
|
8627
|
+
FORMAT => 'int16s',
|
|
8628
|
+
FIRST_ENTRY => 0,
|
|
8629
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8630
|
+
DATAMEMBER => [ 0 ],
|
|
8631
|
+
IS_SUBDIR => [ 0x140 ],
|
|
8632
|
+
0x00 => {
|
|
8633
|
+
Name => 'ColorDataVersion',
|
|
8634
|
+
DataMember => 'ColorDataVersion',
|
|
8635
|
+
RawConv => '$$self{ColorDataVersion} = $val',
|
|
8636
|
+
PrintConv => {
|
|
8637
|
+
64 => '64 (R1, R5 Mark II)',
|
|
8638
|
+
},
|
|
8639
|
+
},
|
|
8640
|
+
0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, # (NC)
|
|
8641
|
+
0x6d => 'ColorTempAsShot', # (NC)
|
|
8642
|
+
0x6e => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' },
|
|
8643
|
+
0x72 => 'ColorTempDaylight',
|
|
8644
|
+
0x73 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' },
|
|
8645
|
+
0x77 => 'ColorTempShade',
|
|
8646
|
+
0x78 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' },
|
|
8647
|
+
0x7c => 'ColorTempCloudy',
|
|
8648
|
+
0x7d => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' },
|
|
8649
|
+
0x81 => 'ColorTempTungsten',
|
|
8650
|
+
0x82 => { Name => 'WB_RGGBLevelsFluorescent',Format=> 'int16s[4]' },
|
|
8651
|
+
0x86 => 'ColorTempFluorescent' ,
|
|
8652
|
+
0x87 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' },
|
|
8653
|
+
0x8b => 'ColorTempFlash',
|
|
8654
|
+
0x8c => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 },
|
|
8655
|
+
0x90 => { Name => 'ColorTempUnknown2', Unknown => 1 },
|
|
8656
|
+
0x91 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 },
|
|
8657
|
+
0x95 => { Name => 'ColorTempUnknown3', Unknown => 1 },
|
|
8658
|
+
0x96 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 },
|
|
8659
|
+
0x9a => { Name => 'ColorTempUnknown4', Unknown => 1 },
|
|
8660
|
+
0x9b => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 },
|
|
8661
|
+
0x9f => { Name => 'ColorTempUnknown5', Unknown => 1 },
|
|
8662
|
+
0xa0 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 },
|
|
8663
|
+
0xa4 => { Name => 'ColorTempUnknown6', Unknown => 1 },
|
|
8664
|
+
0xa5 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 },
|
|
8665
|
+
0xa9 => { Name => 'ColorTempUnknown7', Unknown => 1 },
|
|
8666
|
+
0xaa => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 },
|
|
8667
|
+
0xae => { Name => 'ColorTempUnknown8', Unknown => 1 },
|
|
8668
|
+
0xaf => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 },
|
|
8669
|
+
0xb3 => { Name => 'ColorTempUnknown9', Unknown => 1 },
|
|
8670
|
+
0xb4 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 },
|
|
8671
|
+
0xb8 => { Name => 'ColorTempUnknown10', Unknown => 1 },
|
|
8672
|
+
0xb9 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 },
|
|
8673
|
+
0xbd => { Name => 'ColorTempUnknown11', Unknown => 1 },
|
|
8674
|
+
0xbe => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 },
|
|
8675
|
+
0xc2 => { Name => 'ColorTempUnknown12', Unknown => 1 },
|
|
8676
|
+
0xc3 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 },
|
|
8677
|
+
0xc7 => { Name => 'ColorTempUnknown13', Unknown => 1 },
|
|
8678
|
+
0xc8 => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 },
|
|
8679
|
+
0xcc => { Name => 'ColorTempUnknown14', Unknown => 1 },
|
|
8680
|
+
0xcd => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 },
|
|
8681
|
+
0xd1 => { Name => 'ColorTempUnknown15', Unknown => 1 },
|
|
8682
|
+
0xd2 => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 },
|
|
8683
|
+
0xd6 => { Name => 'ColorTempUnknown16', Unknown => 1 },
|
|
8684
|
+
0xd7 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 },
|
|
8685
|
+
0xdb => { Name => 'ColorTempUnknown17', Unknown => 1 },
|
|
8686
|
+
0xdc => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 },
|
|
8687
|
+
0xe0 => { Name => 'ColorTempUnknown18', Unknown => 1 },
|
|
8688
|
+
0xe1 => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 },
|
|
8689
|
+
0xe5 => { Name => 'ColorTempUnknown19', Unknown => 1 },
|
|
8690
|
+
0xe6 => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 },
|
|
8691
|
+
0xea => { Name => 'ColorTempUnknown20', Unknown => 1 },
|
|
8692
|
+
0xeb => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 },
|
|
8693
|
+
0xef => { Name => 'ColorTempUnknown21', Unknown => 1 },
|
|
8694
|
+
0xf0 => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 },
|
|
8695
|
+
0xf4 => { Name => 'ColorTempUnknown22', Unknown => 1 },
|
|
8696
|
+
0xf5 => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 },
|
|
8697
|
+
0xf9 => { Name => 'ColorTempUnknown23', Unknown => 1 },
|
|
8698
|
+
0xfa => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 },
|
|
8699
|
+
0xfe => { Name => 'ColorTempUnknown24', Unknown => 1 },
|
|
8700
|
+
0xff => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 },
|
|
8701
|
+
0x103 => { Name => 'ColorTempUnknown25', Unknown => 1 },
|
|
8702
|
+
0x104 => { Name => 'WB_RGGBLevelsUnknown26',Format => 'int16s[4]', Unknown => 1 },
|
|
8703
|
+
0x108 => { Name => 'ColorTempUnknown26', Unknown => 1 },
|
|
8704
|
+
0x109 => { Name => 'WB_RGGBLevelsUnknown27',Format => 'int16s[4]', Unknown => 1 },
|
|
8705
|
+
0x10d => { Name => 'ColorTempUnknown27', Unknown => 1 },
|
|
8706
|
+
0x10e => { Name => 'WB_RGGBLevelsUnknown28',Format => 'int16s[4]', Unknown => 1 },
|
|
8707
|
+
0x112 => { Name => 'ColorTempUnknown28', Unknown => 1 },
|
|
8708
|
+
0x113 => { Name => 'WB_RGGBLevelsUnknown29',Format => 'int16s[4]', Unknown => 1 },
|
|
8709
|
+
0x117 => { Name => 'ColorTempUnknown29', Unknown => 1 },
|
|
8710
|
+
0x118 => { Name => 'WB_RGGBLevelsUnknown30',Format => 'int16s[4]', Unknown => 1 },
|
|
8711
|
+
0x11c => { Name => 'ColorTempUnknown30', Unknown => 1 },
|
|
8712
|
+
0x11d => { Name => 'WB_RGGBLevelsUnknown31',Format => 'int16s[4]', Unknown => 1 },
|
|
8713
|
+
0x121 => { Name => 'ColorTempUnknown31', Unknown => 1 },
|
|
8714
|
+
0x122 => { Name => 'WB_RGGBLevelsUnknown32',Format => 'int16s[4]', Unknown => 1 },
|
|
8715
|
+
0x126 => { Name => 'ColorTempUnknown32', Unknown => 1 },
|
|
8716
|
+
0x127 => { Name => 'WB_RGGBLevelsUnknown33',Format => 'int16s[4]', Unknown => 1 },
|
|
8717
|
+
0x12b => { Name => 'ColorTempUnknown33', Unknown => 1 },
|
|
8718
|
+
0x140 => {
|
|
8719
|
+
Name => 'ColorCalib',
|
|
8720
|
+
Format => 'undef[120]',
|
|
8721
|
+
Unknown => 1,
|
|
8722
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
|
|
8723
|
+
},
|
|
8724
|
+
0x17f => {
|
|
8725
|
+
Name => 'PerChannelBlackLevel',
|
|
8726
|
+
Format => 'int16u[4]',
|
|
8727
|
+
},
|
|
8728
|
+
0x294 => {
|
|
8729
|
+
Name => 'NormalWhiteLevel',
|
|
8730
|
+
Format => 'int16u',
|
|
8731
|
+
RawConv => '$val || undef',
|
|
8732
|
+
},
|
|
8733
|
+
0x295 => {
|
|
8734
|
+
Name => 'SpecularWhiteLevel',
|
|
8735
|
+
Format => 'int16u',
|
|
8736
|
+
},
|
|
8737
|
+
0x296 => {
|
|
8738
|
+
Name => 'LinearityUpperMargin',
|
|
8739
|
+
Format => 'int16u',
|
|
8740
|
+
},
|
|
8741
|
+
);
|
|
8742
|
+
|
|
8610
8743
|
# Unknown color data (MakerNotes tag 0x4001)
|
|
8611
8744
|
%Image::ExifTool::Canon::ColorDataUnknown = (
|
|
8612
8745
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -9123,19 +9256,19 @@ my %filterConv = (
|
|
|
9123
9256
|
2 => 'Disable',
|
|
9124
9257
|
},
|
|
9125
9258
|
},
|
|
9126
|
-
18 => { #52
|
|
9259
|
+
18 => { #52/forum16223
|
|
9127
9260
|
Name => 'AFStatusViewfinder',
|
|
9128
|
-
Condition => '$$self{Model} =~ /1D X/',
|
|
9129
|
-
Notes => '1D X
|
|
9261
|
+
Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
|
|
9262
|
+
Notes => '1D X and R models',
|
|
9130
9263
|
PrintConv => {
|
|
9131
9264
|
0 => 'Show in Field of View',
|
|
9132
9265
|
1 => 'Show Outside View',
|
|
9133
9266
|
},
|
|
9134
9267
|
},
|
|
9135
|
-
19 => { #52
|
|
9268
|
+
19 => { #52/forum16223
|
|
9136
9269
|
Name => 'InitialAFPointInServo',
|
|
9137
|
-
Condition => '$$self{Model} =~ /1D X/',
|
|
9138
|
-
Notes => '1D X
|
|
9270
|
+
Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
|
|
9271
|
+
Notes => '1D X and R models',
|
|
9139
9272
|
PrintConv => {
|
|
9140
9273
|
0 => 'Initial AF Point Selected',
|
|
9141
9274
|
1 => 'Manual AF Point',
|
|
@@ -9193,14 +9326,19 @@ my %filterConv = (
|
|
|
9193
9326
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
|
9194
9327
|
},
|
|
9195
9328
|
8 => {
|
|
9196
|
-
Name => '
|
|
9329
|
+
Name => 'MinFocalLength2',
|
|
9330
|
+
Notes => q{
|
|
9331
|
+
these seem to be min/max focal length without teleconverter, as opposed to
|
|
9332
|
+
MinFocalLength and MaxFocalLength which include the effect of a
|
|
9333
|
+
teleconverter
|
|
9334
|
+
}, #forum16309
|
|
9197
9335
|
ValueConv => '$val / 10',
|
|
9198
9336
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
|
9199
9337
|
PrintConv => '"$val mm"',
|
|
9200
9338
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
|
9201
9339
|
},
|
|
9202
9340
|
9 => {
|
|
9203
|
-
Name => '
|
|
9341
|
+
Name => 'MaxFocalLength2',
|
|
9204
9342
|
ValueConv => '$val / 10',
|
|
9205
9343
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
|
9206
9344
|
PrintConv => '"$val mm"',
|
|
@@ -19,7 +19,7 @@ use strict;
|
|
|
19
19
|
use vars qw($VERSION %ttLang);
|
|
20
20
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
21
21
|
|
|
22
|
-
$VERSION = '1.
|
|
22
|
+
$VERSION = '1.11';
|
|
23
23
|
|
|
24
24
|
sub ProcessOTF($$);
|
|
25
25
|
|
|
@@ -189,6 +189,9 @@ my %ttCharset = (
|
|
|
189
189
|
name => {
|
|
190
190
|
SubDirectory => { TagTable => 'Image::ExifTool::Font::Name' },
|
|
191
191
|
},
|
|
192
|
+
C2PA => {
|
|
193
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Jpeg2000::Main', Start => 20 },
|
|
194
|
+
},
|
|
192
195
|
PFM => {
|
|
193
196
|
Name => 'PFMHeader',
|
|
194
197
|
SubDirectory => { TagTable => 'Image::ExifTool::Font::PFM' },
|
|
@@ -389,10 +392,12 @@ sub ProcessOTF($$)
|
|
|
389
392
|
$$et{INDENT} .= '| ';
|
|
390
393
|
$et->VerboseDir('TrueType', $numTables) if $verbose;
|
|
391
394
|
|
|
395
|
+
my %processTag = ( name => 1, C2PA => 1 ); # tags to process (skip all others)
|
|
396
|
+
|
|
392
397
|
for ($pos=0; $pos<$len; $pos+=16) {
|
|
393
|
-
# look for
|
|
398
|
+
# look for tags to process
|
|
394
399
|
my $tag = substr($tbl, $pos, 4);
|
|
395
|
-
next unless $tag
|
|
400
|
+
next unless $processTag{$tag} or $verbose;
|
|
396
401
|
my $offset = Get32u(\$tbl, $pos + 8);
|
|
397
402
|
my $size = Get32u(\$tbl, $pos + 12);
|
|
398
403
|
unless ($raf->Seek($offset+$base, 0) and $raf->Read($buff, $size) == $size) {
|
|
@@ -405,9 +410,15 @@ sub ProcessOTF($$)
|
|
|
405
410
|
$$et{INDENT}, $pos/16, $tag, $offset, $size);
|
|
406
411
|
$et->VPrint(0, $str);
|
|
407
412
|
$et->VerboseDump(\$buff, Addr => $offset) if $verbose > 2;
|
|
408
|
-
next unless $tag
|
|
413
|
+
next unless $processTag{$tag};
|
|
409
414
|
}
|
|
410
415
|
next unless $size >= 8;
|
|
416
|
+
unless ($tag eq 'name') {
|
|
417
|
+
my $tagTablePtr = GetTagTable('Image::ExifTool::Font::Main');
|
|
418
|
+
$et->HandleTag($tagTablePtr, $tag, undef, DataPt => \$buff, Size => length($buff));
|
|
419
|
+
next;
|
|
420
|
+
}
|
|
421
|
+
# process the 'name' tag
|
|
411
422
|
my $entries = Get16u(\$buff, 2);
|
|
412
423
|
my $recEnd = 6 + $entries * 12;
|
|
413
424
|
if ($recEnd > $size) {
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
# 2020/12/01 - PH Added ability to read DJI CSV log files
|
|
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
|
+
# 2024/08/28 - PH Added support for new Google Takeout JSON format
|
|
19
20
|
#
|
|
20
21
|
# References: 1) http://www.topografix.com/GPX/1/1/
|
|
21
22
|
# 2) http://www.gpsinformation.org/dale/nmea.htm#GSA
|
|
@@ -30,7 +31,7 @@ use vars qw($VERSION);
|
|
|
30
31
|
use Image::ExifTool qw(:Public);
|
|
31
32
|
use Image::ExifTool::GPS;
|
|
32
33
|
|
|
33
|
-
$VERSION = '1.
|
|
34
|
+
$VERSION = '1.78';
|
|
34
35
|
|
|
35
36
|
sub JITTER() { return 2 } # maximum time jitter
|
|
36
37
|
|
|
@@ -151,7 +152,7 @@ sub LoadTrackLog($$;$)
|
|
|
151
152
|
my ($raf, $from, $time, $isDate, $noDate, $noDateChanged, $lastDate, $dateFlarm);
|
|
152
153
|
my ($nmeaStart, $fixSecs, @fixTimes, $lastFix, %nmea, @csvHeadings, $sortFixes);
|
|
153
154
|
my ($canCut, $cutPDOP, $cutHDOP, $cutSats, $e0, $e1, @tmp, $trackFile, $trackTime);
|
|
154
|
-
my $scaleSpeed;
|
|
155
|
+
my ($scaleSpeed, $startTime);
|
|
155
156
|
|
|
156
157
|
unless (eval { require Time::Local }) {
|
|
157
158
|
return 'Geotag feature requires Time::Local installed';
|
|
@@ -318,10 +319,13 @@ sub LoadTrackLog($$;$)
|
|
|
318
319
|
}
|
|
319
320
|
}
|
|
320
321
|
next;
|
|
321
|
-
} elsif (/"(timelineObjects|placeVisit|activitySegment|latitudeE7)"
|
|
322
|
+
} elsif (/"(timelineObjects|placeVisit|activitySegment|latitudeE7)"\s*:/) {
|
|
322
323
|
# Google Takeout JSON format
|
|
323
324
|
$format = 'JSON';
|
|
324
325
|
$sortFixes = 1; # (fixes are not all in order for this format)
|
|
326
|
+
} elsif (/"(durationMinutesOffsetFromStartTime|startTime)"\s*:/) {
|
|
327
|
+
$format = 'JSON'; # new Google Takeout JSON format (fixes seem to be in order)
|
|
328
|
+
$raf->Seek(0,0); # rewind to start of file
|
|
325
329
|
} else {
|
|
326
330
|
# search only first 50 lines of file for a valid fix
|
|
327
331
|
last if ++$skipped > 50;
|
|
@@ -558,14 +562,24 @@ DoneFix: $isDate = 1;
|
|
|
558
562
|
next;
|
|
559
563
|
} elsif ($format eq 'JSON') {
|
|
560
564
|
# Google Takeout JSON format
|
|
561
|
-
if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp)"
|
|
565
|
+
if (/"(latitudeE7|longitudeE7|latE7|lngE7|timestamp|startTime|point|durationMinutesOffsetFromStartTime)"\s*:\s*"?(.*?)"?,?\s*[\x0d\x0a]/) {
|
|
562
566
|
if ($1 eq 'timestamp') {
|
|
563
567
|
$time = GetTime($2);
|
|
564
568
|
goto DoneFix if $time and $$fix{lat} and $$fix{lon};
|
|
569
|
+
} elsif ($1 eq 'startTime') { # (new format)
|
|
570
|
+
$startTime = GetTime($2);
|
|
565
571
|
} elsif ($1 eq 'latitudeE7' or $1 eq 'latE7') {
|
|
566
572
|
$$fix{lat} = $2 * 1e-7;
|
|
567
|
-
}
|
|
573
|
+
} elsif ($1 eq 'longitudeE7' or $1 eq 'lngE7') {
|
|
568
574
|
$$fix{lon} = $2 * 1e-7;
|
|
575
|
+
} elsif ($1 eq 'point') { # (new format)
|
|
576
|
+
my $point = $2;
|
|
577
|
+
my @coords = $point =~ /[-+]?\d+\.\d+/g;
|
|
578
|
+
@$fix{'lat','lon'} = @coords[0,1] if @coords == 2;
|
|
579
|
+
} elsif ($1 eq 'durationMinutesOffsetFromStartTime' and defined $startTime) { # (new format)
|
|
580
|
+
$time = $startTime + $2 * 60;
|
|
581
|
+
# note: this assumes that "point" comes first, which it does in my sample
|
|
582
|
+
goto DoneFix if $time and $$fix{lat} and $$fix{lon};
|
|
569
583
|
}
|
|
570
584
|
}
|
|
571
585
|
next;
|