exiftool_vendored 12.80.0 → 12.82.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 +44 -0
- data/bin/MANIFEST +4 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -2
- data/bin/exiftool +35 -13
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +44 -31
- data/bin/lib/Image/ExifTool/CanonVRD.pm +2 -2
- data/bin/lib/Image/ExifTool/FujiFilm.pm +20 -7
- data/bin/lib/Image/ExifTool/GM.pm +543 -0
- data/bin/lib/Image/ExifTool/Geolocation.pm +332 -149
- data/bin/lib/Image/ExifTool/Geotag.pm +9 -4
- data/bin/lib/Image/ExifTool/M2TS.pm +32 -4
- data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +331 -22
- data/bin/lib/Image/ExifTool/NikonCustom.pm +55 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +1 -0
- data/bin/lib/Image/ExifTool/OpenEXR.pm +21 -3
- data/bin/lib/Image/ExifTool/PNG.pm +3 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +40 -24
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +61 -30
- data/bin/lib/Image/ExifTool/README +2 -0
- data/bin/lib/Image/ExifTool/Sony.pm +1 -1
- data/bin/lib/Image/ExifTool/TagLookup.pm +4815 -4775
- data/bin/lib/Image/ExifTool/TagNames.pod +931 -617
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +30 -8
- data/bin/lib/Image/ExifTool/Writer.pl +10 -4
- data/bin/lib/Image/ExifTool/XMP.pm +4 -2
- data/bin/lib/Image/ExifTool.pm +77 -41
- data/bin/lib/Image/ExifTool.pod +24 -11
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -15,7 +15,7 @@ package Image::ExifTool::NikonCustom;
|
|
15
15
|
use strict;
|
16
16
|
use vars qw($VERSION @ISA @EXPORT_OK %buttonsZ9);
|
17
17
|
|
18
|
-
$VERSION = '1.
|
18
|
+
$VERSION = '1.25';
|
19
19
|
|
20
20
|
@ISA = qw(Exporter);
|
21
21
|
@EXPORT_OK = qw(%buttonsZ9);
|
@@ -77,6 +77,7 @@ $VERSION = '1.24';
|
|
77
77
|
66 => 'Voice Memo',
|
78
78
|
70 => 'Photo Shooting Bank',
|
79
79
|
71 => 'ISO',
|
80
|
+
72 => 'Shooting Mode',
|
80
81
|
73 => 'Exposure Compensation',
|
81
82
|
76 => 'Silent Mode',
|
82
83
|
78 => 'LiveView Information',
|
@@ -90,6 +91,9 @@ $VERSION = '1.24';
|
|
90
91
|
86 => 'Save Focus Position',
|
91
92
|
87 => 'Recall Focus Position',
|
92
93
|
88 => 'Recall Shooting Functions (Hold)',
|
94
|
+
89 => 'Set Picture Control (HLG)',
|
95
|
+
90 => 'Skin Softening',
|
96
|
+
91 => 'Portrait Impression Balance',
|
93
97
|
97 => 'High Frequency Flicker Reduction',
|
94
98
|
98 => 'Switch FX/DX',
|
95
99
|
99 => 'View Mode (Photo LV)',
|
@@ -104,7 +108,25 @@ $VERSION = '1.24';
|
|
104
108
|
110 => 'DISP - Cycle Information Display (playback)', # Playback mode
|
105
109
|
111 => 'Resume Shooting',
|
106
110
|
112 => 'Switch Eyes',
|
111
|
+
113 => 'Power Zoom +',
|
112
|
+
114 => 'Power Zoom -',
|
107
113
|
115 => 'Delete',
|
114
|
+
116 => 'Pixel Shift Shooting',
|
115
|
+
117 => 'Cycle AF-area Mode',
|
116
|
+
118 => 'Raw Processing (Current)', #118-131 are Retouch options
|
117
|
+
119 => 'Raw Processing (Multiple)',
|
118
|
+
120 => 'Trim',
|
119
|
+
121 => 'Resize (Current)',
|
120
|
+
122 => 'Resize (Multiple)',
|
121
|
+
123 => 'D-Lighting',
|
122
|
+
124 => 'Straighten',
|
123
|
+
125 => 'Distortion Control',
|
124
|
+
126 => 'Perspective Control',
|
125
|
+
127 => 'Monochrome',
|
126
|
+
128 => 'Overlay (Add)',
|
127
|
+
129 => 'Lighten',
|
128
|
+
130 => 'Darken',
|
129
|
+
131 => 'Motion Blend',
|
108
130
|
},
|
109
131
|
);
|
110
132
|
my %dialsZ9 = (
|
@@ -118,6 +140,18 @@ my %dialsZ9 = (
|
|
118
140
|
7 => 'Rating',
|
119
141
|
8 => 'Page',
|
120
142
|
9 => 'Skip To First Shot In Series',
|
143
|
+
10 => 'Uploaded to FTP',
|
144
|
+
11 => 'Uploaded to Computer',
|
145
|
+
);
|
146
|
+
my %dialsVideoZ9 = (
|
147
|
+
0 => '2 s',
|
148
|
+
1 => '5 s',
|
149
|
+
2 => '10 s',
|
150
|
+
3 => '1 Frame',
|
151
|
+
4 => '5 Frames',
|
152
|
+
5 => '10 Frames',
|
153
|
+
6 => 'First/Last Frame',
|
154
|
+
7 => 'Playback Speed',
|
121
155
|
);
|
122
156
|
my %evfGridsZ9 = (
|
123
157
|
0 => '3x3',
|
@@ -9974,6 +10008,9 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
9974
10008
|
421 => { Name => 'Func1ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-a
|
9975
10009
|
423 => { Name => 'Func2ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-b
|
9976
10010
|
437 => { Name => 'MovieRecordButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-m
|
10011
|
+
453 => { Name => 'WBButtonPlaybackMode', %buttonsZ9}, #CSf2
|
10012
|
+
461 => { Name => 'CommandDialVideoPlaybackMode', PrintConv => \%dialsVideoZ9, Unknown => 1}, # CSf3-b
|
10013
|
+
465 => { Name => 'SubCommandDialVideoPlaybackMode', PrintConv => \%dialsVideoZ9, Unknown => 1}, # CSf3-b
|
9977
10014
|
467 => { Name => 'FocusPointLock', PrintConv => \%offOn, Unknown => 1}, # CSf4-c
|
9978
10015
|
459 => { Name => 'CommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-k
|
9979
10016
|
463 => { Name => 'SubCommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-l
|
@@ -10055,6 +10092,11 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
10055
10092
|
},
|
10056
10093
|
681 => { Name => 'ViewModeShowEffectsOfSettings', PrintConv => { 0=>'Always', 1=> 'Only When Flash Not Used'}, Unknown => 1 }, #CS8-a
|
10057
10094
|
683 => { Name => 'DispButton', %buttonsZ9}, #CSf2
|
10095
|
+
753 => { #CSd5
|
10096
|
+
Name => 'ExposureDelay',
|
10097
|
+
Format => 'int16u',
|
10098
|
+
PrintConv => '$val ? sprintf("%.1f sec",$val/1000) : "Off"',
|
10099
|
+
},
|
10058
10100
|
);
|
10059
10101
|
|
10060
10102
|
# Z9 custom settings (ref 1) #base at offset26 + 1035 (firmware 1.0.0)
|
@@ -10806,7 +10848,19 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
|
|
10806
10848
|
471 => { Name => 'QualityButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-h
|
10807
10849
|
477 => { Name => 'WhiteBalanceButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-i
|
10808
10850
|
483 => { Name => 'CommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-k
|
10851
|
+
485 => { # CSf3-m2
|
10852
|
+
Name => 'CommandDialVideoPlaybackMode',
|
10853
|
+
Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
|
10854
|
+
PrintConv => \%dialsVideoZ9,
|
10855
|
+
Unknown => 1
|
10856
|
+
},
|
10809
10857
|
487 => { Name => 'SubCommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-l
|
10858
|
+
489 => { # CSf3-n2
|
10859
|
+
Name => 'SubCommandDialVideoPlaybackMode',
|
10860
|
+
Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
|
10861
|
+
PrintConv => \%dialsVideoZ9,
|
10862
|
+
Unknown => 1
|
10863
|
+
},
|
10810
10864
|
491 => { Name => 'FocusPointLock', PrintConv => \%offOn, Unknown => 1}, # CSf4-c
|
10811
10865
|
493 => { Name => 'ControlRingResponse', PrintConv => { 0 => 'High', 1 => 'Low' } }, # CSf10
|
10812
10866
|
505 => { Name => 'VerticalMovieFuncButton', %buttonsZ9, Unknown => 1}, # CSg2-d
|
@@ -197,6 +197,7 @@ my %olympusLensTypes = (
|
|
197
197
|
# '65535 07 40' - Seen for LUMIX S 16-35/F4 on Panasonic DC-S1H (ref PH)
|
198
198
|
# Other makes
|
199
199
|
'24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka
|
200
|
+
'f7 03 10' => 'LAOWA C&D-Dreamer MFT 7.5mm F2.0', #forum3833
|
200
201
|
);
|
201
202
|
|
202
203
|
# lookup for Olympus camera types (ref PH)
|
@@ -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.95';
|
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($$$);
|
@@ -6728,7 +6731,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6728
6731
|
%Image::ExifTool::QuickTime::iTunesInfo = (
|
6729
6732
|
PROCESS_PROC => \&ProcessMOV,
|
6730
6733
|
GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
|
6731
|
-
VARS => { LONG_TAGS =>
|
6734
|
+
VARS => { LONG_TAGS => 1 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
|
6732
6735
|
NOTES => q{
|
6733
6736
|
ExifTool will extract any iTunesInfo tags that exist, even if they are not
|
6734
6737
|
defined in this table. These tags belong to the family 1 "iTunes" group,
|
@@ -6804,6 +6807,17 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
6804
6807
|
BARCODE => 'Barcode',
|
6805
6808
|
LABEL => 'Label',
|
6806
6809
|
MOOD => 'Mood',
|
6810
|
+
DIRECTOR => 'Director',
|
6811
|
+
DIRECTOR_OF_PHOTOGRAPHY => 'DirectorOfPhotography',
|
6812
|
+
PRODUCTION_DESIGNER => 'ProductionDesigner',
|
6813
|
+
COSTUME_DESIGNER => 'CostumeDesigner',
|
6814
|
+
SCREENPLAY_BY => 'ScreenplayBy',
|
6815
|
+
EDITED_BY => 'EditedBy',
|
6816
|
+
PRODUCER => 'Producer',
|
6817
|
+
IMDB_ID => { },
|
6818
|
+
TMDB_ID => { },
|
6819
|
+
Actors => { },
|
6820
|
+
TIPL => { },
|
6807
6821
|
popularimeter => 'Popularimeter',
|
6808
6822
|
'Dynamic Range (DR)'=> 'DynamicRange',
|
6809
6823
|
initialkey => 'InitialKey',
|
@@ -7859,20 +7873,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
|
|
7859
7873
|
#
|
7860
7874
|
ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
|
7861
7875
|
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
|
7876
|
+
mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
|
7877
|
+
mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
|
7878
|
+
mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
|
7876
7879
|
);
|
7877
7880
|
|
7878
7881
|
# MP4 data information box (ref 5)
|
@@ -9467,7 +9470,7 @@ sub ProcessMOV($$;$)
|
|
9467
9470
|
my $dirID = $$dirInfo{DirID} || '';
|
9468
9471
|
my $charsetQuickTime = $et->Options('CharsetQuickTime');
|
9469
9472
|
my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
|
9470
|
-
my ($dirEnd, $unkOpt, %saveOptions, $atomCount);
|
9473
|
+
my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr);
|
9471
9474
|
|
9472
9475
|
my $topLevel = not $$et{InQuickTime};
|
9473
9476
|
$$et{InQuickTime} = 1;
|
@@ -9547,6 +9550,7 @@ sub ProcessMOV($$;$)
|
|
9547
9550
|
$index = $$tagTablePtr{VARS}{START_INDEX};
|
9548
9551
|
$atomCount = $$tagTablePtr{VARS}{ATOM_COUNT};
|
9549
9552
|
}
|
9553
|
+
my $lastTag = '';
|
9550
9554
|
for (;;) {
|
9551
9555
|
my ($eeTag, $ignore);
|
9552
9556
|
last if defined $atomCount and --$atomCount < 0;
|
@@ -9573,22 +9577,22 @@ sub ProcessMOV($$;$)
|
|
9573
9577
|
}
|
9574
9578
|
last;
|
9575
9579
|
}
|
9576
|
-
$size == 1 or $
|
9580
|
+
$size == 1 or $warnStr = 'Invalid atom size', last;
|
9577
9581
|
# read extended atom size
|
9578
|
-
$raf->Read($buff, 8) == 8 or $
|
9582
|
+
$raf->Read($buff, 8) == 8 or $warnStr = 'Truncated atom header', last;
|
9579
9583
|
$dataPos += 8;
|
9580
9584
|
my ($hi, $lo) = unpack('NN', $buff);
|
9581
9585
|
if ($hi or $lo > 0x7fffffff) {
|
9582
9586
|
if ($hi > 0x7fffffff) {
|
9583
|
-
$
|
9587
|
+
$warnStr = 'Invalid atom size';
|
9584
9588
|
last;
|
9585
9589
|
} elsif (not $et->Options('LargeFileSupport')) {
|
9586
|
-
$
|
9590
|
+
$warnStr = 'End of processing at large atom (LargeFileSupport not enabled)';
|
9587
9591
|
last;
|
9588
9592
|
}
|
9589
9593
|
}
|
9590
9594
|
$size = $hi * 4294967296 + $lo - 16;
|
9591
|
-
$size < 0 and $
|
9595
|
+
$size < 0 and $warnStr = 'Invalid extended size', last;
|
9592
9596
|
} else {
|
9593
9597
|
$size -= 8;
|
9594
9598
|
}
|
@@ -9744,7 +9748,7 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
9744
9748
|
my $missing = $size - $raf->Read($val, $size);
|
9745
9749
|
if ($missing) {
|
9746
9750
|
my $t = PrintableTagID($tag,2);
|
9747
|
-
$
|
9751
|
+
$warnStr = "Truncated '${t}' data (missing $missing bytes)";
|
9748
9752
|
last;
|
9749
9753
|
}
|
9750
9754
|
# use value to get tag info if necessary
|
@@ -10059,16 +10063,28 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
|
|
10059
10063
|
) if $verbose;
|
10060
10064
|
if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) {
|
10061
10065
|
my $t = PrintableTagID($tag,2);
|
10062
|
-
$
|
10066
|
+
$warnStr = "Truncated '${t}' data";
|
10063
10067
|
last;
|
10064
10068
|
}
|
10065
10069
|
}
|
10066
10070
|
$dataPos += $size + 8; # point to start of next atom data
|
10067
10071
|
last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
|
10068
10072
|
$raf->Read($buff, 8) == 8 or last;
|
10073
|
+
$lastTag = $tag if $$tagTablePtr{$tag};
|
10069
10074
|
($size, $tag) = unpack('Na4', $buff);
|
10070
10075
|
++$index if defined $index;
|
10071
10076
|
}
|
10077
|
+
if ($warnStr) {
|
10078
|
+
# assume this is an unknown trailer if it comes immediately after
|
10079
|
+
# mdat or moov and has a tag name we don't recognize
|
10080
|
+
if (($lastTag eq 'mdat' or $lastTag eq 'moov') and (not $$tagTablePtr{$tag} or
|
10081
|
+
ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
|
10082
|
+
{
|
10083
|
+
$et->Warn('Unknown trailer with '.lcfirst($warnStr));
|
10084
|
+
} else {
|
10085
|
+
$et->Warn($warnStr);
|
10086
|
+
}
|
10087
|
+
}
|
10072
10088
|
# tweak file type based on track content ("iso*" and "dash" ftyp only)
|
10073
10089
|
if ($topLevel and $$et{FileType} and $$et{FileType} eq 'MP4' and
|
10074
10090
|
$$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,11 @@ 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
|
+
},
|
329
341
|
Unknown00 => { Unknown => 1 },
|
330
342
|
Unknown01 => { Unknown => 1 },
|
331
343
|
Unknown02 => { Unknown => 1 },
|
@@ -741,13 +753,6 @@ my %insvLimit = (
|
|
741
753
|
10 => { Name => 'FusionYPR', Format => 'float[3]' },
|
742
754
|
);
|
743
755
|
|
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
756
|
#------------------------------------------------------------------------------
|
752
757
|
# Save information from keys in OtherSampleDesc directory for processing timed metadata
|
753
758
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
@@ -2219,26 +2224,6 @@ sub Process_tx3g($$$)
|
|
2219
2224
|
return 1;
|
2220
2225
|
}
|
2221
2226
|
|
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
2227
|
#------------------------------------------------------------------------------
|
2243
2228
|
# Process QuickTime 'mebx' timed metadata
|
2244
2229
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
@@ -3229,6 +3214,52 @@ sub ProcessFMAS($$$)
|
|
3229
3214
|
return 1;
|
3230
3215
|
}
|
3231
3216
|
|
3217
|
+
#------------------------------------------------------------------------------
|
3218
|
+
# Process GPS from Wolfbox G900 Dashcam
|
3219
|
+
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
3220
|
+
# Returns: 1 on success
|
3221
|
+
sub ProcessWolfbox($$$)
|
3222
|
+
{
|
3223
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
3224
|
+
my $dataPt = $$dirInfo{DataPt};
|
3225
|
+
return 0 if length($$dataPt) < 0xc8;
|
3226
|
+
$et->VerboseDir('Wolfbox', undef, length($$dataPt));
|
3227
|
+
# 0000: 65 00 00 00 00 00 00 00 31 01 01 00 e3 ff 00 00 [e.......1.......]
|
3228
|
+
# 0010: 04 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
|
3229
|
+
# 0020: 01 00 00 00 00 00 00 00 8b 33 ff 51 00 00 00 00 [.........3.Q....]
|
3230
|
+
# 0030: a0 86 01 00 00 00 00 00 4d 5e 07 fa ff ff ff ff [........M^......]
|
3231
|
+
# 0040: a0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
3232
|
+
# 0050: 64 00 00 00 00 00 00 00 90 21 00 00 00 00 00 00 [d........!......]
|
3233
|
+
# 0060: 64 00 00 00 00 00 00 00 18 00 00 00 03 00 00 00 [d...............]
|
3234
|
+
# 0070: e8 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
|
3235
|
+
# 0080: 00 00 00 00 00 00 00 00 30 30 30 30 30 30 30 30 [........00000000]
|
3236
|
+
# 0090: 30 30 30 30 30 30 30 30 48 59 54 48 00 00 00 00 [00000000HYTH....]
|
3237
|
+
# 00a0: 0c 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
|
3238
|
+
# 00b0: 4f 3f 0c 1f 00 00 00 00 a0 86 01 00 00 00 00 00 [O?..............]
|
3239
|
+
# 00c0: 7f cf 2d ff ff ff ff ff a0 86 01 00 00 00 00 00 [..-.............]
|
3240
|
+
# 00d0: 01 00 00 00 08 00 00 00 0a 00 00 00 00 00 00 00 [................]
|
3241
|
+
# 00e0: 0a 00 00 00 00 00 00 00 e8 03 00 00 00 00 00 00 [................]
|
3242
|
+
# 00f0: 0a 00 00 00 00 00 00 00 4d 00 00 00 00 00 00 00 [........M.......]
|
3243
|
+
# lat/lon at 0xb0/0xc0 and 0x128/0x138
|
3244
|
+
# h/m/s at 0x10 and 0xa0 and 0x148 (the first imprinted on the video, the latter 2 presumed UTC)
|
3245
|
+
# spd at 0x48, dir at 0x58, alt at 0xe8
|
3246
|
+
SetByteOrder('II');
|
3247
|
+
my ($spd,$dir,$d,$mo,$yr,$h,$m,$s) = unpack('x72Vx12Vx12V3x44V3',$$dataPt);
|
3248
|
+
# offset 0xa0 also stores hh mm ss, but is out by 8 hours!
|
3249
|
+
my $time = sprintf '%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $yr, $mo, $d, $h, $m, $s;
|
3250
|
+
my ($lat, $lon) = (Get32s($dataPt, 0xb0) / 1e5, Get32s($dataPt, 0xc0) / 1e5);
|
3251
|
+
my $alt = Get32s($dataPt, 0xe8);
|
3252
|
+
ConvertLatLon($lat, $lon);
|
3253
|
+
$et->HandleTag($tagTbl, GPSDateTime => $time);
|
3254
|
+
$et->HandleTag($tagTbl, GPSLatitude => $lat);
|
3255
|
+
$et->HandleTag($tagTbl, GPSLongitude => $lon);
|
3256
|
+
$et->HandleTag($tagTbl, GPSSpeed => $spd * $knotsToKph / 100);
|
3257
|
+
$et->HandleTag($tagTbl, GPSTrack => $dir / 100);
|
3258
|
+
$et->HandleTag($tagTbl, GPSAltitude => $alt / 10); # (NC)
|
3259
|
+
SetByteOrder('MM');
|
3260
|
+
return 1;
|
3261
|
+
}
|
3262
|
+
|
3232
3263
|
#------------------------------------------------------------------------------
|
3233
3264
|
# Scan media data for "freeGPS" metadata if not found already (ref PH)
|
3234
3265
|
# 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
|
|
@@ -10553,7 +10553,7 @@ my %isoSetting2010 = (
|
|
10553
10553
|
ValueConv => '2 ** (8-$val/8192)',
|
10554
10554
|
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
10555
10555
|
},
|
10556
|
-
0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk },
|
10556
|
+
0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk }, # (perhaps related to focus distance? forum15856)
|
10557
10557
|
0x8004 => { Name => 'Sony_rtmd_0x8004', Format => 'int16u', %hidUnk }, # (FocalLength35efl?, forum14315)
|
10558
10558
|
0x8005 => { Name => 'Sony_rtmd_0x8005', Format => 'int16u', %hidUnk }, # (FocalLength?, forum14315)
|
10559
10559
|
0x800a => { Name => 'Sony_rtmd_0x800a', Format => 'int16u', %hidUnk }, # (FocusRingPosition?, forum14315)
|