exiftool-vendored.pl 12.80.0 → 12.84.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 (43) hide show
  1. package/bin/Changes +81 -0
  2. package/bin/MANIFEST +6 -18
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +4 -2
  6. package/bin/build_geolocation +872 -0
  7. package/bin/config_files/example.config +2 -2
  8. package/bin/exiftool +61 -17
  9. package/bin/fmt_files/gpx.fmt +2 -1
  10. package/bin/fmt_files/gpx_wpt.fmt +2 -1
  11. package/bin/lib/Image/ExifTool/Apple.pm +51 -7
  12. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +47 -31
  13. package/bin/lib/Image/ExifTool/CanonVRD.pm +19 -6
  14. package/bin/lib/Image/ExifTool/DJI.pm +29 -0
  15. package/bin/lib/Image/ExifTool/Exif.pm +19 -2
  16. package/bin/lib/Image/ExifTool/FujiFilm.pm +20 -7
  17. package/bin/lib/Image/ExifTool/GM.pm +552 -0
  18. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  19. package/bin/lib/Image/ExifTool/Geolocation.pm +423 -178
  20. package/bin/lib/Image/ExifTool/Geotag.pm +26 -13
  21. package/bin/lib/Image/ExifTool/M2TS.pm +32 -4
  22. package/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  23. package/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  24. package/bin/lib/Image/ExifTool/Nikon.pm +337 -27
  25. package/bin/lib/Image/ExifTool/NikonCustom.pm +55 -1
  26. package/bin/lib/Image/ExifTool/Olympus.pm +1 -0
  27. package/bin/lib/Image/ExifTool/OpenEXR.pm +21 -3
  28. package/bin/lib/Image/ExifTool/PNG.pm +3 -3
  29. package/bin/lib/Image/ExifTool/QuickTime.pm +45 -24
  30. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +66 -30
  31. package/bin/lib/Image/ExifTool/README +2 -0
  32. package/bin/lib/Image/ExifTool/Sony.pm +16 -7
  33. package/bin/lib/Image/ExifTool/TagLookup.pm +4827 -4778
  34. package/bin/lib/Image/ExifTool/TagNames.pod +953 -620
  35. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +32 -9
  36. package/bin/lib/Image/ExifTool/Writer.pl +169 -130
  37. package/bin/lib/Image/ExifTool/XMP.pm +4 -2
  38. package/bin/lib/Image/ExifTool/XMP2.pl +3 -0
  39. package/bin/lib/Image/ExifTool.pm +106 -48
  40. package/bin/lib/Image/ExifTool.pod +47 -25
  41. package/bin/perl-Image-ExifTool.spec +1 -1
  42. package/bin/pp_build_exe.args +4 -4
  43. package/package.json +3 -3
@@ -16,7 +16,7 @@ use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::GPS;
18
18
 
19
- $VERSION = '1.05';
19
+ $VERSION = '1.06';
20
20
 
21
21
  # supported EXR value format types (other types are extracted as undef binary data)
22
22
  my %formatType = (
@@ -154,6 +154,19 @@ my %formatType = (
154
154
  type => { },
155
155
  version => { },
156
156
  chunkCount => { },
157
+ # exif and xmp written by PanoramaStudio4.0.2Pro
158
+ exif => {
159
+ Name => 'EXIF',
160
+ SubDirectory => {
161
+ TagTable => 'Image::ExifTool::Exif::Main',
162
+ ProcessProc => \&Image::ExifTool::ProcessTIFF,
163
+ Start => 4, # (skip leading 4 bytes with data length)
164
+ },
165
+ },
166
+ xmp => {
167
+ Name => 'XMP',
168
+ SubDirectory => { TagTable => 'Image::ExifTool::XMP::Main' },
169
+ },
157
170
  # also observed:
158
171
  # ilut
159
172
  );
@@ -221,9 +234,14 @@ sub ProcessEXR($$)
221
234
  }
222
235
  my ($val, $success, $buf2);
223
236
  my $format = $formatType{$type};
224
- if ($format or $binary) {
237
+ my $subdir = $$tagInfo{SubDirectory};
238
+ if ($format or $binary or $subdir) {
225
239
  $raf->Read($buf2, $size) == $size and $success = 1;
226
- if (not $format) {
240
+ if ($subdir) {
241
+ $et->HandleTag($tagTablePtr, $tag, undef,
242
+ DataPt => \$buf2, DataPos => $raf->Tell() - length($buf2));
243
+ next if $success;
244
+ } elsif (not $format) {
227
245
  $val = \$buf2; # treat as undef binary data
228
246
  } elsif ($format ne '1') {
229
247
  # handle formats which map nicely into ExifTool format codes
@@ -36,7 +36,7 @@ use strict;
36
36
  use vars qw($VERSION $AUTOLOAD %stdCase);
37
37
  use Image::ExifTool qw(:DataAccess :Utils);
38
38
 
39
- $VERSION = '1.66';
39
+ $VERSION = '1.67';
40
40
 
41
41
  sub ProcessPNG_tEXt($$$);
42
42
  sub ProcessPNG_iTXt($$$);
@@ -642,8 +642,8 @@ my %unreg = ( Notes => 'unregistered' );
642
642
  Label => { %unreg },
643
643
  Make => { %unreg, Groups => { 2 => 'Camera' } },
644
644
  Model => { %unreg, Groups => { 2 => 'Camera' } },
645
- # parameters (written by Stable Diffusion)
646
- # aesthetic_score (written by Stable Diffusion)
645
+ parameters => { %unreg }, # (written by Stable Diffusion)
646
+ aesthetic_score => { Name => 'AestheticScore', %unreg }, # (written by Stable Diffusion)
647
647
  'create-date'=> {
648
648
  Name => 'CreateDate',
649
649
  Groups => { 2 => 'Time' },
@@ -48,7 +48,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
48
48
  use Image::ExifTool::Exif;
49
49
  use Image::ExifTool::GPS;
50
50
 
51
- $VERSION = '2.94';
51
+ $VERSION = '2.96';
52
52
 
53
53
  sub ProcessMOV($$;$);
54
54
  sub ProcessKeys($$$);
@@ -59,6 +59,9 @@ sub ProcessSampleDesc($$$);
59
59
  sub ProcessHybrid($$$);
60
60
  sub ProcessRights($$$);
61
61
  sub ProcessNextbase($$$);
62
+ sub Process_mrlh($$$);
63
+ sub Process_mrlv($$$);
64
+ sub Process_mrld($$$);
62
65
  # ++vvvvvvvvvvvv++ (in QuickTimeStream.pl)
63
66
  sub Process_mebx($$$);
64
67
  sub Process_3gf($$$);
@@ -1412,6 +1415,8 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
1412
1415
  %durationInfo,
1413
1416
  # this is int64u if MovieHeaderVersion == 1 (ref 13)
1414
1417
  Hook => '$$self{MovieHeaderVersion} and $format = "int64u", $varSize += 4',
1418
+ # (Note: this Duration seems to be the time of the key frame in
1419
+ # the NRT Metadata track of iPhone live-photo MOV videos)
1415
1420
  },
1416
1421
  5 => {
1417
1422
  Name => 'PreferredRate',
@@ -6491,6 +6496,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6491
6496
  },
6492
6497
  ownr => 'Owner', #PH (obscure) (ref ChrisAdan private communication)
6493
6498
  'xid ' => 'ISRC', #PH
6499
+ # found in DJI Osmo Action4 video
6500
+ tnal => { Name => 'ThumbnailImage', Groups => { 2 => 'Preview' } },
6501
+ snal => { Name => 'PreviewImage', Groups => { 2 => 'Preview' } },
6494
6502
  );
6495
6503
 
6496
6504
  # tag decoded from timed face records
@@ -6728,7 +6736,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6728
6736
  %Image::ExifTool::QuickTime::iTunesInfo = (
6729
6737
  PROCESS_PROC => \&ProcessMOV,
6730
6738
  GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
6731
- VARS => { LONG_TAGS => 0 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
6739
+ VARS => { LONG_TAGS => 1 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
6732
6740
  NOTES => q{
6733
6741
  ExifTool will extract any iTunesInfo tags that exist, even if they are not
6734
6742
  defined in this table. These tags belong to the family 1 "iTunes" group,
@@ -6804,6 +6812,17 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6804
6812
  BARCODE => 'Barcode',
6805
6813
  LABEL => 'Label',
6806
6814
  MOOD => 'Mood',
6815
+ DIRECTOR => 'Director',
6816
+ DIRECTOR_OF_PHOTOGRAPHY => 'DirectorOfPhotography',
6817
+ PRODUCTION_DESIGNER => 'ProductionDesigner',
6818
+ COSTUME_DESIGNER => 'CostumeDesigner',
6819
+ SCREENPLAY_BY => 'ScreenplayBy',
6820
+ EDITED_BY => 'EditedBy',
6821
+ PRODUCER => 'Producer',
6822
+ IMDB_ID => { },
6823
+ TMDB_ID => { },
6824
+ Actors => { },
6825
+ TIPL => { },
6807
6826
  popularimeter => 'Popularimeter',
6808
6827
  'Dynamic Range (DR)'=> 'DynamicRange',
6809
6828
  initialkey => 'InitialKey',
@@ -7859,20 +7878,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
7859
7878
  #
7860
7879
  ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
7861
7880
  name => { Name => 'OtherName', Format => 'undef', ValueConv => 'substr($val, 4)' },
7862
- # mrlh = GM header?
7863
- # mrlv = GM data
7864
- # mrld = GM data (448-byte records):
7865
- # 0 - int32u count
7866
- # 4 - int32u ? (related to units) 0=none,1=m/km,2=L,3=kph,4=C,7=deg,8=rpm,9=kPa,10=G,11=V,15=Nm,16=%
7867
- # 8 - int32u ? (0,1,3,4,5)
7868
- # 12 - string[64] units
7869
- # 76 - int32u ? (1,3,7,15)
7870
- # 80 - int32u 0
7871
- # 84 - undef[4] ?
7872
- # 88 - int16u[6] ?
7873
- # 100 - undef[32] ?
7874
- # 132 - string[64] measurement name
7875
- # 196 - string[64] measurement name
7881
+ mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
7882
+ mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
7883
+ mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
7876
7884
  );
7877
7885
 
7878
7886
  # MP4 data information box (ref 5)
@@ -9467,7 +9475,7 @@ sub ProcessMOV($$;$)
9467
9475
  my $dirID = $$dirInfo{DirID} || '';
9468
9476
  my $charsetQuickTime = $et->Options('CharsetQuickTime');
9469
9477
  my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
9470
- my ($dirEnd, $unkOpt, %saveOptions, $atomCount);
9478
+ my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr);
9471
9479
 
9472
9480
  my $topLevel = not $$et{InQuickTime};
9473
9481
  $$et{InQuickTime} = 1;
@@ -9547,6 +9555,7 @@ sub ProcessMOV($$;$)
9547
9555
  $index = $$tagTablePtr{VARS}{START_INDEX};
9548
9556
  $atomCount = $$tagTablePtr{VARS}{ATOM_COUNT};
9549
9557
  }
9558
+ my $lastTag = '';
9550
9559
  for (;;) {
9551
9560
  my ($eeTag, $ignore);
9552
9561
  last if defined $atomCount and --$atomCount < 0;
@@ -9573,22 +9582,22 @@ sub ProcessMOV($$;$)
9573
9582
  }
9574
9583
  last;
9575
9584
  }
9576
- $size == 1 or $et->Warn('Invalid atom size'), last;
9585
+ $size == 1 or $warnStr = 'Invalid atom size', last;
9577
9586
  # read extended atom size
9578
- $raf->Read($buff, 8) == 8 or $et->Warn('Truncated atom header'), last;
9587
+ $raf->Read($buff, 8) == 8 or $warnStr = 'Truncated atom header', last;
9579
9588
  $dataPos += 8;
9580
9589
  my ($hi, $lo) = unpack('NN', $buff);
9581
9590
  if ($hi or $lo > 0x7fffffff) {
9582
9591
  if ($hi > 0x7fffffff) {
9583
- $et->Warn('Invalid atom size');
9592
+ $warnStr = 'Invalid atom size';
9584
9593
  last;
9585
9594
  } elsif (not $et->Options('LargeFileSupport')) {
9586
- $et->Warn('End of processing at large atom (LargeFileSupport not enabled)');
9595
+ $warnStr = 'End of processing at large atom (LargeFileSupport not enabled)';
9587
9596
  last;
9588
9597
  }
9589
9598
  }
9590
9599
  $size = $hi * 4294967296 + $lo - 16;
9591
- $size < 0 and $et->Warn('Invalid extended size'), last;
9600
+ $size < 0 and $warnStr = 'Invalid extended size', last;
9592
9601
  } else {
9593
9602
  $size -= 8;
9594
9603
  }
@@ -9744,7 +9753,7 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
9744
9753
  my $missing = $size - $raf->Read($val, $size);
9745
9754
  if ($missing) {
9746
9755
  my $t = PrintableTagID($tag,2);
9747
- $et->Warn("Truncated '${t}' data (missing $missing bytes)");
9756
+ $warnStr = "Truncated '${t}' data (missing $missing bytes)";
9748
9757
  last;
9749
9758
  }
9750
9759
  # use value to get tag info if necessary
@@ -10059,16 +10068,28 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
10059
10068
  ) if $verbose;
10060
10069
  if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) {
10061
10070
  my $t = PrintableTagID($tag,2);
10062
- $et->Warn("Truncated '${t}' data");
10071
+ $warnStr = "Truncated '${t}' data";
10063
10072
  last;
10064
10073
  }
10065
10074
  }
10066
10075
  $dataPos += $size + 8; # point to start of next atom data
10067
10076
  last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
10068
10077
  $raf->Read($buff, 8) == 8 or last;
10078
+ $lastTag = $tag if $$tagTablePtr{$tag};
10069
10079
  ($size, $tag) = unpack('Na4', $buff);
10070
10080
  ++$index if defined $index;
10071
10081
  }
10082
+ if ($warnStr) {
10083
+ # assume this is an unknown trailer if it comes immediately after
10084
+ # mdat or moov and has a tag name we don't recognize
10085
+ if (($lastTag eq 'mdat' or $lastTag eq 'moov') and (not $$tagTablePtr{$tag} or
10086
+ ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
10087
+ {
10088
+ $et->Warn('Unknown trailer with '.lcfirst($warnStr));
10089
+ } else {
10090
+ $et->Warn($warnStr);
10091
+ }
10092
+ }
10072
10093
  # tweak file type based on track content ("iso*" and "dash" ftyp only)
10073
10094
  if ($topLevel and $$et{FileType} and $$et{FileType} eq 'MP4' and
10074
10095
  $$et{save_ftyp} and $$et{HasHandler} and $$et{save_ftyp} =~ /^(iso|dash)/ and
@@ -22,12 +22,12 @@ use Image::ExifTool qw(:DataAccess :Utils);
22
22
  use Image::ExifTool::QuickTime;
23
23
 
24
24
  sub Process_tx3g($$$);
25
- sub Process_marl($$$);
26
25
  sub Process_mebx($$$);
27
26
  sub Process_text($$$;$);
28
27
  sub ProcessFreeGPS($$$);
29
28
  sub Process360Fly($$$);
30
29
  sub ProcessFMAS($$$);
30
+ sub ProcessWolfbox($$$);
31
31
  sub ProcessCAMM($$$);
32
32
 
33
33
  # QuickTime data types that have ExifTool equivalents
@@ -109,7 +109,7 @@ my %insvLimit = (
109
109
  The tags below are extracted from timed metadata in QuickTime and other
110
110
  formats of video files when the ExtractEmbedded option is used. Although
111
111
  most of these tags are combined into the single table below, ExifTool
112
- currently reads 71 different formats of timed GPS metadata from video files.
112
+ currently reads 74 different formats of timed GPS metadata from video files.
113
113
  },
114
114
  VARS => { NO_ID => 1 },
115
115
  GPSLatitude => { PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")', RawConv => '$$self{FoundGPSLatitude} = 1; $val' },
@@ -207,6 +207,13 @@ my %insvLimit = (
207
207
  TagTable => 'Image::ExifTool::QuickTime::Stream',
208
208
  ProcessProc => \&ProcessFMAS,
209
209
  },
210
+ },{
211
+ Name => 'gpmd_Wolfbox', # Wolfbox G900 Dashcam
212
+ Condition => '$$valPt =~ /^.{136}0{16}HYTH/s',
213
+ SubDirectory => {
214
+ TagTable => 'Image::ExifTool::QuickTime::Stream',
215
+ ProcessProc => \&ProcessWolfbox,
216
+ },
210
217
  },{
211
218
  Name => 'gpmd_GoPro',
212
219
  SubDirectory => { TagTable => 'Image::ExifTool::GoPro::GPMF' },
@@ -223,7 +230,7 @@ my %insvLimit = (
223
230
  },
224
231
  marl => {
225
232
  Name => 'marl',
226
- SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::marl' },
233
+ SubDirectory => { TagTable => 'Image::ExifTool::GM::marl' },
227
234
  },
228
235
  CTMD => { # (Canon Timed MetaData)
229
236
  Name => 'CTMD',
@@ -326,6 +333,14 @@ my %insvLimit = (
326
333
  Groups => { 0 => 'Trailer', 1 => 'Insta360' }, # (so these groups will appear in the -listg options)
327
334
  SubDirectory => { TagTable => 'Image::ExifTool::QuickTime::INSV_MakerNotes' },
328
335
  },
336
+ ssmd => { # Chigee AIO-5 dashcam
337
+ Name => 'PreviewImage',
338
+ Groups => { 2 => 'Preview' },
339
+ RawConv => '$self->ValidateImage(\$val,$tag)',
340
+ },
341
+ # djmd - DJI AC003 Osmo Action 4 cam
342
+ #TODO djmd => { SubDirectory => { TagTable => 'Image::ExifTool::DJI::djmd', ByteOrder => 'Little-Endian' } },
343
+ # dbgi - DJI AC003 Osmo Action 4 cam -- lots more unknown stuff
329
344
  Unknown00 => { Unknown => 1 },
330
345
  Unknown01 => { Unknown => 1 },
331
346
  Unknown02 => { Unknown => 1 },
@@ -741,13 +756,6 @@ my %insvLimit = (
741
756
  10 => { Name => 'FusionYPR', Format => 'float[3]' },
742
757
  );
743
758
 
744
- # tags found in 'marl' ctbx timed metadata (ref PH)
745
- %Image::ExifTool::QuickTime::marl = (
746
- PROCESS_PROC => \&Process_marl,
747
- GROUPS => { 2 => 'Other' },
748
- NOTES => 'Tags extracted from the marl ctbx timed metadata of GM cars.',
749
- );
750
-
751
759
  #------------------------------------------------------------------------------
752
760
  # Save information from keys in OtherSampleDesc directory for processing timed metadata
753
761
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -2219,26 +2227,6 @@ sub Process_tx3g($$$)
2219
2227
  return 1;
2220
2228
  }
2221
2229
 
2222
- #------------------------------------------------------------------------------
2223
- # Process GM 'marl' ctbx metadata (ref PH)
2224
- # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
2225
- # Returns: 1 on success
2226
- sub Process_marl($$$)
2227
- {
2228
- my ($et, $dirInfo, $tagTablePtr) = @_;
2229
- my $dataPt = $$dirInfo{DataPt};
2230
- return 0 if length $$dataPt < 2;
2231
-
2232
- # 8-byte records:
2233
- # byte 0 seems to be tag ID (0=timestamp in sec * 1e7)
2234
- # bytes 1-3 seem to be 24-bit signed integer (unknown meaning)
2235
- # bytes 4-7 are an int32u value, usually a multiple of 10000
2236
-
2237
- $et->WarnOnce("Can't yet decode timed GM data", 1);
2238
- # (see https://exiftool.org/forum/index.php?topic=11335.msg61393#msg61393)
2239
- return 1;
2240
- }
2241
-
2242
2230
  #------------------------------------------------------------------------------
2243
2231
  # Process QuickTime 'mebx' timed metadata
2244
2232
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -2443,7 +2431,9 @@ sub Process_nbmt($$$)
2443
2431
  $$et{DOC_NUM} = $$et{DOC_COUNT} + 1;
2444
2432
  delete $$et{UnknownTextCount};
2445
2433
  delete $$et{NoMoreTextDecoding};
2434
+ $$et{SET_GROUP1} = 'Nextbase';
2446
2435
  Process_text($et, $dataPt, $tagTbl, 1);
2436
+ delete $$et{SET_GROUP1};
2447
2437
  delete $$et{UnknownTextCount};
2448
2438
  delete $$et{NoMoreTextDecoding};
2449
2439
  delete $$et{DOC_NUM};
@@ -3229,6 +3219,52 @@ sub ProcessFMAS($$$)
3229
3219
  return 1;
3230
3220
  }
3231
3221
 
3222
+ #------------------------------------------------------------------------------
3223
+ # Process GPS from Wolfbox G900 Dashcam
3224
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
3225
+ # Returns: 1 on success
3226
+ sub ProcessWolfbox($$$)
3227
+ {
3228
+ my ($et, $dirInfo, $tagTbl) = @_;
3229
+ my $dataPt = $$dirInfo{DataPt};
3230
+ return 0 if length($$dataPt) < 0xc8;
3231
+ $et->VerboseDir('Wolfbox', undef, length($$dataPt));
3232
+ # 0000: 65 00 00 00 00 00 00 00 31 01 01 00 e3 ff 00 00 [e.......1.......]
3233
+ # 0010: 04 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
3234
+ # 0020: 01 00 00 00 00 00 00 00 8b 33 ff 51 00 00 00 00 [.........3.Q....]
3235
+ # 0030: a0 86 01 00 00 00 00 00 4d 5e 07 fa ff ff ff ff [........M^......]
3236
+ # 0040: a0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
3237
+ # 0050: 64 00 00 00 00 00 00 00 90 21 00 00 00 00 00 00 [d........!......]
3238
+ # 0060: 64 00 00 00 00 00 00 00 18 00 00 00 03 00 00 00 [d...............]
3239
+ # 0070: e8 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
3240
+ # 0080: 00 00 00 00 00 00 00 00 30 30 30 30 30 30 30 30 [........00000000]
3241
+ # 0090: 30 30 30 30 30 30 30 30 48 59 54 48 00 00 00 00 [00000000HYTH....]
3242
+ # 00a0: 0c 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
3243
+ # 00b0: 4f 3f 0c 1f 00 00 00 00 a0 86 01 00 00 00 00 00 [O?..............]
3244
+ # 00c0: 7f cf 2d ff ff ff ff ff a0 86 01 00 00 00 00 00 [..-.............]
3245
+ # 00d0: 01 00 00 00 08 00 00 00 0a 00 00 00 00 00 00 00 [................]
3246
+ # 00e0: 0a 00 00 00 00 00 00 00 e8 03 00 00 00 00 00 00 [................]
3247
+ # 00f0: 0a 00 00 00 00 00 00 00 4d 00 00 00 00 00 00 00 [........M.......]
3248
+ # lat/lon at 0xb0/0xc0 and 0x128/0x138
3249
+ # h/m/s at 0x10 and 0xa0 and 0x148 (the first imprinted on the video, the latter 2 presumed UTC)
3250
+ # spd at 0x48, dir at 0x58, alt at 0xe8
3251
+ SetByteOrder('II');
3252
+ my ($spd,$dir,$d,$mo,$yr,$h,$m,$s) = unpack('x72Vx12Vx12V3x44V3',$$dataPt);
3253
+ # offset 0xa0 also stores hh mm ss, but is out by 8 hours!
3254
+ my $time = sprintf '%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $yr, $mo, $d, $h, $m, $s;
3255
+ my ($lat, $lon) = (Get32s($dataPt, 0xb0) / 1e5, Get32s($dataPt, 0xc0) / 1e5);
3256
+ my $alt = Get32s($dataPt, 0xe8);
3257
+ ConvertLatLon($lat, $lon);
3258
+ $et->HandleTag($tagTbl, GPSDateTime => $time);
3259
+ $et->HandleTag($tagTbl, GPSLatitude => $lat);
3260
+ $et->HandleTag($tagTbl, GPSLongitude => $lon);
3261
+ $et->HandleTag($tagTbl, GPSSpeed => $spd * $knotsToKph / 100);
3262
+ $et->HandleTag($tagTbl, GPSTrack => $dir / 100);
3263
+ $et->HandleTag($tagTbl, GPSAltitude => $alt / 10); # (NC)
3264
+ SetByteOrder('MM');
3265
+ return 1;
3266
+ }
3267
+
3232
3268
  #------------------------------------------------------------------------------
3233
3269
  # Scan media data for "freeGPS" metadata if not found already (ref PH)
3234
3270
  # Inputs: 0) ExifTool ref
@@ -1132,6 +1132,8 @@ keys in structure hashes are:
1132
1132
  GROUPS : Same as in tag table, but only the family 2 group name is used,
1133
1133
  as the default for the flattened tags.
1134
1134
 
1135
+ SORT_ORDER : Order for sorting fields in documentation.
1136
+
1135
1137
  The contained structure field information hashes are similar to tag information
1136
1138
  hashes, except that only the following elements are used:
1137
1139
 
@@ -34,7 +34,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
34
34
  use Image::ExifTool::Exif;
35
35
  use Image::ExifTool::Minolta;
36
36
 
37
- $VERSION = '3.67';
37
+ $VERSION = '3.68';
38
38
 
39
39
  sub ProcessSRF($$$);
40
40
  sub ProcessSR2($$$);
@@ -164,9 +164,11 @@ sub PrintInvLensSpec($;$$);
164
164
  32877 => 'Sony E 15mm F1.4 G', #JR
165
165
  32878 => 'Sony FE 20-70mm F4 G', #JR
166
166
  32879 => 'Sony FE 50mm F1.4 GM', #JR
167
+ 32881 => 'Sony FE 24-50mm F2.8 G', #JR
168
+ 32882 => 'Sony FE 16-25mm F2.8 G', #JR
167
169
  32884 => 'Sony FE 70-200mm F4 Macro G OSS II', #JR
168
170
  32885 => 'Sony FE 16-35mm F2.8 GM II', #JR
169
- 32886 => 'Sony FE 300mm F2.8 OSS', #JR
171
+ 32886 => 'Sony FE 300mm F2.8 GM OSS', #JR
170
172
 
171
173
  # (comment this out so LensID will report the LensModel, which is more useful)
172
174
  # 32952 => 'Metabones Canon EF Speed Booster Ultra', #JR (corresponds to 184, but 'Advanced' mode, LensMount reported as E-mount)
@@ -187,6 +189,8 @@ sub PrintInvLensSpec($;$$);
187
189
  33086 => 'Sony FE 70-200mm F2.8 GM OSS II + 2X Teleconverter', #JR
188
190
  33087 => 'Sony FE 70-200mm F4 Macro G OSS II + 1.4X Teleconverter', #JR
189
191
  33088 => 'Sony FE 70-200mm F4 Macro G OSS II + 2X Teleconverter', #JR
192
+ 33089 => 'Sony FE 300mm F2.8 GM OSS + 1.4X Teleconverter', #JR (NC)
193
+ 33090 => 'Sony FE 300mm F2.8 GM OSS + 2X Teleconverter', #JR
190
194
 
191
195
  49201 => 'Zeiss Touit 12mm F2.8', #JR (lens firmware Ver.02)
192
196
  49202 => 'Zeiss Touit 32mm F1.8', #JR (lens firmware Ver.02)
@@ -234,6 +238,7 @@ sub PrintInvLensSpec($;$$);
234
238
  49474.7 => 'Viltrox 35mm F1.8 FE', #JR
235
239
  49474.8 => 'Viltrox 50mm F1.8 FE', #JR
236
240
  49474.9 => 'Viltrox 75mm F1.2 E', #JR
241
+ '49474.10' => 'Viltrox 20mm F2.8 FE', #JR
237
242
 
238
243
  49712 => 'Tokina FiRIN 20mm F2 FE AF', # (firmware Ver.01)
239
244
  49713 => 'Tokina FiRIN 100mm F2.8 FE MACRO', # (firmware Ver.01)
@@ -287,7 +292,9 @@ sub PrintInvLensSpec($;$$);
287
292
  50540 => 'Sigma 14mm F1.4 DG DN | A', #JR (023)
288
293
  50543 => 'Sigma 70-200mm F2.8 DG DN OS | S', #JR (023)
289
294
  50544 => 'Sigma 23mm F1.4 DC DN | C', #JR (023)
295
+ 50546 => 'Sigma 500mm F5.6 DG DN OS | S', #JR (024)
290
296
  50547 => 'Sigma 10-18mm F2.8 DC DN | C', #JR (023)
297
+ 50548 => 'Sigma 15mm F1.4 DG DN DIAGONAL FISHEYE | A', #JR (024)
291
298
 
292
299
  50992 => 'Voigtlander SUPER WIDE-HELIAR 15mm F4.5 III', #JR
293
300
  50993 => 'Voigtlander HELIAR-HYPER WIDE 10mm F5.6', #IB
@@ -2031,6 +2038,7 @@ my %hidUnk = ( Hidden => 1, Unknown => 1 );
2031
2038
  '4 0 0 0' => 'ARW 4.0', # (ILCE-7SM3)
2032
2039
  '4 0 1 0' => 'ARW 4.0.1', #github#195 (ZV-E1)
2033
2040
  '5 0 0 0' => 'ARW 5.0', # (ILCE-9M3)
2041
+ '5 0 1 0' => 'ARW 5.0.1', # (ILCE-1 with FirmWare 2.0)
2034
2042
  # what about cRAW images?
2035
2043
  },
2036
2044
  },
@@ -8515,16 +8523,17 @@ my %isoSetting2010 = (
8515
8523
  FIRST_ENTRY => 0,
8516
8524
  GROUPS => { 0 => 'MakerNotes', 2 => 'Image' },
8517
8525
  DATAMEMBER => [ 0 ],
8518
- IS_SUBDIR => [ 0x03e2, 0x03f4, 0x044e, 0x0498, 0x049d, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8526
+ IS_SUBDIR => [ 0x03e2, 0x03f4, 0x044e, 0x0498, 0x049d, 0x049e, 0x04a1, 0x04a2, 0x04ba, 0x059d, 0x0634, 0x0636, 0x064c, 0x0653, 0x0678, 0x06b8, 0x06de, 0x06e7 ],
8519
8527
  0x0000 => { Name => 'Ver9401', Hidden => 1, RawConv => '$$self{Ver9401} = $val; $$self{OPTIONS}{Unknown}<2 ? undef : $val' },
8520
8528
 
8521
8529
  0x03e2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 181', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8522
8530
  0x03f4 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 185', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8523
8531
  0x044e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 178', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8524
8532
  0x0498 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 148', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8525
- 0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8526
- 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8527
- 0x04a2 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(152|154|155)/ and $$self{Model} !~ /^ZV-1M2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8533
+ 0x049d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167 and $$self{Software} !~ /^ILCE-7M4 (v2|v3)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8534
+ 0x049e => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 167 and $$self{Software} =~ /^ILCE-7M4 (v2|v3)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8535
+ 0x04a1 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(160|164)/ and $$self{Software} !~ /^ILCE-1 v2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8536
+ 0x04a2 => { Name => 'ISOInfo', Condition => '($$self{Ver9401} =~ /^(152|154|155)/ and $$self{Model} !~ /^ZV-1M2/) or ($$self{Ver9401} == 164 and $$self{Software} =~ /^ILCE-1 v2/)', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8528
8537
  0x04ba => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 155 and $$self{Model} =~ /^ZV-1M2/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8529
8538
  0x059d => { Name => 'ISOInfo', Condition => '$$self{Ver9401} =~ /^(144|146)/', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
8530
8539
  0x0634 => { Name => 'ISOInfo', Condition => '$$self{Ver9401} == 68', Format => 'int8u[5]', SubDirectory => { TagTable => 'Image::ExifTool::Sony::ISOInfo' } },
@@ -10553,7 +10562,7 @@ my %isoSetting2010 = (
10553
10562
  ValueConv => '2 ** (8-$val/8192)',
10554
10563
  PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
10555
10564
  },
10556
- 0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk },
10565
+ 0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk }, # (perhaps related to focus distance? forum15856)
10557
10566
  0x8004 => { Name => 'Sony_rtmd_0x8004', Format => 'int16u', %hidUnk }, # (FocalLength35efl?, forum14315)
10558
10567
  0x8005 => { Name => 'Sony_rtmd_0x8005', Format => 'int16u', %hidUnk }, # (FocalLength?, forum14315)
10559
10568
  0x800a => { Name => 'Sony_rtmd_0x800a', Format => 'int16u', %hidUnk }, # (FocusRingPosition?, forum14315)