exiftool-vendored.exe 13.17.0 → 13.25.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.
Files changed (45) hide show
  1. package/bin/README.txt +14 -14
  2. package/bin/exiftool.exe +0 -0
  3. package/bin/exiftool_files/exiftool.pl +117 -46
  4. package/bin/exiftool_files/lib/Image/ExifTool/Apple.pm +12 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +2 -2
  6. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +1 -1
  7. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +190 -29
  8. package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +22 -11
  9. package/bin/exiftool_files/lib/Image/ExifTool/EXE.pm +2 -9
  10. package/bin/exiftool_files/lib/Image/ExifTool/GM.pm +1 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +3 -3
  12. package/bin/exiftool_files/lib/Image/ExifTool/Geolocation.dat +0 -0
  13. package/bin/exiftool_files/lib/Image/ExifTool/GoPro.pm +86 -48
  14. package/bin/exiftool_files/lib/Image/ExifTool/ICO.pm +2 -2
  15. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +5 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/JSON.pm +5 -1
  17. package/bin/exiftool_files/lib/Image/ExifTool/Kodak.pm +3 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +943 -1237
  19. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +2 -1
  20. package/bin/exiftool_files/lib/Image/ExifTool/PCAP.pm +462 -0
  21. package/bin/exiftool_files/lib/Image/ExifTool/PDF.pm +10 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/PLIST.pm +92 -29
  23. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +7 -1
  24. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +2 -2
  25. package/bin/exiftool_files/lib/Image/ExifTool/Plot.pm +713 -0
  26. package/bin/exiftool_files/lib/Image/ExifTool/Protobuf.pm +24 -11
  27. package/bin/exiftool_files/lib/Image/ExifTool/Qualcomm.pm +78 -1
  28. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +347 -318
  29. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +75 -27
  30. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +33 -14
  31. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +5056 -4967
  32. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +443 -334
  33. package/bin/exiftool_files/lib/Image/ExifTool/Trailer.pm +3 -3
  34. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +4 -4
  35. package/bin/exiftool_files/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  36. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +9 -4
  37. package/bin/exiftool_files/lib/Image/ExifTool/WritePDF.pl +1 -1
  38. package/bin/exiftool_files/lib/Image/ExifTool/WriteQuickTime.pl +58 -5
  39. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +14 -13
  40. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +34 -6
  41. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +2 -0
  42. package/bin/exiftool_files/lib/Image/ExifTool.pm +63 -29
  43. package/bin/exiftool_files/lib/Image/ExifTool.pod +83 -86
  44. package/bin/exiftool_files/windows_exiftool.txt +95 -71
  45. package/package.json +4 -4
@@ -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.12';
21
+ $VERSION = '1.14';
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, # Avanta 2
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 (Avanta 2),
212
- dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5) and
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,24 @@ 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
269
+ 'dvtm_ac203_3-2-10-2' => { Name => 'AccelerometerX', Format => 'float' } , # (NC) left/right
270
+ 'dvtm_ac203_3-2-10-3' => { Name => 'AccelerometerY', Format => 'float' } , # (NC) front/back
271
+ 'dvtm_ac203_3-2-10-4' => { Name => 'AccelerometerZ', Format => 'float' } , # (NC) up/down
236
272
  # dvtm_ac203_3-4-1-4 - model code?
237
273
  'dvtm_ac203_3-4-2-1' => {
238
274
  Name => 'GPSInfo',
@@ -255,19 +291,27 @@ my %convFloat2 = (
255
291
  #
256
292
  # Osmo Action 5
257
293
  #
258
- 'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
294
+ 'dvtm_ac204_1-1-5' => { Name => 'SerialNumber', Notes => 'Osmo Action 5' }, # (NC)
259
295
  # dvtm_ac204_1-1-6 - some version number
260
296
  'dvtm_ac204_1-1-10' => 'Model',
261
297
  'dvtm_ac204_2-3' => {
262
298
  Name => 'FrameInfo',
263
299
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
264
300
  },
301
+ 'dvtm_ac204_3-2-4-1' => { # (NC)
302
+ Name => 'ShutterSpeed',
303
+ Format => 'rational',
304
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
305
+ },
306
+ 'dvtm_ac204_3-2-6-1' => { Name => 'ColorTemperature', Format => 'unsigned' }, # (NC)
307
+ 'dvtm_ac204_3-2-10-2' => { Name => 'AccelerometerX', Format => 'float' } , # (NC) left/right
308
+ 'dvtm_ac204_3-2-10-3' => { Name => 'AccelerometerY', Format => 'float' } , # (NC) front/back
309
+ 'dvtm_ac204_3-2-10-4' => { Name => 'AccelerometerZ', Format => 'float' } , # (NC) up/down
265
310
  # dvtm_ac204_3-4-1-4 - model code?
266
311
  'dvtm_ac204_3-4-2-1' => {
267
312
  Name => 'GPSInfo',
268
313
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
269
314
  },
270
- # dvtm_ac204_3-2-4-1 - shutter speed? (rational)
271
315
  'dvtm_ac204_3-4-2-2' => {
272
316
  Name => 'GPSAltitude',
273
317
  Groups => { 2 => 'Location' },
@@ -283,11 +327,11 @@ my %convFloat2 = (
283
327
  PrintConv => '$self->ConvertDateTime($val)',
284
328
  },
285
329
  #
286
- # Avanta 2
330
+ # Avata 2
287
331
  #
288
332
  # dvtm_AVATA2_1-1-2 - some version number
289
333
  # dvtm_AVATA2_1-1-3 - some version number
290
- 'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
334
+ 'dvtm_AVATA2_1-1-5' => { Name => 'SerialNumber', Notes => 'Avata 2' }, # (NC)
291
335
  'dvtm_AVATA2_1-1-10' => 'Model',
292
336
  # dvtm_AVATA2_2-2-1-4 - model code?
293
337
  'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
@@ -305,17 +349,33 @@ my %convFloat2 = (
305
349
  },
306
350
  # dvtm_AVATA2_3-2-1-4 - model code?
307
351
  # dvtm_AVATA2_3-2-1-5 - frame rate?
308
- # dvtm_AVATA2_3-2-4-1 - shutter speed? (rational)
352
+ 'dvtm_AVATA2_3-2-2-1' => { Name => 'ISO', Format => 'float' }, # (NC)
353
+ 'dvtm_AVATA2_3-2-4-1' => {
354
+ Name => 'ShutterSpeed',
355
+ Format => 'rational',
356
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
357
+ },
358
+ 'dvtm_AVATA2_3-2-6-1' => { Name => 'ColorTemperature', Format => 'unsigned' }, # (NC)
359
+ 'dvtm_AVATA2_3-2-10-1' => { # (NC)
360
+ Name => 'FNumber',
361
+ Format => 'rational',
362
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
363
+ },
309
364
  # dvtm_AVATA2_3-4-1-4 - model code?
310
- # dvtm_AVATA2_3-4-3-1,2,3 - YPR? (int64s)
365
+ 'dvtm_AVATA2_3-4-3' => { # (NC)
366
+ Name => 'DroneInfo',
367
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
368
+ },
311
369
  'dvtm_AVATA2_3-4-4-1' => {
312
370
  Name => 'GPSInfo',
313
371
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
314
372
  },
373
+ 'dvtm_AVATA2_3-4-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' }, # (NC)
374
+ 'dvtm_AVATA2_3-4-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
315
375
  #
316
376
  # Mavic 3
317
377
  #
318
- 'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
378
+ 'dvtm_wm265e_1-1-5' => { Name => 'SerialNumber', Notes => 'Mavic 3' }, # (confirmed)
319
379
  'dvtm_wm265e_1-1-10' => 'Model',
320
380
  'dvtm_wm265e_2-2' => {
321
381
  Name => 'FrameInfo',
@@ -326,7 +386,6 @@ my %convFloat2 = (
326
386
  'dvtm_wm265e_3-2-3-1' => {
327
387
  Name => 'ShutterSpeed',
328
388
  Format => 'rational',
329
- ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
330
389
  PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
331
390
  },
332
391
  # dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
@@ -335,20 +394,111 @@ my %convFloat2 = (
335
394
  Name => 'GPSInfo',
336
395
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
337
396
  },
338
- 'dvtm_wm265e_3-3-3-1' => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val/10' },
339
- 'dvtm_wm265e_3-3-3-2' => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val/10' },
340
- 'dvtm_wm265e_3-3-3-3' => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val/10' },
341
- 'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', ValueConv => '$val / 1000' },
397
+ 'dvtm_wm265e_3-3-3' => {
398
+ Name => 'DroneInfo',
399
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
400
+ },
401
+ 'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
342
402
  'dvtm_wm265e_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
343
- 'dvtm_wm265e_3-4-3-1' => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
344
- 'dvtm_wm265e_3-4-3-2' => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
345
- 'dvtm_wm265e_3-4-3-3' => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
403
+ 'dvtm_wm265e_3-4-3' => {
404
+ Name => 'GimbalInfo',
405
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
406
+ },
407
+ #
408
+ # Matrice 30
409
+ #
410
+ 'dvtm_pm320_1-1-5' => { Name => 'SerialNumber', Notes => 'Matrice 30' },
411
+ 'dvtm_pm320_1-1-10' => 'Model',
412
+ 'dvtm_pm320_2-2' => {
413
+ Name => 'FrameInfo',
414
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
415
+ },
416
+ 'dvtm_pm320_3-2-2-1' => { Name => 'ISO', Format => 'float' },
417
+ 'dvtm_pm320_3-2-3-1' => {
418
+ Name => 'ShutterSpeed',
419
+ Format => 'rational',
420
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
421
+ },
422
+ 'dvtm_pm320_3-2-4-1' => { # (NC)
423
+ Name => 'FNumber',
424
+ Format => 'rational',
425
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
426
+ },
427
+ 'dvtm_pm320_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
428
+ 'dvtm_pm320_3-3-4-1' => {
429
+ Name => 'GPSInfo',
430
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
431
+ },
432
+ 'dvtm_pm320_3-3-3' => {
433
+ Name => 'DroneInfo',
434
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
435
+ },
436
+ 'dvtm_pm320_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
437
+ 'dvtm_pm320_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
438
+ 'dvtm_pm320_3-4-3' => {
439
+ Name => 'GimbalInfo',
440
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
441
+ },
442
+ #
443
+ # Mini 4 Pro
444
+ #
445
+ 'dvtm_Mini4_Pro_1-1-5' => { Name => 'SerialNumber', Notes => 'Mini 4 Pro' },
446
+ 'dvtm_Mini4_Pro_1-1-10' => 'Model',
447
+ 'dvtm_Mini4_Pro_2-3' => {
448
+ Name => 'FrameInfo',
449
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
450
+ },
451
+ 'dvtm_Mini4_Pro_3-2-7-1' => { Name => 'ISO', Format => 'float' },
452
+ 'dvtm_Mini4_Pro_3-2-10-1' => {
453
+ Name => 'ShutterSpeed',
454
+ Format => 'rational',
455
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
456
+ },
457
+ 'dvtm_Mini4_Pro_3-2-11-1' => {
458
+ Name => 'FNumber',
459
+ Format => 'rational',
460
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
461
+ },
462
+ 'dvtm_Mini4_Pro_3-2-32-1' => { Name => 'ColorTemperature', Format => 'unsigned' },
463
+ # dvtm_Mini4_Pro_3-2-37-1 - something to do with battery level or time remaining?
464
+ 'dvtm_Mini4_Pro_3-3-4-1' => {
465
+ Name => 'GPSInfo',
466
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
467
+ },
468
+ 'dvtm_Mini4_Pro_3-3-3' => {
469
+ Name => 'DroneInfo',
470
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
471
+ },
472
+ 'dvtm_Mini4_Pro_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
473
+ 'dvtm_Mini4_Pro_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
474
+ 'dvtm_Mini4_Pro_3-4-3' => {
475
+ Name => 'GimbalInfo',
476
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
477
+ },
478
+ );
479
+
480
+ %Image::ExifTool::DJI::DroneInfo = (
481
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
482
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
483
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
484
+ 1 => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val / 10' },
485
+ 2 => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val / 10' },
486
+ 3 => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val / 10' },
487
+ );
488
+
489
+ %Image::ExifTool::DJI::GimbalInfo = (
490
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
491
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
492
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
493
+ 1 => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
494
+ 2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' }, # usually 0, so missing
495
+ 3 => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
346
496
  );
347
497
 
348
498
  %Image::ExifTool::DJI::FrameInfo = (
349
499
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Video' },
350
500
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
351
- VARS => { HEX_ID => 0 },
501
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
352
502
  1 => { Name => 'FrameWidth', Format => 'unsigned' },
353
503
  2 => { Name => 'FrameHeight', Format => 'unsigned' },
354
504
  3 => { Name => 'FrameRate', Format => 'float' },
@@ -357,7 +507,7 @@ my %convFloat2 = (
357
507
  %Image::ExifTool::DJI::GPSInfo = (
358
508
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
359
509
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
360
- VARS => { HEX_ID => 0 },
510
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
361
511
  1 => {
362
512
  Name => 'CoordinateUnits',
363
513
  Format => 'unsigned',
@@ -381,6 +531,22 @@ my %convFloat2 = (
381
531
  },
382
532
  );
383
533
 
534
+ #------------------------------------------------------------------------------
535
+ # Process DJI beauty settings (ref PH)
536
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
537
+ # Returns: 1 on success
538
+ sub ProcessSettings($$$)
539
+ {
540
+ my ($et, $dirInfo, $tagTbl) = @_;
541
+ $et->VerboseDir($$dirInfo{DirName}, undef, length(${$$dirInfo{DataPt}}));
542
+ foreach (split /;/, ${$$dirInfo{DataPt}}) {
543
+ my ($tag, $val) = split /=/;
544
+ next unless defined $tag and defined $val;
545
+ $et->HandleTag($tagTbl, $tag, $val, MakeTagInfo => 1);
546
+ }
547
+ return 1;
548
+ }
549
+
384
550
  #------------------------------------------------------------------------------
385
551
  # Process DJI info (ref PH)
386
552
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -405,12 +571,7 @@ sub ProcessDJIInfo($$$)
405
571
  my $buff = $val;
406
572
  $val = \$buff;
407
573
  }
408
- if (not $$tagTbl{$tag} and $tag=~ /^[-_a-zA-Z0-9]+$/) {
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);
574
+ $et->HandleTag($tagTbl, $tag, $val, MakeTagInfo => 1);
414
575
  }
415
576
  return 1;
416
577
  }
@@ -4,6 +4,7 @@
4
4
  # Description: Darwin Core XMP tags
5
5
  #
6
6
  # Revisions: 2013-01-28 - P. Harvey Created
7
+ # 2025-03-09 - Herb forum17172 changes dwc.tdwg.org 2023
7
8
  #
8
9
  # References: 1) http://rs.tdwg.org/dwc/index.htm
9
10
  # 2) https://exiftool.org/forum/index.php/topic,4442.0/all.html
@@ -15,7 +16,7 @@ use strict;
15
16
  use vars qw($VERSION);
16
17
  use Image::ExifTool::XMP;
17
18
 
18
- $VERSION = '1.07';
19
+ $VERSION = '1.08';
19
20
 
20
21
  my %dateTimeInfo = (
21
22
  # NOTE: Do NOT put "Groups" here because Groups hash must not be common!
@@ -35,7 +36,7 @@ my %event = (
35
36
  STRUCT_NAME => 'DarwinCore Event',
36
37
  NAMESPACE => 'dwc',
37
38
  day => { Writable => 'integer', Groups => { 2 => 'Time' } },
38
- earliestDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
39
+ earliestDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, # dwc.tdwg.org removed 2023
39
40
  endDayOfYear => { Writable => 'integer', Groups => { 2 => 'Time' } },
40
41
  eventDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
41
42
  eventID => { Avoid => 1, Notes => 'avoided in favor of XMP-iptcExt:EventID' },
@@ -63,7 +64,7 @@ my %event = (
63
64
  fieldNotes => { },
64
65
  fieldNumber => { },
65
66
  habitat => { },
66
- latestDate => { %dateTimeInfo, Groups => { 2 => 'Time' } },
67
+ latestDate => { %dateTimeInfo, Groups => { 2 => 'Time' } }, # dwc.tdwg.org removed 2023
67
68
  month => { Writable => 'integer', Groups => { 2 => 'Time' } },
68
69
  parentEventID => { },
69
70
  samplingEffort => { },
@@ -73,6 +74,7 @@ my %event = (
73
74
  startDayOfYear => { Writable => 'integer', Groups => { 2 => 'Time' } },
74
75
  verbatimEventDate => { Groups => { 2 => 'Time' } },
75
76
  year => { Writable => 'integer', Groups => { 2 => 'Time' } },
77
+ eventType => { }, # dwc.tdwg.org added 2023
76
78
  );
77
79
 
78
80
  # Darwin Core tags
@@ -161,6 +163,7 @@ my %event = (
161
163
  measurementType => { },
162
164
  measurementUnit => { },
163
165
  measurementValue => { },
166
+ parentMeasurementID => { }, # dwc.tdwg.org added 2023
164
167
  },
165
168
  },
166
169
  Occurrence => {
@@ -170,25 +173,25 @@ my %event = (
170
173
  associatedMedia => { },
171
174
  associatedOccurrences => { },
172
175
  associatedReferences => { },
173
- associatedSequences => { },
176
+ associatedSequences => { }, # dwc.tdwg.org removed 2023
174
177
  associatedTaxa => { },
175
178
  behavior => { },
176
179
  catalogNumber => { },
177
- disposition => { },
180
+ disposition => { }, # dwc.tdwg.org removed 2023
178
181
  establishmentMeans => { },
179
182
  individualCount => { },
180
- individualID => { },
183
+ individualID => { }, # dwc.tdwg.org removed 2023
181
184
  lifeStage => { },
182
185
  occurrenceDetails => { },
183
- occurrenceID => { },
186
+ occurrenceID => { }, # dwc.tdwg.org removed 2023
184
187
  occurrenceRemarks => { },
185
188
  occurrenceStatus => { },
186
189
  organismQuantity => { },
187
190
  organismQuantityType => { },
188
191
  otherCatalogNumbers => { },
189
192
  preparations => { },
190
- previousIdentifications => { },
191
- recordedBy => { },
193
+ previousIdentifications => { }, # dwc.tdwg.org removed 2023
194
+ recordedBy => { }, # dwc.tdwg.org removed 2023
192
195
  recordNumber => { },
193
196
  reproductiveCondition => { },
194
197
  sex => { },
@@ -197,6 +200,8 @@ my %event = (
197
200
  georeferenceVerificationStatus => { },
198
201
  pathway => { },
199
202
  recordedByID => { },
203
+ caste => { }, # dwc.tdwg.org added 2023
204
+ vitality => { }, # dwc.tdwg.org added 2023
200
205
  },
201
206
  },
202
207
  OccurrenceOccurrenceDetails => { Name => 'OccurrenceDetails', Flat => 1 },
@@ -207,7 +212,7 @@ my %event = (
207
212
  Struct => {
208
213
  STRUCT_NAME => 'DarwinCore Organism',
209
214
  NAMESPACE => 'dwc',
210
- associatedOccurrences => { },
215
+ associatedOccurrences => { }, # dwc.tdwg.org removed 2023
211
216
  associatedOrganisms => { },
212
217
  organismID => { },
213
218
  organismName => { },
@@ -291,6 +296,12 @@ my %event = (
291
296
  taxonomicStatus => { },
292
297
  verbatimTaxonRank => { },
293
298
  vernacularName => { Writable => 'lang-alt' },
299
+ superFamily => { }, # dwc.tdwg.org added 2023
300
+ subFamily => { }, # dwc.tdwg.org added 2023
301
+ tribe => { }, # dwc.tdwg.org added 2023
302
+ subTribe => { }, # dwc.tdwg.org added 2023
303
+ genericName => { }, # dwc.tdwg.org added 2023
304
+ infragenericEpithet => { }, # dwc.tdwg.org added 2023
294
305
  },
295
306
  },
296
307
  TaxonTaxonConceptID => { Name => 'TaxonConceptID', Flat => 1 },
@@ -321,7 +332,7 @@ my %event = (
321
332
  georeferenceProtocol => { },
322
333
  georeferenceRemarks => { },
323
334
  georeferenceSources => { },
324
- georeferenceVerificationStatus => { },
335
+ georeferenceVerificationStatus => { }, # dwc.tdwg.org removed 2023
325
336
  higherGeography => { },
326
337
  higherGeographyID => { },
327
338
  island => { },
@@ -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.22';
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
  }
@@ -437,7 +437,7 @@ sub Process_marl($$$)
437
437
  {
438
438
  my ($et, $dirInfo, $tagTablePtr) = @_;
439
439
  my $dataPt = $$dirInfo{DataPt};
440
- my $dataPos = $$dirInfo{DataPos} + $$dirInfo{Base};
440
+ my $dataPos = ($$dirInfo{DataPos} || 0) + ($$dirInfo{Base} || 0);
441
441
  my $dataLen = length $$dataPt;
442
442
  my $vals = $$et{GMVals}; # running values for each channel (0=TimeStamp)
443
443
  my $chan = $$et{GMChan}; # running channel number
@@ -12,7 +12,7 @@ use strict;
12
12
  use vars qw($VERSION);
13
13
  use Image::ExifTool::Exif;
14
14
 
15
- $VERSION = '1.57';
15
+ $VERSION = '1.58';
16
16
 
17
17
  my %coordConv = (
18
18
  ValueConv => 'Image::ExifTool::GPS::ToDegrees($val)',
@@ -112,8 +112,8 @@ my %printConvLonRef = (
112
112
  },
113
113
  0 => 'Above Sea Level', # (ellipsoidal surface, Exif 3.0)
114
114
  1 => 'Below Sea Level', # (ellipsoidal surface, Exif 3.0)
115
- # 2 => 'Above Sea Level', # (Exif 3.0)
116
- # 3 => 'Below Sea Level', # (Exif 3.0)
115
+ 2 => 'Positive Sea Level (sea-level ref)', # sea-level reference, Exif 3.0
116
+ 3 => 'Negative Sea Level (sea-level ref)', # sea-level reference, Exif 3.0
117
117
  },
118
118
  },
119
119
  0x0006 => {