exiftool_vendored 13.18.0 → 13.21.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 +40 -3
- data/bin/MANIFEST +7 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +2 -2
- data/bin/exiftool +138 -64
- data/bin/lib/Image/ExifTool/DJI.pm +179 -29
- data/bin/lib/Image/ExifTool/EXE.pm +2 -9
- data/bin/lib/Image/ExifTool/GoPro.pm +28 -0
- data/bin/lib/Image/ExifTool/ICO.pm +2 -2
- data/bin/lib/Image/ExifTool/JSON.pm +5 -1
- data/bin/lib/Image/ExifTool/Kodak.pm +3 -2
- data/bin/lib/Image/ExifTool/Nikon.pm +808 -524
- data/bin/lib/Image/ExifTool/Olympus.pm +2 -1
- data/bin/lib/Image/ExifTool/PDF.pm +10 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +91 -28
- data/bin/lib/Image/ExifTool/Plot.pm +492 -0
- data/bin/lib/Image/ExifTool/Protobuf.pm +22 -11
- data/bin/lib/Image/ExifTool/QuickTime.pm +58 -41
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +75 -27
- data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
- data/bin/lib/Image/ExifTool/Sony.pm +16 -10
- data/bin/lib/Image/ExifTool/TagLookup.pm +5002 -4964
- data/bin/lib/Image/ExifTool/TagNames.pod +259 -112
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +45 -2
- data/bin/lib/Image/ExifTool/Writer.pl +0 -1
- data/bin/lib/Image/ExifTool/XMP.pm +18 -4
- data/bin/lib/Image/ExifTool.pm +20 -6
- data/bin/lib/Image/ExifTool.pod +27 -0
- data/bin/perl-Image-ExifTool.spec +1 -1
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -2
@@ -18,15 +18,18 @@ use Image::ExifTool::XMP;
|
|
18
18
|
use Image::ExifTool::GPS;
|
19
19
|
use Image::ExifTool::Protobuf;
|
20
20
|
|
21
|
-
$VERSION = '1.
|
21
|
+
$VERSION = '1.13';
|
22
22
|
|
23
23
|
sub ProcessDJIInfo($$$);
|
24
|
+
sub ProcessSettings($$$);
|
24
25
|
|
25
26
|
%knownProtocol = (
|
26
27
|
'dvtm_ac203.proto' => 1, # Osmo Action 4
|
27
28
|
'dvtm_ac204.proto' => 1, # Osmo Action 5
|
28
|
-
'dvtm_AVATA2.proto' => 1, #
|
29
|
+
'dvtm_AVATA2.proto' => 1, # Avata 2
|
29
30
|
'dvtm_wm265e.proto' => 1, # Mavic 3
|
31
|
+
'dvtm_pm320.proto' => 1, # Matrice 30
|
32
|
+
'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
|
30
33
|
);
|
31
34
|
|
32
35
|
my %convFloat2 = (
|
@@ -195,6 +198,27 @@ my %convFloat2 = (
|
|
195
198
|
},
|
196
199
|
);
|
197
200
|
|
201
|
+
%Image::ExifTool::DJI::Glamour = (
|
202
|
+
GROUPS => { 0 => 'QuickTime', 1 => 'DJI', 2 => 'Image' },
|
203
|
+
PROCESS_PROC => \&Image::ExifTool::DJI::ProcessSettings,
|
204
|
+
NOTES => 'Glamour settings used by some DJI models.',
|
205
|
+
beauty_enable => 'BeautyEnable',
|
206
|
+
smoother => 'Smoother',
|
207
|
+
whitening => 'Whitening',
|
208
|
+
face_slimming => 'FaceSlimming',
|
209
|
+
eye_enlarge => 'EyeEnlarge',
|
210
|
+
nose_slimming => 'NoseSlimming',
|
211
|
+
mouth_beautify => 'MouthModify',
|
212
|
+
teeth_whitening => 'TeethWhitening',
|
213
|
+
leg_longer => 'LegLonger',
|
214
|
+
head_shrinking => 'HeadShrinking',
|
215
|
+
lipstick => 'Lipstick',
|
216
|
+
blush => 'Blush',
|
217
|
+
dark_circle => 'DarkCircle',
|
218
|
+
acne_spot_removal=>'AcneSpotRemoval',
|
219
|
+
eyebrows => 'Eyebrows',
|
220
|
+
);
|
221
|
+
|
198
222
|
# metadata in protobuf format (djmd and dbgi meta types, ref PH)
|
199
223
|
%Image::ExifTool::DJI::Protobuf = (
|
200
224
|
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
|
@@ -208,9 +232,10 @@ my %convFloat2 = (
|
|
208
232
|
file name combined with the hierarchical protobuf field numbers.
|
209
233
|
|
210
234
|
ExifTool currently extracts timed GPS plus a few other tags from DJI devices
|
211
|
-
which use the following protocols: dvtm_AVATA2.proto (
|
212
|
-
dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5)
|
213
|
-
dvtm_wm265e.proto (Mavic 3).
|
235
|
+
which use the following protocols: dvtm_AVATA2.proto (Avata 2),
|
236
|
+
dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
|
237
|
+
dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
|
238
|
+
dvtm_pm320.proto (Mini 4 Pro).
|
214
239
|
|
215
240
|
Note that with the protobuf format, numerical tags missing from the output
|
216
241
|
for a given protocol should be considered to have the default value of 0.
|
@@ -226,13 +251,21 @@ my %convFloat2 = (
|
|
226
251
|
#
|
227
252
|
# Osmo Action 4
|
228
253
|
#
|
229
|
-
'dvtm_ac203_1-1-5' => 'SerialNumber', # (NC)
|
254
|
+
'dvtm_ac203_1-1-5' => { Name => 'SerialNumber', Notes => 'Osmo Action 4' }, # (NC)
|
230
255
|
# dvtm_ac203_1-1-6 - some version number
|
231
256
|
'dvtm_ac203_1-1-10' => 'Model',
|
232
257
|
'dvtm_ac203_2-3' => {
|
233
258
|
Name => 'FrameInfo',
|
234
259
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
235
260
|
},
|
261
|
+
'dvtm_ac203_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
262
|
+
'dvtm_ac203_3-2-4-1' => { # (NC)
|
263
|
+
Name => 'ShutterSpeed',
|
264
|
+
Format => 'rational',
|
265
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
266
|
+
},
|
267
|
+
'dvtm_ac203_3-2-6-1' => { Name => 'ColorTemperature', Format => 'unsigned' }, # (NC)
|
268
|
+
# dvtm_ac203_3-2-9-1 - looks like Z accerometer measurement, but 2 and 3 don't look like other components
|
236
269
|
# dvtm_ac203_3-4-1-4 - model code?
|
237
270
|
'dvtm_ac203_3-4-2-1' => {
|
238
271
|
Name => 'GPSInfo',
|
@@ -255,19 +288,24 @@ my %convFloat2 = (
|
|
255
288
|
#
|
256
289
|
# Osmo Action 5
|
257
290
|
#
|
258
|
-
'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
|
291
|
+
'dvtm_ac204_1-1-5' => { Name => 'SerialNumber', Notes => 'Osmo Action 5' }, # (NC)
|
259
292
|
# dvtm_ac204_1-1-6 - some version number
|
260
293
|
'dvtm_ac204_1-1-10' => 'Model',
|
261
294
|
'dvtm_ac204_2-3' => {
|
262
295
|
Name => 'FrameInfo',
|
263
296
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
264
297
|
},
|
298
|
+
'dvtm_ac204_3-2-4-1' => { # (NC)
|
299
|
+
Name => 'ShutterSpeed',
|
300
|
+
Format => 'rational',
|
301
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
302
|
+
},
|
303
|
+
'dvtm_ac204_3-2-6-1' => { Name => 'ColorTemperature', Format => 'unsigned' }, # (NC)
|
265
304
|
# dvtm_ac204_3-4-1-4 - model code?
|
266
305
|
'dvtm_ac204_3-4-2-1' => {
|
267
306
|
Name => 'GPSInfo',
|
268
307
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
269
308
|
},
|
270
|
-
# dvtm_ac204_3-2-4-1 - shutter speed? (rational)
|
271
309
|
'dvtm_ac204_3-4-2-2' => {
|
272
310
|
Name => 'GPSAltitude',
|
273
311
|
Groups => { 2 => 'Location' },
|
@@ -283,11 +321,11 @@ my %convFloat2 = (
|
|
283
321
|
PrintConv => '$self->ConvertDateTime($val)',
|
284
322
|
},
|
285
323
|
#
|
286
|
-
#
|
324
|
+
# Avata 2
|
287
325
|
#
|
288
326
|
# dvtm_AVATA2_1-1-2 - some version number
|
289
327
|
# dvtm_AVATA2_1-1-3 - some version number
|
290
|
-
'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
|
328
|
+
'dvtm_AVATA2_1-1-5' => { Name => 'SerialNumber', Notes => 'Avata 2' }, # (NC)
|
291
329
|
'dvtm_AVATA2_1-1-10' => 'Model',
|
292
330
|
# dvtm_AVATA2_2-2-1-4 - model code?
|
293
331
|
'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
|
@@ -305,17 +343,33 @@ my %convFloat2 = (
|
|
305
343
|
},
|
306
344
|
# dvtm_AVATA2_3-2-1-4 - model code?
|
307
345
|
# dvtm_AVATA2_3-2-1-5 - frame rate?
|
308
|
-
|
346
|
+
'dvtm_AVATA2_3-2-2-1' => { Name => 'ISO', Format => 'float' }, # (NC)
|
347
|
+
'dvtm_AVATA2_3-2-4-1' => {
|
348
|
+
Name => 'ShutterSpeed',
|
349
|
+
Format => 'rational',
|
350
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
351
|
+
},
|
352
|
+
'dvtm_AVATA2_3-2-6-1' => { Name => 'ColorTemperature', Format => 'unsigned' }, # (NC)
|
353
|
+
'dvtm_AVATA2_3-2-10-1' => { # (NC)
|
354
|
+
Name => 'FNumber',
|
355
|
+
Format => 'rational',
|
356
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
357
|
+
},
|
309
358
|
# dvtm_AVATA2_3-4-1-4 - model code?
|
310
|
-
|
359
|
+
'dvtm_AVATA2_3-4-3' => { # (NC)
|
360
|
+
Name => 'DroneInfo',
|
361
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
|
362
|
+
},
|
311
363
|
'dvtm_AVATA2_3-4-4-1' => {
|
312
364
|
Name => 'GPSInfo',
|
313
365
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
314
366
|
},
|
367
|
+
'dvtm_AVATA2_3-4-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' }, # (NC)
|
368
|
+
'dvtm_AVATA2_3-4-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
|
315
369
|
#
|
316
370
|
# Mavic 3
|
317
371
|
#
|
318
|
-
'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
|
372
|
+
'dvtm_wm265e_1-1-5' => { Name => 'SerialNumber', Notes => 'Mavic 3' }, # (confirmed)
|
319
373
|
'dvtm_wm265e_1-1-10' => 'Model',
|
320
374
|
'dvtm_wm265e_2-2' => {
|
321
375
|
Name => 'FrameInfo',
|
@@ -326,7 +380,6 @@ my %convFloat2 = (
|
|
326
380
|
'dvtm_wm265e_3-2-3-1' => {
|
327
381
|
Name => 'ShutterSpeed',
|
328
382
|
Format => 'rational',
|
329
|
-
ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
|
330
383
|
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
331
384
|
},
|
332
385
|
# dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
|
@@ -335,20 +388,106 @@ my %convFloat2 = (
|
|
335
388
|
Name => 'GPSInfo',
|
336
389
|
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
337
390
|
},
|
338
|
-
'dvtm_wm265e_3-3-3
|
339
|
-
|
340
|
-
|
341
|
-
|
391
|
+
'dvtm_wm265e_3-3-3' => {
|
392
|
+
Name => 'DroneInfo',
|
393
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
|
394
|
+
},
|
395
|
+
'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
|
342
396
|
'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
|
343
|
-
'dvtm_wm265e_3-4-3
|
344
|
-
|
345
|
-
|
397
|
+
'dvtm_wm265e_3-4-3' => {
|
398
|
+
Name => 'GimbalInfo',
|
399
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
|
400
|
+
},
|
401
|
+
#
|
402
|
+
# Matrice 30
|
403
|
+
#
|
404
|
+
'dvtm_pm320_1-1-5' => { Name => 'SerialNumber', Notes => 'Matrice 30' },
|
405
|
+
'dvtm_pm320_1-1-10' => 'Model',
|
406
|
+
'dvtm_pm320_2-2' => {
|
407
|
+
Name => 'FrameInfo',
|
408
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
409
|
+
},
|
410
|
+
'dvtm_pm320_3-2-2-1' => { Name => 'ISO', Format => 'float' },
|
411
|
+
'dvtm_pm320_3-2-3-1' => {
|
412
|
+
Name => 'ShutterSpeed',
|
413
|
+
Format => 'rational',
|
414
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
415
|
+
},
|
416
|
+
'dvtm_pm320_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
|
417
|
+
'dvtm_pm320_3-3-4-1' => {
|
418
|
+
Name => 'GPSInfo',
|
419
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
420
|
+
},
|
421
|
+
'dvtm_pm320_3-3-3' => {
|
422
|
+
Name => 'DroneInfo',
|
423
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
|
424
|
+
},
|
425
|
+
'dvtm_pm320_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
|
426
|
+
'dvtm_pm320_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
|
427
|
+
'dvtm_pm320_3-4-3' => {
|
428
|
+
Name => 'GimbalInfo',
|
429
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
|
430
|
+
},
|
431
|
+
#
|
432
|
+
# Mini 4 Pro
|
433
|
+
#
|
434
|
+
'dvtm_Mini4_Pro_1-1-5' => { Name => 'SerialNumber', Notes => 'Mini 4 Pro' },
|
435
|
+
'dvtm_Mini4_Pro_1-1-10' => 'Model',
|
436
|
+
'dvtm_Mini4_Pro_2-3' => {
|
437
|
+
Name => 'FrameInfo',
|
438
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
|
439
|
+
},
|
440
|
+
'dvtm_Mini4_Pro_3-2-7-1' => { Name => 'ISO', Format => 'float' },
|
441
|
+
'dvtm_Mini4_Pro_3-2-10-1' => {
|
442
|
+
Name => 'ShutterSpeed',
|
443
|
+
Format => 'rational',
|
444
|
+
PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
|
445
|
+
},
|
446
|
+
'dvtm_Mini4_Pro_3-2-11-1' => {
|
447
|
+
Name => 'FNumber',
|
448
|
+
Format => 'rational',
|
449
|
+
PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
|
450
|
+
},
|
451
|
+
'dvtm_Mini4_Pro_3-2-32-1' => { Name => 'ColorTemperature', Format => 'unsigned' },
|
452
|
+
# dvtm_Mini4_Pro_3-2-37-1 - something to do with battery level or time remaining?
|
453
|
+
'dvtm_Mini4_Pro_3-3-4-1' => {
|
454
|
+
Name => 'GPSInfo',
|
455
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
|
456
|
+
},
|
457
|
+
'dvtm_Mini4_Pro_3-3-3' => {
|
458
|
+
Name => 'DroneInfo',
|
459
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
|
460
|
+
},
|
461
|
+
'dvtm_Mini4_Pro_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
|
462
|
+
'dvtm_Mini4_Pro_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
|
463
|
+
'dvtm_Mini4_Pro_3-4-3' => {
|
464
|
+
Name => 'GimbalInfo',
|
465
|
+
SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
|
466
|
+
},
|
467
|
+
);
|
468
|
+
|
469
|
+
%Image::ExifTool::DJI::DroneInfo = (
|
470
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
|
471
|
+
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
472
|
+
VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
|
473
|
+
1 => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val / 10' },
|
474
|
+
2 => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val / 10' },
|
475
|
+
3 => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val / 10' },
|
476
|
+
);
|
477
|
+
|
478
|
+
%Image::ExifTool::DJI::GimbalInfo = (
|
479
|
+
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
|
480
|
+
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
481
|
+
VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
|
482
|
+
1 => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
|
483
|
+
2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' }, # usually 0, so missing
|
484
|
+
3 => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
|
346
485
|
);
|
347
486
|
|
348
487
|
%Image::ExifTool::DJI::FrameInfo = (
|
349
488
|
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Video' },
|
350
489
|
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
351
|
-
VARS => { HEX_ID => 0 },
|
490
|
+
VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
|
352
491
|
1 => { Name => 'FrameWidth', Format => 'unsigned' },
|
353
492
|
2 => { Name => 'FrameHeight', Format => 'unsigned' },
|
354
493
|
3 => { Name => 'FrameRate', Format => 'float' },
|
@@ -357,7 +496,7 @@ my %convFloat2 = (
|
|
357
496
|
%Image::ExifTool::DJI::GPSInfo = (
|
358
497
|
GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
|
359
498
|
PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
|
360
|
-
VARS => { HEX_ID => 0 },
|
499
|
+
VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
|
361
500
|
1 => {
|
362
501
|
Name => 'CoordinateUnits',
|
363
502
|
Format => 'unsigned',
|
@@ -381,6 +520,22 @@ my %convFloat2 = (
|
|
381
520
|
},
|
382
521
|
);
|
383
522
|
|
523
|
+
#------------------------------------------------------------------------------
|
524
|
+
# Process DJI beauty settings (ref PH)
|
525
|
+
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
526
|
+
# Returns: 1 on success
|
527
|
+
sub ProcessSettings($$$)
|
528
|
+
{
|
529
|
+
my ($et, $dirInfo, $tagTbl) = @_;
|
530
|
+
$et->VerboseDir($$dirInfo{DirName}, undef, length(${$$dirInfo{DataPt}}));
|
531
|
+
foreach (split /;/, ${$$dirInfo{DataPt}}) {
|
532
|
+
my ($tag, $val) = split /=/;
|
533
|
+
next unless defined $tag and defined $val;
|
534
|
+
$et->HandleTag($tagTbl, $tag, $val, MakeTagInfo => 1);
|
535
|
+
}
|
536
|
+
return 1;
|
537
|
+
}
|
538
|
+
|
384
539
|
#------------------------------------------------------------------------------
|
385
540
|
# Process DJI info (ref PH)
|
386
541
|
# Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
|
@@ -405,12 +560,7 @@ sub ProcessDJIInfo($$$)
|
|
405
560
|
my $buff = $val;
|
406
561
|
$val = \$buff;
|
407
562
|
}
|
408
|
-
|
409
|
-
my $name = $tag;
|
410
|
-
$name =~ s/_([a-z])/_\U$1/g;
|
411
|
-
AddTagToTable($tagTbl, $tag, { Name => Image::ExifTool::MakeTagName($name) });
|
412
|
-
}
|
413
|
-
$et->HandleTag($tagTbl, $tag, $val);
|
563
|
+
$et->HandleTag($tagTbl, $tag, $val, MakeTagInfo => 1);
|
414
564
|
}
|
415
565
|
return 1;
|
416
566
|
}
|
@@ -22,7 +22,7 @@ use strict;
|
|
22
22
|
use vars qw($VERSION);
|
23
23
|
use Image::ExifTool qw(:DataAccess :Utils);
|
24
24
|
|
25
|
-
$VERSION = '1.
|
25
|
+
$VERSION = '1.23';
|
26
26
|
|
27
27
|
sub ProcessPEResources($$);
|
28
28
|
sub ProcessPEVersion($$);
|
@@ -1005,20 +1005,13 @@ sub ProcessPEVersion($$)
|
|
1005
1005
|
next;
|
1006
1006
|
}
|
1007
1007
|
my $tag = $string;
|
1008
|
-
# create entry in tag table if it doesn't already exist
|
1009
|
-
unless ($$tagTablePtr{$tag}) {
|
1010
|
-
my $name = $tag;
|
1011
|
-
$name =~ tr/-_a-zA-Z0-9//dc; # remove illegal characters
|
1012
|
-
next unless length $name;
|
1013
|
-
AddTagToTable($tagTablePtr, $tag, { Name => $name });
|
1014
|
-
}
|
1015
1008
|
# get tag value (converted to current Charset)
|
1016
1009
|
if ($valLen) {
|
1017
1010
|
($string, $pt) = ReadUnicodeStr($dataPt, $pt, $entryEnd, $et);
|
1018
1011
|
} else {
|
1019
1012
|
$string = '';
|
1020
1013
|
}
|
1021
|
-
$et->HandleTag($tagTablePtr, $tag, $string);
|
1014
|
+
$et->HandleTag($tagTablePtr, $tag, $string, MakeTagInfo => 1);
|
1022
1015
|
# step to next entry (padded to an even word)
|
1023
1016
|
$pt = ($entryEnd + 3) & 0xfffffffc;
|
1024
1017
|
}
|
@@ -761,6 +761,32 @@ sub ProcessString($$$)
|
|
761
761
|
return 1;
|
762
762
|
}
|
763
763
|
|
764
|
+
#------------------------------------------------------------------------------
|
765
|
+
# Process "GP\x06\0" records in MP4 'mdat'atom
|
766
|
+
# Inputs: 0) ExifTool object ref, 1) dirInfo ref (RAF and DirLen)
|
767
|
+
# Returns: size of GoPro record, or 0 on error
|
768
|
+
sub ProcessGP6($$)
|
769
|
+
{
|
770
|
+
my ($et, $dirInfo) = @_;
|
771
|
+
my $raf = $$dirInfo{RAF};
|
772
|
+
my $len = $$dirInfo{DirLen};
|
773
|
+
my $buff;
|
774
|
+
while ($len > 16) {
|
775
|
+
$raf->Read($buff, 16) == 16 or last;
|
776
|
+
my ($tag, $size) = unpack('a4N', $buff);
|
777
|
+
last if $size + 16 > $len or $buff !~ /^GP..\0/s;
|
778
|
+
$raf->Read($buff, $size) == $size or last;
|
779
|
+
if ($buff =~ /^DEVC/) {
|
780
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
781
|
+
my $tagTbl = GetTagTable('Image::ExifTool::GoPro::GPMF');
|
782
|
+
ProcessGoPro($et, { DataPt => \$buff, DataPos => $raf->Tell()-$size }, $tagTbl);
|
783
|
+
}
|
784
|
+
$len -= $size + 16;
|
785
|
+
}
|
786
|
+
delete $$et{DOC_NUM};
|
787
|
+
return $$dirInfo{DirLen} - $len;
|
788
|
+
}
|
789
|
+
|
764
790
|
#------------------------------------------------------------------------------
|
765
791
|
# Process GoPro metadata (gpmd samples, GPMF box, or APP6) (ref PH/1/2)
|
766
792
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
|
@@ -778,6 +804,7 @@ sub ProcessGoPro($$$)
|
|
778
804
|
my ($size, $type, $unit, $scal, $setGroup0);
|
779
805
|
|
780
806
|
$et->VerboseDir($$dirInfo{DirName} || 'GPMF', undef, $dirEnd-$pos) if $verbose;
|
807
|
+
$$et{FoundEmbedded} = 1;
|
781
808
|
if ($pos) {
|
782
809
|
my $parent = $$dirInfo{Parent};
|
783
810
|
$setGroup0 = $$et{SET_GROUP0} = 'APP6' if $parent and $parent eq 'APP6';
|
@@ -835,6 +862,7 @@ sub ProcessGoPro($$$)
|
|
835
862
|
ScaleValues($val, $scal) if $scal and $tag ne 'SCAL' and $pos+$size+3>=$dirEnd;
|
836
863
|
my $key = $et->HandleTag($tagTablePtr, $tag, $val,
|
837
864
|
DataPt => $dataPt,
|
865
|
+
DataPos => $$dirInfo{DataPos},
|
838
866
|
Base => $base,
|
839
867
|
Start => $pos,
|
840
868
|
Size => $size,
|
@@ -14,7 +14,7 @@ use strict;
|
|
14
14
|
use vars qw($VERSION);
|
15
15
|
use Image::ExifTool qw(:DataAccess :Utils);
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.01';
|
18
18
|
|
19
19
|
%Image::ExifTool::ICO::Main = (
|
20
20
|
PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
|
@@ -95,7 +95,7 @@ sub ProcessICO($$$)
|
|
95
95
|
$et->HandleTag($tagTbl, 4, $num);
|
96
96
|
for ($i=0; $i<$num; ++$i) {
|
97
97
|
$raf->Read($buff, 16) == 16 or $et->Warn('Truncated file'), last;
|
98
|
-
$$et{DOC_NUM} = ++$$et{DOC_COUNT}
|
98
|
+
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
99
99
|
$et->HandleTag($tagTbl, 6, $buff);
|
100
100
|
}
|
101
101
|
delete $$et{DOC_NUM};
|
@@ -14,7 +14,7 @@ use vars qw($VERSION);
|
|
14
14
|
use Image::ExifTool qw(:DataAccess :Utils);
|
15
15
|
use Image::ExifTool::Import;
|
16
16
|
|
17
|
-
$VERSION = '1.
|
17
|
+
$VERSION = '1.10';
|
18
18
|
|
19
19
|
sub ProcessJSON($$);
|
20
20
|
sub ProcessTag($$$$%);
|
@@ -43,6 +43,10 @@ sub ProcessTag($$$$%);
|
|
43
43
|
ON1_SettingsMetadataTimestamp => { Groups => { 2 => 'Time' } },
|
44
44
|
ON1_SettingsMetadataUsage => { },
|
45
45
|
ON1_SettingsMetadataVisibleToUser=>{ },
|
46
|
+
adjustmentsSettingsStatisticsLightMap => { # (in JSON of AAE files)
|
47
|
+
Name => 'AdjustmentsSettingsStatisticsLightMap',
|
48
|
+
ValueConv => 'Image::ExifTool::XMP::DecodeBase64($val)',
|
49
|
+
},
|
46
50
|
);
|
47
51
|
|
48
52
|
#------------------------------------------------------------------------------
|
@@ -25,7 +25,7 @@ use vars qw($VERSION);
|
|
25
25
|
use Image::ExifTool qw(:DataAccess :Utils);
|
26
26
|
use Image::ExifTool::Exif;
|
27
27
|
|
28
|
-
$VERSION = '1.
|
28
|
+
$VERSION = '1.48';
|
29
29
|
|
30
30
|
sub ProcessKodakIFD($$$);
|
31
31
|
sub ProcessKodakText($$$);
|
@@ -2983,7 +2983,8 @@ my %sceneModeUsed = (
|
|
2983
2983
|
Priority => 0, # (only integer seconds)
|
2984
2984
|
PrintConv => 'ConvertDuration($val)',
|
2985
2985
|
},
|
2986
|
-
|
2986
|
+
# (save KodakVersion to recognize Rexing Dashcam video for GPS scaling)
|
2987
|
+
'ver '=> { Name => 'KodakVersion', RawConv => '$$self{KodakVersion} = $val' },
|
2987
2988
|
thma => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' }, Binary => 1 },
|
2988
2989
|
scra => { Name => 'PreviewImage', Groups => { 2 => 'Preview' }, Binary => 1 },
|
2989
2990
|
);
|