exiftool_vendored 13.22.0 → 13.24.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.
- checksums.yaml +4 -4
- data/bin/Changes +23 -0
- data/bin/MANIFEST +5 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +46 -46
- data/bin/exiftool +53 -53
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +2 -2
- data/bin/lib/Image/ExifTool/GPS.pm +3 -3
- data/bin/lib/Image/ExifTool/JPEG.pm +4 -0
- data/bin/lib/Image/ExifTool/Nikon.pm +142 -746
- data/bin/lib/Image/ExifTool/PCAP.pm +462 -0
- data/bin/lib/Image/ExifTool/Plot.pm +3 -2
- data/bin/lib/Image/ExifTool/Protobuf.pm +3 -1
- data/bin/lib/Image/ExifTool/Qualcomm.pm +78 -1
- data/bin/lib/Image/ExifTool/Sony.pm +18 -5
- data/bin/lib/Image/ExifTool/TagLookup.pm +151 -148
- data/bin/lib/Image/ExifTool/TagNames.pod +107 -218
- data/bin/lib/Image/ExifTool/Validate.pm +4 -4
- data/bin/lib/Image/ExifTool/WriteExif.pl +4 -4
- data/bin/lib/Image/ExifTool/XMP.pm +17 -3
- data/bin/lib/Image/ExifTool.pm +24 -9
- data/bin/lib/Image/ExifTool.pod +45 -45
- data/bin/perl-Image-ExifTool.spec +45 -45
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -0,0 +1,462 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# File: PCAP.pm
|
3
|
+
#
|
4
|
+
# Description: Read CAP, PCAP and PCAPNG Packet Capture files
|
5
|
+
#
|
6
|
+
# Revisions: 2025-03-03 - P. Harvey Created
|
7
|
+
#
|
8
|
+
# References: 1) https://www.ietf.org/archive/id/draft-gharris-opsawg-pcap-01.html
|
9
|
+
# 2) https://www.ietf.org/archive/id/draft-ietf-opsawg-pcapng-02.html
|
10
|
+
# 3) https://formats.kaitai.io/microsoft_network_monitor_v2/
|
11
|
+
#------------------------------------------------------------------------------
|
12
|
+
|
13
|
+
package Image::ExifTool::PCAP;
|
14
|
+
|
15
|
+
use strict;
|
16
|
+
use vars qw($VERSION);
|
17
|
+
use Image::ExifTool qw(:DataAccess :Utils);
|
18
|
+
|
19
|
+
$VERSION = '1.00';
|
20
|
+
|
21
|
+
%Image::ExifTool::PCAP::Main = (
|
22
|
+
GROUPS => { 0 => 'File', 1 => 'File', 2 => 'Other' },
|
23
|
+
VARS => { NO_LOOKUP => 1 }, # omit tags from lookup
|
24
|
+
NOTES => 'Tags extracted from CAP, PCAP and PCAPNG Packet Capture files.',
|
25
|
+
# (Note: All string values are UTF-8 but I'm going to be lazy and not bother decoding them)
|
26
|
+
ByteOrder => {
|
27
|
+
PrintConv => {
|
28
|
+
II => 'Little-endian (Intel, II)',
|
29
|
+
MM => 'Big-endian (Motorola, MM)',
|
30
|
+
},
|
31
|
+
},
|
32
|
+
PCAPVersion => { },
|
33
|
+
LinkType => {
|
34
|
+
PrintConvColumns => 2,
|
35
|
+
PrintConv => {
|
36
|
+
# (see https://datatracker.ietf.org/doc/html/draft-richardson-opsawg-pcaplinktype-01 for a full list)
|
37
|
+
0 => 'BSD Loopback',
|
38
|
+
1 => 'IEEE 802.3 Ethernet',
|
39
|
+
2 => 'Experimental 4Mb Ethernet',
|
40
|
+
3 => 'AX.25',
|
41
|
+
4 => 'PRONET',
|
42
|
+
5 => 'MIT CHAOSNET',
|
43
|
+
6 => 'IEEE 802.5',
|
44
|
+
7 => 'ARCNET BSD',
|
45
|
+
8 => 'SLIP',
|
46
|
+
9 => 'PPP',
|
47
|
+
10 => 'fddI',
|
48
|
+
# 11-49 not to be used
|
49
|
+
50 => 'PPP HDLC',
|
50
|
+
51 => 'PPP Ethernet',
|
51
|
+
# 52-98 not to be used
|
52
|
+
99 => 'Symantec Firewall',
|
53
|
+
100 => 'ATM RFC 1483',
|
54
|
+
101 => 'Raw',
|
55
|
+
102 => 'SLIP BSD/OS',
|
56
|
+
103 => 'PPP BSD/OS',
|
57
|
+
104 => 'Cisco PPP with HDLC',
|
58
|
+
105 => 'IEEE 802.11',
|
59
|
+
106 => 'ATM Classical IP',
|
60
|
+
107 => 'Frame Relay',
|
61
|
+
108 => 'OpenBSD Loopback',
|
62
|
+
109 => 'OpenBSD IPSEC',
|
63
|
+
110 => 'ATM LANE 802.3',
|
64
|
+
111 => 'NetBSD HIPPI',
|
65
|
+
112 => 'NetBSD HDLC',
|
66
|
+
113 => 'Linux SLL',
|
67
|
+
114 => 'Apple LocalTalk',
|
68
|
+
115 => 'Acorn Econet',
|
69
|
+
116 => 'OpenBSD ipfilter',
|
70
|
+
117 => 'OpenBSD pflog',
|
71
|
+
118 => 'Cisco IOS',
|
72
|
+
119 => 'IEEE 802.11 Prism',
|
73
|
+
120 => 'IEEE 802.11 Aironet',
|
74
|
+
121 => 'Siemens HiPath HDLC',
|
75
|
+
122 => 'IP-over-Fibre',
|
76
|
+
123 => 'SunATM',
|
77
|
+
124 => 'RapidIO',
|
78
|
+
125 => 'PCI Express',
|
79
|
+
126 => 'Xilinx Aurora',
|
80
|
+
127 => 'IEEE 802.11 Radiotap',
|
81
|
+
128 => 'Tazmen Sniffer',
|
82
|
+
129 => 'ARCNET Linux',
|
83
|
+
130 => 'Juniper MLPPP',
|
84
|
+
131 => 'Juniper MLFR',
|
85
|
+
132 => 'Juniper ES',
|
86
|
+
133 => 'Juniper GGSN',
|
87
|
+
134 => 'Juniper MFR',
|
88
|
+
135 => 'Juniper ATM2',
|
89
|
+
136 => 'Juniper Services',
|
90
|
+
137 => 'Juniper ATM1',
|
91
|
+
138 => 'Apple IP-over-IEEE 1394',
|
92
|
+
139 => 'MTP2 with PHDR',
|
93
|
+
140 => 'MTP2',
|
94
|
+
141 => 'MTP3',
|
95
|
+
142 => 'SCCP',
|
96
|
+
143 => 'DOCSIS',
|
97
|
+
144 => 'Linux IrDA',
|
98
|
+
145 => 'IBM SP',
|
99
|
+
146 => 'IBM SN',
|
100
|
+
# 147-162 - reserved
|
101
|
+
163 => 'IEEE 802.11 AVS',
|
102
|
+
164 => 'Juniper Monitor',
|
103
|
+
165 => 'BACnet MS/TP',
|
104
|
+
166 => 'PPP PPPD',
|
105
|
+
167 => 'Juniper PPPOE',
|
106
|
+
168 => 'Juniper PPPOE ATM',
|
107
|
+
169 => 'GPRS LLC',
|
108
|
+
170 => 'GPF-T',
|
109
|
+
171 => 'GPF-F',
|
110
|
+
172 => 'Gcom T1/E1',
|
111
|
+
173 => 'Gcom Serial',
|
112
|
+
174 => 'Juniper PIC Peer',
|
113
|
+
175 => 'ERF ETH',
|
114
|
+
176 => 'ERF POS',
|
115
|
+
177 => 'Linux LAPD',
|
116
|
+
178 => 'Juniper Ether',
|
117
|
+
179 => 'Juniper PPP',
|
118
|
+
180 => 'Juniper Frame Relay',
|
119
|
+
181 => 'Juniper CHDLC',
|
120
|
+
182 => 'MFR',
|
121
|
+
182 => 'Juniper VP',
|
122
|
+
185 => 'A653 ICM',
|
123
|
+
186 => 'USB FreeBSD',
|
124
|
+
187 => 'Bluetooth HCI H4',
|
125
|
+
188 => 'IEEE 802.16 MAC CPS',
|
126
|
+
189 => 'USB Linux',
|
127
|
+
190 => 'CAN 2.0B',
|
128
|
+
191 => 'IEEE 802.15.4 Linux',
|
129
|
+
192 => 'PPI',
|
130
|
+
193 => 'IEEE 802.16 MAC CPS Radio',
|
131
|
+
194 => 'Juniper ISM',
|
132
|
+
195 => 'IEEE 802.15.4 with FCS',
|
133
|
+
196 => 'SITA',
|
134
|
+
197 => 'ERF',
|
135
|
+
198 => 'RAIF1',
|
136
|
+
199 => 'IPMB Kontron',
|
137
|
+
200 => 'Juniper ST',
|
138
|
+
201 => 'Bluetooth HCI H4 with PHDR',
|
139
|
+
202 => 'AX.25 KISS',
|
140
|
+
203 => 'LAPD',
|
141
|
+
204 => 'PPP with DIR',
|
142
|
+
205 => 'Cisco HDLC with DIR',
|
143
|
+
206 => 'Frame Relay with DIR',
|
144
|
+
207 => 'LAPB with DIR',
|
145
|
+
# 208 reserved
|
146
|
+
209 => 'IPMB Linux',
|
147
|
+
210 => 'FlexRay',
|
148
|
+
211 => 'MOST',
|
149
|
+
212 => 'LIN',
|
150
|
+
213 => 'X2E Serial',
|
151
|
+
214 => 'X2E Xoraya',
|
152
|
+
215 => 'IEEE 802.15.4 Nonask PHY',
|
153
|
+
216 => 'Linux evdev',
|
154
|
+
217 => 'GSMtap Um',
|
155
|
+
218 => 'GSMtap Abis',
|
156
|
+
219 => 'MPLS',
|
157
|
+
220 => 'USB Linux MMapped',
|
158
|
+
221 => 'DECT',
|
159
|
+
222 => 'AOS',
|
160
|
+
223 => 'Wireless HART',
|
161
|
+
224 => 'FC-2',
|
162
|
+
225 => 'FC-2 with Frame Delims',
|
163
|
+
226 => 'IPNET',
|
164
|
+
227 => 'CAN Socketcan',
|
165
|
+
228 => 'IPv4',
|
166
|
+
229 => 'IPv6',
|
167
|
+
230 => 'IEEE 802.15.4 No FCS',
|
168
|
+
231 => 'D-Bus',
|
169
|
+
232 => 'Juniper VS',
|
170
|
+
233 => 'Juniper SRX E2E',
|
171
|
+
234 => 'Juniper Fibre Channel',
|
172
|
+
235 => 'DVB-CI',
|
173
|
+
236 => 'Mux 27.010',
|
174
|
+
237 => 'STANAG 5066 D_PDU',
|
175
|
+
238 => 'Juniper ATM Cemic',
|
176
|
+
239 => 'NFLOG',
|
177
|
+
240 => 'Netanalyzer',
|
178
|
+
241 => 'Netanalyzer Transparent',
|
179
|
+
242 => 'IP-over-InfiniBand',
|
180
|
+
243 => 'MPEG-2 TS',
|
181
|
+
244 => 'NG40',
|
182
|
+
245 => 'NFC LLCP',
|
183
|
+
246 => 'Pfsync',
|
184
|
+
247 => 'InfiniBand',
|
185
|
+
248 => 'SCTP',
|
186
|
+
249 => 'USBPcap',
|
187
|
+
250 => 'RTAC Serial',
|
188
|
+
251 => 'Bluetooth LE LL',
|
189
|
+
252 => 'Wireshark Upper PDU',
|
190
|
+
253 => 'Netlink',
|
191
|
+
254 => 'Bluetooth Linux Monitor',
|
192
|
+
255 => 'Bluetooth BREDR BB',
|
193
|
+
256 => 'Bluetooth LE LL with PHDR',
|
194
|
+
257 => 'PROFIBUS Data Link',
|
195
|
+
258 => 'Apple PKTAP',
|
196
|
+
259 => 'EPON',
|
197
|
+
260 => 'IPMI HPM.2',
|
198
|
+
261 => 'Z-Wave R1/R2',
|
199
|
+
262 => 'Z-Wave R3',
|
200
|
+
263 => 'WattStopper DLM',
|
201
|
+
264 => 'ISO 14443',
|
202
|
+
265 => 'RDS',
|
203
|
+
266 => 'USB Darwin',
|
204
|
+
267 => 'Openflow',
|
205
|
+
268 => 'SDLC',
|
206
|
+
269 => 'TI LLN Sniffer',
|
207
|
+
270 => 'LoRaTap',
|
208
|
+
271 => 'Vsock',
|
209
|
+
272 => 'Nordic BLE',
|
210
|
+
273 => 'DOCSIS 31 XRA31',
|
211
|
+
274 => 'Ethernet MPacket',
|
212
|
+
275 => 'DisplayPort AUX',
|
213
|
+
276 => 'Linux SLL2',
|
214
|
+
277 => 'Sercos Monitor',
|
215
|
+
278 => 'Openvizsla',
|
216
|
+
279 => 'Elektrobit EBHSR',
|
217
|
+
280 => 'VPP Dispatch',
|
218
|
+
281 => 'DSA Tag BRCM',
|
219
|
+
282 => 'DSA Tag BRCM Prepend',
|
220
|
+
283 => 'IEEE 802.15.4 Tap',
|
221
|
+
284 => 'DSA Tag DSA',
|
222
|
+
285 => 'DSA Tag EDSA',
|
223
|
+
286 => 'ELEE',
|
224
|
+
287 => 'Z-Wave Serial',
|
225
|
+
288 => 'USB 2.0',
|
226
|
+
289 => 'ATSC ALP',
|
227
|
+
},
|
228
|
+
},
|
229
|
+
TimeStamp => {
|
230
|
+
Groups => { 2 => 'Time' },
|
231
|
+
ValueConv => q{
|
232
|
+
return $val if $$self{WindowsTS};
|
233
|
+
return ConvertUnixTime($val, 1, $$self{TSResol} < 1e-7 ? 9 : 6);
|
234
|
+
},
|
235
|
+
PrintConv => '$self->ConvertDateTime($val)',
|
236
|
+
},
|
237
|
+
#
|
238
|
+
# "options" tags common to all blocks
|
239
|
+
#
|
240
|
+
1 => 'Comment',
|
241
|
+
2988 => {
|
242
|
+
Name => 'CustomOption1',
|
243
|
+
ValueConv => q{
|
244
|
+
return undef unless length($val) > 4;
|
245
|
+
my $len = Get16u(\$val, 2);
|
246
|
+
return undef unless $len > 4 and $len <= length($val) - 4;
|
247
|
+
my $str = 'Type='.Get16u(\$val,0).' PEN='.Get32u(\$val,4). ' Val='.substr($val, 8, $len-4);
|
248
|
+
},
|
249
|
+
},
|
250
|
+
2989 => {
|
251
|
+
Name => 'CustomOption2',
|
252
|
+
Binary => 1,
|
253
|
+
},
|
254
|
+
19372 => {
|
255
|
+
Name => 'CustomOption3',
|
256
|
+
ValueConv => q{
|
257
|
+
return undef unless length($val) > 4;
|
258
|
+
my $len = Get16u(\$val, 2);
|
259
|
+
return undef unless $len > 4 and $len <= length($val) - 4;
|
260
|
+
my $str = 'Type='.Get16u(\$val,0).' PEN='.Get32u(\$val,4). ' Val='.substr($val, 8, $len-4);
|
261
|
+
},
|
262
|
+
},
|
263
|
+
19373 => {
|
264
|
+
Name => 'CustomOption3',
|
265
|
+
Binary => 1,
|
266
|
+
},
|
267
|
+
#
|
268
|
+
# "options" tags in Section Header Block
|
269
|
+
#
|
270
|
+
'SHB-2' => 'Hardware',
|
271
|
+
'SHB-3' => 'OperatingSytem',
|
272
|
+
'SHB-4' => 'UserApplication',
|
273
|
+
#
|
274
|
+
# "options" tags in Interface Description Block
|
275
|
+
#
|
276
|
+
'IDB-2' => 'DeviceName',
|
277
|
+
'IDB-3' => 'Description',
|
278
|
+
'IDB-4' => {
|
279
|
+
Name => 'IPv4Addr',
|
280
|
+
Description => 'IPv4 Addr',
|
281
|
+
# IP address and net mask
|
282
|
+
ValueConv => '$_=join(".", unpack("C*", $val))); s/(:.*?:.*?:.*?):/$1 /; $_',
|
283
|
+
},
|
284
|
+
'IDB-5' => {
|
285
|
+
Name => 'IPv6Addr',
|
286
|
+
Description => 'IPv6 Addr',
|
287
|
+
ValueConv => 'join(":", unpack("(H4)8", $val)) . "/" . unpack("x16C",$val)',
|
288
|
+
},
|
289
|
+
'IDB-6' => {
|
290
|
+
Name => 'MACAddr',
|
291
|
+
ValueConv => 'join("-", unpack("(H2)6", $val))',
|
292
|
+
},
|
293
|
+
'IDB-7' => {
|
294
|
+
Name => 'EUIAddr',
|
295
|
+
ValueConv => 'join(":", unpack("(H4)4", $val))',
|
296
|
+
},
|
297
|
+
'IDB-8' => {
|
298
|
+
Name => 'Speed',
|
299
|
+
Format => 'int64u',
|
300
|
+
},
|
301
|
+
'IDB-9' => {
|
302
|
+
Name => 'TimeStampResolution',
|
303
|
+
Format => 'int8u',
|
304
|
+
RawConv => '$$self{TSResol} = ($val & 0x80 ? 2 ** -($val & 0x7f) : 10 ** -$val)',
|
305
|
+
},
|
306
|
+
'IDB-10' => 'TimeZone',
|
307
|
+
'IDB-11' => {
|
308
|
+
Name => 'Filter',
|
309
|
+
ValueConv => 'Get8u(\$val,0) . ": " . substr($val, 1)',
|
310
|
+
},
|
311
|
+
'IDB-12' => 'OperatingSytem',
|
312
|
+
'IDB-13' => { Name => 'FCSLen', Format => 'int8u' },
|
313
|
+
'IDB-14' => {
|
314
|
+
Name => 'TimeStampOffset',
|
315
|
+
Format => 'int64u',
|
316
|
+
RawConv => '$$self{TSOff} = $val',
|
317
|
+
},
|
318
|
+
'IDB-15' => 'Hardware',
|
319
|
+
'IDB-16' => { Name => 'TXSpeed', Format => 'int64u' },
|
320
|
+
'IDB-17' => { Name => 'RXSpeed', Format => 'int64u' },
|
321
|
+
'IDB-18' => 'TimezoneName',
|
322
|
+
);
|
323
|
+
|
324
|
+
#------------------------------------------------------------------------------
|
325
|
+
# Extract metadata from a PCAP file
|
326
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref
|
327
|
+
# Returns: 1 on success, 0 if this wasn't a valid PCAP file
|
328
|
+
sub ProcessPCAP($$)
|
329
|
+
{
|
330
|
+
my ($et, $dirInfo) = @_;
|
331
|
+
my $raf = $$dirInfo{RAF};
|
332
|
+
my ($buff, $tagTablePtr, $type, $ts, $byteOrder, $verPos);
|
333
|
+
|
334
|
+
# verify this is a valid PCAP file
|
335
|
+
return 0 unless $raf->Read($buff, 24) == 24;
|
336
|
+
|
337
|
+
if ($buff =~ /^\xa1\xb2(\xc3\xd4|\x3c\x4d)\0.\0.|(\xd4\xc3|\x4d\x3c)\xb2\xa1.\0.\0/s) {
|
338
|
+
$type = 'PCAP';
|
339
|
+
my $tmp = $1 || $2;
|
340
|
+
$$et{TSResol} = ($tmp eq "\xc3\xd4" or $tmp eq "\xd4\xc3") ? 1e-6 : 1e-9;
|
341
|
+
$byteOrder = $buff =~ /^\xa1/ ? 'MM' : 'II';
|
342
|
+
$verPos = 4;
|
343
|
+
} elsif ($buff =~ /^\x0a\x0d\x0d\x0a.{4}(\x1a\x2b\x3c\x4d|\x4d\x3c\x2b\x1a)/s) {
|
344
|
+
$type = 'PCAPNG';
|
345
|
+
$byteOrder = $1 eq "\x1a\x2b\x3c\x4d" ? 'MM' : 'II';
|
346
|
+
$verPos = 12;
|
347
|
+
} elsif ($buff =~ /^GMBU\0\x02/) {
|
348
|
+
# handle Windows Network Monitor 2.0 CAP files
|
349
|
+
# http://web.archive.org/web/20240430011527/https://learn.microsoft.com/en-us/windows/win32/netmon2/capturefile-header-values
|
350
|
+
$Image::ExifTool::static_vars{OverrideFileDescription}{CAP} = 'Microsoft Network Monitor Capture';
|
351
|
+
$et->SetFileType('CAP', 'application/octet-stream', 'cap');
|
352
|
+
$type = 'CAP';
|
353
|
+
$tagTablePtr = GetTagTable('Image::ExifTool::PCAP::Main');
|
354
|
+
my @a = unpack('x6v*', $buff);
|
355
|
+
$$et{WindowsTS} = 1;
|
356
|
+
my $val = sprintf('%.4d:%.2d:%.2d %.2d:%.2d:%.2d.%.3d',@a[1,2,4..8]);
|
357
|
+
$et->HandleTag($tagTablePtr, LinkType => $a[0]);
|
358
|
+
$et->HandleTag($tagTablePtr, TimeStamp => $val);
|
359
|
+
if ($raf->Seek(40,0) and $raf->Read($buff,8)==8) {
|
360
|
+
my ($off, $len) = unpack('V2', $buff);
|
361
|
+
# extract comment
|
362
|
+
if ($len < 1024 and $raf->Seek($off,0) and $raf->Read($buff,$len) == $len) {
|
363
|
+
$et->HandleTag($tagTablePtr, 1 => $buff); # (NC) null terminated? Unicode?
|
364
|
+
}
|
365
|
+
}
|
366
|
+
return 1;
|
367
|
+
} else {
|
368
|
+
return 0;
|
369
|
+
}
|
370
|
+
$et->SetFileType($type);
|
371
|
+
SetByteOrder($byteOrder);
|
372
|
+
$tagTablePtr = GetTagTable('Image::ExifTool::PCAP::Main');
|
373
|
+
my $ver = Get16u(\$buff, $verPos) . '.' . Get16u(\$buff, $verPos+2);
|
374
|
+
$et->HandleTag($tagTablePtr, PCAPVersion => "$type $ver");
|
375
|
+
$et->HandleTag($tagTablePtr, ByteOrder => $byteOrder);
|
376
|
+
|
377
|
+
if ($type eq 'PCAP') {
|
378
|
+
$et->HandleTag($tagTablePtr, LinkType => Get16u(\$buff, 22));
|
379
|
+
$raf->Read($buff, 8) == 8 or $et->Warn('Truncated PCAP file'), return 1;
|
380
|
+
$ts = Get32u(\$buff, 0) + Get32u(\$buff, 4) * $$et{TSResol};
|
381
|
+
$et->HandleTag($tagTablePtr, TimeStamp => $ts);
|
382
|
+
return 1;
|
383
|
+
}
|
384
|
+
# read through PCAPNG options for the SHB, IDB and get the timestamp from the first EPD
|
385
|
+
my $dir = 'SHB'; # Section Header Block
|
386
|
+
for (;;) {
|
387
|
+
$raf->Read($buff, 4) == 4 or last;
|
388
|
+
my $opt = Get16u(\$buff, 0);
|
389
|
+
my $len = Get16u(\$buff, 2);
|
390
|
+
if ($opt == 0) { # (end of options?)
|
391
|
+
last unless $raf->Read($buff, 20) == 20;
|
392
|
+
my $dirNum = Get32u(\$buff, 4);
|
393
|
+
if ($dirNum == 1) {
|
394
|
+
$et->HandleTag($tagTablePtr, LinkType => Get16u(\$buff, 12));
|
395
|
+
$dir = 'IDB'; # Interface Description Block
|
396
|
+
next; # continue with IDB options
|
397
|
+
} elsif ($dirNum == 6) { # EPD (Enhanced Packet Data)
|
398
|
+
my $ts = 4294967296 * Get32u(\$buff, 16);
|
399
|
+
$raf->Read(\$buff, 4) == 4 or last;
|
400
|
+
if ($$et{TSResol}) {
|
401
|
+
$ts = ($ts + Get32u(\$buff, 0)) * $$et{TSResol} + ($$et{TSOff} || 0);
|
402
|
+
$et->HandleTag($tagTablePtr, TimeStamp => $ts);
|
403
|
+
}
|
404
|
+
}
|
405
|
+
last;
|
406
|
+
}
|
407
|
+
my $n = ($len + 3) & 0xfffc; # round to an even 4 bytes
|
408
|
+
$raf->Read($buff, $n) == $n or $et->Warn("Error reading $dir options"), last;
|
409
|
+
my $id = $$tagTablePtr{$opt} ? $opt : "$dir-$opt";
|
410
|
+
$et->HandleTag($tagTablePtr, $id, undef,
|
411
|
+
DataPt => \$buff,
|
412
|
+
DataPos => $raf->Tell() - $n,
|
413
|
+
Size => $len,
|
414
|
+
MakeTagInfo => 1,
|
415
|
+
);
|
416
|
+
}
|
417
|
+
return 1;
|
418
|
+
}
|
419
|
+
|
420
|
+
1; # end
|
421
|
+
|
422
|
+
__END__
|
423
|
+
|
424
|
+
=head1 NAME
|
425
|
+
|
426
|
+
Image::ExifTool::PCAP - Read CAP, PCAP and PCAPNG Packet Capture files
|
427
|
+
|
428
|
+
=head1 SYNOPSIS
|
429
|
+
|
430
|
+
This module is used by Image::ExifTool
|
431
|
+
|
432
|
+
=head1 DESCRIPTION
|
433
|
+
|
434
|
+
This module contains definitions required by Image::ExifTool to read
|
435
|
+
metadata from CAP, PCAP and PCAPNG Packet Capture files.
|
436
|
+
|
437
|
+
=head1 AUTHOR
|
438
|
+
|
439
|
+
Copyright 2003-2025, Phil Harvey (philharvey66 at gmail.com)
|
440
|
+
|
441
|
+
This library is free software; you can redistribute it and/or modify it
|
442
|
+
under the same terms as Perl itself.
|
443
|
+
|
444
|
+
=head1 REFERENCES
|
445
|
+
|
446
|
+
=over 4
|
447
|
+
|
448
|
+
=item L<https://www.ietf.org/archive/id/draft-gharris-opsawg-pcap-01.html>
|
449
|
+
|
450
|
+
=item L<https://www.ietf.org/archive/id/draft-ietf-opsawg-pcapng-02.html>
|
451
|
+
|
452
|
+
=item L<https://formats.kaitai.io/microsoft_network_monitor_v2/>
|
453
|
+
|
454
|
+
=back
|
455
|
+
|
456
|
+
=head1 SEE ALSO
|
457
|
+
|
458
|
+
L<Image::ExifTool::TagNames/PCAP Tags>,
|
459
|
+
L<Image::ExifTool(3pm)|Image::ExifTool>
|
460
|
+
|
461
|
+
=cut
|
462
|
+
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Plot;
|
|
11
11
|
use strict;
|
12
12
|
use vars qw($VERSION);
|
13
13
|
|
14
|
-
$VERSION = '1.
|
14
|
+
$VERSION = '1.02';
|
15
15
|
|
16
16
|
# default plot settings (lower-case settings may be overridden by the user)
|
17
17
|
my %defaults = (
|
@@ -448,7 +448,8 @@ sub Draw($$)
|
|
448
448
|
} else {
|
449
449
|
$mark .= ' fill="none"';
|
450
450
|
}
|
451
|
-
|
451
|
+
# (was using 'context-stroke', but Chrome didn't show this properly)
|
452
|
+
$mark .= " stroke='$$cols[$i]'/>";
|
452
453
|
# don't re-define mark if it is the same as a previous one
|
453
454
|
$markID{$mark} and $markID{$i} = $markID{$mark}, next;
|
454
455
|
$markID{$mark} = $markID{$i} = "mark$i";
|
@@ -217,7 +217,9 @@ sub ProcessProtobuf($$$;$)
|
|
217
217
|
} elsif (length($buff) % 4) {
|
218
218
|
$val = '0x' . unpack('H*', $buff);
|
219
219
|
} else {
|
220
|
-
$
|
220
|
+
my $n = length($buff) / 4;
|
221
|
+
# (do this instead of '(H8)*' because older Perl version didn't support this)
|
222
|
+
$val = '0x' . join(' ', unpack("(H8)$n", $buff)); # (group in 4-byte blocks)
|
221
223
|
}
|
222
224
|
$val .= $rat if $rat;
|
223
225
|
}
|
@@ -12,9 +12,10 @@ use strict;
|
|
12
12
|
use vars qw($VERSION);
|
13
13
|
use Image::ExifTool qw(:DataAccess :Utils);
|
14
14
|
|
15
|
-
$VERSION = '1.
|
15
|
+
$VERSION = '1.02';
|
16
16
|
|
17
17
|
sub ProcessQualcomm($$$);
|
18
|
+
sub ProcessDualCamera($$$);
|
18
19
|
sub MakeNameAndDesc($$);
|
19
20
|
|
20
21
|
# Qualcomm format codes (ref PH (NC))
|
@@ -1224,6 +1225,59 @@ my @qualcommFormat = (
|
|
1224
1225
|
'HJR_texture_threshold' => { },
|
1225
1226
|
);
|
1226
1227
|
|
1228
|
+
%Image::ExifTool::Qualcomm::DualCamera = (
|
1229
|
+
PROCESS_PROC => \&ProcessDualCamera,
|
1230
|
+
GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
|
1231
|
+
VARS => { NO_ID => 1, NO_LOOKUP => 1 }, # too long, too many, and too obscure
|
1232
|
+
NOTES => q{
|
1233
|
+
Found in JPEG APP4 "Qualcomm Dual Camera Attributes" written by some Nokia
|
1234
|
+
phones.
|
1235
|
+
},
|
1236
|
+
'Sensor Crop left' => 'SensorCropLeft',
|
1237
|
+
'Sensor Crop top' => 'SensorCropTop',
|
1238
|
+
'Sensor Crop width' => 'SensorCropWidth',
|
1239
|
+
'Sensor Crop height' => 'SensorCropHeight',
|
1240
|
+
'Sensor ROI Map left' => 'SensorROIMapLeft',
|
1241
|
+
'Sensor ROI Map top' => 'SensorROIMapTop',
|
1242
|
+
'Sensor ROI Map width' => 'SensorROIMapWidth',
|
1243
|
+
'Sensor ROI Map height' => 'SensorROIMapHeight',
|
1244
|
+
'CAMIF Crop left' => 'CAMIFCropLeft',
|
1245
|
+
'CAMIF Crop top' => 'CAMIFCropTop',
|
1246
|
+
'CAMIF Crop width' => 'CAMIFCropWidth',
|
1247
|
+
'CAMIF Crop height' => 'CAMIFCropHeight',
|
1248
|
+
'CAMIF ROI Map left' => 'CAMIF_ROIMapLeft',
|
1249
|
+
'CAMIF ROI Map top' => 'CAMIF_ROIMapTop',
|
1250
|
+
'CAMIF ROI Map width' => 'CAMIF_ROIMapWidth',
|
1251
|
+
'CAMIF ROI Map height' => 'CAMIF_ROIMapHeight',
|
1252
|
+
'ISP Crop left' => 'ISPCropLeft',
|
1253
|
+
'ISP Crop top' => 'ISPCropTop',
|
1254
|
+
'ISP Crop width' => 'ISPCropWidth',
|
1255
|
+
'ISP Crop height' => 'ISPCropHeight',
|
1256
|
+
'ISP ROI Map left' => 'ISP_ROIMapLeft',
|
1257
|
+
'ISP ROI Map top' => 'ISP_ROIMapTop',
|
1258
|
+
'ISP ROI Map width' => 'ISP_ROIMapWidth',
|
1259
|
+
'ISP ROI Map height' => 'ISP_ROIMapHeight',
|
1260
|
+
'CPP Crop left' => 'CPPCropLeft',
|
1261
|
+
'CPP Crop top' => 'CPPCropTop',
|
1262
|
+
'CPP Crop width' => 'CPPCropWidth',
|
1263
|
+
'CPP Crop height' => 'CPPCropHeight',
|
1264
|
+
'CPP ROI Map left' => 'CPP_ROIMapLeft',
|
1265
|
+
'CPP ROI Map top' => 'CPP_ROIMapTop',
|
1266
|
+
'CPP ROI Map width' => 'CPP_ROIMapWidth',
|
1267
|
+
'CPP ROI Map height' => 'CPP_ROIMapHeight',
|
1268
|
+
'DDM Crop left' => 'DDMCropLeft',
|
1269
|
+
'DDM Crop top' => 'DDMCropTop',
|
1270
|
+
'DDM Crop width' => 'DDMCropWidth',
|
1271
|
+
'DDM Crop height' => 'DDMCropHeight',
|
1272
|
+
'Focal length Ratio' => 'FocalLengthRatio',
|
1273
|
+
'Current pipeline mirror flip setting' => 'CurrentPipelineMirrorFlipSetting',
|
1274
|
+
'Current pipeline rotation setting' => 'CurrentPipelineRotationSetting',
|
1275
|
+
'AF ROI left' => 'AF_ROILeft',
|
1276
|
+
'AF ROI top' => 'AF_ROITop',
|
1277
|
+
'AF ROI width' => 'AF_ROIWidth',
|
1278
|
+
'AF ROI height' => 'AF_ROIHeight',
|
1279
|
+
);
|
1280
|
+
|
1227
1281
|
# generate tag names and descriptions
|
1228
1282
|
{
|
1229
1283
|
local $_;
|
@@ -1258,6 +1312,29 @@ sub MakeNameAndDesc($$)
|
|
1258
1312
|
return 1;
|
1259
1313
|
}
|
1260
1314
|
|
1315
|
+
#------------------------------------------------------------------------------
|
1316
|
+
# Process Qualcomm Dual Camera APP4 metadata (ref PH)
|
1317
|
+
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
1318
|
+
# Returns: 1 on success
|
1319
|
+
sub ProcessDualCamera($$$)
|
1320
|
+
{
|
1321
|
+
my ($et, $dirInfo, $tagTablePtr) = @_;
|
1322
|
+
my $dataPt = $$dirInfo{DataPt};
|
1323
|
+
my $dataPos = $$dirInfo{DataPos};
|
1324
|
+
my $pos = $$dirInfo{DirStart};
|
1325
|
+
|
1326
|
+
$et->VerboseDir('Qualcomm Dual Camera', undef, $$dirInfo{DirLen});
|
1327
|
+
pos($$dataPt) = $pos;
|
1328
|
+
while ($$dataPt =~ /\x0a/g) {
|
1329
|
+
my $str = substr($$dataPt, $pos, pos($$dataPt) - $pos - 1);
|
1330
|
+
next unless $str =~ /^(.*?)\s*=\s*(.*)/;
|
1331
|
+
my ($tag, $val) = ($1, $2);
|
1332
|
+
$et->HandleTag($tagTablePtr, $tag, $val, MakeTagInfo => 1);
|
1333
|
+
$pos = pos($$dataPt);
|
1334
|
+
}
|
1335
|
+
return 1;
|
1336
|
+
}
|
1337
|
+
|
1261
1338
|
#------------------------------------------------------------------------------
|
1262
1339
|
# Process Qualcomm APP7 metadata (ref PH)
|
1263
1340
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
@@ -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.73';
|
38
38
|
|
39
39
|
sub ProcessSRF($$$);
|
40
40
|
sub ProcessSR2($$$);
|
@@ -76,7 +76,9 @@ sub PrintInvLensSpec($;$$);
|
|
76
76
|
6 => 'Sony LA-EA4 Adapter',
|
77
77
|
7 => 'Sony LA-EA5 Adapter', #JR
|
78
78
|
13 => 'Samyang AF 35-150mm F2-2.8',
|
79
|
-
|
79
|
+
20 => 'Samyang AF 35mm F1.4 P FE', #JR
|
80
|
+
21 => 'Samyang AF 14-24mm F2.8', #JR
|
81
|
+
# 27 => Venus Optics Laowa 12mm f2.8 Zero-D or 105mm f2 (T3.2) Smooth Trans Focus (ref IB)
|
80
82
|
44 => 'Metabones Canon EF Smart Adapter', #JR
|
81
83
|
78 => 'Metabones Canon EF Smart Adapter Mark III or Other Adapter', #PH/JR (also Mark IV, Fotodiox and Viltrox)
|
82
84
|
184 => 'Metabones Canon EF Speed Booster Ultra', #JR ('Green' mode, LensMount reported as A-mount)
|
@@ -164,6 +166,7 @@ sub PrintInvLensSpec($;$$);
|
|
164
166
|
32877 => 'Sony E 15mm F1.4 G', #JR
|
165
167
|
32878 => 'Sony FE 20-70mm F4 G', #JR
|
166
168
|
32879 => 'Sony FE 50mm F1.4 GM', #JR
|
169
|
+
32880 => 'Sony FE 16mm F1.8 G', #JR
|
167
170
|
32881 => 'Sony FE 24-50mm F2.8 G', #JR
|
168
171
|
32882 => 'Sony FE 16-25mm F2.8 G', #JR
|
169
172
|
32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
|
@@ -172,6 +175,7 @@ sub PrintInvLensSpec($;$$);
|
|
172
175
|
32887 => 'Sony E PZ 16-50mm F3.5-5.6 OSS II', #JR
|
173
176
|
32888 => 'Sony FE 85mm F1.4 GM II', #JR
|
174
177
|
32889 => 'Sony FE 28-70mm F2 GM',
|
178
|
+
32890 => 'Sony FE 400-800mm F6.3-8 G OSS', #JR
|
175
179
|
|
176
180
|
# (comment this out so LensID will report the LensModel, which is more useful)
|
177
181
|
# 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
|
@@ -194,6 +198,8 @@ sub PrintInvLensSpec($;$$);
|
|
194
198
|
33088 => 'Sony FE 70-200mm F4 Macro G OSS II + 2X Teleconverter', #JR
|
195
199
|
33089 => 'Sony FE 300mm F2.8 GM OSS + 1.4X Teleconverter', #JR (NC)
|
196
200
|
33090 => 'Sony FE 300mm F2.8 GM OSS + 2X Teleconverter', #JR
|
201
|
+
33091 => 'Sony FE 400-800mm F6.3-8 G OSS + 1.4X Teleconverter', #JR
|
202
|
+
33092 => 'Sony FE 400-800mm F6.3-8 G OSS + 2X Teleconverter', #JR
|
197
203
|
|
198
204
|
49201 => 'Zeiss Touit 12mm F2.8', #JR (lens firmware Ver.02)
|
199
205
|
49202 => 'Zeiss Touit 32mm F1.8', #JR (lens firmware Ver.02)
|
@@ -305,6 +311,11 @@ sub PrintInvLensSpec($;$$);
|
|
305
311
|
50549 => 'Sigma 50mm F1.2 DG DN | A', #JR (024)
|
306
312
|
50550 => 'Sigma 28-105mm F2.8 DG DN | A', #JR (024)
|
307
313
|
50551 => 'Sigma 28-45mm F1.8 DG DN | A', #JR (024)
|
314
|
+
50553 => 'Sigma 300-600mm F4 DG OS | S', #JR (025)
|
315
|
+
|
316
|
+
# lenses listed in the Sigma MC-11 list, but not yet seen:
|
317
|
+
# 504xx => 'Sigma 18-200mm F3.5-6.3 DC MACRO OS HSM | C + MC-11', # (014)
|
318
|
+
# 504xx => 'Sigma 30mm F1.4 DC HSM | A + MC-11', # (013)
|
308
319
|
|
309
320
|
50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
|
310
321
|
50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
|
@@ -321,10 +332,10 @@ sub PrintInvLensSpec($;$$);
|
|
321
332
|
51006 => 'Voigtlander APO-LANTHAR 35mm F2 Aspherical', #JR
|
322
333
|
51007 => 'Voigtlander NOKTON 50mm F1 Aspherical', #JR
|
323
334
|
51008 => 'Voigtlander NOKTON 75mm F1.5 Aspherical', #JR
|
335
|
+
51009 => 'Voigtlander NOKTON 28mm F1.5 Aspherical', #JR
|
324
336
|
|
325
|
-
|
326
|
-
|
327
|
-
# 504xx => 'Sigma 30mm F1.4 DC HSM | A + MC-11', # (013)
|
337
|
+
51072 => 'ZEISS Otus ML 50mm F1.4', #JR
|
338
|
+
51073 => 'ZEISS Otus ML 85mm F1.4', #JR
|
328
339
|
|
329
340
|
# Note: For Samyang lenses, the "FE" designation isn't written to
|
330
341
|
# EXIF:LensModel, so it isn't included in these strings either - JR/PH
|
@@ -344,6 +355,8 @@ sub PrintInvLensSpec($;$$);
|
|
344
355
|
51518 => 'Samyang AF 135mm F1.8', #JR
|
345
356
|
|
346
357
|
61569 => 'LAOWA FFII 10mm F2.8 C&D Dreamer', #JR
|
358
|
+
|
359
|
+
61761 => 'Viltrox 28mm F4.5 FE', #JR
|
347
360
|
);
|
348
361
|
|
349
362
|
# ExposureProgram values (ref PH, mainly decoded from A200)
|