exiftool-vendored.exe 12.89.0 → 12.91.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 +5 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +13 -7
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +34 -1
- package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +10 -2
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +7 -2
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +87 -6
- package/bin/exiftool_files/lib/Image/ExifTool/Samsung.pm +28 -19
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4 -0
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +11 -7
- package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pm +1 -1
- package/package.json +5 -5
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/perl -w
|
|
1
|
+
#!/usr/bin/env perl -w
|
|
2
2
|
#------------------------------------------------------------------------------
|
|
3
3
|
# File: windows_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.91';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -2307,8 +2307,8 @@ sub GetImageInfo($$)
|
|
|
2307
2307
|
# output using print format file (-p) option
|
|
2308
2308
|
my ($type, $doc, $grp, $lastDoc, $cache);
|
|
2309
2309
|
$fileTrailer = '';
|
|
2310
|
-
# repeat for each
|
|
2311
|
-
if (
|
|
2310
|
+
# repeat for each embedded document if necessary (only if -ee used)
|
|
2311
|
+
if ($et->Options('ExtractEmbedded')) {
|
|
2312
2312
|
# (cache tag keys if there are sub-documents)
|
|
2313
2313
|
$lastDoc = $$et{DOC_COUNT} and $cache = { };
|
|
2314
2314
|
} else {
|
|
@@ -5707,7 +5707,7 @@ OPTIONS
|
|
|
5707
5707
|
|
|
5708
5708
|
produces output like this:
|
|
5709
5709
|
|
|
5710
|
-
-- Generated by ExifTool 12.
|
|
5710
|
+
-- Generated by ExifTool 12.91 --
|
|
5711
5711
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5712
5712
|
(f/5.6, 1/60s, ISO 100)
|
|
5713
5713
|
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.79';
|
|
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)
|
|
@@ -6403,6 +6403,8 @@ my %ciMaxFocal = (
|
|
|
6403
6403
|
12 => 'Flexizone Multi (9 point)', #PH (750D, 9 points)
|
|
6404
6404
|
13 => 'Flexizone Single', #PH (EOS M default, live view) (R7 calls this '1-point AF', ref github268)
|
|
6405
6405
|
14 => 'Large Zone AF', #PH/forum6237 (7DmkII)
|
|
6406
|
+
16 => 'Large Zone AF (vertical)', #forum16223
|
|
6407
|
+
17 => 'Large Zone AF (horizontal)', #forum16223
|
|
6406
6408
|
19 => 'Flexible Zone AF 1', #github268 (R7)
|
|
6407
6409
|
20 => 'Flexible Zone AF 2', #github268 (R7)
|
|
6408
6410
|
21 => 'Flexible Zone AF 3', #github268 (R7)
|
|
@@ -6921,6 +6923,10 @@ my %ciMaxFocal = (
|
|
|
6921
6923
|
Name => 'FlashExposureLock',
|
|
6922
6924
|
PrintConv => \%offOn,
|
|
6923
6925
|
},
|
|
6926
|
+
32 => { #forum16257
|
|
6927
|
+
Name => 'AntiFlicker',
|
|
6928
|
+
PrintConv => \%offOn,
|
|
6929
|
+
},
|
|
6924
6930
|
0x3d => { #IB
|
|
6925
6931
|
Name => 'RFLensType',
|
|
6926
6932
|
Format => 'int16u',
|
|
@@ -9123,19 +9129,19 @@ my %filterConv = (
|
|
|
9123
9129
|
2 => 'Disable',
|
|
9124
9130
|
},
|
|
9125
9131
|
},
|
|
9126
|
-
18 => { #52
|
|
9132
|
+
18 => { #52/forum16223
|
|
9127
9133
|
Name => 'AFStatusViewfinder',
|
|
9128
|
-
Condition => '$$self{Model} =~ /1D X/',
|
|
9129
|
-
Notes => '1D X
|
|
9134
|
+
Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
|
|
9135
|
+
Notes => '1D X and R models',
|
|
9130
9136
|
PrintConv => {
|
|
9131
9137
|
0 => 'Show in Field of View',
|
|
9132
9138
|
1 => 'Show Outside View',
|
|
9133
9139
|
},
|
|
9134
9140
|
},
|
|
9135
|
-
19 => { #52
|
|
9141
|
+
19 => { #52/forum16223
|
|
9136
9142
|
Name => 'InitialAFPointInServo',
|
|
9137
|
-
Condition => '$$self{Model} =~ /1D X/',
|
|
9138
|
-
Notes => '1D X
|
|
9143
|
+
Condition => '$$self{Model} =~ /EOS-1D X|EOS R/',
|
|
9144
|
+
Notes => '1D X and R models',
|
|
9139
9145
|
PrintConv => {
|
|
9140
9146
|
0 => 'Initial AF Point Selected',
|
|
9141
9147
|
1 => 'Manual AF Point',
|
|
@@ -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.36';
|
|
69
69
|
|
|
70
70
|
sub LensIDConv($$$);
|
|
71
71
|
sub ProcessNikonAVI($$$);
|
|
@@ -2495,6 +2495,7 @@ my %base64coord = (
|
|
|
2495
2495
|
{ # D7100=0227
|
|
2496
2496
|
Condition => '$$valPt =~ /^0[28]/',
|
|
2497
2497
|
Name => 'ShotInfo02xx',
|
|
2498
|
+
Drop => 50000, # drop if too large (>64k for Z6iii)
|
|
2498
2499
|
SubDirectory => {
|
|
2499
2500
|
TagTable => 'Image::ExifTool::Nikon::ShotInfo',
|
|
2500
2501
|
ProcessProc => \&ProcessNikonEncrypted,
|
|
@@ -5635,6 +5636,38 @@ my %nikonFocalConversions = (
|
|
|
5635
5636
|
Notes => 'P6000',
|
|
5636
5637
|
PrintConv => \%offOn,
|
|
5637
5638
|
},
|
|
5639
|
+
# for Nikon Z6iii JPG and RAW images (version 0809),
|
|
5640
|
+
# the offset table starts at 0x24 and is as follows
|
|
5641
|
+
# JPG Offset Size NEF Offset Size
|
|
5642
|
+
# 0) 0x0000 0 0) 0x009c 21604
|
|
5643
|
+
# 1) 0x0000 0 1) 0x5500 6008
|
|
5644
|
+
# 2) 0x009c 2528 2) 0x6c78 2528
|
|
5645
|
+
# 3) 0x0a7c 200 3) 0x7658 200
|
|
5646
|
+
# 4) 0x0b44 2488 4) 0x7720 2488
|
|
5647
|
+
# 5) 0x14fc 1468 5) 0x80d8 1468
|
|
5648
|
+
# 6) 0x1ab8 1032 6) 0x8694 1032
|
|
5649
|
+
# 7) 0x1ec0 256 7) 0x8a9c 256
|
|
5650
|
+
# 8) 0x1fc0 800 8) 0x8b9c 800
|
|
5651
|
+
# 9) 0x22e0 144 9) 0x8ebc 144
|
|
5652
|
+
# 10) 0x2370 64 10) 0x8f4c 64
|
|
5653
|
+
# 11) 0x0000 0 11) 0x0000 0
|
|
5654
|
+
# 12) 0x23b0 5009 12) 0x8f8c 5009
|
|
5655
|
+
# 13) 0x3741 1536 13) 0xa31d 1536
|
|
5656
|
+
# 14) 0x3d41 11928 14) 0xa91d 11928
|
|
5657
|
+
# 15) 0x6bd9 5937 15) 0xd7b5 5937
|
|
5658
|
+
# 16) 0x830a 500 16) 0xeee6 500
|
|
5659
|
+
# 17) 0x84fe 160 17) 0xf0da 160
|
|
5660
|
+
# 18) 0x859e 464 18) 0xf17a 464
|
|
5661
|
+
# 19) 0x876e 8 19) 0xf34a 8
|
|
5662
|
+
# 20) 0x8776 64 20) 0xf352 64
|
|
5663
|
+
# 21) 0x87b6 6 21) 0xf392 6
|
|
5664
|
+
# 22) 0x87bc 48 22) 0xf398 48
|
|
5665
|
+
# 23) 0x87ec 20 23) 0xf3c8 20
|
|
5666
|
+
# 24) 0x8800 108 24) 0xf3dc 108
|
|
5667
|
+
# 25) 0x886c 8 25) 0xf448 8
|
|
5668
|
+
# 26) 0x8874 2420 26) 0xf450 2420
|
|
5669
|
+
# 27) 0x0000 0 27) 0x0000 0
|
|
5670
|
+
# 28) 0x0000 0 28) 0x0000 0
|
|
5638
5671
|
0x66 => {
|
|
5639
5672
|
Name => 'VR_0x66',
|
|
5640
5673
|
Condition => '$$self{ShotInfoVersion} eq "0204"',
|
|
@@ -36,7 +36,7 @@ use strict;
|
|
|
36
36
|
use vars qw($VERSION $AUTOLOAD %stdCase);
|
|
37
37
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
38
38
|
|
|
39
|
-
$VERSION = '1.
|
|
39
|
+
$VERSION = '1.68';
|
|
40
40
|
|
|
41
41
|
sub ProcessPNG_tEXt($$$);
|
|
42
42
|
sub ProcessPNG_iTXt($$$);
|
|
@@ -1400,7 +1400,7 @@ sub ProcessPNG($$)
|
|
|
1400
1400
|
my $fastScan = $et->Options('FastScan');
|
|
1401
1401
|
my $hash = $$et{ImageDataHash};
|
|
1402
1402
|
my ($n, $sig, $err, $hbuf, $dbuf, $cbuf);
|
|
1403
|
-
my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset);
|
|
1403
|
+
my ($wasHdr, $wasEnd, $wasDat, $doTxt, @txtOffset, $wasTrailer);
|
|
1404
1404
|
|
|
1405
1405
|
# check to be sure this is a valid PNG/MNG/JNG image
|
|
1406
1406
|
return 0 unless $raf->Read($sig,8) == 8 and $pngLookup{$sig};
|
|
@@ -1461,6 +1461,7 @@ sub ProcessPNG($$)
|
|
|
1461
1461
|
if ($wasEnd) {
|
|
1462
1462
|
last unless $n; # stop now if normal end of PNG
|
|
1463
1463
|
$et->WarnOnce("Trailer data after $fileType $endChunk chunk", 1);
|
|
1464
|
+
$wasTrailer = 1;
|
|
1464
1465
|
last if $n < 8;
|
|
1465
1466
|
$$et{SET_GROUP1} = 'Trailer';
|
|
1466
1467
|
} elsif ($n != 8) {
|
|
@@ -1654,6 +1655,13 @@ sub ProcessPNG($$)
|
|
|
1654
1655
|
}
|
|
1655
1656
|
}
|
|
1656
1657
|
delete $$et{SET_GROUP1};
|
|
1658
|
+
# read Samsung trailer if it exists
|
|
1659
|
+
if ($wasTrailer and not $outfile and $raf->Seek(-8, 2) and
|
|
1660
|
+
$raf->Read($dbuf,8) and $dbuf =~ /\0\0(QDIOBS|SEFT)$/) # (have only seen SEFT type)
|
|
1661
|
+
{
|
|
1662
|
+
require Image::ExifTool::Samsung;
|
|
1663
|
+
Image::ExifTool::Samsung::ProcessSamsung($et, { DirName => 'Samsung', RAF => $raf });
|
|
1664
|
+
}
|
|
1657
1665
|
return -1 if $outfile and ($err or not $wasEnd);
|
|
1658
1666
|
return 1; # this was a valid PNG/MNG/JNG image
|
|
1659
1667
|
}
|
|
@@ -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 = '2.
|
|
51
|
+
$VERSION = '2.99';
|
|
52
52
|
|
|
53
53
|
sub ProcessMOV($$;$);
|
|
54
54
|
sub ProcessKeys($$$);
|
|
@@ -9737,7 +9737,7 @@ sub ProcessMOV($$;$)
|
|
|
9737
9737
|
if ($size > 0x2000000) { # start to get worried above 32 MiB
|
|
9738
9738
|
# check for RIFF trailer (written by Auto-Vox dashcam)
|
|
9739
9739
|
if ($buff =~ /^(gpsa|gps0|gsen|gsea)...\0/s) { # (yet seen only gpsa as first record)
|
|
9740
|
-
$et->VPrint(0, "Found RIFF trailer");
|
|
9740
|
+
$et->VPrint(0, sprintf("Found RIFF trailer at offset 0x%x",$lastPos));
|
|
9741
9741
|
if ($et->Options('ExtractEmbedded')) {
|
|
9742
9742
|
$raf->Seek(-8, 1) or last; # seek back to start of trailer
|
|
9743
9743
|
my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
|
@@ -9746,6 +9746,11 @@ sub ProcessMOV($$;$)
|
|
|
9746
9746
|
EEWarn($et);
|
|
9747
9747
|
}
|
|
9748
9748
|
last;
|
|
9749
|
+
} elsif ($buff eq 'CCCCCCCC') {
|
|
9750
|
+
$et->VPrint(0, sprintf("Found Kenwood trailer at offset 0x%x",$lastPos));
|
|
9751
|
+
my $tbl = GetTagTable('Image::ExifTool::QuickTime::Stream');
|
|
9752
|
+
ProcessKenwoodTrailer($et, { RAF => $raf }, $tbl);
|
|
9753
|
+
last;
|
|
9749
9754
|
}
|
|
9750
9755
|
$ignore = 1;
|
|
9751
9756
|
if ($tagInfo and not $$tagInfo{Unknown} and not $eeTag) {
|
|
@@ -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 76 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' },
|
|
@@ -1420,9 +1420,10 @@ Sample: for ($i=0; ; ) {
|
|
|
1420
1420
|
} elsif ($type eq 'gps ') { # (ie. GPSDataList tag)
|
|
1421
1421
|
|
|
1422
1422
|
if ($buff =~ /^....freeGPS /s) {
|
|
1423
|
-
#
|
|
1424
|
-
# (some videos don't reference all freeGPS info from 'gps ' table, eg. INNOV
|
|
1425
|
-
|
|
1423
|
+
# parse freeGPS data unless done already in brute-force scan
|
|
1424
|
+
# (some videos don't reference all freeGPS info from 'gps ' table, eg. INNOV,
|
|
1425
|
+
# and some videos don't put 'gps ' data in mdat, eg XGODY 12" 4K Dashcam)
|
|
1426
|
+
last if $$et{FoundGPSByScan};
|
|
1426
1427
|
# decode "freeGPS " data (Novatek and others)
|
|
1427
1428
|
ProcessFreeGPS($et, {
|
|
1428
1429
|
DataPt => \$buff,
|
|
@@ -2049,9 +2050,41 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
2049
2050
|
}
|
|
2050
2051
|
}
|
|
2051
2052
|
|
|
2052
|
-
}
|
|
2053
|
+
} elsif ($$dataPt =~ m<^.{23}(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2}) [N|S]>s) {
|
|
2053
2054
|
|
|
2054
2055
|
$debug and $et->FoundTag(GPSType => 16);
|
|
2056
|
+
# XGODY 12" 4K Dashcam
|
|
2057
|
+
# 0000: 00 00 00 a8 66 72 65 65 47 50 53 20 98 00 00 00 [....freeGPS ....]
|
|
2058
|
+
# 0010: 6e 6f 72 6d 61 6c 3a 32 30 32 34 2f 30 35 2f 32 [normal:2024/05/2]
|
|
2059
|
+
# 0020: 32 20 30 32 3a 35 34 3a 32 39 20 4e 3a 34 32 2e [2 02:54:29 N:42.]
|
|
2060
|
+
# 0030: 33 38 32 34 37 30 20 57 3a 38 33 2e 33 38 39 35 [382470 W:83.3895]
|
|
2061
|
+
# 0040: 37 30 20 35 33 2e 36 20 6b 6d 2f 68 20 78 3a 2d [70 53.6 km/h x:-]
|
|
2062
|
+
# 0050: 30 2e 30 32 20 79 3a 30 2e 39 39 20 7a 3a 30 2e [0.02 y:0.99 z:0.]
|
|
2063
|
+
# 0060: 31 30 20 41 3a 32 36 39 2e 32 20 48 3a 32 34 35 [10 A:269.2 H:245]
|
|
2064
|
+
# 0070: 2e 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [.5..............]
|
|
2065
|
+
($yr,$mon,$day,$hr,$min,$sec) = ($1,$2,$3,$4,$5,$6);
|
|
2066
|
+
$$dataPt =~ s/\0+$//; # remove trailing nulls
|
|
2067
|
+
my @a = split ' ', substr($$dataPt,43);
|
|
2068
|
+
$ddd = 1;
|
|
2069
|
+
foreach (@a) {
|
|
2070
|
+
unless (/^([A-Z]):([-+]?\d+(\.\d+)?)$/i) {
|
|
2071
|
+
# (the "km/h" after spd is display units? because the value is stored in knots)
|
|
2072
|
+
defined $lon and not defined $spd and /^\d+\.\d+$/ and $spd = $_ * $knotsToKph;
|
|
2073
|
+
next;
|
|
2074
|
+
}
|
|
2075
|
+
($1 eq 'N' or $1 eq 'S') and $lat = $2, $latRef = $1, next;
|
|
2076
|
+
($1 eq 'E' or $1 eq 'W') and $lon = $2, $lonRef = $1, next;
|
|
2077
|
+
($1 eq 'x' or $1 eq 'y' or $1 eq 'z') and push(@acc,$2), next;
|
|
2078
|
+
$1 eq 'A' and $trk = $2, next; # (verified, but why 'A'?)
|
|
2079
|
+
# seen 'H' - one might expect altitude ('H'eight), but it doesn't fit
|
|
2080
|
+
# the sample data, so save all other information as an "Unknown_X" tag
|
|
2081
|
+
$$tagTbl{$1} or AddTagToTable($tagTbl, $1, { Name => "Unknown_$1", Unknown => 1 });
|
|
2082
|
+
push(@xtra, $1 => $2), next;
|
|
2083
|
+
}
|
|
2084
|
+
|
|
2085
|
+
} else {
|
|
2086
|
+
|
|
2087
|
+
$debug and $et->FoundTag(GPSType => 17);
|
|
2055
2088
|
# (look for binary GPS as stored by Nextbase 512G, ref PH)
|
|
2056
2089
|
# 0000: 00 00 80 00 66 72 65 65 47 50 53 20 78 01 00 00 [....freeGPS x...]
|
|
2057
2090
|
# 0010: 78 2e 78 78 00 00 00 00 00 00 00 00 00 00 00 00 [x.xx............]
|
|
@@ -2115,7 +2148,7 @@ ATCRec: for ($recPos = 0x30; $recPos + 52 < $dirLen; $recPos += 52) {
|
|
|
2115
2148
|
my $time = sprintf('%.2d:%.2d:%sZ',$hr,$min,$sec);
|
|
2116
2149
|
$et->HandleTag($tagTbl, GPSTimeStamp => $time);
|
|
2117
2150
|
}
|
|
2118
|
-
if (defined $lat) {
|
|
2151
|
+
if (defined $lat and defined $lon) {
|
|
2119
2152
|
# lat/long are in DDDMM.MMMM format unless $ddd is set
|
|
2120
2153
|
ConvertLatLon($lat, $lon) unless $ddd;
|
|
2121
2154
|
$et->HandleTag($tagTbl, GPSLatitude => $lat * ($latRef eq 'S' ? -1 : 1));
|
|
@@ -2680,6 +2713,53 @@ sub ProcessRIFFTrailer($$$)
|
|
|
2680
2713
|
return 1;
|
|
2681
2714
|
}
|
|
2682
2715
|
|
|
2716
|
+
#------------------------------------------------------------------------------
|
|
2717
|
+
# Process Kenwood Dashcam trailer (forum16229)
|
|
2718
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
2719
|
+
# Returns: 1 on success
|
|
2720
|
+
# Sample data (chained 512-byte records starting like this):
|
|
2721
|
+
# 0000: 43 43 43 43 43 43 43 43 43 43 43 43 43 43 47 50 [CCCCCCCCCCCCCCGP]
|
|
2722
|
+
# 0010: 53 44 41 54 41 2d 2d 32 30 32 34 30 37 31 31 31 [SDATA--202407111]
|
|
2723
|
+
# 0020: 32 30 34 31 32 4e 35 30 2e 36 31 32 33 38 36 30 [20412N50.6123860]
|
|
2724
|
+
# 0030: 36 37 37 45 38 2e 37 30 32 37 31 38 30 39 38 39 [677E8.7027180989]
|
|
2725
|
+
# 0040: 35 33 33 2e 30 30 30 30 30 30 30 30 30 30 30 30 [533.000000000000]
|
|
2726
|
+
# 0050: 2e 30 30 30 30 30 30 30 30 30 30 30 30 30 2e 30 [.0000000000000.0]
|
|
2727
|
+
# 0060: 31 39 39 39 39 39 39 39 35 35 33 2d 30 2e 30 39 [19999999553-0.09]
|
|
2728
|
+
# 0070: 30 30 30 30 30 30 33 35 37 2d 30 2e 31 34 30 30 [000000357-0.1400]
|
|
2729
|
+
# 0080: 30 30 30 30 30 35 39 47 50 53 44 41 54 41 2d 2d [0000059GPSDATA--]
|
|
2730
|
+
sub ProcessKenwoodTrailer($$$)
|
|
2731
|
+
{
|
|
2732
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
|
2733
|
+
my $raf = $$dirInfo{RAF};
|
|
2734
|
+
my $buff;
|
|
2735
|
+
# current file position is 8 bytes into the 14 C's, so test the next 6:
|
|
2736
|
+
$raf->Read($buff, 14) and $buff eq 'CCCCCCCCCCCCCC' or return 0;
|
|
2737
|
+
$et->VerboseDir('Kenwood trailer', undef, undef);
|
|
2738
|
+
unless ($$et{OPTIONS}{ExtractEmbedded}) {
|
|
2739
|
+
$et->WarnOnce('Use the ExtractEmbedded option to extract timed GPSData from Kenwood trailer',3);
|
|
2740
|
+
return 1;
|
|
2741
|
+
}
|
|
2742
|
+
while ($raf->Read($buff, 121) and $buff =~ /^GPSDATA--(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/) {
|
|
2743
|
+
FoundSomething($et, $tagTbl);
|
|
2744
|
+
$et->HandleTag($tagTbl, GPSDateTime => "$1:$2:$3 $4:$5:$6");
|
|
2745
|
+
my $i = 9 + 14;
|
|
2746
|
+
my ($val, @acc, $tag);
|
|
2747
|
+
foreach $tag (qw(GPSLatitude GPSLongitude GPSSpeed unk acc acc acc)) {
|
|
2748
|
+
$val = substr($buff, $i, 14); $i += 14;
|
|
2749
|
+
next if $tag eq 'unk';
|
|
2750
|
+
my $hemi;
|
|
2751
|
+
$hemi = $1 if $val =~ s/^([NSEW])//;
|
|
2752
|
+
$val =~ /^[-+]?\d+\.\d+$/ or next;
|
|
2753
|
+
$tag eq 'acc' and push(@acc,$val), next;
|
|
2754
|
+
$val = -$val if $hemi and ($hemi eq 'S' or $hemi eq 'W');
|
|
2755
|
+
$et->HandleTag($tagTbl, $tag => $val);
|
|
2756
|
+
}
|
|
2757
|
+
$et->HandleTag($tagTbl, Accelerometer => "@acc") if @acc == 3;
|
|
2758
|
+
}
|
|
2759
|
+
delete $$et{DOC_NUM};
|
|
2760
|
+
return 1;
|
|
2761
|
+
}
|
|
2762
|
+
|
|
2683
2763
|
#------------------------------------------------------------------------------
|
|
2684
2764
|
# Process 'gps ' atom containing NMEA from Pittasoft Blackvue dashcam (ref PH)
|
|
2685
2765
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
@@ -3353,6 +3433,7 @@ sub ScanMediaData($)
|
|
|
3353
3433
|
}
|
|
3354
3434
|
my $dirInfo = { DataPt => \$buff, DataPos => $pos + $dataPos, DirLen => $len };
|
|
3355
3435
|
ProcessFreeGPS($et, $dirInfo, $tagTbl);
|
|
3436
|
+
$$et{FoundGPSByScan} = 1;
|
|
3356
3437
|
}
|
|
3357
3438
|
$pos += $len;
|
|
3358
3439
|
$buf2 = substr($buff, $len);
|
|
@@ -22,13 +22,13 @@ use vars qw($VERSION %samsungLensTypes);
|
|
|
22
22
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
23
23
|
use Image::ExifTool::Exif;
|
|
24
24
|
|
|
25
|
-
$VERSION = '1.
|
|
25
|
+
$VERSION = '1.57';
|
|
26
26
|
|
|
27
27
|
sub WriteSTMN($$$);
|
|
28
28
|
sub ProcessINFO($$$);
|
|
29
29
|
sub ProcessSamsungMeta($$$);
|
|
30
30
|
sub ProcessSamsungIFD($$$);
|
|
31
|
-
sub ProcessSamsung(
|
|
31
|
+
sub ProcessSamsung($$;$);
|
|
32
32
|
|
|
33
33
|
# Samsung LensType lookup
|
|
34
34
|
%samsungLensTypes = (
|
|
@@ -943,25 +943,25 @@ my %formatMinMax = (
|
|
|
943
943
|
);
|
|
944
944
|
|
|
945
945
|
# information extracted from Samsung trailer (ie. Samsung SM-T805 "Sound & Shot" JPEG) (ref PH)
|
|
946
|
+
# NOTE: These tags may use $$self{SamsungTagName} in a Condition statement
|
|
947
|
+
# if necessary to differentiate tags with the same ID but different names
|
|
946
948
|
%Image::ExifTool::Samsung::Trailer = (
|
|
947
949
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Other' },
|
|
948
950
|
VARS => { NO_ID => 1, HEX_ID => 0 },
|
|
949
951
|
PROCESS_PROC => \&ProcessSamsung,
|
|
952
|
+
TAG_PREFIX => 'SamsungTrailer',
|
|
950
953
|
PRIORITY => 0, # (first one takes priority so DepthMapWidth/Height match first DepthMapData)
|
|
951
954
|
NOTES => q{
|
|
952
|
-
Tags extracted from the trailer of JPEG images written when
|
|
953
|
-
features (such as "Sound & Shot" or "Shot & More") from
|
|
954
|
-
as the Galaxy S4 and Tab S, and from the 'sefd' atom in
|
|
955
|
-
|
|
956
|
-
},
|
|
957
|
-
'0x0001-name' => {
|
|
958
|
-
Name => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
|
|
959
|
-
RawConv => '$$self{EmbeddedImageName} = $val',
|
|
955
|
+
Tags extracted from the SEFT trailer of JPEG and PNG images written when
|
|
956
|
+
using certain features (such as "Sound & Shot" or "Shot & More") from
|
|
957
|
+
Samsung models such as the Galaxy S4 and Tab S, and from the 'sefd' atom in
|
|
958
|
+
HEIC images from models such as the S10+.
|
|
960
959
|
},
|
|
960
|
+
'0x0001-name' => 'EmbeddedImageName', # ("DualShot_1","DualShot_2")
|
|
961
961
|
'0x0001' => [
|
|
962
962
|
{
|
|
963
963
|
Name => 'EmbeddedImage',
|
|
964
|
-
Condition => '$$self{
|
|
964
|
+
Condition => '$$self{SamsungTagName} ne "DualShot_2"',
|
|
965
965
|
Groups => { 2 => 'Preview' },
|
|
966
966
|
Binary => 1,
|
|
967
967
|
},
|
|
@@ -1277,8 +1277,10 @@ my %formatMinMax = (
|
|
|
1277
1277
|
# 0x0bd0-name - seen 'Dual_Relighting_Bokeh_Info' #forum16086
|
|
1278
1278
|
# 0x0be0-name - seen 'Livefocus_JDM_Info' #forum16086
|
|
1279
1279
|
# 0x0bf0-name - seen 'Remaster_Info' #forum16086
|
|
1280
|
+
'0x0bf0' => 'RemasterInfo', #forum16086/16242
|
|
1280
1281
|
# 0x0c21-name - seen 'Portrait_Effect_Info' #forum16086
|
|
1281
1282
|
# 0x0c51-name - seen 'Samsung_Capture_Info' #forum16086
|
|
1283
|
+
'0x0c51' => 'SamsungCaptureInfo', #forum16086/16242
|
|
1282
1284
|
# 0x0c61-name - seen 'Camera_Capture_Mode_Info' #forum16086
|
|
1283
1285
|
# 0x0c71-name - seen 'Pro_White_Balance_Info' #forum16086
|
|
1284
1286
|
# 0x0c81-name - seen 'Watermark_Info' #forum16086
|
|
@@ -1289,7 +1291,11 @@ my %formatMinMax = (
|
|
|
1289
1291
|
# 0x0d11-name - seen 'Video_Snapshot_Info' #forum16086
|
|
1290
1292
|
# 0x0d21-name - seen 'Camera_Scene_Info' #forum16086
|
|
1291
1293
|
# 0x0d31-name - seen 'Food_Blur_Effect_Info' #forum16086
|
|
1292
|
-
|
|
1294
|
+
'0x0d91' => { #forum16086/16242
|
|
1295
|
+
Name => 'PEg_Info',
|
|
1296
|
+
Description => 'PEg Info',
|
|
1297
|
+
SubDirectory => { TagTable => 'Image::ExifTool::JSON::Main' },
|
|
1298
|
+
},
|
|
1293
1299
|
# 0x0da1-name - seen 'Captured_App_Info' #forum16086
|
|
1294
1300
|
# 0xa050-name - seen 'Jpeg360_2D_Info' (Samsung Gear 360)
|
|
1295
1301
|
# 0xa050 - seen 'Jpeg3602D' (Samsung Gear 360)
|
|
@@ -1563,7 +1569,7 @@ sub ProcessSamsungIFD($$$)
|
|
|
1563
1569
|
# Returns: 1 on success, 0 not valid Samsung trailer, or -1 error writing
|
|
1564
1570
|
# - updates DataPos to point to start of Samsung trailer
|
|
1565
1571
|
# - updates DirLen to existing trailer length
|
|
1566
|
-
sub ProcessSamsung(
|
|
1572
|
+
sub ProcessSamsung($$;$)
|
|
1567
1573
|
{
|
|
1568
1574
|
my ($et, $dirInfo) = @_;
|
|
1569
1575
|
my $raf = $$dirInfo{RAF};
|
|
@@ -1653,8 +1659,13 @@ SamBlock:
|
|
|
1653
1659
|
$audioSize = $size - 8 - $len;
|
|
1654
1660
|
next;
|
|
1655
1661
|
}
|
|
1656
|
-
|
|
1662
|
+
last unless $raf->Seek($dirPos-$noff, 0) and $raf->Read($buf2, $size) == $size;
|
|
1663
|
+
# (could validate the first 4 bytes of the block because they
|
|
1664
|
+
# are the same as the first 4 bytes of the directory entry)
|
|
1665
|
+
$len = Get32u(\$buf2, 4);
|
|
1666
|
+
last if $len + 8 > $size;
|
|
1657
1667
|
my $tag = sprintf("0x%.4x", $type);
|
|
1668
|
+
# add unknown tags if necessary
|
|
1658
1669
|
unless ($$tagTablePtr{$tag}) {
|
|
1659
1670
|
next unless $unknown or $verbose;
|
|
1660
1671
|
my %tagInfo = (
|
|
@@ -1673,11 +1684,8 @@ SamBlock:
|
|
|
1673
1684
|
);
|
|
1674
1685
|
AddTagToTable($tagTablePtr, "$tag-name", \%tagInfo2);
|
|
1675
1686
|
}
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
# are the same as the first 4 bytes of the directory entry)
|
|
1679
|
-
$len = Get32u(\$buf2, 4);
|
|
1680
|
-
last if $len + 8 > $size;
|
|
1687
|
+
# set SamsungTagName ExifTool member for use in tag Condition
|
|
1688
|
+
$$et{SamsungTagName} = substr($buf2, 8, $len);
|
|
1681
1689
|
# extract tag name and value
|
|
1682
1690
|
$et->HandleTag($tagTablePtr, "$tag-name", undef,
|
|
1683
1691
|
DataPt => \$buf2,
|
|
@@ -1691,6 +1699,7 @@ SamBlock:
|
|
|
1691
1699
|
Start => 8 + $len,
|
|
1692
1700
|
Size => $size - (8 + $len),
|
|
1693
1701
|
);
|
|
1702
|
+
delete $$et{SamsungTagName};
|
|
1694
1703
|
}
|
|
1695
1704
|
if ($outfile) {
|
|
1696
1705
|
last unless $raf->Seek($dataPos, 0) and $raf->Read($buff, $dirLen) == $dirLen;
|
|
@@ -997,6 +997,7 @@ my %tagLookup = (
|
|
|
997
997
|
'angleinfoyaw' => { 510 => 'AngleInfoYaw' },
|
|
998
998
|
'anti-blur' => { 451 => 0xb04b },
|
|
999
999
|
'antialiasstrength' => { 123 => 0xc632 },
|
|
1000
|
+
'antiflicker' => { 59 => 0x20 },
|
|
1000
1001
|
'aperturelock' => { 306 => '38.2', 308 => '38.2', 309 => '38.2', 318 => '38.2', 319 => '38.2', 321 => 0xb8, 322 => 0xb8, 323 => 0xb8 },
|
|
1001
1002
|
'aperturemode' => { 410 => 'apmd' },
|
|
1002
1003
|
'aperturerange' => { 88 => 0x10d },
|
|
@@ -11290,6 +11291,7 @@ my %tagExists = (
|
|
|
11290
11291
|
'peakspectralsensitivity' => 1,
|
|
11291
11292
|
'peakvalue' => 1,
|
|
11292
11293
|
'pefversion' => 1,
|
|
11294
|
+
'peg_info' => 1,
|
|
11293
11295
|
'pentax' => 1,
|
|
11294
11296
|
'pentaxdata' => 1,
|
|
11295
11297
|
'pentaxdata2' => 1,
|
|
@@ -11750,6 +11752,7 @@ my %tagExists = (
|
|
|
11750
11752
|
'releasedateyearmonth' => 1,
|
|
11751
11753
|
'releasedateyearmonthday' => 1,
|
|
11752
11754
|
'releasinginstructions' => 1,
|
|
11755
|
+
'remasterinfo' => 1,
|
|
11753
11756
|
'rembrandtconsumertonescale' => 1,
|
|
11754
11757
|
'rembrandtportraittonescale' => 1,
|
|
11755
11758
|
'rembrandttonescale' => 1,
|
|
@@ -11915,6 +11918,7 @@ my %tagExists = (
|
|
|
11915
11918
|
'sampletochunk' => 1,
|
|
11916
11919
|
'sampletogroup' => 1,
|
|
11917
11920
|
'samsung' => 1,
|
|
11921
|
+
'samsungcaptureinfo' => 1,
|
|
11918
11922
|
'samsungifd' => 1,
|
|
11919
11923
|
'samsunginfo' => 1,
|
|
11920
11924
|
'samsungmodel' => 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 27895 tags, with 17462 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
|
|
@@ -10476,6 +10476,7 @@ WB tags for the Canon G9.
|
|
|
10476
10476
|
21 FocusDistanceLower int16u
|
|
10477
10477
|
23 ShutterMode int16s
|
|
10478
10478
|
25 FlashExposureLock int16s
|
|
10479
|
+
32 AntiFlicker int16s
|
|
10479
10480
|
61 RFLensType int16u
|
|
10480
10481
|
|
|
10481
10482
|
=head3 Canon SerialInfo Tags
|
|
@@ -20869,10 +20870,10 @@ Camera orientation information written by the Gear 360 (SM-C200).
|
|
|
20869
20870
|
|
|
20870
20871
|
=head3 Samsung Trailer Tags
|
|
20871
20872
|
|
|
20872
|
-
Tags extracted from the trailer of JPEG images written when
|
|
20873
|
-
features (such as "Sound & Shot" or "Shot & More") from
|
|
20874
|
-
as the Galaxy S4 and Tab S, and from the 'sefd' atom in
|
|
20875
|
-
|
|
20873
|
+
Tags extracted from the SEFT trailer of JPEG and PNG images written when
|
|
20874
|
+
using certain features (such as "Sound & Shot" or "Shot & More") from
|
|
20875
|
+
Samsung models such as the Galaxy S4 and Tab S, and from the 'sefd' atom in
|
|
20876
|
+
HEIC images from models such as the S10+.
|
|
20876
20877
|
|
|
20877
20878
|
Tag Name Writable
|
|
20878
20879
|
-------- --------
|
|
@@ -20890,6 +20891,9 @@ Samsung S10+.
|
|
|
20890
20891
|
EmbeddedVideoFile no
|
|
20891
20892
|
EmbeddedVideoType no
|
|
20892
20893
|
MCCData no
|
|
20894
|
+
PEg_Info JSON
|
|
20895
|
+
RemasterInfo no
|
|
20896
|
+
SamsungCaptureInfo no
|
|
20893
20897
|
SingleShotDepthMap no
|
|
20894
20898
|
SingleShotMeta Samsung SingleShotMeta
|
|
20895
20899
|
SurroundShotVideo no
|
|
@@ -22956,7 +22960,7 @@ E-mount models.
|
|
|
22956
22960
|
|
|
22957
22961
|
=head3 Sony Tag9416 Tags
|
|
22958
22962
|
|
|
22959
|
-
Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1.
|
|
22963
|
+
Valid for the ILCE-1/6700/7CM2/7CR/7M4/7RM5/7SM3/9M3, ILME-FX3/FX30, ZV-E1/E10M2.
|
|
22960
22964
|
|
|
22961
22965
|
Index1 Tag Name Writable
|
|
22962
22966
|
------ -------- --------
|
|
@@ -29614,7 +29618,7 @@ for the official QuickTime specification.
|
|
|
29614
29618
|
The tags below are extracted from timed metadata in QuickTime and other
|
|
29615
29619
|
formats of video files when the ExtractEmbedded option is used. Although
|
|
29616
29620
|
most of these tags are combined into the single table below, ExifTool
|
|
29617
|
-
currently reads
|
|
29621
|
+
currently reads 76 different formats of timed GPS metadata from video files.
|
|
29618
29622
|
|
|
29619
29623
|
Tag Name Writable
|
|
29620
29624
|
-------- --------
|
|
@@ -536,7 +536,7 @@ sub WriteItemInfo($$$)
|
|
|
536
536
|
my $comp = $et->Options('Compress');
|
|
537
537
|
if (defined $comp and ($comp xor $$item{ContentEncoding})) {
|
|
538
538
|
#TODO: add ability to edit infe entry in iinf to change encoding according to Compress option if set
|
|
539
|
-
$et->Warn("Can't currently change compression when rewriting $name in HEIC");
|
|
539
|
+
$et->Warn("Can't currently change compression when rewriting $name in HEIC",1);
|
|
540
540
|
}
|
|
541
541
|
my $wasDeflated;
|
|
542
542
|
if ($$item{ContentEncoding}) {
|
|
@@ -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 = '12.
|
|
32
|
+
$VERSION = '12.91';
|
|
33
33
|
$RELEASE = '';
|
|
34
34
|
@ISA = qw(Exporter);
|
|
35
35
|
%EXPORT_TAGS = (
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "exiftool-vendored.exe",
|
|
3
|
-
"version": "12.
|
|
3
|
+
"version": "12.91.0",
|
|
4
4
|
"description": "Vendored win32 ExifTool for Node.js",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"homepage": "https://github.com/mceachen/exiftool-vendored.exe#readme",
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"axios": "^1.7.2",
|
|
46
|
-
"mocha": "^10.
|
|
46
|
+
"mocha": "^10.7.0",
|
|
47
47
|
"npm-check-updates": "^16.14.20",
|
|
48
|
-
"prettier": "^3.3.
|
|
49
|
-
"release-it": "^17.
|
|
50
|
-
"unzipper": "^0.12.
|
|
48
|
+
"prettier": "^3.3.3",
|
|
49
|
+
"release-it": "^17.6.0",
|
|
50
|
+
"unzipper": "^0.12.2",
|
|
51
51
|
"xml2js": "^0.6.2"
|
|
52
52
|
}
|
|
53
53
|
}
|