exiftool-vendored.pl 12.80.0 → 12.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/Changes +81 -0
- package/bin/MANIFEST +6 -18
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +4 -2
- package/bin/build_geolocation +872 -0
- package/bin/config_files/example.config +2 -2
- package/bin/exiftool +61 -17
- package/bin/fmt_files/gpx.fmt +2 -1
- package/bin/fmt_files/gpx_wpt.fmt +2 -1
- package/bin/lib/Image/ExifTool/Apple.pm +51 -7
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +47 -31
- package/bin/lib/Image/ExifTool/CanonVRD.pm +19 -6
- package/bin/lib/Image/ExifTool/DJI.pm +29 -0
- package/bin/lib/Image/ExifTool/Exif.pm +19 -2
- package/bin/lib/Image/ExifTool/FujiFilm.pm +20 -7
- package/bin/lib/Image/ExifTool/GM.pm +552 -0
- package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/lib/Image/ExifTool/Geolocation.pm +423 -178
- package/bin/lib/Image/ExifTool/Geotag.pm +26 -13
- package/bin/lib/Image/ExifTool/M2TS.pm +32 -4
- package/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- package/bin/lib/Image/ExifTool/Nikon.pm +337 -27
- package/bin/lib/Image/ExifTool/NikonCustom.pm +55 -1
- package/bin/lib/Image/ExifTool/Olympus.pm +1 -0
- package/bin/lib/Image/ExifTool/OpenEXR.pm +21 -3
- package/bin/lib/Image/ExifTool/PNG.pm +3 -3
- package/bin/lib/Image/ExifTool/QuickTime.pm +45 -24
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +66 -30
- package/bin/lib/Image/ExifTool/README +2 -0
- package/bin/lib/Image/ExifTool/Sony.pm +16 -7
- package/bin/lib/Image/ExifTool/TagLookup.pm +4827 -4778
- package/bin/lib/Image/ExifTool/TagNames.pod +953 -620
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +32 -9
- package/bin/lib/Image/ExifTool/Writer.pl +169 -130
- package/bin/lib/Image/ExifTool/XMP.pm +4 -2
- package/bin/lib/Image/ExifTool/XMP2.pl +3 -0
- package/bin/lib/Image/ExifTool.pm +106 -48
- package/bin/lib/Image/ExifTool.pod +47 -25
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/pp_build_exe.args +4 -4
- package/package.json +3 -3
|
@@ -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.06';
|
|
20
20
|
|
|
21
21
|
# supported EXR value format types (other types are extracted as undef binary data)
|
|
22
22
|
my %formatType = (
|
|
@@ -154,6 +154,19 @@ my %formatType = (
|
|
|
154
154
|
type => { },
|
|
155
155
|
version => { },
|
|
156
156
|
chunkCount => { },
|
|
157
|
+
# exif and xmp written by PanoramaStudio4.0.2Pro
|
|
158
|
+
exif => {
|
|
159
|
+
Name => 'EXIF',
|
|
160
|
+
SubDirectory => {
|
|
161
|
+
TagTable => 'Image::ExifTool::Exif::Main',
|
|
162
|
+
ProcessProc => \&Image::ExifTool::ProcessTIFF,
|
|
163
|
+
Start => 4, # (skip leading 4 bytes with data length)
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
xmp => {
|
|
167
|
+
Name => 'XMP',
|
|
168
|
+
SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
|
|
169
|
+
},
|
|
157
170
|
# also observed:
|
|
158
171
|
# ilut
|
|
159
172
|
);
|
|
@@ -221,9 +234,14 @@ sub ProcessEXR($$)
|
|
|
221
234
|
}
|
|
222
235
|
my ($val, $success, $buf2);
|
|
223
236
|
my $format = $formatType{$type};
|
|
224
|
-
|
|
237
|
+
my $subdir = $$tagInfo{SubDirectory};
|
|
238
|
+
if ($format or $binary or $subdir) {
|
|
225
239
|
$raf->Read($buf2, $size) == $size and $success = 1;
|
|
226
|
-
if (
|
|
240
|
+
if ($subdir) {
|
|
241
|
+
$et->HandleTag($tagTablePtr, $tag, undef,
|
|
242
|
+
DataPt => \$buf2, DataPos => $raf->Tell() - length($buf2));
|
|
243
|
+
next if $success;
|
|
244
|
+
} elsif (not $format) {
|
|
227
245
|
$val = \$buf2; # treat as undef binary data
|
|
228
246
|
} elsif ($format ne '1') {
|
|
229
247
|
# handle formats which map nicely into ExifTool format codes
|
|
@@ -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.67';
|
|
40
40
|
|
|
41
41
|
sub ProcessPNG_tEXt($$$);
|
|
42
42
|
sub ProcessPNG_iTXt($$$);
|
|
@@ -642,8 +642,8 @@ my %unreg = ( Notes => 'unregistered' );
|
|
|
642
642
|
Label => { %unreg },
|
|
643
643
|
Make => { %unreg, Groups => { 2 => 'Camera' } },
|
|
644
644
|
Model => { %unreg, Groups => { 2 => 'Camera' } },
|
|
645
|
-
#
|
|
646
|
-
#
|
|
645
|
+
parameters => { %unreg }, # (written by Stable Diffusion)
|
|
646
|
+
aesthetic_score => { Name => 'AestheticScore', %unreg }, # (written by Stable Diffusion)
|
|
647
647
|
'create-date'=> {
|
|
648
648
|
Name => 'CreateDate',
|
|
649
649
|
Groups => { 2 => 'Time' },
|
|
@@ -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.96';
|
|
52
52
|
|
|
53
53
|
sub ProcessMOV($$;$);
|
|
54
54
|
sub ProcessKeys($$$);
|
|
@@ -59,6 +59,9 @@ sub ProcessSampleDesc($$$);
|
|
|
59
59
|
sub ProcessHybrid($$$);
|
|
60
60
|
sub ProcessRights($$$);
|
|
61
61
|
sub ProcessNextbase($$$);
|
|
62
|
+
sub Process_mrlh($$$);
|
|
63
|
+
sub Process_mrlv($$$);
|
|
64
|
+
sub Process_mrld($$$);
|
|
62
65
|
# ++vvvvvvvvvvvv++ (in QuickTimeStream.pl)
|
|
63
66
|
sub Process_mebx($$$);
|
|
64
67
|
sub Process_3gf($$$);
|
|
@@ -1412,6 +1415,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
1412
1415
|
%durationInfo,
|
|
1413
1416
|
# this is int64u if MovieHeaderVersion == 1 (ref 13)
|
|
1414
1417
|
Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
|
|
1418
|
+
# (Note: this Duration seems to be the time of the key frame in
|
|
1419
|
+
# the NRT Metadata track of iPhone live-photo MOV videos)
|
|
1415
1420
|
},
|
|
1416
1421
|
5 => {
|
|
1417
1422
|
Name => 'PreferredRate',
|
|
@@ -6491,6 +6496,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
6491
6496
|
},
|
|
6492
6497
|
ownr => 'Owner', #PH (obscure) (ref ChrisAdan private communication)
|
|
6493
6498
|
'xid ' => 'ISRC', #PH
|
|
6499
|
+
# found in DJI Osmo Action4 video
|
|
6500
|
+
tnal => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' } },
|
|
6501
|
+
snal => { Name => 'PreviewImage', Groups => { 2 => 'Preview' } },
|
|
6494
6502
|
);
|
|
6495
6503
|
|
|
6496
6504
|
# tag decoded from timed face records
|
|
@@ -6728,7 +6736,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
6728
6736
|
%Image::ExifTool::QuickTime::iTunesInfo = (
|
|
6729
6737
|
PROCESS_PROC => \&ProcessMOV,
|
|
6730
6738
|
GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
|
|
6731
|
-
VARS => { LONG_TAGS =>
|
|
6739
|
+
VARS => { LONG_TAGS => 1 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
|
|
6732
6740
|
NOTES => q{
|
|
6733
6741
|
ExifTool will extract any iTunesInfo tags that exist, even if they are not
|
|
6734
6742
|
defined in this table. These tags belong to the family 1 "iTunes" group,
|
|
@@ -6804,6 +6812,17 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
6804
6812
|
BARCODE => 'Barcode',
|
|
6805
6813
|
LABEL => 'Label',
|
|
6806
6814
|
MOOD => 'Mood',
|
|
6815
|
+
DIRECTOR => 'Director',
|
|
6816
|
+
DIRECTOR_OF_PHOTOGRAPHY => 'DirectorOfPhotography',
|
|
6817
|
+
PRODUCTION_DESIGNER => 'ProductionDesigner',
|
|
6818
|
+
COSTUME_DESIGNER => 'CostumeDesigner',
|
|
6819
|
+
SCREENPLAY_BY => 'ScreenplayBy',
|
|
6820
|
+
EDITED_BY => 'EditedBy',
|
|
6821
|
+
PRODUCER => 'Producer',
|
|
6822
|
+
IMDB_ID => { },
|
|
6823
|
+
TMDB_ID => { },
|
|
6824
|
+
Actors => { },
|
|
6825
|
+
TIPL => { },
|
|
6807
6826
|
popularimeter => 'Popularimeter',
|
|
6808
6827
|
'Dynamic Range (DR)'=> 'DynamicRange',
|
|
6809
6828
|
initialkey => 'InitialKey',
|
|
@@ -7859,20 +7878,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
|
7859
7878
|
#
|
|
7860
7879
|
ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
|
|
7861
7880
|
name => { Name => 'OtherName', Format => 'undef', ValueConv => 'substr($val, 4)' },
|
|
7862
|
-
|
|
7863
|
-
|
|
7864
|
-
|
|
7865
|
-
# 0 - int32u count
|
|
7866
|
-
# 4 - int32u ? (related to units) 0=none,1=m/km,2=L,3=kph,4=C,7=deg,8=rpm,9=kPa,10=G,11=V,15=Nm,16=%
|
|
7867
|
-
# 8 - int32u ? (0,1,3,4,5)
|
|
7868
|
-
# 12 - string[64] units
|
|
7869
|
-
# 76 - int32u ? (1,3,7,15)
|
|
7870
|
-
# 80 - int32u 0
|
|
7871
|
-
# 84 - undef[4] ?
|
|
7872
|
-
# 88 - int16u[6] ?
|
|
7873
|
-
# 100 - undef[32] ?
|
|
7874
|
-
# 132 - string[64] measurement name
|
|
7875
|
-
# 196 - string[64] measurement name
|
|
7881
|
+
mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
|
|
7882
|
+
mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
|
|
7883
|
+
mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
|
|
7876
7884
|
);
|
|
7877
7885
|
|
|
7878
7886
|
# MP4 data information box (ref 5)
|
|
@@ -9467,7 +9475,7 @@ sub ProcessMOV($$;$)
|
|
|
9467
9475
|
my $dirID = $$dirInfo{DirID} || '';
|
|
9468
9476
|
my $charsetQuickTime = $et->Options('CharsetQuickTime');
|
|
9469
9477
|
my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
|
|
9470
|
-
my ($dirEnd, $unkOpt, %saveOptions, $atomCount);
|
|
9478
|
+
my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr);
|
|
9471
9479
|
|
|
9472
9480
|
my $topLevel = not $$et{InQuickTime};
|
|
9473
9481
|
$$et{InQuickTime} = 1;
|
|
@@ -9547,6 +9555,7 @@ sub ProcessMOV($$;$)
|
|
|
9547
9555
|
$index = $$tagTablePtr{VARS}{START_INDEX};
|
|
9548
9556
|
$atomCount = $$tagTablePtr{VARS}{ATOM_COUNT};
|
|
9549
9557
|
}
|
|
9558
|
+
my $lastTag = '';
|
|
9550
9559
|
for (;;) {
|
|
9551
9560
|
my ($eeTag, $ignore);
|
|
9552
9561
|
last if defined $atomCount and --$atomCount < 0;
|
|
@@ -9573,22 +9582,22 @@ sub ProcessMOV($$;$)
|
|
|
9573
9582
|
}
|
|
9574
9583
|
last;
|
|
9575
9584
|
}
|
|
9576
|
-
$size == 1 or $
|
|
9585
|
+
$size == 1 or $warnStr = 'Invalid atom size', last;
|
|
9577
9586
|
# read extended atom size
|
|
9578
|
-
$raf->Read($buff, 8) == 8 or $
|
|
9587
|
+
$raf->Read($buff, 8) == 8 or $warnStr = 'Truncated atom header', last;
|
|
9579
9588
|
$dataPos += 8;
|
|
9580
9589
|
my ($hi, $lo) = unpack('NN', $buff);
|
|
9581
9590
|
if ($hi or $lo > 0x7fffffff) {
|
|
9582
9591
|
if ($hi > 0x7fffffff) {
|
|
9583
|
-
$
|
|
9592
|
+
$warnStr = 'Invalid atom size';
|
|
9584
9593
|
last;
|
|
9585
9594
|
} elsif (not $et->Options('LargeFileSupport')) {
|
|
9586
|
-
$
|
|
9595
|
+
$warnStr = 'End of processing at large atom (LargeFileSupport not enabled)';
|
|
9587
9596
|
last;
|
|
9588
9597
|
}
|
|
9589
9598
|
}
|
|
9590
9599
|
$size = $hi * 4294967296 + $lo - 16;
|
|
9591
|
-
$size < 0 and $
|
|
9600
|
+
$size < 0 and $warnStr = 'Invalid extended size', last;
|
|
9592
9601
|
} else {
|
|
9593
9602
|
$size -= 8;
|
|
9594
9603
|
}
|
|
@@ -9744,7 +9753,7 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
|
9744
9753
|
my $missing = $size - $raf->Read($val, $size);
|
|
9745
9754
|
if ($missing) {
|
|
9746
9755
|
my $t = PrintableTagID($tag,2);
|
|
9747
|
-
$
|
|
9756
|
+
$warnStr = "Truncated '${t}' data (missing $missing bytes)";
|
|
9748
9757
|
last;
|
|
9749
9758
|
}
|
|
9750
9759
|
# use value to get tag info if necessary
|
|
@@ -10059,16 +10068,28 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
|
10059
10068
|
) if $verbose;
|
|
10060
10069
|
if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) {
|
|
10061
10070
|
my $t = PrintableTagID($tag,2);
|
|
10062
|
-
$
|
|
10071
|
+
$warnStr = "Truncated '${t}' data";
|
|
10063
10072
|
last;
|
|
10064
10073
|
}
|
|
10065
10074
|
}
|
|
10066
10075
|
$dataPos += $size + 8; # point to start of next atom data
|
|
10067
10076
|
last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
|
|
10068
10077
|
$raf->Read($buff, 8) == 8 or last;
|
|
10078
|
+
$lastTag = $tag if $$tagTablePtr{$tag};
|
|
10069
10079
|
($size, $tag) = unpack('Na4', $buff);
|
|
10070
10080
|
++$index if defined $index;
|
|
10071
10081
|
}
|
|
10082
|
+
if ($warnStr) {
|
|
10083
|
+
# assume this is an unknown trailer if it comes immediately after
|
|
10084
|
+
# mdat or moov and has a tag name we don't recognize
|
|
10085
|
+
if (($lastTag eq 'mdat' or $lastTag eq 'moov') and (not $$tagTablePtr{$tag} or
|
|
10086
|
+
ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
|
|
10087
|
+
{
|
|
10088
|
+
$et->Warn('Unknown trailer with '.lcfirst($warnStr));
|
|
10089
|
+
} else {
|
|
10090
|
+
$et->Warn($warnStr);
|
|
10091
|
+
}
|
|
10092
|
+
}
|
|
10072
10093
|
# tweak file type based on track content ("iso*" and "dash" ftyp only)
|
|
10073
10094
|
if ($topLevel and $$et{FileType} and $$et{FileType} eq 'MP4' and
|
|
10074
10095
|
$$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
|
|
@@ -22,12 +22,12 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
22
22
|
use Image::ExifTool::QuickTime;
|
|
23
23
|
|
|
24
24
|
sub Process_tx3g($$$);
|
|
25
|
-
sub Process_marl($$$);
|
|
26
25
|
sub Process_mebx($$$);
|
|
27
26
|
sub Process_text($$$;$);
|
|
28
27
|
sub ProcessFreeGPS($$$);
|
|
29
28
|
sub Process360Fly($$$);
|
|
30
29
|
sub ProcessFMAS($$$);
|
|
30
|
+
sub ProcessWolfbox($$$);
|
|
31
31
|
sub ProcessCAMM($$$);
|
|
32
32
|
|
|
33
33
|
# QuickTime data types that have ExifTool equivalents
|
|
@@ -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 74 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' },
|
|
@@ -207,6 +207,13 @@ my %insvLimit = (
|
|
|
207
207
|
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
|
208
208
|
ProcessProc => \&ProcessFMAS,
|
|
209
209
|
},
|
|
210
|
+
},{
|
|
211
|
+
Name => 'gpmd_Wolfbox', # Wolfbox G900 Dashcam
|
|
212
|
+
Condition => '$$valPt =~ /^.{136}0{16}HYTH/s',
|
|
213
|
+
SubDirectory => {
|
|
214
|
+
TagTable => 'Image::ExifTool::QuickTime::Stream',
|
|
215
|
+
ProcessProc => \&ProcessWolfbox,
|
|
216
|
+
},
|
|
210
217
|
},{
|
|
211
218
|
Name => 'gpmd_GoPro',
|
|
212
219
|
SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' },
|
|
@@ -223,7 +230,7 @@ my %insvLimit = (
|
|
|
223
230
|
},
|
|
224
231
|
marl => {
|
|
225
232
|
Name => 'marl',
|
|
226
|
-
SubDirectory => { TagTable => 'Image::ExifTool::
|
|
233
|
+
SubDirectory => { TagTable => 'Image::ExifTool::GM::marl' },
|
|
227
234
|
},
|
|
228
235
|
CTMD => { # (Canon Timed MetaData)
|
|
229
236
|
Name => 'CTMD',
|
|
@@ -326,6 +333,14 @@ my %insvLimit = (
|
|
|
326
333
|
Groups => { 0 => 'Trailer', 1 => 'Insta360' }, # (so these groups will appear in the -listg options)
|
|
327
334
|
SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::INSV_MakerNotes' },
|
|
328
335
|
},
|
|
336
|
+
ssmd => { # Chigee AIO-5 dashcam
|
|
337
|
+
Name => 'PreviewImage',
|
|
338
|
+
Groups => { 2 => 'Preview' },
|
|
339
|
+
RawConv => '$self->ValidateImage(\$val,$tag)',
|
|
340
|
+
},
|
|
341
|
+
# djmd - DJI AC003 Osmo Action 4 cam
|
|
342
|
+
#TODO djmd => { SubDirectory => { TagTable => 'Image::ExifTool::DJI::djmd', ByteOrder => 'Little-Endian' } },
|
|
343
|
+
# dbgi - DJI AC003 Osmo Action 4 cam -- lots more unknown stuff
|
|
329
344
|
Unknown00 => { Unknown => 1 },
|
|
330
345
|
Unknown01 => { Unknown => 1 },
|
|
331
346
|
Unknown02 => { Unknown => 1 },
|
|
@@ -741,13 +756,6 @@ my %insvLimit = (
|
|
|
741
756
|
10 => { Name => 'FusionYPR', Format => 'float[3]' },
|
|
742
757
|
);
|
|
743
758
|
|
|
744
|
-
# tags found in 'marl' ctbx timed metadata (ref PH)
|
|
745
|
-
%Image::ExifTool::QuickTime::marl = (
|
|
746
|
-
PROCESS_PROC => \&Process_marl,
|
|
747
|
-
GROUPS => { 2 => 'Other' },
|
|
748
|
-
NOTES => 'Tags extracted from the marl ctbx timed metadata of GM cars.',
|
|
749
|
-
);
|
|
750
|
-
|
|
751
759
|
#------------------------------------------------------------------------------
|
|
752
760
|
# Save information from keys in OtherSampleDesc directory for processing timed metadata
|
|
753
761
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
@@ -2219,26 +2227,6 @@ sub Process_tx3g($$$)
|
|
|
2219
2227
|
return 1;
|
|
2220
2228
|
}
|
|
2221
2229
|
|
|
2222
|
-
#------------------------------------------------------------------------------
|
|
2223
|
-
# Process GM 'marl' ctbx metadata (ref PH)
|
|
2224
|
-
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
2225
|
-
# Returns: 1 on success
|
|
2226
|
-
sub Process_marl($$$)
|
|
2227
|
-
{
|
|
2228
|
-
my ($et, $dirInfo, $tagTablePtr) = @_;
|
|
2229
|
-
my $dataPt = $$dirInfo{DataPt};
|
|
2230
|
-
return 0 if length $$dataPt < 2;
|
|
2231
|
-
|
|
2232
|
-
# 8-byte records:
|
|
2233
|
-
# byte 0 seems to be tag ID (0=timestamp in sec * 1e7)
|
|
2234
|
-
# bytes 1-3 seem to be 24-bit signed integer (unknown meaning)
|
|
2235
|
-
# bytes 4-7 are an int32u value, usually a multiple of 10000
|
|
2236
|
-
|
|
2237
|
-
$et->WarnOnce("Can't yet decode timed GM data", 1);
|
|
2238
|
-
# (see https://exiftool.org/forum/index.php?topic=11335.msg61393#msg61393)
|
|
2239
|
-
return 1;
|
|
2240
|
-
}
|
|
2241
|
-
|
|
2242
2230
|
#------------------------------------------------------------------------------
|
|
2243
2231
|
# Process QuickTime 'mebx' timed metadata
|
|
2244
2232
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
|
@@ -2443,7 +2431,9 @@ sub Process_nbmt($$$)
|
|
|
2443
2431
|
$$et{DOC_NUM} = $$et{DOC_COUNT} + 1;
|
|
2444
2432
|
delete $$et{UnknownTextCount};
|
|
2445
2433
|
delete $$et{NoMoreTextDecoding};
|
|
2434
|
+
$$et{SET_GROUP1} = 'Nextbase';
|
|
2446
2435
|
Process_text($et, $dataPt, $tagTbl, 1);
|
|
2436
|
+
delete $$et{SET_GROUP1};
|
|
2447
2437
|
delete $$et{UnknownTextCount};
|
|
2448
2438
|
delete $$et{NoMoreTextDecoding};
|
|
2449
2439
|
delete $$et{DOC_NUM};
|
|
@@ -3229,6 +3219,52 @@ sub ProcessFMAS($$$)
|
|
|
3229
3219
|
return 1;
|
|
3230
3220
|
}
|
|
3231
3221
|
|
|
3222
|
+
#------------------------------------------------------------------------------
|
|
3223
|
+
# Process GPS from Wolfbox G900 Dashcam
|
|
3224
|
+
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
|
3225
|
+
# Returns: 1 on success
|
|
3226
|
+
sub ProcessWolfbox($$$)
|
|
3227
|
+
{
|
|
3228
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
|
3229
|
+
my $dataPt = $$dirInfo{DataPt};
|
|
3230
|
+
return 0 if length($$dataPt) < 0xc8;
|
|
3231
|
+
$et->VerboseDir('Wolfbox', undef, length($$dataPt));
|
|
3232
|
+
# 0000: 65 00 00 00 00 00 00 00 31 01 01 00 e3 ff 00 00 [e.......1.......]
|
|
3233
|
+
# 0010: 04 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
|
|
3234
|
+
# 0020: 01 00 00 00 00 00 00 00 8b 33 ff 51 00 00 00 00 [.........3.Q....]
|
|
3235
|
+
# 0030: a0 86 01 00 00 00 00 00 4d 5e 07 fa ff ff ff ff [........M^......]
|
|
3236
|
+
# 0040: a0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
3237
|
+
# 0050: 64 00 00 00 00 00 00 00 90 21 00 00 00 00 00 00 [d........!......]
|
|
3238
|
+
# 0060: 64 00 00 00 00 00 00 00 18 00 00 00 03 00 00 00 [d...............]
|
|
3239
|
+
# 0070: e8 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
|
3240
|
+
# 0080: 00 00 00 00 00 00 00 00 30 30 30 30 30 30 30 30 [........00000000]
|
|
3241
|
+
# 0090: 30 30 30 30 30 30 30 30 48 59 54 48 00 00 00 00 [00000000HYTH....]
|
|
3242
|
+
# 00a0: 0c 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
|
|
3243
|
+
# 00b0: 4f 3f 0c 1f 00 00 00 00 a0 86 01 00 00 00 00 00 [O?..............]
|
|
3244
|
+
# 00c0: 7f cf 2d ff ff ff ff ff a0 86 01 00 00 00 00 00 [..-.............]
|
|
3245
|
+
# 00d0: 01 00 00 00 08 00 00 00 0a 00 00 00 00 00 00 00 [................]
|
|
3246
|
+
# 00e0: 0a 00 00 00 00 00 00 00 e8 03 00 00 00 00 00 00 [................]
|
|
3247
|
+
# 00f0: 0a 00 00 00 00 00 00 00 4d 00 00 00 00 00 00 00 [........M.......]
|
|
3248
|
+
# lat/lon at 0xb0/0xc0 and 0x128/0x138
|
|
3249
|
+
# h/m/s at 0x10 and 0xa0 and 0x148 (the first imprinted on the video, the latter 2 presumed UTC)
|
|
3250
|
+
# spd at 0x48, dir at 0x58, alt at 0xe8
|
|
3251
|
+
SetByteOrder('II');
|
|
3252
|
+
my ($spd,$dir,$d,$mo,$yr,$h,$m,$s) = unpack('x72Vx12Vx12V3x44V3',$$dataPt);
|
|
3253
|
+
# offset 0xa0 also stores hh mm ss, but is out by 8 hours!
|
|
3254
|
+
my $time = sprintf '%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $yr, $mo, $d, $h, $m, $s;
|
|
3255
|
+
my ($lat, $lon) = (Get32s($dataPt, 0xb0) / 1e5, Get32s($dataPt, 0xc0) / 1e5);
|
|
3256
|
+
my $alt = Get32s($dataPt, 0xe8);
|
|
3257
|
+
ConvertLatLon($lat, $lon);
|
|
3258
|
+
$et->HandleTag($tagTbl, GPSDateTime => $time);
|
|
3259
|
+
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
|
3260
|
+
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
|
3261
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd * $knotsToKph / 100);
|
|
3262
|
+
$et->HandleTag($tagTbl, GPSTrack => $dir / 100);
|
|
3263
|
+
$et->HandleTag($tagTbl, GPSAltitude => $alt / 10); # (NC)
|
|
3264
|
+
SetByteOrder('MM');
|
|
3265
|
+
return 1;
|
|
3266
|
+
}
|
|
3267
|
+
|
|
3232
3268
|
#------------------------------------------------------------------------------
|
|
3233
3269
|
# Scan media data for "freeGPS" metadata if not found already (ref PH)
|
|
3234
3270
|
# Inputs: 0) ExifTool ref
|
|
@@ -1132,6 +1132,8 @@ keys in structure hashes are:
|
|
|
1132
1132
|
GROUPS : Same as in tag table, but only the family 2 group name is used,
|
|
1133
1133
|
as the default for the flattened tags.
|
|
1134
1134
|
|
|
1135
|
+
SORT_ORDER : Order for sorting fields in documentation.
|
|
1136
|
+
|
|
1135
1137
|
The contained structure field information hashes are similar to tag information
|
|
1136
1138
|
hashes, except that only the following elements are used:
|
|
1137
1139
|
|
|
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
34
34
|
use Image::ExifTool::Exif;
|
|
35
35
|
use Image::ExifTool::Minolta;
|
|
36
36
|
|
|
37
|
-
$VERSION = '3.
|
|
37
|
+
$VERSION = '3.68';
|
|
38
38
|
|
|
39
39
|
sub ProcessSRF($$$);
|
|
40
40
|
sub ProcessSR2($$$);
|
|
@@ -164,9 +164,11 @@ sub PrintInvLensSpec($;$$);
|
|
|
164
164
|
32877 => 'Sony E 15mm F1.4 G', #JR
|
|
165
165
|
32878 => 'Sony FE 20-70mm F4 G', #JR
|
|
166
166
|
32879 => 'Sony FE 50mm F1.4 GM', #JR
|
|
167
|
+
32881 => 'Sony FE 24-50mm F2.8 G', #JR
|
|
168
|
+
32882 => 'Sony FE 16-25mm F2.8 G', #JR
|
|
167
169
|
32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
|
|
168
170
|
32885 => 'Sony FE 16-35mm F2.8 GM II', #JR
|
|
169
|
-
32886 => 'Sony FE 300mm F2.8 OSS', #JR
|
|
171
|
+
32886 => 'Sony FE 300mm F2.8 GM OSS', #JR
|
|
170
172
|
|
|
171
173
|
# (comment this out so LensID will report the LensModel, which is more useful)
|
|
172
174
|
# 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
|
|
@@ -187,6 +189,8 @@ sub PrintInvLensSpec($;$$);
|
|
|
187
189
|
33086 => 'Sony FE 70-200mm F2.8 GM OSS II + 2X Teleconverter', #JR
|
|
188
190
|
33087 => 'Sony FE 70-200mm F4 Macro G OSS II + 1.4X Teleconverter', #JR
|
|
189
191
|
33088 => 'Sony FE 70-200mm F4 Macro G OSS II + 2X Teleconverter', #JR
|
|
192
|
+
33089 => 'Sony FE 300mm F2.8 GM OSS + 1.4X Teleconverter', #JR (NC)
|
|
193
|
+
33090 => 'Sony FE 300mm F2.8 GM OSS + 2X Teleconverter', #JR
|
|
190
194
|
|
|
191
195
|
49201 => 'Zeiss Touit 12mm F2.8', #JR (lens firmware Ver.02)
|
|
192
196
|
49202 => 'Zeiss Touit 32mm F1.8', #JR (lens firmware Ver.02)
|
|
@@ -234,6 +238,7 @@ sub PrintInvLensSpec($;$$);
|
|
|
234
238
|
49474.7 => 'Viltrox 35mm F1.8 FE', #JR
|
|
235
239
|
49474.8 => 'Viltrox 50mm F1.8 FE', #JR
|
|
236
240
|
49474.9 => 'Viltrox 75mm F1.2 E', #JR
|
|
241
|
+
'49474.10' => 'Viltrox 20mm F2.8 FE', #JR
|
|
237
242
|
|
|
238
243
|
49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
|
|
239
244
|
49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
|
|
@@ -287,7 +292,9 @@ sub PrintInvLensSpec($;$$);
|
|
|
287
292
|
50540 => 'Sigma 14mm F1.4 DG DN | A', #JR (023)
|
|
288
293
|
50543 => 'Sigma 70-200mm F2.8 DG DN OS | S', #JR (023)
|
|
289
294
|
50544 => 'Sigma 23mm F1.4 DC DN | C', #JR (023)
|
|
295
|
+
50546 => 'Sigma 500mm F5.6 DG DN OS | S', #JR (024)
|
|
290
296
|
50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023)
|
|
297
|
+
50548 => 'Sigma 15mm F1.4 DG DN DIAGONAL FISHEYE | A', #JR (024)
|
|
291
298
|
|
|
292
299
|
50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
|
|
293
300
|
50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
|
|
@@ -2031,6 +2038,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
|
|
|
2031
2038
|
'4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
|
|
2032
2039
|
'4 0 1 0' => 'ARW 4.0.1', #github#195 (ZV-E1)
|
|
2033
2040
|
'5 0 0 0' => 'ARW 5.0', # (ILCE-9M3)
|
|
2041
|
+
'5 0 1 0' => 'ARW 5.0.1', # (ILCE-1 with FirmWare 2.0)
|
|
2034
2042
|
# what about cRAW images?
|
|
2035
2043
|
},
|
|
2036
2044
|
},
|
|
@@ -8515,16 +8523,17 @@ my %isoSetting2010 = (
|
|
|
8515
8523
|
FIRST_ENTRY => 0,
|
|
8516
8524
|
GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
|
|
8517
8525
|
DATAMEMBER => [ 0 ],
|
|
8518
|
-
IS_SUBDIR => [ 0x03e2, 0x03f4, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
|
|
8526
|
+
IS_SUBDIR => [ 0x03e2, 0x03f4, 0x044e, 0x0498, 0x049d, 0x049e, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
|
|
8519
8527
|
0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
|
|
8520
8528
|
|
|
8521
8529
|
0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8522
8530
|
0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 185', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8523
8531
|
0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8524
8532
|
0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8525
|
-
0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167',
|
|
8526
|
-
|
|
8527
|
-
|
|
8533
|
+
0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167 and $$self{Software} !~ /^ILCE-7M4 (v2|v3)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8534
|
+
0x049e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167 and $$self{Software} =~ /^ILCE-7M4 (v2|v3)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8535
|
+
0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/ and $$self{Software} !~ /^ILCE-1 v2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8536
|
+
0x04a2 => { Name => 'ISOInfo', Condition => '($$self{Ver9401} =~ /^(152|154|155)/ and $$self{Model} !~ /^ZV-1M2/) or ($$self{Ver9401} == 164 and $$self{Software} =~ /^ILCE-1 v2/)', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8528
8537
|
0x04ba => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 155 and $$self{Model} =~ /^ZV-1M2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8529
8538
|
0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
8530
8539
|
0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
|
|
@@ -10553,7 +10562,7 @@ my %isoSetting2010 = (
|
|
|
10553
10562
|
ValueConv => '2 ** (8-$val/8192)',
|
|
10554
10563
|
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
|
10555
10564
|
},
|
|
10556
|
-
0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk },
|
|
10565
|
+
0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk }, # (perhaps related to focus distance? forum15856)
|
|
10557
10566
|
0x8004 => { Name => 'Sony_rtmd_0x8004', Format => 'int16u', %hidUnk }, # (FocalLength35efl?, forum14315)
|
|
10558
10567
|
0x8005 => { Name => 'Sony_rtmd_0x8005', Format => 'int16u', %hidUnk }, # (FocalLength?, forum14315)
|
|
10559
10568
|
0x800a => { Name => 'Sony_rtmd_0x800a', Format => 'int16u', %hidUnk }, # (FocusRingPosition?, forum14315)
|