exiftool_vendored 13.19.0 → 13.22.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.
@@ -18,14 +18,15 @@ use Image::ExifTool::XMP;
18
18
  use Image::ExifTool::GPS;
19
19
  use Image::ExifTool::Protobuf;
20
20
 
21
- $VERSION = '1.13';
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
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,24 @@ 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
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
239
272
  # dvtm_ac203_3-4-1-4 - model code?
240
273
  'dvtm_ac203_3-4-2-1' => {
241
274
  Name => 'GPSInfo',
@@ -258,19 +291,27 @@ my %convFloat2 = (
258
291
  #
259
292
  # Osmo Action 5
260
293
  #
261
- 'dvtm_ac204_1-1-5' => 'SerialNumber', # (NC)
294
+ 'dvtm_ac204_1-1-5' => { Name => 'SerialNumber', Notes => 'Osmo Action 5' }, # (NC)
262
295
  # dvtm_ac204_1-1-6 - some version number
263
296
  'dvtm_ac204_1-1-10' => 'Model',
264
297
  'dvtm_ac204_2-3' => {
265
298
  Name => 'FrameInfo',
266
299
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
267
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
268
310
  # dvtm_ac204_3-4-1-4 - model code?
269
311
  'dvtm_ac204_3-4-2-1' => {
270
312
  Name => 'GPSInfo',
271
313
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
272
314
  },
273
- # dvtm_ac204_3-2-4-1 - shutter speed? (rational)
274
315
  'dvtm_ac204_3-4-2-2' => {
275
316
  Name => 'GPSAltitude',
276
317
  Groups => { 2 => 'Location' },
@@ -286,11 +327,11 @@ my %convFloat2 = (
286
327
  PrintConv => '$self->ConvertDateTime($val)',
287
328
  },
288
329
  #
289
- # Avanta 2
330
+ # Avata 2
290
331
  #
291
332
  # dvtm_AVATA2_1-1-2 - some version number
292
333
  # dvtm_AVATA2_1-1-3 - some version number
293
- 'dvtm_AVATA2_1-1-5' => 'SerialNumber', # (NC)
334
+ 'dvtm_AVATA2_1-1-5' => { Name => 'SerialNumber', Notes => 'Avata 2' }, # (NC)
294
335
  'dvtm_AVATA2_1-1-10' => 'Model',
295
336
  # dvtm_AVATA2_2-2-1-4 - model code?
296
337
  'dvtm_AVATA2_2-2-3-1' => 'SerialNumber2', # (NC)
@@ -308,17 +349,33 @@ my %convFloat2 = (
308
349
  },
309
350
  # dvtm_AVATA2_3-2-1-4 - model code?
310
351
  # dvtm_AVATA2_3-2-1-5 - frame rate?
311
- # 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
+ },
312
364
  # dvtm_AVATA2_3-4-1-4 - model code?
313
- # 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
+ },
314
369
  'dvtm_AVATA2_3-4-4-1' => {
315
370
  Name => 'GPSInfo',
316
371
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
317
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)
318
375
  #
319
376
  # Mavic 3
320
377
  #
321
- 'dvtm_wm265e_1-1-5' => 'SerialNumber', # (confirmed)
378
+ 'dvtm_wm265e_1-1-5' => { Name => 'SerialNumber', Notes => 'Mavic 3' }, # (confirmed)
322
379
  'dvtm_wm265e_1-1-10' => 'Model',
323
380
  'dvtm_wm265e_2-2' => {
324
381
  Name => 'FrameInfo',
@@ -350,7 +407,7 @@ my %convFloat2 = (
350
407
  #
351
408
  # Matrice 30
352
409
  #
353
- 'dvtm_pm320_1-1-5' => 'SerialNumber',
410
+ 'dvtm_pm320_1-1-5' => { Name => 'SerialNumber', Notes => 'Matrice 30' },
354
411
  'dvtm_pm320_1-1-10' => 'Model',
355
412
  'dvtm_pm320_2-2' => {
356
413
  Name => 'FrameInfo',
@@ -362,6 +419,11 @@ my %convFloat2 = (
362
419
  Format => 'rational',
363
420
  PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
364
421
  },
422
+ 'dvtm_pm320_3-2-4-1' => { # (NC)
423
+ Name => 'FNumber',
424
+ Format => 'rational',
425
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
426
+ },
365
427
  'dvtm_pm320_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
366
428
  'dvtm_pm320_3-3-4-1' => {
367
429
  Name => 'GPSInfo',
@@ -380,7 +442,7 @@ my %convFloat2 = (
380
442
  #
381
443
  # Mini 4 Pro
382
444
  #
383
- 'dvtm_Mini4_Pro_1-1-5' => 'SerialNumber',
445
+ 'dvtm_Mini4_Pro_1-1-5' => { Name => 'SerialNumber', Notes => 'Mini 4 Pro' },
384
446
  'dvtm_Mini4_Pro_1-1-10' => 'Model',
385
447
  'dvtm_Mini4_Pro_2-3' => {
386
448
  Name => 'FrameInfo',
@@ -418,7 +480,7 @@ my %convFloat2 = (
418
480
  %Image::ExifTool::DJI::DroneInfo = (
419
481
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
420
482
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
421
- VARS => { HEX_ID => 0 },
483
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
422
484
  1 => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val / 10' },
423
485
  2 => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val / 10' },
424
486
  3 => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val / 10' },
@@ -427,16 +489,16 @@ my %convFloat2 = (
427
489
  %Image::ExifTool::DJI::GimbalInfo = (
428
490
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
429
491
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
430
- VARS => { HEX_ID => 0 },
492
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
431
493
  1 => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
432
- 2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
494
+ 2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' }, # usually 0, so missing
433
495
  3 => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
434
496
  );
435
497
 
436
498
  %Image::ExifTool::DJI::FrameInfo = (
437
499
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Video' },
438
500
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
439
- VARS => { HEX_ID => 0 },
501
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
440
502
  1 => { Name => 'FrameWidth', Format => 'unsigned' },
441
503
  2 => { Name => 'FrameHeight', Format => 'unsigned' },
442
504
  3 => { Name => 'FrameRate', Format => 'float' },
@@ -445,7 +507,7 @@ my %convFloat2 = (
445
507
  %Image::ExifTool::DJI::GPSInfo = (
446
508
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Location' },
447
509
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
448
- VARS => { HEX_ID => 0 },
510
+ VARS => { HEX_ID => 0, ID_LABEL => 'Field #' },
449
511
  1 => {
450
512
  Name => 'CoordinateUnits',
451
513
  Format => 'unsigned',
@@ -469,6 +531,22 @@ my %convFloat2 = (
469
531
  },
470
532
  );
471
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
+
472
550
  #------------------------------------------------------------------------------
473
551
  # Process DJI info (ref PH)
474
552
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -493,12 +571,7 @@ sub ProcessDJIInfo($$$)
493
571
  my $buff = $val;
494
572
  $val = \$buff;
495
573
  }
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);
574
+ $et->HandleTag($tagTbl, $tag, $val, MakeTagInfo => 1);
502
575
  }
503
576
  return 1;
504
577
  }
@@ -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
@@ -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,
@@ -202,7 +202,7 @@ sub ProcessJPEG_HDR($$$);
202
202
  Groups => { 0 => 'APP6', 1 => 'DJI' },
203
203
  Notes => 'DJI Thermal Analysis Tool record',
204
204
  ValueConv => 'substr($val,7)',
205
- # also seen Motorola APP6 "MMIMETA\0", with sub-types: AL3A,ALED,MMI0,MOTD,QC3A
205
+ # also seen Motorola APP6 "MMIMETA\0", with sub-types: AL3A,ALED,MMI0,MOTD,QC3A,LMB1
206
206
  }],
207
207
  APP7 => [{
208
208
  Name => 'Pentax',
@@ -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
  #------------------------------------------------------------------------------