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.
@@ -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.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
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,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
- # Avanta 2
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
- # 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
+ },
309
358
  # dvtm_AVATA2_3-4-1-4 - model code?
310
- # 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
+ },
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-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' },
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-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' },
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
- 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);
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.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 strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.00';
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} if $i;
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.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
  #------------------------------------------------------------------------------
@@ -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.47';
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
- 'ver '=> { Name => 'KodakVersion' },
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
  );