exiftool_vendored 13.19.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.
@@ -21,11 +21,12 @@ use Image::ExifTool::Protobuf;
21
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, # Avanta 2
29
+ 'dvtm_AVATA2.proto' => 1, # Avata 2
29
30
  'dvtm_wm265e.proto' => 1, # Mavic 3
30
31
  'dvtm_pm320.proto' => 1, # Matrice 30
31
32
  'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
@@ -197,6 +198,27 @@ my %convFloat2 = (
197
198
  },
198
199
  );
199
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
+
200
222
  # metadata in protobuf format (djmd and dbgi meta types, ref PH)
201
223
  %Image::ExifTool::DJI::Protobuf = (
202
224
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
@@ -210,7 +232,7 @@ my %convFloat2 = (
210
232
  file name combined with the hierarchical protobuf field numbers.
211
233
 
212
234
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
213
- which use the following protocols: dvtm_AVATA2.proto (Avanta 2),
235
+ which use the following protocols: dvtm_AVATA2.proto (Avata 2),
214
236
  dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
215
237
  dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
216
238
  dvtm_pm320.proto (Mini 4 Pro).
@@ -229,13 +251,21 @@ my %convFloat2 = (
229
251
  #
230
252
  # Osmo Action 4
231
253
  #
232
- 'dvtm_ac203_1-1-5' => 'SerialNumber', # (NC)
254
+ 'dvtm_ac203_1-1-5' => { Name => 'SerialNumber', Notes => 'Osmo Action 4' }, # (NC)
233
255
  # dvtm_ac203_1-1-6 - some version number
234
256
  'dvtm_ac203_1-1-10' => 'Model',
235
257
  'dvtm_ac203_2-3' => {
236
258
  Name => 'FrameInfo',
237
259
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
238
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
239
269
  # dvtm_ac203_3-4-1-4 - model code?
240
270
  'dvtm_ac203_3-4-2-1' => {
241
271
  Name => 'GPSInfo',
@@ -258,19 +288,24 @@ my %convFloat2 = (
258
288
  #
259
289
  # Osmo Action 5
260
290
  #
261
- 'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
291
+ 'dvtm_ac204_1-1-5' => { Name => 'SerialNumber', Notes => 'Osmo Action 5' }, # (NC)
262
292
  # dvtm_ac204_1-1-6 - some version number
263
293
  'dvtm_ac204_1-1-10' => 'Model',
264
294
  'dvtm_ac204_2-3' => {
265
295
  Name => 'FrameInfo',
266
296
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
267
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)
268
304
  # dvtm_ac204_3-4-1-4 - model code?
269
305
  'dvtm_ac204_3-4-2-1' => {
270
306
  Name => 'GPSInfo',
271
307
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
272
308
  },
273
- # dvtm_ac204_3-2-4-1 - shutter speed? (rational)
274
309
  'dvtm_ac204_3-4-2-2' => {
275
310
  Name => 'GPSAltitude',
276
311
  Groups => { 2 => 'Location' },
@@ -286,11 +321,11 @@ my %convFloat2 = (
286
321
  PrintConv => '$self->ConvertDateTime($val)',
287
322
  },
288
323
  #
289
- # Avanta 2
324
+ # Avata 2
290
325
  #
291
326
  # dvtm_AVATA2_1-1-2 - some version number
292
327
  # dvtm_AVATA2_1-1-3 - some version number
293
- 'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
328
+ 'dvtm_AVATA2_1-1-5' => { Name => 'SerialNumber', Notes => 'Avata 2' }, # (NC)
294
329
  'dvtm_AVATA2_1-1-10' => 'Model',
295
330
  # dvtm_AVATA2_2-2-1-4 - model code?
296
331
  'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
@@ -308,17 +343,33 @@ my %convFloat2 = (
308
343
  },
309
344
  # dvtm_AVATA2_3-2-1-4 - model code?
310
345
  # dvtm_AVATA2_3-2-1-5 - frame rate?
311
- # dvtm_AVATA2_3-2-4-1 - shutter speed? (rational)
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
+ },
312
358
  # dvtm_AVATA2_3-4-1-4 - model code?
313
- # dvtm_AVATA2_3-4-3-1,2,3 - YPR? (int64s)
359
+ 'dvtm_AVATA2_3-4-3' => { # (NC)
360
+ Name => 'DroneInfo',
361
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
362
+ },
314
363
  'dvtm_AVATA2_3-4-4-1' => {
315
364
  Name => 'GPSInfo',
316
365
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
317
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)
318
369
  #
319
370
  # Mavic 3
320
371
  #
321
- 'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
372
+ 'dvtm_wm265e_1-1-5' => { Name => 'SerialNumber', Notes => 'Mavic 3' }, # (confirmed)
322
373
  'dvtm_wm265e_1-1-10' => 'Model',
323
374
  'dvtm_wm265e_2-2' => {
324
375
  Name => 'FrameInfo',
@@ -350,7 +401,7 @@ my %convFloat2 = (
350
401
  #
351
402
  # Matrice 30
352
403
  #
353
- 'dvtm_pm320_1-1-5' => 'SerialNumber',
404
+ 'dvtm_pm320_1-1-5' => { Name => 'SerialNumber', Notes => 'Matrice 30' },
354
405
  'dvtm_pm320_1-1-10' => 'Model',
355
406
  'dvtm_pm320_2-2' => {
356
407
  Name => 'FrameInfo',
@@ -380,7 +431,7 @@ my %convFloat2 = (
380
431
  #
381
432
  # Mini 4 Pro
382
433
  #
383
- 'dvtm_Mini4_Pro_1-1-5' => 'SerialNumber',
434
+ 'dvtm_Mini4_Pro_1-1-5' => { Name => 'SerialNumber', Notes => 'Mini 4 Pro' },
384
435
  'dvtm_Mini4_Pro_1-1-10' => 'Model',
385
436
  'dvtm_Mini4_Pro_2-3' => {
386
437
  Name => 'FrameInfo',
@@ -418,7 +469,7 @@ my %convFloat2 = (
418
469
  %Image::ExifTool::DJI::DroneInfo = (
419
470
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
420
471
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
421
- VARS => { HEX_ID => 0 },
472
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
422
473
  1 => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val / 10' },
423
474
  2 => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val / 10' },
424
475
  3 => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val / 10' },
@@ -427,16 +478,16 @@ my %convFloat2 = (
427
478
  %Image::ExifTool::DJI::GimbalInfo = (
428
479
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
429
480
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
430
- VARS => { HEX_ID => 0 },
481
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
431
482
  1 => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
432
- 2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
483
+ 2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' }, # usually 0, so missing
433
484
  3 => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
434
485
  );
435
486
 
436
487
  %Image::ExifTool::DJI::FrameInfo = (
437
488
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Video' },
438
489
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
439
- VARS => { HEX_ID => 0 },
490
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
440
491
  1 => { Name => 'FrameWidth', Format => 'unsigned' },
441
492
  2 => { Name => 'FrameHeight', Format => 'unsigned' },
442
493
  3 => { Name => 'FrameRate', Format => 'float' },
@@ -445,7 +496,7 @@ my %convFloat2 = (
445
496
  %Image::ExifTool::DJI::GPSInfo = (
446
497
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
447
498
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
448
- VARS => { HEX_ID => 0 },
499
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
449
500
  1 => {
450
501
  Name => 'CoordinateUnits',
451
502
  Format => 'unsigned',
@@ -469,6 +520,22 @@ my %convFloat2 = (
469
520
  },
470
521
  );
471
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
+
472
539
  #------------------------------------------------------------------------------
473
540
  # Process DJI info (ref PH)
474
541
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -493,12 +560,7 @@ sub ProcessDJIInfo($$$)
493
560
  my $buff = $val;
494
561
  $val = \$buff;
495
562
  }
496
- if (not $$tagTbl{$tag} and $tag=~ /^[-_a-zA-Z0-9]+$/) {
497
- my $name = $tag;
498
- $name =~ s/_([a-z])/_\U$1/g;
499
- AddTagToTable($tagTbl, $tag, { Name => Image::ExifTool::MakeTagName($name) });
500
- }
501
- $et->HandleTag($tagTbl, $tag, $val);
563
+ $et->HandleTag($tagTbl, $tag, $val, MakeTagInfo => 1);
502
564
  }
503
565
  return 1;
504
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.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
  }
@@ -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 vars qw($VERSION);
14
14
  use Image::ExifTool qw(:DataAccess :Utils);
15
15
  use Image::ExifTool::Import;
16
16
 
17
- $VERSION = '1.09';
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
  #------------------------------------------------------------------------------