exiftool_vendored 12.89.0 → 12.92.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/Changes +25 -3
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/build_geolocation +1 -1
- data/bin/exiftool +5 -5
- data/bin/lib/Image/ExifTool/Canon.pm +13 -7
- data/bin/lib/Image/ExifTool/Nikon.pm +34 -1
- data/bin/lib/Image/ExifTool/PNG.pm +10 -2
- data/bin/lib/Image/ExifTool/QuickTime.pm +7 -2
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +87 -6
- data/bin/lib/Image/ExifTool/Samsung.pm +28 -19
- data/bin/lib/Image/ExifTool/TagLookup.pm +4 -0
- data/bin/lib/Image/ExifTool/TagNames.pod +10 -6
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +1 -1
- data/bin/lib/Image/ExifTool.pm +1 -1
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f86c2dcf64db70e03d4758fcba7dd1a711528fee369de76762474f076018d779
|
4
|
+
data.tar.gz: e21c4bebc90dee50fa43ee7b7d9fb4aa84ca699ce1403eb18011454bfc34e201
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2189eadffa5201003f5247c0c97a3dc0cc5f26ff0fbac13a49691bee0bd779656c07be72fbc4803b1a3cc98bcf8cdad79e314d551cdd893fb789f2c929f7790d
|
7
|
+
data.tar.gz: aa2912573a6781d7d087e3b8449ea85841f6484c3cd3b8ba378e60fb5df49a3f485a6a74fceb705052cc565cb561043faca5ce970f4be3e71ef20d342b48af09
|
data/bin/Changes
CHANGED
@@ -7,6 +7,28 @@ 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
|
+
July 24, 2024 - Version 12.92
|
11
|
+
|
12
|
+
- Removed -w from exiftool shebang
|
13
|
+
|
14
|
+
July 24, 2024 - Version 12.91
|
15
|
+
|
16
|
+
- Fixed 2 test files that were causing failed tests (ExifTool itself is
|
17
|
+
unchanged)
|
18
|
+
|
19
|
+
July 24, 2024 - Version 12.90
|
20
|
+
|
21
|
+
- Added support for reading Samsung trailer from PNG images
|
22
|
+
- Decode two more formats of timed GPS from MP4 videos
|
23
|
+
- Decode a few more Samung trailer tags (thanks Neal Krawetz)
|
24
|
+
- Decode Canon AntiFlicker tag
|
25
|
+
- Drop Nikon ShotInfo record when copying MakerNotes from NEF to JPG if it is
|
26
|
+
larger than 50000 bytes (then MakerNotes would be too large for a single
|
27
|
+
JPEG segment)
|
28
|
+
- Changed exiftool shebang from "#!/usr/bin/perl" to "#!/usr/bin/env perl"
|
29
|
+
- Revert change of 12.84 to iterate through sub-documents with the -p option
|
30
|
+
only if -ee is used
|
31
|
+
|
10
32
|
July 12, 2024 - Version 12.89
|
11
33
|
|
12
34
|
- Added new Sony lenses and updated decoding of some tags (thanks Jos Roost)
|
@@ -15,9 +37,7 @@ July 12, 2024 - Version 12.89
|
|
15
37
|
|
16
38
|
July 11, 2024 - Version 12.88 - "New Windows/MacOS packages"
|
17
39
|
|
18
|
-
-
|
19
|
-
|
20
|
-
NOTE: The install procedure for the Windows executable has changed!
|
40
|
+
- NOTE: The install procedure for the Windows executable has changed!
|
21
41
|
- Windows EXE version now uses Oliver Betz's bundle with Strawberry Perl and
|
22
42
|
comes in 32- and 64-bit versions
|
23
43
|
- MacOS distribution now uses a flattened package
|
@@ -105,6 +125,8 @@ Apr. 23, 2024 - Version 12.84
|
|
105
125
|
cities
|
106
126
|
- Allow coordinates to be entered without comma separator for the Geolocation
|
107
127
|
feature as long as both coordinates have a decimal point
|
128
|
+
- Changed -p option to iterate through sub-documents if they exist even if -ee
|
129
|
+
isn't used
|
108
130
|
- Fixed long-standing bug in Windows version that didn't properly handle dates
|
109
131
|
older than 50 years when writing FileModifyDate or FileCreateDate
|
110
132
|
- Fixed API TimeZone option to work in Windows
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
109
109
|
terminal window to extract and run ExifTool:
|
110
110
|
|
111
111
|
cd ~/Desktop
|
112
|
-
gzip -dc Image-ExifTool-12.
|
113
|
-
cd Image-ExifTool-12.
|
112
|
+
gzip -dc Image-ExifTool-12.92.tar.gz | tar -xf -
|
113
|
+
cd Image-ExifTool-12.92
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
115
115
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
data/bin/build_geolocation
CHANGED
data/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.92';
|
15
15
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
17
17
|
my $exePath;
|
@@ -2310,8 +2310,8 @@ sub GetImageInfo($$)
|
|
2310
2310
|
# output using print format file (-p) option
|
2311
2311
|
my ($type, $doc, $grp, $lastDoc, $cache);
|
2312
2312
|
$fileTrailer = '';
|
2313
|
-
# repeat for each
|
2314
|
-
if (
|
2313
|
+
# repeat for each embedded document if necessary (only if -ee used)
|
2314
|
+
if ($et->Options('ExtractEmbedded')) {
|
2315
2315
|
# (cache tag keys if there are sub-documents)
|
2316
2316
|
$lastDoc = $$et{DOC_COUNT} and $cache = { };
|
2317
2317
|
} else {
|
@@ -5684,7 +5684,7 @@ with this command:
|
|
5684
5684
|
|
5685
5685
|
produces output like this:
|
5686
5686
|
|
5687
|
-
-- Generated by ExifTool 12.
|
5687
|
+
-- Generated by ExifTool 12.92 --
|
5688
5688
|
File: a.jpg - 2003:10:31 15:44:19
|
5689
5689
|
(f/5.6, 1/60s, ISO 100)
|
5690
5690
|
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
|
@@ -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}) {
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -29,7 +29,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
|
|
29
29
|
%jpegMarker %specialTags %fileTypeLookup $testLen $exeDir
|
30
30
|
%static_vars $advFmtSelf);
|
31
31
|
|
32
|
-
$VERSION = '12.
|
32
|
+
$VERSION = '12.92';
|
33
33
|
$RELEASE = '';
|
34
34
|
@ISA = qw(Exporter);
|
35
35
|
%EXPORT_TAGS = (
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exiftool_vendored
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 12.
|
4
|
+
version: 12.92.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew McEachen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-07-
|
12
|
+
date: 2024-07-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: exiftool
|