exiftool_vendored 13.17.0 → 13.19.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 861018287a20c9c313a1fbaae7c77019fb9875a096936c68a61818e5d5cbda48
4
- data.tar.gz: 1e0cc71de8847a24053b2fa9b569fdbf48b720aa70e027c6c984d6faabcde10a
3
+ metadata.gz: 19b270f0ce5b43c0bc65a0cf0f71fdea7426079ce467cb9e79a42ae9a5909c12
4
+ data.tar.gz: d989e4609455211361660c40fdec7c81ac3809d35030fd08ee0406fcf220be1e
5
5
  SHA512:
6
- metadata.gz: 9ddf18669ddb544c1360868fd79cf7b5a0664d838f7986a43db8b15d1c21b4fbe30f516efdc2f55c6a4af21b29312e99c7ef2d28acce3eacba9aa77a65b219e7
7
- data.tar.gz: b47c09c393c4b62543b458b2d57f2a3fee3868b0ed37da38954f7a8958746cf7566c76ff93eb839ffad0ddf9ea77c7a09663eaff8266a8b0f5067153e2579340
6
+ metadata.gz: c4f5c17319320481c245bf7009a86055da882a2374fb4e5c4f59b5ac31b82dba1f094e54adc442759fe3758ceeeab2e1d8f75b73efbdff57e1214ef871b8d12e
7
+ data.tar.gz: c657963e15956834d70bde5bf04c64446e1361a5e170eaef59a1d42b54acaeef54428654dd96c2d18ffef7548752fcd757e345d6a130076684f70ec1095eb033
data/bin/Changes CHANGED
@@ -7,6 +7,34 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 13.10. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Feb. 10, 2025 - Version 13.19
11
+
12
+ - Added read/write support for PDF and XMP-pdfx SourceModified
13
+ - Decode GPS from two more DJI protobuf formats (Matrice 30 and Mini 4 Pro)
14
+ - Decode timed GPS from Rexing V1-4k dashcam
15
+ - Decode more information from AAE files
16
+ - Made a new icon for the Windows EXE application
17
+ - Changed family 3 groups for ICO files so the first icon is in the Doc1
18
+ instead of the Main group
19
+ - Improved handling of ICC_Profile in HEIC images:
20
+ - Profiles for sub-images are extracted as sub-documents
21
+ - Allow only the profile of the main image to be written
22
+ - Updated Sony decoding for ILCE-1M2 (thanks Jos Roost)
23
+
24
+ Feb. 3, 2025 - Version 13.18
25
+
26
+ - Decode a number of new GoPro tags
27
+ - Enhanced -geotag option to set Geotime from either SubSecDateTimeOriginal
28
+ (preferentially) or DateTimeOriginal if not otherwise specified
29
+ - Don't allow ICC_Profile to be deleted from QuickTime-based files
30
+ (specifically HEIC, to avoid problem where Apple Preview wouldn't display the
31
+ resulting file)
32
+ - Improved decoding of AF points for Nikon D3400 and D7500
33
+ - Patched issue introduced in 13.13 which could give a "No data reference"
34
+ error when writing MP4 videos from some Google phones
35
+ - Fixed problem writing XMP-iptcExt:LocationCreatedGPSAltitudeRef with an
36
+ incorrect namespace
37
+
10
38
  Jan. 29, 2025 - Version 13.17
11
39
 
12
40
  - Added support for reading more embedded images and videos written in the
@@ -14,10 +42,9 @@ Jan. 29, 2025 - Version 13.17
14
42
  - Added support for reading JPEG trailer written by some OnePlus phones
15
43
  - Added a -validate warning for QuickTime 'wide' atoms with an invalid size
16
44
  - Added a new CanonLensType
17
- - Extract more embedded videos and depth/gain maps from JPEG images written
18
45
  - Avoid decoding Sony 0x9050 data for the ILCE-1M2 because the encoding has
19
- changed since the ILCE-1 and the new encoding is not yet known
20
- - Fixed issue that could cause runtime error when using -j with -b
46
+ changed since the ILCE-1 and the new encoding is not yet known (github #310)
47
+ - Fixed issue that could cause runtime warning when using -j with -b
21
48
  - Fixed some issues decoding AFPointsUsed for some newer Nikon models
22
49
  - Fixed problem corrupting QuickTime-format videos when writing if they
23
50
  contain a 'wide' atom with an invalid size
@@ -59,7 +86,7 @@ Jan. 20, 2025 - Version 13.13
59
86
 
60
87
  - Added ability to write tags to the audio/video tracks of MOV/MP4 videos
61
88
  using the new AudioKeys and VideoKeys group names
62
- - Added support for another DJI protobuf format (Mavic 3)
89
+ - Decode GPS from another DJI protobuf format (Mavic 3)
63
90
  - Decode yet another type of LIGOGPSINFO timed GPS from a dashcam video
64
91
  - Extract some proprietary information from JPEG images of Vivo phones
65
92
  - Enhanced Geolocation feature to allow the nearest cities to a specified city
@@ -397,8 +424,8 @@ July 11, 2024 - Version 12.88 - "New Windows/MacOS packages"
397
424
  - Tweaked API Geolocation option recognized space-separated lat/lon even when
398
425
  there is no decimal point in the numbers
399
426
  - API Changes:
400
- - Changed LargeFileSupport default to 2 and added a warning if a large
401
- chunk is encountered. Set to 1 to avoid the warning.
427
+ - Changed LargeFileSupport default to 1 and added a setting of 2 to warn
428
+ if a large chunk is encountered
402
429
 
403
430
  June 13, 2024 - Version 12.87
404
431
 
data/bin/MANIFEST CHANGED
@@ -40,6 +40,7 @@ fmt_files/gpx.fmt
40
40
  fmt_files/gpx_wpt.fmt
41
41
  fmt_files/kml.fmt
42
42
  fmt_files/kml_track.fmt
43
+ html/ET-256.png
43
44
  html/ExifTool.html
44
45
  html/MIE1.1-20070121.pdf
45
46
  html/Shift.html
data/bin/META.json CHANGED
@@ -50,5 +50,5 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.17"
53
+ "version" : "13.19"
54
54
  }
data/bin/META.yml CHANGED
@@ -31,4 +31,4 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.17'
34
+ version: '13.19'
data/bin/README CHANGED
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
109
109
  terminal window to extract and run ExifTool:
110
110
 
111
111
  cd ~/Desktop
112
- gzip -dc Image-ExifTool-13.17.tar.gz | tar -xf -
113
- cd Image-ExifTool-13.17
112
+ gzip -dc Image-ExifTool-13.19.tar.gz | tar -xf -
113
+ cd Image-ExifTool-13.19
114
114
  ./exiftool t/images/ExifTool.jpg
115
115
 
116
116
  Note: These commands extract meta information from one of the test images.
@@ -371,7 +371,7 @@ $Image::ExifTool::QuickTime::Keys{PREFERRED} = 3;
371
371
  # Add user-defined cities to the Geolocation lookup
372
372
  @Image::ExifTool::UserDefined::Geolocation = (
373
373
  # (city,region,subregion,country_code,country,timezone,feature_code,population,lat,lon)
374
- ['Sinemorets','burgas','Obshtina Tsarevo','BG','','Europe/Sofia','PPL',400,42.06115,27.97833],
374
+ ['Sinemorets','Burgas','Obshtina Tsarevo','BG','','Europe/Sofia','PPL',400,42.06115,27.97833],
375
375
  );
376
376
 
377
377
  #------------------------------------------------------------------------------
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.17';
14
+ my $version = '13.19';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -1391,7 +1391,8 @@ for (;;) {
1391
1391
  # add geotag/geosync/geolocate commands first
1392
1392
  unshift @newValues, pop @newValues;
1393
1393
  if (lc $2 eq 'geotag' and (not defined $addGeotime or $addGeotime) and length $val) {
1394
- $addGeotime = ($1 || '') . 'Geotime<DateTimeOriginal#';
1394
+ $addGeotime = [ ($1 || '') . 'Geotime<DateTimeOriginal#',
1395
+ ($1 || '') . 'Geotime<SubSecDateTimeOriginal#' ];
1395
1396
  }
1396
1397
  }
1397
1398
  }
@@ -1670,8 +1671,9 @@ if (@newValues) {
1670
1671
  # assume -geotime value if -geotag specified without -geotime
1671
1672
  if ($addGeotime) {
1672
1673
  AddSetTagsFile($setTagsFile = '@') unless $setTagsFile and $setTagsFile eq '@';
1673
- push @{$setTags{$setTagsFile}}, $addGeotime;
1674
- $verbose and print $vout qq{Argument "-$addGeotime" is assumed\n};
1674
+ push @{$setTags{$setTagsFile}}, @$addGeotime;
1675
+ my @a = map qq("-$_"), @$addGeotime;
1676
+ $verbose and print $vout 'Arguments ',join(' and ', @a)," are assumed\n";
1675
1677
  }
1676
1678
  my %setTagsIndex;
1677
1679
  # add/delete option lookup
@@ -5984,7 +5986,7 @@ with this command:
5984
5986
 
5985
5987
  produces output like this:
5986
5988
 
5987
- -- Generated by ExifTool 13.17 --
5989
+ -- Generated by ExifTool 13.19 --
5988
5990
  File: a.jpg - 2003:10:31 15:44:19
5989
5991
  (f/5.6, 1/60s, ISO 100)
5990
5992
  File: b.jpg - 2006:05:23 11:57:38
@@ -7808,8 +7810,9 @@ the B<-geotag> option.)
7808
7810
 
7809
7811
  Geotag an image (C<a.jpg>) from position information in a GPS track log
7810
7812
  (C<track.log>). Since the C<Geotime> tag is not specified, the value of
7811
- DateTimeOriginal is used for geotagging. Local system time is assumed
7812
- unless DateTimeOriginal contains a timezone.
7813
+ SubSecDateTimeOriginal (preferentially) or DateTimeOriginal is used for
7814
+ geotagging. Local system time is assumed unless the time contains a
7815
+ timezone.
7813
7816
 
7814
7817
  =item C<exiftool -geotag track.log -geolocate=geotag a.jpg>
7815
7818
 
@@ -7854,7 +7857,8 @@ Delete XMP GPS tags which were added by the geotag feature.
7854
7857
 
7855
7858
  =item C<exiftool -xmp:geotag=track.log a.jpg>
7856
7859
 
7857
- Geotag an image with XMP tags, using the time from DateTimeOriginal.
7860
+ Geotag an image with XMP tags, using the time from SubSecDateTimeOriginal or
7861
+ DateTimeOriginal.
7858
7862
 
7859
7863
  =item C<exiftool -geotag a.log -geotag b.log -r dir>
7860
7864
 
@@ -854,7 +854,7 @@ sub ProcessCRW($$)
854
854
 
855
855
  # process trailers if they exist in CRW file (not in CIFF information!)
856
856
  if ($$et{FILE_TYPE} eq 'CRW') {
857
- my $trailInfo = Image::ExifTool::IdentifyTrailer($raf);
857
+ my $trailInfo = $et->IdentifyTrailer($raf);
858
858
  $et->ProcessTrailers($trailInfo) if $trailInfo;
859
859
  }
860
860
 
@@ -18,7 +18,7 @@ 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
24
 
@@ -27,6 +27,8 @@ sub ProcessDJIInfo($$$);
27
27
  'dvtm_ac204.proto' => 1, # Osmo Action 5
28
28
  'dvtm_AVATA2.proto' => 1, # Avanta 2
29
29
  'dvtm_wm265e.proto' => 1, # Mavic 3
30
+ 'dvtm_pm320.proto' => 1, # Matrice 30
31
+ 'dvtm_Mini4_Pro.proto' => 1, # Matrice 30
30
32
  );
31
33
 
32
34
  my %convFloat2 = (
@@ -209,8 +211,9 @@ my %convFloat2 = (
209
211
 
210
212
  ExifTool currently extracts timed GPS plus a few other tags from DJI devices
211
213
  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).
214
+ dvtm_ac203.proto (Osmo Action 4), dvtm_ac204.proto (Osmo Action 5),
215
+ dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30) and
216
+ dvtm_pm320.proto (Mini 4 Pro).
214
217
 
215
218
  Note that with the protobuf format, numerical tags missing from the output
216
219
  for a given protocol should be considered to have the default value of 0.
@@ -326,7 +329,6 @@ my %convFloat2 = (
326
329
  'dvtm_wm265e_3-2-3-1' => {
327
330
  Name => 'ShutterSpeed',
328
331
  Format => 'rational',
329
- ValueConv => '$val =~ m{(.*)/(.*)} ? $1 / $2 : $val',
330
332
  PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
331
333
  },
332
334
  # dvtm_wm265e_3-2-5-1 - unknown rational (xxxx / 1000)
@@ -335,14 +337,100 @@ my %convFloat2 = (
335
337
  Name => 'GPSInfo',
336
338
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
337
339
  },
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' },
340
+ 'dvtm_wm265e_3-3-3' => {
341
+ Name => 'DroneInfo',
342
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
343
+ },
344
+ 'dvtm_wm265e_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
342
345
  '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' },
346
+ 'dvtm_wm265e_3-4-3' => {
347
+ Name => 'GimbalInfo',
348
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
349
+ },
350
+ #
351
+ # Matrice 30
352
+ #
353
+ 'dvtm_pm320_1-1-5' => 'SerialNumber',
354
+ 'dvtm_pm320_1-1-10' => 'Model',
355
+ 'dvtm_pm320_2-2' => {
356
+ Name => 'FrameInfo',
357
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
358
+ },
359
+ 'dvtm_pm320_3-2-2-1' => { Name => 'ISO', Format => 'float' },
360
+ 'dvtm_pm320_3-2-3-1' => {
361
+ Name => 'ShutterSpeed',
362
+ Format => 'rational',
363
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
364
+ },
365
+ 'dvtm_pm320_3-2-6-1' => { Name => 'DigitalZoom', Format => 'float' },
366
+ 'dvtm_pm320_3-3-4-1' => {
367
+ Name => 'GPSInfo',
368
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
369
+ },
370
+ 'dvtm_pm320_3-3-3' => {
371
+ Name => 'DroneInfo',
372
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
373
+ },
374
+ 'dvtm_pm320_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
375
+ 'dvtm_pm320_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' },
376
+ 'dvtm_pm320_3-4-3' => {
377
+ Name => 'GimbalInfo',
378
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
379
+ },
380
+ #
381
+ # Mini 4 Pro
382
+ #
383
+ 'dvtm_Mini4_Pro_1-1-5' => 'SerialNumber',
384
+ 'dvtm_Mini4_Pro_1-1-10' => 'Model',
385
+ 'dvtm_Mini4_Pro_2-3' => {
386
+ Name => 'FrameInfo',
387
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
388
+ },
389
+ 'dvtm_Mini4_Pro_3-2-7-1' => { Name => 'ISO', Format => 'float' },
390
+ 'dvtm_Mini4_Pro_3-2-10-1' => {
391
+ Name => 'ShutterSpeed',
392
+ Format => 'rational',
393
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
394
+ },
395
+ 'dvtm_Mini4_Pro_3-2-11-1' => {
396
+ Name => 'FNumber',
397
+ Format => 'rational',
398
+ PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
399
+ },
400
+ 'dvtm_Mini4_Pro_3-2-32-1' => { Name => 'ColorTemperature', Format => 'unsigned' },
401
+ # dvtm_Mini4_Pro_3-2-37-1 - something to do with battery level or time remaining?
402
+ 'dvtm_Mini4_Pro_3-3-4-1' => {
403
+ Name => 'GPSInfo',
404
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
405
+ },
406
+ 'dvtm_Mini4_Pro_3-3-3' => {
407
+ Name => 'DroneInfo',
408
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
409
+ },
410
+ 'dvtm_Mini4_Pro_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' },
411
+ 'dvtm_Mini4_Pro_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
412
+ 'dvtm_Mini4_Pro_3-4-3' => {
413
+ Name => 'GimbalInfo',
414
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GimbalInfo' },
415
+ },
416
+ );
417
+
418
+ %Image::ExifTool::DJI::DroneInfo = (
419
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
420
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
421
+ VARS => { HEX_ID => 0 },
422
+ 1 => { Name => 'DroneRoll', Format => 'int64s', ValueConv => '$val / 10' },
423
+ 2 => { Name => 'DronePitch', Format => 'int64s', ValueConv => '$val / 10' },
424
+ 3 => { Name => 'DroneYaw', Format => 'int64s', ValueConv => '$val / 10' },
425
+ );
426
+
427
+ %Image::ExifTool::DJI::GimbalInfo = (
428
+ GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
429
+ PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
430
+ VARS => { HEX_ID => 0 },
431
+ 1 => { Name => 'GimbalPitch',Format => 'int64s', ValueConv => '$val / 10' },
432
+ 2 => { Name => 'GimbalRoll', Format => 'int64s', ValueConv => '$val / 10' },
433
+ 3 => { Name => 'GimbalYaw', Format => 'int64s', ValueConv => '$val / 10' },
346
434
  );
347
435
 
348
436
  %Image::ExifTool::DJI::FrameInfo = (
@@ -7,6 +7,7 @@
7
7
  #
8
8
  # References: 1) https://github.com/gopro/gpmf-parser
9
9
  # 2) https://github.com/stilldavid/gopro-utils
10
+ # 3) https://github.com/gopro/gpmf-parser
10
11
  #------------------------------------------------------------------------------
11
12
 
12
13
  package Image::ExifTool::GoPro;
@@ -16,7 +17,7 @@ use vars qw($VERSION);
16
17
  use Image::ExifTool qw(:DataAccess :Utils);
17
18
  use Image::ExifTool::QuickTime;
18
19
 
19
- $VERSION = '1.11';
20
+ $VERSION = '1.12';
20
21
 
21
22
  sub ProcessGoPro($$$);
22
23
  sub ProcessString($$$);
@@ -59,6 +60,8 @@ my %addUnits = (
59
60
  PrintConv => 'Image::ExifTool::GoPro::AddUnits($self, $val, $tag)',
60
61
  );
61
62
 
63
+ my %noYes = ( N => 'No', Y => 'Yes' );
64
+
62
65
  # Tags found in the GPMF box of Hero6 mp4 videos (ref PH), and
63
66
  # the gpmd-format timed metadata of Hero5 and Hero6 videos (ref 1)
64
67
  %Image::ExifTool::GoPro::GPMF = (
@@ -72,7 +75,7 @@ my %addUnits = (
72
75
  let me know if you discover the meaning of any of these unknown tags. See
73
76
  L<https://github.com/gopro/gpmf-parser> for details about this format.
74
77
  },
75
- # ABSC (GPMF) - seen: 0 (fmt f)
78
+ ABSC => 'AutoBoostScore', #3
76
79
  ACCL => { #2 (gpmd)
77
80
  Name => 'Accelerometer',
78
81
  Notes => 'accelerator readings in m/s2',
@@ -82,9 +85,9 @@ my %addUnits = (
82
85
  # ANGY (GPMF-GEOC) - seen 179.9 (fmt d, Max)
83
86
  # ANGZ (GPMF-GEOC) - seen 0.152 (fmt d, Max)
84
87
  ALLD => 'AutoLowLightDuration', #1 (gpmd) (untested)
85
- # APTO (GPMF) - seen: 'OFF', 'RAW', 'DYNM' (fmt c)
86
- # ARUW (GPMF) - seen: 1.14285719394684 (fmt f)
87
- # ARWA (GPMF) - seen: 1.14285719394684 (fmt f)
88
+ APTO => 'AudioProtuneOption', #3
89
+ ARUW => 'AspectRatioUnwarped', #3
90
+ ARWA => 'AspectRatioWarped', #3
88
91
  ATTD => { #PH (Karma)
89
92
  Name => 'Attitude',
90
93
  # UNIT=s,rad,rad,rad,rad/s,rad/s,rad/s,
@@ -99,10 +102,10 @@ my %addUnits = (
99
102
  # SCAL=1000 1 1 1 1
100
103
  Binary => 1,
101
104
  },
102
- # AUBT (GPMF) - seen: ''N' (type c)
105
+ AUBT => { Name => 'AudioBlueTooth', PrintConv => \%noYes }, #3
103
106
  AUDO => 'AudioSetting', #PH (GPMF - seen: 'WIND', fmt c)
104
- # AUPT (GPMF) - seen: 'N','Y' (fmt c)
105
- # BITR (GPMF) - seen: 'STANDARD' (fmt c)
107
+ AUPT => { Name => 'AutoProtune', PrintConv => \%noYes },
108
+ BITR => 'BitrateSetting', #3
106
109
  BPOS => { #PH (Karma)
107
110
  Name => 'Controller',
108
111
  Unknown => 1,
@@ -116,16 +119,22 @@ my %addUnits = (
116
119
  # CALH (GPMF-GEOC) - seen 3040 (fmt L, Max)
117
120
  # CALW (GPMF-GEOC) - seen 4056 (fmt L, Max)
118
121
  CASN => 'CameraSerialNumber', #PH (GPMF - seen: 'C3221324545448', fmt c)
119
- # CDAT (GPMF) - seen: 1732152823 (fmt J)
120
- # CDTM (GPMF) - seen: 0 (fmt L)
122
+ CDAT => { #3
123
+ Name => 'CreationDate',
124
+ Groups => { 2 => 'Time' },
125
+ RawConv => 'ConvertUnixTime($val)',
126
+ PrintConv => '$self->ConvertDateTime($val)',
127
+ },
128
+ CDTM => 'CaptureDelayTimer', #3
121
129
  # CINF (GPMF) - seen: 0x67376be7709bc8876a8baf3940908618, 0xe230988539b30cf5f016627ae8fc5395,
122
130
  # 0x8bcbe424acc5b37d7d77001635198b3b (fmt B) (Camera INFormation?)
123
- # CLDP (GPMF) - seen: 'Y' (fmt c)
131
+ CLDP => { Name => 'ClassificationDataPresent', PrintConv => \%noYes },
124
132
  # CLKC (GPMF) - seen: 0 (fmt L)
125
133
  # CLKS (GPMF) - seen: 2 (fmt B)
126
- # CMOD (GPMF) - seen: 12,13,17 [12 360 video, 13 time-laps video, 17 JPEG] (fmt B)
134
+ # CMOD (GPMF) - seen: 12,13,17 [12 360 video, 13 time-laps video, 17 JPEG] (fmt B) - CameraMode (ref 3)
127
135
  # CPID (GPMF) - seen: '1194885996 3387225026 733916448 2433577768' (fmt L)
128
136
  # CPIN (GPMF) - seen: 1
137
+ CPIN => 'ChapterNumber',
129
138
  # CRTX (GPMF-BACK/FRNT) - double[1]
130
139
  # CRTY (GPMF-BACK/FRNT) - double[1]
131
140
  CSEN => { #PH (Karma)
@@ -135,7 +144,7 @@ my %addUnits = (
135
144
  # SCAL=1000 1 1 1 1 1 1 1 1 1 1
136
145
  Binary => 1,
137
146
  },
138
- # CTRL (GPMF) - seen: 'Pro' (fmt c)
147
+ CTRL => 'ControlLevel', #3
139
148
  CYTS => { #PH (Karma)
140
149
  Name => 'CoyoteStatus',
141
150
  # UNIT=s,,,,,rad,rad,rad,,
@@ -155,22 +164,22 @@ my %addUnits = (
155
164
  # (Max) DVID='HLMT',DVNM='Highlights'
156
165
  },
157
166
  # DNSC (GPMF) - seen: 'HIGH' (fmt c)
158
- # DUST (GPMF) - seen: 'NO_LIMIT' (fmt c)
167
+ DUST => 'DurationSetting', #3
159
168
  # DVID (GPMF) - DeviceID; seen: 1 (fmt L), HLMT (fmt F), GEOC (fmt F), 'BACK' (fmt F, Max)
160
169
  DVID => { Name => 'DeviceID', Unknown => 1 }, #2 (gpmd)
161
170
  # DVNM (GPMF) seen: 'Video Global Settings' (fmt c), 'Highlights' (fmt c), 'Geometry Calibrations' (Max)
162
171
  # DVNM (gpmd) seen: 'Camera' (Hero5), 'Hero6 Black' (Hero6), 'GoPro Karma v1.0' (Karma)
163
172
  DVNM => 'DeviceName', #PH (n/c)
164
173
  DZOM => { #PH (GPMF - seen: 'Y', fmt c)
165
- Name => 'DigitalZoom',
166
- PrintConv => { N => 'No', Y => 'Yes' },
174
+ Name => 'DigitalZoomOn',
175
+ PrintConv => \%noYes,
167
176
  },
168
- # DZMX (GPMF) - seen: 1.39999997615814 (fmt f)
169
- # DZST (GPMF) - seen: 0 (fmt L) (something to do with digital zoom maybe?)
177
+ DZMX => 'DigitalZoomAmount', #3
178
+ DZST => 'DigitalZoom', #3
170
179
  EISA => { #PH (GPMF) - seen: 'Y','N','HS EIS','N/A' (fmt c) [N was for a time-lapse video]
171
180
  Name => 'ElectronicImageStabilization',
172
181
  },
173
- # EISE (GPMF) - seen: 'Y','N' (fmt c)
182
+ EISE => { Name => 'ElectronicStabilizationOn', PrintConv => \%noYes }, #3
174
183
  EMPT => { Name => 'Empty', Unknown => 1 }, #2 (gpmd)
175
184
  ESCS => { #PH (Karma)
176
185
  Name => 'EscapeStatus',
@@ -180,7 +189,7 @@ my %addUnits = (
180
189
  Unknown => 1,
181
190
  %addUnits,
182
191
  },
183
- # EXPT (GPMF) - seen: '', 'AUTO' (fmt c)
192
+ EXPT => 'ExposureType', #3
184
193
  FACE => 'FaceDetected', #PH (gpmd)
185
194
  FCNM => 'FaceNumbers', #PH (gpmd) (faces counted per frame, ref 1)
186
195
  FMWR => 'FirmwareVersion', #PH (GPMF - seen: HD6.01.01.51.00, fmt c)
@@ -242,10 +251,10 @@ my %addUnits = (
242
251
  Notes => 'gyroscope readings in rad/s',
243
252
  Binary => 1,
244
253
  },
245
- # HCTL (GPMF) - seen: "Off" (fmt c)
246
- # HDRV (GPMF) - seen: "N" (fmt c)
254
+ HCLT => 'HorizonControl', #3
255
+ HDRV => { Name => 'HDRVideo', PrintConv => \%noYes }, #3/PH (NC)
247
256
  # HFLG (APP6) - seen: 0
248
- # HSGT (GPMF) - seen: 'OFF' (fmt c)
257
+ HSGT => 'HindsightSettings', #3
249
258
  ISOE => 'ISOSpeeds', #PH (gpmd)
250
259
  ISOG => { #2 (gpmd)
251
260
  Name => 'ImageSensorGain',
@@ -270,20 +279,20 @@ my %addUnits = (
270
279
  Binary => 1,
271
280
  },
272
281
  MAGN => 'Magnetometer', #1 (gpmd) (units of uT)
273
- # MAPX (GPMF) - seen: 1 (fmt f)
274
- # MAPY (GPMF) - seen: 1 (fmt f)
282
+ MAPX => 'MappingXCoefficients', #3
283
+ MAPY => 'MappingYCoefficients', #3
275
284
  # MFOV (GPMF-BACK/FRNT) - seen: 100 (fmt d, Max)
276
285
  MINF => { #PH (GPMF - seen: HERO6 Black, fmt c)
277
286
  Name => 'Model',
278
287
  Groups => { 2 => 'Camera' },
279
288
  Description => 'Camera Model Name',
280
289
  },
281
- # MMOD (GPMF) - seen: 'STEREO' (fmt c)
282
- # MTYP (GPMF) - seen: 0,1,5,11 [1 for time-lapse video, 5 for 360 video, 11 for JPEG] (fmt B)
283
- # MUID (GPMF) - seen: 3882563431 2278071152 967805802 411471936 0 0 0 0 (fmt L)
284
- # MXCF (GPMF) - seen: 'x1' (fmt c)
285
- # MYCF (GPMF) - seen: 'y1' (fmt c)
286
- # ORDP (GPMF) - seen: 'Y' (fmt c)
290
+ MMOD => 'MediaMode', #3
291
+ # MTYP (GPMF) - seen: 0,1,5,11 [1 for time-lapse video, 5 for 360 video, 11 for JPEG] (fmt B) - MediaType (ref 3)
292
+ MUID => { Name => 'MediaUID', ValueConv => 'join("-", unpack("H8H4H4H4H12", $val))' },
293
+ MXCF => 'MappingXMode', #3
294
+ MYCF => 'MappingYMode', #3
295
+ ORDP => { Name => 'OrientationDataPresent', PrintConv => \%noYes }, #3
287
296
  OREN => { #PH (GPMF - seen: 'U', fmt c)
288
297
  Name => 'AutoRotation',
289
298
  PrintConv => {
@@ -292,20 +301,20 @@ my %addUnits = (
292
301
  A => 'Auto', # (NC)
293
302
  },
294
303
  },
295
- # (most of the "P" tags are ProTune settings - PH)
304
+ # (most of the "P" tags are Protune settings - PH)
296
305
  PHDR => 'HDRSetting', #PH (APP6 - seen: 0)
297
- # PIMD (GPMF) - seen: 'AUTO' (fmt c)
306
+ PIMD => 'ProtuneISOMode', #3
298
307
  PIMN => 'AutoISOMin', #PH (GPMF - seen: 100, fmt L)
299
308
  PIMX => 'AutoISOMax', #PH (GPMF - seen: 1600, fmt L)
300
- # POLY (GPMF) - seen: '0 2.11120247840881 0.14325800538063 -1.030...' (fmt f)
309
+ POLY => 'PolynomialCoefficients', #3
301
310
  # PRAW (APP6) - seen: 0, 'N', 'Y' (fmt c)
302
311
  # PRCN (GPMF) - seen: 65 zeros (fmt B)
303
312
  PRES => 'PhotoResolution', #PH (APP6 - seen: '12MP_W')
304
- # PRJT (APP6) - seen: 'GPRO','EACO' (fmt F, Hero8, Max)
305
- # PRNA (GPMF) - seen 10 (fmt B)
306
- # PRNU (GPMF) - seen 0 (fmt B)
313
+ PRJT => 'LensProjection', #3
314
+ # PRNA (GPMF) - seen 10 (fmt B) - PresetIDs (ref 3)
315
+ # PRNU (GPMF) - seen 0 (fmt B) - PresetIDs (ref 3)
307
316
  PRTN => { #PH (GPMF - seen: 'N', fmt c)
308
- Name => 'ProTune',
317
+ Name => 'Protune',
309
318
  PrintConv => {
310
319
  N => 'Off',
311
320
  Y => 'On', # (NC)
@@ -316,9 +325,9 @@ my %addUnits = (
316
325
  PTSH => 'Sharpness', #PH (GPMF - seen: 'HIGH', fmt c)
317
326
  PTWB => 'WhiteBalance', #PH (GPMF - seen: 'AUTO', fmt c)
318
327
  # PVUL (APP6) - seen: 'F' (fmt c, Hero8, Max)
319
- # PWPR (GPMF) - seen: 'PERFORMANCE' (fmt c)
320
- # PYCF (GPMF) - seen: '[r0,r1,r2,r3,r4,r5,r6]' (fmt c)
321
- # RAMP (GPMF) - seen: empty string (fmt c)
328
+ PWPR => 'PowerProfile', #3
329
+ PYCF => 'PolynomialPower', #3
330
+ RAMP => 'SpeedRampSetting', #3
322
331
  RATE => 'Rate', #PH (GPMF - seen: '0_5SEC', fmt c; APP6 - seen: '4_1SEC')
323
332
  RMRK => { #2 (gpmd)
324
333
  Name => 'Comments',
@@ -328,7 +337,7 @@ my %addUnits = (
328
337
  Name => 'ScaleFactor',
329
338
  Unknown => 1,
330
339
  },
331
- # SCAP (GPMF) - seen: 'N' (fmt c)
340
+ SCAP => { Name => 'ScheduleCapture', PrintConv => \%noYes }, #3
332
341
  SCPR => { #PH (Karma) [stream was empty]
333
342
  Name => 'ScaledPressure',
334
343
  # UNIT=s,Pa,Pa,degC
@@ -336,7 +345,7 @@ my %addUnits = (
336
345
  # SCAL=1000 0.00999999977648258 0.00999999977648258 100
337
346
  %addUnits,
338
347
  },
339
- # SCTM (GPMF) - seen 0 (fmt L)
348
+ SCTM => 'ScheduleCaptureTime', #3 (seconds since UTC midnight)
340
349
  # SFTR (GPMF-BACK/FRNT) - seen 0.999,1.00004 (fmt d, Max)
341
350
  # SHFX (GPMF-GEOC) - seen 22.92 (fmt d, Max)
342
351
  # SHFY (GPMF-GEOC) - seen 0.123 (fmt d, Max)
@@ -361,9 +370,9 @@ my %addUnits = (
361
370
  Unknown => 1,
362
371
  ValueConv => '$self->Decode($val, "Latin")',
363
372
  },
364
- # SMTR (GPMF) - seen: 'N' (fmt c)
373
+ SMTR => { Name => 'SpotMeter', PrintConv => \%noYes }, #3
365
374
  # SOFF (APP6) - seen: 0 (fmt L, Hero8, Max)
366
- # SROT (GPMF) - seen 20.60 (fmt f, Max)
375
+ SROT => 'SensorReadoutTime', #3
367
376
  STMP => { #1 (gpmd)
368
377
  Name => 'TimeStamp',
369
378
  ValueConv => '$val / 1e6',
@@ -437,8 +446,8 @@ my %addUnits = (
437
446
  Name => 'WhiteBalanceRGB',
438
447
  Binary => 1,
439
448
  },
440
- # ZFOV (APP6,GPMF) - seen: 148.34, 0 (fmt f, Hero8, Max)
441
- # ZMPL (GPMF) - seen: 0.652929663658142 (fmt f)
449
+ ZFOV => 'DiagonalFieldOfView', #3
450
+ ZMPL => 'ZoomScaleNormalization', #3
442
451
  #
443
452
  # the following ref forum12825
444
453
  #
@@ -450,7 +459,6 @@ my %addUnits = (
450
459
  return join('', @a);
451
460
  },
452
461
  },
453
- EXPT => 'MaximumShutterAngle',
454
462
  MTRX => 'AccelerometerMatrix',
455
463
  ORIN => 'InputOrientation',
456
464
  ORIO => 'OutputOrientation',
@@ -873,6 +881,8 @@ under the same terms as Perl itself.
873
881
 
874
882
  =item L<https://github.com/stilldavid/gopro-utils>
875
883
 
884
+ =item L<https://github.com/gopro/gpmf-parser>
885
+
876
886
  =back
877
887
 
878
888
  =head1 SEE ALSO
@@ -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};