exiftool-vendored.exe 12.91.0 → 12.97.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/README.md +1 -2
- package/bin/exiftool_files/exiftool.pl +23 -2898
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +136 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Font.pm +15 -4
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +23 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +19 -5
- package/bin/exiftool_files/lib/Image/ExifTool/InDesign.pm +17 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +356 -62
- package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +421 -11
- package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +56 -1
- package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +3 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PostScript.pm +3 -12
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +34 -14
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +118 -37
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +5 -3
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6935 -6904
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +293 -7
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +48 -16
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +8 -54
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pm +66 -4
- package/bin/exiftool_files/windows_exiftool.txt +2836 -0
- package/package.json +6 -6
|
@@ -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.79';
|
|
|
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' },
|
|
@@ -6992,6 +6999,7 @@ my %ciMaxFocal = (
|
|
|
6992
6999
|
314 => 'Canon RF 24-105mm F2.8 L IS USM Z', #42
|
|
6993
7000
|
315 => 'Canon RF-S 10-18mm F4.5-6.3 IS STM', #42
|
|
6994
7001
|
316 => 'Canon RF 35mm F1.4 L VCM', #42
|
|
7002
|
+
318 => 'Canon RF 28-70mm F2.8 IS STM', #42
|
|
6995
7003
|
# Note: add new RF lenses to %canonLensTypes with ID 61182
|
|
6996
7004
|
},
|
|
6997
7005
|
},
|
|
@@ -8613,6 +8621,126 @@ my %ciMaxFocal = (
|
|
|
8613
8621
|
},
|
|
8614
8622
|
);
|
|
8615
8623
|
|
|
8624
|
+
# Color data (MakerNotes tag 0x4001, count=4528, ref PH)
|
|
8625
|
+
%Image::ExifTool::Canon::ColorData12 = (
|
|
8626
|
+
%binaryDataAttrs,
|
|
8627
|
+
NOTES => 'These tags are used by the EOS R1 and R5mkII',
|
|
8628
|
+
FORMAT => 'int16s',
|
|
8629
|
+
FIRST_ENTRY => 0,
|
|
8630
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
|
8631
|
+
DATAMEMBER => [ 0 ],
|
|
8632
|
+
IS_SUBDIR => [ 0x140 ],
|
|
8633
|
+
0x00 => {
|
|
8634
|
+
Name => 'ColorDataVersion',
|
|
8635
|
+
DataMember => 'ColorDataVersion',
|
|
8636
|
+
RawConv => '$$self{ColorDataVersion} = $val',
|
|
8637
|
+
PrintConv => {
|
|
8638
|
+
64 => '64 (R1, R5 Mark II)',
|
|
8639
|
+
},
|
|
8640
|
+
},
|
|
8641
|
+
0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' }, # (NC)
|
|
8642
|
+
0x6d => 'ColorTempAsShot', # (NC)
|
|
8643
|
+
0x6e => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' },
|
|
8644
|
+
0x72 => 'ColorTempDaylight',
|
|
8645
|
+
0x73 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' },
|
|
8646
|
+
0x77 => 'ColorTempShade',
|
|
8647
|
+
0x78 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' },
|
|
8648
|
+
0x7c => 'ColorTempCloudy',
|
|
8649
|
+
0x7d => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' },
|
|
8650
|
+
0x81 => 'ColorTempTungsten',
|
|
8651
|
+
0x82 => { Name => 'WB_RGGBLevelsFluorescent',Format=> 'int16s[4]' },
|
|
8652
|
+
0x86 => 'ColorTempFluorescent' ,
|
|
8653
|
+
0x87 => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' },
|
|
8654
|
+
0x8b => 'ColorTempFlash',
|
|
8655
|
+
0x8c => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 },
|
|
8656
|
+
0x90 => { Name => 'ColorTempUnknown2', Unknown => 1 },
|
|
8657
|
+
0x91 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 },
|
|
8658
|
+
0x95 => { Name => 'ColorTempUnknown3', Unknown => 1 },
|
|
8659
|
+
0x96 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 },
|
|
8660
|
+
0x9a => { Name => 'ColorTempUnknown4', Unknown => 1 },
|
|
8661
|
+
0x9b => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 },
|
|
8662
|
+
0x9f => { Name => 'ColorTempUnknown5', Unknown => 1 },
|
|
8663
|
+
0xa0 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 },
|
|
8664
|
+
0xa4 => { Name => 'ColorTempUnknown6', Unknown => 1 },
|
|
8665
|
+
0xa5 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 },
|
|
8666
|
+
0xa9 => { Name => 'ColorTempUnknown7', Unknown => 1 },
|
|
8667
|
+
0xaa => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 },
|
|
8668
|
+
0xae => { Name => 'ColorTempUnknown8', Unknown => 1 },
|
|
8669
|
+
0xaf => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 },
|
|
8670
|
+
0xb3 => { Name => 'ColorTempUnknown9', Unknown => 1 },
|
|
8671
|
+
0xb4 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 },
|
|
8672
|
+
0xb8 => { Name => 'ColorTempUnknown10', Unknown => 1 },
|
|
8673
|
+
0xb9 => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 },
|
|
8674
|
+
0xbd => { Name => 'ColorTempUnknown11', Unknown => 1 },
|
|
8675
|
+
0xbe => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 },
|
|
8676
|
+
0xc2 => { Name => 'ColorTempUnknown12', Unknown => 1 },
|
|
8677
|
+
0xc3 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 },
|
|
8678
|
+
0xc7 => { Name => 'ColorTempUnknown13', Unknown => 1 },
|
|
8679
|
+
0xc8 => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 },
|
|
8680
|
+
0xcc => { Name => 'ColorTempUnknown14', Unknown => 1 },
|
|
8681
|
+
0xcd => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 },
|
|
8682
|
+
0xd1 => { Name => 'ColorTempUnknown15', Unknown => 1 },
|
|
8683
|
+
0xd2 => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 },
|
|
8684
|
+
0xd6 => { Name => 'ColorTempUnknown16', Unknown => 1 },
|
|
8685
|
+
0xd7 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 },
|
|
8686
|
+
0xdb => { Name => 'ColorTempUnknown17', Unknown => 1 },
|
|
8687
|
+
0xdc => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 },
|
|
8688
|
+
0xe0 => { Name => 'ColorTempUnknown18', Unknown => 1 },
|
|
8689
|
+
0xe1 => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 },
|
|
8690
|
+
0xe5 => { Name => 'ColorTempUnknown19', Unknown => 1 },
|
|
8691
|
+
0xe6 => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 },
|
|
8692
|
+
0xea => { Name => 'ColorTempUnknown20', Unknown => 1 },
|
|
8693
|
+
0xeb => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 },
|
|
8694
|
+
0xef => { Name => 'ColorTempUnknown21', Unknown => 1 },
|
|
8695
|
+
0xf0 => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 },
|
|
8696
|
+
0xf4 => { Name => 'ColorTempUnknown22', Unknown => 1 },
|
|
8697
|
+
0xf5 => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 },
|
|
8698
|
+
0xf9 => { Name => 'ColorTempUnknown23', Unknown => 1 },
|
|
8699
|
+
0xfa => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 },
|
|
8700
|
+
0xfe => { Name => 'ColorTempUnknown24', Unknown => 1 },
|
|
8701
|
+
0xff => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 },
|
|
8702
|
+
0x103 => { Name => 'ColorTempUnknown25', Unknown => 1 },
|
|
8703
|
+
0x104 => { Name => 'WB_RGGBLevelsUnknown26',Format => 'int16s[4]', Unknown => 1 },
|
|
8704
|
+
0x108 => { Name => 'ColorTempUnknown26', Unknown => 1 },
|
|
8705
|
+
0x109 => { Name => 'WB_RGGBLevelsUnknown27',Format => 'int16s[4]', Unknown => 1 },
|
|
8706
|
+
0x10d => { Name => 'ColorTempUnknown27', Unknown => 1 },
|
|
8707
|
+
0x10e => { Name => 'WB_RGGBLevelsUnknown28',Format => 'int16s[4]', Unknown => 1 },
|
|
8708
|
+
0x112 => { Name => 'ColorTempUnknown28', Unknown => 1 },
|
|
8709
|
+
0x113 => { Name => 'WB_RGGBLevelsUnknown29',Format => 'int16s[4]', Unknown => 1 },
|
|
8710
|
+
0x117 => { Name => 'ColorTempUnknown29', Unknown => 1 },
|
|
8711
|
+
0x118 => { Name => 'WB_RGGBLevelsUnknown30',Format => 'int16s[4]', Unknown => 1 },
|
|
8712
|
+
0x11c => { Name => 'ColorTempUnknown30', Unknown => 1 },
|
|
8713
|
+
0x11d => { Name => 'WB_RGGBLevelsUnknown31',Format => 'int16s[4]', Unknown => 1 },
|
|
8714
|
+
0x121 => { Name => 'ColorTempUnknown31', Unknown => 1 },
|
|
8715
|
+
0x122 => { Name => 'WB_RGGBLevelsUnknown32',Format => 'int16s[4]', Unknown => 1 },
|
|
8716
|
+
0x126 => { Name => 'ColorTempUnknown32', Unknown => 1 },
|
|
8717
|
+
0x127 => { Name => 'WB_RGGBLevelsUnknown33',Format => 'int16s[4]', Unknown => 1 },
|
|
8718
|
+
0x12b => { Name => 'ColorTempUnknown33', Unknown => 1 },
|
|
8719
|
+
0x140 => {
|
|
8720
|
+
Name => 'ColorCalib',
|
|
8721
|
+
Format => 'undef[120]',
|
|
8722
|
+
Unknown => 1,
|
|
8723
|
+
SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
|
|
8724
|
+
},
|
|
8725
|
+
0x17f => {
|
|
8726
|
+
Name => 'PerChannelBlackLevel',
|
|
8727
|
+
Format => 'int16u[4]',
|
|
8728
|
+
},
|
|
8729
|
+
0x294 => {
|
|
8730
|
+
Name => 'NormalWhiteLevel',
|
|
8731
|
+
Format => 'int16u',
|
|
8732
|
+
RawConv => '$val || undef',
|
|
8733
|
+
},
|
|
8734
|
+
0x295 => {
|
|
8735
|
+
Name => 'SpecularWhiteLevel',
|
|
8736
|
+
Format => 'int16u',
|
|
8737
|
+
},
|
|
8738
|
+
0x296 => {
|
|
8739
|
+
Name => 'LinearityUpperMargin',
|
|
8740
|
+
Format => 'int16u',
|
|
8741
|
+
},
|
|
8742
|
+
);
|
|
8743
|
+
|
|
8616
8744
|
# Unknown color data (MakerNotes tag 0x4001)
|
|
8617
8745
|
%Image::ExifTool::Canon::ColorDataUnknown = (
|
|
8618
8746
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -9199,14 +9327,19 @@ my %filterConv = (
|
|
|
9199
9327
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
|
9200
9328
|
},
|
|
9201
9329
|
8 => {
|
|
9202
|
-
Name => '
|
|
9330
|
+
Name => 'MinFocalLength2',
|
|
9331
|
+
Notes => q{
|
|
9332
|
+
these seem to be min/max focal length without teleconverter, as opposed to
|
|
9333
|
+
MinFocalLength and MaxFocalLength which include the effect of a
|
|
9334
|
+
teleconverter
|
|
9335
|
+
}, #forum16309
|
|
9203
9336
|
ValueConv => '$val / 10',
|
|
9204
9337
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
|
9205
9338
|
PrintConv => '"$val mm"',
|
|
9206
9339
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
|
9207
9340
|
},
|
|
9208
9341
|
9 => {
|
|
9209
|
-
Name => '
|
|
9342
|
+
Name => 'MaxFocalLength2',
|
|
9210
9343
|
ValueConv => '$val / 10',
|
|
9211
9344
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
|
9212
9345
|
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) {
|
|
@@ -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.96';
|
|
35
35
|
|
|
36
36
|
sub ProcessFujiDir($$$);
|
|
37
37
|
sub ProcessFaceRec($$$);
|
|
@@ -1252,6 +1252,28 @@ my %faceCategories = (
|
|
|
1252
1252
|
ValueConv => 'my @v=reverse split(" ",$val);"@v"', # reverse to show width first
|
|
1253
1253
|
PrintConv => '$val=~tr/ /:/; $val',
|
|
1254
1254
|
},
|
|
1255
|
+
0x117 => {
|
|
1256
|
+
Name => 'RawZoomActive',
|
|
1257
|
+
Format => 'int32u',
|
|
1258
|
+
Count => 1,
|
|
1259
|
+
PrintConv => { 0 => 'No', 1 => 'Yes' },
|
|
1260
|
+
},
|
|
1261
|
+
0x118 => {
|
|
1262
|
+
Name => 'RawZoomTopLeft',
|
|
1263
|
+
Format => 'int16u',
|
|
1264
|
+
Count => 2,
|
|
1265
|
+
Notes => 'relative to RawCroppedImageSize',
|
|
1266
|
+
ValueConv => 'my @v=reverse split(" ",$val);"@v"', # reverse to show width first
|
|
1267
|
+
PrintConv => '$val=~tr/ /x/; $val',
|
|
1268
|
+
},
|
|
1269
|
+
0x119 => {
|
|
1270
|
+
Name => 'RawZoomSize',
|
|
1271
|
+
Format => 'int16u',
|
|
1272
|
+
Count => 2,
|
|
1273
|
+
Notes => 'relative to RawCroppedImageSize',
|
|
1274
|
+
ValueConv => 'my @v=reverse split(" ",$val);"@v"', # reverse to show width first
|
|
1275
|
+
PrintConv => '$val=~tr/ /x/; $val',
|
|
1276
|
+
},
|
|
1255
1277
|
0x121 => [
|
|
1256
1278
|
{
|
|
1257
1279
|
Name => 'RawImageSize',
|
|
@@ -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;
|
|
@@ -14,7 +14,7 @@ use strict;
|
|
|
14
14
|
use vars qw($VERSION);
|
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
16
16
|
|
|
17
|
-
$VERSION = '1.
|
|
17
|
+
$VERSION = '1.08';
|
|
18
18
|
|
|
19
19
|
# map for writing metadata to InDesign files (currently only write XMP)
|
|
20
20
|
my %indMap = (
|
|
@@ -101,8 +101,22 @@ sub ProcessIND($$)
|
|
|
101
101
|
for (;;) {
|
|
102
102
|
$raf->Read($hdr, 32) or last;
|
|
103
103
|
unless (length($hdr) == 32 and $hdr =~ /^\Q$objectHeaderGUID/) {
|
|
104
|
-
# this must be null padding or we have
|
|
105
|
-
$hdr =~ /^\0
|
|
104
|
+
# this must be null padding or we have a possible error
|
|
105
|
+
last if $hdr =~ /^\0+$/;
|
|
106
|
+
# (could be up to 4095 bytes of non-null garbage plus 4095 null bytes from ExifTool)
|
|
107
|
+
$raf->Read($buff, 8196) and $hdr .= $buff;
|
|
108
|
+
$hdr =~ s/\0+$//; # remove trailing nulls
|
|
109
|
+
if (length($hdr) > 4095) {
|
|
110
|
+
$err = 'Corrupt file or unsupported InDesign version';
|
|
111
|
+
last;
|
|
112
|
+
}
|
|
113
|
+
my $non = 'Non-null padding at end of file';
|
|
114
|
+
if (not $outfile) {
|
|
115
|
+
$et->Warn($non, 1);
|
|
116
|
+
} elsif (not $et->Error($non, 1)) {
|
|
117
|
+
Write($outfile, $hdr) or $err = 1;
|
|
118
|
+
$writeLen += length $hdr;
|
|
119
|
+
}
|
|
106
120
|
last;
|
|
107
121
|
}
|
|
108
122
|
my $len = Get32u(\$hdr, 24);
|
|
@@ -16,7 +16,7 @@ use strict;
|
|
|
16
16
|
use vars qw($VERSION);
|
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.40';
|
|
20
20
|
|
|
21
21
|
sub ProcessJpeg2000Box($$$);
|
|
22
22
|
sub ProcessJUMD($$$);
|
|
@@ -1442,7 +1442,7 @@ sub ProcessBrotli($$$)
|
|
|
1442
1442
|
}
|
|
1443
1443
|
} elsif ($type eq 'jumb') {
|
|
1444
1444
|
return undef if $isWriting; # (can't yet write JUMBF)
|
|
1445
|
-
Image::ExifTool::ProcessJUMB($et, \%dirInfo, $tagTablePtr); # (untested)
|
|
1445
|
+
Image::ExifTool::Jpeg2000::ProcessJUMB($et, \%dirInfo, $tagTablePtr); # (untested)
|
|
1446
1446
|
}
|
|
1447
1447
|
if ($isWriting) {
|
|
1448
1448
|
return undef unless defined $dat;
|
|
@@ -1543,7 +1543,7 @@ sub ProcessJP2($$)
|
|
|
1543
1543
|
|
|
1544
1544
|
# check to be sure this is a valid JPG2000 file
|
|
1545
1545
|
return 0 unless $raf->Read($hdr,12) == 12;
|
|
1546
|
-
unless ($hdr eq "\0\0\0\x0cjP \x0d\x0a\x87\x0a" or
|
|
1546
|
+
unless ($hdr eq "\0\0\0\x0cjP \x0d\x0a\x87\x0a" or # (ref 1)
|
|
1547
1547
|
$hdr eq "\0\0\0\x0cjP\x1a\x1a\x0d\x0a\x87\x0a" or # (ref 2)
|
|
1548
1548
|
$$et{IsJXL})
|
|
1549
1549
|
{
|