exiftool-vendored.exe 12.91.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/exiftool_files/exiftool.pl +16 -2896
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +135 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Font.pm +15 -4
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +19 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +2 -1
- 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 +117 -37
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +5 -3
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6920 -6904
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +104 -5
- 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.pm +66 -4
- package/bin/exiftool_files/windows_exiftool.txt +2831 -0
- package/package.json +5 -5
|
@@ -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' },
|
|
@@ -8613,6 +8620,126 @@ my %ciMaxFocal = (
|
|
|
8613
8620
|
},
|
|
8614
8621
|
);
|
|
8615
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
|
+
|
|
8616
8743
|
# Unknown color data (MakerNotes tag 0x4001)
|
|
8617
8744
|
%Image::ExifTool::Canon::ColorDataUnknown = (
|
|
8618
8745
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
|
@@ -9199,14 +9326,19 @@ my %filterConv = (
|
|
|
9199
9326
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
|
9200
9327
|
},
|
|
9201
9328
|
8 => {
|
|
9202
|
-
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
|
|
9203
9335
|
ValueConv => '$val / 10',
|
|
9204
9336
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
|
9205
9337
|
PrintConv => '"$val mm"',
|
|
9206
9338
|
PrintConvInv => '$val=~s/\s*mm//;$val',
|
|
9207
9339
|
},
|
|
9208
9340
|
9 => {
|
|
9209
|
-
Name => '
|
|
9341
|
+
Name => 'MaxFocalLength2',
|
|
9210
9342
|
ValueConv => '$val / 10',
|
|
9211
9343
|
ValueConvInv => 'int($val * 10 + 0.5)',
|
|
9212
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;
|
|
@@ -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;
|
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
|
65
65
|
use Image::ExifTool::GPS;
|
|
66
66
|
use Image::ExifTool::XMP;
|
|
67
67
|
|
|
68
|
-
$VERSION = '4.
|
|
68
|
+
$VERSION = '4.37';
|
|
69
69
|
|
|
70
70
|
sub LensIDConv($$$);
|
|
71
71
|
sub ProcessNikonAVI($$$);
|
|
@@ -367,6 +367,7 @@ sub GetAFPointGrid($$;$);
|
|
|
367
367
|
'02 46 37 37 25 25 02 00' => 'Sigma 24mm F2.8 Super Wide II Macro',
|
|
368
368
|
'7E 54 37 37 0C 0C 4B 06' => 'Sigma 24mm F1.4 DG HSM | A', #30
|
|
369
369
|
'26 58 3C 3C 14 14 1C 02' => 'Sigma 28mm F1.8 EX DG Aspherical Macro',
|
|
370
|
+
'BC 54 3C 3C 0C 0C 4B 46' => 'Sigma 28mm F1.4 DG HSM | A', #30
|
|
370
371
|
'48 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM',
|
|
371
372
|
'F8 54 3E 3E 0C 0C 4B 06' => 'Sigma 30mm F1.4 EX DC HSM', #JD
|
|
372
373
|
'91 54 44 44 0C 0C 4B 06' => 'Sigma 35mm F1.4 DG HSM', #30
|
|
@@ -17,12 +17,57 @@ use strict;
|
|
|
17
17
|
use vars qw($VERSION);
|
|
18
18
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
19
19
|
|
|
20
|
-
$VERSION = '1.
|
|
20
|
+
$VERSION = '1.08';
|
|
21
21
|
|
|
22
22
|
sub ProcessNikonSettings($$$);
|
|
23
23
|
|
|
24
24
|
my %enableDisable = ( 1 => 'Enable', 2 => 'Disable' );
|
|
25
25
|
|
|
26
|
+
my %funcButtonZ6 = ( #forum16316
|
|
27
|
+
1 => 'AF-On or Subject Tracking', # (bug in 3.xx firmware?)
|
|
28
|
+
2 => 'AF Lock Only',
|
|
29
|
+
3 => 'AE Lock (hold)',
|
|
30
|
+
4 => 'AE Lock (reset on release)',
|
|
31
|
+
5 => 'AE Lock Only',
|
|
32
|
+
6 => 'AE/AF Lock',
|
|
33
|
+
7 => 'FV Lock',
|
|
34
|
+
8 => 'Flash Disable/Enable',
|
|
35
|
+
9 => 'Preview',
|
|
36
|
+
10 => 'Matrix Metering',
|
|
37
|
+
11 => 'Center-weighted Metering',
|
|
38
|
+
12 => 'Spot Metering',
|
|
39
|
+
13 => 'Highlight-weighted Metering',
|
|
40
|
+
14 => 'Bracketing Burst',
|
|
41
|
+
15 => 'Synchronized Release (Master)',
|
|
42
|
+
16 => 'Synchronized Release (Remote)', # no settings map to 17 or 18
|
|
43
|
+
19 => '+NEF(RAW)',
|
|
44
|
+
20 => 'Framing Grid Display',
|
|
45
|
+
# 21 - missing
|
|
46
|
+
22 => 'Zoom On/Off',
|
|
47
|
+
# 23 - missing
|
|
48
|
+
24 => 'My Menu',
|
|
49
|
+
25 => 'My Menu Top Item',
|
|
50
|
+
26 => 'Playback',
|
|
51
|
+
27 => 'Protect',
|
|
52
|
+
28 => 'Image Area',
|
|
53
|
+
29 => 'Image Quality',
|
|
54
|
+
30 => 'White Balance',
|
|
55
|
+
31 => 'Picture Control',
|
|
56
|
+
32 => 'Active D-Lighting',
|
|
57
|
+
33 => 'Metering',
|
|
58
|
+
34 => 'Flash Mode',
|
|
59
|
+
35 => 'Focus Mode',
|
|
60
|
+
36 => 'Auto Bracketing',
|
|
61
|
+
37 => 'Multiple Exposure',
|
|
62
|
+
38 => 'HDR',
|
|
63
|
+
39 => 'Exposure Delay Mode',
|
|
64
|
+
40 => 'Shutter/Aperture Lock',
|
|
65
|
+
41 => 'Focus Peaking',
|
|
66
|
+
42 => 'Rating',
|
|
67
|
+
43 => 'Non-CPU Lens',
|
|
68
|
+
44 => 'None',
|
|
69
|
+
);
|
|
70
|
+
|
|
26
71
|
my %funcButtonZ7m2 = (
|
|
27
72
|
1 => 'AF-On',
|
|
28
73
|
2 => 'AF Lock Only',
|
|
@@ -1117,6 +1162,11 @@ my %infoZSeries = (
|
|
|
1117
1162
|
Name => 'Func1Button',
|
|
1118
1163
|
PrintConv => \%previewButtonD6,
|
|
1119
1164
|
%infoD6,
|
|
1165
|
+
},{ # CSf2-a (Z6)
|
|
1166
|
+
Name => 'Func1Button',
|
|
1167
|
+
Condition => '$$self{Model} =~ /^NIKON Z [67]\b/',
|
|
1168
|
+
Notes => 'Z6 and Z7',
|
|
1169
|
+
PrintConv => \%funcButtonZ6,
|
|
1120
1170
|
},{ # CSf2-a (Z7_2)
|
|
1121
1171
|
Name => 'Func1Button',
|
|
1122
1172
|
PrintConv => \%funcButtonZ7m2,
|
|
@@ -1126,6 +1176,11 @@ my %infoZSeries = (
|
|
|
1126
1176
|
Name => 'Func2Button',
|
|
1127
1177
|
PrintConv => \%previewButtonD6,
|
|
1128
1178
|
%infoD6,
|
|
1179
|
+
},{ # CSf2-b (Z6)
|
|
1180
|
+
Name => 'Func2Button',
|
|
1181
|
+
Condition => '$$self{Model} =~ /^NIKON Z [67]\b/',
|
|
1182
|
+
Notes => 'Z6 and Z7',
|
|
1183
|
+
PrintConv => \%funcButtonZ6,
|
|
1129
1184
|
},{ # CSf2-b (Z7_2)
|
|
1130
1185
|
Name => 'Func2Button',
|
|
1131
1186
|
PrintConv => \%funcButtonZ7m2,
|
|
@@ -16,7 +16,7 @@ use vars qw($VERSION);
|
|
|
16
16
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
17
17
|
use Image::ExifTool::GPS;
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.07';
|
|
20
20
|
|
|
21
21
|
# supported EXR value format types (other types are extracted as undef binary data)
|
|
22
22
|
my %formatType = (
|
|
@@ -91,6 +91,8 @@ my %formatType = (
|
|
|
91
91
|
5 => 'PXR24',
|
|
92
92
|
6 => 'B44',
|
|
93
93
|
7 => 'B44A',
|
|
94
|
+
8 => 'DWAA', #github276
|
|
95
|
+
9 => 'DWAB', #github276
|
|
94
96
|
},
|
|
95
97
|
},
|
|
96
98
|
dataWindow => { },
|
|
@@ -16,7 +16,7 @@ use strict;
|
|
|
16
16
|
use vars qw($VERSION $AUTOLOAD);
|
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
18
18
|
|
|
19
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.46';
|
|
20
20
|
|
|
21
21
|
sub WritePS($$);
|
|
22
22
|
sub ProcessPS($$;$);
|
|
@@ -156,15 +156,6 @@ sub AUTOLOAD
|
|
|
156
156
|
return Image::ExifTool::DoAutoLoad($AUTOLOAD, @_);
|
|
157
157
|
}
|
|
158
158
|
|
|
159
|
-
#------------------------------------------------------------------------------
|
|
160
|
-
# Is this a PC system
|
|
161
|
-
# Returns: true for PC systems
|
|
162
|
-
my %isPC = (MSWin32 => 1, os2 => 1, dos => 1, NetWare => 1, symbian => 1, cygwin => 1);
|
|
163
|
-
sub IsPC()
|
|
164
|
-
{
|
|
165
|
-
return $isPC{$^O};
|
|
166
|
-
}
|
|
167
|
-
|
|
168
159
|
#------------------------------------------------------------------------------
|
|
169
160
|
# Get image width or height
|
|
170
161
|
# Inputs: 0) value list ref (ImageData, BoundingBox), 1) true to get height
|
|
@@ -284,7 +275,7 @@ sub GetNextLine($$)
|
|
|
284
275
|
$$raf{PSEnd} and CheckPSEnd($raf, \$data);
|
|
285
276
|
# split line if it contains other newline sequences
|
|
286
277
|
if ($data =~ /$altnl/) {
|
|
287
|
-
if (length($data) > 500000 and IsPC()) {
|
|
278
|
+
if (length($data) > 500000 and Image::ExifTool::IsPC()) {
|
|
288
279
|
# patch for Windows memory problem
|
|
289
280
|
unless ($changedNL) {
|
|
290
281
|
$changedNL = $/;
|
|
@@ -537,7 +528,7 @@ sub ProcessPS($$;$)
|
|
|
537
528
|
$raf->ReadLine($data) or last;
|
|
538
529
|
# check for alternate newlines as efficiently as possible
|
|
539
530
|
if ($data =~ /$altnl/) {
|
|
540
|
-
if (length($data) > 500000 and IsPC()) {
|
|
531
|
+
if (length($data) > 500000 and Image::ExifTool::IsPC()) {
|
|
541
532
|
# Windows can't split very long lines due to poor memory handling,
|
|
542
533
|
# so re-read the file with the other newline character instead
|
|
543
534
|
# (slower but uses less memory)
|
|
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
48
48
|
use Image::ExifTool::Exif;
|
|
49
49
|
use Image::ExifTool::GPS;
|
|
50
50
|
|
|
51
|
-
$VERSION = '
|
|
51
|
+
$VERSION = '3.02';
|
|
52
52
|
|
|
53
53
|
sub ProcessMOV($$;$);
|
|
54
54
|
sub ProcessKeys($$$);
|
|
@@ -6552,7 +6552,7 @@ my %userDefined = (
|
|
|
6552
6552
|
PROCESS_PROC => \&ProcessKeys,
|
|
6553
6553
|
WRITE_PROC => \&WriteKeys,
|
|
6554
6554
|
CHECK_PROC => \&CheckQTValue,
|
|
6555
|
-
VARS => { LONG_TAGS =>
|
|
6555
|
+
VARS => { LONG_TAGS => 8 },
|
|
6556
6556
|
WRITABLE => 1,
|
|
6557
6557
|
# (not PREFERRED when writing)
|
|
6558
6558
|
GROUPS => { 1 => 'Keys' },
|
|
@@ -6606,6 +6606,8 @@ my %userDefined = (
|
|
|
6606
6606
|
PrintConv => '$val * 1e6 . " microseconds"',
|
|
6607
6607
|
PrintConvInv => '$val =~ s/ .*//; $val * 1e-6',
|
|
6608
6608
|
},
|
|
6609
|
+
# 'camera.focal_length.35mm_equivalent' - not top level (written to Keys in video track)
|
|
6610
|
+
# 'camera.lens_model' - not top level (written to Keys in video track)
|
|
6609
6611
|
'location.ISO6709' => {
|
|
6610
6612
|
Name => 'GPSCoordinates',
|
|
6611
6613
|
Groups => { 2 => 'Location' },
|
|
@@ -6668,7 +6670,12 @@ my %userDefined = (
|
|
|
6668
6670
|
#
|
|
6669
6671
|
'com.apple.photos.captureMode' => 'CaptureMode',
|
|
6670
6672
|
'com.android.version' => 'AndroidVersion',
|
|
6671
|
-
'com.android.capture.fps' => 'AndroidCaptureFPS',
|
|
6673
|
+
'com.android.capture.fps' => { Name => 'AndroidCaptureFPS', Writable => 'float' },
|
|
6674
|
+
'com.android.manufacturer' => 'AndroidMake',
|
|
6675
|
+
'com.android.model' => 'AndroidModel',
|
|
6676
|
+
'com.xiaomi.preview_video_cover' => { Name => 'XiaomiPreviewVideoCover', Writable => 'int32s' },
|
|
6677
|
+
'xiaomi.exifInfo.videoinfo' => 'XiaomiExifInfo',
|
|
6678
|
+
'com.xiaomi.hdr10' => { Name => 'XiaomiHDR10', Writable => 'int32s' },
|
|
6672
6679
|
#
|
|
6673
6680
|
# also seen
|
|
6674
6681
|
#
|
|
@@ -9484,7 +9491,7 @@ sub ProcessKeys($$$)
|
|
|
9484
9491
|
$$newInfo{KeysID} = $tag; # save original ID for use in family 7 group name
|
|
9485
9492
|
AddTagToTable($itemList, $id, $newInfo);
|
|
9486
9493
|
$msg or $msg = '';
|
|
9487
|
-
$out and print $out "$$et{INDENT}Added ItemList Tag $id = ($ns) $
|
|
9494
|
+
$out and print $out "$$et{INDENT}Added ItemList Tag $id = ($ns) $full$msg\n";
|
|
9488
9495
|
}
|
|
9489
9496
|
$pos += $len;
|
|
9490
9497
|
++$index;
|
|
@@ -9521,7 +9528,7 @@ sub ProcessMOV($$;$)
|
|
|
9521
9528
|
my $dirID = $$dirInfo{DirID} || '';
|
|
9522
9529
|
my $charsetQuickTime = $et->Options('CharsetQuickTime');
|
|
9523
9530
|
my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
|
|
9524
|
-
my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr);
|
|
9531
|
+
my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr, $trailer);
|
|
9525
9532
|
|
|
9526
9533
|
my $topLevel = not $$et{InQuickTime};
|
|
9527
9534
|
$$et{InQuickTime} = 1;
|
|
@@ -9550,6 +9557,17 @@ sub ProcessMOV($$;$)
|
|
|
9550
9557
|
$tagTablePtr = GetTagTable('Image::ExifTool::QuickTime::Main');
|
|
9551
9558
|
}
|
|
9552
9559
|
($size, $tag) = unpack('Na4', $buff);
|
|
9560
|
+
my $fast = $$et{OPTIONS}{FastScan} || 0;
|
|
9561
|
+
# check for Insta360 trailer
|
|
9562
|
+
if ($topLevel and not $fast) {
|
|
9563
|
+
my $pos = $raf->Tell();
|
|
9564
|
+
if ($raf->Seek(-40, 2) and $raf->Read($buff, 40) == 40 and
|
|
9565
|
+
substr($buff, 8) eq '8db42d694ccc418790edff439fe026bf')
|
|
9566
|
+
{
|
|
9567
|
+
$trailer = [ 'Insta360', $raf->Tell() - unpack('V',$buff) ];
|
|
9568
|
+
}
|
|
9569
|
+
$raf->Seek($pos,0) or return 0;
|
|
9570
|
+
}
|
|
9553
9571
|
if ($dataPt) {
|
|
9554
9572
|
$verbose and $et->VerboseDir($$dirInfo{DirName});
|
|
9555
9573
|
} else {
|
|
@@ -9588,7 +9606,6 @@ sub ProcessMOV($$;$)
|
|
|
9588
9606
|
# have XMP take priority except for HEIC
|
|
9589
9607
|
$$et{PRIORITY_DIR} = 'XMP' unless $fileType and $fileType eq 'HEIC';
|
|
9590
9608
|
}
|
|
9591
|
-
my $fast = $$et{OPTIONS}{FastScan} || 0;
|
|
9592
9609
|
$$raf{NoBuffer} = 1 if $fast; # disable buffering in FastScan mode
|
|
9593
9610
|
|
|
9594
9611
|
my $ee = $$et{OPTIONS}{ExtractEmbedded};
|
|
@@ -10129,6 +10146,10 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
|
10129
10146
|
$dataPos += $size + 8; # point to start of next atom data
|
|
10130
10147
|
last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
|
|
10131
10148
|
$lastPos = $raf->Tell() + $dirBase;
|
|
10149
|
+
if ($trailer and $lastPos >= $$trailer[1]) {
|
|
10150
|
+
$et->Warn(sprintf('%s trailer at offset 0x%x', @$trailer), 1);
|
|
10151
|
+
last;
|
|
10152
|
+
}
|
|
10132
10153
|
$raf->Read($buff, 8) == 8 or last;
|
|
10133
10154
|
$lastTag = $tag if $$tagTablePtr{$tag} and $tag ne 'free'; # (Insta360 sometimes puts free block before trailer)
|
|
10134
10155
|
($size, $tag) = unpack('Na4', $buff);
|
|
@@ -10137,14 +10158,10 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
|
10137
10158
|
if ($warnStr) {
|
|
10138
10159
|
# assume this is an unknown trailer if it comes immediately after
|
|
10139
10160
|
# mdat or moov and has a tag name we don't recognize
|
|
10140
|
-
if (($lastTag eq 'mdat' or $lastTag eq 'moov') and
|
|
10141
|
-
ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
|
|
10161
|
+
if (($lastTag eq 'mdat' or $lastTag eq 'moov') and
|
|
10162
|
+
(not $$tagTablePtr{$tag} or ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
|
|
10142
10163
|
{
|
|
10143
|
-
|
|
10144
|
-
$et->Warn(sprintf('Insta360 trailer at offset 0x%x', $lastPos), 1);
|
|
10145
|
-
} else {
|
|
10146
|
-
$et->Warn('Unknown trailer with '.lcfirst($warnStr));
|
|
10147
|
-
}
|
|
10164
|
+
$et->Warn('Unknown trailer with '.lcfirst($warnStr));
|
|
10148
10165
|
} else {
|
|
10149
10166
|
$et->Warn($warnStr);
|
|
10150
10167
|
}
|
|
@@ -10171,7 +10188,10 @@ QTLang: foreach $tag (@{$$et{QTLang}}) {
|
|
|
10171
10188
|
for ($i=0, $key=$name; $$infoHash{$key}; ++$i, $key="$name ($i)") {
|
|
10172
10189
|
next QTLang if $et->GetGroup($key, 0) eq 'QuickTime';
|
|
10173
10190
|
}
|
|
10174
|
-
$et->FoundTag($tagInfo, $$et{VALUE}{$tag});
|
|
10191
|
+
$key = $et->FoundTag($tagInfo, $$et{VALUE}{$tag});
|
|
10192
|
+
# copy extra tag information (groups, etc) to the synthetic tag
|
|
10193
|
+
$$et{TAG_EXTRA}{$key} = $$et{TAG_EXTRA}{$tag};
|
|
10194
|
+
$et->VPrint(0, "(synthesized default-language tag for QuickTime:$$tagInfo{Name})");
|
|
10175
10195
|
}
|
|
10176
10196
|
delete $$et{QTLang};
|
|
10177
10197
|
}
|