exiftool_vendored 12.80.0 → 12.82.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,7 +15,7 @@ package Image::ExifTool::NikonCustom;
15
15
  use strict;
16
16
  use vars qw($VERSION @ISA @EXPORT_OK %buttonsZ9);
17
17
 
18
- $VERSION = '1.24';
18
+ $VERSION = '1.25';
19
19
 
20
20
  @ISA = qw(Exporter);
21
21
  @EXPORT_OK = qw(%buttonsZ9);
@@ -77,6 +77,7 @@ $VERSION = '1.24';
77
77
  66 => 'Voice Memo',
78
78
  70 => 'Photo Shooting Bank',
79
79
  71 => 'ISO',
80
+ 72 => 'Shooting Mode',
80
81
  73 => 'Exposure Compensation',
81
82
  76 => 'Silent Mode',
82
83
  78 => 'LiveView Information',
@@ -90,6 +91,9 @@ $VERSION = '1.24';
90
91
  86 => 'Save Focus Position',
91
92
  87 => 'Recall Focus Position',
92
93
  88 => 'Recall Shooting Functions (Hold)',
94
+ 89 => 'Set Picture Control (HLG)',
95
+ 90 => 'Skin Softening',
96
+ 91 => 'Portrait Impression Balance',
93
97
  97 => 'High Frequency Flicker Reduction',
94
98
  98 => 'Switch FX/DX',
95
99
  99 => 'View Mode (Photo LV)',
@@ -104,7 +108,25 @@ $VERSION = '1.24';
104
108
  110 => 'DISP - Cycle Information Display (playback)', # Playback mode
105
109
  111 => 'Resume Shooting',
106
110
  112 => 'Switch Eyes',
111
+ 113 => 'Power Zoom +',
112
+ 114 => 'Power Zoom -',
107
113
  115 => 'Delete',
114
+ 116 => 'Pixel Shift Shooting',
115
+ 117 => 'Cycle AF-area Mode',
116
+ 118 => 'Raw Processing (Current)', #118-131 are Retouch options
117
+ 119 => 'Raw Processing (Multiple)',
118
+ 120 => 'Trim',
119
+ 121 => 'Resize (Current)',
120
+ 122 => 'Resize (Multiple)',
121
+ 123 => 'D-Lighting',
122
+ 124 => 'Straighten',
123
+ 125 => 'Distortion Control',
124
+ 126 => 'Perspective Control',
125
+ 127 => 'Monochrome',
126
+ 128 => 'Overlay (Add)',
127
+ 129 => 'Lighten',
128
+ 130 => 'Darken',
129
+ 131 => 'Motion Blend',
108
130
  },
109
131
  );
110
132
  my %dialsZ9 = (
@@ -118,6 +140,18 @@ my %dialsZ9 = (
118
140
  7 => 'Rating',
119
141
  8 => 'Page',
120
142
  9 => 'Skip To First Shot In Series',
143
+ 10 => 'Uploaded to FTP',
144
+ 11 => 'Uploaded to Computer',
145
+ );
146
+ my %dialsVideoZ9 = (
147
+ 0 => '2 s',
148
+ 1 => '5 s',
149
+ 2 => '10 s',
150
+ 3 => '1 Frame',
151
+ 4 => '5 Frames',
152
+ 5 => '10 Frames',
153
+ 6 => 'First/Last Frame',
154
+ 7 => 'Playback Speed',
121
155
  );
122
156
  my %evfGridsZ9 = (
123
157
  0 => '3x3',
@@ -9974,6 +10008,9 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
9974
10008
  421 => { Name => 'Func1ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-a
9975
10009
  423 => { Name => 'Func2ButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-b
9976
10010
  437 => { Name => 'MovieRecordButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-m
10011
+ 453 => { Name => 'WBButtonPlaybackMode', %buttonsZ9}, #CSf2
10012
+ 461 => { Name => 'CommandDialVideoPlaybackMode', PrintConv => \%dialsVideoZ9, Unknown => 1}, # CSf3-b
10013
+ 465 => { Name => 'SubCommandDialVideoPlaybackMode', PrintConv => \%dialsVideoZ9, Unknown => 1}, # CSf3-b
9977
10014
  467 => { Name => 'FocusPointLock', PrintConv => \%offOn, Unknown => 1}, # CSf4-c
9978
10015
  459 => { Name => 'CommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-k
9979
10016
  463 => { Name => 'SubCommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-l
@@ -10055,6 +10092,11 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
10055
10092
  },
10056
10093
  681 => { Name => 'ViewModeShowEffectsOfSettings', PrintConv => { 0=>'Always', 1=> 'Only When Flash Not Used'}, Unknown => 1 }, #CS8-a
10057
10094
  683 => { Name => 'DispButton', %buttonsZ9}, #CSf2
10095
+ 753 => { #CSd5
10096
+ Name => 'ExposureDelay',
10097
+ Format => 'int16u',
10098
+ PrintConv => '$val ? sprintf("%.1f sec",$val/1000) : "Off"',
10099
+ },
10058
10100
  );
10059
10101
 
10060
10102
  # Z9 custom settings (ref 1) #base at offset26 + 1035 (firmware 1.0.0)
@@ -10806,7 +10848,19 @@ my %noYes = ( 0 => 'No', 1 => 'Yes' );
10806
10848
  471 => { Name => 'QualityButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-h
10807
10849
  477 => { Name => 'WhiteBalanceButtonPlaybackMode', %buttonsZ9, Unknown => 1}, # CSf3-i
10808
10850
  483 => { Name => 'CommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-k
10851
+ 485 => { # CSf3-m2
10852
+ Name => 'CommandDialVideoPlaybackMode',
10853
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
10854
+ PrintConv => \%dialsVideoZ9,
10855
+ Unknown => 1
10856
+ },
10809
10857
  487 => { Name => 'SubCommandDialPlaybackMode', PrintConv => \%dialsZ9, Unknown => 1}, # CSf3-l
10858
+ 489 => { # CSf3-n2
10859
+ Name => 'SubCommandDialVideoPlaybackMode',
10860
+ Condition => '$$self{FirmwareVersion} and $$self{FirmwareVersion} ge "05.00"',
10861
+ PrintConv => \%dialsVideoZ9,
10862
+ Unknown => 1
10863
+ },
10810
10864
  491 => { Name => 'FocusPointLock', PrintConv => \%offOn, Unknown => 1}, # CSf4-c
10811
10865
  493 => { Name => 'ControlRingResponse', PrintConv => { 0 => 'High', 1 => 'Low' } }, # CSf10
10812
10866
  505 => { Name => 'VerticalMovieFuncButton', %buttonsZ9, Unknown => 1}, # CSg2-d
@@ -197,6 +197,7 @@ my %olympusLensTypes = (
197
197
  # '65535 07 40' - Seen for LUMIX S 16-35/F4 on Panasonic DC-S1H (ref PH)
198
198
  # Other makes
199
199
  '24 01 10' => 'Venus Optics Laowa 50mm F2.8 2x Macro', #DonKomarechka
200
+ 'f7 03 10' => 'LAOWA C&D-Dreamer MFT 7.5mm F2.0', #forum3833
200
201
  );
201
202
 
202
203
  # lookup for Olympus camera types (ref PH)
@@ -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.95';
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($$$);
@@ -6728,7 +6731,7 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6728
6731
  %Image::ExifTool::QuickTime::iTunesInfo = (
6729
6732
  PROCESS_PROC => \&ProcessMOV,
6730
6733
  GROUPS => { 1 => 'iTunes', 2 => 'Audio' },
6731
- VARS => { LONG_TAGS => 0 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
6734
+ VARS => { LONG_TAGS => 1 }, # (hack for discrepancy in the way long tags are counted in BuildTagLookup)
6732
6735
  NOTES => q{
6733
6736
  ExifTool will extract any iTunesInfo tags that exist, even if they are not
6734
6737
  defined in this table. These tags belong to the family 1 "iTunes" group,
@@ -6804,6 +6807,17 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
6804
6807
  BARCODE => 'Barcode',
6805
6808
  LABEL => 'Label',
6806
6809
  MOOD => 'Mood',
6810
+ DIRECTOR => 'Director',
6811
+ DIRECTOR_OF_PHOTOGRAPHY => 'DirectorOfPhotography',
6812
+ PRODUCTION_DESIGNER => 'ProductionDesigner',
6813
+ COSTUME_DESIGNER => 'CostumeDesigner',
6814
+ SCREENPLAY_BY => 'ScreenplayBy',
6815
+ EDITED_BY => 'EditedBy',
6816
+ PRODUCER => 'Producer',
6817
+ IMDB_ID => { },
6818
+ TMDB_ID => { },
6819
+ Actors => { },
6820
+ TIPL => { },
6807
6821
  popularimeter => 'Popularimeter',
6808
6822
  'Dynamic Range (DR)'=> 'DynamicRange',
6809
6823
  initialkey => 'InitialKey',
@@ -7859,20 +7873,9 @@ my %isImageData = ( av01 => 1, avc1 => 1, hvc1 => 1, lhv1 => 1, hvt1 => 1 );
7859
7873
  #
7860
7874
  ftab => { Name => 'FontTable', Format => 'undef', ValueConv => 'substr($val, 5)' },
7861
7875
  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
7876
+ mrlh => { Name => 'MarlinHeader', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlh' } },
7877
+ mrlv => { Name => 'MarlinValues', SubDirectory => { TagTable => 'Image::ExifTool::GM::mrlv' } },
7878
+ mrld => { Name => 'MarlinDictionary',SubDirectory => { TagTable => 'Image::ExifTool::GM::mrld' } },
7876
7879
  );
7877
7880
 
7878
7881
  # MP4 data information box (ref 5)
@@ -9467,7 +9470,7 @@ sub ProcessMOV($$;$)
9467
9470
  my $dirID = $$dirInfo{DirID} || '';
9468
9471
  my $charsetQuickTime = $et->Options('CharsetQuickTime');
9469
9472
  my ($buff, $tag, $size, $track, $isUserData, %triplet, $doDefaultLang, $index);
9470
- my ($dirEnd, $unkOpt, %saveOptions, $atomCount);
9473
+ my ($dirEnd, $unkOpt, %saveOptions, $atomCount, $warnStr);
9471
9474
 
9472
9475
  my $topLevel = not $$et{InQuickTime};
9473
9476
  $$et{InQuickTime} = 1;
@@ -9547,6 +9550,7 @@ sub ProcessMOV($$;$)
9547
9550
  $index = $$tagTablePtr{VARS}{START_INDEX};
9548
9551
  $atomCount = $$tagTablePtr{VARS}{ATOM_COUNT};
9549
9552
  }
9553
+ my $lastTag = '';
9550
9554
  for (;;) {
9551
9555
  my ($eeTag, $ignore);
9552
9556
  last if defined $atomCount and --$atomCount < 0;
@@ -9573,22 +9577,22 @@ sub ProcessMOV($$;$)
9573
9577
  }
9574
9578
  last;
9575
9579
  }
9576
- $size == 1 or $et->Warn('Invalid atom size'), last;
9580
+ $size == 1 or $warnStr = 'Invalid atom size', last;
9577
9581
  # read extended atom size
9578
- $raf->Read($buff, 8) == 8 or $et->Warn('Truncated atom header'), last;
9582
+ $raf->Read($buff, 8) == 8 or $warnStr = 'Truncated atom header', last;
9579
9583
  $dataPos += 8;
9580
9584
  my ($hi, $lo) = unpack('NN', $buff);
9581
9585
  if ($hi or $lo > 0x7fffffff) {
9582
9586
  if ($hi > 0x7fffffff) {
9583
- $et->Warn('Invalid atom size');
9587
+ $warnStr = 'Invalid atom size';
9584
9588
  last;
9585
9589
  } elsif (not $et->Options('LargeFileSupport')) {
9586
- $et->Warn('End of processing at large atom (LargeFileSupport not enabled)');
9590
+ $warnStr = 'End of processing at large atom (LargeFileSupport not enabled)';
9587
9591
  last;
9588
9592
  }
9589
9593
  }
9590
9594
  $size = $hi * 4294967296 + $lo - 16;
9591
- $size < 0 and $et->Warn('Invalid extended size'), last;
9595
+ $size < 0 and $warnStr = 'Invalid extended size', last;
9592
9596
  } else {
9593
9597
  $size -= 8;
9594
9598
  }
@@ -9744,7 +9748,7 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
9744
9748
  my $missing = $size - $raf->Read($val, $size);
9745
9749
  if ($missing) {
9746
9750
  my $t = PrintableTagID($tag,2);
9747
- $et->Warn("Truncated '${t}' data (missing $missing bytes)");
9751
+ $warnStr = "Truncated '${t}' data (missing $missing bytes)";
9748
9752
  last;
9749
9753
  }
9750
9754
  # use value to get tag info if necessary
@@ -10059,16 +10063,28 @@ ItemID: foreach $id (reverse sort { $a <=> $b } keys %$items) {
10059
10063
  ) if $verbose;
10060
10064
  if ($size and (not $raf->Seek($size-1, 1) or $raf->Read($buff, 1) != 1)) {
10061
10065
  my $t = PrintableTagID($tag,2);
10062
- $et->Warn("Truncated '${t}' data");
10066
+ $warnStr = "Truncated '${t}' data";
10063
10067
  last;
10064
10068
  }
10065
10069
  }
10066
10070
  $dataPos += $size + 8; # point to start of next atom data
10067
10071
  last if $dirEnd and $dataPos >= $dirEnd; # (note: ignores last value if 0 bytes)
10068
10072
  $raf->Read($buff, 8) == 8 or last;
10073
+ $lastTag = $tag if $$tagTablePtr{$tag};
10069
10074
  ($size, $tag) = unpack('Na4', $buff);
10070
10075
  ++$index if defined $index;
10071
10076
  }
10077
+ if ($warnStr) {
10078
+ # assume this is an unknown trailer if it comes immediately after
10079
+ # mdat or moov and has a tag name we don't recognize
10080
+ if (($lastTag eq 'mdat' or $lastTag eq 'moov') and (not $$tagTablePtr{$tag} or
10081
+ ref $$tagTablePtr{$tag} eq 'HASH' and $$tagTablePtr{$tag}{Unknown}))
10082
+ {
10083
+ $et->Warn('Unknown trailer with '.lcfirst($warnStr));
10084
+ } else {
10085
+ $et->Warn($warnStr);
10086
+ }
10087
+ }
10072
10088
  # tweak file type based on track content ("iso*" and "dash" ftyp only)
10073
10089
  if ($topLevel and $$et{FileType} and $$et{FileType} eq 'MP4' and
10074
10090
  $$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,11 @@ 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
+ },
329
341
  Unknown00 => { Unknown => 1 },
330
342
  Unknown01 => { Unknown => 1 },
331
343
  Unknown02 => { Unknown => 1 },
@@ -741,13 +753,6 @@ my %insvLimit = (
741
753
  10 => { Name => 'FusionYPR', Format => 'float[3]' },
742
754
  );
743
755
 
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
756
  #------------------------------------------------------------------------------
752
757
  # Save information from keys in OtherSampleDesc directory for processing timed metadata
753
758
  # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
@@ -2219,26 +2224,6 @@ sub Process_tx3g($$$)
2219
2224
  return 1;
2220
2225
  }
2221
2226
 
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
2227
  #------------------------------------------------------------------------------
2243
2228
  # Process QuickTime 'mebx' timed metadata
2244
2229
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
@@ -3229,6 +3214,52 @@ sub ProcessFMAS($$$)
3229
3214
  return 1;
3230
3215
  }
3231
3216
 
3217
+ #------------------------------------------------------------------------------
3218
+ # Process GPS from Wolfbox G900 Dashcam
3219
+ # Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
3220
+ # Returns: 1 on success
3221
+ sub ProcessWolfbox($$$)
3222
+ {
3223
+ my ($et, $dirInfo, $tagTbl) = @_;
3224
+ my $dataPt = $$dirInfo{DataPt};
3225
+ return 0 if length($$dataPt) < 0xc8;
3226
+ $et->VerboseDir('Wolfbox', undef, length($$dataPt));
3227
+ # 0000: 65 00 00 00 00 00 00 00 31 01 01 00 e3 ff 00 00 [e.......1.......]
3228
+ # 0010: 04 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
3229
+ # 0020: 01 00 00 00 00 00 00 00 8b 33 ff 51 00 00 00 00 [.........3.Q....]
3230
+ # 0030: a0 86 01 00 00 00 00 00 4d 5e 07 fa ff ff ff ff [........M^......]
3231
+ # 0040: a0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
3232
+ # 0050: 64 00 00 00 00 00 00 00 90 21 00 00 00 00 00 00 [d........!......]
3233
+ # 0060: 64 00 00 00 00 00 00 00 18 00 00 00 03 00 00 00 [d...............]
3234
+ # 0070: e8 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [................]
3235
+ # 0080: 00 00 00 00 00 00 00 00 30 30 30 30 30 30 30 30 [........00000000]
3236
+ # 0090: 30 30 30 30 30 30 30 30 48 59 54 48 00 00 00 00 [00000000HYTH....]
3237
+ # 00a0: 0c 00 00 00 10 00 00 00 2a 00 00 00 00 00 00 00 [........*.......]
3238
+ # 00b0: 4f 3f 0c 1f 00 00 00 00 a0 86 01 00 00 00 00 00 [O?..............]
3239
+ # 00c0: 7f cf 2d ff ff ff ff ff a0 86 01 00 00 00 00 00 [..-.............]
3240
+ # 00d0: 01 00 00 00 08 00 00 00 0a 00 00 00 00 00 00 00 [................]
3241
+ # 00e0: 0a 00 00 00 00 00 00 00 e8 03 00 00 00 00 00 00 [................]
3242
+ # 00f0: 0a 00 00 00 00 00 00 00 4d 00 00 00 00 00 00 00 [........M.......]
3243
+ # lat/lon at 0xb0/0xc0 and 0x128/0x138
3244
+ # h/m/s at 0x10 and 0xa0 and 0x148 (the first imprinted on the video, the latter 2 presumed UTC)
3245
+ # spd at 0x48, dir at 0x58, alt at 0xe8
3246
+ SetByteOrder('II');
3247
+ my ($spd,$dir,$d,$mo,$yr,$h,$m,$s) = unpack('x72Vx12Vx12V3x44V3',$$dataPt);
3248
+ # offset 0xa0 also stores hh mm ss, but is out by 8 hours!
3249
+ my $time = sprintf '%.4d:%.2d:%.2d %.2d:%.2d:%.2dZ', $yr, $mo, $d, $h, $m, $s;
3250
+ my ($lat, $lon) = (Get32s($dataPt, 0xb0) / 1e5, Get32s($dataPt, 0xc0) / 1e5);
3251
+ my $alt = Get32s($dataPt, 0xe8);
3252
+ ConvertLatLon($lat, $lon);
3253
+ $et->HandleTag($tagTbl, GPSDateTime => $time);
3254
+ $et->HandleTag($tagTbl, GPSLatitude => $lat);
3255
+ $et->HandleTag($tagTbl, GPSLongitude => $lon);
3256
+ $et->HandleTag($tagTbl, GPSSpeed => $spd * $knotsToKph / 100);
3257
+ $et->HandleTag($tagTbl, GPSTrack => $dir / 100);
3258
+ $et->HandleTag($tagTbl, GPSAltitude => $alt / 10); # (NC)
3259
+ SetByteOrder('MM');
3260
+ return 1;
3261
+ }
3262
+
3232
3263
  #------------------------------------------------------------------------------
3233
3264
  # Scan media data for "freeGPS" metadata if not found already (ref PH)
3234
3265
  # 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
 
@@ -10553,7 +10553,7 @@ my %isoSetting2010 = (
10553
10553
  ValueConv => '2 ** (8-$val/8192)',
10554
10554
  PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
10555
10555
  },
10556
- 0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk },
10556
+ 0x8001 => { Name => 'Sony_rtmd_0x8001', Format => 'int16u', %hidUnk }, # (perhaps related to focus distance? forum15856)
10557
10557
  0x8004 => { Name => 'Sony_rtmd_0x8004', Format => 'int16u', %hidUnk }, # (FocalLength35efl?, forum14315)
10558
10558
  0x8005 => { Name => 'Sony_rtmd_0x8005', Format => 'int16u', %hidUnk }, # (FocalLength?, forum14315)
10559
10559
  0x800a => { Name => 'Sony_rtmd_0x800a', Format => 'int16u', %hidUnk }, # (FocusRingPosition?, forum14315)